diff --git a/app/FailoverTransaction.php b/app/FailoverTransaction.php new file mode 100644 index 0000000..2872b32 --- /dev/null +++ b/app/FailoverTransaction.php @@ -0,0 +1,43 @@ + 'boolean', + 'db_online' => 'boolean', + 'resolve_time' => 'datetime', + ]; +} diff --git a/app/Support/v2/Penebusan.php b/app/Support/v2/Penebusan.php index b2ba225..f6ee098 100644 --- a/app/Support/v2/Penebusan.php +++ b/app/Support/v2/Penebusan.php @@ -14,6 +14,7 @@ use App\InOutMar; use App\KomuditiPurchase; use App\KomuditiTransaksi; use App\Marhun; +use App\FailoverTransaction; use App\Moratorium; use App\Support\OnePercent; use App\Tebus; @@ -945,16 +946,19 @@ class Penebusan $array_trans_base = $request->only(['pinjaman','teller']); try{ - DB::transaction(function () use ($kodcaw,$norujukan,$gadai,$cawangan,$array_tebus,$array_trans,$array_tebus_base,$array_trans_base) { + $failover_response = $this->handleFailOverTransaction($kodcaw,'create',$norujukan,$request->teller); + DB::transaction(function () use ($failover_response,$kodcaw,$norujukan,$gadai,$cawangan,$array_tebus,$array_trans) { $this->saveTebus($kodcaw,$norujukan,$gadai,$cawangan,$array_tebus); - $this->createTransaction($cawangan,$kodcaw,$norujukan,$array_trans); - - DB::connection('mysql7')->transaction(function () use ($kodcaw,$norujukan,$gadai,$array_tebus_base,$array_trans_base) { - $this->saveTebusBase($kodcaw,$norujukan,$gadai,$array_tebus_base); - $this->createTransactionBase($norujukan,$kodcaw,$array_trans_base); - }); + $this->createTransaction($cawangan,$kodcaw,$norujukan,$array_trans,$failover_response['id']); }); + DB::connection('mysql7')->transaction(function () use ($kodcaw,$norujukan,$gadai,$array_tebus_base,$array_trans_base) { + $this->saveTebusBase($kodcaw,$norujukan,$gadai,$array_tebus_base); + $this->createTransactionBase($norujukan,$kodcaw,$array_trans_base); + }); + + $this->handleFailOverTransaction($kodcaw,'done',$norujukan,$request->teller,$failover_response['id']); + $array_response = [ 'result' => 'success', 'data' => 1 @@ -962,13 +966,20 @@ class Penebusan return response()->json($array_response); }catch(\Exception $e){ + if (isset($failover_response['id'])) { + $this->handleFailOverTransaction($kodcaw,'fail',$norujukan,$request->teller,$failover_response['id']); + } + $array_response = [ 'result' => 'error', 'data' => $e->getMessage() ]; - Log::debug('Exception: ' . $e->getMessage()); - Log::debug('Line: ' . $e->getLine()); + Log::error('Transaction failed', [ + 'exception' => $e->getMessage(), + 'line' => $e->getLine(), + 'file' => $e->getFile(), + ]); return response()->json($array_response); } @@ -1116,7 +1127,7 @@ class Penebusan ]); } - private function createTransaction($cawangan,$kodcaw,$norujukan,$array_trans){ + private function createTransaction($cawangan,$kodcaw,$norujukan,$array_trans,$fail_id = 0){ $current = Carbon::now(); /* Create Gadai */ @@ -1242,6 +1253,9 @@ class Penebusan 'historygadaian' => $new_sag_number, 'tag_tebus' => $array_trans['jenistebus'], )); + + $this->handleFailOverTransaction($kodcaw,'update',$new_sag_number,$array_trans['teller'],$fail_id); + } private function createTransactionBase($norujukan,$kodcaw,$array_trans_base){ @@ -1268,5 +1282,43 @@ class Penebusan ]); } + private function handleFailOverTransaction($kodcaw,$status,$norujukan,$teller,$fail_id = 0){ + $current = Carbon::now(); + + if($status == 'create'){ + return FailoverTransaction::on('mysql7')->create([ + 'kodcaw' => $kodcaw, + 'teller' => $teller, + 'old_norujukan' => $norujukan, + 'new_norujukan' => null, + 'db_caw' => false, + 'db_online' => false, + 'status' => 'pending' + ]); + }else if($status == 'update'){ + return FailoverTransaction::on('mysql7')->where('id',$fail_id)->update([ + 'new_norujukan' => $norujukan, + 'db_caw' => true, + 'db_online' => false, + 'status' => 'pending' + ]); + + }else if($status == 'done'){ + return FailoverTransaction::on('mysql7')->where('id',$fail_id)->update([ + 'new_norujukan' => $norujukan, + 'db_caw' => true, + 'db_online' => true, + 'status' => 'resolved', + 'resolve_time' => $current + ]); + }else{ + return FailoverTransaction::on('mysql7')->where('id',$fail_id)->update([ + 'old_norujukan' => $norujukan, + 'status' => 'fail', + ]); + } + + } + } \ No newline at end of file diff --git a/database/migrations/2024_11_17_163407_create_failover_transaction_table.php b/database/migrations/2024_11_17_163407_create_failover_transaction_table.php new file mode 100644 index 0000000..14717ad --- /dev/null +++ b/database/migrations/2024_11_17_163407_create_failover_transaction_table.php @@ -0,0 +1,39 @@ +create('failover_transaction', function (Blueprint $table) { + $table->id(); + $table->string('kodcaw',10); + $table->string('teller',255); + $table->string('old_norujukan',50); + $table->string('new_norujukan',50)->nullable(); + $table->boolean('db_caw')->default(false); // Boolean for db_caw, default to false + $table->boolean('db_online')->default(false); + $table->enum('status', ['pending', 'resolved', 'failed'])->default('pending'); // Use ENUM for statuses + $table->timestamp('resolve_time')->nullable(); // Timestamp for resolve time, nullable + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::connection('mysql7')->dropIfExists('failover_transaction'); + } +}