2017-03-11 03:51:06 +08:00
< ? php
2022-09-01 16:35:54 +08:00
2017-03-11 03:51:06 +08:00
/**
2022-10-16 15:50:24 +08:00
* PHP Mikrotik Billing ( https :// github . com / hotspotbilling / phpnuxbill / )
2017-03-24 14:26:14 +08:00
2022-09-01 16:35:54 +08:00
**/
2017-03-11 03:51:06 +08:00
_admin ();
2022-10-13 15:00:54 +08:00
$ui -> assign ( '_title' , $_L [ 'Customers' ]);
2017-03-11 03:51:06 +08:00
$ui -> assign ( '_system_menu' , 'customers' );
$action = $routes [ '1' ];
$admin = Admin :: _info ();
$ui -> assign ( '_admin' , $admin );
2022-09-01 16:35:54 +08:00
if ( $admin [ 'user_type' ] != 'Admin' and $admin [ 'user_type' ] != 'Sales' ) {
r2 ( U . " dashboard " , 'e' , $_L [ 'Do_Not_Access' ]);
2017-03-11 03:51:06 +08:00
}
switch ( $action ) {
case 'list' :
$ui -> assign ( 'xfooter' , '<script type="text/javascript" src="ui/lib/c/customers.js"></script>' );
2023-06-15 17:46:36 +08:00
$search = _post ( 'search' );
2022-09-18 01:00:40 +08:00
run_hook ( 'list_customers' ); #HOOK
2023-06-15 17:46:36 +08:00
if ( $search != '' ) {
2023-08-23 16:00:34 +08:00
$paginator = Paginator :: bootstrapRaw ( 'tbl_customers' , " (`username` LIKE '% $search %' OR `fullname` LIKE '% $search %' OR `phonenumber` LIKE '% $search %' OR `email` LIKE '% $search %') " , [ $search , $search , $search , $search ]);
2023-06-15 17:46:36 +08:00
$d = ORM :: for_table ( 'tbl_customers' )
2023-08-23 16:00:34 +08:00
-> where_raw ( " (`username` LIKE '% $search %' OR `fullname` LIKE '% $search %' OR `phonenumber` LIKE '% $search %' OR `email` LIKE '% $search %') " , [ $search , $search , $search , $search ])
2023-08-21 18:09:44 +08:00
-> offset ( $paginator [ 'startpoint' ])
-> limit ( $paginator [ 'limit' ])
-> order_by_desc ( 'id' ) -> find_many ();
2022-09-01 16:35:54 +08:00
} else {
$paginator = Paginator :: bootstrap ( 'tbl_customers' );
2023-09-07 11:54:20 +08:00
$d = ORM :: for_table ( 'tbl_customers' )
2023-09-15 12:57:07 +08:00
-> offset ( $paginator [ 'startpoint' ]) -> limit ( $paginator [ 'limit' ]) -> order_by_desc ( 'id' ) -> find_many ();
2022-09-01 16:35:54 +08:00
}
2023-06-15 17:46:36 +08:00
$ui -> assign ( 'search' , htmlspecialchars ( $search ));
2022-09-01 16:35:54 +08:00
$ui -> assign ( 'd' , $d );
$ui -> assign ( 'paginator' , $paginator );
2017-03-11 03:51:06 +08:00
$ui -> display ( 'customers.tpl' );
break ;
case 'add' :
2022-09-18 01:00:40 +08:00
run_hook ( 'view_add_customer' ); #HOOK
2017-03-11 03:51:06 +08:00
$ui -> display ( 'customers-add.tpl' );
break ;
2023-09-15 12:57:07 +08:00
case 'recharge' :
$id_customer = $routes [ '2' ];
$b = ORM :: for_table ( 'tbl_user_recharges' ) -> where ( 'customer_id' , $id_customer ) -> find_one ();
if ( $b ) {
if ( Package :: rechargeUser ( $id_customer , $b [ 'routers' ], $b [ 'plan_id' ], " Recharge " , $admin [ 'fullname' ])) {
r2 ( U . 'customers/view/' . $id_customer , 's' , 'Success Recharge Customer' );
} else {
r2 ( U . 'customers/view/' . $id_customer , 'e' , 'Customer plan is inactive' );
}
}
r2 ( U . 'customers/view/' . $id_customer , 'e' , 'Cannot find active plan' );
case 'deactivate' :
$id_customer = $routes [ '2' ];
$b = ORM :: for_table ( 'tbl_user_recharges' ) -> where ( 'customer_id' , $id_customer ) -> find_one ();
if ( $b ) {
2023-10-04 16:41:48 +08:00
$p = ORM :: for_table ( 'tbl_plans' ) -> where ( 'id' , $b [ 'plan_id' ]) -> where ( 'enabled' , '1' ) -> find_one ();
if ( $p ) {
if ( $p [ 'is_radius' ]) {
//TODO: disconnect using radius
Radius :: customerDeactivate ( ORM :: for_table ( 'tbl_customers' ) -> find_one ( $id_customer ));
} 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 12:57:07 +08:00
}
}
r2 ( U . 'customers/view/' . $id_customer , 'e' , 'Cannot find active plan' );
break ;
2023-09-15 12:33:46 +08:00
case 'sync' :
$id_customer = $routes [ '2' ];
$b = ORM :: for_table ( 'tbl_user_recharges' ) -> where ( 'customer_id' , $id_customer ) -> where ( 'status' , 'on' ) -> find_one ();
2023-09-15 12:57:07 +08:00
if ( $b ) {
2023-09-15 12:33:46 +08:00
$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 ();
2023-09-15 12:57:07 +08:00
if ( $p ) {
2023-10-04 16:41:48 +08:00
if ( $p [ 'is_radius' ]) {
Radius :: customerAddPlan ( $c , $p );
r2 ( U . 'customers/view/' . $id_customer , 's' , 'Success sync customer to Radius' );
} 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 );
}
r2 ( U . 'customers/view/' . $id_customer , 's' , 'Success sync customer to Mikrotik' );
2023-09-15 12:33:46 +08:00
}
2023-09-15 12:57:07 +08:00
} else {
r2 ( U . 'customers/view/' . $id_customer , 'e' , 'Customer plan is inactive' );
2023-09-15 12:33:46 +08:00
}
}
2023-09-15 12:57:07 +08:00
r2 ( U . 'customers/view/' . $id_customer , 'e' , 'Cannot find active plan' );
2023-09-15 12:33:46 +08:00
break ;
2023-08-23 16:00:34 +08:00
case 'viewu' :
$customer = ORM :: for_table ( 'tbl_customers' ) -> where ( 'username' , $routes [ '2' ]) -> find_one ();
2023-08-21 18:09:44 +08:00
case 'view' :
$id = $routes [ '2' ];
run_hook ( 'view_customer' ); #HOOK
2023-09-15 12:57:07 +08:00
if ( ! $customer ) {
2023-08-23 16:00:34 +08:00
$customer = ORM :: for_table ( 'tbl_customers' ) -> find_one ( $id );
}
2023-08-21 18:09:44 +08:00
if ( $customer ) {
$v = $routes [ '3' ];
if ( empty ( $v ) || $v == 'order' ) {
$v = 'order' ;
// $paginator = Paginator::bootstrap('tbl_payment_gateway', 'username', $customer['username']);
// print_r($paginator);
$order = ORM :: for_table ( 'tbl_payment_gateway' )
-> where ( 'username' , $customer [ 'username' ])
-> offset ( 0 )
-> limit ( 30 )
-> order_by_desc ( 'id' )
-> find_many ();
// $ui->assign('paginator', $paginator);
$ui -> assign ( 'order' , $order );
2023-08-23 16:00:34 +08:00
} else if ( $v == 'activation' ) {
2023-08-21 18:09:44 +08:00
// $paginator = Paginator::bootstrap('tbl_transactions', 'username', $customer['username']);
$activation = ORM :: for_table ( 'tbl_transactions' )
-> where ( 'username' , $customer [ 'username' ])
-> offset ( 0 )
-> limit ( 30 )
-> order_by_desc ( 'id' )
-> find_many ();
// $ui->assign('paginator', $paginator);
$ui -> assign ( 'activation' , $activation );
}
2023-09-15 12:57:07 +08:00
$package = ORM :: for_table ( 'tbl_user_recharges' ) -> where ( 'username' , $customer [ 'username' ]) -> find_one ();
2023-08-23 16:00:34 +08:00
$ui -> assign ( 'package' , $package );
2023-08-21 18:09:44 +08:00
$ui -> assign ( 'v' , $v );
$ui -> assign ( 'd' , $customer );
$ui -> display ( 'customers-view.tpl' );
} else {
r2 ( U . 'customers/list' , 'e' , $_L [ 'Account_Not_Found' ]);
}
break ;
2017-03-11 03:51:06 +08:00
case 'edit' :
$id = $routes [ '2' ];
2022-09-18 01:00:40 +08:00
run_hook ( 'edit_customer' ); #HOOK
2017-03-11 03:51:06 +08:00
$d = ORM :: for_table ( 'tbl_customers' ) -> find_one ( $id );
2022-09-01 16:35:54 +08:00
if ( $d ) {
$ui -> assign ( 'd' , $d );
2017-03-11 03:51:06 +08:00
$ui -> display ( 'customers-edit.tpl' );
2022-09-01 16:35:54 +08:00
} else {
2017-03-11 03:51:06 +08:00
r2 ( U . 'customers/list' , 'e' , $_L [ 'Account_Not_Found' ]);
}
break ;
case 'delete' :
$id = $routes [ '2' ];
2022-09-18 01:00:40 +08:00
run_hook ( 'delete_customer' ); #HOOK
2017-03-11 03:51:06 +08:00
$d = ORM :: for_table ( 'tbl_customers' ) -> find_one ( $id );
2022-09-01 16:35:54 +08:00
if ( $d ) {
$c = ORM :: for_table ( 'tbl_user_recharges' ) -> where ( 'username' , $d [ 'username' ]) -> find_one ();
if ( $c ) {
2023-10-04 16:41:48 +08: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 01:52:39 +08:00
$client = Mikrotik :: getClient ( $mikrotik [ 'ip_address' ], $mikrotik [ 'username' ], $mikrotik [ 'password' ]);
2023-09-07 10:20:31 +08:00
Mikrotik :: removeHotspotUser ( $client , $d [ 'username' ]);
2023-09-13 10:37:05 +08:00
Mikrotik :: removeHotspotActiveUser ( $client , $d [ 'username' ]);
2023-10-04 16:41:48 +08:00
} else {
2022-09-18 01:52:39 +08:00
$client = Mikrotik :: getClient ( $mikrotik [ 'ip_address' ], $mikrotik [ 'username' ], $mikrotik [ 'password' ]);
2023-09-07 10:20:31 +08:00
Mikrotik :: removePpoeUser ( $client , $d [ 'username' ]);
2023-09-13 10:37:05 +08:00
Mikrotik :: removePpoeActive ( $client , $d [ 'username' ]);
2022-09-01 16:35:54 +08:00
}
2023-10-04 16:41:48 +08:00
try {
$d -> delete ();
} catch ( Exception $e ) {
} catch ( Throwable $e ) {
}
try {
$c -> delete ();
} catch ( Exception $e ) {
}
2022-09-01 16:35:54 +08:00
}
} else {
try {
$d -> delete ();
} catch ( Exception $e ) {
2023-08-21 18:09:44 +08:00
} catch ( Throwable $e ) {
2022-09-01 16:35:54 +08:00
}
try {
$c -> delete ();
} catch ( Exception $e ) {
2023-08-21 18:09:44 +08:00
} catch ( Throwable $e ) {
2022-09-01 16:35:54 +08:00
}
}
2022-08-23 17:33:21 +08:00
2017-03-11 03:51:06 +08:00
r2 ( U . 'customers/list' , 's' , $_L [ 'User_Delete_Ok' ]);
}
break ;
case 'add-post' :
$username = _post ( 'username' );
$fullname = _post ( 'fullname' );
$password = _post ( 'password' );
2023-08-14 14:21:41 +08:00
$pppoe_password = _post ( 'pppoe_password' );
2023-08-09 15:54:38 +08:00
$email = _post ( 'email' );
2017-03-11 03:51:06 +08:00
$address = _post ( 'address' );
2022-09-01 16:35:54 +08:00
$phonenumber = _post ( 'phonenumber' );
2022-09-18 01:00:40 +08:00
run_hook ( 'add_customer' ); #HOOK
2017-03-11 03:51:06 +08:00
$msg = '' ;
2022-09-01 16:35:54 +08:00
if ( Validator :: Length ( $username , 35 , 2 ) == false ) {
$msg .= 'Username should be between 3 to 55 characters' . '<br>' ;
2017-03-11 03:51:06 +08:00
}
2022-09-01 16:35:54 +08:00
if ( Validator :: Length ( $fullname , 36 , 2 ) == false ) {
$msg .= 'Full Name should be between 3 to 25 characters' . '<br>' ;
2017-03-11 03:51:06 +08:00
}
2022-09-01 16:35:54 +08:00
if ( ! Validator :: Length ( $password , 35 , 2 )) {
$msg .= 'Password should be between 3 to 35 characters' . '<br>' ;
2017-03-11 03:51:06 +08:00
}
2022-09-01 16:35:54 +08:00
$d = ORM :: for_table ( 'tbl_customers' ) -> where ( 'username' , $username ) -> find_one ();
if ( $d ) {
$msg .= $_L [ 'account_already_exist' ] . '<br>' ;
2017-03-11 03:51:06 +08:00
}
2022-09-01 16:35:54 +08:00
if ( $msg == '' ) {
2017-03-11 03:51:06 +08:00
$d = ORM :: for_table ( 'tbl_customers' ) -> create ();
2023-08-09 15:54:38 +08:00
$d -> username = Lang :: phoneFormat ( $username );
2017-03-11 03:51:06 +08:00
$d -> password = $password ;
2023-08-14 14:21:41 +08:00
$d -> pppoe_password = $pppoe_password ;
2023-08-09 15:54:38 +08:00
$d -> email = $email ;
2017-03-11 03:51:06 +08:00
$d -> fullname = $fullname ;
$d -> address = $address ;
2023-08-09 15:54:38 +08:00
$d -> phonenumber = Lang :: phoneFormat ( $phonenumber );
2017-03-11 03:51:06 +08:00
$d -> save ();
r2 ( U . 'customers/list' , 's' , $_L [ 'account_created_successfully' ]);
2022-09-01 16:35:54 +08:00
} else {
2017-03-11 03:51:06 +08:00
r2 ( U . 'customers/add' , 'e' , $msg );
}
break ;
case 'edit-post' :
2023-08-09 15:54:38 +08:00
$username = Lang :: phoneFormat ( _post ( 'username' ));
2017-03-11 03:51:06 +08:00
$fullname = _post ( 'fullname' );
$password = _post ( 'password' );
2023-08-14 14:21:41 +08:00
$pppoe_password = _post ( 'pppoe_password' );
2023-08-09 15:54:38 +08:00
$email = _post ( 'email' );
2017-03-11 03:51:06 +08:00
$address = _post ( 'address' );
2023-08-09 15:54:38 +08:00
$phonenumber = Lang :: phoneFormat ( _post ( 'phonenumber' ));
2022-09-18 01:00:40 +08:00
run_hook ( 'edit_customer' ); #HOOK
2017-03-11 03:51:06 +08:00
$msg = '' ;
2022-09-01 16:35:54 +08:00
if ( Validator :: Length ( $username , 16 , 2 ) == false ) {
$msg .= 'Username should be between 3 to 15 characters' . '<br>' ;
2017-03-11 03:51:06 +08:00
}
2023-08-09 15:54:38 +08:00
if ( Validator :: Length ( $fullname , 26 , 1 ) == false ) {
$msg .= 'Full Name should be between 2 to 25 characters' . '<br>' ;
2017-03-11 03:51:06 +08:00
}
2022-09-01 16:35:54 +08:00
if ( $password != '' ) {
if ( ! Validator :: Length ( $password , 15 , 2 )) {
$msg .= 'Password should be between 3 to 15 characters' . '<br>' ;
2017-03-11 03:51:06 +08:00
}
}
$id = _post ( 'id' );
$d = ORM :: for_table ( 'tbl_customers' ) -> find_one ( $id );
2022-09-01 16:35:54 +08:00
if ( ! $d ) {
$msg .= $_L [ 'Data_Not_Found' ] . '<br>' ;
2017-03-11 03:51:06 +08:00
}
2023-10-04 16:41:48 +08:00
$oldusername = $d [ 'username' ];
$oldPppoePassword = $d [ 'password' ];
$oldPassPassword = $d [ 'pppoe_password' ];
$userDiff = false ;
$pppoeDiff = false ;
$passDiff = false ;
if ( $oldusername != $username ) {
2022-09-01 16:35:54 +08:00
$c = ORM :: for_table ( 'tbl_customers' ) -> where ( 'username' , $username ) -> find_one ();
if ( $c ) {
$msg .= $_L [ 'account_already_exist' ] . '<br>' ;
2017-03-11 03:51:06 +08:00
}
2023-10-04 16:41:48 +08:00
$userDiff = true ;
}
if ( $oldPppoePassword != $pppoe_password ) {
$pppoeDiff = true ;
}
if ( $password != '' && $oldPassPassword != $password ) {
$passDiff = true ;
2017-03-11 03:51:06 +08:00
}
2022-09-01 16:35:54 +08:00
if ( $msg == '' ) {
2023-10-04 16:41:48 +08:00
if ( $userDiff ) {
$d -> username = $username ;
}
if ( $password != '' ) {
$d -> password = $password ;
}
$d -> pppoe_password = $pppoe_password ;
$d -> fullname = $fullname ;
$d -> email = $email ;
$d -> address = $address ;
$d -> phonenumber = $phonenumber ;
$d -> save ();
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' ]) {
if ( $userDiff ){
Radius :: customerChangeUsername ( $oldusername , $username );
}
Radius :: customerAddPlan ( $d , $p );
} else {
$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 18:09:44 +08:00
} else {
2023-10-04 16:41:48 +08:00
$client = Mikrotik :: getClient ( $mikrotik [ 'ip_address' ], $mikrotik [ 'username' ], $mikrotik [ 'password' ]);
if ( ! empty ( $d [ 'pppoe_password' ])) {
Mikrotik :: setPpoeUser ( $client , $c [ 'username' ], $d [ 'pppoe_password' ]);
} else {
Mikrotik :: setPpoeUser ( $client , $c [ 'username' ], $password );
}
Mikrotik :: removePpoeActive ( $client , $d [ 'username' ]);
2023-08-14 14:21:41 +08:00
}
2022-09-01 16:35:54 +08:00
}
}
}
2017-03-11 03:51:06 +08:00
r2 ( U . 'customers/list' , 's' , 'User Updated Successfully' );
2022-09-01 16:35:54 +08:00
} else {
r2 ( U . 'customers/edit/' . $id , 'e' , $msg );
2017-03-11 03:51:06 +08:00
}
break ;
default :
2023-08-21 18:09:44 +08:00
r2 ( U . 'customers/list' , 'e' , 'action not defined' );
2022-09-01 16:35:54 +08:00
}