From 00bf7c0cf4cb6832e2791ebddac33e0eabcff44e Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Fri, 1 Mar 2024 11:47:21 +0800 Subject: [PATCH] Fix when customer isCreditTerm is updated, waive storage invoices instead of deleting it --- .../UpdateCompanyCreditTermStatusLogic.php | 25 +++++++++++++++++-- ...heckStorageInvoiceTransactionProcessor.php | 24 ++++++++++++++---- .../UpdateCreditTermStatusFormComponent.vue | 2 +- .../GroupPaymentsBillingComponents.vue | 2 +- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyCreditTermStatusLogic.php b/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyCreditTermStatusLogic.php index a319173d..ff57b814 100644 --- a/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyCreditTermStatusLogic.php +++ b/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyCreditTermStatusLogic.php @@ -8,7 +8,10 @@ use App\Classes\Modules\Companies\Services\FetchesCompany; use App\Classes\Modules\Companies\Services\UpdatesCompanyModuleIsCreditTerm; use App\Classes\Modules\Companies\Standards\Rules\CanUpdateCompanyModule; use App\Classes\Modules\Transactions\Services\ListsTransactions; +use App\Classes\Modules\Transactions\Services\UpdatesTransactionIsWaived; +use App\Classes\Modules\Transactions\Processors\CheckStorageInvoiceTransactionProcessor; use App\Classes\ValueObjects\Constants\TransactionType; +use App\Models\Order; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -39,20 +42,31 @@ class UpdateCompanyCreditTermStatusLogic extends AbstractControllerLogic /** @var ListsTransactions */ private $listsTransactions; + /** @var UpdatesTransactionIsWaived */ + private $updatesTransactionIsWaived; + + /** @var CheckStorageInvoiceTransactionProcessor */ + private $storageInvoiceTransactionProcessor; + + /** * UpdateCompanyCreditTermStatusLogic constructor. * @param FetchesCompany $fetchesCompany * @param UpdatesCompanyModuleIsCreditTerm $updatesCompanyModuleIsCreditTerm * @param CanUpdateCompanyModule $canUpdateCompanyModule + * @param UpdatesTransactionIsWaived $updatesTransactionIsWaived * @param ListsTransactions $listsTransactions + * @param CheckStorageInvoiceTransactionProcessor $storageInvoiceTransactionProcessor */ - public function __construct(FetchesCompany $fetchesCompany, UpdatesCompanyModuleIsCreditTerm $updatesCompanyModuleIsCreditTerm, CanUpdateCompanyModule $canUpdateCompanyModule, ListsTransactions $listsTransactions) + public function __construct(FetchesCompany $fetchesCompany, UpdatesCompanyModuleIsCreditTerm $updatesCompanyModuleIsCreditTerm, CanUpdateCompanyModule $canUpdateCompanyModule, UpdatesTransactionIsWaived $updatesTransactionIsWaived, ListsTransactions $listsTransactions, CheckStorageInvoiceTransactionProcessor $storageInvoiceTransactionProcessor) { $this->fetchesCompany = $fetchesCompany; $this->updatesCompanyModuleIsCreditTerm = $updatesCompanyModuleIsCreditTerm; $this->canUpdateCompanyModule = $canUpdateCompanyModule; $this->listsTransactions = $listsTransactions; + $this->updatesTransactionIsWaived = $updatesTransactionIsWaived; + $this->storageInvoiceTransactionProcessor = $storageInvoiceTransactionProcessor; } /** @@ -87,7 +101,14 @@ class UpdateCompanyCreditTermStatusLogic extends AbstractControllerLogic $transactions = $this->listsTransactions->execute($filters); foreach($transactions as $transaction){ - $transaction->delete(); + $this->updatesTransactionIsWaived->execute($transaction); + $packingList = $transaction->owner()->first(); + if($packingList){ + $order = $packingList->owner()->first(); + if($order instanceof Order){ + $storages = $this->storageInvoiceTransactionProcessor->executeOrder($order); + } + } } } diff --git a/app/Classes/Modules/Transactions/Processors/CheckStorageInvoiceTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CheckStorageInvoiceTransactionProcessor.php index d3eed95e..d5c87ce0 100644 --- a/app/Classes/Modules/Transactions/Processors/CheckStorageInvoiceTransactionProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/CheckStorageInvoiceTransactionProcessor.php @@ -122,7 +122,7 @@ class CheckStorageInvoiceTransactionProcessor $result = $this->processSingleTransactionOfTypeShippingInvoice($invoice_transaction, $packingList, $order->company_module_id, $eta); } else{ - $result = $this->isPaidStorageInvoiceExist($invoice_transaction, $packingList, $eta); + $result = $this->isPaidOrWaivedStorageInvoiceExist($invoice_transaction, $packingList, $eta); } if($result){ $results[] = $result; @@ -271,7 +271,7 @@ class CheckStorageInvoiceTransactionProcessor } - private function isPaidStorageInvoiceExist($transaction, $destinationWarehousePackage, $eta){ + private function isPaidOrWaivedStorageInvoiceExist($transaction, $packingList, $eta){ $pricePerCBM = 3; $resultNumberOfDaysFree = 10; $dt1 = $eta->copy()->addDay()->startOfDay(); @@ -281,9 +281,22 @@ class CheckStorageInvoiceTransactionProcessor $resultCurrentDate = $dt2->format('Y-m-d H:i:s'); $interval = Carbon::parse($dt2)->diff($dt1); $resultNumberOfDaysExceeded = $interval->days - $resultNumberOfDaysFree; - $paidStorageInvoice = $destinationWarehousePackage->transactions()->where('transactions.type', TransactionType::STORAGE_INVOICE)->whereIn('transactions.status', [ApprovalStatus::COMPLETED])->first(); + $paidStorageInvoice = $packingList->transactions()->where('transactions.type', TransactionType::STORAGE_INVOICE)->whereIn('transactions.status', [ApprovalStatus::COMPLETED])->first(); if($paidStorageInvoice){ - $storageInvoiceId = $paidStorageInvoice->id; + $storageInvoice = $paidStorageInvoice; + } + else{ + $waivedStorageInvoice = $packingList->transactions()->where('transactions.type', TransactionType::STORAGE_INVOICE)->where('transactions.is_waived', 1)->whereIn('transactions.status', [ApprovalStatus::APPROVED])->first(); + $storageInvoice = $waivedStorageInvoice; + } + + if($storageInvoice){ + $storageInvoiceId = $storageInvoice->id; + + if(isset($storageInvoice->is_waived) && $storageInvoice->is_waived){ + $pricePerCBM = 0; + } + $transactionDetailsItems = $transaction->transactionDetails()->get(); $cbm = 0.00; foreach ($transactionDetailsItems as $tdItem){ @@ -304,11 +317,12 @@ class CheckStorageInvoiceTransactionProcessor 'currentDate' => $resultCurrentDate, 'cbm' => $cbm, 'pricePerCBM' => $pricePerCBM, - 'storageInvoice' => new TransactionWithStorageResource($paidStorageInvoice) + 'storageInvoice' => new TransactionWithStorageResource($storageInvoice) ]; return $result; } } + return []; } diff --git a/resources/assets/vue/components/companies/forms/UpdateCreditTermStatusFormComponent.vue b/resources/assets/vue/components/companies/forms/UpdateCreditTermStatusFormComponent.vue index 0a2f95b3..512678b0 100644 --- a/resources/assets/vue/components/companies/forms/UpdateCreditTermStatusFormComponent.vue +++ b/resources/assets/vue/components/companies/forms/UpdateCreditTermStatusFormComponent.vue @@ -8,7 +8,7 @@
Update Credit Term Customer
Are you sure you want to update the credit term status for this company to {{ data.is_credit_term === 1 ? 'NO' : 'YES' }}?
- +

All existing invoices for storage that have not yet been paid will be waived

diff --git a/resources/assets/vue/components/paymentsBilling/elements/GroupPaymentsBillingComponents.vue b/resources/assets/vue/components/paymentsBilling/elements/GroupPaymentsBillingComponents.vue index 3d8a39ae..763f0174 100644 --- a/resources/assets/vue/components/paymentsBilling/elements/GroupPaymentsBillingComponents.vue +++ b/resources/assets/vue/components/paymentsBilling/elements/GroupPaymentsBillingComponents.vue @@ -85,7 +85,7 @@
- +