From 0604d098b957a92a18dc81bf5faf25e781e3f456 Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Sat, 18 Oct 2025 16:19:00 +0800 Subject: [PATCH] E-Invoice - API, Sales Invoice Report with batch update post request --- .../UpdateBatchBookingSalesInvoiceLogic.php | 93 +++++++++++++++++++ .../UpdateBookingSalesInvoiceLogic.php | 2 +- .../UpdateBookingSalesInvoiceController.php | 9 ++ routes/apipub.php | 1 + 4 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 app/Classes/Modules/Bookings/ControllersLogic/UpdateBatchBookingSalesInvoiceLogic.php diff --git a/app/Classes/Modules/Bookings/ControllersLogic/UpdateBatchBookingSalesInvoiceLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/UpdateBatchBookingSalesInvoiceLogic.php new file mode 100644 index 00000000..55a863eb --- /dev/null +++ b/app/Classes/Modules/Bookings/ControllersLogic/UpdateBatchBookingSalesInvoiceLogic.php @@ -0,0 +1,93 @@ + 'Updated Bookings with Sales Invoices', + 'message' => 'You have successfully updated multiple bookings with Sales Invoices', + ]; + } + + /** @var CanUpdateBookingSalesInvoice */ + private $canUpdateBookingSalesInvoice; + + /** + * UpdateBatchBookingSalesInvoiceLogic constructor. + * @param CanUpdateBookingSalesInvoice $canUpdateBookingSalesInvoice + */ + public function __construct( + CanUpdateBookingSalesInvoice $canUpdateBookingSalesInvoice + ) { + $this->canUpdateBookingSalesInvoice = $canUpdateBookingSalesInvoice; + } + + /** + * Handles batch update for multiple booking sales invoices + * + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request): JsonResponse + { + $collections = $request->input('collections', []); + + if (!is_array($collections) || empty($collections)) { + return response()->json([ + 'error' => 'Invalid or empty collections array provided.' + ], 400); + } + + $jobs = []; + $processed = []; + + foreach ($collections as $index => $bookingData) { + try { + $data = [ + 'docno' => $bookingData['docno'] ?? $bookingData['DocNo'] ?? null, + 'docdate' => $bookingData['docdate'] ?? $bookingData['DocDate'] ?? null, + 'debtorcode' => $bookingData['debtorcode'] ?? $bookingData['DebtorCode'] ?? null, + 'ref' => $bookingData['ref'] ?? $bookingData['Ref'] ?? null, + 'shipinfo' => $bookingData['shipinfo'] ?? $bookingData['ShipInfo'] ?? null, + 'accno' => $bookingData['accno'] ?? $bookingData['AccNo'] ?? null, + 'detaildescription' => $bookingData['detaildescription'] ?? $bookingData['DetailDescription'] ?? null, + 'furtherdescription' => $bookingData['furtherdescription'] ?? $bookingData['FurtherDescription'] ?? null, + 'classification' => $bookingData['classification'] ?? $bookingData['Classification'] ?? null, + 'deptno' => $bookingData['deptno'] ?? $bookingData['DeptNo'] ?? null, + 'qty' => $bookingData['qty'] ?? $bookingData['Qty'] ?? null, + 'unitprice' => $bookingData['unitprice'] ?? $bookingData['UnitPrice'] ?? null, + 'submiteinvoice' => $bookingData['submiteinvoice'] ?? $bookingData['SubmitEinvoice'] ?? null, + 'consolidatedeinvoice' => $bookingData['consolidatedeinvoice'] ?? $bookingData['ConsolidatedEinvoice'] ?? null, + 'einvoicevalidationlink' => $bookingData['einvoicevalidationlink'] ?? $bookingData['EInvoiceValidationLink'] ?? null, + ]; + + $dto = new UpdateBookingSalesInvoiceDTO($data); + $this->canUpdateBookingSalesInvoice->passes($dto); + + ProcessSalesInvoiceReportV2CommandJob::dispatch($dto->toArray()); + + } catch (\Throwable $e) { + Log::error("Failed to process booking at index {$index}: " . $e->getMessage()); + } + } + + return $this->response([]); + } +} diff --git a/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingSalesInvoiceLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingSalesInvoiceLogic.php index ba994141..ef604c2c 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingSalesInvoiceLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingSalesInvoiceLogic.php @@ -67,7 +67,7 @@ class UpdateBookingSalesInvoiceLogic extends AbstractControllerLogic $dto = new UpdateBookingSalesInvoiceDTO($data); $this->canUpdateBookingSalesInvoice->passes($dto); - // ProcessSalesInvoiceReportV2CommandJob::dispatch($dto->toArray()); + ProcessSalesInvoiceReportV2CommandJob::dispatch($dto->toArray()); return $this->response([]); } diff --git a/app/Http/Controllers/Bookings/UpdateBookingSalesInvoiceController.php b/app/Http/Controllers/Bookings/UpdateBookingSalesInvoiceController.php index c7aec55a..6339f464 100644 --- a/app/Http/Controllers/Bookings/UpdateBookingSalesInvoiceController.php +++ b/app/Http/Controllers/Bookings/UpdateBookingSalesInvoiceController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Bookings; use App\Classes\Modules\Bookings\ControllersLogic\UpdateBookingSalesInvoiceLogic; +use App\Classes\Modules\Bookings\ControllersLogic\UpdateBatchBookingSalesInvoiceLogic; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -17,4 +18,12 @@ class UpdateBookingSalesInvoiceController public function update(Request $request, UpdateBookingSalesInvoiceLogic $logic) : JsonResponse { return $logic->execute($request); } + + /** + * @param Request $request + * @return JsonResponse + */ + public function updateBatch(Request $request, UpdateBatchBookingSalesInvoiceLogic $logic) : JsonResponse { + return $logic->execute($request); + } } diff --git a/routes/apipub.php b/routes/apipub.php index 5884f946..6e2cdb19 100644 --- a/routes/apipub.php +++ b/routes/apipub.php @@ -11,6 +11,7 @@ Route::group(['middleware' => 'apipub', 'prefix' => 'v1', 'as' => 'apipub.'], fu Route::group(['prefix' => 'booking', 'as' => 'booking.'], function () { Route::get('/sales-invoice/list', [ListBookingsSalesInvoiceController::class, 'list'])->name('booking.sales-invoice.list'); Route::post('/sales-invoice', [UpdateBookingSalesInvoiceController::class, 'update'])->name('booking.sales-invoice.update'); + Route::post('/sales-invoice/batch', [UpdateBookingSalesInvoiceController::class, 'updateBatch'])->name('booking.sales-invoice.batch.update'); }); }); });