2017-03-11 02:51:06 +07:00
< ? php
2022-09-01 15:35:54 +07:00
2017-03-11 02:51:06 +07:00
/**
2023-10-12 15:55:42 +07:00
* PHP Mikrotik Billing ( https :// github . com / hotspotbilling / phpnuxbill / )
* by https :// t . me / ibnux
2022-09-01 15:35:54 +07:00
**/
2023-10-12 15:55:42 +07:00
2017-03-11 02:51:06 +07:00
_admin ();
2024-02-13 13:54:01 +07:00
$ui -> assign ( '_title' , Lang :: T ( 'Customer' ));
2017-03-11 02:51:06 +07:00
$ui -> assign ( '_system_menu' , 'customers' );
$action = $routes [ '1' ];
$ui -> assign ( '_admin' , $admin );
2024-03-26 14:39:28 +07:00
if ( empty ( $action )) {
2024-02-29 11:37:54 +07:00
$action = 'list' ;
}
2017-03-11 02:51:06 +07:00
2024-03-22 21:21:23 +07:00
$leafletpickerHeader = <<< EOT
< link rel = " stylesheet " href = " https://unpkg.com/leaflet@1.9.3/dist/leaflet.css " >
EOT ;
2017-03-11 02:51:06 +07:00
switch ( $action ) {
2024-02-12 11:35:59 +07:00
case 'csv' :
2024-02-16 14:52:49 +07:00
if ( ! in_array ( $admin [ 'user_type' ], [ 'SuperAdmin' , 'Admin' ])) {
2024-03-14 12:14:11 +07:00
_alert ( Lang :: T ( 'You do not have permission to access this page' ), 'danger' , " dashboard " );
2024-02-16 14:52:49 +07:00
}
2024-02-12 11:35:59 +07:00
$cs = ORM :: for_table ( 'tbl_customers' )
2024-02-12 17:02:43 +07:00
-> select ( 'tbl_customers.id' , 'id' )
-> select ( 'tbl_customers.username' , 'username' )
2024-02-12 11:35:59 +07:00
-> select ( 'fullname' )
-> select ( 'phonenumber' )
-> select ( 'email' )
-> select ( 'balance' )
-> select ( 'namebp' )
-> select ( 'routers' )
-> select ( 'status' )
2024-02-12 17:02:43 +07:00
-> select ( 'method' , 'Payment' )
2024-02-12 11:35:59 +07:00
-> join ( 'tbl_user_recharges' , array ( 'tbl_customers.id' , '=' , 'tbl_user_recharges.customer_id' ))
-> order_by_asc ( 'tbl_customers.id' ) -> find_array ();
$h = false ;
set_time_limit ( - 1 );
header ( 'Pragma: public' );
header ( 'Expires: 0' );
header ( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
header ( " Content-type: text/csv " );
header ( 'Content-Disposition: attachment;filename="phpnuxbill_customers_' . date ( 'Y-m-d_H_i' ) . '.csv"' );
header ( 'Content-Transfer-Encoding: binary' );
foreach ( $cs as $c ) {
$ks = [];
$vs = [];
foreach ( $c as $k => $v ) {
$ks [] = $k ;
$vs [] = $v ;
}
2024-02-12 17:02:43 +07:00
if ( ! $h ) {
echo '"' . implode ( '";"' , $ks ) . " \" \n " ;
2024-02-12 11:35:59 +07:00
$h = true ;
}
2024-02-12 17:02:43 +07:00
echo '"' . implode ( '";"' , $vs ) . " \" \n " ;
2024-02-12 11:35:59 +07:00
}
break ;
2017-03-11 02:51:06 +07:00
case 'add' :
2024-03-14 12:14:11 +07:00
if ( ! in_array ( $admin [ 'user_type' ], [ 'SuperAdmin' , 'Admin' , 'Agent' , 'Sales' ])) {
_alert ( Lang :: T ( 'You do not have permission to access this page' ), 'danger' , " dashboard " );
2024-02-26 11:01:54 +07:00
}
2024-03-22 21:21:23 +07:00
$ui -> assign ( 'xheader' , $leafletpickerHeader );
2022-09-18 00:00:40 +07:00
run_hook ( 'view_add_customer' ); #HOOK
2017-03-11 02:51:06 +07:00
$ui -> display ( 'customers-add.tpl' );
break ;
2023-09-15 11:57:07 +07:00
case 'recharge' :
2024-03-14 12:14:11 +07:00
if ( ! in_array ( $admin [ 'user_type' ], [ 'SuperAdmin' , 'Admin' , 'Agent' , 'Sales' ])) {
_alert ( Lang :: T ( 'You do not have permission to access this page' ), 'danger' , " dashboard " );
2024-02-26 11:01:54 +07:00
}
2024-03-18 23:25:39 +03:00
$id_customer = $routes [ '2' ];
$plan_id = $routes [ '3' ];
2024-03-15 10:38:05 +07:00
$b = ORM :: for_table ( 'tbl_user_recharges' ) -> where ( 'customer_id' , $id_customer ) -> where ( 'plan_id' , $plan_id ) -> find_one ();
2023-09-15 11:57:07 +07:00
if ( $b ) {
2024-03-14 12:14:11 +07:00
$gateway = 'Recharge' ;
$channel = $admin [ 'fullname' ];
$cust = User :: _info ( $id_customer );
$plan = ORM :: for_table ( 'tbl_plans' ) -> find_one ( $b [ 'plan_id' ]);
2024-03-15 10:38:05 +07:00
list ( $bills , $add_cost ) = User :: getBills ( $id_customer );
2024-03-14 12:14:11 +07:00
if ( $using == 'balance' && $config [ 'enable_balance' ] == 'yes' ) {
if ( ! $cust ) {
2024-03-16 20:40:29 +07:00
r2 ( U . 'plan/recharge' , 'e' , Lang :: T ( 'Customer not found' ));
2024-03-14 12:14:11 +07:00
}
if ( ! $plan ) {
2024-03-16 20:40:29 +07:00
r2 ( U . 'plan/recharge' , 'e' , Lang :: T ( 'Plan not found' ));
2024-03-14 12:14:11 +07:00
}
if ( $cust [ 'balance' ] < ( $plan [ 'price' ] + $add_cost )) {
2024-03-16 20:40:29 +07:00
r2 ( U . 'plan/recharge' , 'e' , Lang :: T ( 'insufficient balance' ));
2024-03-14 12:14:11 +07:00
}
$gateway = 'Recharge Balance' ;
}
if ( $using == 'zero' ) {
$zero = 1 ;
$gateway = 'Recharge Zero' ;
2023-09-15 11:57:07 +07:00
}
2024-03-14 12:14:11 +07:00
$ui -> assign ( 'bills' , $bills );
$ui -> assign ( 'add_cost' , $add_cost );
$ui -> assign ( 'cust' , $cust );
$ui -> assign ( 'gateway' , $gateway );
$ui -> assign ( 'channel' , $channel );
$ui -> assign ( 'server' , $b [ 'routers' ]);
2024-03-14 13:40:44 +07:00
$ui -> assign ( 'using' , 'cash' );
2024-03-14 12:14:11 +07:00
$ui -> assign ( 'plan' , $plan );
$ui -> display ( 'recharge-confirm.tpl' );
2024-03-18 23:25:39 +03:00
} else {
2024-03-15 10:38:05 +07:00
r2 ( U . 'customers/view/' . $id_customer , 'e' , 'Cannot find active plan' );
2023-09-15 11:57:07 +07:00
}
2024-03-15 10:38:05 +07:00
break ;
2023-09-15 11:57:07 +07:00
case 'deactivate' :
2024-02-16 14:52:49 +07:00
if ( ! in_array ( $admin [ 'user_type' ], [ 'SuperAdmin' , 'Admin' ])) {
2024-03-14 12:14:11 +07:00
_alert ( Lang :: T ( 'You do not have permission to access this page' ), 'danger' , " dashboard " );
2024-02-16 14:52:49 +07:00
}
2024-03-18 23:25:39 +03:00
$id_customer = $routes [ '2' ];
$plan_id = $routes [ '3' ];
2024-03-15 10:38:05 +07:00
$b = ORM :: for_table ( 'tbl_user_recharges' ) -> where ( 'customer_id' , $id_customer ) -> where ( 'plan_id' , $plan_id ) -> find_one ();
2023-09-15 11:57:07 +07:00
if ( $b ) {
2024-03-15 10:38:05 +07:00
$p = ORM :: for_table ( 'tbl_plans' ) -> where ( 'id' , $b [ 'plan_id' ]) -> find_one ();
2023-10-04 15:41:48 +07:00
if ( $p ) {
if ( $p [ 'is_radius' ]) {
2023-10-04 16:11:55 +07:00
Radius :: customerDeactivate ( $b [ 'username' ]);
2023-10-04 15:41:48 +07:00
} else {
$mikrotik = Mikrotik :: info ( $b [ 'routers' ]);
$client = Mikrotik :: getClient ( $mikrotik [ 'ip_address' ], $mikrotik [ 'username' ], $mikrotik [ 'password' ]);
if ( $b [ 'type' ] == 'Hotspot' ) {
Mikrotik :: removeHotspotUser ( $client , $b [ 'username' ]);
Mikrotik :: removeHotspotActiveUser ( $client , $b [ 'username' ]);
} else if ( $b [ 'type' ] == 'PPPOE' ) {
Mikrotik :: removePpoeUser ( $client , $b [ 'username' ]);
Mikrotik :: removePpoeActive ( $client , $b [ 'username' ]);
}
}
$b -> status = 'off' ;
$b -> expiration = date ( 'Y-m-d' );
$b -> time = date ( 'H:i:s' );
$b -> save ();
_log ( 'Admin ' . $admin [ 'username' ] . ' Deactivate ' . $b [ 'namebp' ] . ' for ' . $b [ 'username' ], 'User' , $b [ 'customer_id' ]);
Message :: sendTelegram ( 'Admin ' . $admin [ 'username' ] . ' Deactivate ' . $b [ 'namebp' ] . ' for u' . $b [ 'username' ]);
r2 ( U . 'customers/view/' . $id_customer , 's' , 'Success deactivate customer to Mikrotik' );
2023-09-15 11:57:07 +07:00
}
}
r2 ( U . 'customers/view/' . $id_customer , 'e' , 'Cannot find active plan' );
break ;
2023-09-15 11:33:46 +07:00
case 'sync' :
2024-03-18 23:25:39 +03:00
$id_customer = $routes [ '2' ];
2024-03-15 10:38:05 +07:00
$bs = ORM :: for_table ( 'tbl_user_recharges' ) -> where ( 'customer_id' , $id_customer ) -> where ( 'status' , 'on' ) -> findMany ();
if ( $bs ) {
$routers = [];
foreach ( $bs as $b ) {
$c = ORM :: for_table ( 'tbl_customers' ) -> find_one ( $id_customer );
$p = ORM :: for_table ( 'tbl_plans' ) -> where ( 'id' , $b [ 'plan_id' ]) -> where ( 'enabled' , '1' ) -> find_one ();
if ( $p ) {
$routers [] = $b [ 'routers' ];
if ( $p [ 'is_radius' ]) {
Radius :: customerAddPlan ( $c , $p , $p [ 'expiration' ] . ' ' . $p [ 'time' ]);
} else {
$mikrotik = Mikrotik :: info ( $b [ 'routers' ]);
$client = Mikrotik :: getClient ( $mikrotik [ 'ip_address' ], $mikrotik [ 'username' ], $mikrotik [ 'password' ]);
if ( $b [ 'type' ] == 'Hotspot' ) {
Mikrotik :: addHotspotUser ( $client , $p , $c );
} else if ( $b [ 'type' ] == 'PPPOE' ) {
Mikrotik :: addPpoeUser ( $client , $p , $c );
}
2023-10-04 15:41:48 +07:00
}
2023-09-15 11:33:46 +07:00
}
}
2024-03-18 23:25:39 +03:00
r2 ( U . 'customers/view/' . $id_customer , 's' , 'Sync success to ' . implode ( " , " , $routers ));
2023-09-15 11:33:46 +07:00
}
2023-09-15 11:57:07 +07:00
r2 ( U . 'customers/view/' . $id_customer , 'e' , 'Cannot find active plan' );
2023-09-15 11:33:46 +07:00
break ;
2023-08-23 15:00:34 +07:00
case 'viewu' :
$customer = ORM :: for_table ( 'tbl_customers' ) -> where ( 'username' , $routes [ '2' ]) -> find_one ();
2023-08-21 17:09:44 +07:00
case 'view' :
2024-03-18 23:25:39 +03:00
$id = $routes [ '2' ];
2023-08-21 17:09:44 +07:00
run_hook ( 'view_customer' ); #HOOK
2023-09-15 11:57:07 +07:00
if ( ! $customer ) {
2023-08-23 15:00:34 +07:00
$customer = ORM :: for_table ( 'tbl_customers' ) -> find_one ( $id );
}
2023-08-21 17:09:44 +07:00
if ( $customer ) {
2024-02-17 19:30:35 +01:00
2024-02-19 09:29:11 +07:00
// Fetch the Customers Attributes values from the tbl_customer_custom_fields table
$customFields = ORM :: for_table ( 'tbl_customers_fields' )
2024-02-17 19:30:35 +01:00
-> where ( 'customer_id' , $customer [ 'id' ])
-> find_many ();
2024-03-18 23:25:39 +03:00
$v = $routes [ '3' ];
2024-03-26 14:39:28 +07:00
if ( empty ( $v )) {
2024-03-15 09:46:01 +07:00
$v = 'activation' ;
}
if ( $v == 'order' ) {
2023-08-21 17:09:44 +07:00
$v = 'order' ;
2024-03-26 14:39:28 +07:00
$query = ORM :: for_table ( 'tbl_transactions' ) -> where ( 'username' , $customer [ 'username' ]);
$paginator = Paginator :: generate ( $query );
$order = $query
2023-10-24 12:27:30 +07:00
-> offset ( $paginator [ 'startpoint' ])
-> limit ( $paginator [ 'limit' ])
2023-08-21 17:09:44 +07:00
-> order_by_desc ( 'id' )
-> find_many ();
2023-10-24 12:27:30 +07:00
$ui -> assign ( 'paginator' , $paginator );
2023-08-21 17:09:44 +07:00
$ui -> assign ( 'order' , $order );
2023-08-23 15:00:34 +07:00
} else if ( $v == 'activation' ) {
2024-03-26 14:39:28 +07:00
$query = ORM :: for_table ( 'tbl_transactions' ) -> where ( 'username' , $customer [ 'username' ]);
$paginator = Paginator :: generate ( $query );
$activation = $query -> offset ( $paginator [ 'startpoint' ])
2023-10-24 12:27:30 +07:00
-> limit ( $paginator [ 'limit' ])
2023-08-21 17:09:44 +07:00
-> order_by_desc ( 'id' )
-> find_many ();
2023-10-24 12:27:30 +07:00
$ui -> assign ( 'paginator' , $paginator );
2023-08-21 17:09:44 +07:00
$ui -> assign ( 'activation' , $activation );
}
2024-03-15 09:46:01 +07:00
$ui -> assign ( 'packages' , User :: _billing ( $customer [ 'id' ]));
2023-08-21 17:09:44 +07:00
$ui -> assign ( 'v' , $v );
$ui -> assign ( 'd' , $customer );
2024-02-17 19:30:35 +01:00
$ui -> assign ( 'customFields' , $customFields );
2024-03-23 12:56:25 +07:00
$ui -> assign ( 'xheader' , $leafletpickerHeader );
2023-08-21 17:09:44 +07:00
$ui -> display ( 'customers-view.tpl' );
} else {
r2 ( U . 'customers/list' , 'e' , $_L [ 'Account_Not_Found' ]);
}
break ;
2017-03-11 02:51:06 +07:00
case 'edit' :
2024-03-14 12:14:11 +07:00
if ( ! in_array ( $admin [ 'user_type' ], [ 'SuperAdmin' , 'Admin' , 'Agent' ])) {
_alert ( Lang :: T ( 'You do not have permission to access this page' ), 'danger' , " dashboard " );
2024-02-26 11:01:54 +07:00
}
2024-03-18 23:25:39 +03:00
$id = $routes [ '2' ];
2022-09-18 00:00:40 +07:00
run_hook ( 'edit_customer' ); #HOOK
2017-03-11 02:51:06 +07:00
$d = ORM :: for_table ( 'tbl_customers' ) -> find_one ( $id );
2024-02-19 09:29:11 +07:00
// Fetch the Customers Attributes values from the tbl_customers_fields table
$customFields = ORM :: for_table ( 'tbl_customers_fields' )
2024-02-17 19:30:35 +01:00
-> where ( 'customer_id' , $id )
-> find_many ();
2022-09-01 15:35:54 +07:00
if ( $d ) {
$ui -> assign ( 'd' , $d );
2024-02-17 19:30:35 +01:00
$ui -> assign ( 'customFields' , $customFields );
2024-03-22 21:21:23 +07:00
$ui -> assign ( 'xheader' , $leafletpickerHeader );
2017-03-11 02:51:06 +07:00
$ui -> display ( 'customers-edit.tpl' );
2022-09-01 15:35:54 +07:00
} else {
2017-03-11 02:51:06 +07:00
r2 ( U . 'customers/list' , 'e' , $_L [ 'Account_Not_Found' ]);
}
break ;
case 'delete' :
2024-02-16 14:52:49 +07:00
if ( ! in_array ( $admin [ 'user_type' ], [ 'SuperAdmin' , 'Admin' ])) {
2024-03-14 12:14:11 +07:00
_alert ( Lang :: T ( 'You do not have permission to access this page' ), 'danger' , " dashboard " );
2024-02-16 14:52:49 +07:00
}
2024-03-18 23:25:39 +03:00
$id = $routes [ '2' ];
2022-09-18 00:00:40 +07:00
run_hook ( 'delete_customer' ); #HOOK
2017-03-11 02:51:06 +07:00
$d = ORM :: for_table ( 'tbl_customers' ) -> find_one ( $id );
2022-09-01 15:35:54 +07:00
if ( $d ) {
2024-02-19 09:29:11 +07:00
// Delete the associated Customers Attributes records from tbl_customer_custom_fields table
ORM :: for_table ( 'tbl_customers_fields' ) -> where ( 'customer_id' , $id ) -> delete_many ();
2022-09-01 15:35:54 +07:00
$c = ORM :: for_table ( 'tbl_user_recharges' ) -> where ( 'username' , $d [ 'username' ]) -> find_one ();
if ( $c ) {
2023-10-04 15:41:48 +07:00
$p = ORM :: for_table ( 'tbl_plans' ) -> find_one ( $c [ 'plan_id' ]);
if ( $p [ 'is_radius' ]) {
Radius :: customerDelete ( $d [ 'username' ]);
} else {
$mikrotik = Mikrotik :: info ( $c [ 'routers' ]);
if ( $c [ 'type' ] == 'Hotspot' ) {
2022-09-18 00:52:39 +07:00
$client = Mikrotik :: getClient ( $mikrotik [ 'ip_address' ], $mikrotik [ 'username' ], $mikrotik [ 'password' ]);
2023-09-07 09:20:31 +07:00
Mikrotik :: removeHotspotUser ( $client , $d [ 'username' ]);
2023-09-13 09:37:05 +07:00
Mikrotik :: removeHotspotActiveUser ( $client , $d [ 'username' ]);
2023-10-04 15:41:48 +07:00
} else {
2022-09-18 00:52:39 +07:00
$client = Mikrotik :: getClient ( $mikrotik [ 'ip_address' ], $mikrotik [ 'username' ], $mikrotik [ 'password' ]);
2023-09-07 09:20:31 +07:00
Mikrotik :: removePpoeUser ( $client , $d [ 'username' ]);
2023-09-13 09:37:05 +07:00
Mikrotik :: removePpoeActive ( $client , $d [ 'username' ]);
2022-09-01 15:35:54 +07:00
}
2023-10-04 15:41:48 +07:00
try {
$d -> delete ();
} catch ( Exception $e ) {
} catch ( Throwable $e ) {
}
try {
$c -> delete ();
} catch ( Exception $e ) {
}
2022-09-01 15:35:54 +07:00
}
} else {
try {
$d -> delete ();
} catch ( Exception $e ) {
2023-08-21 17:09:44 +07:00
} catch ( Throwable $e ) {
2022-09-01 15:35:54 +07:00
}
try {
2024-03-18 23:25:39 +03:00
if ( $c )
$c -> delete ();
2022-09-01 15:35:54 +07:00
} catch ( Exception $e ) {
2023-08-21 17:09:44 +07:00
} catch ( Throwable $e ) {
2022-09-01 15:35:54 +07:00
}
}
2022-08-23 16:33:21 +07:00
2024-02-13 13:54:01 +07:00
r2 ( U . 'customers/list' , 's' , Lang :: T ( 'User deleted Successfully' ));
2017-03-11 02:51:06 +07:00
}
break ;
case 'add-post' :
$username = _post ( 'username' );
$fullname = _post ( 'fullname' );
$password = _post ( 'password' );
2023-08-14 13:21:41 +07:00
$pppoe_password = _post ( 'pppoe_password' );
2023-08-09 14:54:38 +07:00
$email = _post ( 'email' );
2023-12-19 09:55:55 +07:00
$address = _post ( 'address' );
2022-09-01 15:35:54 +07:00
$phonenumber = _post ( 'phonenumber' );
2023-12-14 03:21:55 +01:00
$service_type = _post ( 'service_type' );
2024-03-18 23:25:39 +03:00
$account_type = _post ( 'account_type' );
2024-03-19 00:59:34 +01:00
$coordinates = _post ( 'coordinates' );
2024-02-19 09:29:11 +07:00
//post Customers Attributes
2024-02-17 19:30:35 +01:00
$custom_field_names = ( array ) $_POST [ 'custom_field_name' ];
$custom_field_values = ( array ) $_POST [ 'custom_field_value' ];
2022-09-18 00:00:40 +07:00
run_hook ( 'add_customer' ); #HOOK
2017-03-11 02:51:06 +07:00
$msg = '' ;
2022-09-01 15:35:54 +07:00
if ( Validator :: Length ( $username , 35 , 2 ) == false ) {
$msg .= 'Username should be between 3 to 55 characters' . '<br>' ;
2017-03-11 02:51:06 +07:00
}
2022-09-01 15:35:54 +07:00
if ( Validator :: Length ( $fullname , 36 , 2 ) == false ) {
$msg .= 'Full Name should be between 3 to 25 characters' . '<br>' ;
2017-03-11 02:51:06 +07:00
}
2024-02-12 09:45:44 +07:00
if ( ! Validator :: Length ( $password , 36 , 2 )) {
2022-09-01 15:35:54 +07:00
$msg .= 'Password should be between 3 to 35 characters' . '<br>' ;
2017-03-11 02:51:06 +07:00
}
2022-09-01 15:35:54 +07:00
$d = ORM :: for_table ( 'tbl_customers' ) -> where ( 'username' , $username ) -> find_one ();
if ( $d ) {
2024-02-13 13:54:01 +07:00
$msg .= Lang :: T ( 'Account already axist' ) . '<br>' ;
2017-03-11 02:51:06 +07:00
}
2022-09-01 15:35:54 +07:00
if ( $msg == '' ) {
2017-03-11 02:51:06 +07:00
$d = ORM :: for_table ( 'tbl_customers' ) -> create ();
2023-08-09 14:54:38 +07:00
$d -> username = Lang :: phoneFormat ( $username );
2017-03-11 02:51:06 +07:00
$d -> password = $password ;
2023-08-14 13:21:41 +07:00
$d -> pppoe_password = $pppoe_password ;
2023-08-09 14:54:38 +07:00
$d -> email = $email ;
2024-03-18 23:25:39 +03:00
$d -> account_type = $account_type ;
2017-03-11 02:51:06 +07:00
$d -> fullname = $fullname ;
$d -> address = $address ;
2024-02-16 14:52:49 +07:00
$d -> created_by = $admin [ 'id' ];
2023-08-09 14:54:38 +07:00
$d -> phonenumber = Lang :: phoneFormat ( $phonenumber );
2023-12-14 03:21:55 +01:00
$d -> service_type = $service_type ;
2024-03-19 00:59:34 +01:00
$d -> coordinates = $coordinates ;
2017-03-11 02:51:06 +07:00
$d -> save ();
2024-02-17 19:30:35 +01:00
// Retrieve the customer ID of the newly created customer
$customerId = $d -> id ();
2024-02-19 09:29:11 +07:00
// Save Customers Attributes details
2024-03-26 14:39:28 +07:00
if ( ! empty ( $custom_field_names ) && ! empty ( $custom_field_values )) {
2024-02-17 19:30:35 +01:00
$totalFields = min ( count ( $custom_field_names ), count ( $custom_field_values ));
for ( $i = 0 ; $i < $totalFields ; $i ++ ) {
$name = $custom_field_names [ $i ];
$value = $custom_field_values [ $i ];
2024-03-26 14:39:28 +07:00
if ( ! empty ( $name )) {
2024-02-19 09:29:11 +07:00
$customField = ORM :: for_table ( 'tbl_customers_fields' ) -> create ();
2024-02-17 19:30:35 +01:00
$customField -> customer_id = $customerId ;
$customField -> field_name = $name ;
$customField -> field_value = $value ;
$customField -> save ();
}
}
}
2024-02-13 13:54:01 +07:00
r2 ( U . 'customers/list' , 's' , Lang :: T ( 'Account Created Successfully' ));
2022-09-01 15:35:54 +07:00
} else {
2017-03-11 02:51:06 +07:00
r2 ( U . 'customers/add' , 'e' , $msg );
}
break ;
case 'edit-post' :
2023-08-09 14:54:38 +07:00
$username = Lang :: phoneFormat ( _post ( 'username' ));
2017-03-11 02:51:06 +07:00
$fullname = _post ( 'fullname' );
2024-03-18 23:25:39 +03:00
$account_type = _post ( 'account_type' );
2017-03-11 02:51:06 +07:00
$password = _post ( 'password' );
2023-08-14 13:21:41 +07:00
$pppoe_password = _post ( 'pppoe_password' );
2023-08-09 14:54:38 +07:00
$email = _post ( 'email' );
2017-03-11 02:51:06 +07:00
$address = _post ( 'address' );
2023-08-09 14:54:38 +07:00
$phonenumber = Lang :: phoneFormat ( _post ( 'phonenumber' ));
2023-12-14 03:21:55 +01:00
$service_type = _post ( 'service_type' );
2024-03-19 00:59:34 +01:00
$coordinates = _post ( 'coordinates' );
2022-09-18 00:00:40 +07:00
run_hook ( 'edit_customer' ); #HOOK
2017-03-11 02:51:06 +07:00
$msg = '' ;
2024-02-12 09:45:44 +07:00
if ( Validator :: Length ( $username , 35 , 2 ) == false ) {
2022-09-01 15:35:54 +07:00
$msg .= 'Username should be between 3 to 15 characters' . '<br>' ;
2017-03-11 02:51:06 +07:00
}
2024-02-12 09:45:44 +07:00
if ( Validator :: Length ( $fullname , 36 , 1 ) == false ) {
2023-08-09 14:54:38 +07:00
$msg .= 'Full Name should be between 2 to 25 characters' . '<br>' ;
2017-03-11 02:51:06 +07:00
}
2022-09-01 15:35:54 +07:00
if ( $password != '' ) {
2024-02-12 09:45:44 +07:00
if ( ! Validator :: Length ( $password , 36 , 2 )) {
2022-09-01 15:35:54 +07:00
$msg .= 'Password should be between 3 to 15 characters' . '<br>' ;
2017-03-11 02:51:06 +07:00
}
}
$id = _post ( 'id' );
$d = ORM :: for_table ( 'tbl_customers' ) -> find_one ( $id );
2024-02-17 19:30:35 +01:00
2024-02-19 09:29:11 +07:00
//lets find user Customers Attributes using id
$customFields = ORM :: for_table ( 'tbl_customers_fields' )
2024-02-17 19:30:35 +01:00
-> where ( 'customer_id' , $id )
-> find_many ();
2022-09-01 15:35:54 +07:00
if ( ! $d ) {
2024-02-13 13:54:01 +07:00
$msg .= Lang :: T ( 'Data Not Found' ) . '<br>' ;
2017-03-11 02:51:06 +07:00
}
2023-10-04 15:41:48 +07:00
$oldusername = $d [ 'username' ];
2024-03-18 23:25:39 +03:00
$oldPppoePassword = $d [ 'password' ];
$oldPassPassword = $d [ 'pppoe_password' ];
2023-10-04 15:41:48 +07:00
$userDiff = false ;
$pppoeDiff = false ;
$passDiff = false ;
if ( $oldusername != $username ) {
2022-09-01 15:35:54 +07:00
$c = ORM :: for_table ( 'tbl_customers' ) -> where ( 'username' , $username ) -> find_one ();
if ( $c ) {
2024-02-17 19:30:35 +01:00
$msg .= Lang :: T ( 'Account already exist' ) . '<br>' ;
2017-03-11 02:51:06 +07:00
}
2023-10-04 15:41:48 +07:00
$userDiff = true ;
}
if ( $oldPppoePassword != $pppoe_password ) {
$pppoeDiff = true ;
}
if ( $password != '' && $oldPassPassword != $password ) {
$passDiff = true ;
2017-03-11 02:51:06 +07:00
}
2022-09-01 15:35:54 +07:00
if ( $msg == '' ) {
2023-10-04 15:41:48 +07:00
if ( $userDiff ) {
$d -> username = $username ;
}
if ( $password != '' ) {
$d -> password = $password ;
}
$d -> pppoe_password = $pppoe_password ;
$d -> fullname = $fullname ;
$d -> email = $email ;
2024-03-18 23:25:39 +03:00
$d -> account_type = $account_type ;
2023-10-04 15:41:48 +07:00
$d -> address = $address ;
$d -> phonenumber = $phonenumber ;
2023-12-14 03:21:55 +01:00
$d -> service_type = $service_type ;
2024-03-19 00:59:34 +01:00
$d -> coordinates = $coordinates ;
2023-10-04 15:41:48 +07:00
$d -> save ();
2024-02-17 19:30:35 +01:00
2024-02-19 09:29:11 +07:00
// Update Customers Attributes values in tbl_customers_fields table
2024-02-17 19:30:35 +01:00
foreach ( $customFields as $customField ) {
$fieldName = $customField [ 'field_name' ];
2024-03-26 14:39:28 +07:00
if ( isset ( $_POST [ 'custom_fields' ][ $fieldName ])) {
2024-02-17 19:30:35 +01:00
$customFieldValue = $_POST [ 'custom_fields' ][ $fieldName ];
$customField -> set ( 'field_value' , $customFieldValue );
$customField -> save ();
}
2024-02-18 04:56:30 +01:00
}
2024-02-19 09:29:11 +07:00
// Add new Customers Attributess
2024-03-26 14:39:28 +07:00
if ( isset ( $_POST [ 'custom_field_name' ]) && isset ( $_POST [ 'custom_field_value' ])) {
2024-02-18 04:56:30 +01:00
$newCustomFieldNames = $_POST [ 'custom_field_name' ];
$newCustomFieldValues = $_POST [ 'custom_field_value' ];
// Check if the number of field names and values match
if ( count ( $newCustomFieldNames ) == count ( $newCustomFieldValues )) {
$numNewFields = count ( $newCustomFieldNames );
for ( $i = 0 ; $i < $numNewFields ; $i ++ ) {
$fieldName = $newCustomFieldNames [ $i ];
$fieldValue = $newCustomFieldValues [ $i ];
2024-02-17 19:30:35 +01:00
2024-02-19 09:29:11 +07:00
// Insert the new Customers Attributes
$newCustomField = ORM :: for_table ( 'tbl_customers_fields' ) -> create ();
2024-02-18 04:56:30 +01:00
$newCustomField -> set ( 'customer_id' , $id );
$newCustomField -> set ( 'field_name' , $fieldName );
$newCustomField -> set ( 'field_value' , $fieldValue );
$newCustomField -> save ();
2024-02-17 19:30:35 +01:00
}
}
}
2024-02-19 09:29:11 +07:00
// Delete Customers Attributess
2024-03-26 14:39:28 +07:00
if ( isset ( $_POST [ 'delete_custom_fields' ])) {
2024-02-18 04:56:30 +01:00
$fieldsToDelete = $_POST [ 'delete_custom_fields' ];
foreach ( $fieldsToDelete as $fieldName ) {
2024-02-19 09:29:11 +07:00
// Delete the Customers Attributes with the given field name
ORM :: for_table ( 'tbl_customers_fields' )
2024-02-18 04:56:30 +01:00
-> where ( 'field_name' , $fieldName )
2024-03-08 10:43:07 +01:00
-> where ( 'customer_id' , $id )
2024-02-18 04:56:30 +01:00
-> delete_many ();
}
}
2023-10-04 15:41:48 +07:00
if ( $userDiff || $pppoeDiff || $passDiff ) {
$c = ORM :: for_table ( 'tbl_user_recharges' ) -> where ( 'username' , ( $userDiff ) ? $oldusername : $username ) -> find_one ();
if ( $c ) {
$c -> username = $username ;
$c -> save ();
$p = ORM :: for_table ( 'tbl_plans' ) -> find_one ( $c [ 'plan_id' ]);
if ( $p [ 'is_radius' ]) {
2024-02-12 17:02:43 +07:00
if ( $userDiff ) {
2023-10-04 15:41:48 +07:00
Radius :: customerChangeUsername ( $oldusername , $username );
}
2024-02-12 17:02:43 +07:00
Radius :: customerAddPlan ( $d , $p , $p [ 'expiration' ] . ' ' . $p [ 'time' ]);
} else {
2023-10-04 15:41:48 +07:00
$mikrotik = Mikrotik :: info ( $c [ 'routers' ]);
if ( $c [ 'type' ] == 'Hotspot' ) {
$client = Mikrotik :: getClient ( $mikrotik [ 'ip_address' ], $mikrotik [ 'username' ], $mikrotik [ 'password' ]);
Mikrotik :: setHotspotUser ( $client , $c [ 'username' ], $password );
Mikrotik :: removeHotspotActiveUser ( $client , $d [ 'username' ]);
2023-08-21 17:09:44 +07:00
} else {
2023-10-04 15:41:48 +07:00
$client = Mikrotik :: getClient ( $mikrotik [ 'ip_address' ], $mikrotik [ 'username' ], $mikrotik [ 'password' ]);
2024-03-26 14:39:28 +07:00
if ( ! empty ( $d [ 'pppoe_password' ])) {
2023-10-04 15:41:48 +07:00
Mikrotik :: setPpoeUser ( $client , $c [ 'username' ], $d [ 'pppoe_password' ]);
} else {
Mikrotik :: setPpoeUser ( $client , $c [ 'username' ], $password );
}
Mikrotik :: removePpoeActive ( $client , $d [ 'username' ]);
2023-08-14 13:21:41 +07:00
}
2022-09-01 15:35:54 +07:00
}
}
}
2024-03-14 12:14:11 +07:00
r2 ( U . 'customers/view/' . $id , 's' , 'User Updated Successfully' );
2022-09-01 15:35:54 +07:00
} else {
r2 ( U . 'customers/edit/' . $id , 'e' , $msg );
2017-03-11 02:51:06 +07:00
}
break ;
default :
2024-03-26 14:39:28 +07:00
$search = _post ( 'search' );
run_hook ( 'list_customers' ); #HOOK
if ( $search != '' ) {
$query = ORM :: for_table ( 'tbl_customers' ) -> where_raw ( " (`username` LIKE '% $search %' OR `fullname` LIKE '% $search %' OR `phonenumber` LIKE '% $search %' OR `email` LIKE '% $search %') " );
$paginator = Paginator :: generate ( $query , [ 'search' => $search ]);
$d = $query -> offset ( $paginator [ 'startpoint' ])
-> limit ( $paginator [ 'limit' ])
-> order_by_asc ( 'username' )
-> find_many ();
} else {
$query = ORM :: for_table ( 'tbl_customers' );
$paginator = Paginator :: generate ( $query );
$d = ORM :: for_table ( 'tbl_customers' )
-> offset ( $paginator [ 'startpoint' ]) -> limit ( $paginator [ 'limit' ]) -> order_by_desc ( 'id' ) -> find_many ();
}
$ui -> assign ( 'search' , htmlspecialchars ( $search ));
$ui -> assign ( 'd' , $d );
$ui -> assign ( 'paginator' , $paginator );
$ui -> display ( 'customers.tpl' );
break ;
2022-09-01 15:35:54 +07:00
}