-complete supplier bill group when oustanding is 0

-create refund and supplier refund if the request refund order is in white form
This commit is contained in:
JiaSheng
2024-02-28 01:34:39 +08:00
parent 8d84c970e2
commit 5fd2f6ef7f
9 changed files with 58 additions and 25 deletions
@@ -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));
}
@@ -77,12 +77,17 @@ 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 .'.');
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));
}
@@ -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);
@@ -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,
];
}
}
@@ -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-');
@@ -96,11 +96,16 @@
</div>
</div>
</div>
<div class="row m-t-20">
<div class="row m-t-20" v-if="selectedBillGroup.outstanding_amount > 0">
<div class="col">
<button id="payment-btn" class="btn btn-sm all-caps b-rad-none btn-success btn-block" @click="submitForm">Make Payment</button>
</div>
</div>
<div class="row m-t-20" v-if="(selectedBillGroup.bill_refund_amount === selectedBillGroup.amount)">
<div class="col">
<button id="payment-btn" class="btn btn-sm all-caps b-rad-none btn-success btn-block" @click="submitForm">Complete Order</button>
</div>
</div>
</div>
</div>
</div>
@@ -292,7 +292,7 @@
</div>
</div>
<div class="row m-t-10" v-show="[2, 3].includes(item.status) && (totalRequestedRefund + totalRefunds) < data.original_amount">
<div class="col" v-if="!item.transaction_bill && $store.getters.isAdmin">
<div class="col" v-if="$store.getters.isAdmin">
<button class="btn btn-xs all-caps b-rad-none bg-master-lighter btn-block no-border requestModal" data-type="transferSummary">Request Refund</button>
<modal-component class="animate__animated animate__fast animate__fadeIn" styleType="fill-in" type="transferSummary" size="large">
<refund-confirmation-component :data="data" :section="section" :totalRefunds="totalRequestedRefund + totalRefunds"></refund-confirmation-component>
@@ -54,6 +54,10 @@
type: Number,
required: true
},
inputPaymentTotal: {
type: Number,
required: true
},
refundTotal: {
type: Number,
required: true
@@ -65,8 +69,12 @@
},
computed: {
clickable(){
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(){
return {
@@ -110,7 +110,7 @@
</div>
<list-component :key="supplierRefundListKey" section="supplierRefundListSection" :options="{'per_page': 20, 'type': 15, 'status': 2, 'belongs_to_supplier_id': this.supplier.id}" :endpoint="route('api.transaction.list')">
<template slot="list" slot-scope="{data}">
<supplier-refund-component section="supplierRefundListSection" :data="data" :is1688Supplier="is1688Supplier" :payments="payments" :supplierRefunds="supplierRefunds" :refundTotal="refundTotal" :paymentTotal="paymentTotal" v-on:input="refundOrder($event)"></supplier-refund-component>
<supplier-refund-component section="supplierRefundListSection" :data="data" :is1688Supplier="is1688Supplier" :payments="payments" :supplierRefunds="supplierRefunds" :refundTotal="refundTotal" :paymentTotal="paymentTotal" :inputPaymentTotal="inputPaymentTotal" v-on:input="refundOrder($event)"></supplier-refund-component>
</template>
</list-component>
</div>