From f037dc539af82c9f2e4dedd5014b0f7ea225b8a3 Mon Sep 17 00:00:00 2001 From: Afiq Hamzah Date: Mon, 15 Jul 2024 16:28:39 +0800 Subject: [PATCH 1/6] Update codebase - Fix payable ujrah branch response - Add route and controller function to query for online transaction. for now can query by date - Add route and controller function to get online transaction trail. the endpoint will return the data from 4 interlinked table for online transaction needed to complete phase --- .../PayableUjrahBranchController.php | 3 +- .../TransactionOnlineController.php | 85 +++++++++++++++++++ routes/web.php | 7 +- 3 files changed, 89 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/PayableUjrahBranchController.php b/app/Http/Controllers/PayableUjrahBranchController.php index 2cf812e..2a6dbbb 100644 --- a/app/Http/Controllers/PayableUjrahBranchController.php +++ b/app/Http/Controllers/PayableUjrahBranchController.php @@ -14,8 +14,7 @@ class PayableUjrahBranchController extends Controller { $this->syncCawangan(); - $payableUjrahBranch = PayableUjrahBranch::with('cawangan_information')->get()->toJson(); - return json_encode($payableUjrahBranch); + return PayableUjrahBranch::with('cawangan_information')->get()->toJson(); } public function syncCawangan() diff --git a/app/Http/Controllers/TransactionOnlineController.php b/app/Http/Controllers/TransactionOnlineController.php index ae0e982..d72f8b8 100644 --- a/app/Http/Controllers/TransactionOnlineController.php +++ b/app/Http/Controllers/TransactionOnlineController.php @@ -30,6 +30,20 @@ class TransactionOnlineController extends Controller return response()->json($transactionOnline); } + + public function getListTransactionOnlineQuery(Request $request) + { + + $date = $request->date ? $request->date : Carbon::now()->toDateString(); + $transactionOnline = TransactionOnline::on('mysql7') + ->whereDate('tarikh', $date) + ->get(); + + + + return response()->json($transactionOnline); + } + public function getLatestNosiri() { $current = Carbon::now(); @@ -654,4 +668,75 @@ class TransactionOnlineController extends Controller return $th; } } + + function getListTransactionOnlineTrail(Request $request) + { + + $date = $request->date ? $request->date : Carbon::now()->toDateString(); + $isGroupByNorujukan = $request->filled('isGroupedByNorujukan') && $request->isGroupedByNorujukan === '1'; + + $transactionsOnline = TransactionOnline::whereDate('tarikh', $date) + ->when($request->filled('norujukan'), function ($query) use($request) { + return $query->where('norujukan', $request->norujukan); + }) + ->get() + ->filter(fn ($x) => $x['status'] === 'PAID') + ->when($isGroupByNorujukan, function ($query) { + return $query->groupBy('norujukan')->sortKeysDesc(); + }) + ->toArray(); + + $transaction = Transaction::whereDate('created_at', $date) + ->where('teller', 'Online') + ->when($request->norujukan, function ($query) use($request) { + return $query->where('norujukan', $request->norujukan); + }) + ->get() + ->when($isGroupByNorujukan, function ($query) { + return $query->groupBy('norujukan')->sortKeysDesc(); + }) + ->toArray(); + + $transaksiKeuntungan = TransaksiKeuntungan::whereDate('tarikh_bayaran', $date) + ->when($request->norujukan, function ($query) use($request) { + return $query->where('norujukan', $request->norujukan); + }) + ->get() + ->when($isGroupByNorujukan, function ($query) { + return $query->groupBy('norujukan')->sortKeysDesc(); + }) + ->toArray(); + + $connectionCawangan = Cawangan::on('mysql7')->where('kodcaw', 'KB2')->first()->mysql; + + $cawanganTransactionOnline = TransactionOnline::whereDate('tarikh', $date) + ->get() + ->pluck('kodcaw') + ->unique() + ->all(); + + $connectionCawangan = Cawangan::on('mysql7')->whereIn('kodcaw', $cawanganTransactionOnline)->get()->pluck('mysql'); + + $glDetail = $connectionCawangan->map(fn ($x) => GlDetail::on($x)->where('teller', 'ONLINE')->whereDate('tarikh', $date)->get()) + ->flatten() + ->when($isGroupByNorujukan, function ($glDetail) { + return $glDetail->groupBy('descpt') + ->keyBy(function ($group, $key) { + $array = explode(' ', $key); + return end($array); + }); + }) + ->when($request->filled('norujukan'), function ($glDetail) use($request) { + return $glDetail->where('norujukan', $request->norujukan); + }) + ->sortKeysDesc() + ->toArray(); + + return response()->json([ + 'transactionsOnline' => $transactionsOnline, + 'transaction' => $transaction, + 'transaksiKeuntungan' => $transaksiKeuntungan, + 'glDetail' => $glDetail + ]); + } } diff --git a/routes/web.php b/routes/web.php index 43159d3..bb0bed3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -10,7 +10,6 @@ | and give it the Closure to call when that URI is requested. | */ - // $router->get('/', function () use ($router) { // return $router->app->version(); // }); @@ -18,6 +17,7 @@ // return \Illuminate\Support\Str::random(32); // }); + $router->group(['namespace' => '\Rap2hpoutre\LaravelLogViewer'], function() use ($router) { $router->get('logs', 'LogViewerController@index'); }); @@ -260,9 +260,8 @@ $router->group(['prefix'=>'api'], function () use ($router){ $router->get('transaction/online/unsuccessful',['uses'=>'TransactionOnlineController@getListUnsuccessful']); $router->put('transaction/online/unsuccesfull/update',['uses'=>'TransactionOnlineController@updateUnsuccessfulTransaction']); $router->put('transaction/online/tagportal',['uses'=>'TransactionOnlineController@updateTagPortal']); - - - + $router->get('transaction/online/query',['uses'=>'TransactionOnlineController@getListTransactionOnlineQuery']); + $router->get('transaction/online/trail',['uses'=>'TransactionOnlineController@getListTransactionOnlineTrail']); //ANSURAN UPAH API $router->get('ansuran/laporan/{kodcaw}',['uses'=>'GadaiController@getLaporanAnsuran']); From 34204cdd5e77986f64969739b77f25a9558b9db7 Mon Sep 17 00:00:00 2001 From: Afiq Hamzah Date: Fri, 19 Jul 2024 10:26:37 +0800 Subject: [PATCH 2/6] Sort online payment trail data in date descending, fix query for gldetail when querying by norujukan --- app/Http/Controllers/TransactionOnlineController.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/TransactionOnlineController.php b/app/Http/Controllers/TransactionOnlineController.php index d72f8b8..70ea0b9 100644 --- a/app/Http/Controllers/TransactionOnlineController.php +++ b/app/Http/Controllers/TransactionOnlineController.php @@ -679,6 +679,8 @@ class TransactionOnlineController extends Controller ->when($request->filled('norujukan'), function ($query) use($request) { return $query->where('norujukan', $request->norujukan); }) + ->orderBy('tarikh', 'desc') + ->orderBy('masa', 'desc') ->get() ->filter(fn ($x) => $x['status'] === 'PAID') ->when($isGroupByNorujukan, function ($query) { @@ -689,8 +691,9 @@ class TransactionOnlineController extends Controller $transaction = Transaction::whereDate('created_at', $date) ->where('teller', 'Online') ->when($request->norujukan, function ($query) use($request) { - return $query->where('norujukan', $request->norujukan); + return $query->where('norujukan', 'like', '%' . $request->norujukan . '%'); }) + ->orderBy('created_at', 'desc') ->get() ->when($isGroupByNorujukan, function ($query) { return $query->groupBy('norujukan')->sortKeysDesc(); @@ -701,6 +704,7 @@ class TransactionOnlineController extends Controller ->when($request->norujukan, function ($query) use($request) { return $query->where('norujukan', $request->norujukan); }) + ->orderBy('tarikh_bayaran', 'desc') ->get() ->when($isGroupByNorujukan, function ($query) { return $query->groupBy('norujukan')->sortKeysDesc(); @@ -716,6 +720,7 @@ class TransactionOnlineController extends Controller ->all(); $connectionCawangan = Cawangan::on('mysql7')->whereIn('kodcaw', $cawanganTransactionOnline)->get()->pluck('mysql'); + $glDetail = $connectionCawangan->map(fn ($x) => GlDetail::on($x)->where('teller', 'ONLINE')->whereDate('tarikh', $date)->get()) ->flatten() From 9dd661ddb3c2d6ca901c76e57d4d9838f444a6c0 Mon Sep 17 00:00:00 2001 From: Afiq Hamzah Date: Fri, 19 Jul 2024 11:08:26 +0800 Subject: [PATCH 3/6] Fix query for gldetail when querying by norujukan --- app/Http/Controllers/TransactionOnlineController.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/TransactionOnlineController.php b/app/Http/Controllers/TransactionOnlineController.php index 70ea0b9..cd710d1 100644 --- a/app/Http/Controllers/TransactionOnlineController.php +++ b/app/Http/Controllers/TransactionOnlineController.php @@ -691,7 +691,7 @@ class TransactionOnlineController extends Controller $transaction = Transaction::whereDate('created_at', $date) ->where('teller', 'Online') ->when($request->norujukan, function ($query) use($request) { - return $query->where('norujukan', 'like', '%' . $request->norujukan . '%'); + return $query->where('norujukan', $request->norujukan); }) ->orderBy('created_at', 'desc') ->get() @@ -721,7 +721,6 @@ class TransactionOnlineController extends Controller $connectionCawangan = Cawangan::on('mysql7')->whereIn('kodcaw', $cawanganTransactionOnline)->get()->pluck('mysql'); - $glDetail = $connectionCawangan->map(fn ($x) => GlDetail::on($x)->where('teller', 'ONLINE')->whereDate('tarikh', $date)->get()) ->flatten() ->when($isGroupByNorujukan, function ($glDetail) { @@ -732,7 +731,7 @@ class TransactionOnlineController extends Controller }); }) ->when($request->filled('norujukan'), function ($glDetail) use($request) { - return $glDetail->where('norujukan', $request->norujukan); + return $glDetail->filter(fn($x) => strpos($x->descpt, $request->norujukan) !== false); }) ->sortKeysDesc() ->toArray(); From 23ebcdd98e7c3a75e5cd6f0ff29057970f365b82 Mon Sep 17 00:00:00 2001 From: Afiq Hamzah Date: Thu, 1 Aug 2024 13:58:50 +0800 Subject: [PATCH 4/6] Add online transaction log module --- .../TransactionOnlineController.php | 215 +++++++++++------- .../TransactionOnlineLogController.php | 33 +++ .../OnlineTransactionLoggerService.php | 40 ++++ app/TransactionOnlineLog.php | 20 ++ app/TransactionOnlineStatus.php | 46 ++++ ..._163407_create_transaction_online_logs.php | 35 +++ routes/web.php | 2 + 7 files changed, 305 insertions(+), 86 deletions(-) create mode 100644 app/Http/Controllers/TransactionOnlineLogController.php create mode 100644 app/Services/Loggers/OnlineTransactionLoggerService.php create mode 100644 app/TransactionOnlineLog.php create mode 100644 app/TransactionOnlineStatus.php create mode 100644 database/migrations/2024_07_28_163407_create_transaction_online_logs.php diff --git a/app/Http/Controllers/TransactionOnlineController.php b/app/Http/Controllers/TransactionOnlineController.php index cd710d1..8229f80 100644 --- a/app/Http/Controllers/TransactionOnlineController.php +++ b/app/Http/Controllers/TransactionOnlineController.php @@ -2,25 +2,24 @@ namespace App\Http\Controllers; -use App\TransactionOnline; use App\Advansur; -use App\Transaction; -use App\TransaksiKeuntungan; -use App\Gadai; -use App\Cawangan; -use App\GlDetail; use App\Audit; -use Illuminate\Http\Request; -use Carbon\Carbon; -use App\Services\OnePercentServices; -use Illuminate\Support\Facades\Log; -use Illuminate\Support\Facades\DB; -use Illuminate\Http\Request as HttpRequest; -use App\Support\v2\GadaiV2 as Version2Gadai; -use App\Support\v2\Calculation; - +use App\Cawangan; +use App\Gadai; +use App\GlDetail; use App\Http\Controllers\TebusController as TebusController; -use Illuminate\Support\Facades\Http; +use App\Services\Loggers\OnlineTransactionLoggerService; +use App\Services\OnePercentServices; +use App\Support\v2\Calculation; +use App\Support\v2\GadaiV2 as Version2Gadai; +use App\Transaction; +use App\TransactionOnline; +use App\TransactionOnlineStatus; +use App\TransaksiKeuntungan; +use Carbon\Carbon; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; class TransactionOnlineController extends Controller { @@ -30,20 +29,18 @@ class TransactionOnlineController extends Controller return response()->json($transactionOnline); } - + public function getListTransactionOnlineQuery(Request $request) { - + $date = $request->date ? $request->date : Carbon::now()->toDateString(); $transactionOnline = TransactionOnline::on('mysql7') - ->whereDate('tarikh', $date) - ->get(); - - + ->whereDate('tarikh', $date) + ->get(); return response()->json($transactionOnline); } - + public function getLatestNosiri() { $current = Carbon::now(); @@ -75,7 +72,7 @@ class TransactionOnlineController extends Controller 'masa' => $current->toTimeString(), 'customer_name' => $request->customer_name, 'tempohbayar' => $sag['tempoh'], - 'jenisbayaran' => $request->jenisbayaran ? $request->jenisbayaran : 'A' + 'jenisbayaran' => $request->jenisbayaran ? $request->jenisbayaran : 'A', ]); return response()->json($transaction, 201); @@ -85,7 +82,7 @@ class TransactionOnlineController extends Controller { $transaction = TransactionOnline::on('mysql7')->where('billplz_id', '=', $request->billplz_id)->update(array( 'status' => $request->status, - 'paid_at' => $request->paid_at + 'paid_at' => $request->paid_at, )); return response()->json($transaction, 200); @@ -103,27 +100,40 @@ class TransactionOnlineController extends Controller $gadai_data = Gadai::on($cawangan['mysql'])->where([['norujukan', $transaction['norujukan']], ['nokp', $transaction['nokp']]])->first(); if ($transaction->jenisbayaran == 'A') { if ($gadai_data['hargajualan'] > 0) { - $response = $this->updateGadaiMarhunOnline($transaction['kodcaw'], $transaction['norujukan'], $transaction['total_payment'], $transaction['paid_at'], $transaction['tempohbayar']); + $response = $this->updateGadaiMarhunOnline($transaction['kodcaw'], $transaction['norujukan'], $transaction['total_payment'], $transaction['paid_at'], $transaction['tempohbayar'], $transaction['billplz_id']); } else { $this->createAdvansur($transaction['kodcaw'], $transaction['norujukan'], $transaction['total_payment'], $transaction['paid_at']); } } - - GlDetail::on($cawangan['mysql'])->create([ + $glDetailData = [ 'kodcaw' => $transaction['kodcaw'], 'tarikh' => Carbon::parse($transaction['paid_at'])->format('Y-m-d'), 'dtacct' => '1000/010', 'ktacct' => '1000/020', 'descpt' => 'SERAHAN BAYAR ONLINE - ' . $transaction['norujukan'], 'serahan' => $transaction['total_payment'], - 'teller' => 'ONLINE' - ]); + 'teller' => 'ONLINE', + ]; - TransactionOnline::on('mysql7')->where([['norujukan', $transaction['norujukan']], ['billplz_id', $transaction['billplz_id']]])->update([ + try { + $glDetail = GlDetail::on($cawangan['mysql'])->create($glDetailData); + OnlineTransactionLoggerService::logsAfterDBTransaction($transaction->billplz_id, TransactionOnlineStatus::CRONJOB_REGISTER_GLDETAIL, $glDetail, $glDetailData); + } catch (\Exception $e) { + OnlineTransactionLoggerService::logsAfterDBTransaction($transaction->billplz_id, TransactionOnlineStatus::CRONJOB_REGISTER_GLDETAIL, $glDetail, $e->getMessage()); + } + + $transactionOnlineData = [ 'update_status' => 1, - 'update_serahan' => 1 - ]); + 'update_serahan' => 1, + ]; + + try { + $transactionOnline = TransactionOnline::on('mysql7')->where([['norujukan', $transaction['norujukan']], ['billplz_id', $transaction['billplz_id']]])->update($transactionOnlineData); + OnlineTransactionLoggerService::logsAfterDBTransaction($transaction['billplz_id'], TransactionOnlineStatus::CRONJOB_UPDATE_TRANSAKSI_ONLINE, $transactionOnlineData, $transactionOnline); + } catch (\Exception $e) { + OnlineTransactionLoggerService::logsAfterDBTransaction($transaction['billplz_id'], TransactionOnlineStatus::CRONJOB_UPDATE_TRANSAKSI_ONLINE, $transactionOnlineData, $e->getMessage()); + } } return response()->json('success'); @@ -246,8 +256,6 @@ class TransactionOnlineController extends Controller // } // $bilang_bln = $tempoh - $gadai['tempohbayar']; - - // $transaction_upah = TransaksiKeuntungan::on('mysql7')->create([ // 'norujukan' => $norujukan, // 'bayaran_keuntungan' => $upahsemasa, @@ -265,7 +273,6 @@ class TransactionOnlineController extends Controller // ]); // - // DB::connection($cawangan['mysql'])->transaction(function () use($cawangan,$baki_pinjaman,$current,$norujukan,$gadai,$baki_hargajualan,$lelong_tawarruq,$margin_semasa){ // $margin_updated = ($baki_pinjaman / $gadai['nilaimarhun']) * 100; @@ -309,7 +316,7 @@ class TransactionOnlineController extends Controller // return response()->json("success",200); // } - public function updateGadaiMarhunOnline($kodcaw, $norujukan, $bayaran, $paid_at, $tempohbayar) + public function updateGadaiMarhunOnline($kodcaw, $norujukan, $bayaran, $paid_at, $tempohbayar, $bill_id) { $current = Carbon::now(); $current = new Carbon(); @@ -343,9 +350,9 @@ class TransactionOnlineController extends Controller try { - DB::connection('mysql7')->transaction(function () use ($norujukan, $gadai, $kodcaw, $current, $baki_hargajualan, $cawangan, $old_data, $lelong_tawarruq, $margin_semasa, $bayaran, $tempohbayar) { + DB::connection('mysql7')->transaction(function () use ($norujukan, $gadai, $kodcaw, $current, $baki_hargajualan, $cawangan, $old_data, $lelong_tawarruq, $margin_semasa, $bayaran, $tempohbayar, $bill_id) { - $transaction = Transaction::on('mysql7')->create([ + $data = [ 'trans_type' => 'A', 'norujukan' => $norujukan, 'nokp' => $gadai['nokp'], @@ -354,7 +361,14 @@ class TransactionOnlineController extends Controller 'duit_masuk' => $bayaran, 'created_at' => $current, 'bakiharga' => $baki_hargajualan, - ]); + ]; + + try { + $transaction = Transaction::on('mysql7')->create($data); + OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_TRANSACTION, $data, $transaction); + } catch (\Exception $e) { + OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_TRANSACTION, $data, $e->getMessage()); + } if ($gadai['tempoh'] >= 12.0) { $tempoh = 12; @@ -368,7 +382,8 @@ class TransactionOnlineController extends Controller $baki_bayaran = $bayaran - $upahsemasa; $upahsemasa = $this->kiraupahTawarruq($kodcaw, $norujukan, $tempohbayar); $upahrebet = $this->kiraUpahRebet($kodcaw, $norujukan, $tempohbayar); - $transaction_upah = TransaksiKeuntungan::on('mysql7')->create([ + + $dataTransactionUpah = [ 'norujukan' => $norujukan, 'bayaran_keuntungan' => $upahsemasa, 'bayaran_pembiayaan' => $baki_bayaran, @@ -382,7 +397,15 @@ class TransactionOnlineController extends Controller 'tempoh' => 0, 'beza_tempoh' => 0, 'margin_semasa' => 0, - ]); + ]; + + try { + $transaction_upah = TransaksiKeuntungan::on('mysql7')->create($dataTransactionUpah); + OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_TRANSAKSI_KEUNTUNGAN, $dataTransactionUpah, $transaction_upah); + } catch (\Exception $e) { + OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_TRANSAKSI_KEUNTUNGAN, $dataTransactionUpah, $e->getMessage()); + } + } else { $onepercent = new OnePercentServices(); @@ -404,7 +427,7 @@ class TransactionOnlineController extends Controller $keun = $onepercent->getRoundedMethod($onepercentasal * $bilang_bln); $keuntungan_rebate = $onepercent->getRoundedMethod($keuntungan['onepercent'] * $bilang_bln); - $transaction_upah = TransaksiKeuntungan::on('mysql7')->create([ + $dataTransactionUpah = [ 'norujukan' => $norujukan, 'bayaran_keuntungan' => $upahsemasa, 'bayaran_pembiayaan' => $baki_bayaran, @@ -418,15 +441,22 @@ class TransactionOnlineController extends Controller 'tempoh' => $gadai['tempoh'], 'beza_tempoh' => $bilang_bln, 'margin_semasa' => $margin_semasa, - ]); + ]; + + try { + $transaction_upah = TransaksiKeuntungan::on('mysql7')->create($dataTransactionUpah); + OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_TRANSAKSI_KEUNTUNGAN, $dataTransactionUpah, $transaction_upah); + } catch (\Exception $e) { + OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_TRANSAKSI_KEUNTUNGAN, $dataTransactionUpah, $e->getMessage()); + } } $baki_pinjaman = $gadai['bakipjm'] - $baki_bayaran; - DB::connection($cawangan['mysql'])->transaction(function () use ($cawangan, $baki_pinjaman, $current, $norujukan, $gadai, $baki_hargajualan, $lelong_tawarruq, $margin_semasa) { + DB::connection($cawangan['mysql'])->transaction(function () use ($cawangan, $baki_pinjaman, $current, $norujukan, $gadai, $baki_hargajualan, $lelong_tawarruq, $margin_semasa, $bill_id) { $margin_updated = ($baki_pinjaman / $gadai['nilaimarhun']) * 100; - $update_gadai = Gadai::on($cawangan['mysql'])->where('norujukan', '=', $norujukan)->update(array( + $updateGadaiData = [ 'bakipjm' => $baki_pinjaman, 'jbg' => 0, 't_update' => $current->toDateString(), @@ -434,27 +464,41 @@ class TransactionOnlineController extends Controller 'tempohbayar' => $gadai['tempoh'], 'lelong_tawarruq' => $lelong_tawarruq, 'margin_semasa' => $margin_updated, - )); + ]; + + try { + $update_gadai = Gadai::on($cawangan['mysql'])->where('norujukan', '=', $norujukan)->update($updateGadaiData); + OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_GADAI, $updateGadaiData, $update_gadai); + } catch (\Exception $e) { + OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_GADAI, $updateGadaiData, $e->getMessage()); + } + }); $new_data = Gadai::on($cawangan['mysql'])->where('norujukan', '=', $norujukan)->first(); - $audit = new Audit(); - $audit->users = 'Online'; - $audit->actions = 'Bayaran Ansuran'; - $audit->norujukan = $norujukan; - $audit->new_data = $new_data; - $audit->old_data = $old_data; - $audit->kodcaw = $kodcaw; - $audit->created_at = $current; - $audit->updated_at = $current; - $audit->save(); + $auditData = [ + 'users' => 'Online', + 'actions' => 'Bayaran Ansuran', + 'norujukan' => $norujukan, + 'new_data' => $new_data, + 'old_data' => $old_data, + 'kodcaw' => $kodcaw, + 'created_at' => $current, + 'updated_at' => $current, + ]; + + try { + $audit = Audit::create($auditData); + OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_REGISTER_AUDIT, $auditData, $audit); + } catch (\Exception $e) { + OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_REGISTER_AUDIT, $auditData, $e->getMessage()); + } if (!$transaction || !$transaction_upah) { throw new \Exception('One of the database operations failed.'); } - DB::commit(); }); } catch (\Exception $e) { @@ -491,7 +535,7 @@ class TransactionOnlineController extends Controller 'nowakil' => 0, 'hubungan' => 0, 'status' => 0, - 'historygadaian' => $norujukan + 'historygadaian' => $norujukan, ]); return response()->json($create_advansur, 201); @@ -541,7 +585,7 @@ class TransactionOnlineController extends Controller { $transaction = TransactionOnline::on('mysql7')->where('billplz_id', '=', $request->billplz_id)->update(array( 'status' => $request->status, - 'paid_at' => $request->paid_at + 'paid_at' => $request->paid_at, )); return response()->json($transaction, 200); @@ -554,7 +598,6 @@ class TransactionOnlineController extends Controller $gadai_all = []; $akanlelongarray = []; - foreach ($cawangan_all as $index => $cawangan) { $gadai = Gadai::on($cawangan['mysql']) ->where([['sttebus', '=', ''], ['taglel', 0], ['nokp', '=', $request->ic]]) @@ -571,7 +614,7 @@ class TransactionOnlineController extends Controller } $array_utg = new \Illuminate\Http\Request([ - 'jeniskeuntungan' => $jenis + 'jeniskeuntungan' => $jenis, ]); $result = (new TebusController)->upahTawarruq($gad['kodcaw'], $gad['norujukan'], $array_utg); @@ -606,7 +649,7 @@ class TransactionOnlineController extends Controller } $array_utg = new \Illuminate\Http\Request([ - 'jeniskeuntungan' => $jenis + 'jeniskeuntungan' => $jenis, ]); $result = (new TebusController)->kiraupahTawarruq($lelong['kodcaw'], $lelong['norujukan'], $array_utg); @@ -619,7 +662,7 @@ class TransactionOnlineController extends Controller return response()->json( array( 'gadai' => $gadai_all, - 'lelong' => $akanlelongarray + 'lelong' => $akanlelongarray, ), 200 ); @@ -628,7 +671,7 @@ class TransactionOnlineController extends Controller public function updateTagPortal(Request $request) { $transaction = TransactionOnline::on('mysql7')->where('billplz_id', '=', $request->billplz_id)->update(array( - 'tagportal' => 1 + 'tagportal' => 1, )); return response()->json($transaction, 200); @@ -639,7 +682,7 @@ class TransactionOnlineController extends Controller try { $gadai = (new GadaiController())->showOneGadaibyRujukanAndCawangan($kodcaw, $norujukan) - ->getData()[0]; + ->getData()[0]; $jenis_keuntungan = $gadai->tagbaru === 1 ? 'onepercent' : 'asal'; @@ -650,8 +693,8 @@ class TransactionOnlineController extends Controller $upah_rebet_tawarruq = (new TebusController())->upahRebetTawarruq($kodcaw, $norujukan, $request_upah_rebet_tawarruq); if ($jenis_keuntungan === 'onepercent') { - $ujrah_sebenar = (float)$upah_tawarruq['ujrah']; - $ujrah_rebet = $ujrah_sebenar - (float)$upah_rebet_tawarruq['ujrah']; + $ujrah_sebenar = (float) $upah_tawarruq['ujrah']; + $ujrah_rebet = $ujrah_sebenar - (float) $upah_rebet_tawarruq['ujrah']; return [ 'ujrah_sebenar' => $ujrah_sebenar, @@ -660,29 +703,29 @@ class TransactionOnlineController extends Controller } return [ - 'ujrah_sebenar' => (float)$upah_tawarruq, - 'ujrah_rebet' => (float)$upah_rebet_tawarruq, + 'ujrah_sebenar' => (float) $upah_tawarruq, + 'ujrah_rebet' => (float) $upah_rebet_tawarruq, ]; } catch (\Throwable $th) { Log::error($th); return $th; } } - - function getListTransactionOnlineTrail(Request $request) + + public function getListTransactionOnlineTrail(Request $request) { - $date = $request->date ? $request->date : Carbon::now()->toDateString(); + $date = $request->date ? $request->date : Carbon::now()->toDateString(); $isGroupByNorujukan = $request->filled('isGroupedByNorujukan') && $request->isGroupedByNorujukan === '1'; $transactionsOnline = TransactionOnline::whereDate('tarikh', $date) - ->when($request->filled('norujukan'), function ($query) use($request) { + ->when($request->filled('norujukan'), function ($query) use ($request) { return $query->where('norujukan', $request->norujukan); }) ->orderBy('tarikh', 'desc') ->orderBy('masa', 'desc') ->get() - ->filter(fn ($x) => $x['status'] === 'PAID') + ->filter(fn($x) => $x['status'] === 'PAID') ->when($isGroupByNorujukan, function ($query) { return $query->groupBy('norujukan')->sortKeysDesc(); }) @@ -690,7 +733,7 @@ class TransactionOnlineController extends Controller $transaction = Transaction::whereDate('created_at', $date) ->where('teller', 'Online') - ->when($request->norujukan, function ($query) use($request) { + ->when($request->norujukan, function ($query) use ($request) { return $query->where('norujukan', $request->norujukan); }) ->orderBy('created_at', 'desc') @@ -701,7 +744,7 @@ class TransactionOnlineController extends Controller ->toArray(); $transaksiKeuntungan = TransaksiKeuntungan::whereDate('tarikh_bayaran', $date) - ->when($request->norujukan, function ($query) use($request) { + ->when($request->norujukan, function ($query) use ($request) { return $query->where('norujukan', $request->norujukan); }) ->orderBy('tarikh_bayaran', 'desc') @@ -720,17 +763,17 @@ class TransactionOnlineController extends Controller ->all(); $connectionCawangan = Cawangan::on('mysql7')->whereIn('kodcaw', $cawanganTransactionOnline)->get()->pluck('mysql'); - - $glDetail = $connectionCawangan->map(fn ($x) => GlDetail::on($x)->where('teller', 'ONLINE')->whereDate('tarikh', $date)->get()) + + $glDetail = $connectionCawangan->map(fn($x) => GlDetail::on($x)->where('teller', 'ONLINE')->whereDate('tarikh', $date)->get()) ->flatten() ->when($isGroupByNorujukan, function ($glDetail) { return $glDetail->groupBy('descpt') - ->keyBy(function ($group, $key) { - $array = explode(' ', $key); - return end($array); - }); + ->keyBy(function ($group, $key) { + $array = explode(' ', $key); + return end($array); + }); }) - ->when($request->filled('norujukan'), function ($glDetail) use($request) { + ->when($request->filled('norujukan'), function ($glDetail) use ($request) { return $glDetail->filter(fn($x) => strpos($x->descpt, $request->norujukan) !== false); }) ->sortKeysDesc() @@ -740,7 +783,7 @@ class TransactionOnlineController extends Controller 'transactionsOnline' => $transactionsOnline, 'transaction' => $transaction, 'transaksiKeuntungan' => $transaksiKeuntungan, - 'glDetail' => $glDetail + 'glDetail' => $glDetail, ]); - } + } } diff --git a/app/Http/Controllers/TransactionOnlineLogController.php b/app/Http/Controllers/TransactionOnlineLogController.php new file mode 100644 index 0000000..8d62144 --- /dev/null +++ b/app/Http/Controllers/TransactionOnlineLogController.php @@ -0,0 +1,33 @@ +json($log, 201); + } + + public function index(Request $request) + { + $transactionOnlineLogs = TransactionOnlineLog::query() + ->when($request->filled('date'), function ($query) use ($request) { + return $query->whereDate('created_at', $request->date); + }) + ->get() + ->map(function ($x) { + $x->status_label = TransactionOnlineStatus::statusLabel($x->status); + return $x; + }); + + return response()->json($transactionOnlineLogs, 200); + } +} diff --git a/app/Services/Loggers/OnlineTransactionLoggerService.php b/app/Services/Loggers/OnlineTransactionLoggerService.php new file mode 100644 index 0000000..71be5fa --- /dev/null +++ b/app/Services/Loggers/OnlineTransactionLoggerService.php @@ -0,0 +1,40 @@ + $request->bill_id, + 'status' => $request->status, + 'payload' => $request->payload, + 'response' => $request->response, + ]); + + return $log; + } + + public static function logsAfterDBTransaction($bill_id, $status, $request, $response) + { + $formatToString = function ($data) { + if (is_array($data) || is_object($data)) { + return json_encode($data); + } + + return $data; + }; + + $log = TransactionOnlineLog::create([ + 'bill_id' => $formatToString($bill_id), + 'status' => $formatToString($status), + 'payload' => $formatToString($request), + 'response' => $formatToString($response), + ]); + + return $log; + } +} diff --git a/app/TransactionOnlineLog.php b/app/TransactionOnlineLog.php new file mode 100644 index 0000000..2bb983e --- /dev/null +++ b/app/TransactionOnlineLog.php @@ -0,0 +1,20 @@ +format('d/m/Y H:i:s') : null; + } +} diff --git a/app/TransactionOnlineStatus.php b/app/TransactionOnlineStatus.php new file mode 100644 index 0000000..9c8a061 --- /dev/null +++ b/app/TransactionOnlineStatus.php @@ -0,0 +1,46 @@ + 'Bill Created', + self::INITIALIZED_TRANSACTION => 'Initialized Transaction', + self::UPDATED_TAG_PORTAL => 'Updated Tag Portal', + self::UPDATE_TRANSACTION_CALLBACK => 'Update Transaction Callback', + self::UPDATE_TRANSACTION_REDIRECT => 'Update Transaction Redirect', + self::CRONJOB_UPDATE_TRANSACTION => 'Cronjob Update Transaction', + self::CRONJOB_UPDATE_TRANSAKSI_KEUNTUNGAN => 'Cronjob Update Transaksi Keuntungan', + self::CRONJOB_UPDATE_GADAI => 'Cronjob Update Gadai', + self::CRONJOB_REGISTER_AUDIT => 'Cronjob Register Audit', + self::CRONJOB_REGISTER_GLDETAIL => 'Cronjob Register GlDetail', + self::CRONJOB_UPDATE_TRANSAKSI_ONLINE => 'Cronjob Update Transaksi Online', + ]; + } + + public static function statusLabel($status_code) + { + $list = self::listStatus(); + + return isset($list[$status_code]) + ? $list[$status_code] + : $status_code; + } +} diff --git a/database/migrations/2024_07_28_163407_create_transaction_online_logs.php b/database/migrations/2024_07_28_163407_create_transaction_online_logs.php new file mode 100644 index 0000000..e308b9c --- /dev/null +++ b/database/migrations/2024_07_28_163407_create_transaction_online_logs.php @@ -0,0 +1,35 @@ +id(); + $table->string('bill_id'); + $table->unsignedInteger('status'); + $table->string('payload', 10000); + $table->string('response', 10000); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('log_transaction_online'); + } +} diff --git a/routes/web.php b/routes/web.php index bb0bed3..ba84d71 100644 --- a/routes/web.php +++ b/routes/web.php @@ -262,6 +262,8 @@ $router->group(['prefix'=>'api'], function () use ($router){ $router->put('transaction/online/tagportal',['uses'=>'TransactionOnlineController@updateTagPortal']); $router->get('transaction/online/query',['uses'=>'TransactionOnlineController@getListTransactionOnlineQuery']); $router->get('transaction/online/trail',['uses'=>'TransactionOnlineController@getListTransactionOnlineTrail']); + $router->get('transaction/online/log',['uses'=>'TransactionOnlineLogController@index']); + $router->post('transaction/online/log',['uses'=>'TransactionOnlineLogController@create']); //ANSURAN UPAH API $router->get('ansuran/laporan/{kodcaw}',['uses'=>'GadaiController@getLaporanAnsuran']); From 78ea84880110dfd17be15b43875c46e06fb3c153 Mon Sep 17 00:00:00 2001 From: Afiq Hamzah Date: Thu, 1 Aug 2024 14:39:16 +0800 Subject: [PATCH 5/6] Log when update unsucces transaction command/job runs --- app/TransactionOnlineStatus.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/TransactionOnlineStatus.php b/app/TransactionOnlineStatus.php index 9c8a061..a233d88 100644 --- a/app/TransactionOnlineStatus.php +++ b/app/TransactionOnlineStatus.php @@ -17,6 +17,8 @@ class TransactionOnlineStatus extends Model const CRONJOB_REGISTER_AUDIT = 9; const CRONJOB_REGISTER_GLDETAIL = 10; const CRONJOB_UPDATE_TRANSAKSI_ONLINE = 11; + const UPDATE_UNSUCCESSFUL_TRANSACTION = 12; + public static function listStatus() { @@ -32,6 +34,7 @@ class TransactionOnlineStatus extends Model self::CRONJOB_REGISTER_AUDIT => 'Cronjob Register Audit', self::CRONJOB_REGISTER_GLDETAIL => 'Cronjob Register GlDetail', self::CRONJOB_UPDATE_TRANSAKSI_ONLINE => 'Cronjob Update Transaksi Online', + self::UPDATE_UNSUCCESSFUL_TRANSACTION => 'Update Unsuccessful Transaction', ]; } From f7b4f919965ee78d92fa90fddd1f76a2330aef82 Mon Sep 17 00:00:00 2001 From: Afiq Hamzah Date: Thu, 1 Aug 2024 14:54:02 +0800 Subject: [PATCH 6/6] Throw exception in catch block to ensure that the code execution / flowed stops - This to prevent broken data to be entered into tables --- app/Http/Controllers/TransactionOnlineController.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/Http/Controllers/TransactionOnlineController.php b/app/Http/Controllers/TransactionOnlineController.php index 8229f80..10e9c9e 100644 --- a/app/Http/Controllers/TransactionOnlineController.php +++ b/app/Http/Controllers/TransactionOnlineController.php @@ -121,6 +121,7 @@ class TransactionOnlineController extends Controller OnlineTransactionLoggerService::logsAfterDBTransaction($transaction->billplz_id, TransactionOnlineStatus::CRONJOB_REGISTER_GLDETAIL, $glDetail, $glDetailData); } catch (\Exception $e) { OnlineTransactionLoggerService::logsAfterDBTransaction($transaction->billplz_id, TransactionOnlineStatus::CRONJOB_REGISTER_GLDETAIL, $glDetail, $e->getMessage()); + throw $e; } $transactionOnlineData = [ @@ -133,6 +134,7 @@ class TransactionOnlineController extends Controller OnlineTransactionLoggerService::logsAfterDBTransaction($transaction['billplz_id'], TransactionOnlineStatus::CRONJOB_UPDATE_TRANSAKSI_ONLINE, $transactionOnlineData, $transactionOnline); } catch (\Exception $e) { OnlineTransactionLoggerService::logsAfterDBTransaction($transaction['billplz_id'], TransactionOnlineStatus::CRONJOB_UPDATE_TRANSAKSI_ONLINE, $transactionOnlineData, $e->getMessage()); + throw $e; } } @@ -368,6 +370,7 @@ class TransactionOnlineController extends Controller OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_TRANSACTION, $data, $transaction); } catch (\Exception $e) { OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_TRANSACTION, $data, $e->getMessage()); + throw $e; } if ($gadai['tempoh'] >= 12.0) { @@ -404,6 +407,7 @@ class TransactionOnlineController extends Controller OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_TRANSAKSI_KEUNTUNGAN, $dataTransactionUpah, $transaction_upah); } catch (\Exception $e) { OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_TRANSAKSI_KEUNTUNGAN, $dataTransactionUpah, $e->getMessage()); + throw $e; } } else { @@ -448,6 +452,7 @@ class TransactionOnlineController extends Controller OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_TRANSAKSI_KEUNTUNGAN, $dataTransactionUpah, $transaction_upah); } catch (\Exception $e) { OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_TRANSAKSI_KEUNTUNGAN, $dataTransactionUpah, $e->getMessage()); + throw $e; } } @@ -471,6 +476,7 @@ class TransactionOnlineController extends Controller OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_GADAI, $updateGadaiData, $update_gadai); } catch (\Exception $e) { OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_UPDATE_GADAI, $updateGadaiData, $e->getMessage()); + throw $e; } }); @@ -493,6 +499,7 @@ class TransactionOnlineController extends Controller OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_REGISTER_AUDIT, $auditData, $audit); } catch (\Exception $e) { OnlineTransactionLoggerService::logsAfterDBTransaction($bill_id, TransactionOnlineStatus::CRONJOB_REGISTER_AUDIT, $auditData, $e->getMessage()); + throw $e; } if (!$transaction || !$transaction_upah) {