From 1441cbcec96b3ffe841dddbd427e0798de9913ab Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Wed, 24 Sep 2025 09:50:58 +0800 Subject: [PATCH 1/3] E-Invoice - Update to Sales Invoice Report template ref column --- .../Commands/V2/ProcessSalesInvoiceReportV2CommandJob.php | 5 ++++- .../Modules/Exports/Services/ExportsSalesInvoiceReport.php | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/Classes/Jobs/Commands/V2/ProcessSalesInvoiceReportV2CommandJob.php b/app/Classes/Jobs/Commands/V2/ProcessSalesInvoiceReportV2CommandJob.php index 66a4d457..61eb1d5d 100644 --- a/app/Classes/Jobs/Commands/V2/ProcessSalesInvoiceReportV2CommandJob.php +++ b/app/Classes/Jobs/Commands/V2/ProcessSalesInvoiceReportV2CommandJob.php @@ -14,6 +14,7 @@ use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use App\Models\Booking; +use App\Models\Transaction; use Illuminate\Support\Facades\Log; use PhpOffice\PhpSpreadsheet\Shared\Date; @@ -73,7 +74,9 @@ class ProcessSalesInvoiceReportV2CommandJob implements ShouldQueue 'EInvoiceValidationLink' => $eInvoiceValidationLink, ]); - $booking = Booking::where('marking', $ref)->first(); + // $booking = Booking::where('marking', $ref)->first(); + $transaction = Transaction::where('bill_no', $ref)->first(); + $booking = $transaction->owner; if($booking){ if($docNo != "" && $docNo != "<>"){ $this->updateOrCreateKeyValuePair($booking, KVPKey::AUTOCOUNT_DOCNO_INVOICE, $docNo); diff --git a/app/Classes/Modules/Exports/Services/ExportsSalesInvoiceReport.php b/app/Classes/Modules/Exports/Services/ExportsSalesInvoiceReport.php index e3a7cdc1..8a083933 100644 --- a/app/Classes/Modules/Exports/Services/ExportsSalesInvoiceReport.php +++ b/app/Classes/Modules/Exports/Services/ExportsSalesInvoiceReport.php @@ -163,7 +163,7 @@ class ExportsSalesInvoiceReport implements FromQuery, WithHeadings, WithHeadingR $firstItem ? '<>' : '', $formattedDocumentDate, $company->debtor, - $booking->marking, + $invoiceTransaction->bill_no, $booking->marking, '500-0000', 'PRODUCT NAME :', @@ -200,7 +200,7 @@ class ExportsSalesInvoiceReport implements FromQuery, WithHeadings, WithHeadingR '', $formattedDocumentDate, $company->debtor, - $booking->marking, + $invoiceTransaction->bill_no, $booking->marking, '500-0000', 'PRODUCT NAME :', @@ -246,7 +246,7 @@ class ExportsSalesInvoiceReport implements FromQuery, WithHeadings, WithHeadingR '', $formattedDocumentDate, $company->debtor, - $booking->marking, + $invoiceTransaction->bill_no, $booking->marking, '500-0000', 'PRODUCT NAME :', From c00255efbab716959246852afe6f4f1e02f13d5e Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Thu, 25 Sep 2025 11:18:22 +0800 Subject: [PATCH 2/3] E-Invoice - Update to Sales Invoice Report template ref column --- .../ProcessSalesInvoiceReportV2CommandJob.php | 21 +++++++--- .../RegenerateInvoiceBookingProcessor.php | 8 +++- .../GenerateCreditNotePdfV2Logic.php | 21 ++++++---- .../CreateInvoiceDocumentProcessor.php | 38 ++++++++++++++----- .../CreateInvoiceTransactionProcessor.php | 9 ++++- app/Models/JobResult.php | 2 +- app/Models/KeyValuePair.php | 7 ++++ 7 files changed, 79 insertions(+), 27 deletions(-) diff --git a/app/Classes/Jobs/Commands/V2/ProcessSalesInvoiceReportV2CommandJob.php b/app/Classes/Jobs/Commands/V2/ProcessSalesInvoiceReportV2CommandJob.php index 61eb1d5d..77a50392 100644 --- a/app/Classes/Jobs/Commands/V2/ProcessSalesInvoiceReportV2CommandJob.php +++ b/app/Classes/Jobs/Commands/V2/ProcessSalesInvoiceReportV2CommandJob.php @@ -75,17 +75,28 @@ class ProcessSalesInvoiceReportV2CommandJob implements ShouldQueue ]); // $booking = Booking::where('marking', $ref)->first(); + // if($booking){ + // if($docNo != "" && $docNo != "<>"){ + // $this->updateOrCreateKeyValuePair($booking, KVPKey::AUTOCOUNT_DOCNO_INVOICE, $docNo); + // } + // if($eInvoiceValidationLink){ + // $this->updateOrCreateKeyValuePair($booking, KVPKey::AUTOCOUNT_EINVOICE_VALIDATION_LINK, $eInvoiceValidationLink); + // } + // if($docDate){ + // $this->updateOrCreateKeyValuePair($booking, KVPKey::AUTOCOUNT_DOCDATE_INVOICE, is_numeric($docDate) ? $this->convertDocDateToString($docDate) : $docDate); + // } + // } + $transaction = Transaction::where('bill_no', $ref)->first(); - $booking = $transaction->owner; - if($booking){ + if($transaction){ if($docNo != "" && $docNo != "<>"){ - $this->updateOrCreateKeyValuePair($booking, KVPKey::AUTOCOUNT_DOCNO_INVOICE, $docNo); + $this->updateOrCreateKeyValuePair($transaction, KVPKey::AUTOCOUNT_DOCNO_INVOICE, $docNo); } if($eInvoiceValidationLink){ - $this->updateOrCreateKeyValuePair($booking, KVPKey::AUTOCOUNT_EINVOICE_VALIDATION_LINK, $eInvoiceValidationLink); + $this->updateOrCreateKeyValuePair($transaction, KVPKey::AUTOCOUNT_EINVOICE_VALIDATION_LINK, $eInvoiceValidationLink); } if($docDate){ - $this->updateOrCreateKeyValuePair($booking, KVPKey::AUTOCOUNT_DOCDATE_INVOICE, is_numeric($docDate) ? $this->convertDocDateToString($docDate) : $docDate); + $this->updateOrCreateKeyValuePair($transaction, KVPKey::AUTOCOUNT_DOCDATE_INVOICE, is_numeric($docDate) ? $this->convertDocDateToString($docDate) : $docDate); } } diff --git a/app/Classes/Modules/Bookings/Processors/RegenerateInvoiceBookingProcessor.php b/app/Classes/Modules/Bookings/Processors/RegenerateInvoiceBookingProcessor.php index 7b392d08..86e0d652 100644 --- a/app/Classes/Modules/Bookings/Processors/RegenerateInvoiceBookingProcessor.php +++ b/app/Classes/Modules/Bookings/Processors/RegenerateInvoiceBookingProcessor.php @@ -93,10 +93,14 @@ class RegenerateInvoiceBookingProcessor $this->deletesDocument->execute($row); } - $this->createInvoiceTransactionProcessor->execute($booking, $firstBillNo, true, $isAllowNormalInvoice); + $kvpCopies = $currentInvoice->attributesKVP->map(function ($kvp) { + return $kvp->replicate(); + }); + + $this->createInvoiceTransactionProcessor->execute($booking, $firstBillNo, $kvpCopies, true, $isAllowNormalInvoice); } else { - $this->createInvoiceTransactionProcessor->execute($booking, "", false, $isAllowNormalInvoice); + $this->createInvoiceTransactionProcessor->execute($booking, "", null, false, $isAllowNormalInvoice); } } } diff --git a/app/Classes/Modules/Transactions/ControllersLogic/GenerateCreditNotePdfV2Logic.php b/app/Classes/Modules/Transactions/ControllersLogic/GenerateCreditNotePdfV2Logic.php index 0d74ec3d..330f8451 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/GenerateCreditNotePdfV2Logic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/GenerateCreditNotePdfV2Logic.php @@ -94,14 +94,19 @@ class GenerateCreditNotePdfV2Logic $autoCountInvoiceId = ''; $autoCountEInvoiceValidationLink = ''; - $metadata = $booking->attributesKVP()->where('key', KVPKey::AUTOCOUNT_DOCNO_INVOICE)->first(); - if($metadata){ - $autoCountInvoiceId = $metadata->value; - } - $metadata = $booking->attributesKVP()->where('key', KVPKey::AUTOCOUNT_EINVOICE_VALIDATION_LINK)->first(); - if($metadata){ - $autoCountEInvoiceValidationLink = $metadata->value; - } + //cief todo: 90 - Credit Note autocount id from autocount need new key + // $metadata = $booking->attributesKVP()->where('key', KVPKey::AUTOCOUNT_DOCNO_INVOICE)->first(); + // if($metadata){ + // if($metadata){ + // $autoCountInvoiceId = $metadata->value; + // } + // $metadata = $booking->attributesKVP()->where('key', KVPKey::AUTOCOUNT_EINVOICE_VALIDATION_LINK)->first(); + // if($metadata){ + // $autoCountEInvoiceValidationLink = $metadata->value; + // } + // } + // else{ + // } Log::info('autoCountInvoiceId: ' . $autoCountInvoiceId); Log::info('autoCountEInvoiceValidationLink: ' . $autoCountEInvoiceValidationLink); diff --git a/app/Classes/Modules/Transactions/Processors/CreateInvoiceDocumentProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateInvoiceDocumentProcessor.php index 6e746415..693a59de 100644 --- a/app/Classes/Modules/Transactions/Processors/CreateInvoiceDocumentProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/CreateInvoiceDocumentProcessor.php @@ -69,18 +69,36 @@ class CreateInvoiceDocumentProcessor $metadata = $booking->attributesKVP()->where('key', KVPKey::AUTOCOUNT_DOCNO_INVOICE)->first(); if($metadata){ $autoCountInvoiceId = $metadata->value; - } - $metadata = $booking->attributesKVP()->where('key', KVPKey::AUTOCOUNT_EINVOICE_VALIDATION_LINK)->first(); - if($metadata){ - $autoCountEInvoiceValidationLink = $metadata->value; - } - $metadata = $booking->attributesKVP()->where('key', KVPKey::AUTOCOUNT_DOCDATE_INVOICE)->first(); - if($metadata){ - $documentDate = Carbon::parse($metadata->value); + $metadata = $booking->attributesKVP()->where('key', KVPKey::AUTOCOUNT_EINVOICE_VALIDATION_LINK)->first(); + if($metadata){ + $autoCountEInvoiceValidationLink = $metadata->value; + } + $metadata = $booking->attributesKVP()->where('key', KVPKey::AUTOCOUNT_DOCDATE_INVOICE)->first(); + if($metadata){ + $documentDate = Carbon::parse($metadata->value); + } + else{ + $lastDayOfMonth = $documentDate->copy()->endOfMonth(); + $documentDate = $lastDayOfMonth; + } } else{ - $lastDayOfMonth = $documentDate->copy()->endOfMonth(); - $documentDate = $lastDayOfMonth; + $metadata = $transaction->attributesKVP()->where('key', KVPKey::AUTOCOUNT_DOCNO_INVOICE)->first(); + if($metadata){ + $autoCountInvoiceId = $metadata->value; + } + $metadata = $transaction->attributesKVP()->where('key', KVPKey::AUTOCOUNT_EINVOICE_VALIDATION_LINK)->first(); + if($metadata){ + $autoCountEInvoiceValidationLink = $metadata->value; + } + $metadata = $transaction->attributesKVP()->where('key', KVPKey::AUTOCOUNT_DOCDATE_INVOICE)->first(); + if($metadata){ + $documentDate = Carbon::parse($metadata->value); + } + else{ + $lastDayOfMonth = $documentDate->copy()->endOfMonth(); + $documentDate = $lastDayOfMonth; + } } } $payment = $booking->transactions()->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::COMPLETED, ApprovalStatus::APPROVED])->first(); diff --git a/app/Classes/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php index afacb35f..76d743e9 100644 --- a/app/Classes/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php @@ -88,11 +88,12 @@ class CreateInvoiceTransactionProcessor /** * @param Booking $booking * @param String $invoiceNo + * @param Illuminate\Support\Collection<\App\Models\KeyValuePair> $kvpCopies * @param bool $isAllowEInvoice * @return void * @throws MalformedRequestException */ - public function execute(Booking $booking, String $invoiceNo= "", bool $isAllowEInvoice = false, bool $isAllowNormalInvoice = false) + public function execute(Booking $booking, String $invoiceNo= "", $kvpCopies = null, bool $isAllowEInvoice = false, bool $isAllowNormalInvoice = false) { if ($booking->status === ApprovalStatus::COMPLETED) { @@ -190,6 +191,12 @@ class CreateInvoiceTransactionProcessor ); $invoice_transaction = $this->createsTransaction->execute($purchaseOrder->booking, $transaction_object); + if ($kvpCopies) { + foreach ($kvpCopies as $kvp) { + $invoice_transaction->attributesKVP()->save($kvp); + } + } + $voucherRedemption = $transaction->voucherRedemption; // purchase order diff --git a/app/Models/JobResult.php b/app/Models/JobResult.php index f30b5076..ff38a94b 100644 --- a/app/Models/JobResult.php +++ b/app/Models/JobResult.php @@ -9,5 +9,5 @@ class JobResult extends AbstractModel public $fillable = [ 'job_id', 'result' - ]; + ]; } diff --git a/app/Models/KeyValuePair.php b/app/Models/KeyValuePair.php index 8f8ddec8..ea6c54dc 100644 --- a/app/Models/KeyValuePair.php +++ b/app/Models/KeyValuePair.php @@ -12,6 +12,13 @@ class KeyValuePair extends AbstractModel protected $table = 'key_value_pairs'; + protected $fillable = [ + 'owner_type', + 'owner_id', + 'key', + 'value', + ]; + public function owner(): MorphTo { return $this->morphTo(); From 0d47c86104d6742ff026cd57731c071e77f8f0d0 Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Thu, 25 Sep 2025 12:08:30 +0800 Subject: [PATCH 3/3] E-Invoice - Update to Sales Invoice Report template ref column --- .../GenerateCreditNotePdfV2Logic.php | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/app/Classes/Modules/Transactions/ControllersLogic/GenerateCreditNotePdfV2Logic.php b/app/Classes/Modules/Transactions/ControllersLogic/GenerateCreditNotePdfV2Logic.php index 67dd0647..b65985b0 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/GenerateCreditNotePdfV2Logic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/GenerateCreditNotePdfV2Logic.php @@ -94,19 +94,6 @@ class GenerateCreditNotePdfV2Logic if($eInvoiceStarted) { $eInvoiceStarted = false; //reset to re-evaluate second time - //cief todo: 90 - Credit Note autocount id from autocount need new key - // $metadata = $booking->attributesKVP()->where('key', KVPKey::AUTOCOUNT_DOCNO_INVOICE)->first(); - // if($metadata){ - // if($metadata){ - // $autoCountInvoiceId = $metadata->value; - // } - // $metadata = $booking->attributesKVP()->where('key', KVPKey::AUTOCOUNT_EINVOICE_VALIDATION_LINK)->first(); - // if($metadata){ - // $autoCountEInvoiceValidationLink = $metadata->value; - // } - // } - // else{ - // } $kvp = KeyValuePair::where('key', KVPKey::TRANSACTION_MODEL_CLASS)->where('value', $transaction->id)->first(); $refundTransaction = $kvp ? $kvp->owner : null; if($refundTransaction && $refundTransaction->type === TransactionType::REFUND){