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 @@
-
Warehouse Storage Fee (Days): {{ storage.numberOfDaysExceeded }} x 3 x {{ storage.cbm }}CBM
+Warehouese Storage Fee applies ten days after goods arrival in Malaysia.
+Payment Date