From 28c0aeff77b7b4cf7ca0985be4f431b2832616c1 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Mon, 26 Feb 2024 00:38:25 +0800 Subject: [PATCH 01/13] dont show payment on homepage if it is in refund process --- .../Filters/DoesNotHaveRefundInProgress.php | 24 +++++++++++++++++++ .../SupplierPendingOrdersSectionComponent.vue | 4 ++-- 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 app/Classes/General/Eloquent/Filters/DoesNotHaveRefundInProgress.php diff --git a/app/Classes/General/Eloquent/Filters/DoesNotHaveRefundInProgress.php b/app/Classes/General/Eloquent/Filters/DoesNotHaveRefundInProgress.php new file mode 100644 index 00000000..60618626 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/DoesNotHaveRefundInProgress.php @@ -0,0 +1,24 @@ +whereDoesntHave('transactions', function ($query) { + return $query->where('type', TransactionType::REFUND)->whereIn('status', [ApprovalStatus::PENDING_SUBMISSION, ApprovalStatus::PENDING_VERIFICATION]); + }); + } +} diff --git a/resources/assets/vue/components/bookings/sections/SupplierPendingOrdersSectionComponent.vue b/resources/assets/vue/components/bookings/sections/SupplierPendingOrdersSectionComponent.vue index fa345d58..8f6fb8c7 100644 --- a/resources/assets/vue/components/bookings/sections/SupplierPendingOrdersSectionComponent.vue +++ b/resources/assets/vue/components/bookings/sections/SupplierPendingOrdersSectionComponent.vue @@ -117,7 +117,7 @@
- + @@ -202,7 +202,7 @@ // todo-refund: activate this for partial refund // this.$refs.pendingOrdersList.updateFilters({per_page: 10000, status: 2, type: 1, original_currency_id_in: [this.selectedCurrency.id], transaction_service_id: this.selectedService.id, is_not_fully_refunded: true}); - this.$refs.pendingOrdersList.updateFilters({per_page: 10000, status: 2, type: 1, original_currency_id_in: [this.selectedCurrency.id], transaction_service_id: this.selectedService.id}); + this.$refs.pendingOrdersList.updateFilters({per_page: 10, status: 2, type: 1, original_currency_id_in: [this.selectedCurrency.id], transaction_service_id: this.selectedService.id, does_not_have_refund_in_progress: true}); this.selectedSupplier.status = false; this.currencyDropdownLaunch.status = false; From f84b04c26caa336abad90a87e66991c21f44532c Mon Sep 17 00:00:00 2001 From: edmondlang Date: Tue, 27 Feb 2024 01:08:16 +0800 Subject: [PATCH 02/13] update logging and indentation --- app/Console/Commands/ExpiredBookingCommand.php | 6 ++++-- app/Console/Kernel.php | 8 ++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/Console/Commands/ExpiredBookingCommand.php b/app/Console/Commands/ExpiredBookingCommand.php index ca690c67..5779a9e9 100644 --- a/app/Console/Commands/ExpiredBookingCommand.php +++ b/app/Console/Commands/ExpiredBookingCommand.php @@ -66,9 +66,10 @@ class ExpiredBookingCommand extends Command $transactions = $booking->transactions; foreach ($transactions as $transaction) { + $prevStatus = $transaction->status; $transaction->status = ApprovalStatus::EXPIRED; $transaction->save(); - Log::info("Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}"); + Log::info("Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}. Status before update: {$prevStatus}"); } } @@ -89,9 +90,10 @@ class ExpiredBookingCommand extends Command $transactions = $booking->transactions; foreach ($transactions as $transaction) { + $prevStatus = $transaction->status; $transaction->status = ApprovalStatus::EXPIRED; $transaction->save(); - Log::info("Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}"); + Log::info("Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}. Status before update: {$prevStatus}"); } } } diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 412ed70f..5e9aa8a8 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -45,12 +45,12 @@ class Kernel extends ConsoleKernel ->withoutOverlapping(); $schedule->command('booking:expired') - ->dailyAt('02:00') - ->withoutOverlapping(); + ->dailyAt('02:00') + ->withoutOverlapping(); $schedule->command('purchaseOrder:autoFill') - ->dailyAt('03:00') - ->withoutOverlapping(); + ->dailyAt('03:00') + ->withoutOverlapping(); } /** From 5fd2f6ef7f709a5e676bfd8ecfed9660a6dd0784 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Wed, 28 Feb 2024 01:34:39 +0800 Subject: [PATCH 03/13] -complete supplier bill group when oustanding is 0 -create refund and supplier refund if the request refund order is in white form --- .../CreateBookingRefundLogic.php | 20 +++++++++++++------ ...CreateBillGroupPaymentTransactionLogic.php | 19 +++++++++++------- .../UpdateRefundTransactionStatusLogic.php | 6 ++++++ .../CalculatesBillGroupPaymentAmount.php | 13 ++++++------ .../ExpiredRefundedBookingCommand.php | 4 ++-- .../BillGroupPaymentSummaryComponent.vue | 7 ++++++- .../elements/PaymentHistoryComponent.vue | 2 +- .../elements/SupplierRefundComponent.vue | 10 +++++++++- ...pplierWhiteFormPlaceOrderFormComponent.vue | 2 +- 9 files changed, 58 insertions(+), 25 deletions(-) diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php index 0648629e..c99f42df 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php @@ -75,10 +75,6 @@ class CreateBookingRefundLogic extends AbstractControllerLogic $transaction = $this->fetchesTransaction->execute(['id' => $request->route('payment_id')]); - if ($transaction->transactions()->bills()->first()) { - throw new MalformedRequestException('Booking under white form cannot request for refund'); - } - $booking = $transaction->owner; $billNumber = $this->generatesTransactionBillNumber->execute('RFD-'); @@ -100,9 +96,21 @@ class CreateBookingRefundLogic extends AbstractControllerLogic $transaction->original_currency_id, $transaction->currency_rate, 0, 0, null, ApprovalStatus::PENDING_VERIFICATION, [], $transaction->bill_no); - $transaction = $this->createsTransaction->execute($transaction, $object); + $refund_transaction = $this->createsTransaction->execute($transaction, $object); - return $this->resourceResponse(new TransactionResource($transaction)); + // create supplier refund + if ($transaction->transactions()->bills()->first()) { + $billNumber = $this->generatesTransactionBillNumber->execute('SRFD-'); + $object = new TransactionObject($billNumber, TransactionType::SUPPLIER_REFUND, 1, $booking->company->id, + 1, PaymentMethodType::CASH, + $refundTotal, $request->input('amount'), 1, + $transaction->original_currency_id, $transaction->currency_rate, + 0, 0, null, ApprovalStatus::PENDING_VERIFICATION, [], $transaction->bill_no); + + $transaction = $this->createsTransaction->execute($transaction, $object); + } + + return $this->resourceResponse(new TransactionResource($refund_transaction)); } diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php index 92a6343d..e2fc6dc1 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php @@ -77,13 +77,18 @@ class CreateBillGroupPaymentTransactionLogic extends AbstractControllerLogic $payAmount = floatval(str_replace(',', '', $request->input('payAmount'))); if($payAmount > round($outstanding_amount, 2)) throw new MalformedRequestException('Your payment must not be greater than '. $outstanding_amount .'.'); - $billNumber = $this->generatesTransactionBillNumber->execute('SPLR-PYMT-'); - $transaction_object = new TransactionObject($billNumber, TransactionType::SUPPLIER_PAYMENT, $billGroup->issuer, - $billGroup->receiver, $billGroup->issuerCompany->banks()->where('default', true)->first()->id, PaymentMethodType::CASH, - $payAmount, $payAmount, 1, 1, 1, - 0, 0, null, ApprovalStatus::PENDING_SUBMISSION, [], ''); - $this->createsTransaction->execute($billGroup, $transaction_object); - + if ($billGroupPayment['outstanding_amount'] == 0 && $payAmount == 0) { + $billGroup->status = ApprovalStatus::APPROVED; + $billGroup->save(); + } else { + $billNumber = $this->generatesTransactionBillNumber->execute('SPLR-PYMT-'); + $transaction_object = new TransactionObject($billNumber, TransactionType::SUPPLIER_PAYMENT, $billGroup->issuer, + $billGroup->receiver, $billGroup->issuerCompany->banks()->where('default', true)->first()->id, PaymentMethodType::CASH, + $payAmount, $payAmount, 1, 1, 1, + 0, 0, null, ApprovalStatus::PENDING_SUBMISSION, [], ''); + $this->createsTransaction->execute($billGroup, $transaction_object); + } + return $this->resourceResponse(new BillGroupResource($billGroup)); } diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php index 09e4b102..02107a77 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php @@ -85,6 +85,8 @@ class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic $paymentTransaction = $refundTransaction->owner; + $supplierRefundTransaction = $paymentTransaction->transactions()->supplierRefunds()->where('status', [ApprovalStatus::PENDING_VERIFICATION])->first(); + $booking = $paymentTransaction->owner; $reference = $refundTransaction->amount == $paymentTransaction->amount ? 'Fully Refund for Ref. ' . $booking->marking : 'Partially Refund for Ref. ' . $booking->marking; @@ -93,6 +95,10 @@ class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic $this->creditWalletProcessor->execute($booking->company, $refundTransaction->type, $refundTransaction->amount, $reference); } + if ($supplierRefundTransaction) { + $this->updatesTransactionStatus->execute($supplierRefundTransaction, $request->route('status')); + } + $paidAmount = $paymentTransaction->original_amount - $this->calculatesBookingRefundAmount->calculateRefundAmount($paymentTransaction, $booking->fix_currency_id); if (!$paidAmount > 0) { $this->updatesTransactionStatus->execute($paymentTransaction, ApprovalStatus::REFUNDED); diff --git a/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php b/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php index 1a130b41..f41de813 100644 --- a/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php +++ b/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php @@ -7,11 +7,13 @@ use App\Models\BillGroup; class CalculatesBillGroupPaymentAmount { - public function execute(BillGroup $billGroup){ - $bill_refund_amount = floatval($billGroup->billRefunds->sum('amount')); - $floating_amount = floatval($billGroup->transactions()->whereIn('status', [ApprovalStatus::PENDING_SUBMISSION, ApprovalStatus::PENDING_VERIFICATION])->sum('amount')); - $paid_amount = floatval($billGroup->transactions()->where('status', ApprovalStatus::APPROVED)->sum('amount')); + public function execute(BillGroup $billGroup) + { + $bill_refund_amount = round(floatval($billGroup->billRefunds->sum('amount')), 7); + $floating_amount = round(floatval($billGroup->transactions()->whereIn('status', [ApprovalStatus::PENDING_SUBMISSION, ApprovalStatus::PENDING_VERIFICATION])->sum('amount')), 7); + $paid_amount = round(floatval($billGroup->transactions()->where('status', ApprovalStatus::APPROVED)->sum('amount')), 7); $outstanding_amount = $billGroup->amount - $bill_refund_amount - $paid_amount - $floating_amount + $billGroup->service_charge; + $outstanding_amount = round($outstanding_amount, 7); return [ 'bill_refund_amount' => $bill_refund_amount, @@ -20,5 +22,4 @@ class CalculatesBillGroupPaymentAmount 'outstanding_amount' => $outstanding_amount, ]; } - -} \ No newline at end of file +} diff --git a/app/Console/Commands/ExpiredRefundedBookingCommand.php b/app/Console/Commands/ExpiredRefundedBookingCommand.php index 0fcbd87b..6cc24e28 100644 --- a/app/Console/Commands/ExpiredRefundedBookingCommand.php +++ b/app/Console/Commands/ExpiredRefundedBookingCommand.php @@ -140,7 +140,7 @@ class ExpiredRefundedBookingCommand extends Command Log::info("Credit note transaction id: {$transaction->id}, booking is in white form"); } - if (!$refund && !$bookingInWhiteForm) { + if (!$refund) { $billNumber = $this->generatesTransactionBillNumber->execute('RFD-'); $object = new TransactionObject($billNumber, TransactionType::REFUND, 1, $booking->company->id, @@ -153,7 +153,7 @@ class ExpiredRefundedBookingCommand extends Command } if ($bookingInWhiteForm) { - $refund = $bookingPayment->transactions()->supplierRefunds()->where('amount', $transaction->amount)->where('status', ApprovalStatus::APPROVED)->first(); + $refund = $bookingPayment->transactions()->supplierRefunds()->where('amount', $transaction->amount)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->first(); if (!$refund) { $billNumber = $this->generatesTransactionBillNumber->execute('SRFD-'); diff --git a/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue b/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue index c826f154..284f681d 100644 --- a/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue +++ b/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue @@ -96,11 +96,16 @@
-
+
+
+
+ +
+
diff --git a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue index 877ec248..82dfcfc5 100644 --- a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue +++ b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue @@ -292,7 +292,7 @@
-
+
diff --git a/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue b/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue index 1a42fe6c..872ebef4 100644 --- a/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue +++ b/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue @@ -54,6 +54,10 @@ type: Number, required: true }, + inputPaymentTotal: { + type: Number, + required: true + }, refundTotal: { type: Number, required: true @@ -65,7 +69,11 @@ }, computed: { clickable(){ - return this.refundTotal < this.paymentTotal || this.supplierRefunds.some((i) => this.item.id === i.id ); + if (this.is1688Supplier) { + return this.refundTotal < this.inputPaymentTotal || this.supplierRefunds.some((i) => this.item.id === i.id ); + } else { + return this.refundTotal < this.paymentTotal || this.supplierRefunds.some((i) => this.item.id === i.id ); + } } }, data(){ diff --git a/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue b/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue index 9b7f8eb1..4ca36c2e 100644 --- a/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue +++ b/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue @@ -110,7 +110,7 @@
From 5c105398246dcef286210d70ace5a99463a0ff5b Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Wed, 28 Feb 2024 20:53:20 +0800 Subject: [PATCH 04/13] resolve supplier refund amount to follow white form rate --- .../Eloquent/Filters/BelongsToSupplierId.php | 24 -------------- .../Filters/CurrencyRateIsNotEqual.php | 20 ++++++++++++ .../General/Eloquent/Filters/ReceiverIn.php | 20 ++++++++++++ .../CreateBookingRefundLogic.php | 15 ++++++--- .../CreateSupplierBillGroupLogic.php | 4 +++ .../ControllersLogic/UpdateGroupLogic.php | 12 +++++++ .../ExpiredRefundedBookingCommand.php | 31 ++++++++++++------- ...pplierWhiteFormPlaceOrderFormComponent.vue | 2 +- 8 files changed, 86 insertions(+), 42 deletions(-) delete mode 100644 app/Classes/General/Eloquent/Filters/BelongsToSupplierId.php create mode 100644 app/Classes/General/Eloquent/Filters/CurrencyRateIsNotEqual.php create mode 100644 app/Classes/General/Eloquent/Filters/ReceiverIn.php diff --git a/app/Classes/General/Eloquent/Filters/BelongsToSupplierId.php b/app/Classes/General/Eloquent/Filters/BelongsToSupplierId.php deleted file mode 100644 index 63536412..00000000 --- a/app/Classes/General/Eloquent/Filters/BelongsToSupplierId.php +++ /dev/null @@ -1,24 +0,0 @@ -whereHas('owner', function ($q) use ($value) { - $q->whereHas('transactions', function ($q2) use ($value) { - $q2->where('type', TransactionType::BILL)->where('issuer', $value); - }); - }); - } -} diff --git a/app/Classes/General/Eloquent/Filters/CurrencyRateIsNotEqual.php b/app/Classes/General/Eloquent/Filters/CurrencyRateIsNotEqual.php new file mode 100644 index 00000000..0372e760 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/CurrencyRateIsNotEqual.php @@ -0,0 +1,20 @@ +where('currency_rate', '!=', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/ReceiverIn.php b/app/Classes/General/Eloquent/Filters/ReceiverIn.php new file mode 100644 index 00000000..3ce91559 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/ReceiverIn.php @@ -0,0 +1,20 @@ +whereIn('receiver', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php index c99f42df..75ad76a1 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php @@ -88,7 +88,8 @@ class CreateBookingRefundLogic extends AbstractControllerLogic $refundAmount = bcdiv($request->input('amount'), $transaction->currency_rate, 7); // refund service charges if is fully refund - $refundTotal = ($refund + $request->input('amount')) == $transaction->original_amount ? $refundAmount + $transaction->service_charge + $transaction->tax : $refundAmount; + $isFullyRefund = ($refund + $request->input('amount')) == $transaction->original_amount; + $refundTotal = $isFullyRefund ? $refundAmount + $transaction->service_charge + $transaction->tax : $refundAmount; $object = new TransactionObject($billNumber, TransactionType::REFUND, 1, $booking->company->id, 1, PaymentMethodType::CASH, @@ -98,13 +99,17 @@ class CreateBookingRefundLogic extends AbstractControllerLogic $refund_transaction = $this->createsTransaction->execute($transaction, $object); + $bookingInWhiteForm = $transaction->transactions()->bills()->first(); + // create supplier refund - if ($transaction->transactions()->bills()->first()) { + if ($bookingInWhiteForm) { $billNumber = $this->generatesTransactionBillNumber->execute('SRFD-'); - $object = new TransactionObject($billNumber, TransactionType::SUPPLIER_REFUND, 1, $booking->company->id, + $supplierRefundTotal = bcdiv($request->input('amount'), $bookingInWhiteForm->currency_rate, 7); + + $object = new TransactionObject($billNumber, TransactionType::SUPPLIER_REFUND, 1, $bookingInWhiteForm->issuer, 1, PaymentMethodType::CASH, - $refundTotal, $request->input('amount'), 1, - $transaction->original_currency_id, $transaction->currency_rate, + $supplierRefundTotal, $request->input('amount'), 1, + $transaction->original_currency_id, $bookingInWhiteForm->currency_rate, 0, 0, null, ApprovalStatus::PENDING_VERIFICATION, [], $transaction->bill_no); $transaction = $this->createsTransaction->execute($transaction, $object); diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php index ef0560e7..33284726 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php @@ -102,6 +102,10 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic if ($refund->type !== TransactionType::SUPPLIER_REFUND) { throw new MalformedRequestException('Only transaction type supplier refund can be used for bill refund.'); } + + if ($refund->currency_rate == 1) { + throw new MalformedRequestException('Supplier refund with currecy rate 1 cannot be used for bill refund.'); + } } $amount = 0; diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php index aa432aea..f29db055 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php @@ -125,6 +125,18 @@ class UpdateGroupLogic extends AbstractControllerLogic $billTransaction = $this->updatesTransaction->execute($transaction, $object); + $supplierRefundTransactions = $transaction->owner->transactions()->supplierRefunds()->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->get(); + + foreach ($supplierRefundTransactions as $supplierRefundTransaction) { + $claimBefore = $supplierRefundTransaction->transactions()->where('type', TransactionType::BILL_REFUND)->where('status', ApprovalStatus::APPROVED)->exists(); + + if (!$claimBefore) { + $supplierRefundTransaction->currency_rate = $rate; + $supplierRefundTransaction->amount = $supplierRefundTransaction->original_amount / $rate; + $supplierRefundTransaction->save(); + } + } + $transferTransaction = $transaction->transactions()->where('type', TransactionType::TRANSFER_FEE)->first(); $transferFee = $this->calculatesTransactionTransferFee->execute($billTransaction->original_amount, $constant); diff --git a/app/Console/Commands/ExpiredRefundedBookingCommand.php b/app/Console/Commands/ExpiredRefundedBookingCommand.php index 6cc24e28..d64cf385 100644 --- a/app/Console/Commands/ExpiredRefundedBookingCommand.php +++ b/app/Console/Commands/ExpiredRefundedBookingCommand.php @@ -114,10 +114,12 @@ class ExpiredRefundedBookingCommand extends Command // check if the booking is fully refund $amountDifference = bcsub($transaction->amount, $bookingPaymentAmount, 7); + $isFullyRefund = false; if (abs($amountDifference) < 0.01) { - // rejecting booking payment transaction - // $bookingPayment->status = ApprovalStatus::REJECTED; - // $bookingPayment->save(); + $isFullyRefund = true; + // update fully refunded booking payment transaction + $bookingPayment->status = ApprovalStatus::REFUNDED; + $bookingPayment->save(); //expired booking // $this->updatesBookingStatus->execute($booking, ApprovalStatus::EXPIRED); @@ -136,16 +138,12 @@ class ExpiredRefundedBookingCommand extends Command Log::info("Credit note transaction id: {$transaction->id}, already created same amount of refund transaction for same booking payment transaction"); } - if ($bookingInWhiteForm) { - Log::info("Credit note transaction id: {$transaction->id}, booking is in white form"); - } - if (!$refund) { $billNumber = $this->generatesTransactionBillNumber->execute('RFD-'); $object = new TransactionObject($billNumber, TransactionType::REFUND, 1, $booking->company->id, 1, PaymentMethodType::CASH, - $transaction->amount, $transaction->amount * $bookingPayment->currency_rate, 1, + $transaction->amount, $isFullyRefund ? $bookingPayment->original_amount : $transaction->amount * $bookingPayment->currency_rate, 1, $bookingPayment->original_currency_id, $bookingPayment->currency_rate, 0, 0, null, ApprovalStatus::APPROVED, [], $bookingPayment->bill_no); @@ -153,15 +151,24 @@ class ExpiredRefundedBookingCommand extends Command } if ($bookingInWhiteForm) { - $refund = $bookingPayment->transactions()->supplierRefunds()->where('amount', $transaction->amount)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->first(); + $original_amount = $isFullyRefund ? $bookingPayment->original_amount : bcmul($transaction->amount, $bookingPayment->currency_rate, 7); + $supplier_refund_amount = bcdiv($original_amount, $bookingInWhiteForm->currency_rate, 7); + + Log::info("Credit note transaction id: {$transaction->id}, booking is in white form, white form currency rate is {$bookingInWhiteForm->currency_rate}"); + + // if ($isFullyRefund && $bookingInWhiteForm->currency_rate == 1) { + // dd ($bookingInWhiteForm->owner_id); + // } + + $refund = $bookingPayment->transactions()->supplierRefunds()->where('original_amount', $original_amount)->first(); if (!$refund) { $billNumber = $this->generatesTransactionBillNumber->execute('SRFD-'); - $object = new TransactionObject($billNumber, TransactionType::SUPPLIER_REFUND, 1, $booking->company->id, + $object = new TransactionObject($billNumber, TransactionType::SUPPLIER_REFUND, 1, $bookingInWhiteForm->issuer, 1, PaymentMethodType::CASH, - $transaction->amount, $transaction->amount * $bookingPayment->currency_rate, 1, - $bookingPayment->original_currency_id, $bookingPayment->currency_rate, + $supplier_refund_amount, $original_amount, 1, + $bookingPayment->original_currency_id, $bookingInWhiteForm->currency_rate, 0, 0, null, ApprovalStatus::APPROVED, [], $bookingPayment->bill_no); $transaction = $this->createsTransaction->execute($bookingPayment, $object); diff --git a/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue b/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue index 4ca36c2e..01c099ed 100644 --- a/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue +++ b/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue @@ -108,7 +108,7 @@
Supplier Refund
- + From ca2f41e95c5d61a172c9a98e10476bc6ca5827b6 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Fri, 1 Mar 2024 08:16:54 +0800 Subject: [PATCH 05/13] fix bug for payment transaction not found after status update to refunded --- .../ExpiredRefundedBookingCommand.php | 124 ++++++++++-------- 1 file changed, 68 insertions(+), 56 deletions(-) diff --git a/app/Console/Commands/ExpiredRefundedBookingCommand.php b/app/Console/Commands/ExpiredRefundedBookingCommand.php index d64cf385..87f44f81 100644 --- a/app/Console/Commands/ExpiredRefundedBookingCommand.php +++ b/app/Console/Commands/ExpiredRefundedBookingCommand.php @@ -107,72 +107,84 @@ class ExpiredRefundedBookingCommand extends Command if (!$bookingPayment) { $bookingPayment = $booking->transactions()->payments()->whereIn('status', [ApprovalStatus::SUSPENDED, ApprovalStatus::EXPIRED, ApprovalStatus::REJECTED])->orderBy('id', 'DESC')->first(); } + } + + if ($bookingPayment) { $status = ApprovalStatus::APPROVAL_STATUS_ID[$bookingPayment->status]; Log::info("Credit note transaction id: {$transaction->id}, the payment for the booking is in status {$status}"); - } - $bookingPaymentAmount = $bookingPayment->amount; - // check if the booking is fully refund - $amountDifference = bcsub($transaction->amount, $bookingPaymentAmount, 7); - $isFullyRefund = false; - if (abs($amountDifference) < 0.01) { - $isFullyRefund = true; - // update fully refunded booking payment transaction - $bookingPayment->status = ApprovalStatus::REFUNDED; - $bookingPayment->save(); - - //expired booking - // $this->updatesBookingStatus->execute($booking, ApprovalStatus::EXPIRED); - Log::info("Credit note transaction id: {$transaction->id} is fully refunded, the refunded amount was {$transaction->amount} the payment reference is: {$transaction->payment_reference}"); - // Log::info("Credit note transaction id: {$transaction->id}, Rejected Booking Transaction Payment id: {$bookingPayment->id}, the payment amount was {$bookingPayment->amount}"); - // Log::info("Credit note transaction id: {$transaction->id}, Expired Booking id: {$booking->id}"); - } else { - Log::info("Credit note transaction id: {$transaction->id} is not fully refunded, the refunded amount was {$transaction->amount}, the payment amount was {$bookingPayment->amount}, the payment reference is: {$transaction->payment_reference}"); - } - - $refund = $bookingPayment->transactions()->refunds()->where('amount', $transaction->amount)->where('status', ApprovalStatus::APPROVED)->first(); - - $bookingInWhiteForm = $bookingPayment->transactions()->bills()->first(); - - if ($refund) { - Log::info("Credit note transaction id: {$transaction->id}, already created same amount of refund transaction for same booking payment transaction"); - } - - if (!$refund) { - $billNumber = $this->generatesTransactionBillNumber->execute('RFD-'); - - $object = new TransactionObject($billNumber, TransactionType::REFUND, 1, $booking->company->id, - 1, PaymentMethodType::CASH, - $transaction->amount, $isFullyRefund ? $bookingPayment->original_amount : $transaction->amount * $bookingPayment->currency_rate, 1, - $bookingPayment->original_currency_id, $bookingPayment->currency_rate, - 0, 0, null, ApprovalStatus::APPROVED, [], $bookingPayment->bill_no); + $bookingPaymentAmount = $bookingPayment->amount; + // check if the booking is fully refund + $amountDifference = bcsub($transaction->amount, $bookingPaymentAmount, 7); + + $isFullyRefund = false; + if (abs($amountDifference) < 0.01) { + $isFullyRefund = true; + // update fully refunded booking payment transaction + $bookingPayment->status = ApprovalStatus::REFUNDED; + $bookingPayment->save(); + + //expired booking + // $this->updatesBookingStatus->execute($booking, ApprovalStatus::EXPIRED); + Log::info("Credit note transaction id: {$transaction->id} is fully refunded, the refunded amount was {$transaction->amount} the payment reference is: {$transaction->payment_reference}"); + // Log::info("Credit note transaction id: {$transaction->id}, Rejected Booking Transaction Payment id: {$bookingPayment->id}, the payment amount was {$bookingPayment->amount}"); + // Log::info("Credit note transaction id: {$transaction->id}, Expired Booking id: {$booking->id}"); + } else { + Log::info("Credit note transaction id: {$transaction->id} is not fully refunded, the refunded amount was {$transaction->amount}, the payment amount was {$bookingPayment->amount}, the payment reference is: {$transaction->payment_reference}"); + } + + $refund = $bookingPayment->transactions()->refunds()->where('amount', $transaction->amount)->where('status', ApprovalStatus::APPROVED)->first(); + + $bookingInWhiteForm = $bookingPayment->transactions()->bills()->first(); + + if ($refund) { + Log::info("Credit note transaction id: {$transaction->id}, already created same amount of refund transaction for same booking payment transaction"); + } - $transaction = $this->createsTransaction->execute($bookingPayment, $object); - } - - if ($bookingInWhiteForm) { - $original_amount = $isFullyRefund ? $bookingPayment->original_amount : bcmul($transaction->amount, $bookingPayment->currency_rate, 7); - $supplier_refund_amount = bcdiv($original_amount, $bookingInWhiteForm->currency_rate, 7); - - Log::info("Credit note transaction id: {$transaction->id}, booking is in white form, white form currency rate is {$bookingInWhiteForm->currency_rate}"); - - // if ($isFullyRefund && $bookingInWhiteForm->currency_rate == 1) { - // dd ($bookingInWhiteForm->owner_id); - // } - - $refund = $bookingPayment->transactions()->supplierRefunds()->where('original_amount', $original_amount)->first(); - if (!$refund) { - $billNumber = $this->generatesTransactionBillNumber->execute('SRFD-'); - - $object = new TransactionObject($billNumber, TransactionType::SUPPLIER_REFUND, 1, $bookingInWhiteForm->issuer, + $billNumber = $this->generatesTransactionBillNumber->execute('RFD-'); + + $object = new TransactionObject($billNumber, TransactionType::REFUND, 1, $booking->company->id, 1, PaymentMethodType::CASH, - $supplier_refund_amount, $original_amount, 1, - $bookingPayment->original_currency_id, $bookingInWhiteForm->currency_rate, + $transaction->amount, $isFullyRefund ? $bookingPayment->original_amount : $transaction->amount * $bookingPayment->currency_rate, 1, + $bookingPayment->original_currency_id, $bookingPayment->currency_rate, 0, 0, null, ApprovalStatus::APPROVED, [], $bookingPayment->bill_no); $transaction = $this->createsTransaction->execute($bookingPayment, $object); } + + if ($bookingInWhiteForm) { + $original_amount = $isFullyRefund ? $bookingPayment->original_amount : bcmul($transaction->amount, $bookingPayment->currency_rate, 7); + $supplier_refund_amount = bcdiv($original_amount, $bookingInWhiteForm->currency_rate, 7); + + Log::info("Credit note transaction id: {$transaction->id}, booking is in white form, white form currency rate is {$bookingInWhiteForm->currency_rate}"); + + // if ($isFullyRefund && $bookingInWhiteForm->currency_rate == 1) { + // dd ($bookingInWhiteForm->owner_id); + // } + + $refund = $bookingPayment->transactions()->supplierRefunds()->where('original_amount', $original_amount)->first(); + + if (!$refund) { + $billNumber = $this->generatesTransactionBillNumber->execute('SRFD-'); + + $object = new TransactionObject($billNumber, TransactionType::SUPPLIER_REFUND, 1, $bookingInWhiteForm->issuer, + 1, PaymentMethodType::CASH, + $supplier_refund_amount, $original_amount, 1, + $bookingPayment->original_currency_id, $bookingInWhiteForm->currency_rate, + 0, 0, null, ApprovalStatus::APPROVED, [], $bookingPayment->bill_no); + + $transaction = $this->createsTransaction->execute($bookingPayment, $object); + } + } + } else { + // $bookingPayment = $booking->transactions()->payments()->where('status', ApprovalStatus::REFUNDED)->orderBy('id', 'DESC')->first(); + + // if ($bookingPayment) { + // Log::info("Credit note transaction id: {$transaction->id}, booking payment refunded"); + // } else { + Log::info("Credit note transaction id: {$transaction->id}, booking payment not found, the payment reference is: {$transaction->payment_reference}"); + // } } } else { Log::info("Credit note transaction id: {$transaction->id}, booking marking not found, the payment reference is: {$transaction->payment_reference}"); From efb909555e0a3edbf15eb95083a1b5a4994400e4 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Fri, 1 Mar 2024 14:28:52 +0800 Subject: [PATCH 06/13] debug payment not showing issue --- routes/web.php | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/routes/web.php b/routes/web.php index a6590c17..1fb2878f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -866,3 +866,55 @@ Route::get('/invoice/{marking}/{started_at}/{ended_at}/fix', function($marking, } ); })->name('invoice.fix.byCustomerMarking'); + +Route::get('/transfer/{marking}/payment-details', function ($marking) { + $booking = Booking::where('marking', $marking)->first(); + + $transactions = $booking->transactions()->withTrashed()->get(); + + $statusLabels = [ + 0 => 'PAYMENT_ATTEMPT', + 1 => 'PAYMENT', + 2 => 'INVOICE', + 3 => 'BILL', + 4 => 'PROFORMA', + 5 => 'TOP_UP', + 6 => 'REFUND', + 7 => 'PURCHASE_ORDER', + 8 => 'SUPPLIER_DELIVER', + 9 => 'CREDIT_NOTE', + 10 => 'WITHDRAW', + 11 => 'DEBIT_NOTE', + 12 => 'TRANSFER_FEE', + 13 => 'CASH_BACK', + ]; + + $ApprovalStatus = ApprovalStatus::APPROVAL_STATUS_ID; + + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + foreach ($transactions as $transaction) { + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + + echo ''; + echo '
IDAmountTypeStatusCreated AtDeleted At
' . $transaction->id . '' . $transaction->amount . '' . $statusLabels[$transaction->type] . '' . $ApprovalStatus [$transaction->status] . '' . $transaction->created_at . '' . $transaction->deleted_at . '
'; +}); From 5cf55453fd690186aa03413add24a54d38805a3e Mon Sep 17 00:00:00 2001 From: edmondlang Date: Fri, 1 Mar 2024 21:57:06 +0800 Subject: [PATCH 07/13] show-booking-expired for debug payment not showing --- app/Console/Kernel.php | 12 ++++---- routes/web.php | 70 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 5e9aa8a8..d1f54f52 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -44,13 +44,13 @@ class Kernel extends ConsoleKernel ->appendOutputTo(storage_path().'/logs/delete-bulk-download-files.log') ->withoutOverlapping(); - $schedule->command('booking:expired') - ->dailyAt('02:00') - ->withoutOverlapping(); + // $schedule->command('booking:expired') + // ->dailyAt('02:00') + // ->withoutOverlapping(); - $schedule->command('purchaseOrder:autoFill') - ->dailyAt('03:00') - ->withoutOverlapping(); + // $schedule->command('purchaseOrder:autoFill') + // ->dailyAt('03:00') + // ->withoutOverlapping(); } /** diff --git a/routes/web.php b/routes/web.php index 1fb2878f..44380046 100644 --- a/routes/web.php +++ b/routes/web.php @@ -872,6 +872,8 @@ Route::get('/transfer/{marking}/payment-details', function ($marking) { $transactions = $booking->transactions()->withTrashed()->get(); + $paymentMethods = PaymentMethodType::PAYMENT_METHODS_ID; + $statusLabels = [ 0 => 'PAYMENT_ATTEMPT', 1 => 'PAYMENT', @@ -898,6 +900,7 @@ Route::get('/transfer/{marking}/payment-details', function ($marking) { echo 'Amount'; echo 'Type'; echo 'Status'; + echo 'Payment Method'; echo 'Created At'; echo 'Deleted At'; echo ''; @@ -910,6 +913,7 @@ Route::get('/transfer/{marking}/payment-details', function ($marking) { echo '' . $transaction->amount . ''; echo '' . $statusLabels[$transaction->type] . ''; echo '' . $ApprovalStatus [$transaction->status] . ''; + echo '' . $paymentMethods [$transaction->payment_method] . ''; echo '' . $transaction->created_at . ''; echo '' . $transaction->deleted_at . ''; echo ''; @@ -917,4 +921,70 @@ Route::get('/transfer/{marking}/payment-details', function ($marking) { echo ''; echo ''; + + echo '
'; + echo 'Wallet Details'; + +})->name('booking.details.transactions'); + +Route::get('show-booking-expired', function () { + $transactions = Transaction::where('type', TransactionType::PAYMENT) + ->where('status', ApprovalStatus::EXPIRED) + ->whereDate('updated_at', '>=', '2024-02-16') + ->orderBy('updated_at', 'desc') + ->get(); + // print_r(count($transactions)); + + + $statusLabels = [ + 0 => 'PAYMENT_ATTEMPT', + 1 => 'PAYMENT', + 2 => 'INVOICE', + 3 => 'BILL', + 4 => 'PROFORMA', + 5 => 'TOP_UP', + 6 => 'REFUND', + 7 => 'PURCHASE_ORDER', + 8 => 'SUPPLIER_DELIVER', + 9 => 'CREDIT_NOTE', + 10 => 'WITHDRAW', + 11 => 'DEBIT_NOTE', + 12 => 'TRANSFER_FEE', + 13 => 'CASH_BACK', + ]; + + $ApprovalStatus = ApprovalStatus::APPROVAL_STATUS_ID; + + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + $counter = 1; + + foreach ($transactions as $transaction) { + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + + echo ''; + echo '
CounterIDBookingPaymentsAmountTypeStatusUpdated At
' . $counter++ . '' . $transaction->id . '' . ''.$transaction->owner->marking.'' . '' . 'Payments' . '' . $transaction->amount . '' . $statusLabels[$transaction->type] . '' . $ApprovalStatus [$transaction->status] . '' . $transaction->updated_at . '
'; }); From dfc2ddd09b8809b5db806139d92e4ddc333c2f6f Mon Sep 17 00:00:00 2001 From: edmondlang Date: Fri, 1 Mar 2024 22:49:14 +0800 Subject: [PATCH 08/13] debug payment not showing issue --- routes/web.php | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/routes/web.php b/routes/web.php index 44380046..ddc5ae7e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -922,8 +922,10 @@ Route::get('/transfer/{marking}/payment-details', function ($marking) { echo ''; echo ''; - echo '
'; - echo 'Wallet Details'; + echo '
----------------------------------------------------------------
'; + + echo 'Wallet Details'; + })->name('booking.details.transactions'); @@ -931,6 +933,7 @@ Route::get('show-booking-expired', function () { $transactions = Transaction::where('type', TransactionType::PAYMENT) ->where('status', ApprovalStatus::EXPIRED) ->whereDate('updated_at', '>=', '2024-02-16') + ->take(10) ->orderBy('updated_at', 'desc') ->get(); // print_r(count($transactions)); @@ -954,6 +957,8 @@ Route::get('show-booking-expired', function () { ]; $ApprovalStatus = ApprovalStatus::APPROVAL_STATUS_ID; + + $paymentMethods = PaymentMethodType::PAYMENT_METHODS_ID; echo ''; echo ''; @@ -965,6 +970,8 @@ Route::get('show-booking-expired', function () { echo ''; echo ''; echo ''; + echo ''; + echo ''; echo ''; echo ''; echo ''; @@ -973,6 +980,23 @@ Route::get('show-booking-expired', function () { $counter = 1; foreach ($transactions as $transaction) { + + $billplz_status = null; + + if ($transaction->payment_method == PaymentMethodType::PAYMENT_GATEWAY) { + $response = Http::withBasicAuth(config('billplz.api_key') . ':', '')->get(config('billplz.base_url') . '/api/v3/bills/' . $transaction->payment_reference); + if ($response->successful()) { + $data = $response->json(); + if ($data['paid']) { + $billplz_status = 'Paid'; + } else { + $billplz_status = $transaction->id . " => Fraud"; + } + } else { + $billplz_status = $transaction->id . " => billplz error"; + } + } + echo ''; echo ''; echo ''; @@ -981,6 +1005,8 @@ Route::get('show-booking-expired', function () { echo ''; echo ''; echo ''; + echo ''; + echo ''; echo ''; echo ''; } From b2dd34106ccfea281d1bad2a6fde0e4a2a266a57 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Fri, 1 Mar 2024 22:51:56 +0800 Subject: [PATCH 09/13] debug payment not showing issue --- routes/web.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/routes/web.php b/routes/web.php index ddc5ae7e..bc6730f5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -973,6 +973,7 @@ Route::get('show-booking-expired', function () { echo ''; echo ''; echo ''; + echo ''; echo ''; echo ''; echo ''; @@ -1008,6 +1009,7 @@ Route::get('show-booking-expired', function () { echo ''; echo ''; echo ''; + echo ''; echo ''; } From 42a399999a8edb965da5b5686467ea116f45bf4c Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Fri, 1 Mar 2024 23:28:14 +0800 Subject: [PATCH 10/13] uncomment and log to specific file for booking expired command --- app/Console/Commands/ExpiredBookingCommand.php | 8 ++++---- app/Console/Kernel.php | 7 ++++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/Console/Commands/ExpiredBookingCommand.php b/app/Console/Commands/ExpiredBookingCommand.php index 5779a9e9..2be39c15 100644 --- a/app/Console/Commands/ExpiredBookingCommand.php +++ b/app/Console/Commands/ExpiredBookingCommand.php @@ -62,14 +62,14 @@ class ExpiredBookingCommand extends Command foreach ($bookings as $booking) { $this->updatesBookingStatus->execute($booking, ApprovalStatus::EXPIRED); - Log::info("Expired Booking without payment & purchase order, booking id: " . $booking->id); + $this->info("Expired Booking without payment & purchase order, booking id: " . $booking->id); $transactions = $booking->transactions; foreach ($transactions as $transaction) { $prevStatus = $transaction->status; $transaction->status = ApprovalStatus::EXPIRED; $transaction->save(); - Log::info("Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}. Status before update: {$prevStatus}"); + $this->info("Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}. Status before update: {$prevStatus}"); } } @@ -86,14 +86,14 @@ class ExpiredBookingCommand extends Command foreach ($bookings as $booking) { $this->updatesBookingStatus->execute($booking, ApprovalStatus::EXPIRED); - Log::info("Expired Booking without payment but with purchase order, booking id: " . $booking->id); + $this->info("Expired Booking without payment but with purchase order, booking id: " . $booking->id); $transactions = $booking->transactions; foreach ($transactions as $transaction) { $prevStatus = $transaction->status; $transaction->status = ApprovalStatus::EXPIRED; $transaction->save(); - Log::info("Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}. Status before update: {$prevStatus}"); + $this->info("Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}. Status before update: {$prevStatus}"); } } } diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index d1f54f52..e455eea1 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -44,9 +44,10 @@ class Kernel extends ConsoleKernel ->appendOutputTo(storage_path().'/logs/delete-bulk-download-files.log') ->withoutOverlapping(); - // $schedule->command('booking:expired') - // ->dailyAt('02:00') - // ->withoutOverlapping(); + $schedule->command('booking:expired') + ->dailyAt('02:00') + ->appendOutputTo(storage_path().'/logs/expire-booking.log') + ->withoutOverlapping(); // $schedule->command('purchaseOrder:autoFill') // ->dailyAt('03:00') From 8b22b49937d5b66d1d6cf0c1b39f838e97c4e7a4 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Sat, 2 Mar 2024 00:25:00 +0800 Subject: [PATCH 11/13] remove testing code --- routes/web.php | 150 ------------------------------------------------- 1 file changed, 150 deletions(-) diff --git a/routes/web.php b/routes/web.php index bc6730f5..a6590c17 100644 --- a/routes/web.php +++ b/routes/web.php @@ -866,153 +866,3 @@ Route::get('/invoice/{marking}/{started_at}/{ended_at}/fix', function($marking, } ); })->name('invoice.fix.byCustomerMarking'); - -Route::get('/transfer/{marking}/payment-details', function ($marking) { - $booking = Booking::where('marking', $marking)->first(); - - $transactions = $booking->transactions()->withTrashed()->get(); - - $paymentMethods = PaymentMethodType::PAYMENT_METHODS_ID; - - $statusLabels = [ - 0 => 'PAYMENT_ATTEMPT', - 1 => 'PAYMENT', - 2 => 'INVOICE', - 3 => 'BILL', - 4 => 'PROFORMA', - 5 => 'TOP_UP', - 6 => 'REFUND', - 7 => 'PURCHASE_ORDER', - 8 => 'SUPPLIER_DELIVER', - 9 => 'CREDIT_NOTE', - 10 => 'WITHDRAW', - 11 => 'DEBIT_NOTE', - 12 => 'TRANSFER_FEE', - 13 => 'CASH_BACK', - ]; - - $ApprovalStatus = ApprovalStatus::APPROVAL_STATUS_ID; - - echo '
AmountTypeStatusPayment MethodBillPlz ResponseUpdated At
' . $counter++ . '' . $transaction->id . '' . $transaction->amount . '' . $statusLabels[$transaction->type] . '' . $ApprovalStatus [$transaction->status] . '' . $paymentMethods [$transaction->payment_method] . '' . $billplz_status . '' . $transaction->updated_at . '
Payment MethodBillPlz ResponseUpdated AtCreated At
' . $paymentMethods [$transaction->payment_method] . '' . $billplz_status . '' . $transaction->updated_at . '' . $transaction->created_at . '
'; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - - foreach ($transactions as $transaction) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - - echo ''; - echo '
IDAmountTypeStatusPayment MethodCreated AtDeleted At
' . $transaction->id . '' . $transaction->amount . '' . $statusLabels[$transaction->type] . '' . $ApprovalStatus [$transaction->status] . '' . $paymentMethods [$transaction->payment_method] . '' . $transaction->created_at . '' . $transaction->deleted_at . '
'; - - echo '
----------------------------------------------------------------
'; - - echo 'Wallet Details'; - - -})->name('booking.details.transactions'); - -Route::get('show-booking-expired', function () { - $transactions = Transaction::where('type', TransactionType::PAYMENT) - ->where('status', ApprovalStatus::EXPIRED) - ->whereDate('updated_at', '>=', '2024-02-16') - ->take(10) - ->orderBy('updated_at', 'desc') - ->get(); - // print_r(count($transactions)); - - - $statusLabels = [ - 0 => 'PAYMENT_ATTEMPT', - 1 => 'PAYMENT', - 2 => 'INVOICE', - 3 => 'BILL', - 4 => 'PROFORMA', - 5 => 'TOP_UP', - 6 => 'REFUND', - 7 => 'PURCHASE_ORDER', - 8 => 'SUPPLIER_DELIVER', - 9 => 'CREDIT_NOTE', - 10 => 'WITHDRAW', - 11 => 'DEBIT_NOTE', - 12 => 'TRANSFER_FEE', - 13 => 'CASH_BACK', - ]; - - $ApprovalStatus = ApprovalStatus::APPROVAL_STATUS_ID; - - $paymentMethods = PaymentMethodType::PAYMENT_METHODS_ID; - - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - - $counter = 1; - - foreach ($transactions as $transaction) { - - $billplz_status = null; - - if ($transaction->payment_method == PaymentMethodType::PAYMENT_GATEWAY) { - $response = Http::withBasicAuth(config('billplz.api_key') . ':', '')->get(config('billplz.base_url') . '/api/v3/bills/' . $transaction->payment_reference); - if ($response->successful()) { - $data = $response->json(); - if ($data['paid']) { - $billplz_status = 'Paid'; - } else { - $billplz_status = $transaction->id . " => Fraud"; - } - } else { - $billplz_status = $transaction->id . " => billplz error"; - } - } - - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - - echo ''; - echo '
CounterIDBookingPaymentsAmountTypeStatusPayment MethodBillPlz ResponseUpdated AtCreated At
' . $counter++ . '' . $transaction->id . '' . ''.$transaction->owner->marking.'' . '' . 'Payments' . '' . $transaction->amount . '' . $statusLabels[$transaction->type] . '' . $ApprovalStatus [$transaction->status] . '' . $paymentMethods [$transaction->payment_method] . '' . $billplz_status . '' . $transaction->updated_at . '' . $transaction->created_at . '
'; -}); From 2d5bbac3b1f5d21889f3a7846ae33e7f4b32a010 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Sat, 2 Mar 2024 00:32:55 +0800 Subject: [PATCH 12/13] update ExpiredBookingCommand logging - add timestamp --- app/Console/Commands/ExpiredBookingCommand.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Console/Commands/ExpiredBookingCommand.php b/app/Console/Commands/ExpiredBookingCommand.php index 2be39c15..fe4f260e 100644 --- a/app/Console/Commands/ExpiredBookingCommand.php +++ b/app/Console/Commands/ExpiredBookingCommand.php @@ -62,14 +62,14 @@ class ExpiredBookingCommand extends Command foreach ($bookings as $booking) { $this->updatesBookingStatus->execute($booking, ApprovalStatus::EXPIRED); - $this->info("Expired Booking without payment & purchase order, booking id: " . $booking->id); + $this->info(Carbon::now() . " : Expired Booking without payment & purchase order, booking id: " . $booking->id); $transactions = $booking->transactions; foreach ($transactions as $transaction) { $prevStatus = $transaction->status; $transaction->status = ApprovalStatus::EXPIRED; $transaction->save(); - $this->info("Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}. Status before update: {$prevStatus}"); + $this->info(Carbon::now() . " : Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}. Status before update: {$prevStatus}"); } } @@ -86,14 +86,14 @@ class ExpiredBookingCommand extends Command foreach ($bookings as $booking) { $this->updatesBookingStatus->execute($booking, ApprovalStatus::EXPIRED); - $this->info("Expired Booking without payment but with purchase order, booking id: " . $booking->id); + $this->info(Carbon::now() . " : Expired Booking without payment but with purchase order, booking id: " . $booking->id); $transactions = $booking->transactions; foreach ($transactions as $transaction) { $prevStatus = $transaction->status; $transaction->status = ApprovalStatus::EXPIRED; $transaction->save(); - $this->info("Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}. Status before update: {$prevStatus}"); + $this->info(Carbon::now() . " : Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}. Status before update: {$prevStatus}"); } } } From 73819e967e34f00996b8a069e06010d71439dbd5 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Wed, 6 Mar 2024 20:56:24 +0800 Subject: [PATCH 13/13] open partial refund, categorize refunds section in dashboard --- .../Eloquent/Filters/IsPartialRefund.php | 26 ++++++++ .../OwnerDoesNotHaveTransactionType.php | 24 ++++++++ .../Filters/OwnerHasTransactionType.php | 24 ++++++++ .../elements/RefundConfirmationComponent.vue | 10 ++- .../views/pages/dashboards/admin.blade.php | 61 ++++++++++++++++++- 5 files changed, 137 insertions(+), 8 deletions(-) create mode 100644 app/Classes/General/Eloquent/Filters/IsPartialRefund.php create mode 100644 app/Classes/General/Eloquent/Filters/OwnerDoesNotHaveTransactionType.php create mode 100644 app/Classes/General/Eloquent/Filters/OwnerHasTransactionType.php diff --git a/app/Classes/General/Eloquent/Filters/IsPartialRefund.php b/app/Classes/General/Eloquent/Filters/IsPartialRefund.php new file mode 100644 index 00000000..1378a94c --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/IsPartialRefund.php @@ -0,0 +1,26 @@ +whereHas('owner', function ($q) use ($value) { + if ($value) { + $q->where('original_amount', '!=', DB::raw('transactions.original_amount')); + } else { + $q->where('original_amount', DB::raw('transactions.original_amount')); + } + }); + } +} diff --git a/app/Classes/General/Eloquent/Filters/OwnerDoesNotHaveTransactionType.php b/app/Classes/General/Eloquent/Filters/OwnerDoesNotHaveTransactionType.php new file mode 100644 index 00000000..4dcd401c --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/OwnerDoesNotHaveTransactionType.php @@ -0,0 +1,24 @@ +whereDoesntHave('owner', function($query) use($value) { + return $query->whereHas('transactions', function($query) use($value) { + return $query->where('transactions.type', $value); + }); + }); + } +} diff --git a/app/Classes/General/Eloquent/Filters/OwnerHasTransactionType.php b/app/Classes/General/Eloquent/Filters/OwnerHasTransactionType.php new file mode 100644 index 00000000..7f96643f --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/OwnerHasTransactionType.php @@ -0,0 +1,24 @@ +whereHas('owner', function($query) use($value) { + return $query->whereHas('transactions', function($query) use($value) { + return $query->where('transactions.type', $value); + }); + }); + } +} diff --git a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue index 75253aaa..c87122a5 100644 --- a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue +++ b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue @@ -38,6 +38,7 @@
Paid Amount: {{ paidAmount }}
+
Paid Amount: {{ (Math.round((this.data.refunded_amount + Number.EPSILON) * 100) / 100).toFixed(2) }}
Refund Amount: {{ refundAmount }}
@@ -69,10 +70,11 @@ export default { }, data() { return { + refundAmount: (Math.round((this.data.original_amount - this.data.refunded_amount + Number.EPSILON) * 100) / 100).toFixed(2), refundMethod: { name: 'Fully Refund', status: false }, refundMethods: [ { name: 'Fully Refund', label: 'Full Refund' }, - // { name: 'Partially Refund', label: 'Partial Refund' } + { name: 'Partially Refund', label: 'Partial Refund' } ] } }, @@ -84,12 +86,8 @@ export default { } }, computed: { - refundAmount() { - // return (Math.round((this.data.booking.amount - this.totalRefunds + Number.EPSILON) * 100) / 100).toFixed(2); - return (Math.round((this.data.original_amount - this.data.refunded_amount + Number.EPSILON) * 100) / 100).toFixed(2); - }, refundMaxValue() { - return this.refundAmount; + return (Math.round((this.data.original_amount - this.data.refunded_amount + Number.EPSILON) * 100) / 100).toFixed(2); }, paidAmount() { return this.data.original_amount; diff --git a/resources/views/pages/dashboards/admin.blade.php b/resources/views/pages/dashboards/admin.blade.php index d7223cc0..7ccdb219 100644 --- a/resources/views/pages/dashboards/admin.blade.php +++ b/resources/views/pages/dashboards/admin.blade.php @@ -81,11 +81,68 @@
+
+
+ Pre-Refund +
+
+
+
+ Fully Refund +
+
- + + +
+
+
+
+ Partial Refund +
+
+
+
+ + + +
+
+
+
+ Post-Refund +
+
+
+
+ Fully Refund +
+
+
+
+ + + +
+
+
+
+ Partial Refund +
+
+
+
+ +