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($this->checkSAG($list_pkb, 'PKB')){ $this->removeCartsInternal(); return redirect()->route('buffer'); } if($this->checkSAG($list_koop, 'KOPKB')){ $this->removeCartsInternal(); return redirect()->route('buffer'); } 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 = []; if (empty($list_pkb) && empty($list_koop)) { $this->removeCartsInternal(); return redirect()->route('buffer'); } }else{ /* Doesn't Have Carts. First Timer */ $request->validated(); if(isset($request->redirect_trolley)){ return redirect()->route('buffer'); } $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]; $company = Session::get('company'); return view('pembayaran.resit.resitportal', compact('customer_details', 'payment_details', 'cawangan_detail', 'nama_cawangan', 'gadai','company')); } public function generateResit(Request $request) { $this->serviceCallHttp($request->company); $kpbaru = Auth::User()->icno; $customer = $this->CallableHttp ->get('/api/customers/' . $kpbaru) ->json(); $customer_details = $customer; $current = Carbon::now(); $current = new Carbon(); $date = $current->toDateTimeString(); $payment_details = $this->CallableHttp ->get('/api/transaction/online/express', ['billplz_id' => $request->billplzid,'norujukan' => $request->norujukan]) ->json(); $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]; // Load a view and pass data to it if($request->jenis == 'pdf'){ $pdf = PDF::loadView('pembayaran.resit.resitpdf', compact('customer_details', 'payment_details', 'cawangan_detail', 'nama_cawangan', 'gadai')); return $pdf->stream('resit_pembayaran.pdf'); }else{ return view('pembayaran.resit.resitpdf', 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' => 'NOT PAID', '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'; $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, ]); } 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) => $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, ); 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); $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']; } 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(Request $request){ if($request->ajax() || $request->expectsJson()){ $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); }else{ return redirect()->route('buffer'); } } public function removeCarts(Request $request){ if($request->ajax() || $request->expectsJson()){ $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); }else{ return redirect()->route('buffer'); } } public function serviceCallHttp($company){ $this->CallableHttp = $company == 'PKB' ? Http::arrahn() : Http::arrahn_koop(); } private function checkSAG($list_sag, $company) { $CallableHttp = $company == 'PKB' ? Http::arrahn() : Http::arrahn_koop(); foreach ($list_sag as $x) { $array_lelong = Http::withOptions(['verify' => config('app.api_verify')]) ->get(config('api-lelong.url') . '/api/portalApi', ['norujukan' => $x['norujukan']]) ->json(); $array_gadai = $CallableHttp->get('/api/gadai/norujukan/' . $x['norujukan'])->json(); $isdisabled = $CallableHttp->get('/portal/searchsagonline/', ['norujukan' => $x['norujukan']])->json(); if ($array_lelong['lelong'] != null) { return true; } if ($isdisabled) { return true; } if (sizeof($array_gadai) != 0) { $array_gadai = $array_gadai[0][0]; if ($array_gadai['sttebus'] == 'T' || $array_gadai['sttebus'] == 'L') { return true; } } } return false; } private function removeCartsInternal(){ $exist_carts = PersonalCarts::where('ic_no', Auth::user()->icno) ->where('user_id', Auth::user()->id) ->first(); if ($exist_carts) { $exist_carts->delete(); } return $exist_carts; } }