From 52d380f5644f7816bb99fedcf82080dd216f9bb9 Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Tue, 17 Mar 2026 08:01:48 +0800 Subject: [PATCH] E-Invoice - Fix an issue reported by Mira booking has no regenerate E-invoice button --- Jenkinsfile | 21 ++++++++- .../RegenerateInvoiceBookingLogic.php | 6 ++- .../RegenerateInvoiceBookingV2Processor.php | 24 ++++++++++- .../CreateInvoiceDocumentProcessor.php | 5 +++ .../RegenerateBookingEInvoiceController.php | 9 ++++ .../forms/RegenerateEInvoiceTryComponent.vue | 43 +++++++++++++++++++ .../BookingDetailsSectionComponent.vue | 8 ++++ routes/booking.php | 1 + 8 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 resources/assets/vue/components/bookings/forms/RegenerateEInvoiceTryComponent.vue diff --git a/Jenkinsfile b/Jenkinsfile index ed52bd70..cd286f65 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -120,10 +120,29 @@ pipeline { steps { script { try { - sh 'docker image prune -a -f' + sh ''' + echo "Starting Docker cleanup..." + + # Remove stopped containers + docker container prune -f + + # Remove unused networks + docker network prune -f + + # Remove unused images + docker image prune -a -f + + # Remove unused build cache + docker builder prune -f + + echo "Docker cleanup completed." + + docker system df + ''' } catch (Exception e) { echo "Error during cleanup: ${e.message}" } + currentBuild.description = 'Step 6 of 6 Completed' } } diff --git a/app/Classes/Modules/Bookings/ControllersLogic/RegenerateInvoiceBookingLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/RegenerateInvoiceBookingLogic.php index 2c06836f..3b151b84 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/RegenerateInvoiceBookingLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/RegenerateInvoiceBookingLogic.php @@ -12,6 +12,7 @@ use App\Http\Resources\BookingResource; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Classes\ValueObjects\Constants\TransactionType; use Illuminate\Support\Facades\Log; class RegenerateInvoiceBookingLogic extends AbstractControllerLogic @@ -81,15 +82,16 @@ class RegenerateInvoiceBookingLogic extends AbstractControllerLogic $eInvoiceWithNormalInvoiceTemplate = $request->input('normal_invoice', false); $eInvoiceRefund = $request->input('e_invoice_refund', false); + $eInvoiceTry = $request->input('e_invoice_try', false); - if(!$eInvoiceRefund){ + if(!$eInvoiceRefund && !$eInvoiceTry){ if($booking->status !== ApprovalStatus::COMPLETED){ throw new MalformedRequestException('Booking incomplete.'); } } // if($eInvoiceRefund){ - $this->regenerateInvoiceBookingV2Processor->execute($booking, $eInvoiceWithNormalInvoiceTemplate, $eInvoiceRefund); + $this->regenerateInvoiceBookingV2Processor->execute($booking, $eInvoiceWithNormalInvoiceTemplate, $eInvoiceRefund, $eInvoiceTry); // } // else{ // $this->regenerateInvoiceBookingProcessor->execute($booking, $eInvoiceWithNormalInvoiceTemplate); diff --git a/app/Classes/Modules/Bookings/Processors/RegenerateInvoiceBookingV2Processor.php b/app/Classes/Modules/Bookings/Processors/RegenerateInvoiceBookingV2Processor.php index 2e758c81..08f189ef 100644 --- a/app/Classes/Modules/Bookings/Processors/RegenerateInvoiceBookingV2Processor.php +++ b/app/Classes/Modules/Bookings/Processors/RegenerateInvoiceBookingV2Processor.php @@ -10,6 +10,7 @@ use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionV2Proces use Illuminate\Support\Str; use App\Classes\ValueObjects\Constants\DocumentType; use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Classes\ValueObjects\Constants\KVPKey; use App\Classes\ValueObjects\Constants\TransactionType; use App\Models\Booking; use App\Models\Transaction; @@ -51,10 +52,16 @@ class RegenerateInvoiceBookingV2Processor public function execute(Booking $booking, bool $eInvoiceWithNormalInvoiceTemplate = false, - bool $eInvoiceWithRefund = false) + bool $eInvoiceWithRefund = false, bool $eInvoiceTry = false) { $bookingOriginalStatus = $booking->status; + if($eInvoiceTry){ + if($booking->invoice_status === ApprovalStatus::APPROVED){ + $bookingOriginalStatus = ApprovalStatus::COMPLETED; + } + } + if(!$eInvoiceWithRefund){ $this->updatesBookingStatus->execute($booking, ApprovalStatus::APPROVED); } @@ -70,6 +77,13 @@ class RegenerateInvoiceBookingV2Processor ->latest() ->first(); + // if($eInvoiceTry){ + // $kvpQuery = $latestInvoice->attributesKVP()->where('key', KVPKey::AUTOCOUNT_DOCNO_INVOICE); + // if($kvpQuery->exists()){ + // $this->updateOrCreateKeyValuePair($booking, KVPKey::BOOKING_EINVOICE_ELIGIBLE, '1'); + // } + // } + Log::info('RegenerateInvoiceBookingV2Processor booking: ' . json_encode($booking->marking)); // get the first bill_no @@ -135,4 +149,12 @@ class RegenerateInvoiceBookingV2Processor ]); } } + + private function updateOrCreateKeyValuePair($booking, $key, $value) + { + $booking->attributesKVP()->updateOrCreate( + ['key' => $key], + ['value' => $value] + ); + } } diff --git a/app/Classes/Modules/Transactions/Processors/CreateInvoiceDocumentProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateInvoiceDocumentProcessor.php index 751981e3..0e6bb95f 100644 --- a/app/Classes/Modules/Transactions/Processors/CreateInvoiceDocumentProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/CreateInvoiceDocumentProcessor.php @@ -163,6 +163,11 @@ class CreateInvoiceDocumentProcessor foreach ($purchaseOrderDocuments as $document){ $currentFile = $document->files()->first()->file->file_info->original->file; if($filesystemDriver === 's3'){ + if (!Storage::disk('s3')->exists($currentFile)) { + Log::error('S3 file missing: ' . $currentFile); + continue; + } + Log::info('CreateInvoiceDocumentProcessor 1: ' . $currentFile); $fileContent = Storage::disk('s3')->get($currentFile); $filepath = storage_path('app/documents/' . $currentFile); diff --git a/app/Http/Controllers/Bookings/RegenerateBookingEInvoiceController.php b/app/Http/Controllers/Bookings/RegenerateBookingEInvoiceController.php index baec723f..55338257 100644 --- a/app/Http/Controllers/Bookings/RegenerateBookingEInvoiceController.php +++ b/app/Http/Controllers/Bookings/RegenerateBookingEInvoiceController.php @@ -26,4 +26,13 @@ class RegenerateBookingEInvoiceController public function batchProcess(Request $request, BatchBookingsGenerateEInvoiceLogic $logic): JsonResponse { return $logic->execute($request); } + + /** + * @param Request $request + * @param RegenerateInvoiceBookingLogic $logic + * @return JsonResponse + */ + public function tryRegenerate(Request $request, RegenerateInvoiceBookingLogic $logic): JsonResponse { + return $logic->execute($request); + } } diff --git a/resources/assets/vue/components/bookings/forms/RegenerateEInvoiceTryComponent.vue b/resources/assets/vue/components/bookings/forms/RegenerateEInvoiceTryComponent.vue new file mode 100644 index 00000000..ede0ce62 --- /dev/null +++ b/resources/assets/vue/components/bookings/forms/RegenerateEInvoiceTryComponent.vue @@ -0,0 +1,43 @@ + + diff --git a/resources/assets/vue/components/bookings/sections/BookingDetailsSectionComponent.vue b/resources/assets/vue/components/bookings/sections/BookingDetailsSectionComponent.vue index ade218c9..39b90359 100644 --- a/resources/assets/vue/components/bookings/sections/BookingDetailsSectionComponent.vue +++ b/resources/assets/vue/components/bookings/sections/BookingDetailsSectionComponent.vue @@ -427,6 +427,14 @@ +
+
+
Regenerate E-Inv (Try)
+
+ + + +
Regenerate Normal Inv
diff --git a/routes/booking.php b/routes/booking.php index 90b7de5e..7416a396 100644 --- a/routes/booking.php +++ b/routes/booking.php @@ -56,6 +56,7 @@ Route::group(['prefix' => 'booking', 'as' => 'booking.', 'namespace' => 'Booking }); Route::group(['prefix' => '{id}/einvoice', 'as' => 'einvoice.'], function () { Route::post('/', [RegenerateBookingEInvoiceController::class, 'regenerate'])->name('regenerate'); + Route::post('/try', [RegenerateBookingEInvoiceController::class, 'tryRegenerate'])->name('try.regenerate'); }); Route::group(['prefix' => 'batch/einvoice', 'as' => 'batch.'], function () { Route::get('/process', [RegenerateBookingEInvoiceController::class, 'batchProcess'])->name('process');