Merge pull request #135 from pro-cms/master

Added Business/Personal System
This commit is contained in:
iBNu Maksum 2024-03-19 09:46:16 +07:00 committed by GitHub
commit 393a1195a5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 190 additions and 102 deletions

1
.gitignore vendored
View File

@ -39,3 +39,4 @@ system/lan/**
!system/lan/turkish.json !system/lan/turkish.json
!system/lan/english.json !system/lan/english.json
!system/lan/country.json !system/lan/country.json
*.zip

View File

@ -29,6 +29,7 @@ CREATE TABLE `tbl_customers` (
`coordinates` VARCHAR(50) NOT NULL DEFAULT '6.465422, 3.406448' COMMENT 'Latitude and Longitude coordinates', `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', `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', `service_type` ENUM('Hotspot','PPPoE','Others') DEFAULT 'Others' COMMENT 'For selecting user type',
`account_type` ENUM('Business', 'Personal') DEFAULT 'Personal' COMMENT 'For selecting account type',
`auto_renewal` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'Auto renewall using balance', `auto_renewal` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'Auto renewall using balance',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_login` datetime DEFAULT NULL `last_login` datetime DEFAULT NULL
@ -98,8 +99,9 @@ CREATE TABLE `tbl_plans` (
`is_radius` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 is radius', `is_radius` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 is radius',
`pool` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `pool` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`pool_expired` varchar(40) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', `pool_expired` varchar(40) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
`enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0 disabled\r\n', `enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0 disabled',
`allow_purchase` enum('yes','no') DEFAULT 'yes' COMMENT 'allow to show package in buy package page' `allow_purchase` enum('yes','no') DEFAULT 'yes' COMMENT 'allow to show package in buy package page',
`plan_type` ENUM('Business', 'Personal') DEFAULT 'Personal' COMMENT 'For switching plan according to user type'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
DROP TABLE IF EXISTS `tbl_pool`; DROP TABLE IF EXISTS `tbl_pool`;

BIN
phpnuxbill.zip Normal file

Binary file not shown.

View File

@ -309,7 +309,8 @@ switch ($action) {
} catch (Throwable $e) { } catch (Throwable $e) {
} }
try { try {
if ($c) $c->delete(); if ($c)
$c->delete();
} catch (Exception $e) { } catch (Exception $e) {
} catch (Throwable $e) { } catch (Throwable $e) {
} }
@ -328,6 +329,7 @@ switch ($action) {
$address = _post('address'); $address = _post('address');
$phonenumber = _post('phonenumber'); $phonenumber = _post('phonenumber');
$service_type = _post('service_type'); $service_type = _post('service_type');
$account_type = _post('account_type');
$coordinates = _post('coordinates'); $coordinates = _post('coordinates');
//post Customers Attributes //post Customers Attributes
$custom_field_names = (array) $_POST['custom_field_name']; $custom_field_names = (array) $_POST['custom_field_name'];
@ -356,6 +358,7 @@ switch ($action) {
$d->password = $password; $d->password = $password;
$d->pppoe_password = $pppoe_password; $d->pppoe_password = $pppoe_password;
$d->email = $email; $d->email = $email;
$d->account_type = $account_type;
$d->fullname = $fullname; $d->fullname = $fullname;
$d->address = $address; $d->address = $address;
$d->created_by = $admin['id']; $d->created_by = $admin['id'];
@ -391,6 +394,7 @@ switch ($action) {
case 'edit-post': case 'edit-post':
$username = Lang::phoneFormat(_post('username')); $username = Lang::phoneFormat(_post('username'));
$fullname = _post('fullname'); $fullname = _post('fullname');
$account_type = _post('account_type');
$password = _post('password'); $password = _post('password');
$pppoe_password = _post('pppoe_password'); $pppoe_password = _post('pppoe_password');
$email = _post('email'); $email = _post('email');
@ -454,6 +458,7 @@ switch ($action) {
$d->pppoe_password = $pppoe_password; $d->pppoe_password = $pppoe_password;
$d->fullname = $fullname; $d->fullname = $fullname;
$d->email = $email; $d->email = $email;
$d->account_type = $account_type;
$d->address = $address; $d->address = $address;
$d->phonenumber = $phonenumber; $d->phonenumber = $phonenumber;
$d->service_type = $service_type; $d->service_type = $service_type;

View File

@ -48,25 +48,26 @@ switch ($action) {
$ui->assign('_title', 'Order Plan'); $ui->assign('_title', 'Order Plan');
$ui->assign('_system_menu', 'package'); $ui->assign('_system_menu', 'package');
if (!empty ($_SESSION['nux-router'])) { if (!empty ($_SESSION['nux-router'])) {
$account_type = $user['account_type'];
if ($_SESSION['nux-router'] == 'radius') { if ($_SESSION['nux-router'] == 'radius') {
$radius_pppoe = ORM::for_table('tbl_plans')->where('enabled', '1')->where('is_radius', 1)->where('type', 'PPPOE')->where('prepaid', 'yes')->find_many(); $radius_pppoe = ORM::for_table('tbl_plans')->where('plan_type', $account_type)->where('enabled', '1')->where('is_radius', 1)->where('type', 'PPPOE')->where('prepaid', 'yes')->find_many();
$radius_hotspot = ORM::for_table('tbl_plans')->where('enabled', '1')->where('is_radius', 1)->where('type', 'Hotspot')->where('prepaid', 'yes')->find_many(); $radius_hotspot = ORM::for_table('tbl_plans')->where('plan_type', $account_type)->where('enabled', '1')->where('is_radius', 1)->where('type', 'Hotspot')->where('prepaid', 'yes')->find_many();
} else { } else {
$routers = ORM::for_table('tbl_routers')->where('id', $_SESSION['nux-router'])->find_many(); $routers = ORM::for_table('tbl_routers')->where('id', $_SESSION['nux-router'])->find_many();
$rs = []; $rs = [];
foreach ($routers as $r) { foreach ($routers as $r) {
$rs[] = $r['name']; $rs[] = $r['name'];
} }
$plans_pppoe = ORM::for_table('tbl_plans')->where('enabled', '1')->where_in('routers', $rs)->where('is_radius', 0)->where('type', 'PPPOE')->where('prepaid', 'yes')->find_many(); $plans_pppoe = ORM::for_table('tbl_plans')->where('plan_type', $account_type)->where('enabled', '1')->where_in('routers', $rs)->where('is_radius', 0)->where('type', 'PPPOE')->where('prepaid', 'yes')->find_many();
$plans_hotspot = ORM::for_table('tbl_plans')->where('enabled', '1')->where_in('routers', $rs)->where('is_radius', 0)->where('type', 'Hotspot')->where('prepaid', 'yes')->find_many(); $plans_hotspot = ORM::for_table('tbl_plans')->where('plan_type', $account_type)->where('enabled', '1')->where_in('routers', $rs)->where('is_radius', 0)->where('type', 'Hotspot')->where('prepaid', 'yes')->find_many();
} }
} else { } else {
$radius_pppoe = ORM::for_table('tbl_plans')->where('enabled', '1')->where('is_radius', 1)->where('type', 'PPPOE')->where('prepaid', 'yes')->find_many(); $radius_pppoe = ORM::for_table('tbl_plans')->where('plan_type', $account_type)->where('enabled', '1')->where('is_radius', 1)->where('type', 'PPPOE')->where('prepaid', 'yes')->find_many();
$radius_hotspot = ORM::for_table('tbl_plans')->where('enabled', '1')->where('is_radius', 1)->where('type', 'Hotspot')->where('prepaid', 'yes')->find_many(); $radius_hotspot = ORM::for_table('tbl_plans')->where('plan_type', $account_type)->where('enabled', '1')->where('is_radius', 1)->where('type', 'Hotspot')->where('prepaid', 'yes')->find_many();
$routers = ORM::for_table('tbl_routers')->find_many(); $routers = ORM::for_table('tbl_routers')->find_many();
$plans_pppoe = ORM::for_table('tbl_plans')->where('enabled', '1')->where('is_radius', 0)->where('type', 'PPPOE')->where('prepaid', 'yes')->find_many(); $plans_pppoe = ORM::for_table('tbl_plans')->where('plan_type', $account_type)->where('enabled', '1')->where('is_radius', 0)->where('type', 'PPPOE')->where('prepaid', 'yes')->find_many();
$plans_hotspot = ORM::for_table('tbl_plans')->where('enabled', '1')->where('is_radius', 0)->where('type', 'Hotspot')->where('prepaid', 'yes')->find_many(); $plans_hotspot = ORM::for_table('tbl_plans')->where('plan_type', $account_type)->where('enabled', '1')->where('is_radius', 0)->where('type', 'Hotspot')->where('prepaid', 'yes')->find_many();
} }
$ui->assign('routers', $routers); $ui->assign('routers', $routers);
$ui->assign('radius_pppoe', $radius_pppoe); $ui->assign('radius_pppoe', $radius_pppoe);

View File

@ -185,6 +185,7 @@ switch ($action) {
case 'add-post': case 'add-post':
$name = _post('name'); $name = _post('name');
$plan_type = _post('plan_type'); //Personal / Business
$radius = _post('radius'); $radius = _post('radius');
$typebp = _post('typebp'); $typebp = _post('typebp');
$limit_type = _post('limit_type'); $limit_type = _post('limit_type');
@ -251,6 +252,7 @@ switch ($action) {
$d->price = $price; $d->price = $price;
$d->type = 'Hotspot'; $d->type = 'Hotspot';
$d->typebp = $typebp; $d->typebp = $typebp;
$d->plan_type = $plan_type;
$d->limit_type = $limit_type; $d->limit_type = $limit_type;
$d->time_limit = $time_limit; $d->time_limit = $time_limit;
$d->time_unit = $time_unit; $d->time_unit = $time_unit;
@ -295,6 +297,7 @@ switch ($action) {
case 'edit-post': case 'edit-post':
$id = _post('id'); $id = _post('id');
$name = _post('name'); $name = _post('name');
$plan_type = _post('plan_type');
$id_bw = _post('id_bw'); $id_bw = _post('id_bw');
$typebp = _post('typebp'); $typebp = _post('typebp');
$price = _post('price'); $price = _post('price');
@ -367,6 +370,7 @@ switch ($action) {
$d->time_limit = $time_limit; $d->time_limit = $time_limit;
$d->time_unit = $time_unit; $d->time_unit = $time_unit;
$d->data_limit = $data_limit; $d->data_limit = $data_limit;
$d->plan_type = $plan_type;
$d->data_unit = $data_unit; $d->data_unit = $data_unit;
$d->validity = $validity; $d->validity = $validity;
$d->validity_unit = $validity_unit; $d->validity_unit = $validity_unit;
@ -461,6 +465,7 @@ switch ($action) {
case 'pppoe-add-post': case 'pppoe-add-post':
$name = _post('name_plan'); $name = _post('name_plan');
$plan_type = _post('plan_type');
$radius = _post('radius'); $radius = _post('radius');
$id_bw = _post('id_bw'); $id_bw = _post('id_bw');
$price = _post('price'); $price = _post('price');
@ -520,6 +525,7 @@ switch ($action) {
$d->name_plan = $name; $d->name_plan = $name;
$d->id_bw = $id_bw; $d->id_bw = $id_bw;
$d->price = $price; $d->price = $price;
$d->plan_type = $plan_type;
$d->validity = $validity; $d->validity = $validity;
$d->validity_unit = $validity_unit; $d->validity_unit = $validity_unit;
$d->pool = $pool; $d->pool = $pool;
@ -556,6 +562,7 @@ switch ($action) {
case 'edit-pppoe-post': case 'edit-pppoe-post':
$id = _post('id'); $id = _post('id');
$plan_type = _post('plan_type');
$name = _post('name_plan'); $name = _post('name_plan');
$id_bw = _post('id_bw'); $id_bw = _post('id_bw');
$price = _post('price'); $price = _post('price');
@ -619,6 +626,7 @@ switch ($action) {
$d->name_plan = $name; $d->name_plan = $name;
$d->id_bw = $id_bw; $d->id_bw = $id_bw;
$d->price = $price; $d->price = $price;
$d->plan_type = $plan_type;
$d->validity = $validity; $d->validity = $validity;
$d->validity_unit = $validity_unit; $d->validity_unit = $validity_unit;
$d->routers = $routers; $d->routers = $routers;

View File

@ -95,6 +95,16 @@
</select> </select>
</div> </div>
</div> </div>
<div class="form-group">
<label class="col-md-3 control-label">{Lang::T('Account Type')}</label>
<div class="col-md-9">
<select class="form-control" id="service_type" name="service_type">
<option value="Personal" {if $d['account_type'] eq 'Personal' }selected{/if}>Personal
</option>
<option value="Business" {if $d['account_type'] eq 'Business' }selected{/if}>Business</option>
</select>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -98,6 +98,17 @@
</select> </select>
</div> </div>
</div> </div>
<div class="form-group">
<label class="col-md-3 control-label">{Lang::T('Account Type')}</label>
<div class="col-md-9">
<select class="form-control" id="account_type" name="account_type">
<option value="Personal" {if $d['account_type'] eq 'Personal' }selected{/if}>Personal
</option>
<option value="Business" {if $d['account_type'] eq 'Business' }selected{/if}>Business</option>
</select>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -37,6 +37,7 @@
<thead> <thead>
<tr> <tr>
<th>{Lang::T('Username')}</th> <th>{Lang::T('Username')}</th>
<th>{Lang::T('Account Type')}</th>
<th>{Lang::T('Full Name')}</th> <th>{Lang::T('Full Name')}</th>
<th>{Lang::T('Balance')}</th> <th>{Lang::T('Balance')}</th>
<th>{Lang::T('Phone Number')}</th> <th>{Lang::T('Phone Number')}</th>
@ -52,6 +53,7 @@
<tr> <tr>
<td onclick="window.location.href = '{$_url}customers/view/{$ds['id']}'" <td onclick="window.location.href = '{$_url}customers/view/{$ds['id']}'"
style="cursor:pointer;">{$ds['username']}</td> style="cursor:pointer;">{$ds['username']}</td>
<td>{$ds['account_type']}</td>
<td onclick="window.location.href = '{$_url}customers/view/{$ds['id']}'" <td onclick="window.location.href = '{$_url}customers/view/{$ds['id']}'"
style="cursor: pointer;">{$ds['fullname']}</td> style="cursor: pointer;">{$ds['fullname']}</td>
<td>{Lang::moneyFormat($ds['balance'])}</td> <td>{Lang::moneyFormat($ds['balance'])}</td>

View File

@ -20,6 +20,14 @@
<input type="radio" name="prepaid" onclick="postPaid()" value="no"> Postpaid <input type="radio" name="prepaid" onclick="postPaid()" value="no"> Postpaid
</div> </div>
</div> </div>
<div class="form-group">
<label class="col-md-2 control-label">{Lang::T('Plan Type')}</label>
<div class="col-md-10">
<input type="radio" name="plan_type" value="Personal" checked> Personal
<input type="radio" name="plan_type" value="Business"> Business
</div>
</div>
{if $_c['radius_enable']} {if $_c['radius_enable']}
<div class="form-group"> <div class="form-group">
<label class="col-md-2 control-label">Radius</label> <label class="col-md-2 control-label">Radius</label>

View File

@ -14,6 +14,8 @@
<input type="radio" name="enabled" value="0" {if $d['enabled'] == 0}checked{/if}> Disable <input type="radio" name="enabled" value="0" {if $d['enabled'] == 0}checked{/if}> Disable
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-md-2 control-label">{Lang::T('Type')}</label> <label class="col-md-2 control-label">{Lang::T('Type')}</label>
<div class="col-md-10"> <div class="col-md-10">
@ -24,6 +26,19 @@
{if $d['prepaid'] == no}checked{/if}> Postpaid {if $d['prepaid'] == no}checked{/if}> Postpaid
</div> </div>
</div> </div>
<div class="form-group">
<label class="col-md-2 control-label">{Lang::T('Plan Type')}</label>
<div class="col-md-10">
<input type="radio" name="plan_type" value="Personal"
{if $d['plan_type'] == 'Personal'}checked{/if}>
Personal
<input type="radio" name="plan_type" value="Business"
{if $d['plan_type'] == 'Business'}checked{/if}> Business
</div>
</div>
{if $_c['radius_enable'] and $d['is_radius']} {if $_c['radius_enable'] and $d['is_radius']}
<div class="form-group"> <div class="form-group">
<label class="col-md-2 control-label">Radius</label> <label class="col-md-2 control-label">Radius</label>

View File

@ -53,6 +53,7 @@
<tr {if $ds['enabled'] != 1}class="danger" title="disabled" <tr {if $ds['enabled'] != 1}class="danger" title="disabled"
{elseif $ds['prepaid'] != 'yes'}class="warning" title="Postpaid" {/if}> {elseif $ds['prepaid'] != 'yes'}class="warning" title="Postpaid" {/if}>
<td class="headcol">{$ds['name_plan']}</td> <td class="headcol">{$ds['name_plan']}</td>
<td>{$ds['plan_type']}</td>
<td>{$ds['typebp']}</td> <td>{$ds['typebp']}</td>
<td>{$ds['name_bw']}</td> <td>{$ds['name_bw']}</td>
<td>{Lang::moneyFormat($ds['price'])}</td> <td>{Lang::moneyFormat($ds['price'])}</td>

View File

@ -45,6 +45,7 @@
<tr> <tr>
<th>{Lang::T('Username')}</th> <th>{Lang::T('Username')}</th>
<th>{Lang::T('Plan Name')}</th> <th>{Lang::T('Plan Name')}</th>
<th>{Lang::T('Plan Type')}</th>
<th>{Lang::T('Type')}</th> <th>{Lang::T('Type')}</th>
<th>{Lang::T('Created On')}</th> <th>{Lang::T('Created On')}</th>
<th>{Lang::T('Expires On')}</th> <th>{Lang::T('Expires On')}</th>
@ -59,6 +60,7 @@
<td><a href="{$_url}customers/viewu/{$ds['username']}">{$ds['username']}</a></td> <td><a href="{$_url}customers/viewu/{$ds['username']}">{$ds['username']}</a></td>
<td>{$ds['namebp']}</td> <td>{$ds['namebp']}</td>
<td>{$ds['type']}</td> <td>{$ds['type']}</td>
<td>{$ds['plan_type']}</td>
<td>{Lang::dateAndTimeFormat($ds['recharged_on'],$ds['recharged_time'])}</td> <td>{Lang::dateAndTimeFormat($ds['recharged_on'],$ds['recharged_time'])}</td>
<td>{Lang::dateAndTimeFormat($ds['expiration'],$ds['time'])}</td> <td>{Lang::dateAndTimeFormat($ds['expiration'],$ds['time'])}</td>
<td>{$ds['method']}</td> <td>{$ds['method']}</td>

View File

@ -20,6 +20,15 @@
<input type="radio" name="prepaid" onclick="postPaid()" value="no"> Postpaid <input type="radio" name="prepaid" onclick="postPaid()" value="no"> Postpaid
</div> </div>
</div> </div>
<div class="form-group">
<label class="col-md-2 control-label">{Lang::T('Plan Type')}</label>
<div class="col-md-10">
<input type="radio" name="plan_type" value="Personal" checked> Personal
<input type="radio" name="plan_type" value="Business"> Business
</div>
</div>
{if $_c['radius_enable']} {if $_c['radius_enable']}
<div class="form-group"> <div class="form-group">
<label class="col-md-2 control-label">Radius</label> <label class="col-md-2 control-label">Radius</label>

View File

@ -22,6 +22,17 @@
<input type="radio" name="prepaid" onclick="postPaid()" value="no" {if $d['prepaid'] == no}checked{/if}> Postpaid <input type="radio" name="prepaid" onclick="postPaid()" value="no" {if $d['prepaid'] == no}checked{/if}> Postpaid
</div> </div>
</div> </div>
<div class="form-group">
<label class="col-md-2 control-label">{Lang::T('Plan Type')}</label>
<div class="col-md-10">
<input type="radio" name="plan_type" value="Personal"
{if $d['plan_type'] == 'Personal'}checked{/if}>
Personal
<input type="radio" name="plan_type" value="Business"
{if $d['plan_type'] == 'Business'}checked{/if}> Business
</div>
</div>
{if $_c['radius_enable'] and $d['is_radius']} {if $_c['radius_enable'] and $d['is_radius']}
<div class="form-group"> <div class="form-group">
<label class="col-md-2 control-label">Radius</label> <label class="col-md-2 control-label">Radius</label>

View File

@ -36,6 +36,7 @@
<thead> <thead>
<tr> <tr>
<th>{Lang::T('Plan Name')}</th> <th>{Lang::T('Plan Name')}</th>
<th>{Lang::T('Plan Type')}</th>
<th>{Lang::T('Bandwidth Plans')}</th> <th>{Lang::T('Bandwidth Plans')}</th>
<th>{Lang::T('Plan Price')}</th> <th>{Lang::T('Plan Price')}</th>
<th>{Lang::T('Plan Validity')}</th> <th>{Lang::T('Plan Validity')}</th>
@ -51,6 +52,7 @@
<tr {if $ds['enabled'] != 1}class="danger" title="disabled" <tr {if $ds['enabled'] != 1}class="danger" title="disabled"
{elseif $ds['prepaid'] != 'yes'}class="warning" title="Postpaid" {/if}> {elseif $ds['prepaid'] != 'yes'}class="warning" title="Postpaid" {/if}>
<td>{$ds['name_plan']}</td> <td>{$ds['name_plan']}</td>
<td>{$ds['plan_type']}</td>
<td>{$ds['name_bw']}</td> <td>{$ds['name_bw']}</td>
<td>{Lang::moneyFormat($ds['price'])}</td> <td>{Lang::moneyFormat($ds['price'])}</td>
<td>{$ds['validity']} {$ds['validity_unit']}</td> <td>{$ds['validity']} {$ds['validity_unit']}</td>