diff --git a/app/Classes/Modules/Imports/ControllersLogic/ImportExcelLogic.php b/app/Classes/Modules/Imports/ControllersLogic/ImportExcelLogic.php index 27ecc768..db810cb9 100644 --- a/app/Classes/Modules/Imports/ControllersLogic/ImportExcelLogic.php +++ b/app/Classes/Modules/Imports/ControllersLogic/ImportExcelLogic.php @@ -124,6 +124,15 @@ class ImportExcelLogic extends AbstractControllerLogic 'data' => $result ]; } + else if ($reportType === 'Credit Note Report') { + $result = $this->processCreditNoteReport($sheet); + $result = [ + 'message' => empty($result) + ? '' + : 'Some data are unprocessed: ', + 'data' => $result + ]; + } else{ throw new MalformedRequestException('Cannot process report type: ' . $reportType); } @@ -145,7 +154,7 @@ class ImportExcelLogic extends AbstractControllerLogic } private function processSalesInvoiceReport($sheet){ - $rows = $sheet->skip(1); + $rows = $sheet->skip(1); foreach ($rows as $index => $details) { $docNo = $details[0] ?? null; @@ -242,4 +251,58 @@ class ImportExcelLogic extends AbstractControllerLogic return $unprocessedKnockOffs; } + + private function processCreditNoteReport($sheet){ + $unprocessedDocNos = []; + $rows = $sheet->skip(1); + + foreach ($rows as $index => $details) { + $docNo = $details[0] ?? null; + $docDate = $details[1] ?? null; + $debtorCode = $details[2] ?? null; + $ref = $details[3] ?? null; + $description = $details[4] ?? null; + $reason = $details[5] ?? null; + $deptNo = $details[6] ?? null; + $qty = $details[7] ?? null; + $unitPrice = $details[8] ?? null; + $accNo = $details[9] ?? null; + $submitEinvoice = $details[10] ?? null; + $einvoiceIssueDateTime = $details[11] ?? null; + $consolidatedEinvoice = $details[12] ?? null; + $eInvoiceValidationLink = $details[13] ?? null; + + Log::info("Row {$index} processCreditNoteReport:", [ + 'DocNo' => $docNo, + 'DocDate' => $docDate, + 'DebtorCode' => $debtorCode, + 'Ref' => $ref, + 'Description' => $description, + 'Reason' => $reason, + 'DeptNo' => $deptNo, + 'Qty' => $qty, + 'UnitPrice' => $unitPrice, + 'AccNo' => $accNo, + 'SubmitEinvoice' => $submitEinvoice, + 'EInvoiceIssueDateTime' => $einvoiceIssueDateTime, + 'ConsolidatedEinvoice' => $consolidatedEinvoice, + 'EInvoiceValidationLink' => $eInvoiceValidationLink, + ]); + + $booking = Booking::where('marking', $ref)->first(); + if($booking){ + if($docNo != "" && $docNo != "<>"){ + $this->updateOrCreateKeyValuePair($booking, KVPKey::AUTOCOUNT_DOCNO_CREDIT_NOTE, $docNo); + if($eInvoiceValidationLink){ + $this->updateOrCreateKeyValuePair($booking, KVPKey::AUTOCOUNT_EINVOICE_VALIDATION_LINK_CREDIT_NOTE, $eInvoiceValidationLink); + } + } + } + else{ + $unprocessedDocNos[] = $docNo; + } + } + + return $unprocessedDocNos; + } } diff --git a/app/Classes/ValueObjects/Constants/KVPKey.php b/app/Classes/ValueObjects/Constants/KVPKey.php index 7a8b42ae..4e0484d7 100644 --- a/app/Classes/ValueObjects/Constants/KVPKey.php +++ b/app/Classes/ValueObjects/Constants/KVPKey.php @@ -10,8 +10,12 @@ class KVPKey public const AUTOCOUNT_DOCNO_OFFICIAL_RECEIPT = 'AUTOCOUNT_DOCNO_OR'; + public const AUTOCOUNT_DOCNO_CREDIT_NOTE = 'AUTOCOUNT_DOCNO_CN'; + public const AUTOCOUNT_EINVOICE_VALIDATION_LINK = 'AUTOCOUNT_EINVOICE_VALIDATION_LINK'; + public const AUTOCOUNT_EINVOICE_VALIDATION_LINK_CREDIT_NOTE = 'AUTOCOUNT_EINVOICE_VALIDATION_LINK_CN'; + public const CREDIT_NOTE_APPROVAL_DATE = 'CREDIT_NOTE_APPROVAL_DATE'; public const TRANSACTION_MODEL_CLASS = 'App\Models\Transaction'; diff --git a/app/Http/Controllers/Imports/ImportController.php b/app/Http/Controllers/Imports/ImportController.php index 5e045b03..79bfc0f0 100644 --- a/app/Http/Controllers/Imports/ImportController.php +++ b/app/Http/Controllers/Imports/ImportController.php @@ -14,7 +14,12 @@ class ImportController extends Controller return $logic->execute($request); } - public function officialReceipt(Request $request, ImportExcelLogic $logic): JsonResponse + public function officialReceipt(Request $request, ImportExcelLogic $logic): JsonResponse + { + return $logic->execute($request); + } + + public function creditNote(Request $request, ImportExcelLogic $logic): JsonResponse { return $logic->execute($request); } diff --git a/resources/assets/vue/components/bookings/elements/DownloadUploadComponent.vue b/resources/assets/vue/components/bookings/elements/DownloadUploadComponent.vue index c43d73dc..cf142e56 100644 --- a/resources/assets/vue/components/bookings/elements/DownloadUploadComponent.vue +++ b/resources/assets/vue/components/bookings/elements/DownloadUploadComponent.vue @@ -106,6 +106,7 @@ export default { allowedReportTypes: [ 'Sales Invoice Report', '01R - RECEIVE PAYMENT (FULL PAYMENT) [AR RECEIVE PAYMENT]', + 'Credit Note Report' ] } }, @@ -129,6 +130,7 @@ export default { const importRoutesMap = { 'Sales Invoice Report': route('api.import.sales_invoices'), '01R - RECEIVE PAYMENT (FULL PAYMENT) [AR RECEIVE PAYMENT]': route('api.import.official_receipt'), + 'Credit Note Report': route('api.import.credit_note'), }; return importRoutesMap[reportType] || ''; diff --git a/routes/export.php b/routes/export.php index 4b1c2576..a0815a20 100644 --- a/routes/export.php +++ b/routes/export.php @@ -22,4 +22,5 @@ Route::group(['prefix' => 'export', 'as' => 'export.', 'namespace' => 'Exports'] Route::group(['prefix' => 'import', 'as' => 'import.', 'namespace' => 'Imports'], function () { Route::post('/import/sales-invoice', [ImportController::class, 'salesInvoices'])->name('sales_invoices'); Route::post('/import/offical-receipt', [ImportController::class, 'officialReceipt'])->name('official_receipt'); + Route::post('/import/credit-note', [ImportController::class, 'creditNote'])->name('credit_note'); });