feat(shoraka): defer gadai persistence until commodity confirmation and add simulation support
This commit is contained in:
@@ -55,6 +55,10 @@ class GadaiController extends Controller
|
||||
$cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$cawangan_code)->first();
|
||||
|
||||
$gadaiTransaction = Gadai::on($cawangan['mysql'])->where('t_gadai','=',$date)->orderBy('sirig', 'desc')->first();
|
||||
$serial = app(\App\Services\ShorakaNewGadaiService::class)->latestSerial($cawangan_code, $date);
|
||||
if ($serial > (int) ($gadaiTransaction->sirig ?? 0)) {
|
||||
$gadaiTransaction = ['sirig' => $serial];
|
||||
}
|
||||
}catch(\Exception $e){
|
||||
Log::debug($e);
|
||||
Log::debug($cawangan_code);
|
||||
@@ -111,7 +115,7 @@ class GadaiController extends Controller
|
||||
$gadai_all = [];
|
||||
|
||||
foreach($cawangan_all as $index=>$cawangan){
|
||||
$gadai = Gadai::on($cawangan['mysql'])->where('norujukan','=',$norujukan)->get();
|
||||
$gadai = collect(array_filter([app(\App\Services\ShorakaNewGadaiService::class)->find($cawangan->kodcaw, $norujukan)]));
|
||||
if(sizeof($gadai) != 0){
|
||||
array_push($gadai_all,$gadai);
|
||||
}
|
||||
@@ -130,7 +134,7 @@ class GadaiController extends Controller
|
||||
$gadai_all = [];
|
||||
|
||||
foreach($cawangan_all as $index=>$cawangan){
|
||||
$gadai = Gadai::on($cawangan['mysql'])->where('norujukan','=',$norujukan)->get();
|
||||
$gadai = collect(array_filter([app(\App\Services\ShorakaNewGadaiService::class)->find($cawangan->kodcaw, $norujukan)]));
|
||||
if(sizeof($gadai) != 0){
|
||||
array_push($gadai_all,$gadai);
|
||||
}
|
||||
@@ -152,13 +156,22 @@ class GadaiController extends Controller
|
||||
|
||||
public function showOneGadaibyRujukanAndCawangan($kodcaw,$norujukan){
|
||||
$cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first();
|
||||
$gadai = Gadai::on($cawangan['mysql'])->where('norujukan','=',$norujukan)->get();
|
||||
$gadai = collect(array_filter([app(\App\Services\ShorakaNewGadaiService::class)->find($cawangan->kodcaw, $norujukan)]));
|
||||
|
||||
return response()->json($gadai);
|
||||
}
|
||||
|
||||
public function create($kodcaw,Request $request){
|
||||
if ($request->boolean('shoraka_new')) {
|
||||
$this->validate($request, ['nokp' => 'required|string', 'nopelanggan' => 'required']);
|
||||
return response()->json(app(\App\Services\ShorakaNewGadaiService::class)->reserve(
|
||||
$kodcaw, $request->only(['nokp', 'nopelanggan'])
|
||||
), 201);
|
||||
}
|
||||
|
||||
if (app(\App\Services\ShorakaNewGadaiService::class)->pending($kodcaw, (string) $request->norujukan)) {
|
||||
abort(409, 'Nombor rujukan sedang digunakan. Sila dapatkan nombor baharu.');
|
||||
}
|
||||
$master = new MasterServices($kodcaw);
|
||||
$response = $master->createGadai($request);
|
||||
|
||||
@@ -228,14 +241,18 @@ class GadaiController extends Controller
|
||||
}
|
||||
|
||||
|
||||
public function daftarGadaiMarhun($norujukan,Request $request){
|
||||
if (\App\ShorakaTransaction::where('norujukan', $request->norujukan)->exists()) {
|
||||
public function daftarGadaiMarhun($kodcaw, $norujukan, Request $request)
|
||||
{
|
||||
if (\App\ShorakaTransaction::where('norujukan', $norujukan)->exists()) {
|
||||
abort(409, 'Kontrak telah dihantar ke Shoraka dan tidak boleh diubah.');
|
||||
}
|
||||
// dd("ggwp");
|
||||
$master = new MasterServices($request->kodcaw);
|
||||
$response = $master->createMarhunGadai($request->norujukan,$request);
|
||||
|
||||
$temporary = app(\App\Services\ShorakaNewGadaiService::class)->pending($kodcaw, $norujukan);
|
||||
if ($temporary && (string) $temporary['gadai']['nokp'] !== (string) $request->nokp) {
|
||||
abort(409, 'Pelanggan tidak sepadan dengan borang gadaian sementara.');
|
||||
}
|
||||
$request->merge(['kodcaw' => $kodcaw, 'norujukan' => $norujukan]);
|
||||
$master = new MasterServices($kodcaw);
|
||||
$response = $master->createMarhunGadai($norujukan, $request);
|
||||
return response()->json($response, 200);
|
||||
}
|
||||
|
||||
@@ -249,7 +266,13 @@ class GadaiController extends Controller
|
||||
|
||||
public function checkNorujukan(Request $request){
|
||||
$cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$request->kodcaw)->first();
|
||||
$gadai = Gadai::on($cawangan['mysql'])->where([['norujukan','=',$request->norujukan],['nokp','=',$request->nokp]])->first();
|
||||
$gadai = app(\App\Services\ShorakaNewGadaiService::class)->find($request->kodcaw, $request->norujukan);
|
||||
if (!$gadai && \App\ShorakaTransaction::where('norujukan', $request->norujukan)->exists()) {
|
||||
abort(409, 'Transaksi Shoraka wujud tetapi maklumat sementara tiada. Hubungi operasi; jangan daftar semula.');
|
||||
}
|
||||
if ($gadai && $gadai->nokp !== $request->nokp) {
|
||||
$gadai = null;
|
||||
}
|
||||
|
||||
return response()->json($gadai);
|
||||
}
|
||||
@@ -372,6 +395,16 @@ class GadaiController extends Controller
|
||||
}
|
||||
|
||||
public function batalGadai($kodcaw, $norujukan,Request $request){
|
||||
$temporary = app(\App\Services\ShorakaNewGadaiService::class);
|
||||
$order = \App\ShorakaTransaction::where('norujukan', $norujukan)->first();
|
||||
if ($order && !empty($order->request_payload['_new_gadai'])) {
|
||||
abort(409, 'Transaksi Shoraka telah dihantar. Semakan operasi diperlukan sebelum pembatalan.');
|
||||
}
|
||||
if ($temporary->pending($kodcaw, $norujukan)) {
|
||||
$temporary->abandon($kodcaw, $norujukan);
|
||||
return response('Batal Berjaya', 200);
|
||||
}
|
||||
|
||||
|
||||
$current = Carbon::now();
|
||||
$current = new Carbon();
|
||||
@@ -426,7 +459,8 @@ class GadaiController extends Controller
|
||||
}
|
||||
|
||||
public function cetakSAG($kodcaw,$norujukan,Request $request){
|
||||
if (\App\ShorakaTransaction::where('norujukan', $norujukan)->exists()) {
|
||||
if (\App\ShorakaTransaction::where('norujukan', $norujukan)->exists()
|
||||
|| app(\App\Services\ShorakaNewGadaiService::class)->pending($kodcaw, $norujukan)) {
|
||||
app(\App\Services\ShorakaGadaiService::class)->assertCompleted($kodcaw, $norujukan);
|
||||
}
|
||||
|
||||
@@ -454,7 +488,8 @@ class GadaiController extends Controller
|
||||
}
|
||||
|
||||
public function serahMarhun($kodcaw,$norujukan){
|
||||
if (\App\ShorakaTransaction::where('norujukan', $norujukan)->exists()) {
|
||||
if (\App\ShorakaTransaction::where('norujukan', $norujukan)->exists()
|
||||
|| app(\App\Services\ShorakaNewGadaiService::class)->pending($kodcaw, $norujukan)) {
|
||||
app(\App\Services\ShorakaGadaiService::class)->assertCompleted($kodcaw, $norujukan);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,9 @@ class MarhunController extends Controller
|
||||
$marhun_all = [];
|
||||
foreach($cawangan_all as $index=>$cawangan){
|
||||
$marhun = Marhun::on($cawangan['mysql'])->where('norujukan','=',$norujukan)->get();
|
||||
if ($marhun->isEmpty()) {
|
||||
$marhun = app(\App\Services\ShorakaNewGadaiService::class)->items($cawangan->kodcaw, $norujukan);
|
||||
}
|
||||
if(sizeof($marhun) != 0){
|
||||
array_push($marhun_all,$marhun);
|
||||
}
|
||||
@@ -40,6 +43,9 @@ class MarhunController extends Controller
|
||||
|
||||
$marhun = Marhun::on($cawangan['mysql'])->where('norujukan',$request->norujukan)->distinct()->pluck('karat')->toArray();
|
||||
|
||||
if (app(\App\Services\ShorakaNewGadaiService::class)->pending($request->kodcaw, $request->norujukan)) {
|
||||
$marhun = app(\App\Services\ShorakaNewGadaiService::class)->items($request->kodcaw, $request->norujukan)->pluck('karat')->unique()->all();
|
||||
}
|
||||
$mutu = HargaEmas::on('mysql7')->whereIn('karat',$marhun)->pluck('keterangan')->toArray();
|
||||
|
||||
return response()->json($mutu);
|
||||
@@ -59,6 +65,11 @@ class MarhunController extends Controller
|
||||
|
||||
public function create($kodcaw,Request $request)
|
||||
{
|
||||
$order = \App\ShorakaTransaction::where('norujukan', $request->norujukan)->first();
|
||||
if ($order && !empty($order->request_payload['_new_gadai'])) {
|
||||
abort(409, 'Kontrak Shoraka telah dihantar dan tidak boleh diubah.');
|
||||
}
|
||||
|
||||
$current = Carbon::now();
|
||||
$current = new Carbon();
|
||||
|
||||
@@ -96,6 +107,10 @@ class MarhunController extends Controller
|
||||
};
|
||||
|
||||
$cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first();
|
||||
$temporary = app(\App\Services\ShorakaNewGadaiService::class);
|
||||
if ($temporary->pending($kodcaw, $request->norujukan)) {
|
||||
return response()->json($temporary->changeItem($kodcaw, $request->norujukan, $marhunToCreate), 201);
|
||||
}
|
||||
$marhun = Marhun::on($cawangan['mysql'])->create($marhunToCreate);
|
||||
|
||||
$audit = new Audit();
|
||||
@@ -127,6 +142,17 @@ class MarhunController extends Controller
|
||||
|
||||
public function deletemarhun($kodcaw,$norujukan,Request $request)
|
||||
{
|
||||
$order = \App\ShorakaTransaction::where('norujukan', $norujukan)->first();
|
||||
if ($order && !empty($order->request_payload['_new_gadai'])) {
|
||||
abort(409, 'Kontrak Shoraka telah dihantar dan tidak boleh diubah.');
|
||||
}
|
||||
|
||||
$temporary = app(\App\Services\ShorakaNewGadaiService::class);
|
||||
if ($temporary->pending($kodcaw, $norujukan)) {
|
||||
$temporary->changeItem($kodcaw, $norujukan, [], $request->recno, true);
|
||||
return response('Deleted Successfully', 200);
|
||||
}
|
||||
|
||||
|
||||
$current = Carbon::now();
|
||||
$current = new Carbon();
|
||||
@@ -152,6 +178,11 @@ class MarhunController extends Controller
|
||||
|
||||
public function editmarhun($kodcaw,$norujukan,Request $request)
|
||||
{
|
||||
$order = \App\ShorakaTransaction::where('norujukan', $norujukan)->first();
|
||||
if ($order && !empty($order->request_payload['_new_gadai'])) {
|
||||
abort(409, 'Kontrak Shoraka telah dihantar dan tidak boleh diubah.');
|
||||
}
|
||||
|
||||
|
||||
$current = Carbon::now();
|
||||
$current = new Carbon();
|
||||
@@ -159,6 +190,17 @@ class MarhunController extends Controller
|
||||
$harga = HargaEmas::on('mysql7')->where('karat',$request->karat)->first();
|
||||
$nilai_marhun = $request->berat * $harga['harga'];
|
||||
|
||||
$temporary = app(\App\Services\ShorakaNewGadaiService::class);
|
||||
if ($temporary->pending($kodcaw, $norujukan)) {
|
||||
$temporary->changeItem($kodcaw, $norujukan, [
|
||||
'karat' => $request->karat, 'marhun' => $request->marhun, 'nota' => $request->nota,
|
||||
'tag_permata' => $request->tag_permata,
|
||||
'berat_batu_permata' => $request->berat_batu_permata ?: null,
|
||||
'berat' => $request->berat, 'harga' => $harga['harga'], 'n_marhun' => $nilai_marhun,
|
||||
'bil' => $request->kuantiti,
|
||||
], $request->recno);
|
||||
return response()->json(true);
|
||||
}
|
||||
$cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first();
|
||||
|
||||
// Lock the parent first so concurrent edits to this SAG are serialized.
|
||||
@@ -257,6 +299,9 @@ class MarhunController extends Controller
|
||||
|
||||
$marhuns = Marhun::on($cawangan['mysql'])->where('norujukan',$request->norujukan)->get();
|
||||
|
||||
if ($marhuns->isEmpty()) {
|
||||
$marhuns = app(\App\Services\ShorakaNewGadaiService::class)->items($request->kodcaw, $request->norujukan);
|
||||
}
|
||||
$totalnilaimarhun = 0;
|
||||
|
||||
foreach($marhuns as $index=>$marhun){
|
||||
@@ -270,6 +315,11 @@ class MarhunController extends Controller
|
||||
|
||||
public function getMarhunCaw($kodcaw,$norujukan)
|
||||
{
|
||||
$temporary = app(\App\Services\ShorakaNewGadaiService::class);
|
||||
if ($temporary->pending($kodcaw, $norujukan)) {
|
||||
return response()->json($temporary->items($kodcaw, $norujukan)->sum('n_marhun'));
|
||||
}
|
||||
|
||||
$cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first();
|
||||
$data = Marhun::on($cawangan['mysql'])
|
||||
->where('norujukan','=', $norujukan)
|
||||
|
||||
@@ -48,7 +48,7 @@ class ShorakaController extends Controller
|
||||
|
||||
try {
|
||||
// The unique norujukan index is the atomic claim for concurrent submissions.
|
||||
$transaction = ShorakaTransaction::create([
|
||||
$attributes = [
|
||||
'norujukan' => $validated['norujukan'],
|
||||
'kodcaw' => $request->attributes->get('shoraka_kodcaw'),
|
||||
'status' => 'PENDING',
|
||||
@@ -58,9 +58,15 @@ class ShorakaController extends Controller
|
||||
'ownership_doc_no' => $payload['ownership_doc_no'],
|
||||
'order_amount' => $payload['order_amount'],
|
||||
'murabaha_amount' => $payload['murabaha_amount'],
|
||||
'request_payload' => $payload,
|
||||
'request_payload' => $request->attributes->get('shoraka_new')
|
||||
? array_merge($payload, ['_new_gadai' => true]) : $payload,
|
||||
'attempt_count' => 1,
|
||||
]);
|
||||
];
|
||||
$create = function () use ($attributes) { return ShorakaTransaction::create($attributes); };
|
||||
$transaction = $request->attributes->get('shoraka_new')
|
||||
? app(\App\Services\ShorakaNewGadaiService::class)->claim(
|
||||
$request->attributes->get('shoraka_kodcaw'), $validated['norujukan'], $payload, $create
|
||||
) : $create();
|
||||
} catch (QueryException $exception) {
|
||||
$existing = ShorakaTransaction::where('norujukan', $validated['norujukan'])->first();
|
||||
if ($existing) {
|
||||
|
||||
@@ -25,7 +25,8 @@ class ShorakaGadaiController extends ShorakaController
|
||||
'order_amount' => $gadai->pinjaman, 'murabaha_amount' => $gadai->hargajualan,
|
||||
'order' => $order ? $this->orderData($order) : null,
|
||||
'details' => $order ? $order->response_payload : null,
|
||||
'can_complete' => $order && $order->status === 'Completed'
|
||||
'simulation' => $order && strpos((string) $order->order_id, 'SIM-') === 0,
|
||||
'can_complete' => $gadai->exists && $order && $order->status === 'Completed'
|
||||
&& number_format((float) $gadai->pinjaman, 2, '.', '') === $order->order_amount
|
||||
&& number_format((float) $gadai->hargajualan, 2, '.', '') === $order->murabaha_amount,
|
||||
],
|
||||
@@ -44,8 +45,16 @@ class ShorakaGadaiController extends ShorakaController
|
||||
|| $gadai->cetak || $gadai->sttebus) {
|
||||
abort(409, 'Gadaian lama atau telah selesai tidak boleh dihantar sebagai order baharu.');
|
||||
}
|
||||
$temporary = app(\App\Services\ShorakaNewGadaiService::class)->pending($kodcaw, $norujukan);
|
||||
if ($temporary && $gadai->exists) {
|
||||
abort(409, 'Rujukan sementara bertindih dengan gadaian sedia ada. Semakan operasi diperlukan.');
|
||||
}
|
||||
if ($temporary && !$temporary['prepared']) {
|
||||
abort(409, 'Sila sahkan semula amaun gadaian selepas perubahan marhun.');
|
||||
}
|
||||
$request = new Request($gadaiService->payload($gadai));
|
||||
$request->attributes->set('shoraka_kodcaw', $kodcaw);
|
||||
$request->attributes->set('shoraka_new', !$gadai->exists);
|
||||
return $this->submit($request, $shoraka);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user