diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php index f29db055..8e16233b 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php @@ -16,10 +16,12 @@ use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; use App\Classes\Modules\Transactions\Services\FetchesGroup; use App\Classes\Modules\Transactions\Services\UpdatesTransaction; use App\Classes\Modules\Transactions\Services\CalculatesTransactionTransferFee; +use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; use App\Classes\ValueObjects\Constants\TransactionType; use App\Classes\ValueObjects\Constants\PaymentMethodType; use App\Classes\ValueObjects\Constants\SegmentConstants; use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Models\Transaction; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use ErrorException; @@ -60,6 +62,9 @@ class UpdateGroupLogic extends AbstractControllerLogic /** @var CreatesFiles */ private $createsFile; + /** @var GeneratesTransactionBillNumber */ + private $generatesTransactionBillNumber; + /** * UpdateGroupLogic constructor. * @param FetchesGroup $fetchesGroup @@ -69,8 +74,9 @@ class UpdateGroupLogic extends AbstractControllerLogic * @param CalculatesTransactionTransferFee $calculatesTransactionTransferFee * @param CreatesDocument $createsDocument * @param CreatesFiles $createsFile + * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber */ - public function __construct(FetchesGroup $fetchesGroup, FetchesCompany $fetchesCompany, CalculatesTransactionServiceCharge $calculatesTransactionServiceCharge, UpdatesTransaction $updatesTransaction, CalculatesTransactionTransferFee $calculatesTransactionTransferFee, CreatesDocument $createsDocument, CreatesFiles $createsFile) + public function __construct(FetchesGroup $fetchesGroup, FetchesCompany $fetchesCompany, CalculatesTransactionServiceCharge $calculatesTransactionServiceCharge, UpdatesTransaction $updatesTransaction, CalculatesTransactionTransferFee $calculatesTransactionTransferFee, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber) { $this->fetchesGroup = $fetchesGroup; $this->fetchesCompany = $fetchesCompany; @@ -79,6 +85,7 @@ class UpdateGroupLogic extends AbstractControllerLogic $this->calculatesTransactionTransferFee = $calculatesTransactionTransferFee; $this->createsDocument = $createsDocument; $this->createsFile = $createsFile; + $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; } /** @@ -162,8 +169,61 @@ class UpdateGroupLogic extends AbstractControllerLogic $this->updatesTransaction->execute($transferTransaction, $object); } + // group transfer fee from supplier currency order dashboard manual input + if ($request->input('group_transfer_fee')) { + $fee = $request->input('group_transfer_fee'); + + $group_transfer_fee = $group->morphTransactions()->where('type', TransactionType::TRANSFER_FEE)->first(); + + if ($group_transfer_fee) { + $group_transfer_fee->amount = $fee; + $group_transfer_fee->original_amount = $fee; + $group_transfer_fee->save(); + } else { + $transferFeeNumber = $this->generatesTransactionBillNumber->execute('TRFR-'); + $object = new TransactionObject($transferFeeNumber, TransactionType::TRANSFER_FEE, 1, $supplier->id, + $supplier->banks()->where('default', true)->first()->id, PaymentMethodType::CASH, + $fee, $fee, $group->original_currency_id, $group->original_currency_id, + 1, 0, 0, null, ApprovalStatus::APPROVED); + + $model = new Transaction(); + $model->bill_no = $object->getBillNo(); + $model->type = $object->getTransactionType(); + $model->issuer = $object->getIssuer(); + $model->receiver = $object->getReceiver(); + $model->recipient_bank_account_id = $object->getRecipientBankAccountId(); + $model->payment_method = $object->getPaymentMethod(); + $model->amount = $object->getAmount(); + $model->original_amount = $object->getOriginalAmount(); + $model->currency_id = $object->getCurrencyId(); + $model->original_currency_id = $object->getOriginalCurrencyId(); + $model->currency_rate = $object->getCurrencyRate(); + $model->tax = $object->getTax(); + $model->service_charge = $object->getServiceCharge(); + $model->expires_on = $object->getExpiresOn(); + $model->status = $object->getStatus(); + $model->payment_reference = $object->getPaymentReference(); + + $group->morphTransactions()->save($model); + } + } + + $group_transfer_fee = $group->morphTransactions()->where('type', TransactionType::TRANSFER_FEE)->first(); + + $group_transfer_fee_original_amount = 0; + + if ($group_transfer_fee) { + $group_transfer_fee_original_amount = $group_transfer_fee->original_amount; + } + + $transferFeeTransactions = $group->transactions()->with([ + 'transactions' => function ($transaction) { + return $transaction->where('type', TransactionType::TRANSFER_FEE); + }])->get()->pluck('transactions')->flatten(); + $group->issuer = $supplier->id; - $group->amount = $group->transactions()->sum('amount'); + $group->original_amount = $group->transactions()->sum('original_amount') + ((float)$transferFeeTransactions->sum('service_charge') + (float)$group_transfer_fee_original_amount); + $group->amount = $group->transactions()->sum('amount') + (((float)$transferFeeTransactions->sum('service_charge') + (float)$group_transfer_fee_original_amount) / $rate); $group->currency_rate = $rate; $group->tax = $group->transactions()->sum('tax'); $group->service_charge = $group->transactions()->sum('service_charge'); @@ -172,12 +232,7 @@ class UpdateGroupLogic extends AbstractControllerLogic $group->documents()->delete(); - $transferFeeTransactions = $group->transactions()->with([ - 'transactions' => function ($transaction) { - return $transaction->where('type', TransactionType::TRANSFER_FEE); - }])->get()->pluck('transactions')->flatten(); - - $pdf = LaravelMpdf::loadView('pages.pdfs.currency_vendor_order', ['transactions' => $group->transactions, 'transferFeeTransactions' => $transferFeeTransactions, 'supplier' => $supplier]); + $pdf = LaravelMpdf::loadView('pages.pdfs.currency_vendor_order', ['transactions' => $group->transactions, 'transferFeeTransactions' => $transferFeeTransactions, 'supplier' => $supplier, 'groupTransferFeeOriginalAmount' => $group_transfer_fee_original_amount]); $object = new DocumentObject( DocumentType::CURRENCY_VENDOR_ORDER, diff --git a/app/Console/Commands/UpdateBillGroupAndGroupToIncludeTransferFee.php b/app/Console/Commands/UpdateBillGroupAndGroupToIncludeTransferFee.php new file mode 100644 index 00000000..3712f8a7 --- /dev/null +++ b/app/Console/Commands/UpdateBillGroupAndGroupToIncludeTransferFee.php @@ -0,0 +1,145 @@ +updateGroupLogic = $updateGroupLogic; + } + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + + // update group to include transfer fee + $groups = Group::all(); + + foreach ($groups as $group) { + $originalTransferFees = (float)Transaction::where('type', TransactionType::TRANSFER_FEE)->whereIn('owner_id', $group->transactions->pluck('id'))->sum('service_charge'); + $correctOriginalAmount = $group->transactions()->sum('original_amount'); + $correctOriginalAmount += $originalTransferFees; + $correctAmount = $group->transactions()->sum('amount'); + $transferFees = $originalTransferFees / $group->currency_rate; + $correctAmount += $transferFees; + + if ($group->original_amount != $correctOriginalAmount || $group->amount != $correctAmount) { + $group->original_amount = $correctOriginalAmount; + $group->amount = $correctAmount; + $group->save(); + + $this->info("updated group id: {$group->id}, added transfer fee CNY {$correctOriginalAmount}"); + } + } + + // update group calculation to include individual group transfer fee + $groups = Group::whereHas('morphTransactions', function ($q) { + $q->where('type', TransactionType::TRANSFER_FEE); + })->get(); + + foreach ($groups as $group) { + $route = FacadesRoute::getRoutes()->getByName('api.transaction.group.update'); + $request = Request::create(route('api.transaction.group.update', $group->id)); + $uri = $route->uri; + $request->setRouteResolver(function () use ($request, $uri) { + // Associate Route to request so we can access route parameters. + return (new Route('PUT', $uri, []))->bind($request); + }); + + $request['rate'] = $group->currency_rate; + $request['supplier_id'] = $group->issuer; + $this->updateGroupLogic->execute($request); + + $group_transfer_fee = $group->morphTransactions()->where('type', TransactionType::TRANSFER_FEE)->first(); + $this->info("updated group id: {$group->id}, added transfer fee to individual white form CNY {$group_transfer_fee->original_amount}"); + } + + // update bill group calculation to include individual group transfer fee + $billGroups = BillGroup::all(); + + foreach ($billGroups as $billGroup) { + // ignore those has bill group refund + if ($billGroup->billRefunds()->count() > 0) { + continue; + } + + // get the groups + $payments = $billGroup->groups; + + $totalOriginalTransferFee = 0; + $totalTransferFee = 0; + // for each group + foreach ($payments as $group) { + $group_transfer_fee = $group->morphTransactions()->where('type', TransactionType::TRANSFER_FEE)->first(); + + if ($group_transfer_fee) { + $totalOriginalTransferFee += $group_transfer_fee->original_amount; + $totalTransferFee = $totalTransferFee + ($group_transfer_fee->original_amount / $group->currency_rate); + } + } + + $totalOriginal = $billGroup->original_amount + $totalOriginalTransferFee; + $total = $billGroup->amount + $totalTransferFee; + + // update bill group payment transaction amount if there is only 1 payment transaction + $payment_transactions = $billGroup->transactions()->whereIn('status', [ApprovalStatus::PENDING_SUBMISSION, ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->get(); + + if ($payment_transactions->count() === 1) { + $payment_transaction = $payment_transactions->first(); + if ($payment_transaction->amount === $billGroup->amount) { + $payment_transaction->original_amount = $total; + $payment_transaction->amount = $total; + $payment_transaction->save(); + $this->info("updated bill group payment transaction id: {$payment_transaction->id}, update original amount to CNY {$totalOriginal}"); + } + } + + // update bill group amount and original amount + $billGroup->original_amount = $totalOriginal; + $billGroup->amount = $total; + $billGroup->save(); + + $this->info("updated bill group id: {$billGroup->id}, added transfer fee, final original amount is CNY {$totalOriginal}"); + } + } +} diff --git a/app/Console/Commands/UpdateGroupWithTransferFee.php b/app/Console/Commands/UpdateGroupWithTransferFee.php deleted file mode 100644 index dec74d5c..00000000 --- a/app/Console/Commands/UpdateGroupWithTransferFee.php +++ /dev/null @@ -1,68 +0,0 @@ -get(); - - foreach ($groups as $group) { - $originalTransferFees = (float)Transaction::where('type', TransactionType::TRANSFER_FEE)->whereIn('owner_id', $group->transactions->pluck('id'))->sum('service_charge'); - $correctOriginalAmount = $group->transactions()->sum('original_amount'); - $correctOriginalAmount += $originalTransferFees; - $correctAmount = $group->transactions()->sum('amount'); - $transferFees = $originalTransferFees / $group->currency_rate; - $correctAmount += $transferFees; - - if ($group->original_amount != $correctOriginalAmount) { - $group->original_amount = $correctOriginalAmount; - $group->amount = $correctAmount; - $group->save(); - } - } - } -} diff --git a/resources/assets/vue/components/bookings/elements/EditTransferFeeFormComponent.vue b/resources/assets/vue/components/bookings/elements/EditTransferFeeFormComponent.vue index bb82964a..5c46d594 100644 --- a/resources/assets/vue/components/bookings/elements/EditTransferFeeFormComponent.vue +++ b/resources/assets/vue/components/bookings/elements/EditTransferFeeFormComponent.vue @@ -15,9 +15,9 @@
- + - +
@@ -54,24 +54,34 @@ id: { type: Number, required: true - } + }, + rate:{ + type: Number, + required: true + }, + supplier_id: { + type: Number, + required: true + }, }, data(){ return { error: '', parameters: { - fee: (Math.round((this.transfer_fee + Number.EPSILON) * 100) / 100).toFixed(2) + supplier_id: this.supplier_id, + rate: this.rate, + group_transfer_fee: (Math.round((this.transfer_fee + Number.EPSILON) * 100) / 100).toFixed(2) }, } }, validations: { parameters: { - fee: { }, + group_transfer_fee: { }, }, }, methods: { submitForm() { - this.submit(route('api.transaction.group.fee.update', this.id), 'put', this.section, true, true); + this.submit(route('api.transaction.group.update', this.id), 'put', this.section, true, true); } }, mixins: [ModalFormHandler] diff --git a/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue b/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue index 2696ceb5..2700de72 100644 --- a/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue +++ b/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue @@ -2,7 +2,7 @@
-
+
@@ -87,9 +87,12 @@ - - - +
+ + + +
+
@@ -123,20 +126,33 @@ payments:{ type: Array, required: true - } + }, + emptyPaymentList: { + type: Function, + required: true + }, }, data(){ return { expanded: false, - active: this.item ? this.payments.some(payment => payment.id === this.item.id) : false, + // active: this.item ? this.payments.some(payment => payment.id === this.item.id) : false, } }, created(){ - this.active = this.payments.some(payment => payment.id === this.item.id); + // this.active = this.payments.some(payment => payment.id === this.item.id); + }, + computed: { + active() { + return this.payments.some(payment => payment.id === this.item.id); + } }, methods: { - activate(){ - this.active = !this.active; + activate(event){ + if ((event.target.tagName.toLowerCase() === 'button' && event.target.getAttribute('data-type') === 'editTransactionGroup') || Boolean(event.target.closest('.do-not-activate'))) { + this.emptyPaymentList(); + return; + } + // this.active = !this.active; this.$emit('input', this.item) }, expand(event){ diff --git a/resources/assets/vue/components/bookings/sections/SupplierPendingOrderPaymentSectionComponent.vue b/resources/assets/vue/components/bookings/sections/SupplierPendingOrderPaymentSectionComponent.vue index eba9fde5..0849bd31 100644 --- a/resources/assets/vue/components/bookings/sections/SupplierPendingOrderPaymentSectionComponent.vue +++ b/resources/assets/vue/components/bookings/sections/SupplierPendingOrderPaymentSectionComponent.vue @@ -48,7 +48,7 @@
@@ -103,6 +103,9 @@ this.selectedSupplier.status = false; this.payments = []; }, + emptyPaymentList() { + this.payments = []; + }, updateOrder(payment){ this.payments.some(item => item.id === payment.id) ? this.payments = this.payments.filter(item => item.id !== payment.id) : this.payments.push(payment); } diff --git a/resources/views/pages/pdfs/currency_vendor_order.blade.php b/resources/views/pages/pdfs/currency_vendor_order.blade.php index 987c42f2..10707369 100644 --- a/resources/views/pages/pdfs/currency_vendor_order.blade.php +++ b/resources/views/pages/pdfs/currency_vendor_order.blade.php @@ -59,7 +59,7 @@ Transfer fee: @php - $transfer_fee = number_format((float)$transferFeeTransactions->sum('service_charge'), 2, '.', ''); + $transfer_fee = number_format(((float)$transferFeeTransactions->sum('service_charge') + (float)$groupTransferFeeOriginalAmount), 2, '.', ''); @endphp {{$transaction->original_currency->short_code}} {{$transfer_fee}}