Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
2d095aef08 | |||
c906d47674 | |||
5dd430f9b2 | |||
7c88be8865 | |||
b45f5a5587 | |||
10e788e9a2 | |||
7ceb883826 | |||
80e78d9796 | |||
534d62d944 | |||
1857c145d1 | |||
12cdef4f66 |
@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
# CHANGELOG
|
# CHANGELOG
|
||||||
|
|
||||||
|
## 2024.1.17
|
||||||
|
|
||||||
|
- Add minor change, for plugin, menu can have notifications by @Focuslinkstech
|
||||||
|
|
||||||
## 2024.1.16
|
## 2024.1.16
|
||||||
|
|
||||||
- Add yellow color to table for plan not allowed to purchase
|
- Add yellow color to table for plan not allowed to purchase
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
- Hotspot & PPPOE
|
- Hotspot & PPPOE
|
||||||
- Easy Installation
|
- Easy Installation
|
||||||
- Multi Language
|
- Multi Language
|
||||||
- Payment Gateway Midtrans, Xendit and Tripay
|
- Payment Gateway
|
||||||
- SMS validation for login
|
- SMS validation for login
|
||||||
- Whatsapp Notification to Consumer
|
- Whatsapp Notification to Consumer
|
||||||
- Telegram Notification for Admin
|
- Telegram Notification for Admin
|
||||||
|
@ -16,8 +16,10 @@ $menu_registered = array();
|
|||||||
* Admin/Sales menu: AFTER_DASHBOARD, CUSTOMERS, PREPAID, SERVICES, REPORTS, VOUCHER, AFTER_ORDER, NETWORK, SETTINGS, AFTER_PAYMENTGATEWAY
|
* Admin/Sales menu: AFTER_DASHBOARD, CUSTOMERS, PREPAID, SERVICES, REPORTS, VOUCHER, AFTER_ORDER, NETWORK, SETTINGS, AFTER_PAYMENTGATEWAY
|
||||||
* | Customer menu: AFTER_DASHBOARD, ORDER, HISTORY, ACCOUNTS
|
* | Customer menu: AFTER_DASHBOARD, ORDER, HISTORY, ACCOUNTS
|
||||||
* @param string icon from ion icon, ion-person, only for AFTER_
|
* @param string icon from ion icon, ion-person, only for AFTER_
|
||||||
|
* @param string label for showing label or number of notification or update
|
||||||
|
* @param string color Label color
|
||||||
*/
|
*/
|
||||||
function register_menu($name, $admin, $function, $position, $icon = '')
|
function register_menu($name, $admin, $function, $position, $icon = '', $label = '', $color = 'success')
|
||||||
{
|
{
|
||||||
global $menu_registered;
|
global $menu_registered;
|
||||||
$menu_registered[] = [
|
$menu_registered[] = [
|
||||||
@ -25,7 +27,9 @@ function register_menu($name, $admin, $function, $position, $icon = '')
|
|||||||
"admin" => $admin,
|
"admin" => $admin,
|
||||||
"position" => $position,
|
"position" => $position,
|
||||||
"icon" => $icon,
|
"icon" => $icon,
|
||||||
"function" => $function
|
"function" => $function,
|
||||||
|
"label" => $label,
|
||||||
|
"color" => $color
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,4 +52,3 @@ function run_hook($action){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +112,17 @@ class Lang
|
|||||||
if($config['printer_cols']){
|
if($config['printer_cols']){
|
||||||
$cols = $config['printer_cols'];
|
$cols = $config['printer_cols'];
|
||||||
}
|
}
|
||||||
return str_pad($text, $cols, $pad_string, $pad_type);
|
$text = trim($text);
|
||||||
|
$texts = explode("\n", $text);
|
||||||
|
if(count($texts)>1){
|
||||||
|
$text = '';
|
||||||
|
foreach($texts as $t){
|
||||||
|
$text.= self::pad(trim($t), $pad_string, $pad_type)."\n";
|
||||||
|
}
|
||||||
|
return $text;
|
||||||
|
}else{
|
||||||
|
return str_pad(trim($text), $cols, $pad_string, $pad_type);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function pads($textLeft, $textRight, $pad_string = ' '){
|
public static function pads($textLeft, $textRight, $pad_string = ' '){
|
||||||
|
@ -62,15 +62,15 @@ class Message
|
|||||||
if (!empty($config['wa_url'])) {
|
if (!empty($config['wa_url'])) {
|
||||||
$waurl = str_replace('[number]', urlencode($phone), $config['wa_url']);
|
$waurl = str_replace('[number]', urlencode($phone), $config['wa_url']);
|
||||||
$waurl = str_replace('[text]', urlencode($txt), $waurl);
|
$waurl = str_replace('[text]', urlencode($txt), $waurl);
|
||||||
Http::getData($waurl);
|
return Http::getData($waurl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function sendPackageNotification($phone, $name, $package, $price, $message, $via)
|
public static function sendPackageNotification($phone, $name, $package, $price, $message, $via)
|
||||||
{
|
{
|
||||||
$msg = str_replace('[[name]]', "$name", $message);
|
$msg = str_replace('[[name]]', $name, $message);
|
||||||
$msg = str_replace('[[package]]', "$package", $msg);
|
$msg = str_replace('[[package]]', $package, $msg);
|
||||||
$msg = str_replace('[[price]]', "$price", $msg);
|
$msg = str_replace('[[price]]', $price, $msg);
|
||||||
if (
|
if (
|
||||||
!empty($phone) && strlen($phone) > 5
|
!empty($phone) && strlen($phone) > 5
|
||||||
&& !empty($message) && in_array($via, ['sms', 'wa'])
|
&& !empty($message) && in_array($via, ['sms', 'wa'])
|
||||||
@ -86,7 +86,7 @@ class Message
|
|||||||
|
|
||||||
public static function sendBalanceNotification($phone, $name, $balance, $balance_now, $message, $via)
|
public static function sendBalanceNotification($phone, $name, $balance, $balance_now, $message, $via)
|
||||||
{
|
{
|
||||||
$msg = str_replace('[[name]]', "$name", $message);
|
$msg = str_replace('[[name]]', $name, $message);
|
||||||
$msg = str_replace('[[current_balance]]', Lang::moneyFormat($balance_now), $msg);
|
$msg = str_replace('[[current_balance]]', Lang::moneyFormat($balance_now), $msg);
|
||||||
$msg = str_replace('[[balance]]', Lang::moneyFormat($balance), $msg);
|
$msg = str_replace('[[balance]]', Lang::moneyFormat($balance), $msg);
|
||||||
if (
|
if (
|
||||||
|
@ -130,7 +130,6 @@ class Mikrotik
|
|||||||
->setArgument('address-pool', $pool)
|
->setArgument('address-pool', $pool)
|
||||||
->setArgument('rate-limit', '512K/512K')
|
->setArgument('rate-limit', '512K/512K')
|
||||||
);
|
);
|
||||||
die("| $profileID | $name | $pool |");
|
|
||||||
} else {
|
} else {
|
||||||
$setRequest = new RouterOS\Request('/ip/hotspot/user/profile/set');
|
$setRequest = new RouterOS\Request('/ip/hotspot/user/profile/set');
|
||||||
$client->sendSync(
|
$client->sendSync(
|
||||||
|
@ -108,6 +108,21 @@ try {
|
|||||||
ORM::configure('driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'), 'radius');
|
ORM::configure('driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'), 'radius');
|
||||||
ORM::configure('return_result_sets', true, 'radius');
|
ORM::configure('return_result_sets', true, 'radius');
|
||||||
}
|
}
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
$ui = new Smarty();
|
||||||
|
$ui->setTemplateDir(['custom' => File::pathFixer('ui/ui_custom/'), 'default' => File::pathFixer('ui/ui/')]);
|
||||||
|
$ui->assign('_url', APP_URL . '/index.php?_route=');
|
||||||
|
$ui->setCompileDir(File::pathFixer('ui/compiled/'));
|
||||||
|
$ui->setConfigDir(File::pathFixer('ui/conf/'));
|
||||||
|
$ui->setCacheDir(File::pathFixer('ui/cache/'));
|
||||||
|
$ui->assign("error_title", "PHPNuxBill Crash");
|
||||||
|
if (isset($_SESSION['uid'])) {
|
||||||
|
$ui->assign("error_message", $e->getMessage() . '<br>');
|
||||||
|
} else {
|
||||||
|
$ui->assign("error_message", $e->getMessage() . '<br><pre>' . $e->getTraceAsString() . '</pre>');
|
||||||
|
}
|
||||||
|
$ui->display('router-error.tpl');
|
||||||
|
die();
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$ui = new Smarty();
|
$ui = new Smarty();
|
||||||
$ui->setTemplateDir(['custom' => File::pathFixer('ui/ui_custom/'), 'default' => File::pathFixer('ui/ui/')]);
|
$ui->setTemplateDir(['custom' => File::pathFixer('ui/ui_custom/'), 'default' => File::pathFixer('ui/ui/')]);
|
||||||
@ -227,7 +242,13 @@ function _admin($login = true)
|
|||||||
|
|
||||||
function _log($description, $type = '', $userid = '0')
|
function _log($description, $type = '', $userid = '0')
|
||||||
{
|
{
|
||||||
Log::put($type, $description, $userid);
|
$d = ORM::for_table('tbl_logs')->create();
|
||||||
|
$d->date = date('Y-m-d H:i:s');
|
||||||
|
$d->type = $type;
|
||||||
|
$d->description = $description;
|
||||||
|
$d->userid = $userid;
|
||||||
|
$d->ip = $_SERVER["REMOTE_ADDR"];
|
||||||
|
$d->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
function Lang($key)
|
function Lang($key)
|
||||||
@ -311,7 +332,6 @@ if ($handler == '') {
|
|||||||
$handler = 'default';
|
$handler = 'default';
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
|
||||||
$sys_render = File::pathFixer('system/controllers/' . $handler . '.php');
|
$sys_render = File::pathFixer('system/controllers/' . $handler . '.php');
|
||||||
if (file_exists($sys_render)) {
|
if (file_exists($sys_render)) {
|
||||||
$menus = array();
|
$menus = array();
|
||||||
@ -326,12 +346,20 @@ try {
|
|||||||
if (!empty($menu['icon'])) {
|
if (!empty($menu['icon'])) {
|
||||||
$menus[$menu['position']] .= '<i class="' . $menu['icon'] . '"></i>';
|
$menus[$menu['position']] .= '<i class="' . $menu['icon'] . '"></i>';
|
||||||
}
|
}
|
||||||
|
if (!empty($menu['label'])) {
|
||||||
|
$menus[$menu['position']] .= '<span class="pull-right-container">';
|
||||||
|
$menus[$menu['position']] .= '<small class="label pull-right bg-' . $menu['color'] . '">' . $menu['label'] . '</small></span>';
|
||||||
|
}
|
||||||
$menus[$menu['position']] .= '<span class="text">' . $menu['name'] . '</span></a></li>';
|
$menus[$menu['position']] .= '<span class="text">' . $menu['name'] . '</span></a></li>';
|
||||||
} else if (!$menu['admin'] && _auth(false)) {
|
} else if (!$menu['admin'] && _auth(false)) {
|
||||||
$menus[$menu['position']] .= '<li' . (($routes[1] == $menu['function']) ? ' class="active"' : '') . '><a href="' . U . 'plugin/' . $menu['function'] . '">';
|
$menus[$menu['position']] .= '<li' . (($routes[1] == $menu['function']) ? ' class="active"' : '') . '><a href="' . U . 'plugin/' . $menu['function'] . '">';
|
||||||
if (!empty($menu['icon'])) {
|
if (!empty($menu['icon'])) {
|
||||||
$menus[$menu['position']] .= '<i class="' . $menu['icon'] . '"></i>';
|
$menus[$menu['position']] .= '<i class="' . $menu['icon'] . '"></i>';
|
||||||
}
|
}
|
||||||
|
if (!empty($menu['label'])) {
|
||||||
|
$menus[$menu['position']] .= '<span class="pull-right-container">';
|
||||||
|
$menus[$menu['position']] .= '<small class="label pull-right bg-' . $menu['color'] . '">' . $menu['label'] . '</small></span>';
|
||||||
|
}
|
||||||
$menus[$menu['position']] .= '<span class="text">' . $menu['name'] . '</span></a></li>';
|
$menus[$menu['position']] .= '<span class="text">' . $menu['name'] . '</span></a></li>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -343,6 +371,14 @@ try {
|
|||||||
} else {
|
} else {
|
||||||
r2(U . 'dashboard', 'e', 'not found');
|
r2(U . 'dashboard', 'e', 'not found');
|
||||||
}
|
}
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
if (!isset($_SESSION['aid']) || empty($_SESSION['aid'])) {
|
||||||
|
r2(U . 'home', 'e', $e->getMessage());
|
||||||
|
}
|
||||||
|
$ui->assign("error_message", $e->getMessage() . '<br><pre>' . $e->getTraceAsString() . '</pre>');
|
||||||
|
$ui->assign("error_title", "PHPNuxBill Crash");
|
||||||
|
$ui->display('router-error.tpl');
|
||||||
|
die();
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
if (!isset($_SESSION['aid']) || empty($_SESSION['aid'])) {
|
if (!isset($_SESSION['aid']) || empty($_SESSION['aid'])) {
|
||||||
r2(U . 'home', 'e', $e->getMessage());
|
r2(U . 'home', 'e', $e->getMessage());
|
||||||
|
@ -23,7 +23,7 @@ switch ($action) {
|
|||||||
$q = (_post('q') ? _post('q') : _get('q'));
|
$q = (_post('q') ? _post('q') : _get('q'));
|
||||||
$keep = _post('keep');
|
$keep = _post('keep');
|
||||||
if (!empty($keep)) {
|
if (!empty($keep)) {
|
||||||
ORM::raw_execute("DELETE FROM tbl_logs WHERE date < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL $keep DAY))");
|
ORM::raw_execute("DELETE FROM tbl_logs WHERE UNIX_TIMESTAMP(date) < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL $keep DAY))");
|
||||||
r2(U . "logs/list/", 's', "Delete logs older than $keep days");
|
r2(U . "logs/list/", 's', "Delete logs older than $keep days");
|
||||||
}
|
}
|
||||||
if ($q != '') {
|
if ($q != '') {
|
||||||
|
@ -159,7 +159,7 @@ switch ($action) {
|
|||||||
case 'print':
|
case 'print':
|
||||||
$id = _post('id');
|
$id = _post('id');
|
||||||
$d = ORM::for_table('tbl_transactions')->where('id', $id)->find_one();
|
$d = ORM::for_table('tbl_transactions')->where('id', $id)->find_one();
|
||||||
$ui->assign('d', $d);
|
$ui->assign('in', $d);
|
||||||
|
|
||||||
$ui->assign('date', Lang::dateAndTimeFormat($d['recharged_on'], $d['recharged_time']));
|
$ui->assign('date', Lang::dateAndTimeFormat($d['recharged_on'], $d['recharged_time']));
|
||||||
run_hook('print_invoice'); #HOOK
|
run_hook('print_invoice'); #HOOK
|
||||||
|
@ -119,7 +119,7 @@ foreach ($d as $ds) {
|
|||||||
$c = ORM::for_table('tbl_customers')->where('id', $ds['customer_id'])->find_one();
|
$c = ORM::for_table('tbl_customers')->where('id', $ds['customer_id'])->find_one();
|
||||||
$m = Mikrotik::info($ds['routers']);
|
$m = Mikrotik::info($ds['routers']);
|
||||||
$p = ORM::for_table('tbl_plans')->where('id', $u['plan_id'])->find_one();
|
$p = ORM::for_table('tbl_plans')->where('id', $u['plan_id'])->find_one();
|
||||||
|
$price = Lang::moneyFormat($p['price']);
|
||||||
if ($p['is_radius']) {
|
if ($p['is_radius']) {
|
||||||
if (empty($p['pool_expired'])) {
|
if (empty($p['pool_expired'])) {
|
||||||
print_r(Radius::customerDeactivate($c['username']));
|
print_r(Radius::customerDeactivate($c['username']));
|
||||||
@ -136,7 +136,7 @@ foreach ($d as $ds) {
|
|||||||
}
|
}
|
||||||
Mikrotik::removeHotspotActiveUser($client, $c['username']);
|
Mikrotik::removeHotspotActiveUser($client, $c['username']);
|
||||||
}
|
}
|
||||||
Message::sendPackageNotification($c['phonenumber'], $c['fullname'], $u['namebp'], $textExpired, $config['user_notification_expired']);
|
echo Message::sendPackageNotification($c['phonenumber'], $c['fullname'], $u['namebp'], $price, $textExpired, $config['user_notification_expired'])."\n";
|
||||||
//update database user dengan status off
|
//update database user dengan status off
|
||||||
$u->status = 'off';
|
$u->status = 'off';
|
||||||
$u->save();
|
$u->save();
|
||||||
@ -174,7 +174,7 @@ foreach ($d as $ds) {
|
|||||||
$c = ORM::for_table('tbl_customers')->where('id', $ds['customer_id'])->find_one();
|
$c = ORM::for_table('tbl_customers')->where('id', $ds['customer_id'])->find_one();
|
||||||
$m = ORM::for_table('tbl_routers')->where('name', $ds['routers'])->find_one();
|
$m = ORM::for_table('tbl_routers')->where('name', $ds['routers'])->find_one();
|
||||||
$p = ORM::for_table('tbl_plans')->where('id', $u['plan_id'])->find_one();
|
$p = ORM::for_table('tbl_plans')->where('id', $u['plan_id'])->find_one();
|
||||||
|
$price = Lang::moneyFormat($p['price']);
|
||||||
if ($p['is_radius']) {
|
if ($p['is_radius']) {
|
||||||
if (empty($p['pool_expired'])) {
|
if (empty($p['pool_expired'])) {
|
||||||
print_r(Radius::customerDeactivate($c['username']));
|
print_r(Radius::customerDeactivate($c['username']));
|
||||||
@ -191,7 +191,7 @@ foreach ($d as $ds) {
|
|||||||
}
|
}
|
||||||
Mikrotik::removePpoeActive($client, $c['username']);
|
Mikrotik::removePpoeActive($client, $c['username']);
|
||||||
}
|
}
|
||||||
Message::sendPackageNotification($c['phonenumber'], $c['fullname'], $u['namebp'], $textExpired, $config['user_notification_expired']);
|
echo Message::sendPackageNotification($c['phonenumber'], $c['fullname'], $u['namebp'], $price, $textExpired, $config['user_notification_expired'])."\n";
|
||||||
|
|
||||||
$u->status = 'off';
|
$u->status = 'off';
|
||||||
$u->save();
|
$u->save();
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<link rel="stylesheet" href="ui/ui/fonts/MaterialDesign/css/materialdesignicons.min.css">
|
<link rel="stylesheet" href="ui/ui/fonts/MaterialDesign/css/materialdesignicons.min.css">
|
||||||
|
|
||||||
<link rel="stylesheet" href="ui/ui/styles/modern-AdminLTE.min.css">
|
<link rel="stylesheet" href="ui/ui/styles/modern-AdminLTE.min.css">
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
::-moz-selection {
|
::-moz-selection {
|
||||||
/* Code for Firefox */
|
/* Code for Firefox */
|
||||||
@ -57,9 +57,16 @@
|
|||||||
<div class="box-footer">
|
<div class="box-footer">
|
||||||
<div class="btn-group btn-group-justified" role="group" aria-label="...">
|
<div class="btn-group btn-group-justified" role="group" aria-label="...">
|
||||||
<a href="./update.php?step=4" class="btn btn-info btn-sm btn-block">Update Database</a>
|
<a href="./update.php?step=4" class="btn btn-info btn-sm btn-block">Update Database</a>
|
||||||
<a href="{$_url}community#update" class="btn btn-primary btn-sm btn-block">Update
|
<a href="{$_url}community#update" class="btn btn-success btn-sm btn-block">Update
|
||||||
PHPNuxBill</a>
|
PHPNuxBill</a>
|
||||||
</div>
|
</div>
|
||||||
|
<br>
|
||||||
|
<div class="btn-group btn-group-justified" role="group" aria-label="...">
|
||||||
|
<a href="https://github.com/hotspotbilling/phpnuxbill/discussions" target="_blank"
|
||||||
|
class="btn btn-success btn-sm btn-block">Ask Github Community</a>
|
||||||
|
<a href="https://t.me/phpnuxbill" target="_blank"
|
||||||
|
class="btn btn-primary btn-sm btn-block">Ask Telegram Community</a>
|
||||||
|
</div>
|
||||||
<br><br>
|
<br><br>
|
||||||
<a href="javascript::history.back()" onclick="history.back()"
|
<a href="javascript::history.back()" onclick="history.back()"
|
||||||
class="btn btn-warning btn-block">back</a>
|
class="btn btn-warning btn-block">back</a>
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
"version": "2024.1.16"
|
"version": "2024.1.17"
|
||||||
}
|
}
|
Reference in New Issue
Block a user