Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
3372da2ac4 | |||
803d04a91d | |||
17de653752 | |||
9301f1058c | |||
0868d61271 | |||
5f353392e3 | |||
fdd8dad509 | |||
3563fa531b | |||
525f2311fc | |||
3b6a6d2f55 | |||
3cebfa2171 | |||
c65b569f94 | |||
ca5a7d60cf | |||
5987ffafce | |||
d7bbb4d18f | |||
e3c173bea4 | |||
78e1e2f989 | |||
3c7e6c7a64 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -55,3 +55,5 @@ docs/**
|
|||||||
!docs/*.md
|
!docs/*.md
|
||||||
.htaccess
|
.htaccess
|
||||||
.idea
|
.idea
|
||||||
|
!docs/insomnia.rest.json
|
||||||
|
!system/uploads/paid.png
|
File diff suppressed because one or more lines are too long
1
docs/insomnia.rest.json
Normal file
1
docs/insomnia.rest.json
Normal file
File diff suppressed because one or more lines are too long
@ -48,7 +48,28 @@ $ui = new class($key)
|
|||||||
}
|
}
|
||||||
function getAll()
|
function getAll()
|
||||||
{
|
{
|
||||||
return $this->assign;
|
|
||||||
|
$result = [];
|
||||||
|
foreach ($this->assign as $key => $value) {
|
||||||
|
if($value instanceof ORM){
|
||||||
|
$result[$key] = $value->as_array();
|
||||||
|
}else if($value instanceof IdiormResultSet){
|
||||||
|
$count = count($value);
|
||||||
|
for($n=0;$n<$count;$n++){
|
||||||
|
foreach ($value[$n] as $k=>$v) {
|
||||||
|
$result[$key][$n][$k] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
$result[$key] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function fetch()
|
||||||
|
{
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -22,8 +22,8 @@ class Csrf
|
|||||||
|
|
||||||
public static function check($token)
|
public static function check($token)
|
||||||
{
|
{
|
||||||
global $config;
|
global $config, $isApi;
|
||||||
if($config['csrf_enabled'] == 'yes') {
|
if($config['csrf_enabled'] == 'yes' && !$isApi) {
|
||||||
if (isset($_SESSION['csrf_token'], $_SESSION['csrf_token_time'], $token)) {
|
if (isset($_SESSION['csrf_token'], $_SESSION['csrf_token_time'], $token)) {
|
||||||
$storedToken = $_SESSION['csrf_token'];
|
$storedToken = $_SESSION['csrf_token'];
|
||||||
$tokenTime = $_SESSION['csrf_token_time'];
|
$tokenTime = $_SESSION['csrf_token_time'];
|
||||||
|
@ -87,7 +87,7 @@ class File
|
|||||||
$src_img = $image_create($source_file);
|
$src_img = $image_create($source_file);
|
||||||
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $nwidth, $nheight, $width, $height);
|
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $nwidth, $nheight, $width, $height);
|
||||||
|
|
||||||
$image($dst_img, $dst_dir, $quality);
|
imagepng($dst_img, $dst_dir);
|
||||||
|
|
||||||
if ($dst_img) imagedestroy($dst_img);
|
if ($dst_img) imagedestroy($dst_img);
|
||||||
if ($src_img) imagedestroy($src_img);
|
if ($src_img) imagedestroy($src_img);
|
||||||
|
@ -393,6 +393,18 @@ class Message
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getMessageType($type, $message){
|
||||||
|
if(strpos($message, "<divider>") === false){
|
||||||
|
return $message;
|
||||||
|
}
|
||||||
|
$msgs = explode("<divider>", $message);
|
||||||
|
if($type == "PPPOE"){
|
||||||
|
return $msgs[1];
|
||||||
|
}else{
|
||||||
|
return $msgs[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static function logMessage($messageType, $recipient, $messageContent, $status, $errorMessage = null)
|
public static function logMessage($messageType, $recipient, $messageContent, $status, $errorMessage = null)
|
||||||
{
|
{
|
||||||
$log = ORM::for_table('tbl_message_logs')->create();
|
$log = ORM::for_table('tbl_message_logs')->create();
|
||||||
|
@ -10,7 +10,7 @@ class Paginator
|
|||||||
{
|
{
|
||||||
public static function findMany($query, $search = [], $per_page = '10', $append_url = "", $toArray = false)
|
public static function findMany($query, $search = [], $per_page = '10', $append_url = "", $toArray = false)
|
||||||
{
|
{
|
||||||
global $routes, $ui;
|
global $routes, $ui, $isApi;
|
||||||
$adjacents = "2";
|
$adjacents = "2";
|
||||||
$page = _get('p', 1);
|
$page = _get('p', 1);
|
||||||
$page = (empty($page) ? 1 : $page);
|
$page = (empty($page) ? 1 : $page);
|
||||||
@ -72,7 +72,7 @@ class Paginator
|
|||||||
if ($ui) {
|
if ($ui) {
|
||||||
$ui->assign('paginator', $result);
|
$ui->assign('paginator', $result);
|
||||||
}
|
}
|
||||||
if($toArray){
|
if($toArray || $isApi){
|
||||||
return $query->offset($startpoint)->limit($per_page)->find_array();
|
return $query->offset($startpoint)->limit($per_page)->find_array();
|
||||||
}else{
|
}else{
|
||||||
return $query->offset($startpoint)->limit($per_page)->find_many();
|
return $query->offset($startpoint)->limit($per_page)->find_many();
|
||||||
|
@ -196,8 +196,8 @@ if (isset($_GET['recharge']) && !empty($_GET['recharge'])) {
|
|||||||
$tur->save();
|
$tur->save();
|
||||||
App::setToken(_get('stoken'), $id);
|
App::setToken(_get('stoken'), $id);
|
||||||
file_put_contents($path, $m);
|
file_put_contents($path, $m);
|
||||||
_log("Customer $tur[customer_id] $tur[username] extend for $days days", "Customer", $user['id']);
|
_log("Customer $tur[customer_id] $user[fullname] ($tur[username]) extend for $days days", "Customer", $user['id']);
|
||||||
Message::sendTelegram("#u$user[username] #extend #" . $p['type'] . " \n" . $p['name_plan'] .
|
Message::sendTelegram("#u$user[username] ($user[fullname]) #id$tur[customer_id] #extend #" . $p['type'] . " \n" . $p['name_plan'] .
|
||||||
"\nLocation: " . $p['routers'] .
|
"\nLocation: " . $p['routers'] .
|
||||||
"\nCustomer: " . $user['fullname'] .
|
"\nCustomer: " . $user['fullname'] .
|
||||||
"\nNew Expired: " . Lang::dateAndTimeFormat($expiration, $tur['time']));
|
"\nNew Expired: " . Lang::dateAndTimeFormat($expiration, $tur['time']));
|
||||||
|
@ -269,6 +269,17 @@ switch ($action) {
|
|||||||
r2(getUrl('plan/view/') . $id, 'd', "Customer not found");
|
r2(getUrl('plan/view/') . $id, 'd', "Customer not found");
|
||||||
}
|
}
|
||||||
Package::createInvoice($in);
|
Package::createInvoice($in);
|
||||||
|
$UPLOAD_URL_PATH = str_replace($root_path, '', $UPLOAD_PATH);
|
||||||
|
$logo = '';
|
||||||
|
if (file_exists($UPLOAD_PATH . DIRECTORY_SEPARATOR . 'logo.png')) {
|
||||||
|
$logo = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'logo.png';
|
||||||
|
$imgsize = getimagesize($logo);
|
||||||
|
$width = $imgsize[0];
|
||||||
|
$height = $imgsize[1];
|
||||||
|
$ui->assign('wlogo', $width);
|
||||||
|
$ui->assign('hlogo', $height);
|
||||||
|
}
|
||||||
|
$ui->assign('logo', $logo);
|
||||||
$ui->assign('_title', 'View Invoice');
|
$ui->assign('_title', 'View Invoice');
|
||||||
$ui->display('admin/plan/invoice.tpl');
|
$ui->display('admin/plan/invoice.tpl');
|
||||||
break;
|
break;
|
||||||
@ -1062,11 +1073,11 @@ switch ($action) {
|
|||||||
} else {
|
} else {
|
||||||
r2(getUrl('plan'), 's', "Customer not found");
|
r2(getUrl('plan'), 's', "Customer not found");
|
||||||
}
|
}
|
||||||
Message::sendTelegram("#u$tur[username] #extend #" . $p['type'] . " \n" . $p['name_plan'] .
|
Message::sendTelegram("#u$tur[username] #id$tur[customer_id] #extend by $admin[fullname] #" . $p['type'] . " \n" . $p['name_plan'] .
|
||||||
"\nLocation: " . $p['routers'] .
|
"\nLocation: " . $p['routers'] .
|
||||||
"\nCustomer: " . $c['fullname'] .
|
"\nCustomer: " . $c['fullname'] .
|
||||||
"\nNew Expired: " . Lang::dateAndTimeFormat($expiration, $tur['time']));
|
"\nNew Expired: " . Lang::dateAndTimeFormat($expiration, $tur['time']));
|
||||||
_log("$admin[fullname] extend Customer $tur[customer_id] $tur[username] for $days days", $admin['user_type'], $admin['id']);
|
_log("$admin[fullname] extend Customer $tur[customer_id] $tur[username] #$tur[customer_id] for $days days", $admin['user_type'], $admin['id']);
|
||||||
r2(getUrl('plan'), 's', "Extend until $expiration");
|
r2(getUrl('plan'), 's', "Extend until $expiration");
|
||||||
} else {
|
} else {
|
||||||
r2(getUrl('plan'), 's', "Customer is not expired yet");
|
r2(getUrl('plan'), 's', "Customer is not expired yet");
|
||||||
|
@ -113,7 +113,8 @@ switch ($do) {
|
|||||||
$d->save();
|
$d->save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (file_exists($_FILES['photo']['tmp_name'])) unlink($_FILES['photo']['tmp_name']);
|
if (file_exists($_FILES['photo']['tmp_name']))
|
||||||
|
unlink($_FILES['photo']['tmp_name']);
|
||||||
User::setFormCustomField($user);
|
User::setFormCustomField($user);
|
||||||
run_hook('register_user'); #HOOK
|
run_hook('register_user'); #HOOK
|
||||||
$msg .= Lang::T('Registration successful') . '<br>';
|
$msg .= Lang::T('Registration successful') . '<br>';
|
||||||
@ -147,8 +148,45 @@ switch ($do) {
|
|||||||
// Display register-otp.tpl if OTP is enabled
|
// Display register-otp.tpl if OTP is enabled
|
||||||
$ui->display('customer/register-otp.tpl');
|
$ui->display('customer/register-otp.tpl');
|
||||||
} else {
|
} else {
|
||||||
// Display register.tpl if OTP is not enabled
|
$UPLOAD_URL_PATH = str_replace($root_path, '', $UPLOAD_PATH);
|
||||||
$ui->display('customer/register.tpl');
|
if (!empty($config['login_page_logo']) && file_exists($UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . $config['login_page_logo'])) {
|
||||||
|
$login_logo = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . $config['login_page_logo'];
|
||||||
|
} elseif (file_exists($UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'login-logo.png')) {
|
||||||
|
$login_logo = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'login-logo.png';
|
||||||
|
} else {
|
||||||
|
$login_logo = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'login-logo.default.png';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($config['login_page_wallpaper']) && file_exists($UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . $config['login_page_wallpaper'])) {
|
||||||
|
$wallpaper = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . $config['login_page_wallpaper'];
|
||||||
|
} elseif (file_exists($UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'wallpaper.png')) {
|
||||||
|
$wallpaper = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'wallpaper.png';
|
||||||
|
} else {
|
||||||
|
$wallpaper = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'wallpaper.default.png';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($config['login_page_favicon']) && file_exists($UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . $config['login_page_favicon'])) {
|
||||||
|
$favicon = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . $config['login_page_favicon'];
|
||||||
|
} elseif (file_exists($UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'favicon.png')) {
|
||||||
|
$favicon = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'favicon.png';
|
||||||
|
} else {
|
||||||
|
$favicon = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'favicon.default.png';
|
||||||
|
}
|
||||||
|
|
||||||
|
$ui->assign('login_logo', $login_logo);
|
||||||
|
$ui->assign('wallpaper', $wallpaper);
|
||||||
|
$ui->assign('favicon', $favicon);
|
||||||
|
$ui->assign('csrf_token', $csrf_token);
|
||||||
|
$ui->assign('_title', Lang::T('Login'));
|
||||||
|
$ui->assign('customFields', User::getFormCustomField($ui, true));
|
||||||
|
switch ($config['login_page_type']) {
|
||||||
|
case 'custom':
|
||||||
|
$ui->display('customer/reg-login-custom-' . $config['login_Page_template'] . '.tpl');
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$ui->display('customer/register.tpl');
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -196,6 +234,36 @@ switch ($do) {
|
|||||||
$ui->display('customer/register-rotp.tpl');
|
$ui->display('customer/register-rotp.tpl');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
$UPLOAD_URL_PATH = str_replace($root_path, '', $UPLOAD_PATH);
|
||||||
|
if (!empty($config['login_page_logo']) && file_exists($UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . $config['login_page_logo'])) {
|
||||||
|
$login_logo = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . $config['login_page_logo'];
|
||||||
|
} elseif (file_exists($UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'login-logo.png')) {
|
||||||
|
$login_logo = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'login-logo.png';
|
||||||
|
} else {
|
||||||
|
$login_logo = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'login-logo.default.png';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($config['login_page_wallpaper']) && file_exists($UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . $config['login_page_wallpaper'])) {
|
||||||
|
$wallpaper = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . $config['login_page_wallpaper'];
|
||||||
|
} elseif (file_exists($UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'wallpaper.png')) {
|
||||||
|
$wallpaper = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'wallpaper.png';
|
||||||
|
} else {
|
||||||
|
$wallpaper = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'wallpaper.default.png';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($config['login_page_favicon']) && file_exists($UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . $config['login_page_favicon'])) {
|
||||||
|
$favicon = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . $config['login_page_favicon'];
|
||||||
|
} elseif (file_exists($UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'favicon.png')) {
|
||||||
|
$favicon = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'favicon.png';
|
||||||
|
} else {
|
||||||
|
$favicon = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'favicon.default.png';
|
||||||
|
}
|
||||||
|
|
||||||
|
$ui->assign('login_logo', $login_logo);
|
||||||
|
$ui->assign('wallpaper', $wallpaper);
|
||||||
|
$ui->assign('favicon', $favicon);
|
||||||
|
$ui->assign('csrf_token', $csrf_token);
|
||||||
|
$ui->assign('_title', Lang::T('Login'));
|
||||||
$ui->assign('customFields', User::getFormCustomField($ui, true));
|
$ui->assign('customFields', User::getFormCustomField($ui, true));
|
||||||
$ui->assign('username', "");
|
$ui->assign('username', "");
|
||||||
$ui->assign('fullname', "");
|
$ui->assign('fullname', "");
|
||||||
@ -204,7 +272,15 @@ switch ($do) {
|
|||||||
$ui->assign('otp', false);
|
$ui->assign('otp', false);
|
||||||
$ui->assign('_title', Lang::T('Register'));
|
$ui->assign('_title', Lang::T('Register'));
|
||||||
run_hook('view_register'); #HOOK
|
run_hook('view_register'); #HOOK
|
||||||
$ui->display('customer/register.tpl');
|
switch ($config['login_page_type']) {
|
||||||
|
case 'custom':
|
||||||
|
$ui->display('customer/reg-login-custom-' . $config['login_Page_template'] . '.tpl');
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$ui->display('customer/register.tpl');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,17 @@ switch ($action) {
|
|||||||
}
|
}
|
||||||
if ($in) {
|
if ($in) {
|
||||||
Package::createInvoice($in);
|
Package::createInvoice($in);
|
||||||
|
$UPLOAD_URL_PATH = str_replace($root_path, '', $UPLOAD_PATH);
|
||||||
|
$logo = '';
|
||||||
|
if (file_exists($UPLOAD_PATH . DIRECTORY_SEPARATOR . 'logo.png')) {
|
||||||
|
$logo = $UPLOAD_URL_PATH . DIRECTORY_SEPARATOR . 'logo.png';
|
||||||
|
$imgsize = getimagesize($logo);
|
||||||
|
$width = $imgsize[0];
|
||||||
|
$height = $imgsize[1];
|
||||||
|
$ui->assign('wlogo', $width);
|
||||||
|
$ui->assign('hlogo', $height);
|
||||||
|
}
|
||||||
|
$ui->assign('logo', $logo);
|
||||||
$ui->display('customer/invoice-customer.tpl');
|
$ui->display('customer/invoice-customer.tpl');
|
||||||
} else {
|
} else {
|
||||||
r2(getUrl('voucher/list-activated'), 'e', Lang::T('Not Found'));
|
r2(getUrl('voucher/list-activated'), 'e', Lang::T('Not Found'));
|
||||||
|
@ -89,7 +89,13 @@ foreach ($d as $ds) {
|
|||||||
|
|
||||||
// Send notification and update user status
|
// Send notification and update user status
|
||||||
try {
|
try {
|
||||||
echo Message::sendPackageNotification($c, $u['namebp'], $p['price'], $textExpired, $config['user_notification_expired']) . "\n";
|
echo Message::sendPackageNotification(
|
||||||
|
$c,
|
||||||
|
$u['namebp'],
|
||||||
|
$p['price'],
|
||||||
|
Message::getMessageType($p['type'], $textExpired),
|
||||||
|
$config['user_notification_expired']
|
||||||
|
) . "\n";
|
||||||
$u->status = 'off';
|
$u->status = 'off';
|
||||||
$u->save();
|
$u->save();
|
||||||
} catch (Throwable $e) {
|
} catch (Throwable $e) {
|
||||||
|
@ -51,23 +51,40 @@ foreach ($d as $ds) {
|
|||||||
}
|
}
|
||||||
if ($ds['expiration'] == $day7 && $config['notification_reminder_7day'] !== 'no') {
|
if ($ds['expiration'] == $day7 && $config['notification_reminder_7day'] !== 'no') {
|
||||||
try {
|
try {
|
||||||
echo Message::sendPackageNotification($c, $p['name_plan'], $price, Lang::getNotifText('reminder_7_day'), $config['user_notification_reminder']) . "\n";
|
echo Message::sendPackageNotification(
|
||||||
|
$c,
|
||||||
|
$p['name_plan'],
|
||||||
|
$price,
|
||||||
|
Message::getMessageType($p['type'], Lang::getNotifText('reminder_7_day')),
|
||||||
|
$config['user_notification_reminder']
|
||||||
|
) . "\n";
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
sendTelegram("Cron Reminder failed to send 7-day reminder to " . $ds['username'] . " Error: " . $e->getMessage());
|
sendTelegram("Cron Reminder failed to send 7-day reminder to " . $ds['username'] . " Error: " . $e->getMessage());
|
||||||
}
|
}
|
||||||
} else if ($ds['expiration'] == $day3 && $config['notification_reminder_3day'] !== 'no') {
|
} else if ($ds['expiration'] == $day3 && $config['notification_reminder_3day'] !== 'no') {
|
||||||
try {
|
try {
|
||||||
echo Message::sendPackageNotification($c, $p['name_plan'], $price, Lang::getNotifText('reminder_3_day'), $config['user_notification_reminder']) . "\n";
|
echo Message::sendPackageNotification(
|
||||||
|
$c,
|
||||||
|
$p['name_plan'],
|
||||||
|
$price,
|
||||||
|
Message::getMessageType($p['type'], Lang::getNotifText('reminder_3_day')),
|
||||||
|
$config['user_notification_reminder']
|
||||||
|
) . "\n";
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
sendTelegram("Cron Reminder failed to send 3-day reminder to " . $ds['username'] . " Error: " . $e->getMessage());
|
sendTelegram("Cron Reminder failed to send 3-day reminder to " . $ds['username'] . " Error: " . $e->getMessage());
|
||||||
}
|
}
|
||||||
} else if ($ds['expiration'] == $day1 && $config['notification_reminder_1day'] !== 'no') {
|
} else if ($ds['expiration'] == $day1 && $config['notification_reminder_1day'] !== 'no') {
|
||||||
try {
|
try {
|
||||||
echo Message::sendPackageNotification($c, $p['name_plan'], $price, Lang::getNotifText('reminder_1_day'), $config['user_notification_reminder']) . "\n";
|
echo Message::sendPackageNotification(
|
||||||
|
$c,
|
||||||
|
$p['name_plan'],
|
||||||
|
$price,
|
||||||
|
Message::getMessageType($p['type'], Lang::getNotifText('reminder_1_day')),
|
||||||
|
$config['user_notification_reminder']
|
||||||
|
) . "\n";
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
sendTelegram("Cron Reminder failed to send 1-day reminder to " . $ds['username'] . " Error: " . $e->getMessage());
|
sendTelegram("Cron Reminder failed to send 1-day reminder to " . $ds['username'] . " Error: " . $e->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1120,5 +1120,33 @@
|
|||||||
"Delete_this_widget_": "Delete this widget?",
|
"Delete_this_widget_": "Delete this widget?",
|
||||||
"Remove_this_widget_": "Remove this widget?",
|
"Remove_this_widget_": "Remove this widget?",
|
||||||
"PPPoE_Remote_IP": "PPPoE Remote IP",
|
"PPPoE_Remote_IP": "PPPoE Remote IP",
|
||||||
"Continue_the_Recharge_process": "Continue the Recharge process"
|
"Continue_the_Recharge_process": "Continue the Recharge process",
|
||||||
|
"Contributors": "Contributors",
|
||||||
|
"Discussions": "Discussions",
|
||||||
|
"Get_help_from_community": "Get help from community",
|
||||||
|
"Github_Discussions": "Github Discussions",
|
||||||
|
"Telegram_Group": "Telegram Group",
|
||||||
|
"Feedback_and_Bug_Report": "Feedback and Bug Report",
|
||||||
|
"Give_Feedback": "Give Feedback",
|
||||||
|
"Chat_with_me": "Chat with me",
|
||||||
|
"_50_Paid_Support": "$50 Paid Support",
|
||||||
|
"donation_confirmation_": "donation confirmation?",
|
||||||
|
"Or_ask_any_Donation_Alternative": "Or ask any Donation Alternative",
|
||||||
|
"Free_WhatsApp_Gateway_and_Telegram_Bot_creater": "Free WhatsApp Gateway and Telegram Bot creater",
|
||||||
|
"There_is_a_Telegram_bot_wizard_in_here": "There is a Telegram bot wizard in here",
|
||||||
|
"is_a_billing_Hotspot_and_PPPOE_for_Mikrotik_using_PHP_and_Mikrotik_API_to_comunicate_with_router__If_you_get_more_profit_with_this_application__please_donate_us_": "is a billing Hotspot and PPPOE for Mikrotik using PHP and Mikrotik API to comunicate with router. If you get more profit with this application, please donate us.",
|
||||||
|
"Watch_project": "Watch project",
|
||||||
|
"in_here": "in here",
|
||||||
|
"Install_Latest_Version": "Install Latest Version",
|
||||||
|
"Download_Latest_Version": "Download Latest Version",
|
||||||
|
"Select_Old_Version": "Select Old Version",
|
||||||
|
"Current_Changelog": "Current Changelog",
|
||||||
|
"Repo_Changelog": "Repo Changelog",
|
||||||
|
"If_you_Download_manual_the_update_file__sometime_update_change_database__after_uploading__click_this_button_to_update_database_structure_": "If you Download manual the update file, sometime update change database, after uploading, click this button to update database structure.",
|
||||||
|
"Update_Database": "Update Database",
|
||||||
|
"Credits": "Credits",
|
||||||
|
"Continue_the_process_of_sending_messages": "Continue the process of sending messages",
|
||||||
|
"Yours_Balances": "Yours Balances",
|
||||||
|
"Friend_username": "Friend username",
|
||||||
|
"This_will_sync_dan_send_Customer_active_package_to_Mikrotik": "This will sync dan send Customer active package to Mikrotik"
|
||||||
}
|
}
|
@ -384,6 +384,7 @@
|
|||||||
"Vouchers": "Voucher",
|
"Vouchers": "Voucher",
|
||||||
"Refill_Customer": "Isi Ulang Voucher",
|
"Refill_Customer": "Isi Ulang Voucher",
|
||||||
"Recharge_Customer": "Isi Ulang Paket",
|
"Recharge_Customer": "Isi Ulang Paket",
|
||||||
|
"Plan": "Paket",
|
||||||
"Plans": "Paket",
|
"Plans": "Paket",
|
||||||
"PPPOE": "PPPOE",
|
"PPPOE": "PPPOE",
|
||||||
"Bandwidth": "Bandwidth",
|
"Bandwidth": "Bandwidth",
|
||||||
@ -911,5 +912,7 @@
|
|||||||
"Mandatory_Fields": "Bidang yang wajib diisi",
|
"Mandatory_Fields": "Bidang yang wajib diisi",
|
||||||
"Single_Admin_Session": "Sesi Admin Tunggal",
|
"Single_Admin_Session": "Sesi Admin Tunggal",
|
||||||
"Mikrotik_SMS_Command": "Perintah SMS Mikrotik",
|
"Mikrotik_SMS_Command": "Perintah SMS Mikrotik",
|
||||||
"Expired_Cronjob_Every_5_Minutes__Recommended_": "Cronjob Kedaluwarsa Setiap 5 Menit [Direkomendasikan]"
|
"Expired_Cronjob_Every_5_Minutes__Recommended_": "Cronjob Kedaluwarsa Setiap 5 Menit [Direkomendasikan]",
|
||||||
|
"Visit": "Kunjungi",
|
||||||
|
"sync": "Sinkron"
|
||||||
}
|
}
|
||||||
|
BIN
system/uploads/paid.png
Normal file
BIN
system/uploads/paid.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
@ -11,6 +11,21 @@ class customer_expired
|
|||||||
|
|
||||||
//user expire
|
//user expire
|
||||||
$query = ORM::for_table('tbl_user_recharges')
|
$query = ORM::for_table('tbl_user_recharges')
|
||||||
|
->table_alias('tur')
|
||||||
|
->selects([
|
||||||
|
'tur.id',
|
||||||
|
'tur.username',
|
||||||
|
'c.fullname',
|
||||||
|
'c.phonenumber',
|
||||||
|
'c.email',
|
||||||
|
'tur.expiration',
|
||||||
|
'tur.time',
|
||||||
|
'tur.recharged_on',
|
||||||
|
'tur.recharged_time',
|
||||||
|
'tur.namebp',
|
||||||
|
'tur.routers'
|
||||||
|
])
|
||||||
|
->join('tbl_customers', ['tur.customer_id', '=', 'c.id'], 'c')
|
||||||
->where_lte('expiration', $current_date)
|
->where_lte('expiration', $current_date)
|
||||||
->order_by_desc('expiration');
|
->order_by_desc('expiration');
|
||||||
$expire = Paginator::findMany($query);
|
$expire = Paginator::findMany($query);
|
||||||
@ -25,6 +40,7 @@ class customer_expired
|
|||||||
|
|
||||||
// Assign the pagination HTML to the template variable
|
// Assign the pagination HTML to the template variable
|
||||||
$ui->assign('expire', $expire);
|
$ui->assign('expire', $expire);
|
||||||
|
$ui->assign('cookie', $_COOKIE);
|
||||||
return $ui->fetch('widget/customer_expired.tpl');
|
return $ui->fetch('widget/customer_expired.tpl');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
<div class="box box-hovered mb20 box-primary">
|
<div class="box box-hovered mb20 box-primary">
|
||||||
<div class="box-header">
|
<div class="box-header">
|
||||||
<h3 class="box-title">{Lang::T('Contributors')}</h3>
|
<h3 class="box-title">{Lang::T('Contribution')} PHPNuxBill</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
<a href="https://github.com/hotspotbilling/phpnuxbill/graphs/contributors" target="_blank">
|
<a href="https://github.com/hotspotbilling/phpnuxbill/graphs/contributors" target="_blank">
|
||||||
@ -22,9 +22,9 @@
|
|||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="box box-hovered mb20 box-primary">
|
<div class="box box-hovered mb20 box-primary">
|
||||||
<div class="box-header">
|
<div class="box-header">
|
||||||
<h3 class="box-title">{Lang::T('Discussions')}</h3>
|
<h3 class="box-title">{Lang::T('Discussion – Get Help from the Community')}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">{Lang::T('Get help from community')}</div>
|
<div class="box-body">{Lang::T('Join the discussion to find solutions and support from a community ready to help.')}</div>
|
||||||
<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="https://github.com/hotspotbilling/phpnuxbill/discussions" target="_blank"
|
<a href="https://github.com/hotspotbilling/phpnuxbill/discussions" target="_blank"
|
||||||
@ -35,18 +35,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="box box-hovered mb20 box-primary">
|
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title">{Lang::T('')}Feedback</h3>
|
|
||||||
</div>
|
|
||||||
<div class="box-body">
|
|
||||||
{Lang::T('Feedback and Bug Report')}
|
|
||||||
</div>
|
|
||||||
<div class="box-footer">
|
|
||||||
<a href="https://github.com/hotspotbilling/phpnuxbill/issues" target="_blank"
|
|
||||||
class="btn btn-primary btn-sm btn-block"><i class="ion ion-chatboxes"></i> {Lang::T('Give Feedback')}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -54,10 +42,9 @@
|
|||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="box box-hovered mb20 box-primary">
|
<div class="box box-hovered mb20 box-primary">
|
||||||
<div class="box-header">
|
<div class="box-header">
|
||||||
<h3 class="box-title">Donasi</h3>
|
<h3 class="box-title">{Lang::T('Donations')} 🇮🇩</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">Untuk pengembangan lebih baik, donasi ke iBNuX, donasi akan membantu terus
|
<div class="box-body">{Lang::T('To support further development, please donate to iBNuX. Your donation will help ensure the continued development of this application.')}</div>
|
||||||
pengembangan aplikasi</div>
|
|
||||||
<div class="table-responsive">
|
<div class="table-responsive">
|
||||||
<table class="table table-bordered table-striped">
|
<table class="table table-bordered table-striped">
|
||||||
<tbody>
|
<tbody>
|
||||||
@ -89,10 +76,10 @@
|
|||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="box box-hovered mb20 box-primary">
|
<div class="box box-hovered mb20 box-primary">
|
||||||
<div class="box-header">
|
<div class="box-header">
|
||||||
<h3 class="box-title">Donations</h3>
|
<h3 class="box-title">{Lang::T('Donations other than')} 🇮🇩</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
Donations will help to continue phpnuxbill development
|
{Lang::T('Your donation will help support and continue the development of PHPNuxBill.')}
|
||||||
</div>
|
</div>
|
||||||
<div class="table-responsive">
|
<div class="table-responsive">
|
||||||
<table class="table table-bordered table-striped">
|
<table class="table table-bordered table-striped">
|
||||||
@ -129,19 +116,21 @@
|
|||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="box box-hovered mb20 box-primary">
|
<div class="box box-hovered mb20 box-primary">
|
||||||
<div class="box-header">
|
<div class="box-header">
|
||||||
<h3 class="box-title">{Lang::T('Chat with me')}</h3>
|
<h3 class="box-title">{Lang::T('Chat with Me — Paid Support $50')}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
{Lang::T('Confirm your donation to continue this paid support. Or, ask about alternative donations available to suit your needs.')}
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">{Lang::T('$50 Paid Support')}<br>{Lang::T('donation confirmation?')}<br>{Lang::T('Or ask any Donation Alternative')}</div>
|
|
||||||
<div class="box-footer">
|
<div class="box-footer">
|
||||||
<a href="https://t.me/ibnux" target="_blank" class="btn btn-primary btn-sm btn-block">Telegram</a>
|
<a href="https://t.me/ibnux" target="_blank" class="btn btn-primary btn-sm btn-block">{Lang::T('Telegram')}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="box box-primary box-hovered mb20 activities">
|
<div class="box box-primary box-hovered mb20 activities">
|
||||||
<div class="box-header">
|
<div class="box-header">
|
||||||
<h3 class="box-title">{Lang::T('Free WhatsApp Gateway and Telegram Bot creater')}</h3>
|
<h3 class="box-title">{Lang::T('WhatsApp Gateway and Free Telegram Bot')}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
{Lang::T('There is a Telegram bot wizard in here')}
|
{Lang::T('Connect your PHPNuxBill to WhatsApp efficiently using WhatsApp Gateway. Also, create Telegram bots easily and practically.')}
|
||||||
</div>
|
</div>
|
||||||
<div class="box-footer">
|
<div class="box-footer">
|
||||||
<a href="https://wa.nux.my.id/login" target="_blank"
|
<a href="https://wa.nux.my.id/login" target="_blank"
|
||||||
@ -155,35 +144,128 @@
|
|||||||
<h3 class="box-title">PHPNUXBILL</h3>
|
<h3 class="box-title">PHPNUXBILL</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
<b>PHPNuxBill</b> {Lang::T('is a billing Hotspot and PPPOE for Mikrotik using PHP and Mikrotik API to comunicate
|
<b>PHPNuxBill</b>
|
||||||
with router. If you get more profit with this application, please donate us.')}<br>{Lang::T('Watch project')} <a
|
{Lang::T('is a Hotspot and PPPoE billing platform for Mikrotik developed using PHP. The application uses Mikrotik API to communicate with the router, ensuring efficient and easy integration. If you feel you get more benefits from this application, we would greatly appreciate your contribution through donation.')}<br>{Lang::T('Watch project –')} <a
|
||||||
href="https://github.com/hotspotbilling/phpnuxbill" target="_blank">{Lang::T('in here')}</a>
|
href="https://github.com/hotspotbilling/phpnuxbill" target="_blank">{Lang::T('IN HERE')}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-footer" id="currentVersion">ver</div>
|
<div class="box-footer" id="currentVersion">ver</div>
|
||||||
<div class="box-footer" id="latestVersion">ver</div>
|
<div class="box-footer" id="latestVersion">ver</div>
|
||||||
<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" class="btn btn-success btn-sm btn-block">{Lang::T('Install Latest Version')}</a>
|
<a href="./update.php"
|
||||||
|
class="btn btn-success btn-sm btn-block">{Lang::T('Install Latest Version')}</a>
|
||||||
<a href="https://github.com/hotspotbilling/phpnuxbill/archive/refs/heads/master.zip" target="_blank"
|
<a href="https://github.com/hotspotbilling/phpnuxbill/archive/refs/heads/master.zip" target="_blank"
|
||||||
class="btn btn-warning btn-sm btn-block text-black">{Lang::T('Download Latest Version')}</a>
|
class="btn btn-warning btn-sm btn-block text-black">{Lang::T('Download Latest Version')}</a>
|
||||||
</div>
|
</div>
|
||||||
<center><a href="{Text::url('community/rollback')}" class="btn btn-link btn-sm btn-block">{Lang::T('Select Old Version')}</a>
|
<center><a href="{Text::url('community/rollback')}"
|
||||||
|
class="btn btn-link btn-sm btn-block">{Lang::T('Select Old Version')}</a>
|
||||||
</center>
|
</center>
|
||||||
</div>
|
</div>
|
||||||
<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="./CHANGELOG.md" target="_blank" class="btn btn-default btn-sm btn-block">{Lang::T('Current Changelog')}</a>
|
<a href="./CHANGELOG.md" target="_blank"
|
||||||
|
class="btn btn-default btn-sm btn-block">{Lang::T('Current Changelog')}</a>
|
||||||
<a href="https://github.com/hotspotbilling/phpnuxbill/blob/master/CHANGELOG.md" target="_blank"
|
<a href="https://github.com/hotspotbilling/phpnuxbill/blob/master/CHANGELOG.md" target="_blank"
|
||||||
class="btn btn-default btn-sm btn-block">{Lang::T('Repo Changelog')}</a>
|
class="btn btn-default btn-sm btn-block">{Lang::T('Repo Changelog')}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-footer">
|
<div class="box-footer">
|
||||||
{Lang::T('If you Download manual the update file, sometime update change database, after uploading, click this
|
{Lang::T('If you download the update file manually, sometimes the update may change the database structure. After the file is successfully uploaded, click this button to update the database structure.')}
|
||||||
button to update database structure.')}
|
|
||||||
<a href="./update.php?step=4" class="btn btn-default btn-sm btn-block">{Lang::T('Update Database')}</a>
|
<a href="./update.php?step=4" class="btn btn-default btn-sm btn-block">{Lang::T('Update Database')}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="box box-hovered mb20 box-primary">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title">{Lang::T('Credits')}</h3>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-bordered table-striped table-hover">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{Lang::T('Souce')}</th>
|
||||||
|
<th>{Lang::T('Details')}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Bootstrap V3</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://getbootstrap.com/docs/3.4/" target="_blank">
|
||||||
|
<i class="glyphicon glyphicon-globe"></i> {Lang::T('Visit')}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Admin LTE V3</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://adminlte.io/themes/v3/" target="_blank">
|
||||||
|
<i class="glyphicon glyphicon-globe"></i> {Lang::T('Visit')}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Smarty Template V4</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://www.smarty.net/" target="_blank">
|
||||||
|
<i class="glyphicon glyphicon-globe"></i> {Lang::T('Visit')}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>PHP IdiORM</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://idiorm.readthedocs.io/" target="_blank">
|
||||||
|
<i class="glyphicon glyphicon-globe"></i> {Lang::T('Visit')}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>PHP mPDF</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://mpdf.github.io/" target="_blank">
|
||||||
|
<i class="glyphicon glyphicon-globe"></i> {Lang::T('Visit')}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>PHP QRCode</td>
|
||||||
|
<td>
|
||||||
|
<a href="http://phpqrcode.sourceforge.net/" target="_blank">
|
||||||
|
<i class="glyphicon glyphicon-globe"></i> {Lang::T('Visit')}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>PHP Net_RouterOS</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://github.com/pear2/Net_RouterOS" target="_blank">
|
||||||
|
<i class="glyphicon glyphicon-globe"></i> {Lang::T('Visit')}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Summernote</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://summernote.org/" target="_blank">
|
||||||
|
<i class="glyphicon glyphicon-globe"></i> {Lang::T('Visit')}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>PHP Mailer</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://github.com/PHPMailer/PHPMailer/" target="_blank">
|
||||||
|
<i class="glyphicon glyphicon-globe"></i> {Lang::T('Visit')}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
window.addEventListener('DOMContentLoaded', function() {
|
window.addEventListener('DOMContentLoaded', function() {
|
||||||
|
@ -90,7 +90,7 @@
|
|||||||
<label class="col-md-3 control-label">{Lang::T('Coordinates')}</label>
|
<label class="col-md-3 control-label">{Lang::T('Coordinates')}</label>
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
<input name="coordinates" id="coordinates" class="form-control" value=""
|
<input name="coordinates" id="coordinates" class="form-control" value=""
|
||||||
placeholder="6.465422, 3.406448">
|
placeholder="-6.465422, 3.406448">
|
||||||
<div id="map" style="width: '100%'; height: 200px; min-height: 150px;"></div>
|
<div id="map" style="width: '100%'; height: 200px; min-height: 150px;"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -98,9 +98,11 @@
|
|||||||
<div class="panel-heading">PPPoE</div>
|
<div class="panel-heading">PPPoE</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-md-3 control-label">{Lang::T('Usernames')} <span class="label label-danger" id="warning_username"></span></label>
|
<label class="col-md-3 control-label">{Lang::T('Usernames')} <span class="label label-danger"
|
||||||
|
id="warning_username"></span></label>
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
<input type="username" class="form-control" id="pppoe_username" name="pppoe_username" onkeyup="checkUsername(this, '0')">
|
<input type="username" class="form-control" id="pppoe_username" name="pppoe_username"
|
||||||
|
onkeyup="checkUsername(this, '0')">
|
||||||
<span class="help-block">{Lang::T('Not Working for freeradius')}</span>
|
<span class="help-block">{Lang::T('Not Working for freeradius')}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -112,9 +114,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-md-3 control-label">Remote IP <span class="label label-danger" id="warning_ip"></span></label>
|
<label class="col-md-3 control-label">Remote IP <span class="label label-danger"
|
||||||
|
id="warning_ip"></span></label>
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
<input type="text" class="form-control" id="pppoe_ip" name="pppoe_ip" onkeyup="checkIP(this, '0')">
|
<input type="text" class="form-control" id="pppoe_ip" name="pppoe_ip"
|
||||||
|
onkeyup="checkIP(this, '0')">
|
||||||
<span class="help-block">{Lang::T('Also Working for freeradius')}</span>
|
<span class="help-block">{Lang::T('Also Working for freeradius')}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -204,7 +208,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<center>
|
<center>
|
||||||
<button class="btn btn-primary" onclick="return ask(this, '{Lang::T("Continue the process of adding Customer Data?")}')" type="submit">
|
<button class="btn btn-primary"
|
||||||
|
onclick="return ask(this, '{Lang::T("Continue the process of adding Customer Data?")}')" type="submit">
|
||||||
{Lang::T('Save Changes')}
|
{Lang::T('Save Changes')}
|
||||||
</button>
|
</button>
|
||||||
<br><a href="{Text::url('customers/list')}" class="btn btn-link">{Lang::T('Cancel')}</a>
|
<br><a href="{Text::url('customers/list')}" class="btn btn-link">{Lang::T('Cancel')}</a>
|
||||||
|
@ -85,22 +85,32 @@
|
|||||||
listAtts.forEach(function(el) {
|
listAtts.forEach(function(el) {
|
||||||
if (el.addEventListener) { // all browsers except IE before version 9
|
if (el.addEventListener) { // all browsers except IE before version 9
|
||||||
el.addEventListener("click", function() {
|
el.addEventListener("click", function() {
|
||||||
|
var txt = $(this).html();
|
||||||
$(this).html(
|
$(this).html(
|
||||||
`<span class="loading"></span>`
|
`<span class="loading"></span>`
|
||||||
);
|
);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
$(this).prop("disabled", true);
|
$(this).prop("disabled", true);
|
||||||
}, 100);
|
}, 100);
|
||||||
|
setTimeout(() => {
|
||||||
|
$(this).html(txt);
|
||||||
|
$(this).prop("disabled", false);
|
||||||
|
}, 5000);
|
||||||
}, false);
|
}, false);
|
||||||
} else {
|
} else {
|
||||||
if (el.attachEvent) { // IE before version 9
|
if (el.attachEvent) { // IE before version 9
|
||||||
el.attachEvent("click", function() {
|
el.attachEvent("click", function() {
|
||||||
|
var txt = $(this).html();
|
||||||
$(this).html(
|
$(this).html(
|
||||||
`<span class="loading"></span>`
|
`<span class="loading"></span>`
|
||||||
);
|
);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
$(this).prop("disabled", true);
|
$(this).prop("disabled", true);
|
||||||
}, 100);
|
}, 100);
|
||||||
|
setTimeout(() => {
|
||||||
|
$(this).html(txt);
|
||||||
|
$(this).prop("disabled", false);
|
||||||
|
}, 5000);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,22 @@
|
|||||||
{include file="sections/header.tpl"}
|
{include file="sections/header.tpl"}
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.4/jspdf.min.js"></script>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6 col-sm-12 col-md-offset-3">
|
<div class="col-md-6 col-sm-12 col-md-offset-3">
|
||||||
<div class="panel panel-hovered panel-primary panel-stacked mb30">
|
<div class="panel panel-hovered panel-primary panel-stacked mb30">
|
||||||
<div class="panel-heading">{$in['invoice']}</div>
|
<div class="panel-heading">{$in['invoice']}</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
|
{if !empty($logo)}
|
||||||
|
<center><img src="{$app_url}/{$logo}?"></center>
|
||||||
|
{/if}
|
||||||
<form class="form-horizontal" method="post" action="{Text::url('')}plan/print" target="_blank">
|
<form class="form-horizontal" method="post" action="{Text::url('')}plan/print" target="_blank">
|
||||||
<pre id="content" style="text-align: center;"></pre>
|
<pre id="content"
|
||||||
|
style="border: 0px; ;text-align: center; background-color: transparent; background-image: url('{$app_url}/system/uploads/paid.png');background-repeat:no-repeat;background-position: center"></pre>
|
||||||
<textarea class="hidden" id="formcontent" name="content">{$invoice}</textarea>
|
<textarea class="hidden" id="formcontent" name="content">{$invoice}</textarea>
|
||||||
<input type="hidden" name="id" value="{$in['id']}">
|
<input type="hidden" name="id" value="{$in['id']}">
|
||||||
<a href="{Text::url('')}plan/list" class="btn btn-default btn-sm"><i
|
<a href="{Text::url('plan/list')}" class="btn btn-default btn-sm"><i
|
||||||
class="ion-reply-all"></i>{Lang::T('Finish')}</a>
|
class="ion-reply-all"></i>{Lang::T('Finish')}</a>
|
||||||
|
<a href="javascript:download()" class="btn btn-success btn-sm text-black">
|
||||||
|
<i class="glyphicon glyphicon-share"></i> Download</a>
|
||||||
<a href="https://api.whatsapp.com/send/?text={$whatsapp}" target="_blank"
|
<a href="https://api.whatsapp.com/send/?text={$whatsapp}" target="_blank"
|
||||||
class="btn btn-primary btn-sm">
|
class="btn btn-primary btn-sm">
|
||||||
<i class="glyphicon glyphicon-share"></i> WhatsApp</a>
|
<i class="glyphicon glyphicon-share"></i> WhatsApp</a>
|
||||||
@ -38,7 +44,42 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script type="text/javascript">
|
<script>
|
||||||
|
const canvas = document.createElement("canvas");
|
||||||
|
const ctx = canvas.getContext('2d');
|
||||||
|
ctx.font = '16px Courier';
|
||||||
|
var text = document.getElementById("formcontent").innerHTML;
|
||||||
|
var lines = text.split(/\r\n|\r|\n/).length;
|
||||||
|
var meas = ctx.measureText("A");
|
||||||
|
let width = Math.round({$_c['printer_cols']} * 9.6);
|
||||||
|
var height = Math.round((14 * lines));
|
||||||
|
console.log(width, height, lines);
|
||||||
|
var paid = new Image();
|
||||||
|
paid.src = '{$app_url}/system/uploads/paid.png';
|
||||||
|
{if !empty($logo)}
|
||||||
|
var img = new Image();
|
||||||
|
img.src = '{$app_url}/{$logo}';
|
||||||
|
var new_width = (width / 4) * 2;
|
||||||
|
var new_height = Math.ceil({$hlogo} * (new_width/{$wlogo}));
|
||||||
|
height = height + new_height;
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
function download() {
|
||||||
|
var doc = new jsPDF('p', 'px', [width, height]);
|
||||||
|
{if !empty($logo)}
|
||||||
|
try {
|
||||||
|
doc.addImage(img, 'PNG', (width - new_width) / 2, 10, new_width, new_height);
|
||||||
|
} catch (err) {}
|
||||||
|
{/if}
|
||||||
|
try {
|
||||||
|
doc.addImage(paid, 'PNG', (width - 200) / 2, (height - 145) / 2, 200, 145);
|
||||||
|
} catch (err) {}
|
||||||
|
doc.setFont("Courier");
|
||||||
|
doc.setFontSize(16);
|
||||||
|
doc.text($('#formcontent').html(), width / 2, new_height + 30, 'center');
|
||||||
|
doc.save('{$in['invoice']}.pdf');
|
||||||
|
}
|
||||||
|
|
||||||
var s5_taf_parent = window.location;
|
var s5_taf_parent = window.location;
|
||||||
document.getElementById('content').innerHTML = document.getElementById('formcontent').innerHTML;
|
document.getElementById('content').innerHTML = document.getElementById('formcontent').innerHTML;
|
||||||
</script>
|
</script>
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
{$plan['validity_unit']}</span>
|
{$plan['validity_unit']}</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="list-group-item">
|
<li class="list-group-item">
|
||||||
<b>{Lang::T('Using')}</b> <span class="pull-right">
|
<b>{Lang::T('Payment via')}</b> <span class="pull-right">
|
||||||
<select name="using"
|
<select name="using"
|
||||||
style="background-color: white;outline: 1px;border: 1px solid #b7b7b7;">
|
style="background-color: white;outline: 1px;border: 1px solid #b7b7b7;">
|
||||||
{foreach $usings as $us}
|
{foreach $usings as $us}
|
||||||
|
@ -1,21 +1,62 @@
|
|||||||
{include file="customer/header.tpl"}
|
{include file="customer/header.tpl"}
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.4/jspdf.min.js"></script>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6 col-md-offset-3">
|
<div class="col-md-6 col-md-offset-3">
|
||||||
<div class="panel panel-hovered panel-primary panel-stacked mb30">
|
<div class="panel panel-hovered panel-primary panel-stacked mb30">
|
||||||
<div class="panel-heading">{$in['invoice']}</div>
|
<div class="panel-heading">{$in['invoice']}</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
|
{if !empty($logo)}
|
||||||
|
<center><img src="{$app_url}/{$logo}"></center>
|
||||||
|
{/if}
|
||||||
<form class="form-horizontal" method="post" action="{Text::url('plan/print')}" target="_blank">
|
<form class="form-horizontal" method="post" action="{Text::url('plan/print')}" target="_blank">
|
||||||
<pre id="content" style="text-align: center;">{$invoice}</pre>
|
<pre id="content"
|
||||||
|
style="border: 0px; ;text-align: center; background-color: transparent; background-image: url('{$app_url}/system/uploads/paid.png');background-repeat:no-repeat;background-position: center">{$invoice}</pre>
|
||||||
<input type="hidden" name="id" value="{$in['id']}">
|
<input type="hidden" name="id" value="{$in['id']}">
|
||||||
<a href="{Text::url('voucher/list-activated')}" class="btn btn-default btn-sm"><i
|
<a href="{Text::url('voucher/list-activated')}" class="btn btn-default btn-sm"><i
|
||||||
class="ion-reply-all"></i>{Lang::T('Finish')}</a>
|
class="ion-reply-all"></i>{Lang::T('Finish')}</a>
|
||||||
<a href="https://api.whatsapp.com/send/?text={$whatsapp}" target="_blank"
|
<a href="javascript:download()" class="btn btn-success btn-sm text-black">
|
||||||
class="btn btn-primary btn-sm">
|
<i class="glyphicon glyphicon-share"></i> Download</a>
|
||||||
|
<a href="https://api.whatsapp.com/send/?text={$whatsapp}" class="btn btn-primary btn-sm">
|
||||||
<i class="glyphicon glyphicon-share"></i> WhatsApp</a>
|
<i class="glyphicon glyphicon-share"></i> WhatsApp</a>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<script>
|
||||||
|
const canvas = document.createElement("canvas");
|
||||||
|
const ctx = canvas.getContext('2d');
|
||||||
|
ctx.font = '16px Courier';
|
||||||
|
var text = document.getElementById("content").innerHTML;
|
||||||
|
var lines = text.split(/\r\n|\r|\n/).length;
|
||||||
|
var meas = ctx.measureText("A");
|
||||||
|
let width = Math.round({$_c['printer_cols']} * 9.6);
|
||||||
|
var height = Math.round((14 * lines));
|
||||||
|
console.log(width, height, lines);
|
||||||
|
var paid = new Image();
|
||||||
|
paid.src = '{$app_url}/system/uploads/paid.png';
|
||||||
|
{if !empty($logo)}
|
||||||
|
var img = new Image();
|
||||||
|
img.src = '{$app_url}/{$logo}';
|
||||||
|
var new_width = (width / 4) * 2;
|
||||||
|
var new_height = Math.ceil({$hlogo} * (new_width/{$wlogo}));
|
||||||
|
height = height + new_height;
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
function download() {
|
||||||
|
var doc = new jsPDF('p', 'px', [width, height]);
|
||||||
|
{if !empty($logo)}
|
||||||
|
try {
|
||||||
|
doc.addImage(img, 'PNG', (width - new_width) / 2, 10, new_width, new_height);
|
||||||
|
} catch (err) {}
|
||||||
|
{/if}
|
||||||
|
try {
|
||||||
|
doc.addImage(paid, 'PNG', (width - 200) / 2, (height - 145) / 2, 200, 145);
|
||||||
|
} catch (err) {}
|
||||||
|
doc.setFont("Courier");
|
||||||
|
doc.setFontSize(16);
|
||||||
|
doc.text($('#content').html(), width / 2, new_height + 30, 'center');
|
||||||
|
doc.save('{$in['invoice']}.pdf');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
{include file="customer/footer.tpl"}
|
{include file="customer/footer.tpl"}
|
@ -3,13 +3,12 @@
|
|||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
<title>{$_title} - {$_c['CompanyName']}</title>
|
<title>{$_title} - {$_c['CompanyName']}</title>
|
||||||
<link rel="shortcut icon" href="./{$favicon}" type="image/x-icon" />
|
<link rel="shortcut icon" href="./{$favicon}" type="image/x-icon" />
|
||||||
<link rel='stylesheet' href='https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css' />
|
<link rel='stylesheet' href='https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css' />
|
||||||
<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css' />
|
<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css' />
|
||||||
<!-- SweetAlert CSS -->
|
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css" />
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css" />
|
||||||
<!-- SweetAlert JS -->
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.all.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.all.min.js"></script>
|
||||||
<style>
|
<style>
|
||||||
.login-fg .form-container {
|
.login-fg .form-container {
|
||||||
@ -364,28 +363,6 @@
|
|||||||
color: #db4437;
|
color: #db4437;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 1200px) {
|
|
||||||
.login-fg .info h1 {
|
|
||||||
font-size: 45px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 992px) {
|
|
||||||
.login-fg .bg {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
|
||||||
.login-fg .login-section .social li a {
|
|
||||||
width: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-fg .logo a {
|
|
||||||
font-size: 26px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
footer {
|
footer {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
@ -429,6 +406,47 @@
|
|||||||
background-color: #00f2fe;
|
background-color: #00f2fe;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.submit-btn {
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-btn:active {
|
||||||
|
transform: scale(0.98);
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
-moz-appearance: none;
|
||||||
|
appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-group {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo img {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"],
|
||||||
|
input[type="password"] {
|
||||||
|
inputmode: "verbatim";
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 1200px) {
|
||||||
|
.login-fg .info h1 {
|
||||||
|
font-size: 45px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 992px) {
|
||||||
|
.login-fg .bg {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
|
|
||||||
input,
|
input,
|
||||||
@ -436,14 +454,76 @@
|
|||||||
padding: 12px;
|
padding: 12px;
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.login-fg .login-section {
|
||||||
|
padding: 15px;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .logo img {
|
||||||
|
max-width: 200px;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .info h1 {
|
||||||
|
font-size: 32px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .info p {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
position: fixed;
|
||||||
|
margin-top: 20px;
|
||||||
|
padding: 8px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .login-section h4 {
|
||||||
|
font-size: 18px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .login-section .social li a {
|
||||||
|
width: 100%;
|
||||||
|
margin: 5px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox a {
|
||||||
|
display: block;
|
||||||
|
text-align: right;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .login-section .social li a {
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .logo a {
|
||||||
|
font-size: 26px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 480px) {
|
@media (max-width: 480px) {
|
||||||
|
.login-fg .login {
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
input,
|
input,
|
||||||
.submit-btn {
|
.submit-btn {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
font-size: 14px;
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .login-section h4 {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
font-size: 11px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -460,18 +540,18 @@
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
{if isset($notify)}
|
{if isset($notify)}
|
||||||
<script>
|
<script>
|
||||||
// Display SweetAlert toast notification
|
// Display SweetAlert toast notification
|
||||||
document.body.style.overflow = 'hidden';
|
document.body.style.overflow = 'hidden';
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
icon: '{if $notify_t == "s"}success{else}warning{/if}',
|
icon: '{if $notify_t == "s"}success{else}warning{/if}',
|
||||||
title: '{if $notify_t == "s"}Success{else}Error{/if}',
|
title: '{if $notify_t == "s"}Success{else}Error{/if}',
|
||||||
text: '{$notify}',
|
text: '{$notify}',
|
||||||
backdrop: 'rgba(0, 0, 0, 0.5)',
|
backdrop: 'rgba(0, 0, 0, 0.5)',
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
document.body.style.overflow = '';
|
document.body.style.overflow = '';
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
{/if}
|
{/if}
|
||||||
<!-- partial:index.partial.html -->
|
<!-- partial:index.partial.html -->
|
||||||
<div class="login-fg">
|
<div class="login-fg">
|
||||||
@ -530,8 +610,8 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{if $_c['disable_registration'] != 'noreg'}
|
{if $_c['disable_registration'] != 'noreg'}
|
||||||
<p>{Lang::T('Don\'t have an account?')} <a href="{Text::url('register')}"
|
<p>{Lang::T('Don\'t have an account?')} <a href="{Text::url('register')}"
|
||||||
class="linkButton">{Lang::T('Register')}</a></p>
|
class="linkButton">{Lang::T('Register')}</a></p>
|
||||||
{/if}
|
{/if}
|
||||||
<footer>
|
<footer>
|
||||||
© {$smarty.now|date_format:"%Y"} {$_c['CompanyName']}. All rights reserved. <br> <a
|
© {$smarty.now|date_format:"%Y"} {$_c['CompanyName']}. All rights reserved. <br> <a
|
||||||
@ -551,25 +631,25 @@
|
|||||||
const loginBtn = document.getElementById('login-btn');
|
const loginBtn = document.getElementById('login-btn');
|
||||||
const loginText = document.getElementById('login-text');
|
const loginText = document.getElementById('login-text');
|
||||||
|
|
||||||
loginForm.addEventListener('submit', function(event) {
|
loginForm.addEventListener('submit', function (event) {
|
||||||
loginBtn.classList.add('loading');
|
loginBtn.classList.add('loading');
|
||||||
loginText.textContent = 'Please Wait...';
|
loginText.textContent = 'Please Wait...';
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
{if $_c['tawkto'] != ''}
|
{if $_c['tawkto'] != ''}
|
||||||
<!--Start of Tawk.to Script-->
|
<!--Start of Tawk.to Script-->
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var isLoggedIn = false;
|
var isLoggedIn = false;
|
||||||
var Tawk_API = {
|
var Tawk_API = {
|
||||||
onLoad: function() {
|
onLoad: function () {
|
||||||
if (!isLoggedIn) {
|
if (!isLoggedIn) {
|
||||||
isLoggedIn = true;
|
isLoggedIn = true;
|
||||||
window.Tawk_API.login({
|
window.Tawk_API.login({
|
||||||
name: '{$_user['fullname']}',
|
name: '{$_user['fullname']}',
|
||||||
email: '{$_user['email']}',
|
email: '{$_user['email']}',
|
||||||
userId: '{$_user['id']}'
|
userId: '{$_user['id']}'
|
||||||
}, function(error) {
|
}, function (error) {
|
||||||
//do something if there's an error
|
//do something if there's an error
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Tawk_API.setAttributes({
|
Tawk_API.setAttributes({
|
||||||
@ -579,7 +659,7 @@
|
|||||||
'balance': '{$_user['balance']}',
|
'balance': '{$_user['balance']}',
|
||||||
'account_type': '{$_user['account_type']}',
|
'account_type': '{$_user['account_type']}',
|
||||||
'phone': '{$_user['phonenumber']}'
|
'phone': '{$_user['phonenumber']}'
|
||||||
}, function(error) {});
|
}, function (error) { });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var Tawk_LoadStart = new Date();
|
var Tawk_LoadStart = new Date();
|
||||||
@ -588,18 +668,44 @@
|
|||||||
email: '{$_user['email']}',
|
email: '{$_user['email']}',
|
||||||
userId: '{$_user['id']}'
|
userId: '{$_user['id']}'
|
||||||
};
|
};
|
||||||
(function() {
|
(function () {
|
||||||
var s1 = document.createElement("script"),
|
var s1 = document.createElement("script"),
|
||||||
s0 = document.getElementsByTagName("script")[0];
|
s0 = document.getElementsByTagName("script")[0];
|
||||||
s1.async = true;
|
s1.async = true;
|
||||||
s1.src = 'https://embed.tawk.to/{$_c['tawkto']}';
|
s1.src = 'https://embed.tawk.to/{$_c['tawkto']}';
|
||||||
s1.charset = 'UTF-8';
|
s1.charset = 'UTF-8';
|
||||||
s1.setAttribute('crossorigin', '*');
|
s1.setAttribute('crossorigin', '*');
|
||||||
s0.parentNode.insertBefore(s1, s0);
|
s0.parentNode.insertBefore(s1, s0);
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
<!--End of Tawk.to Script-->
|
<!--End of Tawk.to Script-->
|
||||||
{/if}
|
{/if}
|
||||||
|
<script>
|
||||||
|
document.body.classList.add('touch-device');
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
let metaViewport = document.querySelector('meta[name="viewport"]');
|
||||||
|
const originalContent = metaViewport.content;
|
||||||
|
|
||||||
|
document.querySelectorAll('input').forEach(input => {
|
||||||
|
input.addEventListener('focus', () => {
|
||||||
|
metaViewport.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0';
|
||||||
|
});
|
||||||
|
|
||||||
|
input.addEventListener('blur', () => {
|
||||||
|
metaViewport.content = originalContent;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Touch detection
|
||||||
|
if ('ontouchstart' in window) {
|
||||||
|
document.body.classList.add('touch-device');
|
||||||
|
} else {
|
||||||
|
document.body.classList.add('no-touch');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
448
ui/ui/customer/reg-login-custom-moon.tpl
Normal file
448
ui/ui/customer/reg-login-custom-moon.tpl
Normal file
@ -0,0 +1,448 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<title>{$_title} - {$_c['CompanyName']}</title>
|
||||||
|
<link rel="shortcut icon" href="./{$favicon}" type="image/x-icon" />
|
||||||
|
<link rel='stylesheet' href='https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css' />
|
||||||
|
<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css' />
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css" />
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.all.min.js"></script>
|
||||||
|
<style>
|
||||||
|
.login-fg .form-container {
|
||||||
|
color: #ccc;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .login {
|
||||||
|
min-height: 100vh;
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
padding: 30px 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .login-section {
|
||||||
|
max-width: 370px;
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .form-fg {
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .form-container .form-group {
|
||||||
|
margin-bottom: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .form-container .input-text {
|
||||||
|
font-size: 14px;
|
||||||
|
outline: none;
|
||||||
|
color: #616161;
|
||||||
|
border-radius: 3px;
|
||||||
|
font-weight: 500;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
background: #fff;
|
||||||
|
box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .form-container img {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .form-container .form-fg input {
|
||||||
|
float: left;
|
||||||
|
width: 100%;
|
||||||
|
padding: 11px 45px 11px 20px;
|
||||||
|
border-radius: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .form-container .form-fg i {
|
||||||
|
position: absolute;
|
||||||
|
top: 13px;
|
||||||
|
right: 20px;
|
||||||
|
font-size: 19px;
|
||||||
|
color: #616161;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .form-container label {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 14px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .form-container .btn-md {
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 10px 30px 9px;
|
||||||
|
height: 45px;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
font-family: "Open Sans", sans-serif;
|
||||||
|
border-radius: 50px;
|
||||||
|
color: #d6d6d6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .form-container .btn-fg {
|
||||||
|
background: #0f96f9;
|
||||||
|
border: none;
|
||||||
|
color: #fff;
|
||||||
|
box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .form-container .btn-fg:hover {
|
||||||
|
background: #108ae4;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 14px;
|
||||||
|
color: inherit;
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
width: 100%;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 1px 0;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-radius: 5px;
|
||||||
|
font-size: 16px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:focus {
|
||||||
|
border-color: #4facfe;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-btn {
|
||||||
|
background-color: #4facfe;
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
padding: 15px;
|
||||||
|
border-radius: 5px;
|
||||||
|
font-size: 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-btn:hover {
|
||||||
|
background-color: #00f2fe;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-btn {
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-btn:active {
|
||||||
|
transform: scale(0.98);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-section {
|
||||||
|
max-height: 100vh;
|
||||||
|
overflow-y: auto;
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
-ms-overflow-style: -ms-autohiding-scrollbar;
|
||||||
|
scrollbar-width: thin;
|
||||||
|
scrollbar-color: #888 #f1f1f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-section::-webkit-scrollbar {
|
||||||
|
width: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-section::-webkit-scrollbar-track {
|
||||||
|
background: #f1f1f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-section::-webkit-scrollbar-thumb {
|
||||||
|
background: #888;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-section::-webkit-scrollbar-thumb:hover {
|
||||||
|
background: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .info h1 {
|
||||||
|
font-size: 60px;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
text-shadow: 2px 0px #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .info p {
|
||||||
|
margin-bottom: 0;
|
||||||
|
color: #fff;
|
||||||
|
line-height: 28px;
|
||||||
|
text-shadow: 1px 1px #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .info {
|
||||||
|
text-align: center;
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 33%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
|
||||||
|
input,
|
||||||
|
.submit-btn {
|
||||||
|
padding: 12px;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 1200px) {
|
||||||
|
.login-fg .info h1 {
|
||||||
|
font-size: 45px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 992px) {
|
||||||
|
.login-fg .bg {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
|
||||||
|
input,
|
||||||
|
.submit-btn {
|
||||||
|
padding: 12px;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .login-section {
|
||||||
|
padding: 15px;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .logo img {
|
||||||
|
max-width: 200px;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .info h1 {
|
||||||
|
font-size: 32px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .info p {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
position: fixed;
|
||||||
|
margin-top: 20px;
|
||||||
|
padding: 8px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .login-section h4 {
|
||||||
|
font-size: 18px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .login-section .social li a {
|
||||||
|
width: 100%;
|
||||||
|
margin: 5px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox a {
|
||||||
|
display: block;
|
||||||
|
text-align: right;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .login-section .social li a {
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .logo a {
|
||||||
|
font-size: 26px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
.login-fg .login {
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input,
|
||||||
|
.submit-btn {
|
||||||
|
padding: 10px;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-fg .login-section h4 {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 320px) {
|
||||||
|
|
||||||
|
input,
|
||||||
|
.submit-btn {
|
||||||
|
padding: 8px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<!-- SweetAlert Notification -->
|
||||||
|
{if isset($notify)}
|
||||||
|
<script>
|
||||||
|
document.body.style.overflow = 'hidden';
|
||||||
|
Swal.fire({
|
||||||
|
icon: '{if $notify_t == "s"}success{else}warning{/if}',
|
||||||
|
title: '{if $notify_t == "s"}Success{else}Error{/if}',
|
||||||
|
html: '{$notify}',
|
||||||
|
backdrop: 'rgba(0, 0, 0, 0.5)',
|
||||||
|
}).then(() => {
|
||||||
|
document.body.style.overflow = '';
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
<div class="login-fg">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xl-8 col-lg-7 col-md-12 bg"
|
||||||
|
style="background-image:url('./{$wallpaper}'); background-attachment: fixed;">
|
||||||
|
<div class="info">
|
||||||
|
<h1>{$_c['login_page_head']}</h1>
|
||||||
|
<p>{$_c['login_page_description']}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xl-4 col-lg-5 col-md-12 login">
|
||||||
|
<div class="login-section">
|
||||||
|
<div class="logo clearfix">
|
||||||
|
<a href="./{$login_logo}" target="_blank"><img src="./{$login_logo}" height="60"
|
||||||
|
alt="Logo"></a>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<h4>{Lang::T('Create your account')}</h4>
|
||||||
|
<div class="form-container">
|
||||||
|
<form id="register-form" method="POST" action="{Text::url('register/post')}">
|
||||||
|
<input type="hidden" name="csrf_token" value="{$csrf_token}">
|
||||||
|
|
||||||
|
<!-- Basic Information (Initially Visible) -->
|
||||||
|
<div id="basicFields">
|
||||||
|
<div class="form-group">
|
||||||
|
<input type="text" name="username"
|
||||||
|
placeholder="{if $_c['country_code_phone']!= '' || $_c['registration_username'] == 'phone'}{$_c['country_code_phone']} {Lang::T('Phone Number')}{elseif $_c['registration_username'] == 'email'}{Lang::T('Email')}{else}{Lang::T('Usernames')}{/if}">
|
||||||
|
</div>
|
||||||
|
{if $_c['photo_register'] == 'yes'}
|
||||||
|
<div class="form-group">
|
||||||
|
<input type="file" required id="photo" name="photo"
|
||||||
|
accept="image/*">
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
<div class="form-group">
|
||||||
|
<input type="text" name="fullname" placeholder="{Lang::T('Full Name')}"
|
||||||
|
{if $_c['man_fields_fname'] neq 'no'}required{/if} >
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<input type="email" name="email" placeholder="{Lang::T('Email Address')}"
|
||||||
|
{if $_c['man_fields_email'] neq 'no'}required{/if}>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<button type="button" onclick="toggleFields()" class="submit-btn">
|
||||||
|
{Lang::T('Next Step')}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Password Fields (Initially Hidden) -->
|
||||||
|
<div id="passwordFields" style="display: none;">
|
||||||
|
<div class="form-group">
|
||||||
|
<input type="text" name="address" placeholder="{Lang::T('Home Address')}"
|
||||||
|
{if $_c['man_fields_address'] neq 'no'}required{/if}>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<input type="password" name="password" placeholder="{Lang::T('Password')}"
|
||||||
|
required>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<input type="password" name="cpassword"
|
||||||
|
placeholder="{Lang::T('Confirm Password')}" required>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<button id="register-btn" type="submit" class="submit-btn">
|
||||||
|
<span id="register-text">{Lang::T('Register')}</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<p>{Lang::T('Already have an account?')} <a href="{Text::url('login')}"
|
||||||
|
class="linkButton">{Lang::T('Login')}</a></p>
|
||||||
|
<footer>
|
||||||
|
© {$smarty.now|date_format:"%Y"} {$_c['CompanyName']}. All rights reserved. <br> <a
|
||||||
|
href="pages/Privacy_Policy.html">Privacy</a> | <a
|
||||||
|
href="pages/Terms_and_Conditions.html">Terms & Conditions</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const registerForm = document.getElementById('register-form');
|
||||||
|
const registerBtn = document.getElementById('register-btn');
|
||||||
|
const registerText = document.getElementById('register-text');
|
||||||
|
registerForm.addEventListener('submit', function (event) {
|
||||||
|
registerBtn.classList.add('loading');
|
||||||
|
registerText.textContent = 'Please Wait...';
|
||||||
|
});
|
||||||
|
|
||||||
|
function toggleFields() {
|
||||||
|
|
||||||
|
document.getElementById('basicFields').style.display = 'none';
|
||||||
|
document.getElementById('passwordFields').style.display = 'block';
|
||||||
|
|
||||||
|
const backButton = document.createElement('button');
|
||||||
|
backButton.className = 'submit-btn';
|
||||||
|
backButton.textContent = '← Back';
|
||||||
|
backButton.style.marginBottom = '15px';
|
||||||
|
backButton.onclick = () => {
|
||||||
|
document.getElementById('basicFields').style.display = 'block';
|
||||||
|
document.getElementById('passwordFields').style.display = 'none';
|
||||||
|
backButton.remove();
|
||||||
|
};
|
||||||
|
document.getElementById('passwordFields').prepend(backButton);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
@ -4,7 +4,20 @@
|
|||||||
<table class="table table-condensed">
|
<table class="table table-condensed">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{Lang::T('Username')}</th>
|
<th>
|
||||||
|
<select style="border: 0px; width: 100%; background-color: #f9f9f9;"
|
||||||
|
onchange="changeExpiredDefault(this)">
|
||||||
|
<option value="username" {if $cookie['expdef'] == 'username'}selected{/if}>
|
||||||
|
{Lang::T('Username')}
|
||||||
|
</option>
|
||||||
|
<option value="fullname" {if $cookie['expdef'] == 'fullname'}selected{/if}>
|
||||||
|
{Lang::T('Full Name')}</option>
|
||||||
|
<option value="phone" {if $cookie['expdef'] == 'phone'}selected{/if}>{Lang::T('Phone')}
|
||||||
|
</option>
|
||||||
|
<option value="email" {if $cookie['expdef'] == 'email'}selected{/if}>{Lang::T('Email')}
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</th>
|
||||||
<th>{Lang::T('Created / Expired')}</th>
|
<th>{Lang::T('Created / Expired')}</th>
|
||||||
<th>{Lang::T('Internet Package')}</th>
|
<th>{Lang::T('Internet Package')}</th>
|
||||||
<th>{Lang::T('Location')}</th>
|
<th>{Lang::T('Location')}</th>
|
||||||
@ -15,7 +28,17 @@
|
|||||||
{assign var="rem_exp" value="{$expired['expiration']} {$expired['time']}"}
|
{assign var="rem_exp" value="{$expired['expiration']} {$expired['time']}"}
|
||||||
{assign var="rem_started" value="{$expired['recharged_on']} {$expired['recharged_time']}"}
|
{assign var="rem_started" value="{$expired['recharged_on']} {$expired['recharged_time']}"}
|
||||||
<tr>
|
<tr>
|
||||||
<td><a href="{Text::url('customers/viewu/',$expired['username'])}">{$expired['username']}</a></td>
|
<td><a href="{Text::url('customers/view/',$expired['id'])}">
|
||||||
|
{if $cookie['expdef'] == 'fullname'}
|
||||||
|
{$expired['fullname']}
|
||||||
|
{elseif $cookie['expdef'] == 'phone'}
|
||||||
|
{$expired['phonenumber']}
|
||||||
|
{elseif $cookie['expdef'] == 'email'}
|
||||||
|
{$expired['email']}
|
||||||
|
{else}
|
||||||
|
{$expired['username']}
|
||||||
|
{/if}
|
||||||
|
</a></td>
|
||||||
<td><small data-toggle="tooltip" data-placement="top"
|
<td><small data-toggle="tooltip" data-placement="top"
|
||||||
title="{Lang::dateAndTimeFormat($expired['recharged_on'],$expired['recharged_time'])}">{Lang::timeElapsed($rem_started)}</small>
|
title="{Lang::dateAndTimeFormat($expired['recharged_on'],$expired['recharged_time'])}">{Lang::timeElapsed($rem_started)}</small>
|
||||||
/
|
/
|
||||||
@ -31,3 +54,11 @@
|
|||||||
</div>
|
</div>
|
||||||
{include file="pagination.tpl"}
|
{include file="pagination.tpl"}
|
||||||
</div>
|
</div>
|
||||||
|
<script>
|
||||||
|
function changeExpiredDefault(fl) {
|
||||||
|
setCookie('expdef', fl.value, 365);
|
||||||
|
setTimeout(() => {
|
||||||
|
location.reload();
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
</script>
|
@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
"version": "2025.3.10"
|
"version": "2025.3.13"
|
||||||
}
|
}
|
Reference in New Issue
Block a user