diff --git a/app/Classes/Modules/Transactions/Processors/CheckStorageInvoiceTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CheckStorageInvoiceTransactionProcessor.php index bc9adccd..06e8a292 100644 --- a/app/Classes/Modules/Transactions/Processors/CheckStorageInvoiceTransactionProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/CheckStorageInvoiceTransactionProcessor.php @@ -103,29 +103,34 @@ class CheckStorageInvoiceTransactionProcessor $results = []; $marking = $order->companyModule->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference; $is_credit_term = $order->companyModule->inviters()->withPivot('is_credit_term')->first()->pivot->is_credit_term; - if(!$is_credit_term){ - Log::channel('storage_invoices')->info('orderId: '.$order->id.', orderReference: '.$order->reference.', marking: '.$marking.', is_credit_term: '.$is_credit_term); - $packingLists = $order->destinationWarehousePackages; + Log::channel('storage_invoices')->info('orderId: '.$order->id.', orderReference: '.$order->reference.', marking: '.$marking.', is_credit_term: '.$is_credit_term); + $packingLists = $order->destinationWarehousePackages; - foreach ($packingLists as $packingList){ - $arrivalDateAtChinaWarehouse = $this->getArrivalDateAtChinaWarehoue($packingList); - Log::channel('storage_invoices')->info('arrivalDateAtChinaWarehouse: '.json_encode($arrivalDateAtChinaWarehouse)); - Log::channel('storage_invoices')->info('destinationWarehousePackage: '.json_encode($packingList)); - $eta = $this->getEtaFromPackingList($packingList); - if($arrivalDateAtChinaWarehouse && $eta){ - $transactions = $packingList->transactions()->where('transactions.type', TransactionType::SHIPPING_INVOICE)->whereIn('transactions.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->get(); - // $transactions = $destinationWarehousePackage->transactions()->where('transactions.type', TransactionType::SHIPPING_INVOICE)->where('transactions.status', ApprovalStatus::APPROVED)->get(); + foreach ($packingLists as $packingList){ + $arrivalDateAtChinaWarehouse = $this->getArrivalDateAtChinaWarehoue($packingList); + Log::channel('storage_invoices')->info('arrivalDateAtChinaWarehouse: '.json_encode($arrivalDateAtChinaWarehouse)); + Log::channel('storage_invoices')->info('destinationWarehousePackage: '.json_encode($packingList)); + $eta = $this->getEtaFromPackingList($packingList); + if($arrivalDateAtChinaWarehouse && $eta){ + $transactions = $packingList->transactions()->where('transactions.type', TransactionType::SHIPPING_INVOICE)->whereIn('transactions.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->get(); + // $transactions = $destinationWarehousePackage->transactions()->where('transactions.type', TransactionType::SHIPPING_INVOICE)->where('transactions.status', ApprovalStatus::APPROVED)->get(); - /** @var Transaction $invoice_transaction */ - foreach ($transactions as $invoice_transaction){ + /** @var Transaction $invoice_transaction */ + foreach ($transactions as $invoice_transaction){ + $result = null; + if(!$is_credit_term){ $result = $this->processSingleTransactionOfTypeShippingInvoice($invoice_transaction, $packingList, $order->company_module_id, $eta, $isBackDoorCheck); - if($result){ - $results[] = $result; - } + } + else{ + $result = $this->isPaidStorageInvoiceExist($invoice_transaction, $packingList, $eta); + } + if($result){ + $results[] = $result; } } } } + return $results; } @@ -266,6 +271,47 @@ class CheckStorageInvoiceTransactionProcessor } + private function isPaidStorageInvoiceExist($transaction, $destinationWarehousePackage, $eta){ + $pricePerCBM = 3; + $resultNumberOfDaysFree = 10; + $dt1 = $eta->copy()->addDay()->startOfDay(); + $resultStartDate = $dt1->format('Y-m-d'); + $currentDatetime = Carbon::now(); + $dt2 = $currentDatetime->copy()->addDay()->startOfDay(); + $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(); + if($paidStorageInvoice){ + $storageInvoiceId = $paidStorageInvoice->id; + $transactionDetailsItems = $transaction->transactionDetails()->get(); + $cbm = 0.00; + foreach ($transactionDetailsItems as $tdItem){ + $quantity = $tdItem->quantity; + if($tdItem->price < 0.00){ + $quantity = $quantity * -1; + } + $cbm = $cbm + $quantity; + } + + if($storageInvoiceId !== 0){ + $result = [ + 'parentInvoiceId' => $transaction->id, + 'storageInvoiceId' => $storageInvoiceId, + 'numberOfDaysExceeded' => $resultNumberOfDaysExceeded, + 'numberOfDaysFree' => $resultNumberOfDaysFree, + 'startDate' => $resultStartDate, + 'currentDate' => $resultCurrentDate, + 'cbm' => $cbm, + 'pricePerCBM' => $pricePerCBM, + 'storageInvoice' => new TransactionWithStorageResource($paidStorageInvoice) + ]; + return $result; + } + } + return []; + } + private function updatePaymentTransactionViaGroupPayment($storageInvoice){ Log::channel('storage_invoices')->info('updatePaymentTransactionViaGroupPayment'); $groups = $storageInvoice->groups()->get(); diff --git a/app/Classes/Modules/Transactions/Standards/Validators/WaiveTransactionValidation.php b/app/Classes/Modules/Transactions/Standards/Validators/WaiveTransactionValidation.php index d7a80ef3..b6de888b 100644 --- a/app/Classes/Modules/Transactions/Standards/Validators/WaiveTransactionValidation.php +++ b/app/Classes/Modules/Transactions/Standards/Validators/WaiveTransactionValidation.php @@ -5,6 +5,8 @@ namespace App\Classes\Modules\Transactions\Standards\Validators; use App\Classes\General\Abstracts\AbstractValidation; use App\Classes\Modules\Transactions\DataTransferObjects\WaiveTransactionObject; +use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Classes\ValueObjects\Constants\TransactionType; class WaiveTransactionValidation extends AbstractValidation { @@ -28,8 +30,8 @@ class WaiveTransactionValidation extends AbstractValidation protected function rules(): array { return [ 'id' => 'required', - 'type' => ['required', 'numeric', 'in:16'], //Only storage invoice (type 16) can be waived - 'status' => ['required', 'numeric', 'in:2'], //Approve storage invoice only, paid invoice stricly forbidden + 'type' => ['required', 'numeric', 'in:'.TransactionType::STORAGE_INVOICE], //Only storage invoice (type 16) can be waived + 'status' => ['required', 'numeric', 'in:'.ApprovalStatus::APPROVED], //Approve storage invoice only, paid invoice stricly forbidden // 'billNo' => 'required', ]; }