diff --git a/.env.example b/.env.example index a42d7e0..c3461f5 100644 --- a/.env.example +++ b/.env.example @@ -51,3 +51,16 @@ PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" + +BILLPLZ_PRODUCTION_API_KEY="f3e82fe1-a422-4660-97f0-65cc59ff6c47" +BILLPLZ_PRODUCTION_X_SIGNATURE="S-alZUbzmD2_TF3vmrRqgehQ" +BILLPLZ_PRODUCTION_COLLECTION_ID="5aosv2dg" + +BILLPLZ_SANDBOX_API_KEY="abecfd0c-98d8-4635-abc2-2fcba8c60c11" +BILLPLZ_SANDBOX_X_SIGNATURE="S-GWr7z03XjAhqPsFfu_H5nQ" +BILLPLZ_SANDBOX_COLLECTION_ID="z0r4kjhi" + +BILLPLZ_SANDBOX_KOPKB_API_KEY="abecfd0c-98d8-4635-abc2-2fcba8c60c11" +BILLPLZ_SANDBOX_KOPKB_X_SIGNATURE="S-GWr7z03XjAhqPsFfu_H5nQ" +BILLPLZ_SANDBOX_KOPKB_COLLECTION_ID="uae40muk" + diff --git a/app/Console/Commands/DeleteCarts.php b/app/Console/Commands/DeleteCarts.php new file mode 100644 index 0000000..c674a95 --- /dev/null +++ b/app/Console/Commands/DeleteCarts.php @@ -0,0 +1,53 @@ +onlyTrashed()->forceDelete(); + Log::info('All carts have been deleted.'); + $this->info('All carts have been deleted.'); + }catch(\Exception $e){ + Log::error('Error deleting carts: ' . $e->getMessage()); + $this->error('Error deleting carts: ' . $e->getMessage()); + return 1; + } + + } +} diff --git a/app/Console/Commands/UpdateTransactionMaster.php b/app/Console/Commands/UpdateTransactionMaster.php index 37866db..1d84f4d 100644 --- a/app/Console/Commands/UpdateTransactionMaster.php +++ b/app/Console/Commands/UpdateTransactionMaster.php @@ -40,11 +40,18 @@ class UpdateTransactionMaster extends Command public function handle() { $updateOnline = Http::arrahn()->get('/api/transaction/online/update')->json(); - + $updateOnline_Koop = Http::arrahn_koop()->get('/api/transaction/online/update')->json(); + if($updateOnline == 'success'){ return 0; }else{ - Log::error('Update transaction master failed'); + Log::error('PKB::Update transaction master failed'); + } + + if($updateOnline_Koop == 'success'){ + return 0; + }else{ + Log::error('KOOP::Update transaction master failed'); } } } diff --git a/app/Console/Commands/updateUnsuccess.php b/app/Console/Commands/updateUnsuccess.php index e2dd207..3479973 100644 --- a/app/Console/Commands/updateUnsuccess.php +++ b/app/Console/Commands/updateUnsuccess.php @@ -2,9 +2,11 @@ namespace App\Console\Commands; +use App\Models\CompanyStatus; use App\Models\TransactionOnlineStatus; use App\Services\BillplzService; use App\Services\OnlineTransactionLoggerService; +use Billplz\Base\Bill; use Illuminate\Support\Facades\Http; use Illuminate\Console\Command; @@ -29,12 +31,21 @@ class UpdateUnsuccess extends Command * * @return int */ - public function handle(BillplzService $billplzService) + public function handle() { - $getFailedOnlineTransaction = fn() => Http::arrahn()->get('/api/transaction/online/unsuccessful')->json(); - + $getFailedOnlineTransaction_Koop = fn() => Http::arrahn_koop()->get('/api/transaction/online/unsuccessful')->json(); + $FailedBillplzID = array_map(fn($x) => $x['billplz_id'], $getFailedOnlineTransaction()); + $FailedBillplzID_Koop = array_map(fn($x) => $x['billplz_id'], $getFailedOnlineTransaction_Koop()); + + $this->resolve_payment($FailedBillplzID,CompanyStatus::COM_PKB); + $this->resolve_payment($FailedBillplzID_Koop,CompanyStatus::COM_KOOPPKB); + + } + public function resolve_payment($FailedBillplzID,$company) + { + $billplzService = new BillplzService($company); if(sizeof($FailedBillplzID) < 0){ return; @@ -59,7 +70,13 @@ class UpdateUnsuccess extends Command ]; try { - $response = Http::arrahn()->put('/api/transaction/online/unsuccesfull/update', $transactionData); + + $CallableHttp = $company == CompanyStatus::COM_PKB + ? Http::arrahn() + : Http::arrahn_koop(); + + $response = $CallableHttp->put('/api/transaction/online/unsuccesfull/update', $transactionData); + OnlineTransactionLoggerService::logs($transaction['bill_id'], $transactionData, $response, TransactionOnlineStatus::UPDATE_UNSUCCESSFUL_TRANSACTION ); } catch (\Exception $e) { diff --git a/app/Http/Controllers/BayaranController.php b/app/Http/Controllers/BayaranController.php index 4ff0151..4e39014 100644 --- a/app/Http/Controllers/BayaranController.php +++ b/app/Http/Controllers/BayaranController.php @@ -3,6 +3,8 @@ namespace App\Http\Controllers; use App\Http\Requests\PaymentRequest; +use App\Models\CompanyStatus; +use App\Models\PersonalCarts; use App\Models\TransactionOnlineStatus; use App\Services\BillplzService; use Carbon\Carbon; @@ -13,25 +15,60 @@ use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Money\Money; use App\Services\OnlineTransactionLoggerService; +use Illuminate\Support\Facades\Session; class BayaranController extends Controller { + public $CallableHttp; + public function PembayaranAction(PaymentRequest $request) { - $request->validated(); + + $exist_carts = $this->checkCarts(); + $exist_carts = optional($exist_carts)->toArray(); + + if($exist_carts){ + /* Do Have Carts. */ + $list_pkb = json_decode($exist_carts['list_pkb'],true); + $list_koop = json_decode($exist_carts['list_koop'],true); - $arraybayar = $this->setUpahTawarruq($request->getPembiayaanFromNorujukan()); + if($exist_carts['status_pkb'] == 'PENDING') $list_pkb = ($list_pkb) ? $this->setUpahTawarruq($list_pkb) : []; else $list_pkb = []; + if($exist_carts['status_koop'] == 'PENDING') $list_koop = ($list_koop) ? $this->setUpahTawarruq($list_koop) : []; else $list_koop = []; - return view('includes.bayaran.pembayaransag', compact('arraybayar')); + }else{ + /* Doesn't Have Carts. First Timer */ + $request->validated(); + + $arraybayar = $this->setUpahTawarruq($request->getPembiayaanFromNorujukan()); + + $list_pkb = array_filter(array_map(function ($x){ + return ($x['tag_syarikat'] == CompanyStatus::COM_PKB) ? $x : null; + },$arraybayar)); + + $list_koop = array_filter(array_map(function ($x){ + return ($x['tag_syarikat'] == CompanyStatus::COM_KOOPPKB) ? $x : null; + },$arraybayar)); + + $personal_carts = new PersonalCarts(); + $personal_carts->ic_no = Auth::user()->icno; + $personal_carts->list_koop = json_encode($list_koop); + $personal_carts->list_pkb = json_encode($list_pkb); + $personal_carts->status_pkb = ($list_pkb) ? 'PENDING' : 'NONE'; + $personal_carts->status_koop = ($list_koop) ? 'PENDING' : 'NONE'; + $personal_carts->user_id = Auth::user()->id; + $personal_carts->save(); + } + + return view('includes.bayaran.pembayaransag', compact('list_pkb','list_koop')); } - public function PembayaranEngine(Request $request, BillplzService $billplzService) + public function PembayaranEngine(Request $request) { ['email' => $customerEmail, 'notel' => $customerPhoneNumber, 'name' => $customerName, 'icno' => $customerIcno] = auth()->user()->toArray(); - + $bayaranArrahn = array_filter($request->txtjenisbayaran, fn($x) => $x == 'arrahn'); $bayaranOthers = array_filter($request->txtjenisbayaran, fn($x) => $x != 'arrahn'); - + $bayaranArrahnArray = array_map(function ($x) use ($customerName, $customerIcno, $request) { return [ 'customer_name' => $customerName, @@ -62,9 +99,14 @@ class BayaranController extends Controller return Money::MYR($sum())->add($billPlzTransactionFee); }; - $bill = $billplzService->createBill([$customerEmail, $customerPhoneNumber, $customerName, $getPaymentSum()]); + $company = strtoupper($request->txtcompany); + $billplzService = new BillplzService($company); + $bill = $billplzService->createBill([$customerEmail, $customerPhoneNumber, $customerName, $getPaymentSum()],$company); + + Session::put('company', $company); + $this->serviceCallHttp($company); - $isRecordTransactionSuccess = $this->recordTransaction($paymentArray, $bill); + $isRecordTransactionSuccess = $this->recordTransaction($paymentArray, $bill,$company); if ($isRecordTransactionSuccess) { session([ @@ -76,12 +118,12 @@ class BayaranController extends Controller } } - public function recordTransaction($paymentArray, $bill) + public function recordTransaction($paymentArray, $bill,$company = 'PKB') { ['name' => $customerName, 'icno' => $customerIcno] = auth()->user()->toArray(); $getlatestNoSiri = function () { - $previous_siri = Http::arrahn()->get('/api/online/transaction')->json(); + $previous_siri = $this->CallableHttp->get('/api/online/transaction')->json(); if ($previous_siri) { return $previous_siri['nosiri'] + 1; } else { @@ -95,10 +137,13 @@ class BayaranController extends Controller return 'APKB' . $day . $month . $year . sprintf('%08d', $getlatestNoSiri()); }; + $serviceCallable = $company == 'PKB' + ? fn(Pool $pool) => $pool->arrahn() + : fn(Pool $pool) => $pool->arrahn_koop(); try { Http::pool( fn(Pool $pool) => collect($paymentArray)->map( - fn($payment) => $pool->arrahn()->post('/api/online/transaction', [ + fn($payment) => $serviceCallable($pool)->post('/api/online/transaction', [ 'nokp' => $customerIcno, 'reference_no' => $generateTransactionReferenceNumber(), 'nosiri' => $getlatestNoSiri(), @@ -122,7 +167,7 @@ class BayaranController extends Controller } try { - $response = Http::arrahn() + $response = $this->CallableHttp ->put('/api/transaction/online/tagportal', [ 'billplz_id' => $bill['id'], ]) @@ -142,11 +187,12 @@ class BayaranController extends Controller public function ResitBayaran(Request $request) { + $this->serviceCallHttp(Session::get('company')); $payment_details = $request->payment; $kpbaru = Auth::User()->icno; - $customer = Http::arrahn() + $customer = $this->CallableHttp ->get('/api/customers/' . $kpbaru) ->json(); $customer_details = $customer; @@ -155,16 +201,16 @@ class BayaranController extends Controller $current = new Carbon(); $date = $current->toDateTimeString(); - $cawangan_info = Http::arrahn() + $cawangan_info = $this->CallableHttp ->get('/api/cawangan/' . $payment_details['kodcaw']) ->json(); - $cawangan = Http::arrahn() + $cawangan = $this->CallableHttp ->get('/api/cawangan/detail/' . $payment_details['kodcaw']) ->json(); $cawangan_detail = $cawangan[0]; $nama_cawangan = $cawangan_info['details_caw']; - $gadai_details = Http::arrahn() + $gadai_details = $this->CallableHttp ->get('/api/gadai/norujukan/' . $payment_details['norujukan']) ->json(); $gadai = $gadai_details[0][0]; @@ -172,14 +218,15 @@ class BayaranController extends Controller return view('pembayaran.resit.resitportal', compact('customer_details', 'payment_details', 'cawangan_detail', 'nama_cawangan', 'gadai')); } - public function callback(Request $request, BillplzService $billplzService) + public function callback(Request $request) { + $billplzService = new BillplzService(Session::get('company')); $data = $billplzService->webhook($request->toArray()); $isBillUnpaid = $data['paid'] !== true; if ($isBillUnpaid) { - Http::arrahn()->put('/api/online/transaction', [ + $this->CallableHttp->put('/api/online/transaction', [ 'billplz_id' => $data['id'], 'status' => 'UNSUCCESSFUL', 'paid_at' => null, @@ -188,29 +235,43 @@ class BayaranController extends Controller return response(200); } - Http::arrahn()->put('/api/online/transaction', [ + $this->CallableHttp->put('/api/online/transaction', [ 'billplz_id' => $data['id'], 'status' => 'PAID', 'paid_at' => $data['paid_at']->format('Y-m-d H:i:s'), ]); + $column_updated = (Session::get('company') == 'PKB') ? 'status_pkb' : 'status_koop'; + $value_paid = 'PAID'; + + $exist_carts = PersonalCarts::where('ic_no', Auth::user()->icno) + ->where('user_id', Auth::user()->id) + ->where(function ($query) { + $query->where('status_pkb', 'PENDING') + ->orWhere('status_koop', 'PENDING'); + }) + ->update([ + $column_updated => $value_paid, + ]); + return response(200); } - public function response(Request $request, BillplzService $billplzService) + public function response(Request $request) { + $billplzService = new BillplzService(Session::get('company')); $data = $billplzService->redirect($request->toArray()); - + $this->serviceCallHttp($billplzService->company); $isBillUnpaid = $data['paid'] !== true; if ($isBillUnpaid) { - Http::arrahn()->put('/api/online/transaction', [ + $this->CallableHttp->put('/api/online/transaction', [ 'billplz_id' => $data['id'], 'status' => 'NOT PAID', 'paid_at' => null, ]); - $transactionOnline = Http::arrahn() + $transactionOnline = $this->CallableHttp ->get('/api/transaction/online/login', [ 'billplz_id' => $data['id'], ]) @@ -219,18 +280,33 @@ class BayaranController extends Controller return redirect()->route('pay.failed'); } - Http::arrahn()->put('/api/online/transaction', [ + $this->CallableHttp->put('/api/online/transaction', [ 'billplz_id' => $data['id'], 'status' => 'PAID', 'paid_at' => $data['paid_at']->format('Y-m-d H:i:s'), ]); - $transactionOnline = Http::arrahn() + $column_updated = (Session::get('company') == 'PKB') ? 'status_pkb' : 'status_koop'; + $value_paid = 'PAID'; + $column_payment_updated = (Session::get('company') == 'PKB') ? 'payment_pkb' : 'payment_koop'; + + $transactionOnline = $this->CallableHttp ->get('/api/transaction/online/login', [ 'billplz_id' => $data['id'], ]) ->json(); + $exist_carts = PersonalCarts::where('ic_no', Auth::user()->icno) + ->where('user_id', Auth::user()->id) + ->where(function ($query) { + $query->where('status_pkb', 'PENDING') + ->orWhere('status_koop', 'PENDING'); + }) + ->update([ + $column_updated => $value_paid, + $column_payment_updated => json_encode($transactionOnline) + ]); + return redirect()->route('pay.success', [ 'transactionOnline' => $transactionOnline, ]); @@ -238,23 +314,76 @@ class BayaranController extends Controller public function successPayment(Request $request) { + $this->serviceCallHttp(Session::get('company')); $transactionOnline = $request->transactionOnline; + $exist_carts = PersonalCarts::where('ic_no', Auth::user()->icno) + ->where('user_id', Auth::user()->id) + ->where(function ($query) { + $query->where('status_pkb', 'PENDING') + ->orWhere('status_koop', 'PENDING'); + }) + ->first(); + + $exist_carts = optional($exist_carts)->toArray(); + + if(!$exist_carts){ + $paid_carts = PersonalCarts::where('ic_no', Auth::user()->icno) + ->where('user_id', Auth::user()->id) + ->where(function ($query) { + $query->where('status_pkb', 'PAID') + ->where('status_koop', 'PAID'); + }) + ->first(); + $paid_carts = optional($paid_carts)->toArray(); + if($paid_carts){ + + $trans_pkb = json_decode($paid_carts['payment_pkb'],true); + $trans_koop = json_decode($paid_carts['payment_koop'],true); + + $trans_pkb = array_map(function ($item) { + $item['tag_syarikat'] = CompanyStatus::COM_PKB; + return $item; + }, $trans_pkb); + + $trans_koop = array_map(function ($item) { + $item['tag_syarikat'] = CompanyStatus::COM_KOOPPKB; + return $item; + }, $trans_koop); + + $transactionOnline = array_merge($trans_pkb,$trans_koop); + + $arraycawangan = array_map( + fn($x) => $x['tag_syarikat'] == CompanyStatus::COM_PKB + ? Http::arrahn() + ->get('/api/cawangan/detail/' . $x['kodcaw']) + ->json()[0] + : Http::arrahn_koop() + ->get('/api/cawangan/detail/' . $x['kodcaw']) + ->json()[0], + $transactionOnline + ); + + + return view('pembayaran.result.berjayaportal', compact('transactionOnline', 'arraycawangan','exist_carts')); + } + } + $arraygadai = array_map( - fn($x) => Http::arrahn() + fn($x) => $this->CallableHttp ->get('/api/gadai/norujukan/' . $x['norujukan']) ->json()[0][0], $transactionOnline, ); $arraycawangan = array_map( - fn($x) => Http::arrahn() + fn($x) => $this->CallableHttp ->get('/api/cawangan/detail/' . $x['kodcaw']) ->json()[0], $transactionOnline, ); - return view('pembayaran.result.berjayaportal', compact('transactionOnline', 'arraycawangan', 'arraygadai')); + return view('pembayaran.result.berjayaportal', compact('transactionOnline', 'arraycawangan', 'arraygadai','exist_carts')); } public function failedPayment() @@ -270,7 +399,7 @@ class BayaranController extends Controller $auth_user = Auth::user(); - $belum_tebus = Http::arrahn() + $belum_tebus = $this->CallableHttp ->get('/api/customers/' . $auth_user['icno'] . '/gadai/' . 'belum_tebus') ->json(); @@ -302,7 +431,11 @@ class BayaranController extends Controller $getUpahTawarruqPerPembiayaan = function ($x) use ($getJenisKeuntungan) { $jenisKeuntungan = $getJenisKeuntungan($x); - $upahTawarruq = Http::arrahn() + $CallableHttp = $x['tag_syarikat'] == CompanyStatus::COM_PKB + ? Http::arrahn() + : Http::arrahn_koop(); + + $upahTawarruq = $CallableHttp ->get('/api/upahtawarruq/' . $x['kodcaw'] . '/' . $x['norujukan'], ['jeniskeuntungan' => $jenisKeuntungan]) ->json(); @@ -319,4 +452,47 @@ class BayaranController extends Controller return array_map($getUpahTawarruqPerPembiayaan, $pembiayaan); } + + public function checkCarts(){ + $exist_carts = PersonalCarts::where('ic_no', Auth::user()->icno) + ->where('user_id', Auth::user()->id) + ->where(function ($query) { + $query->where('status_pkb', 'PENDING') + ->orWhere('status_koop', 'PENDING'); + }) + ->first(); + + return $exist_carts; + } + + public function UserCheckCarts(){ + $exist_carts = PersonalCarts::where('ic_no', Auth::user()->icno) + ->where('user_id', Auth::user()->id) + ->where(function ($query) { + $query->where('status_pkb', 'PENDING') + ->orWhere('status_koop', 'PENDING'); + }) + ->first(); + + return response()->json($exist_carts); + } + + public function removeCarts(){ + $exist_carts = PersonalCarts::where('ic_no', Auth::user()->icno) + ->where('user_id', Auth::user()->id) + ->first(); + + if ($exist_carts) { + $exist_carts->delete(); + } + + return response()->json($exist_carts); + } + + public function serviceCallHttp($company){ + $this->CallableHttp = $company == 'PKB' + ? Http::arrahn() + : Http::arrahn_koop(); + + } } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index ca3e5a2..838ba17 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -30,11 +30,24 @@ class HomeController extends Controller { $homeUrl = route('home'); $authUser = Auth::user(); - $customerInfo = Http::withOptions(['verify' => config('app.api_verify')]) + $customer_pkb = Http::withOptions(['verify' => config('app.api_verify')]) ->get(config('api.url') . '/portal/customer/info', ['ic' => $authUser['icno']]) ->json(); - ['gadai' => $customer_gadai, 'lelong' => $customer_lelong] = $customerInfo; + $customer_koop = Http::withOptions(['verify' => config('app.api_verify')]) + ->get(config('api.url_koop') . '/portal/customer/info', ['ic' => $authUser['icno']]) + ->json(); + + // ['gadai' => $customer_gadai, 'lelong' => $customer_lelong] = $customerInfo; + $customer_gadai = array_merge( + $customer_pkb['gadai'] ?? [], + $customer_koop['gadai'] ?? [] + ); + + $customer_lelong = array_merge( + $customer_pkb['lelong'] ?? [], + $customer_koop['lelong'] ?? [] + ); // only get lelong that is harga jualan that is not null or 0 $customer_lelong = array_filter($customer_lelong, fn($x) => $x['hargajualan'] != null && $x['hargajualan'] != 0); @@ -62,12 +75,26 @@ class HomeController extends Controller $pembiayaan = $this->pembiayaanService->getPembiayaan($request->filter); $authUser = Auth::user(); - $customerInfo = Http::withOptions(['verify' => config('app.api_verify')]) + $customer_pkb = Http::withOptions(['verify' => config('app.api_verify')]) ->get(config('api.url') . '/portal/customer/info', ['ic' => $authUser['icno']]) ->json(); - ['gadai' => $customer_gadai, 'lelong' => $customer_lelong] = $customerInfo; + $customer_koop = Http::withOptions(['verify' => config('app.api_verify')]) + ->get(config('api.url_koop') . '/portal/customer/info', ['ic' => $authUser['icno']]) + ->json(); + + // ['gadai' => $customer_gadai, 'lelong' => $customer_lelong] = $customerInfo; + + $customer_gadai = array_merge( + $customer_pkb['gadai'] ?? [], + $customer_koop['gadai'] ?? [] + ); + $customer_lelong = array_merge( + $customer_pkb['lelong'] ?? [], + $customer_koop['lelong'] ?? [] + ); + // only get lelong that is harga jualan that is not null or 0 $customer_lelong = array_filter($customer_lelong, fn($x) => $x['hargajualan'] != null && $x['hargajualan'] != 0); diff --git a/app/Http/Controllers/InformationController.php b/app/Http/Controllers/InformationController.php index ba8b16a..65676e6 100644 --- a/app/Http/Controllers/InformationController.php +++ b/app/Http/Controllers/InformationController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Models\CompanyStatus; use App\Models\LelongBid; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -30,17 +31,29 @@ class InformationController extends Controller { $auth_user = Auth::User(); - $CustomerInfo = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') .'/portal/customer/info',['ic' => $auth_user['icno']])->json(); + $customer_pkb = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') .'/portal/customer/info',['ic' => $auth_user['icno']])->json(); + $customer_koop = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url_koop') .'/portal/customer/info',['ic' => $auth_user['icno']])->json(); $pembiayaansemasa = []; - if(isset($CustomerInfo['gadai'])) - { - $pembiayaansemasa = $CustomerInfo['gadai']; + if(isset($customer_pkb['gadai'])){ + $pembiayaansemasa = array_map(function ($pkb) { + $pkb['tag_syarikat'] = CompanyStatus::COM_PKB; + return $pkb; + }, $customer_pkb['gadai']); } - if(isset($CustomerInfo['lelong'])){ - if(sizeof($CustomerInfo['lelong']) > 0){ - foreach($CustomerInfo['lelong'] as $index=>$lelong){ + if(isset($customer_koop['gadai'])){ + $array_koop = array_map(function ($koop) { + $koop['tag_syarikat'] = CompanyStatus::COM_KOOPPKB; + return $koop; + }, $customer_koop['gadai']); + $pembiayaansemasa = array_merge($pembiayaansemasa,$array_koop); + } + + if(isset($customer_pkb['lelong'])){ + if(sizeof($customer_pkb['lelong']) > 0){ + foreach($customer_pkb['lelong'] as $index=>$lelong){ + $customer_pkb['lelong'][$index]['tag_syarikat'] = CompanyStatus::COM_KOOPPKB; $array_lelong = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api-lelong.url') . '/api/portalApi',['norujukan' => $lelong['norujukan']])->json(); if($array_lelong === null){ @@ -48,13 +61,33 @@ class InformationController extends Controller } if($array_lelong['lelong'] !== null){ - $CustomerInfo['lelong'][$index] = collect($lelong)->merge($array_lelong['lelong'])->toArray(); + $customer_pkb['lelong'][$index] = collect($lelong)->merge($array_lelong['lelong'])->toArray(); } } - $pembiayaansemasa = collect($pembiayaansemasa)->merge($CustomerInfo['lelong']); - $pembiayaansemasa = $pembiayaansemasa->toArray(); + $pembiayaansemasa = collect($pembiayaansemasa)->merge($customer_pkb['lelong']); + $pembiayaansemasa = $pembiayaansemasa->toArray(); } } + + if(isset($customer_koop['lelong'])){ + if(sizeof($customer_koop['lelong']) > 0){ + foreach($customer_koop['lelong'] as $index=>$lelong){ + $customer_koop['lelong'][$index]['tag_syarikat'] = CompanyStatus::COM_KOOPPKB; + $array_lelong = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api-lelong.url_koop') . '/api/portalApi',['norujukan' => $lelong['norujukan']])->json(); + + if($array_lelong === null){ + continue; + } + + if($array_lelong['lelong'] !== null){ + $customer_koop['lelong'][$index] = collect($lelong)->merge($array_lelong['lelong'])->toArray(); + } + } + $pembiayaansemasa = collect($pembiayaansemasa)->merge($customer_koop['lelong']); + $pembiayaansemasa = $pembiayaansemasa->toArray(); + } + } + return response()->json($pembiayaansemasa,200); // return view('includes.information.pembiayaanaktif',compact('pembiayaansemasa')); } @@ -63,14 +96,16 @@ class InformationController extends Controller { $auth_user = Auth::User(); - $CustomerInfo = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') .'/portal/customer/info',['ic' => $auth_user['icno']])->json(); + $customer_pkb = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') .'/portal/customer/info',['ic' => $auth_user['icno']])->json(); + $customer_koop = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url_koop') .'/portal/customer/info',['ic' => $auth_user['icno']])->json(); $melebihi6bulan = []; - if(isset($CustomerInfo['gadai'])) + if(isset($customer_pkb['gadai'])) { - foreach($CustomerInfo['gadai'] as $index=>$gadai) + foreach($customer_pkb['gadai'] as $index=>$gadai) { + $gadai['tag_syarikat'] = CompanyStatus::COM_PKB; if($gadai['tempoh'] >= 6) { array_push($melebihi6bulan,$gadai); @@ -78,6 +113,21 @@ class InformationController extends Controller } } + if(isset($customer_koop['gadai'])) + { + foreach($customer_koop['gadai'] as $index=>$gadai) + { + $gadai['tag_syarikat'] = CompanyStatus::COM_KOOPPKB; + + if($gadai['tempoh'] >= 6) + { + array_push($melebihi6bulan,$gadai); + } + } + } + + + return response()->json($melebihi6bulan,200); // return view('includes.information.melebihi6bulan',compact('melebihi6bulan')); } @@ -86,12 +136,13 @@ class InformationController extends Controller { $auth_user = Auth::User(); - $CustomerInfo = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') .'/portal/customer/info',['ic' => $auth_user['icno']])->json(); + $customer_pkb = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') .'/portal/customer/info',['ic' => $auth_user['icno']])->json(); + $customer_koop = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url_koop') .'/portal/customer/info',['ic' => $auth_user['icno']])->json(); $lelong = []; - if(isset($CustomerInfo['lelong'])){ - if(sizeof($CustomerInfo['lelong']) > 0){ - foreach($CustomerInfo['lelong'] as $index=>$lel){ + if(isset($customer_pkb['lelong'])){ + if(sizeof($customer_pkb['lelong']) > 0){ + foreach($customer_pkb['lelong'] as $index=>$lel){ $array_lelong = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api-lelong.url') . '/api/portalApi',['norujukan' => $lel['norujukan']])->json(); if($array_lelong === null){ @@ -99,11 +150,29 @@ class InformationController extends Controller } if($array_lelong['lelong'] !== null){ - $CustomerInfo['lelong'][$index] = collect($lel)->merge($array_lelong['lelong'])->toArray(); + $customer_pkb['lelong'][$index] = collect($lel)->merge($array_lelong['lelong'])->toArray(); } } - $lelong = collect($lelong)->merge($CustomerInfo['lelong']); - $lelong = $lelong->toArray(); + $lelong = collect($lelong)->merge($customer_pkb['lelong']); + $lelong = $lelong->toArray(); + } + } + + if(isset($customer_koop['lelong'])){ + if(sizeof($customer_koop['lelong']) > 0){ + foreach($customer_koop['lelong'] as $index=>$lel){ + $array_lelong = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api-lelong.url') . '/api/portalApi',['norujukan' => $lel['norujukan']])->json(); + + if($array_lelong === null){ + continue; + } + + if($array_lelong['lelong'] !== null){ + $customer_koop['lelong'][$index] = collect($lel)->merge($array_lelong['lelong'])->toArray(); + } + } + $lelong = collect($lelong)->merge($customer_koop['lelong']); + $lelong = $lelong->toArray(); } } diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index b98b02e..af67ef1 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -3,6 +3,7 @@ namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; +use Illuminate\Session\TokenMismatchException; class VerifyCsrfToken extends Middleware { @@ -11,7 +12,19 @@ class VerifyCsrfToken extends Middleware * * @var array */ - protected $except = [ + + protected $except = [ '/pembayaran/backend' ]; + + public function handle($request, \Closure $next) + { + try { + return parent::handle($request, $next); + } catch (TokenMismatchException $e) { + // Redirect to login page if CSRF token is invalid + return redirect()->route('login')->with('logsemula', 'Sesi anda telah tamat. Sila log masuk semula.'); + } + } + } diff --git a/app/Http/Requests/PaymentRequest.php b/app/Http/Requests/PaymentRequest.php index ff4fed0..a0cf18a 100644 --- a/app/Http/Requests/PaymentRequest.php +++ b/app/Http/Requests/PaymentRequest.php @@ -3,6 +3,7 @@ namespace App\Http\Requests; use App\Http\Controllers\InformationController; +use App\Models\CompanyStatus; use App\Rules\PaymentRules\CawanganPermitUjrahPayment; use App\Rules\PaymentRules\NorujukanBukanFasa2; use App\Rules\PaymentRules\NorujukanContractNotExceed12Month; @@ -53,9 +54,33 @@ class PaymentRequest extends FormRequest public function getPembiayaanFromNorujukan() { + if(null !== $this->input('redirect_trolley') && $this->input('redirect_trolley') == 'trolley'){ + return []; + } + $norujukanList = json_decode($this->totalSagInCartInput); + $syarikatList = json_decode($this->listSyarikatinCartInput); - return array_map(fn($x) => Http::arrahn()->get('/api/gadai/norujukan/' . $x)->json()[0][0], $norujukanList); + $filterByStatus = function ($status) use ($norujukanList, $syarikatList) { + return array_filter( + array_map(function ($sag, $index) use ($syarikatList, $status) { + if (isset($syarikatList[$index]) && $syarikatList[$index] == $status) { + $HttpRequest = $status == CompanyStatus::COM_PKB ? Http::arrahn() : Http::arrahn_koop(); + $array_temp = $HttpRequest->get('/api/gadai/norujukan/' . $sag)->json()[0][0] ?? null; + $array_temp['tag_syarikat'] = $status; + return $array_temp; + } + return null; + }, $norujukanList, array_keys($norujukanList)) + ); + }; + + $list_pkb = $filterByStatus(CompanyStatus::COM_PKB); + $list_koop = $filterByStatus(CompanyStatus::COM_KOOPPKB); + + $array_merged_list = array_merge($list_pkb,$list_koop); + return $array_merged_list; + // return array_map(fn($x) => Http::arrahn()->get('/api/gadai/norujukan/' . $x)->json()[0][0], $norujukanList); } public function getPembiayaanAkanDilelong() diff --git a/app/Models/CompanyStatus.php b/app/Models/CompanyStatus.php new file mode 100644 index 0000000..ad1d728 --- /dev/null +++ b/app/Models/CompanyStatus.php @@ -0,0 +1,11 @@ + 'array', + 'list_koop' => 'array', + ]; + + protected $guarded = [ + 'id', + 'ic_no', + 'list_pkb', + 'list_koop', + 'status_pkb', + 'status_koop', + 'payment_pkb', + 'payment_koop', + 'user_id', + 'created_at', + 'updated_at' + ]; + + public $timestamps = true; +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index c94b6e1..93bb34e 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -28,11 +28,21 @@ class AppServiceProvider extends ServiceProvider Http::macro('arrahn', function () { return Http::withOptions(['verify' => config('app.api_verify')])->baseUrl(config('api.url')); }); + + Http::macro('arrahn_koop', function () { + return Http::withOptions(['verify' => config('app.api_verify')])->baseUrl(config('api.url_koop')); + }); PendingRequest::macro('arrahn', function () { $this->options['verify'] = config('app.api_verify'); $this->baseUrl(config('api.url')); return $this; }); + + PendingRequest::macro('arrahn_koop', function () { + $this->options['verify'] = config('app.api_verify'); + $this->baseUrl(config('api.url_koop')); + return $this; + }); } } diff --git a/app/Services/BillplzService.php b/app/Services/BillplzService.php index ae853f9..782d57f 100644 --- a/app/Services/BillplzService.php +++ b/app/Services/BillplzService.php @@ -6,6 +6,8 @@ use App\Models\TransactionOnlineStatus; use Billplz\Client; use Carbon\Carbon; use Illuminate\Support\Facades\Http; +use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\Session; class BillplzService { @@ -14,24 +16,14 @@ class BillplzService public $callbackUrl; public $paymentTitle; public $redirectUrl; + public $company; - public function __construct() + public function __construct(string $company) { - $appEnvironment = config('app.env'); - $billplzConfig = $appEnvironment == 'production' ? config('services.billplz.production') : config('services.billplz.sandbox'); - - $client = Client::make($billplzConfig['api_key'], $billplzConfig['x_signature']); - $client->useVersion('v4'); - - if ($appEnvironment != 'production') { - $client->useSandbox(); - } - - $this->callbackUrl = route('pay.callback'); - $this->redirectUrl = ['redirect_url' => route('pay.paymentStatus')]; - $this->paymentTitle = "Pembayaran Ansuran"; - $this->config = $billplzConfig; - $this->client = $client; + $this->company = $company; + $this->setupBillplzClient($company); + $this->setupUrls(); + $this->paymentTitle = config('services.billplz.paymentTitle'); } public function getCollections() @@ -39,8 +31,9 @@ class BillplzService return $this->client->collection()->all()->toArray(); } - public function createBill(array $data) + public function createBill(array $data,string $company) { + $composed_data = [ $this->config['collection_id'], ...$data, @@ -94,6 +87,8 @@ class BillplzService public function webhook($request) { + // $this->setCompany(Session::get('company')); + // $this->setupBillplzClient($this->company); try { $response = $this->client->webhook($request); @@ -145,13 +140,21 @@ class BillplzService public function getArrahnTransactions($queryData) { + $query_all = []; + if(isset($queryData['date'])){ - return Http::arrahn()->get('/api/transaction/online/query', ['date' => $queryData['date']])->json(); + $pkb_query = Http::arrahn()->get('/api/transaction/online/query', ['date' => $queryData['date']])->json(); + $koop_query = Http::arrahn_koop()->get('/api/transaction/online/query', ['date' => $queryData['date']])->json(); + $query_all = array_merge($pkb_query,$koop_query); } if(isset($queryData['billId'])){ - return Http::arrahn()->get('/api/transaction/online/query', ['billId' => $queryData['billId']])->json(); + $pkb_query = Http::arrahn()->get('/api/transaction/online/query', ['billId' => $queryData['billId']])->json(); + $koop_query = Http::arrahn_koop()->get('/api/transaction/online/query', ['billId' => $queryData['billId']])->json(); + $query_all = array_merge($pkb_query,$koop_query); } + + return $query_all; } public function getBillplzTransactionReview($date) @@ -252,4 +255,61 @@ class BillplzService { return array_map(fn($x) => $this->client->bill()->get($x)->toArray(), $billIds); } + + protected function setupBillplzClient($company) + { + $appEnvironment = config('app.env'); + + $billplzEnvironments = [ + 'PKB' => ($appEnvironment === 'production') ? config('services.billplz.production') : config('services.billplz.sandbox'), + 'KOPKB' => ($appEnvironment === 'production') ? config('services.billplz.production_kopkb') : config('services.billplz.sandbox_kopkb'), + ]; + + $billplzConfig = $appEnvironment === 'production' + ? ($billplzEnvironments[$company] ?? config('services.billplz.production')) + : ($billplzEnvironments[$company] ?? config('services.billplz.sandbox')); + + $client = Client::make($billplzConfig['api_key'], ($this->isBase64($billplzConfig['x_signature'])) ? $billplzConfig['x_signature'] : base64_encode($billplzConfig['x_signature'])); + $client->useVersion('v4'); + + if ($appEnvironment !== 'production') { + $client->useSandbox(); + } + + $this->config = $billplzConfig; + $this->client = $client; + } + + protected function setupUrls() + { + $this->callbackUrl = route('pay.callback'); + $this->redirectUrl = ['redirect_url' => route('pay.paymentStatus')]; + } + + protected function isBase64($string) { + if($this->isBase64UrlSafe($string)){ + return true; + } + + if (preg_match('/^[A-Za-z0-9+\/=]+$/', $string)) { + return base64_encode(base64_decode($string, true)) === $string; + } + return false; + } + + protected function isBase64UrlSafe($string) { + // Convert URL-safe Base64 to standard Base64 + $standardBase64 = str_replace(['-', '_'], ['+', '/'], $string); + + // Add padding if necessary + $remainder = strlen($standardBase64) % 4; + if ($remainder > 0) { + $standardBase64 .= str_repeat('=', 4 - $remainder); + } + + // Attempt to decode the string + $decoded = base64_decode($standardBase64, true); + + return $decoded !== false; // Return true if it successfully decodes + } } diff --git a/app/Services/PembiayaanService.php b/app/Services/PembiayaanService.php index 1be417a..495efe7 100644 --- a/app/Services/PembiayaanService.php +++ b/app/Services/PembiayaanService.php @@ -3,6 +3,7 @@ namespace App\Services; use App\Http\Controllers\InformationController; +use App\Models\CompanyStatus; use Illuminate\Http\Client\Pool; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Http; @@ -23,6 +24,9 @@ class PembiayaanService } $pembiayaan = array_filter($getPembiayaan(), fn($x) => $x->hargajualan != null || $x->hargajualan != 0); + // $pembiayaan_filter = array_filter($getPembiayaan(),fn($x) => $x->tag_syarikat == CompanyStatus::COM_PKB); + // $pembiayaan_koop = array_filter($getPembiayaan(),fn($x) => $x->tag_syarikat == CompanyStatus::COM_PKB); + $pembiayaan = $this->setUpahTawarruq($pembiayaan); $pembiayaan = $this->formatPembiayaanData($pembiayaan); $pembiayaan = $this->checkPembiayaanPaymentDisabled($pembiayaan); @@ -44,7 +48,12 @@ class PembiayaanService $getUpahTawarruqPerPembiayaan = function ($x) use ($getJenisKeuntungan) { $jenisKeuntungan = $getJenisKeuntungan($x); - $upahTawarruq = Http::arrahn()->get('/api/upahtawarruq/' . $x->kodcaw . '/' . $x->norujukan, ['jeniskeuntungan' => $jenisKeuntungan])->json(); + + $CallableHttp = $x->tag_syarikat == CompanyStatus::COM_PKB + ? Http::arrahn() + : Http::arrahn_koop(); + + $upahTawarruq = $CallableHttp->get('/api/upahtawarruq/' . $x->kodcaw . '/' . $x->norujukan, ['jeniskeuntungan' => $jenisKeuntungan])->json(); if ($jenisKeuntungan == 'onepercent') { $x->upah_tawarruq = $upahTawarruq['keuntungan'] + $upahTawarruq['ujrah']; @@ -62,7 +71,10 @@ class PembiayaanService private function formatPembiayaanData($pembiayaan) { - $allCawangan = Http::arrahn()->get('/api/cawangan')->json(); + $arrahnCawangan = Http::arrahn()->get('/api/cawangan')->json(); + $arrahnKoopCawangan = Http::arrahn_koop()->get('/api/cawangan')->json(); + + $allCawangan = array_merge($arrahnCawangan, $arrahnKoopCawangan); $setCawanganFullName = function ($pembiayaan) use ($allCawangan) { $cawangan = array_filter($allCawangan, fn($x) => $x['kodcaw'] === $pembiayaan->kodcaw); @@ -100,13 +112,17 @@ class PembiayaanService return $formatted; } - public function getMarhunModalData($norujukan) + public function getMarhunModalData($norujukan,$tagsyarikat) { - $gadaianDetails = Http::arrahn()->get('/api/gadai/norujukan/' . $norujukan)->json()[0][0]; + $CallableHttp = $tagsyarikat == CompanyStatus::COM_PKB + ? Http::arrahn() + : Http::arrahn_koop(); + + $gadaianDetails = $CallableHttp->get('/api/gadai/norujukan/' . $norujukan)->json()[0][0]; - $attachCawanganName = function ($x) use ($gadaianDetails) { - $x['cawangan_name'] = Http::arrahn()->get('/api/cawangan/detail/' . $gadaianDetails['kodcaw'])->json()[0]['cawangan']; + $attachCawanganName = function ($x) use ($gadaianDetails,$CallableHttp) { + $x['cawangan_name'] = $CallableHttp->get('/api/cawangan/detail/' . $gadaianDetails['kodcaw'])->json()[0]['cawangan']; return $x; }; diff --git a/config/api-lelong.php b/config/api-lelong.php index 6114358..6ee436d 100644 --- a/config/api-lelong.php +++ b/config/api-lelong.php @@ -1,4 +1,5 @@ env('API_LELONG_URL', 'https://niklah.arrahn.com.my') + 'url' => env('API_LELONG_URL', 'https://niklah.arrahn.com.my'), + 'url_koop' => env('API_LELONG_URL_KOOP', 'https://niklah.arrahn.com.my') ]; diff --git a/config/api.php b/config/api.php index a64a030..7672d1e 100644 --- a/config/api.php +++ b/config/api.php @@ -1,4 +1,5 @@ env('API_URL'), + 'url' => 'https://api2.arrahn.com.my', + 'url_koop' => 'https://api3.arrahn.com.my' ]; diff --git a/config/services.php b/config/services.php index 833feeb..9b31e32 100644 --- a/config/services.php +++ b/config/services.php @@ -31,15 +31,26 @@ return [ ], 'billplz' => [ + 'paymentTitle' => 'Pembayaran Ansuran', 'production' => [ 'api_key' => env('BILLPLZ_PRODUCTION_API_KEY', 'f3e82fe1-a422-4660-97f0-65cc59ff6c47'), 'x_signature' => env('BILLPLZ_PRODUCTION_X_SIGNATURE', 'S-alZUbzmD2_TF3vmrRqgehQ'), - 'collection_id' => env('BILLPLZ_SANDBOX_COLLECTION_ID', '5aosv2dg'), + 'collection_id' => env('BILLPLZ_PRODUCTION_COLLECTION_ID', '5aosv2dg'), + ], + 'production_kopkb' => [ + 'api_key' => env('BILLPLZ_PRODUCTION_KOPKB_API_KEY', 'fb81e895-f307-4c9c-b43d-0b55033ee479'), + 'x_signature' => env('BILLPLZ_PRODUCTION_KOPKB_X_SIGNATURE', 'afdb4035f1fe7f53cfdf3668765235f2714ee2ad6211c287a6ee52d170cb52b9b9e87d795213a9b4ede2de14076cdf2ced351343692194a28b0c23adfe3087bb'), + 'collection_id' => env('BILLPLZ_PRODUCTION_KOPKB_COLLECTION_ID', '93mzsttm'), ], 'sandbox' => [ 'api_key' => env('BILLPLZ_SANDBOX_API_KEY', 'abecfd0c-98d8-4635-abc2-2fcba8c60c11'), 'x_signature' => env('BILLPLZ_SANDBOX_X_SIGNATURE', 'S-GWr7z03XjAhqPsFfu_H5nQ'), - 'collection_id' => env('BILLPLZ_PRODUCTION_COLLECTION_ID', 'z0r4kjhi'), + 'collection_id' => env('BILLPLZ_SANDBOX_COLLECTION_ID', 'z0r4kjhi'), + ], + 'sandbox_kopkb' => [ + 'api_key' => env('BILLPLZ_SANDBOX_KOPKB_API_KEY', '4b9218fd-04fb-4338-a067-982e6730d160'), + 'x_signature' => env('BILLPLZ_SANDBOX_KOPKB_X_SIGNATURE', '0ac6e5438cf729754bb819860ed7de6d87d79b0d183212bf10581fca39a4c2d992697b605a706118032af37d31a85fed6637ff1233c56e6d2421bc22cca9d710'), + 'collection_id' => env('BILLPLZ_SANDBOX_KOPKB_COLLECTION_ID', 'uae40muk'), ], ], diff --git a/database/migrations/2024_12_07_012607_create_carts_table.php b/database/migrations/2024_12_07_012607_create_carts_table.php new file mode 100644 index 0000000..287f1cc --- /dev/null +++ b/database/migrations/2024_12_07_012607_create_carts_table.php @@ -0,0 +1,42 @@ +id(); + $table->string('ic_no'); + $table->json('list_pkb'); + $table->json('list_koop'); + $table->json('payment_pkb')->nullable(); + $table->json('payment_koop')->nullable(); + $table->enum('status_pkb', ['PENDING', 'PAID','NONE']); + $table->enum('status_koop', ['PENDING', 'PAID','NONE']); + $table->softDeletes(); + $table->unsignedBigInteger('user_id'); + $table->timestamps(); + + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('personal_carts'); + } +} diff --git a/public/argon/js/main.js b/public/argon/js/main.js index 17f7d79..2b94b44 100644 --- a/public/argon/js/main.js +++ b/public/argon/js/main.js @@ -1,4 +1,6 @@ function loadingbtn(){ + const loader = document.getElementById('load-arrahn'); + loader.classList.remove('d-none'); $.notifyClose(); // $(this).unbind("click"); $('#background').css('display', 'block'); diff --git a/public/js/miscellaneous/cart.js b/public/js/miscellaneous/cart.js new file mode 100644 index 0000000..1f97022 --- /dev/null +++ b/public/js/miscellaneous/cart.js @@ -0,0 +1,92 @@ +let checked_rad = () =>{ + const radios = document.querySelectorAll('input[name="radpembayaran"]'); + // let rad_payment = document.getElementById('radpembayaran'); + let btn_payment = document.getElementById('bayarsbmt'); + let btn_payment_phone = document.getElementById('bayarsbmt-phone'); + + + if(radios.checked){ + btn_payment.disabled = false; + btn_payment_phone.disabled = false; + }else{ + btn_payment.disabled = true; + btn_payment_phone.disabled = true; + } +} + +const radios = document.querySelectorAll('input[name="radpembayaran"]'); + +radios.forEach((radio) => { + radio.addEventListener('change', function () { + let btn_payment = document.getElementById('bayarsbmt'); + let btn_payment_phone = document.getElementById('bayarsbmt-phone'); + let content1 = document.getElementById('divpkb'); + let content2 = document.getElementById('divkopkb'); + let whole_total = document.getElementById('spanjumlah'); + let whole_total_phone = document.getElementById('spanjumlah-phone'); + let inputs = document.querySelectorAll(`#div${this.value} input[type="number"]`); + let values = Array.from(inputs).map(input => parseFloat(input.value) || 0).reduce((sum,value) => sum + value, 0); + + if (this.checked) { + if(this.value == 'kopkb'){ + let inputsdisabled = document.querySelectorAll(`#divpkb input:not([type="radio"])`); + let inputenabled = document.querySelectorAll(`#divkopkb input`); + inputsdisabled.forEach(input => { + input.disabled = true; + }); + inputenabled.forEach(input =>{ + input.disabled = false; + }); + content1?.classList.add('blurred'); + content2?.classList.remove('blurred'); + btn_payment.disabled = false; + btn_payment_phone.disabled = false; + whole_total.innerHTML = formatter.format(values + 1); + whole_total_phone.innerHTML = formatter.format(values + 1); + + }else{ + let inputsdisabled = document.querySelectorAll(`#divkopkb input:not([type="radio"])`); + let inputenabled = document.querySelectorAll(`#divpkb input`); + + inputsdisabled.forEach(input => { + input.disabled = true; + }); + inputenabled.forEach(input =>{ + input.disabled = false; + }); + content2?.classList.add('blurred'); + content1?.classList.remove('blurred'); + btn_payment.disabled = false; + btn_payment_phone.disabled = false; + whole_total.innerHTML = formatter.format(values + 1); + whole_total_phone.innerHTML = formatter.format(values + 1); + } + } + + }); +}); + +let deleteCarts = () => { + const loader = document.getElementById('load-arrahn'); + if(loader) + loader.classList.remove('d-none'); + + fetch('/deletecarts') + .then(response => { + if (!response.ok) { + throw new Error('HTTP error ' + response.status); + } + return response.json(); + }) + .then(data => { + if (data) { + redirect_home(); + } + }) + .catch(error => console.error(error)); +} + +let redirect_home = () => { + window.location.href = redirect_home_var; +} + diff --git a/public/js/miscellaneous/navigation-trolley.js b/public/js/miscellaneous/navigation-trolley.js new file mode 100644 index 0000000..6dd10b4 --- /dev/null +++ b/public/js/miscellaneous/navigation-trolley.js @@ -0,0 +1,67 @@ +async function fetchCartCount() { + try { + const response = await fetch('/showcarts-available'); + + if (!response.ok) { + throw new Error('Failed to fetch cart count'); + } + + const data = await response.json(); + + let totalcount = 0; + totalcount += (data.status_koop === 'PENDING') ? 1 : 0; + totalcount += (data.status_pkb === 'PENDING') ? 1 : 0; + const cartCount = totalcount || 0; + + updateCartCount(cartCount); + } catch (error) { + console.error('Error fetching cart count:', error); + updateCartCount(0); + } +} + +function updateCartCount(itemCount) { + const cartCountElement = document.getElementById('cart-count'); + const ahrefRedirect = document.getElementById('a-redirect'); + + if (itemCount > 0) { + cartCountElement.textContent = itemCount; + cartCountElement.classList.remove('d-none'); + } else { + cartCountElement.textContent = ''; + cartCountElement.classList.add('d-none'); + + } +} + +function redirectTrolley() { + const cartCountElement = document.getElementById('cart-count'); + if(cartCountElement.textContent == 0){ + return false; + } + + let form = document.createElement('form'); + form.method = 'POST'; + form.action = routetrolley; + + let csrfInput = document.createElement('input'); + csrfInput.type = 'hidden'; + csrfInput.name = '_token'; + csrfInput.value = csrftoken; + form.appendChild(csrfInput); + + let redirectInput = document.createElement('input'); + redirectInput.type = 'hidden'; + redirectInput.name = 'redirect_trolley'; + redirectInput.value = 'trolley'; + form.appendChild(redirectInput); + document.body.appendChild(form); + + + const loader = document.getElementById('load-arrahn'); + loader.classList.remove('d-none'); + + form.submit(); +} + +fetchCartCount(); \ No newline at end of file diff --git a/resources/views/auth/pertama-kali/firsttime.blade.php b/resources/views/auth/pertama-kali/firsttime.blade.php index bb6df13..51f88eb 100644 --- a/resources/views/auth/pertama-kali/firsttime.blade.php +++ b/resources/views/auth/pertama-kali/firsttime.blade.php @@ -181,7 +181,7 @@ - + {{-- --}}
+ | No Rujukan |
+ No Rujukan | Tarikh Akhir | Bayaran | -Baki Pembiayaan |
-
-
+ Baki Pembiayaan |
|---|---|---|---|---|---|
| {{ $bayar['norujukan'] }} | @@ -96,38 +168,17 @@ } @endphp - -+ | + | - - - |
| No Rujukan |
+ Tarikh Akhir | +Bayaran | +Baki Pembiayaan |
+
|---|---|---|---|
| + {{ $bayar['norujukan'] }} + | + @php + + $t_matang = strtotime($bayar['t_matang']); + $t_akhir = date("d/m/Y", $t_matang); + + if($bayar['lelong_tawarruq'] == 0) + { + $t_matang = strtotime($bayar['t_matang1']); + $t_akhir = date("d/m/Y", $t_matang); + } + @endphp ++ {{ $t_akhir }} + | + @php + $upahtawarruq = $bayar['upah_tawarruq']; + $upahtawarruq = floatval(str_replace(',','',$upahtawarruq)); + + $totalupahasal = $totalupahasal + $upahtawarruq; + + + if(floatval($upahtawarruq) == 0){ + $errorcount++; + } + + @endphp ++ + + + + + + | + ++ + | +