diff --git a/install/phpnuxbill.sql b/install/phpnuxbill.sql index 097896d9..6b811b39 100644 --- a/install/phpnuxbill.sql +++ b/install/phpnuxbill.sql @@ -26,6 +26,7 @@ CREATE TABLE `tbl_customers` ( `address` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, `phonenumber` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0', `email` varchar(128) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1', + `coordinates` VARCHAR(50) NOT NULL DEFAULT '6.465422, 3.406448' COMMENT 'Latitude and Longitude coordinates', `balance` decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT 'For Money Deposit', `service_type` ENUM('Hotspot','PPPoE','Others') DEFAULT 'Others' COMMENT 'For selecting user type', `auto_renewal` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'Auto renewall using balance', diff --git a/system/controllers/customers.php b/system/controllers/customers.php index 2300af01..151ace8a 100644 --- a/system/controllers/customers.php +++ b/system/controllers/customers.php @@ -130,7 +130,7 @@ switch ($action) { $ui->assign('using', 'cash'); $ui->assign('plan', $plan); $ui->display('recharge-confirm.tpl'); - }else{ + } else { r2(U . 'customers/view/' . $id_customer, 'e', 'Cannot find active plan'); } break; @@ -191,7 +191,7 @@ switch ($action) { } } } - r2(U . 'customers/view/' . $id_customer, 's', 'Sync success to '.implode(", ",$routers)); + r2(U . 'customers/view/' . $id_customer, 's', 'Sync success to ' . implode(", ", $routers)); } r2(U . 'customers/view/' . $id_customer, 'e', 'Cannot find active plan'); break; @@ -212,7 +212,7 @@ switch ($action) { ->find_many(); $v = $routes['3']; - if(empty($v)){ + if (empty($v)) { $v = 'activation'; } if ($v == 'order') { @@ -328,6 +328,7 @@ switch ($action) { $address = _post('address'); $phonenumber = _post('phonenumber'); $service_type = _post('service_type'); + $coordinates = _post('coordinates'); //post Customers Attributes $custom_field_names = (array) $_POST['custom_field_name']; $custom_field_values = (array) $_POST['custom_field_value']; @@ -360,6 +361,7 @@ switch ($action) { $d->created_by = $admin['id']; $d->phonenumber = Lang::phoneFormat($phonenumber); $d->service_type = $service_type; + $d->coordinates = $coordinates; $d->save(); // Retrieve the customer ID of the newly created customer @@ -395,6 +397,7 @@ switch ($action) { $address = _post('address'); $phonenumber = Lang::phoneFormat(_post('phonenumber')); $service_type = _post('service_type'); + $coordinates = _post('coordinates'); run_hook('edit_customer'); #HOOK $msg = ''; if (Validator::Length($username, 35, 2) == false) { @@ -454,6 +457,7 @@ switch ($action) { $d->address = $address; $d->phonenumber = $phonenumber; $d->service_type = $service_type; + $d->coordinates = $coordinates; $d->save(); diff --git a/system/controllers/map.php b/system/controllers/map.php new file mode 100644 index 00000000..053019f4 --- /dev/null +++ b/system/controllers/map.php @@ -0,0 +1,45 @@ +assign('_system_menu', 'map'); + +$action = $routes['1']; +$ui->assign('_admin', $admin); + +if (empty($action)) { + $action = 'customer'; +} + +switch ($action) { + case 'customer': + + $c = ORM::for_table('tbl_customers')->find_many(); + $customerData = []; + + foreach ($c as $customer) { + $customerData[] = [ + 'id' => $customer->id, + 'name' => $customer->fullname, + 'balance' => $customer->balance, + 'address' => $customer->address, + 'info' => Lang::T("Username") . ": " . $customer->username . " - " . Lang::T("Full Name") . ": " . $customer->fullname . " - " . Lang::T("Email") . ": " . $customer->email . " - " . Lang::T("Phone") . ": " . $customer->phonenumber . " - " . Lang::T("Service Type") . ": " . $customer->service_type, + 'coordinates' => '[' . $customer->coordinates . ']', + ]; + } + + $ui->assign('customers', $customerData); + $ui->assign('xheader', ''); + $ui->assign('_title', Lang::T('Customer Geo Location Information')); + $ui->assign('xfooter', ''); + $ui->display('map-customer.tpl'); + break; + + default: + r2(U . 'map/customer', 'e', 'action not defined'); + break; +} diff --git a/system/controllers/message.php b/system/controllers/message.php index 46cf0902..e12eadff 100644 --- a/system/controllers/message.php +++ b/system/controllers/message.php @@ -40,8 +40,11 @@ document.addEventListener("DOMContentLoaded", function(event) { }); EOT; - $c = ORM::for_table('tbl_customers')->find_many(); - $ui->assign('c', $c); + if (isset($routes['2']) && !empty($routes['2'])) { + $ui->assign('cust', ORM::for_table('tbl_customers')->find_one($routes['2'])); + } + $id = $routes['2']; + $ui->assign('id', $id); $ui->assign('xfooter', $select2_customer); $ui->display('message.tpl'); break; diff --git a/system/updates.json b/system/updates.json index 29f3282a..9a25dbb5 100644 --- a/system/updates.json +++ b/system/updates.json @@ -78,5 +78,10 @@ ], "2024.3.14" : [ "ALTER TABLE `tbl_transactions` ADD `note` VARCHAR(256) NOT NULL DEFAULT '' COMMENT 'for note' AFTER `type`;" + ], + "2024.3.19" : [ + "ALTER TABLE `tbl_customers` ADD `coordinates` VARCHAR(50) NOT NULL DEFAULT '6.465422, 3.406448' COMMENT 'Latitude and Longitude coordinates' AFTER `email`;" ] + + } \ No newline at end of file diff --git a/ui/ui/customers-add.tpl b/ui/ui/customers-add.tpl index acef5cfe..0ff75696 100644 --- a/ui/ui/customers-add.tpl +++ b/ui/ui/customers-add.tpl @@ -11,10 +11,10 @@
{Lang::T('Invoice')} | -{Lang::T('Username')} | -{Lang::T('Plan Name')} | -{Lang::T('Plan Price')} | -{Lang::T('Type')} | -{Lang::T('Created On')} | -{Lang::T('Expires On')} | -{Lang::T('Method')} | -|
---|---|---|---|---|---|---|---|---|
{$ds['invoice']} | -{$ds['username']} | -{$ds['plan_name']} | -{Lang::moneyFormat($ds['price'])} | -{$ds['type']} | -{Lang::dateAndTimeFormat($ds['recharged_on'],$ds['recharged_time'])} - | -{Lang::dateAndTimeFormat($ds['expiration'],$ds['time'])} | -{$ds['method']} | -|
{Lang::T('Invoice')} | +{Lang::T('Username')} | +{Lang::T('Plan Name')} | +{Lang::T('Plan Price')} | +{Lang::T('Type')} | +{Lang::T('Created On')} | +{Lang::T('Expires On')} | +{Lang::T('Method')} | +|
{$ds['invoice']} | +{$ds['username']} | +{$ds['plan_name']} | +{Lang::moneyFormat($ds['price'])} | +{$ds['type']} | +{Lang::dateAndTimeFormat($ds['recharged_on'],$ds['recharged_time'])} + | +{Lang::dateAndTimeFormat($ds['expiration'],$ds['time'])} | +{$ds['method']} | +|
{Lang::T('Plan Name')} | -{Lang::T('Gateway')} | -{Lang::T('Routers')} | -{Lang::T('Type')} | -{Lang::T('Plan Price')} | -{Lang::T('Created On')} | -{Lang::T('Expires On')} | -{Lang::T('Date Done')} | -{Lang::T('Method')} | -
{$ds['plan_name']} | -{$ds['gateway']} | -{$ds['routers']} | -{$ds['payment_channel']} | -{Lang::moneyFormat($ds['price'])} | -{Lang::dateTimeFormat($ds['created_date'])} | -{Lang::dateTimeFormat($ds['expired_date'])} | -{if $ds['status']!=1}{Lang::dateTimeFormat($ds['paid_date'])}{/if} | -{if $ds['status']==1}{Lang::T('UNPAID')} - {elseif $ds['status']==2}{Lang::T('PAID')} - {elseif $ds['status']==3}{$_L['FAILED']} - {elseif $ds['status']==4}{Lang::T('CANCELED')} - {elseif $ds['status']==5}{Lang::T('UNKNOWN')} - {/if} | -
{Lang::T('Plan Name')} | +{Lang::T('Gateway')} | +{Lang::T('Routers')} | +{Lang::T('Type')} | +{Lang::T('Plan Price')} | +{Lang::T('Created On')} | +{Lang::T('Expires On')} | +{Lang::T('Date Done')} | +{Lang::T('Method')} | +
{$ds['plan_name']} | +{$ds['gateway']} | +{$ds['routers']} | +{$ds['payment_channel']} | +{Lang::moneyFormat($ds['price'])} | +{Lang::dateTimeFormat($ds['created_date'])} | +{Lang::dateTimeFormat($ds['expired_date'])} | +{if $ds['status']!=1}{Lang::dateTimeFormat($ds['paid_date'])}{/if} | +{if $ds['status']==1}{Lang::T('UNPAID')} + {elseif $ds['status']==2}{Lang::T('PAID')} + {elseif $ds['status']==3}{$_L['FAILED']} + {elseif $ds['status']==4}{Lang::T('CANCELED')} + {elseif $ds['status']==5}{Lang::T('UNKNOWN')} + {/if} | +
{Lang::T('Use placeholders:')}
- {Lang::T('[[name]]')} - {Lang::T('Customer Name')}
+ [[name]] - {Lang::T('Customer Name')}
- {Lang::T('[[user_name]]')} - {Lang::T('Customer Username')}
+ [[user_name]] - {Lang::T('Customer Username')}
- {Lang::T('[[phone]]')} - {Lang::T('Customer Phone')}
+ [[phone]] - {Lang::T('Customer Phone')}
- {Lang::T('[[company_name]]')} - {Lang::T('Your Company Name')}
+ [[company_name]] - {Lang::T('Your Company Name')}
+ {Lang::T('Use placeholders:')}
+
+ [[name]] - {Lang::T('Customer Name')}
+
+ [[user_name]] - {Lang::T('Customer Username')}
+
+ [[phone]] - {Lang::T('Customer Phone')}
+
+ [[company_name]] - {Lang::T('Your Company Name')}
+