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); 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 = []; }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) { ['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, 'nokp' => $customerIcno, 'kodcaw' => $request->txtkodcawhidden[$x], 'norujukan' => $request->txtnorujukanhidden[$x], 'bayaran' => round($request->txtbayaranhidden[$x], 1), 'txtjbghidden' => $request->txtjbghidden[$x], 'txtupahhidden' => $request->txtupahhidden[$x], ]; }, array_keys($bayaranArrahn)); $bayaranOthersArray = array_map(function ($x) use ($customerName, $customerIcno, $request) { return [ 'customer_name' => $customerName, 'nokp' => $customerIcno, 'kodcaw' => $request->txtkodcawhidden[$x], 'norujukan' => $request->txtnorujukanhidden[$x], 'bayaran' => round($request->txtbayaranhidden[$x], 1), ]; }, array_keys($bayaranOthers)); $paymentArray = array_merge($bayaranArrahnArray, $bayaranOthersArray); $getPaymentSum = function () use ($paymentArray) { $billPlzTransactionFee = Money::MYR(100); $sum = fn() => array_reduce($paymentArray, fn($accumulator, $currentItem) => $accumulator + $currentItem['bayaran'], 0) * 100; return Money::MYR($sum())->add($billPlzTransactionFee); }; $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,$company); if ($isRecordTransactionSuccess) { session([ 'array_payment' => $paymentArray, 'payment_method' => 'login', ]); return redirect($bill['url'] . '?auto_submit=true'); } } public function recordTransaction($paymentArray, $bill,$company = 'PKB') { ['name' => $customerName, 'icno' => $customerIcno] = auth()->user()->toArray(); $getlatestNoSiri = function () { $previous_siri = $this->CallableHttp->get('/api/online/transaction')->json(); if ($previous_siri) { return $previous_siri['nosiri'] + 1; } else { return 1; } }; $generateTransactionReferenceNumber = function () use ($getlatestNoSiri) { [$day, $month, $year] = [now()->day, now()->month, now()->format('y')]; 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) => $serviceCallable($pool)->post('/api/online/transaction', [ 'nokp' => $customerIcno, 'reference_no' => $generateTransactionReferenceNumber(), 'nosiri' => $getlatestNoSiri(), 'billplz_id' => $bill['id'], 'norujukan' => $payment['norujukan'], 'kodcaw' => $payment['kodcaw'], 'total_payment' => $payment['bayaran'], 'customer_name' => $customerName, 'jenisbayaran' => 'A', ]), ), ); OnlineTransactionLoggerService::logs($bill['id'], $paymentArray, 1, TransactionOnlineStatus::INITIALIZED_TRANSACTION); } catch (\Exception $e) { OnlineTransactionLoggerService::logs($bill['id'], $paymentArray, $e->getMessage(), TransactionOnlineStatus::INITIALIZED_TRANSACTION); throw $e; } try { $response = $this->CallableHttp ->put('/api/transaction/online/tagportal', [ 'billplz_id' => $bill['id'], ]) ->json(); OnlineTransactionLoggerService::logs($bill['id'], $paymentArray, $response, TransactionOnlineStatus::UPDATED_TAG_PORTAL); } catch (\Exception $e) { OnlineTransactionLoggerService::logs($bill['id'], $paymentArray, $e->getMessage(), TransactionOnlineStatus::UPDATED_TAG_PORTAL); throw $e; } return true; } public function ResitBayaran(Request $request) { $this->serviceCallHttp(Session::get('company')); $payment_details = $request->payment; $kpbaru = Auth::User()->icno; $customer = $this->CallableHttp ->get('/api/customers/' . $kpbaru) ->json(); $customer_details = $customer; $current = Carbon::now(); $current = new Carbon(); $date = $current->toDateTimeString(); $cawangan_info = $this->CallableHttp ->get('/api/cawangan/' . $payment_details['kodcaw']) ->json(); $cawangan = $this->CallableHttp ->get('/api/cawangan/detail/' . $payment_details['kodcaw']) ->json(); $cawangan_detail = $cawangan[0]; $nama_cawangan = $cawangan_info['details_caw']; $gadai_details = $this->CallableHttp ->get('/api/gadai/norujukan/' . $payment_details['norujukan']) ->json(); $gadai = $gadai_details[0][0]; return view('pembayaran.resit.resitportal', compact('customer_details', 'payment_details', 'cawangan_detail', 'nama_cawangan', 'gadai')); } public function callback(Request $request) { $billplzService = new BillplzService(Session::get('company')); $data = $billplzService->webhook($request->toArray()); $isBillUnpaid = $data['paid'] !== true; if ($isBillUnpaid) { $this->CallableHttp->put('/api/online/transaction', [ 'billplz_id' => $data['id'], 'status' => 'UNSUCCESSFUL', 'paid_at' => null, ]); return response(200); } $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 = new BillplzService(Session::get('company')); $data = $billplzService->redirect($request->toArray()); $this->serviceCallHttp($billplzService->company); $isBillUnpaid = $data['paid'] !== true; if ($isBillUnpaid) { $this->CallableHttp->put('/api/online/transaction', [ 'billplz_id' => $data['id'], 'status' => 'UNSUCCESSFUL', 'paid_at' => null, ]); $transactionOnline = $this->CallableHttp ->get('/api/transaction/online/login', [ 'billplz_id' => $data['id'], ]) ->json(); return redirect()->route('pay.failed'); } $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, ]); $transactionOnline = $this->CallableHttp ->get('/api/transaction/online/login', [ 'billplz_id' => $data['id'], ]) ->json(); return redirect()->route('pay.success', [ 'transactionOnline' => $transactionOnline, ]); } public function successPayment(Request $request) { $this->serviceCallHttp(Session::get('company')); $transactionOnline = $request->transactionOnline; $arraygadai = array_map( fn($x) => $this->CallableHttp ->get('/api/gadai/norujukan/' . $x['norujukan']) ->json()[0][0], $transactionOnline, ); $arraycawangan = array_map( fn($x) => $this->CallableHttp ->get('/api/cawangan/detail/' . $x['kodcaw']) ->json()[0], $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(); return view('pembayaran.result.berjayaportal', compact('transactionOnline', 'arraycawangan', 'arraygadai','exist_carts')); } public function failedPayment() { return view('pembayaran.result.gagalportal'); } public function SenaraiPembayaran() { $api_url = config('api.url'); $arraysag = []; $auth_user = Auth::user(); $belum_tebus = $this->CallableHttp ->get('/api/customers/' . $auth_user['icno'] . '/gadai/' . 'belum_tebus') ->json(); if (is_array($belum_tebus)) { if (sizeof($belum_tebus) > 0) { foreach ($belum_tebus as $index => $bt) { foreach ($bt as $index1 => $bet) { array_push($arraysag, $bet); } } } } $belum_tebus = $arraysag; return view('includes.bayaran.senaraibayaransag', compact('belum_tebus', 'api_url')); } private function setUpahTawarruq($pembiayaan) { $getJenisKeuntungan = function ($x) { $jenisKeuntungan = [ '1' => 'onepercent', '0' => 'asal', ]; return $jenisKeuntungan[$x['tagbaru']]; }; $getUpahTawarruqPerPembiayaan = function ($x) use ($getJenisKeuntungan) { $jenisKeuntungan = $getJenisKeuntungan($x); $upahTawarruq = Http::arrahn() ->get('/api/upahtawarruq/' . $x['kodcaw'] . '/' . $x['norujukan'], ['jeniskeuntungan' => $jenisKeuntungan]) ->json(); if ($jenisKeuntungan == 'onepercent') { $x['upah_tawarruq'] = $upahTawarruq['keuntungan'] + $upahTawarruq['ujrah']; } if ($jenisKeuntungan == 'asal') { $x['upah_tawarruq'] = $upahTawarruq; } return $x; }; 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(); } }