diff --git a/app/Classes/General/Eloquent/Filters/WithTrashed.php b/app/Classes/General/Eloquent/Filters/WithTrashed.php new file mode 100644 index 00000000..27da48ee --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/WithTrashed.php @@ -0,0 +1,20 @@ +withTrashed(); + } +} diff --git a/app/Classes/Modules/Billplzs/Processors/CallbackBillplzProcessor.php b/app/Classes/Modules/Billplzs/Processors/CallbackBillplzProcessor.php index af32b14f..12d0f9b0 100644 --- a/app/Classes/Modules/Billplzs/Processors/CallbackBillplzProcessor.php +++ b/app/Classes/Modules/Billplzs/Processors/CallbackBillplzProcessor.php @@ -9,10 +9,12 @@ use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\TransactionType; use App\Classes\ValueObjects\Constants\PaymentMethodType; use App\Classes\Modules\Transactions\Processors\CreatePaymentTransactionProcessor; +use App\Classes\Modules\Transactions\Processors\CreateStorageInvoiceDocTransactionProcessor; use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; use App\Classes\Modules\Wallets\Services\UpdatesWalletBalance; use App\Classes\Modules\Orders\Processors\UpdateDoFromVTPortalProcessor; use App\Classes\Modules\Orders\Processors\UpdateDoFromYDPortalProcessor; +use Illuminate\Support\Facades\Log; class CallbackBillplzProcessor { @@ -31,6 +33,9 @@ class CallbackBillplzProcessor /** @var CreatePaymentTransactionProcessor */ private $createPaymentTransactionProcessor; + /** @var CreateStorageInvoiceDocTransactionProcessor */ + private $ceateStorageInvoiceDocTransactionProcessor; + /** * CreateUserProcessor constructor. * @param UpdatesTransactionStatus $updatesTransactionStatus @@ -38,14 +43,16 @@ class CallbackBillplzProcessor * @param UpdateDoFromYDPortalProcessor $updateDoFromYDPortalProcessor * @param UpdatesWalletBalance $updatesWalletBalance * @param CreatePaymentTransactionProcessor $createPaymentTransactionProcessor + * @param CreateStorageInvoiceDocTransactionProcessor $ceateStorageInvoiceDocTransactionProcessor */ - public function __construct(UpdatesTransactionStatus $updatesTransactionStatus, UpdateDoFromVTPortalProcessor $updateDoFromVTPortalProcessor, UpdateDoFromYDPortalProcessor $updateDoFromYDPortalProcessor, UpdatesWalletBalance $updatesWalletBalance, CreatePaymentTransactionProcessor $createPaymentTransactionProcessor) + public function __construct(UpdatesTransactionStatus $updatesTransactionStatus, UpdateDoFromVTPortalProcessor $updateDoFromVTPortalProcessor, UpdateDoFromYDPortalProcessor $updateDoFromYDPortalProcessor, UpdatesWalletBalance $updatesWalletBalance, CreatePaymentTransactionProcessor $createPaymentTransactionProcessor, CreateStorageInvoiceDocTransactionProcessor $ceateStorageInvoiceDocTransactionProcessor) { $this->updatesTransactionStatus = $updatesTransactionStatus; $this->updateDoFromVTPortalProcessor = $updateDoFromVTPortalProcessor; $this->updateDoFromYDPortalProcessor = $updateDoFromYDPortalProcessor; $this->updatesWalletBalance = $updatesWalletBalance; $this->createPaymentTransactionProcessor = $createPaymentTransactionProcessor; + $this->ceateStorageInvoiceDocTransactionProcessor = $ceateStorageInvoiceDocTransactionProcessor; } @@ -66,32 +73,65 @@ class CallbackBillplzProcessor $this->updatesWalletBalance->execute($transaction->owner, $transaction->amount); $group = Group::where('reference', $transaction->payment_reference)->first(); - + // check if is group payment if ($group) { foreach ($group->groupTransactions as $groupTransaction) { $invoice = $groupTransaction->transaction; - $this->createPaymentTransactionProcessor->execute($invoice, PaymentMethodType::WALLET, null); + + $paymentTransaction = $this->createPaymentTransactionProcessor->execute($invoice, PaymentMethodType::WALLET, null); + + if($paymentTransaction && $paymentTransaction->status == ApprovalStatus::APPROVED){ + $pL = $invoice->owner; + $this->processPackingListAndInvoice($pL); + + if($invoice->type == TransactionType::STORAGE_INVOICE){ + $this->ceateStorageInvoiceDocTransactionProcessor->execute($pL); + } + } } - + $group->status = $status; $group->save(); } } if (!$transaction->owner instanceof Wallet) { - $totalPaidAmount = $invoice->transactions->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->sum('amount'); + $this->processPackingListAndInvoice($packingList, $invoice); - if (($invoice->amount - $totalPaidAmount) < 0.01) { + if($invoice->type == TransactionType::STORAGE_INVOICE){ + $this->ceateStorageInvoiceDocTransactionProcessor->execute($packingList); + } + } + } + + private function processPackingListAndInvoice($packingList, $invoice = null){ + $totalInvoiceAmmuntPaid = 0.00; + $totalInvoiceAmmunt = 0.00; + $invoiceTransactions = $packingList->transactions()->whereIn('type', [TransactionType::SHIPPING_INVOICE, TransactionType::STORAGE_INVOICE])->get(); + foreach($invoiceTransactions as $invoiceTransaction){ + $totalInvoiceAmmunt = $totalInvoiceAmmunt + $invoiceTransaction->amount; + $totalInvoiceAmmuntPaid = $totalInvoiceAmmuntPaid + $invoiceTransaction->transactions->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->sum('amount'); + } + + Log::info('Total invoice amount paid 1: '.$totalInvoiceAmmunt); //cief todo: to be removed + Log::info('Total invoice amount paid 2: '.$totalInvoiceAmmuntPaid); //cief todo: to be removed + + // if (($invoice->amount - $totalPaidAmount) < 0.01) { + if (($totalInvoiceAmmunt - $totalInvoiceAmmuntPaid) < 0.01) { + // dd(json_encode($totalInvoiceAmmunt)); + if($invoice){ $this->updatesTransactionStatus->execute($invoice, ApprovalStatus::COMPLETED); + } - $packingList->status = ApprovalStatus::APPROVED; - $packingList->save(); + Log::info('Total invoice amount paid 3: '.$totalInvoiceAmmuntPaid); //cief todo: to be removed - if (app()->environment('production')) { - $this->updateDoFromVTPortalProcessor->execute($packingList); - $this->updateDoFromYDPortalProcessor->execute($packingList); - } + $packingList->status = ApprovalStatus::APPROVED; + $packingList->save(); + + if (app()->environment('production')) { + $this->updateDoFromVTPortalProcessor->execute($packingList); + $this->updateDoFromYDPortalProcessor->execute($packingList); } } } diff --git a/app/Classes/Modules/Orders/ControllersLogic/FetchOrderV2Logic.php b/app/Classes/Modules/Orders/ControllersLogic/FetchOrderV2Logic.php index 08d3cc5d..d3dc6005 100644 --- a/app/Classes/Modules/Orders/ControllersLogic/FetchOrderV2Logic.php +++ b/app/Classes/Modules/Orders/ControllersLogic/FetchOrderV2Logic.php @@ -52,9 +52,11 @@ class FetchOrderV2Logic extends AbstractControllerLogic $this->canFetchOrder->passes(); $query = $this->fetchesOrder->execute(['reference' => $request->route('id'), 'with_packing_lists' => true]); + $query->storages = $request->input('storages'); //from middleware + return $this->resourceResponse(new OrderV2Resource($query)); } -} \ No newline at end of file +} diff --git a/app/Classes/Modules/Transactions/Processors/CheckAndCreateStorageInvoiceTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CheckAndCreateStorageInvoiceTransactionProcessor.php new file mode 100644 index 00000000..0b28b6b2 --- /dev/null +++ b/app/Classes/Modules/Transactions/Processors/CheckAndCreateStorageInvoiceTransactionProcessor.php @@ -0,0 +1,286 @@ +fetchesOrder = $fetchesOrder; + $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; + $this->fetchesTransaction = $fetchesTransaction; + $this->createsTransaction = $createsTransaction; + $this->createsTransactionDetail = $createsTransactionDetail; + $this->updatesTransaction = $updatesTransaction; + $this->updatesTransactionDetail = $updatesTransactionDetail; + $this->updatesTransactionStatus = $updatesTransactionStatus; + $this->deletesGroup = $deletesGroup; + } + + /** + * @throws MalformedRequestException + */ + public function execute(int $orderId) + { + $multipleResults = array(); + $order = $this->fetchesOrder->execute(['reference' => $orderId, 'with_packing_lists' => true]); + + $eta = ""; + $destinationWarehousePackages = $order->destinationWarehousePackages; + foreach ($destinationWarehousePackages as $destinationWarehousePackage){ + if ($destinationWarehousePackage) { + $package = $destinationWarehousePackage->packages->first(); + if ($package) { + $container = $package->container()->first(); + if ($container) { + $transport = $container->transports->first(); + if ($transport) { + $schedule = $transport->schedules->last(); + if ($schedule) { + $eta = $schedule->eta; + + if($eta){ + $transactions = $destinationWarehousePackage->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){ + $multipleResults[] = $this->processSingleTransactionOfTypeShippingInvoice($invoice_transaction, $destinationWarehousePackage, $order, $eta); + } + } + } + } + } + } + } + } + + return $multipleResults; + } + + function processSingleTransactionOfTypeShippingInvoice($transaction, $destinationWarehousePackage, $order, $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; + $storageInvoice = $destinationWarehousePackage->transactions()->where('transactions.type', TransactionType::STORAGE_INVOICE)->first(); + $storageInvoiceId = 0; + $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; + } + + $price_cbm = $pricePerCBM * $cbm * $resultNumberOfDaysExceeded; + + if(!$storageInvoice && $resultNumberOfDaysExceeded > 0 && $transaction->status != ApprovalStatus::COMPLETED){ + $billNumber = $this->generatesTransactionBillNumber->execute('STOR-'); + $invoiceTransaction = $this->createTransaction($destinationWarehousePackage, $billNumber, $order->company_module_id, $price_cbm); + $storageInvoiceId = $invoiceTransaction->id; + $this->createTransactionDetails($invoiceTransaction, $destinationWarehousePackage, $cbm, 3 * $resultNumberOfDaysExceeded, $resultNumberOfDaysExceeded); + } + else if($storageInvoice){ + $amount = $storageInvoice->amount; + $epsilon = 0.0001; // Tolerance for the comparison + + //cief todo: to be removed - starts + Log::info('price_cbm: '.$price_cbm."-".gettype($price_cbm)); + Log::info('amount: '.$amount."-".gettype($amount)); + if (abs($price_cbm - $amount) > $epsilon) { + Log::info("The values are not equal."); + } else { + Log::info("The values are approximately equal."); + } + //cief todo: to be removed - ends + + if(abs($price_cbm - $amount) > $epsilon && $storageInvoice->status !== ApprovalStatus::COMPLETED){ + $paymentTransactions = $storageInvoice->transactions()->where('transactions.type', TransactionType::PAYMENT)->where('transactions.status', ApprovalStatus::PENDING_SUBMISSION)->get(); + if(count($paymentTransactions) > 0){ //PAYMENT type + foreach ($paymentTransactions as $paymentTransaction){ + $this->updatesTransactionStatus->execute($paymentTransaction, ApprovalStatus::EXPIRED); + } + } + else{ //TOP UP type + $groups = $storageInvoice->groups()->get(); + foreach ($groups as $grp){ + $groupReference = $grp->reference; + $walletTransaction = $this->fetchesTransaction->execute(['payment_reference' => $groupReference]); + if($walletTransaction->status === ApprovalStatus::PENDING_SUBMISSION || $walletTransaction->status === ApprovalStatus::PENDING_VERIFICATION){ + $grp->status = ApprovalStatus::EXPIRED; + $grp->save(); + $this->deletesGroup->execute($grp); + $this->updatesTransactionStatus->execute($walletTransaction, ApprovalStatus::EXPIRED); + } + } + } + + $invoiceTransaction = $this->updateTransaction($storageInvoice, $price_cbm); + $invoiceTransactionDetails = $storageInvoice->transactionDetails()->first(); + $this->updateTransactionDetails($invoiceTransactionDetails, $cbm, 3 * $resultNumberOfDaysExceeded); + } + $storageInvoiceId = $storageInvoice->id; + } + + $result = [ + 'parentInvoiceId' => $transaction->id, + 'storageInvoiceId' => $storageInvoiceId, + 'numberOfDaysExceeded' => $resultNumberOfDaysExceeded, + 'numberOfDaysFree' => $resultNumberOfDaysFree, + 'startDate' => $resultStartDate, + 'currentDate' => $resultCurrentDate, + 'cbm' => $cbm, + 'pricePerCBM' => $pricePerCBM, + ]; + + return $result; + } + + function updateTransaction(Transaction $transaction, float $totalAmount){ + + $object = new TransactionObject( + $transaction->bill_no, + TransactionType::STORAGE_INVOICE, + 1, + $transaction->receiver, + 1, + PaymentMethodType::CASH, + $totalAmount, + $totalAmount, + 1, + 1, + 0, + 0, + 0, + null, + ApprovalStatus::APPROVED + ); + + /** @var Transaction $invoice_transaction */ + $invoice_transaction = $this->updatesTransaction->execute($transaction, $object); + + return $invoice_transaction; + } + + function updateTransactionDetails($invoice_transaction_details, $cbm, $price_cbm){ + $object_detail = new TransactionDetailObject( + 'STORAGE_FEE', + $invoice_transaction_details->name, + $cbm, + $price_cbm + ); + + $this->updatesTransactionDetail->execute($invoice_transaction_details, $object_detail); + } + + function createTransaction(PackingList $packing_list, string $billNumber, int $companyModuleId, float $totalAmount){ + + $object = new TransactionObject( + $billNumber, + TransactionType::STORAGE_INVOICE, + 1, + $companyModuleId, + 1, + PaymentMethodType::CASH, + $totalAmount, + $totalAmount, + 1, + 1, + 0, + 0, + 0, + null, + ApprovalStatus::APPROVED + ); + + /** @var Transaction $invoice_transaction */ + $invoice_transaction = $this->createsTransaction->execute($packing_list, $object); + + return $invoice_transaction; + } + + function createTransactionDetails($invoice_transaction, PackingList $packing_list, $cbm, $price_cbm, $numberOfDays){ + $object_detail = new TransactionDetailObject( + 'SHIPPING_FEE', + TransactionDetailType::STORAGE_FEE.' for '.$numberOfDays. ' days
'.round($packing_list->packages->where('type', '!=', PackageType::OVER_WEIGHT)->sum('quantity'), 3).' CTNS - '.round($cbm, 3).' CBM', + $cbm, + $price_cbm + ); + + $this->createsTransactionDetail->execute($invoice_transaction, $object_detail); + } +} diff --git a/app/Classes/Modules/Transactions/Processors/CreatePaymentTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CreatePaymentTransactionProcessor.php index 568bc4fb..dab2aeed 100644 --- a/app/Classes/Modules/Transactions/Processors/CreatePaymentTransactionProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/CreatePaymentTransactionProcessor.php @@ -127,15 +127,15 @@ class CreatePaymentTransactionProcessor $this->updatesWalletBalance->execute($wallet, ($amount * -1)); - $packingList = $invoice->owner; - $order = $packingList->owner; - $packingList->status = ApprovalStatus::APPROVED; - $packingList->save(); + // $packingList = $invoice->owner; + // $order = $packingList->owner; + // $packingList->status = ApprovalStatus::APPROVED; + // $packingList->save(); - if(app()->environment('production')){ - $this->updateDoFromVTPortalProcessor->execute($packingList); - $this->updateDoFromYDPortalProcessor->execute($packingList); - } + // if(app()->environment('production')){ + // $this->updateDoFromVTPortalProcessor->execute($packingList); + // $this->updateDoFromYDPortalProcessor->execute($packingList); + // } // later use this variabke to create a approved payment transaction $approvalStatus = ApprovalStatus::APPROVED; diff --git a/app/Classes/Modules/Transactions/Processors/CreateStorageInvoiceDocTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateStorageInvoiceDocTransactionProcessor.php new file mode 100644 index 00000000..d46f5661 --- /dev/null +++ b/app/Classes/Modules/Transactions/Processors/CreateStorageInvoiceDocTransactionProcessor.php @@ -0,0 +1,79 @@ +updatesTransactionStatus = $updatesTransactionStatus; + $this->createsDocument = $createsDocument; + $this->createsFiles = $createsFiles; + } + + + /** + * @throws MalformedRequestException + */ + public function execute(PackingList $packingList) + { + /** @var Transaction $invoice_transaction */ + $invoice_transaction = $packingList->transactions()->where('transactions.type', TransactionType::STORAGE_INVOICE)->whereIn('status', [ApprovalStatus::COMPLETED])->first(); + + // $this->updatesTransactionStatus->execute($invoice_transaction, ApprovalStatus::APPROVED); + + $transaction_invoice_pdf = LaravelMpdf::loadView('pages.pdfs.shipping_invoice', ['invoice_transaction' => $invoice_transaction]); + + $document_object = new DocumentObject( + DocumentType::STORAGE_INVOICE, + [chunk_split('data:application/pdf;base64,'.base64_encode($transaction_invoice_pdf->output()))], + '', + ApprovalStatus::COMPLETED, + 'storage_invoice' + ); + + $invouce_transaction_document = $invoice_transaction->documents()->where('document_type', DocumentType::STORAGE_INVOICE)->first(); + if(!$invouce_transaction_document){ + /** @var Document $document */ + $document = $this->createsDocument->execute($invoice_transaction, $document_object); + + $this->createsFiles->execute($document, $document_object); + $user = $packingList->owner->companyModule->employees()->first(); + if(app()->environment(['production'])) { + $user->notify(new InvoiceIssuedEmail($user, $packingList)); + } + } + } + +} diff --git a/app/Classes/ValueObjects/Constants/DocumentType.php b/app/Classes/ValueObjects/Constants/DocumentType.php index 75db231a..5b084565 100644 --- a/app/Classes/ValueObjects/Constants/DocumentType.php +++ b/app/Classes/ValueObjects/Constants/DocumentType.php @@ -24,5 +24,6 @@ final class DocumentType { public const SHIPPING_INVOICE = 'SHIPPING_INVOICE'; + public const STORAGE_INVOICE = 'STORAGE_INVOICE'; } diff --git a/app/Classes/ValueObjects/Constants/TransactionDetailType.php b/app/Classes/ValueObjects/Constants/TransactionDetailType.php index 69a15293..dacdf1d8 100644 --- a/app/Classes/ValueObjects/Constants/TransactionDetailType.php +++ b/app/Classes/ValueObjects/Constants/TransactionDetailType.php @@ -11,4 +11,6 @@ final class TransactionDetailType { public const MIN_CBM_CHARGES = 'Minimum Charge for 0.3 CBM Per Container'; public const CUSTOM_CHARGES = 'Custom charges'; + + public const STORAGE_FEE = 'Malaysia Warehoue Storage Fee'; } diff --git a/app/Classes/ValueObjects/Constants/TransactionType.php b/app/Classes/ValueObjects/Constants/TransactionType.php index 3e20545f..699bc3cd 100644 --- a/app/Classes/ValueObjects/Constants/TransactionType.php +++ b/app/Classes/ValueObjects/Constants/TransactionType.php @@ -5,9 +5,9 @@ namespace App\Classes\ValueObjects\Constants; final class TransactionType { // public const PAYMENT_ATTEMPT = 0; - + public const SHIPPING_INVOICE = 1; - + public const PAYMENT = 2; // public const BILL = 3; @@ -35,10 +35,11 @@ final class TransactionType { // public const SHIPPING_COST = 14; public const GROUP_PAYMENT = 15; - + public const TRANSACTION_TYPE_ID = [ self::SHIPPING_INVOICE => "Shipping Invoice", self::PAYMENT => "Payment", ]; + public const STORAGE_INVOICE = 16; } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index dc3bc265..7ef04da8 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -70,5 +70,7 @@ class Kernel extends HttpKernel 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'valid.token' => ValidateToken::class, 'token.check' => \App\Http\Middleware\TokenCheckerMiddleware::class, + 'storage.invoice.check.byorder' => \App\Http\Middleware\CheckForStorageInvoiceByOrderId::class, + 'storage.invoice.check.bytransactions' => \App\Http\Middleware\CheckForStorageInvoiceByTransactions::class, ]; } diff --git a/app/Http/Middleware/CheckForStorageInvoiceByOrderId.php b/app/Http/Middleware/CheckForStorageInvoiceByOrderId.php new file mode 100644 index 00000000..8e1f4efc --- /dev/null +++ b/app/Http/Middleware/CheckForStorageInvoiceByOrderId.php @@ -0,0 +1,37 @@ +storageInvoiceTransactionProcessor = $storageInvoiceTransactionProcessor; + } + + + /** + * Handle an incoming request. + * + * @param Request $request + * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next + * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse + */ + public function handle(Request $request, Closure $next) + { + $orderId = $request->route('id'); + $result = $this->storageInvoiceTransactionProcessor->execute($orderId); + $request->merge(['storages' => $result]); + + return $next($request); + } +} diff --git a/app/Http/Middleware/CheckForStorageInvoiceByTransactions.php b/app/Http/Middleware/CheckForStorageInvoiceByTransactions.php new file mode 100644 index 00000000..443030dd --- /dev/null +++ b/app/Http/Middleware/CheckForStorageInvoiceByTransactions.php @@ -0,0 +1,72 @@ +storageInvoiceTransactionProcessor = $storageInvoiceTransactionProcessor; + $this->listsTransactions = $listsTransactions; + } + + + /** + * Handle an incoming request. + * + * @param Request $request + * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next + * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse + */ + public function handle(Request $request, Closure $next) + { + //{"per_page":999,"order_by":{"column":"id","DESC":true},"status_in":[2],"receiver":298,"type_in":[1,16],"does_not_have_payment_status_in":[0,1],"does_not_have_groups":1} + $transactions = null; + $marking = $request->route('marking'); + if($marking){ + $connection = CompanyConnection::where('invitee_reference', $marking)->first(); + $company_module_id = $connection->invitee->id; + $filters = [ + 'per_page' => 999, + 'status_in' => [2], + 'receiver' => $company_module_id, + 'type_in' => [1, 16] + ]; + $transactions = $this->listsTransactions->execute($filters); + } + else{ + $filters = json_decode($request->input('filters'), true); + $filters['per_page'] = 999; + unset($filters['does_not_have_payment_status_in']); + unset($filters['does_not_have_groups']); + unset($filters['order_by']); + $transactions = $this->listsTransactions->execute($filters); + } + + foreach($transactions as $transaction){ + $packingList = $transaction->owner()->first(); + $order = $packingList->owner()->first(); + if($order instanceof Order){ + $this->storageInvoiceTransactionProcessor->execute($order->reference); + } + } + + return $next($request); + } +} diff --git a/app/Http/Resources/OrderV2Resource.php b/app/Http/Resources/OrderV2Resource.php index c8b82e19..8e28a656 100644 --- a/app/Http/Resources/OrderV2Resource.php +++ b/app/Http/Resources/OrderV2Resource.php @@ -31,8 +31,9 @@ class OrderV2Resource extends JsonResource 'address' => new AddressResource($this->addresses()->where('status', '=', ApprovalStatus::APPROVED)->first()), 'address_change_request' => new AddressResource($this->addressesPendingVerification()->first()), 'invoices' => $this->whenLoaded('packingLists', function() { - return TransactionResource::collection($this->transactions()->whereNotIn('transactions.status', [0, 1])->where('transactions.type', TransactionType::SHIPPING_INVOICE)->get()); + return TransactionResource::collection($this->transactions()->whereNotIn('transactions.status', [0, 1])->whereIn('transactions.type', [TransactionType::SHIPPING_INVOICE, TransactionType::STORAGE_INVOICE])->get()); }), + 'storages' => $this->storages ? $this->storages : null, //from middleware 'remarks' => RemarkResource::collection($this->remarks), 'created_at' => $this->created_at->format('d-m-Y') ]; diff --git a/app/Http/Resources/TransactionResource.php b/app/Http/Resources/TransactionResource.php index 87badb43..e96681bc 100644 --- a/app/Http/Resources/TransactionResource.php +++ b/app/Http/Resources/TransactionResource.php @@ -40,7 +40,7 @@ class TransactionResource extends JsonResource if ($group) { $groupTransactions = GroupTransactionResource::collection($group->groupTransactions); } - + } return [ @@ -71,6 +71,11 @@ class TransactionResource extends JsonResource ->payments()->where('status', ApprovalStatus::PENDING_SUBMISSION) ->get() ), + 'payments_expired' => TransactionResource::collection( + $this->transactions() + ->payments()->where('status', ApprovalStatus::EXPIRED) + ->get() + ), 'payment_history' => TransactionResource::collection( $this->transactions() ->payments() diff --git a/resources/assets/vue/components/companies/elements/CustomerPaymentBillingInnerComponent.vue b/resources/assets/vue/components/companies/elements/CustomerPaymentBillingInnerComponent.vue index a1113c14..c2012cb7 100644 --- a/resources/assets/vue/components/companies/elements/CustomerPaymentBillingInnerComponent.vue +++ b/resources/assets/vue/components/companies/elements/CustomerPaymentBillingInnerComponent.vue @@ -12,7 +12,7 @@ -
+
diff --git a/resources/assets/vue/components/companies/sections/CustomerPaymentBillingSectionComponent.vue b/resources/assets/vue/components/companies/sections/CustomerPaymentBillingSectionComponent.vue index fb69cee3..49f48d87 100644 --- a/resources/assets/vue/components/companies/sections/CustomerPaymentBillingSectionComponent.vue +++ b/resources/assets/vue/components/companies/sections/CustomerPaymentBillingSectionComponent.vue @@ -43,6 +43,22 @@
+
+
+
+ + +
+
+
+
+
Group Payment Expired
+
+
+
@@ -75,7 +91,7 @@
-
+
@@ -84,7 +100,7 @@
- +
@@ -92,6 +108,11 @@
+
+
+ +
+
@@ -99,7 +120,7 @@
- +
diff --git a/resources/assets/vue/components/orders/sections/OrderProfileV2SectionComponent.vue b/resources/assets/vue/components/orders/sections/OrderProfileV2SectionComponent.vue index 0f9ae103..271bc1f1 100644 --- a/resources/assets/vue/components/orders/sections/OrderProfileV2SectionComponent.vue +++ b/resources/assets/vue/components/orders/sections/OrderProfileV2SectionComponent.vue @@ -149,7 +149,7 @@
- +
@@ -201,6 +201,16 @@ this.$store.dispatch('completeList', {'name': this.section, 'data': []}); this.isLoading = false; this.order = response.payload.data; + }, + getStorage(invoice) { + const storageObject = this.findStorageObject(invoice.id); + return storageObject; + }, + findStorageObject(storageInvoiceId) { + if(this.order.storages){ + return this.order.storages.find(storage => storage.storageInvoiceId === storageInvoiceId); + } + return null; } } } diff --git a/resources/assets/vue/components/paymentsBilling/elements/AdminPaymentsBillingComponent.vue b/resources/assets/vue/components/paymentsBilling/elements/AdminPaymentsBillingComponent.vue index c69c2c9c..ae1b3e42 100644 --- a/resources/assets/vue/components/paymentsBilling/elements/AdminPaymentsBillingComponent.vue +++ b/resources/assets/vue/components/paymentsBilling/elements/AdminPaymentsBillingComponent.vue @@ -111,7 +111,7 @@
-
+
diff --git a/resources/assets/vue/components/paymentsBilling/elements/CustomerPaymentsBillingComponent.vue b/resources/assets/vue/components/paymentsBilling/elements/CustomerPaymentsBillingComponent.vue index f64b006c..0b4c1bdb 100644 --- a/resources/assets/vue/components/paymentsBilling/elements/CustomerPaymentsBillingComponent.vue +++ b/resources/assets/vue/components/paymentsBilling/elements/CustomerPaymentsBillingComponent.vue @@ -1,6 +1,17 @@