From bf278e438ea2b6a69f248eaacf027b138fb1439e Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Wed, 20 Dec 2023 17:41:10 +0800 Subject: [PATCH 01/58] update group command --- .../Commands/UpdateGroupWithTransferFee.php | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 app/Console/Commands/UpdateGroupWithTransferFee.php diff --git a/app/Console/Commands/UpdateGroupWithTransferFee.php b/app/Console/Commands/UpdateGroupWithTransferFee.php new file mode 100644 index 00000000..a30e8982 --- /dev/null +++ b/app/Console/Commands/UpdateGroupWithTransferFee.php @@ -0,0 +1,74 @@ +get(); + Log::info($groups->count()); + + // $groups = Group::where('id', 999)->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(); + Log::info("Update group id: " . $group->id . " correct original amount is: " . $correctOriginalAmount . " transfer fee is " . $originalTransferFees); + } else { + Log::info("No update for group id: " . $group->id); + } + } + } +} From 89eaa78ee98ae0ca3dec3a01e17ae8b88a6c1be8 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Wed, 20 Dec 2023 17:57:03 +0800 Subject: [PATCH 02/58] update logging --- app/Console/Commands/UpdateGroupWithTransferFee.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/Console/Commands/UpdateGroupWithTransferFee.php b/app/Console/Commands/UpdateGroupWithTransferFee.php index a30e8982..be71d129 100644 --- a/app/Console/Commands/UpdateGroupWithTransferFee.php +++ b/app/Console/Commands/UpdateGroupWithTransferFee.php @@ -49,7 +49,7 @@ class UpdateGroupWithTransferFee extends Command ini_set('max_execution_time', 0); set_time_limit(0); $groups = Group::whereDate('updated_at', '<', Carbon::now())->get(); - Log::info($groups->count()); + $this->info($groups->count()); // $groups = Group::where('id', 999)->get(); @@ -65,10 +65,11 @@ class UpdateGroupWithTransferFee extends Command // $group->original_amount = $correctOriginalAmount; // $group->amount = $correctAmount; // $group->save(); - Log::info("Update group id: " . $group->id . " correct original amount is: " . $correctOriginalAmount . " transfer fee is " . $originalTransferFees); + $this->info("Update group id: " . $group->id . " correct original amount is: " . $correctOriginalAmount . " transfer fee is " . $originalTransferFees); } else { - Log::info("No update for group id: " . $group->id); + $this->info("No update for group id: " . $group->id); } } + $this->info(Carbon::now() . ' : ' . 'updateGroupWithTransferFee ------ completed'); } } From 72797d88851070e38af585ff56e3811d1cb46291 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Fri, 22 Dec 2023 18:16:04 +0800 Subject: [PATCH 03/58] supplier bill group dashboard --- .../Filters/HasPendingVerifyTransaction.php | 23 ++ .../Eloquent/Filters/WithoutBillGroup.php | 22 ++ ...proveBillGroupPaymentVerificationLogic.php | 93 +++++++ ...eateBillGroupPaymentProofDocumentLogic.php | 94 +++++++ ...CreateBillGroupPaymentTransactionLogic.php | 84 ++++++ .../CreateSupplierBillGroupLogic.php | 117 ++++++++ .../CreateSupplierTransactionLogic.php | 4 + .../ControllersLogic/DeleteBillGroupLogic.php | 68 +++++ .../ControllersLogic/ListBillGroupsLogic.php | 42 +++ .../CalculatesBillGroupPaymentAmount.php | 22 ++ .../Services/FetchesBillGroup.php | 31 +++ .../Transactions/Services/ListsBillGroups.php | 31 +++ .../ValueObjects/Constants/DocumentType.php | 2 + .../Constants/TransactionType.php | 2 + .../Commands/UpdateGroupWithTransferFee.php | 13 +- ...BillGroupPaymentVerificationController.php | 20 ++ ...illGroupPaymentProofDocumentController.php | 21 ++ ...eBillGroupPaymentTransactionController.php | 20 ++ .../CreateSupplierBillGroupController.php | 21 ++ .../DeleteBillGroupController.php | 20 ++ .../Transactions/ListBillGroupsController.php | 21 ++ app/Http/Resources/BillGroupResource.php | 63 +++++ app/Models/BillGroup.php | 68 +++++ app/Models/BillGroupPayment.php | 27 ++ app/Models/Group.php | 9 + ..._12_04_224416_create_bill_groups_table.php | 44 +++ ...24509_create_bill_group_payments_table.php | 34 +++ .../bookings/elements/BillGroupComponent.vue | 254 ++++++++++++++++++ .../BillGroupPaymentSummaryComponent.vue | 154 +++++++++++ .../TransactionGroupPaymentComponent.vue | 140 ++++++++++ .../BillGroupPaymentProofFormComponent.vue | 80 ++++++ ...pplierWhiteFormPlaceOrderFormComponent.vue | 201 ++++++++++++++ .../BillGroupListSectionComponent.vue | 136 ++++++++++ ...ierPendingOrderPaymentSectionComponent.vue | 113 ++++++++ .../GeneralConfirmationFormComponent.vue | 11 +- .../views/pages/supplier-payments.blade.php | 138 ++++++++++ resources/views/partials/header.blade.php | 5 + routes/transaction.php | 10 + routes/web.php | 4 + 39 files changed, 2251 insertions(+), 11 deletions(-) create mode 100644 app/Classes/General/Eloquent/Filters/HasPendingVerifyTransaction.php create mode 100644 app/Classes/General/Eloquent/Filters/WithoutBillGroup.php create mode 100644 app/Classes/Modules/Transactions/ControllersLogic/ApproveBillGroupPaymentVerificationLogic.php create mode 100644 app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentProofDocumentLogic.php create mode 100644 app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php create mode 100644 app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php create mode 100644 app/Classes/Modules/Transactions/ControllersLogic/DeleteBillGroupLogic.php create mode 100644 app/Classes/Modules/Transactions/ControllersLogic/ListBillGroupsLogic.php create mode 100644 app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php create mode 100644 app/Classes/Modules/Transactions/Services/FetchesBillGroup.php create mode 100644 app/Classes/Modules/Transactions/Services/ListsBillGroups.php create mode 100644 app/Http/Controllers/Transactions/ApproveBillGroupPaymentVerificationController.php create mode 100644 app/Http/Controllers/Transactions/CreateBillGroupPaymentProofDocumentController.php create mode 100644 app/Http/Controllers/Transactions/CreateBillGroupPaymentTransactionController.php create mode 100644 app/Http/Controllers/Transactions/CreateSupplierBillGroupController.php create mode 100644 app/Http/Controllers/Transactions/DeleteBillGroupController.php create mode 100644 app/Http/Controllers/Transactions/ListBillGroupsController.php create mode 100644 app/Http/Resources/BillGroupResource.php create mode 100644 app/Models/BillGroup.php create mode 100644 app/Models/BillGroupPayment.php create mode 100644 database/migrations/2023_12_04_224416_create_bill_groups_table.php create mode 100644 database/migrations/2023_12_04_224509_create_bill_group_payments_table.php create mode 100644 resources/assets/vue/components/bookings/elements/BillGroupComponent.vue create mode 100644 resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue create mode 100644 resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue create mode 100644 resources/assets/vue/components/bookings/forms/BillGroupPaymentProofFormComponent.vue create mode 100644 resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue create mode 100644 resources/assets/vue/components/bookings/sections/BillGroupListSectionComponent.vue create mode 100644 resources/assets/vue/components/bookings/sections/SupplierPendingOrderPaymentSectionComponent.vue create mode 100644 resources/views/pages/supplier-payments.blade.php diff --git a/app/Classes/General/Eloquent/Filters/HasPendingVerifyTransaction.php b/app/Classes/General/Eloquent/Filters/HasPendingVerifyTransaction.php new file mode 100644 index 00000000..c97af23c --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/HasPendingVerifyTransaction.php @@ -0,0 +1,23 @@ +whereHas('transactions', function ($q) { + $q->where('status', ApprovalStatus::PENDING_VERIFICATION); + }); + } +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/WithoutBillGroup.php b/app/Classes/General/Eloquent/Filters/WithoutBillGroup.php new file mode 100644 index 00000000..6d6794e8 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/WithoutBillGroup.php @@ -0,0 +1,22 @@ +whereDoesntHave('billGroup'); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Transactions/ControllersLogic/ApproveBillGroupPaymentVerificationLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/ApproveBillGroupPaymentVerificationLogic.php new file mode 100644 index 00000000..f12060b4 --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/ApproveBillGroupPaymentVerificationLogic.php @@ -0,0 +1,93 @@ +fetchesTransaction = $fetchesTransaction; + $this->updatesTransactionStatus = $updatesTransactionStatus; + $this->approvesDocument = $approvesDocument; + $this->rejectsDocument = $rejectsDocument; + $this->calculatesBillGroupPaymentAmount = $calculatesBillGroupPaymentAmount; + } + + /** + * @return array + */ + protected function notification():array { + return [ + 'title' => 'Payment Status', + 'message' => 'You have successfully updated the payment status' + ]; + } + + /** @var FetchesTransaction */ + private $fetchesTransaction; + + /** @var UpdatesTransactionStatus */ + private $updatesTransactionStatus; + + /** @var ApprovesDocument */ + private $approvesDocument; + + /** @var RejectsDocument */ + private $rejectsDocument; + + /** @var CalculatesBillGroupPaymentAmount */ + private $calculatesBillGroupPaymentAmount; + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function logic(Request $request) : JsonResponse + { + $status = $request->route('status'); + + $transaction = $this->fetchesTransaction->execute(['id' => $request->route('id')]); + + $status === 'approve' ? $this->approvesDocument->execute($transaction->documents()->first()) : $this->rejectsDocument->execute($transaction->documents()->first()); + + $this->updatesTransactionStatus->execute($transaction, $status === 'approve' ? ApprovalStatus::APPROVED : ApprovalStatus::REJECTED); + + $billGroup = $transaction->owner; + $billGroupPayment = $this->calculatesBillGroupPaymentAmount->execute($billGroup); + + if ($status === 'reject') { + $billGroup->status = ApprovalStatus::PENDING_SUBMISSION; + $billGroup->save(); + } else { + if ($billGroupPayment['outstanding_amount'] <= 0) { + $billGroup->status = ApprovalStatus::APPROVED; + $billGroup->save(); + } + } + + return $this->response([]); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentProofDocumentLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentProofDocumentLogic.php new file mode 100644 index 00000000..79e01eb0 --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentProofDocumentLogic.php @@ -0,0 +1,94 @@ + 'Payment Proof Document', + 'message' => 'You have successfully submitted your payment proof document' + ]; + } + + /** @var FetchesTransaction */ + private $fetchesTransaction; + + /** @var CreatesDocument */ + private $createsDocument; + + /** @var CreatesFiles */ + private $createsFile; + + /** @var UpdatesTransactionStatus */ + private $updatesTransactionStatus; + + /** @var CalculatesBillGroupPaymentAmount */ + private $calculatesBillGroupPaymentAmount; + + /** + * CreateBillGroupPaymentProofDocumentLogic constructor. + * @param FetchesTransaction $fetchesTransaction + * @param CreatesDocument $createsDocument + * @param CreatesFiles $createsFile + * @param UpdatesTransactionStatus $updatesTransactionStatus + * @param CalculatesBillGroupPaymentAmount $calculatesBillGroupPaymentAmount + */ + public function __construct(FetchesTransaction $fetchesTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, UpdatesTransactionStatus $updatesTransactionStatus, CalculatesBillGroupPaymentAmount $calculatesBillGroupPaymentAmount) + { + $this->fetchesTransaction = $fetchesTransaction; + $this->createsDocument = $createsDocument; + $this->createsFile = $createsFile; + $this->updatesTransactionStatus = $updatesTransactionStatus; + $this->calculatesBillGroupPaymentAmount = $calculatesBillGroupPaymentAmount; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function logic(Request $request) : JsonResponse + { + + $transaction = $this->fetchesTransaction->execute(['id' => $request->route('id')]); + + $object = new DocumentObject(DocumentType::BILL_GROUP_PAYMENT_PROOF, $request->input('files'), '', ApprovalStatus::PENDING_VERIFICATION, 'bill_group_payments'); + + /** @var Document $document */ + $document = $this->createsDocument->execute($transaction, $object); + + $this->createsFile->execute($document, $object); + + $this->updatesTransactionStatus->execute($transaction, ApprovalStatus::PENDING_VERIFICATION); + + $billGroup = $transaction->owner; + $billGroupPayment = $this->calculatesBillGroupPaymentAmount->execute($billGroup); + + if ($billGroupPayment['outstanding_amount'] <= 0) { + $billGroup->status = ApprovalStatus::PENDING_VERIFICATION; + $billGroup->save(); + } + + return $this->response([]); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php new file mode 100644 index 00000000..5c1ae1bf --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php @@ -0,0 +1,84 @@ + 'Create Bill Group Payment Transaction', + 'message' => 'You have successfully created payment for this Bill Group' + ]; + } + + /** @var FetchesBillGroup */ + private $fetchesBillGroup; + + /** @var GeneratesTransactionBillNumber */ + private $generatesTransactionBillNumber; + + /** @var CreatesTransaction */ + private $createsTransaction; + + /** @var CalculatesBillGroupPaymentAmount */ + private $calculatesBillGroupPaymentAmount; + + /** + * CreateBillGroupPaymentTransactionLogic constructor. + * @param FetchesBillGroup $fetchesBillGroup + * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber + * @param CreatesTransaction $createsTransaction + * @param CalculatesBillGroupPaymentAmount $calculatesBillGroupPaymentAmount + */ + public function __construct(FetchesBillGroup $fetchesBillGroup, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatesTransaction $createsTransaction, CalculatesBillGroupPaymentAmount $calculatesBillGroupPaymentAmount) + { + $this->fetchesBillGroup = $fetchesBillGroup; + $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; + $this->createsTransaction = $createsTransaction; + $this->calculatesBillGroupPaymentAmount = $calculatesBillGroupPaymentAmount; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function logic(Request $request) : JsonResponse + { + $billGroup = $this->fetchesBillGroup->execute(['id' => $request->route('id')]); + + $billGroupPayment = $this->calculatesBillGroupPaymentAmount->execute($billGroup); + $outstanding_amount = $billGroupPayment['outstanding_amount']; + + $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); + + return $this->resourceResponse(new BillGroupResource($billGroup)); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php new file mode 100644 index 00000000..0a425c16 --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php @@ -0,0 +1,117 @@ + 'Create Supplier White Form Order', + 'message' => 'You have successfully created currency supplier white form order' + ]; + } + + /** @var FetchesCompany */ + private $fetchesCompany; + + /** @var CreatesTransaction */ + private $createsTransaction; + + /** @var CreatesDocument */ + private $createsDocument; + + /** @var CreatesFiles */ + private $createsFile; + + /** @var GeneratesTransactionBillNumber */ + private $generatesTransactionBillNumber; + + + /** + * CreateSupplierBillGroupLogic constructor. + * @param FetchesCompany $fetchesCompany + * @param CreatesTransaction $createsTransaction + * @param CreatesDocument $createsDocument + * @param CreatesFiles $createsFile + * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber + */ + public function __construct(FetchesCompany $fetchesCompany, CreatesTransaction $createsTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber) + { + $this->fetchesCompany = $fetchesCompany; + $this->createsTransaction = $createsTransaction; + $this->createsDocument = $createsDocument; + $this->createsFile = $createsFile; + $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; + } + + public function logic(Request $request) : JsonResponse + { + + $supplier = $this->fetchesCompany->execute(['id' => $request->route('id')]); + + throw new MalformedRequestException('testing only'); + dd("pass through"); + + $service_charges = round(floatval(str_replace(',', '', $request->input('service_charges'))), 2); + + $payments = $request->input('payments'); + + $amount = 0; + $original_amount = 0; + + foreach ($payments as $payment) { + $amount += round($payment['amount'], 2); + $original_amount += round($payment['original_amount'], 2); + } + + $rate = $original_amount / $amount; + + $billGroup = new BillGroup(); + $billGroup->issuer = $supplier->id; + $billGroup->receiver = 1; + $billGroup->reference = $this->generatesTransactionBillNumber->execute('BSPO-'); + $billGroup->amount = $amount; + $billGroup->original_amount = $original_amount; + $billGroup->currency_id = 1; + $billGroup->original_currency_id = $payments[0]['original_currency']['id']; + $billGroup->currency_rate = $rate; + $billGroup->tax = 0; + $billGroup->service_charge = $service_charges; + $billGroup->status = ApprovalStatus::PENDING_SUBMISSION; + $billGroup->save(); + + foreach ($payments as $payment) { + $billGroup->groups()->sync($payment['id'], false); + } + + return $this->response([]); + } +} diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php index 2dcbd0f7..5dd7ab82 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php @@ -105,6 +105,10 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $service_charge += $row->service_charge; } + $transferFee = (float)$this->createSupplierTransactionProcessor->getTransferTransactions()->sum('service_charge'); + $original_amount += $transferFee; + $amount += $transferFee / $currency_rate; + $group->issuer = $issuer; $group->receiver = $receiver; $group->reference = $this->generatesTransactionBillNumber->execute('SPO-'); diff --git a/app/Classes/Modules/Transactions/ControllersLogic/DeleteBillGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/DeleteBillGroupLogic.php new file mode 100644 index 00000000..56464409 --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/DeleteBillGroupLogic.php @@ -0,0 +1,68 @@ + 'Delete Bill Group Transaction', + 'message' => 'You have successfully deleted this Bill Group Transaction' + ]; + } + + /** @var FetchesBillGroup */ + private $fetchesBillGroup; + + /** @var DeletesTransaction */ + private $deletesTransaction; + + /** + * DeleteBillGroupLogic constructor. + * @param FetchesBillGroup $fetchesBillGroup + * @param DeletesTransaction $deletesTransaction + */ + public function __construct(FetchesBillGroup $fetchesBillGroup, DeletesTransaction $deletesTransaction) + { + $this->fetchesBillGroup = $fetchesBillGroup; + $this->deletesTransaction = $deletesTransaction; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function logic(Request $request) : JsonResponse + { + $billGroup = $this->fetchesBillGroup->execute(['id' => $request->route('id')]); + + $transactions = $billGroup->transactions()->get(); + + foreach($transactions as $transaction) { + $this->deletesTransaction->execute($transaction); + } + + $groups = $billGroup->groups()->get(); + + foreach($groups as $group) { + $billGroup->groups()->detach($group->id); + } + + $billGroup->delete(); + + return $this->resourceResponse(new BillGroupResource($billGroup)); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Transactions/ControllersLogic/ListBillGroupsLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/ListBillGroupsLogic.php new file mode 100644 index 00000000..0e39585b --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/ListBillGroupsLogic.php @@ -0,0 +1,42 @@ +listsBillGroups = $listsBillGroups; + } + + /** + * @return array + */ + protected function notification():array { + return [ + 'title' => 'Retrieved Bill Groups', + 'message' => 'You have successfully retrieved a list of bill groups' + ]; + } + + /** @var ListsBillGroups */ + private $listsBillGroups; + + public function logic(Request $request) : JsonResponse + { + $query = $this->listsBillGroups->execute($this->listsBillGroups->deserializeFilters($request->input('filters'))); + + return $this->collectionResponse(BillGroupResource::collection($query)); + } + +} diff --git a/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php b/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php new file mode 100644 index 00000000..812f8a3c --- /dev/null +++ b/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php @@ -0,0 +1,22 @@ +transactions()->whereIn('status', [ApprovalStatus::PENDING_SUBMISSION, ApprovalStatus::PENDING_VERIFICATION])->sum('amount')); + $paid_amount = floatval($billGroup->transactions()->where('status', ApprovalStatus::APPROVED)->sum('amount')); + $outstanding_amount = $billGroup->amount - $paid_amount - $floating_amount + $billGroup->service_charge; + + return [ + 'floating_amount' => $floating_amount, + 'paid_amount' => $paid_amount, + 'outstanding_amount' => $outstanding_amount, + ]; + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Transactions/Services/FetchesBillGroup.php b/app/Classes/Modules/Transactions/Services/FetchesBillGroup.php new file mode 100644 index 00000000..55e5eb11 --- /dev/null +++ b/app/Classes/Modules/Transactions/Services/FetchesBillGroup.php @@ -0,0 +1,31 @@ +repository = $repository; + } + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/Transactions/Services/ListsBillGroups.php b/app/Classes/Modules/Transactions/Services/ListsBillGroups.php new file mode 100644 index 00000000..26379706 --- /dev/null +++ b/app/Classes/Modules/Transactions/Services/ListsBillGroups.php @@ -0,0 +1,31 @@ +repository = $repository; + } + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/ValueObjects/Constants/DocumentType.php b/app/Classes/ValueObjects/Constants/DocumentType.php index 23f9a94a..42f8222b 100644 --- a/app/Classes/ValueObjects/Constants/DocumentType.php +++ b/app/Classes/ValueObjects/Constants/DocumentType.php @@ -25,4 +25,6 @@ final class DocumentType { public const INVOICE = 'INVOICE'; public const SUPPLIER_DELIVER_ORDER = 'SUPPLIER_DELIVER_ORDER'; public const BULK_PURCHASE_ORDER = 'BULK_PURCHASE_ORDER'; + + public const BILL_GROUP_PAYMENT_PROOF = 'BILL_GROUP_PAYMENT_PROOF'; } diff --git a/app/Classes/ValueObjects/Constants/TransactionType.php b/app/Classes/ValueObjects/Constants/TransactionType.php index 026f25ba..fbab3119 100644 --- a/app/Classes/ValueObjects/Constants/TransactionType.php +++ b/app/Classes/ValueObjects/Constants/TransactionType.php @@ -31,4 +31,6 @@ final class TransactionType { public const TRANSFER_FEE = 12; public const CASH_BACK = 13; + + public const SUPPLIER_PAYMENT = 14; } diff --git a/app/Console/Commands/UpdateGroupWithTransferFee.php b/app/Console/Commands/UpdateGroupWithTransferFee.php index be71d129..dec74d5c 100644 --- a/app/Console/Commands/UpdateGroupWithTransferFee.php +++ b/app/Console/Commands/UpdateGroupWithTransferFee.php @@ -49,9 +49,6 @@ class UpdateGroupWithTransferFee extends Command ini_set('max_execution_time', 0); set_time_limit(0); $groups = Group::whereDate('updated_at', '<', Carbon::now())->get(); - $this->info($groups->count()); - - // $groups = Group::where('id', 999)->get(); foreach ($groups as $group) { $originalTransferFees = (float)Transaction::where('type', TransactionType::TRANSFER_FEE)->whereIn('owner_id', $group->transactions->pluck('id'))->sum('service_charge'); @@ -62,14 +59,10 @@ class UpdateGroupWithTransferFee extends Command $correctAmount += $transferFees; if ($group->original_amount != $correctOriginalAmount) { - // $group->original_amount = $correctOriginalAmount; - // $group->amount = $correctAmount; - // $group->save(); - $this->info("Update group id: " . $group->id . " correct original amount is: " . $correctOriginalAmount . " transfer fee is " . $originalTransferFees); - } else { - $this->info("No update for group id: " . $group->id); + $group->original_amount = $correctOriginalAmount; + $group->amount = $correctAmount; + $group->save(); } } - $this->info(Carbon::now() . ' : ' . 'updateGroupWithTransferFee ------ completed'); } } diff --git a/app/Http/Controllers/Transactions/ApproveBillGroupPaymentVerificationController.php b/app/Http/Controllers/Transactions/ApproveBillGroupPaymentVerificationController.php new file mode 100644 index 00000000..fbae0c1a --- /dev/null +++ b/app/Http/Controllers/Transactions/ApproveBillGroupPaymentVerificationController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/Transactions/CreateBillGroupPaymentProofDocumentController.php b/app/Http/Controllers/Transactions/CreateBillGroupPaymentProofDocumentController.php new file mode 100644 index 00000000..dab95ed8 --- /dev/null +++ b/app/Http/Controllers/Transactions/CreateBillGroupPaymentProofDocumentController.php @@ -0,0 +1,21 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Transactions/CreateBillGroupPaymentTransactionController.php b/app/Http/Controllers/Transactions/CreateBillGroupPaymentTransactionController.php new file mode 100644 index 00000000..7e94c84e --- /dev/null +++ b/app/Http/Controllers/Transactions/CreateBillGroupPaymentTransactionController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Transactions/CreateSupplierBillGroupController.php b/app/Http/Controllers/Transactions/CreateSupplierBillGroupController.php new file mode 100644 index 00000000..7ab2f48a --- /dev/null +++ b/app/Http/Controllers/Transactions/CreateSupplierBillGroupController.php @@ -0,0 +1,21 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Transactions/DeleteBillGroupController.php b/app/Http/Controllers/Transactions/DeleteBillGroupController.php new file mode 100644 index 00000000..2b76632b --- /dev/null +++ b/app/Http/Controllers/Transactions/DeleteBillGroupController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Transactions/ListBillGroupsController.php b/app/Http/Controllers/Transactions/ListBillGroupsController.php new file mode 100644 index 00000000..94dbd5e1 --- /dev/null +++ b/app/Http/Controllers/Transactions/ListBillGroupsController.php @@ -0,0 +1,21 @@ +execute($request); + } +} diff --git a/app/Http/Resources/BillGroupResource.php b/app/Http/Resources/BillGroupResource.php new file mode 100644 index 00000000..6f61aeb7 --- /dev/null +++ b/app/Http/Resources/BillGroupResource.php @@ -0,0 +1,63 @@ +make(CalculatesBillGroupPaymentAmount::class))->execute($this->resource); + $floating_amount = $billGroupPayment['floating_amount']; + $paid_amount = $billGroupPayment['paid_amount']; + $outstanding_amount = $billGroupPayment['outstanding_amount']; + + return [ + 'id' => $this->id, + 'reference' => $this->reference, + 'original_amount' => (float) $this->original_amount, + 'original_currency' => new CurrencyResource($this->original_currency), + 'issuer_name' => $this->issuerCompany->name, + 'issuer_id' => $this->issuerCompany->id, + 'amount' => (float) $this->amount, + 'service_charge' => (float) $this->service_charge, + 'currency' => new CurrencyResource($this->currency), + 'created_at' => Carbon::parse($this->created_at)->format('d-m-Y h:i:s A'), + 'updated_at' => Carbon::parse($this->updated_at)->format('d-m-Y h:i:s A'), + 'currency_rate' => (float) $this->currency_rate, + 'status' => $this->status, + 'groups' => GroupResource::collection($this->groups), + 'floating_amount' => $floating_amount, + 'paid_amount' => $paid_amount, + 'outstanding_amount' => $outstanding_amount, + 'payment_history' => $this->transactions->map(function ($transaction) { + return [ + 'id' => $transaction->id, + 'type' => (int) $transaction->type, + 'bill_no' => $transaction->bill_no, + 'payment_method' => (float) $transaction->payment_method, + 'amount' => (double) $transaction->amount, + 'original_amount' => (double) $transaction->original_amount, + 'currency' => new CurrencyResource($transaction->currency), + 'original_currency' => new CurrencyResource($transaction->original_currency), + 'service_charge' => (double) $transaction->service_charge, + 'tax' => (double) $transaction->tax, + 'status' => (int) $transaction->status, + 'statusText' => ApprovalStatus::APPROVAL_STATUS_ID[(int) $transaction->status], + 'documents' => $transaction->documents()->first() ? new DocumentResource($transaction->documents()->first()) : null, + 'updated_at' => Carbon::parse($transaction->updated_at)->format('d-m-Y h:i:s A'), + ]; + }), + ]; + } +} diff --git a/app/Models/BillGroup.php b/app/Models/BillGroup.php new file mode 100644 index 00000000..6986ee52 --- /dev/null +++ b/app/Models/BillGroup.php @@ -0,0 +1,68 @@ +MorphMany(Transaction::class, 'owner'); + } + + /** + * @return MorphMany + */ + public function documents(): morphMany + { + return $this->morphMany(Document::class, 'owner'); + } + + /** + * @return BelongsTo + */ + public function currency(): BelongsTo + { + return $this->BelongsTo(Currency::class, 'currency_id', 'id'); + } + + /** + * @return BelongsTo + */ + public function issuerCompany(): BelongsTo + { + return $this->BelongsTo( Company::class, 'issuer', 'id'); + } + + /** + * @return BelongsTo + */ + public function original_currency(): BelongsTo + { + return $this->BelongsTo(Currency::class, 'original_currency_id', 'id'); + } + + public function groups() + { + return $this->belongsToMany(Group::class, BillGroupPayment::class, 'bill_group_id', 'group_id'); + } +} diff --git a/app/Models/BillGroupPayment.php b/app/Models/BillGroupPayment.php new file mode 100644 index 00000000..e34f692c --- /dev/null +++ b/app/Models/BillGroupPayment.php @@ -0,0 +1,27 @@ +BelongsTo(BillGroup::class, 'bill_group_id', 'id'); + } + + /** + * @return BelongsTo + */ + public function group(): BelongsTo + { + return $this->BelongsTo(Group::class, 'group_id', 'id'); + } +} diff --git a/app/Models/Group.php b/app/Models/Group.php index 01dd257e..8cb6cd8a 100644 --- a/app/Models/Group.php +++ b/app/Models/Group.php @@ -6,6 +6,7 @@ use App\Classes\General\Traits\LogData; use Illuminate\Database\Eloquent\Model; use App\Classes\General\Interfaces\Documentable; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\MorphMany; use Staudenmeir\EloquentHasManyDeep\HasManyDeep; use Staudenmeir\EloquentHasManyDeep\HasRelationships; @@ -60,4 +61,12 @@ class Group extends Model implements Documentable { return $this->BelongsTo(Currency::class, 'original_currency_id', 'id'); } + + /** + * @return BelongsToMany + */ + public function billGroup(): BelongsToMany + { + return $this->belongsToMany(BillGroup::class, BillGroupPayment::class, 'group_id', 'bill_group_id'); + } } diff --git a/database/migrations/2023_12_04_224416_create_bill_groups_table.php b/database/migrations/2023_12_04_224416_create_bill_groups_table.php new file mode 100644 index 00000000..e5fd986c --- /dev/null +++ b/database/migrations/2023_12_04_224416_create_bill_groups_table.php @@ -0,0 +1,44 @@ +id(); + $table->string('reference')->unique(); + $table->foreignId('issuer')->unsigned(); + $table->foreignId('receiver')->unsigned(); + $table->decimal('amount', 14, 5)->default(0.00); + $table->decimal('original_amount', 14, 5)->default(0.00); + $table->foreignId('currency_id')->unsigned(); + $table->foreignId('original_currency_id')->unsigned(); + $table->decimal('currency_rate', 14, 5)->default(0.00); + $table->decimal('tax', 14, 5)->default(0.00); + $table->decimal('service_charge', 14, 5)->default(0.00); + $table->integer('status')->default(ApprovalStatus::PENDING_VERIFICATION); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('bill_groups'); + } +} diff --git a/database/migrations/2023_12_04_224509_create_bill_group_payments_table.php b/database/migrations/2023_12_04_224509_create_bill_group_payments_table.php new file mode 100644 index 00000000..5e0d2aa2 --- /dev/null +++ b/database/migrations/2023_12_04_224509_create_bill_group_payments_table.php @@ -0,0 +1,34 @@ +id(); + $table->foreignId('bill_group_id')->constrained('bill_groups'); + $table->foreignId('group_id')->constrained('groups'); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('bill_group_payments'); + } +} diff --git a/resources/assets/vue/components/bookings/elements/BillGroupComponent.vue b/resources/assets/vue/components/bookings/elements/BillGroupComponent.vue new file mode 100644 index 00000000..42727055 --- /dev/null +++ b/resources/assets/vue/components/bookings/elements/BillGroupComponent.vue @@ -0,0 +1,254 @@ + + + diff --git a/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue b/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue new file mode 100644 index 00000000..9ad4f1d3 --- /dev/null +++ b/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue @@ -0,0 +1,154 @@ + + + \ No newline at end of file diff --git a/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue b/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue new file mode 100644 index 00000000..b86cdce7 --- /dev/null +++ b/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue @@ -0,0 +1,140 @@ + + + diff --git a/resources/assets/vue/components/bookings/forms/BillGroupPaymentProofFormComponent.vue b/resources/assets/vue/components/bookings/forms/BillGroupPaymentProofFormComponent.vue new file mode 100644 index 00000000..1adac911 --- /dev/null +++ b/resources/assets/vue/components/bookings/forms/BillGroupPaymentProofFormComponent.vue @@ -0,0 +1,80 @@ + + + \ No newline at end of file diff --git a/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue b/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue new file mode 100644 index 00000000..206a9daf --- /dev/null +++ b/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue @@ -0,0 +1,201 @@ + + + \ No newline at end of file diff --git a/resources/assets/vue/components/bookings/sections/BillGroupListSectionComponent.vue b/resources/assets/vue/components/bookings/sections/BillGroupListSectionComponent.vue new file mode 100644 index 00000000..18aa285f --- /dev/null +++ b/resources/assets/vue/components/bookings/sections/BillGroupListSectionComponent.vue @@ -0,0 +1,136 @@ + + + \ No newline at end of file diff --git a/resources/assets/vue/components/bookings/sections/SupplierPendingOrderPaymentSectionComponent.vue b/resources/assets/vue/components/bookings/sections/SupplierPendingOrderPaymentSectionComponent.vue new file mode 100644 index 00000000..eba9fde5 --- /dev/null +++ b/resources/assets/vue/components/bookings/sections/SupplierPendingOrderPaymentSectionComponent.vue @@ -0,0 +1,113 @@ + + + \ No newline at end of file diff --git a/resources/assets/vue/components/general/forms/GeneralConfirmationFormComponent.vue b/resources/assets/vue/components/general/forms/GeneralConfirmationFormComponent.vue index cdb477ee..6d6ad557 100644 --- a/resources/assets/vue/components/general/forms/GeneralConfirmationFormComponent.vue +++ b/resources/assets/vue/components/general/forms/GeneralConfirmationFormComponent.vue @@ -57,7 +57,16 @@ submitForm() { if (this.params) this.parameters = this.params; return this.submit(this.apiRoute, this.apiMethod, this.section, true, true); - } + }, + successHandler(){ + this.closeModal(); + this.formHandler(); + if (this.section && (this.section === 'paymentInProgressBillGroupList' || this.section === 'paymentVerificationBillGroupList')) { + this.$store.dispatch('toggleSection', {name: 'paymentInProgressBillGroupList', status: !this.$store.getters.isShowing('paymentInProgressBillGroupList')}); + this.$store.dispatch('toggleSection', {name: 'paymentVerificationBillGroupList', status: !this.$store.getters.isShowing('paymentVerificationBillGroupList')}); + this.$store.dispatch('toggleSection', {name: 'paidBillGroupList', status: !this.$store.getters.isShowing('paidBillGroupList')}); + } + }, }, mixins: [componentHandler, ModalFormHandler] diff --git a/resources/views/pages/supplier-payments.blade.php b/resources/views/pages/supplier-payments.blade.php new file mode 100644 index 00000000..c94051e7 --- /dev/null +++ b/resources/views/pages/supplier-payments.blade.php @@ -0,0 +1,138 @@ +@extends('layouts.base_portal') +@section('inner_content') +
+
+
+
+
+
+
+
+ Supplier Currency Orders +
+
+
+
+
+
+
+
+ +
+
+
+
+
Pending Payment
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
Payment In Progress
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
Payment Verification
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
Paid Currency Order
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/partials/header.blade.php b/resources/views/partials/header.blade.php index b618e334..eaeeaec7 100644 --- a/resources/views/partials/header.blade.php +++ b/resources/views/partials/header.blade.php @@ -38,6 +38,11 @@
Currency Orders
+
Transfers
diff --git a/routes/transaction.php b/routes/transaction.php index e714d6b7..1996b012 100644 --- a/routes/transaction.php +++ b/routes/transaction.php @@ -8,6 +8,7 @@ Route::group(['prefix' => 'transactions', 'namespace' => 'Transactions', 'as' => Route::delete('/suspend/{id}', 'SuspendTransactionController@suspend')->name('suspend'); route::post('/supplier/{id}/bill/create', 'CreateSupplierTransactionController@create')->name('supplier.create'); + route::post('/supplier/{id}/bill/group/create', 'CreateSupplierBillGroupController@create')->name('supplier.bill_group.create'); route::post('{id}/bill/verification', 'CreatePaymentProofDocumentController@verify')->name('bill.verification'); route::post('{id}/bill/pay', 'CreatePaymentProofDocumentController@pay')->name('bill.pay'); Route::put('/{id}/bill/{status}', 'UpdatePaymentTransactionStatusController@update')->where('status', 'pending|complete')->name('bill.status'); @@ -33,5 +34,14 @@ Route::group(['prefix' => 'transactions', 'namespace' => 'Transactions', 'as' => Route::put('/{id}/update', 'UpdateGroupController@update')->name('update'); Route::post('/{id}/approve', 'CreateBulkPurchaseOrderDocumentController@aprove')->name('approve'); Route::post('/bulk/po', 'CreateBulkPurchaseOrderDocumentController@create')->name('bulk.po'); + + Route::group(['prefix' => 'bills', 'as' => 'bill.'], function () { + Route::get('/list', 'ListBillGroupsController@list')->name('list'); + Route::post('/transaction/{id}', 'CreateBillGroupPaymentProofDocumentController@create')->name('payment_proof.create'); + Route::post('/transaction/{id}/approval/{status}', 'ApproveBillGroupPaymentVerificationController@approve')->where('status', 'approve|reject')->name('payment_proof.approval'); + Route::delete('/{id}/delete', 'DeleteBillGroupController@delete')->name('delete'); + Route::post('/{id}/pay', 'CreateBillGroupPaymentTransactionController@pay')->name('pay'); + // Route::post('/bulk/po', 'CreateBulkPurchaseOrderDocumentController@create')->name('bulk.po'); + }); }); }); \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index ead4b3d2..41b1f7dd 100644 --- a/routes/web.php +++ b/routes/web.php @@ -88,6 +88,10 @@ Route::get('/payments', function () { return view('pages.payments'); })->name('payments'); +Route::get('/supplier-payments', function () { + return view('pages.supplier-payments'); +})->name('supplier.payments'); + Route::get('/billings', function () { return view('pages.billings'); })->name('billings'); From b6162f5355ca594858b47606cfb871e292fd0fb8 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Sat, 23 Dec 2023 16:29:06 +0800 Subject: [PATCH 04/58] update --- .../CreateSupplierBillGroupLogic.php | 29 +++++++-- ...pplierWhiteFormPlaceOrderFormComponent.vue | 60 +++++++------------ .../forms/ValidationErrorComponent.vue | 8 +-- 3 files changed, 48 insertions(+), 49 deletions(-) diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php index 0a425c16..f89af62c 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php @@ -54,6 +54,9 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic /** @var GeneratesTransactionBillNumber */ private $generatesTransactionBillNumber; + /** @var UpdateGroupLogic */ + private $updateGroupLogic; + /** * CreateSupplierBillGroupLogic constructor. @@ -62,14 +65,16 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic * @param CreatesDocument $createsDocument * @param CreatesFiles $createsFile * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber + * @param UpdateGroupLogic $updateGroupLogic */ - public function __construct(FetchesCompany $fetchesCompany, CreatesTransaction $createsTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber) + public function __construct(FetchesCompany $fetchesCompany, CreatesTransaction $createsTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber, UpdateGroupLogic $updateGroupLogic) { $this->fetchesCompany = $fetchesCompany; $this->createsTransaction = $createsTransaction; $this->createsDocument = $createsDocument; $this->createsFile = $createsFile; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; + $this->updateGroupLogic = $updateGroupLogic; } public function logic(Request $request) : JsonResponse @@ -77,11 +82,6 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic $supplier = $this->fetchesCompany->execute(['id' => $request->route('id')]); - throw new MalformedRequestException('testing only'); - dd("pass through"); - - $service_charges = round(floatval(str_replace(',', '', $request->input('service_charges'))), 2); - $payments = $request->input('payments'); $amount = 0; @@ -92,8 +92,25 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic $original_amount += round($payment['original_amount'], 2); } + $service_charges = 0; + + if ($supplier->id === 4548 || $supplier->id === 2729) { + $amount = round(floatval(str_replace(',', '', $request->input('payment_total'))), 2); + } else { + $service_charges = round(floatval(str_replace(',', '', $request->input('service_charges'))), 2); + } + $rate = $original_amount / $amount; + if ($supplier->id === 4548 || $supplier->id === 2729) { + $request['rate'] = $rate; + $request['supplier_id'] = $supplier->id; + foreach ($payments as $payment) { + $request->route()->setParameter('id', $payment['id']); + $this->updateGroupLogic->execute($request); + } + } + $billGroup = new BillGroup(); $billGroup->issuer = $supplier->id; $billGroup->receiver = 1; diff --git a/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue b/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue index 206a9daf..2ba56062 100644 --- a/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue +++ b/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue @@ -32,7 +32,7 @@
Service Charges:
-
MYR {{service_charges}}
+
MYR {{parameters.service_charges}}
@@ -48,7 +48,7 @@
Payment Total:
-
MYR {{ payment_total }}
+
MYR {{ parameters.payment_total }}
MYR {{(Math.round((paymentTotal + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}}
@@ -56,11 +56,11 @@
-
+
- +
@@ -71,11 +71,11 @@
-
+
- +
@@ -110,8 +110,10 @@ }, data(){ return { - service_charges: '0', - payment_total: '0', + parameters: { + service_charges: '0', + payment_total: '0', + } } }, validations: { @@ -125,15 +127,13 @@ required: requiredIf(function () { return this.is1688Supplier; }), - minValue: minValue(1) + minValue: function(value) { + const amount = parseFloat(value.replaceAll(',', '')) + return this.is1688Supplier ? amount >= 1 : true; + } } } }, - // watch: { - // supplier(){ - // this.$v.$reset(); - // }, - // }, computed: { originalTotal(){ return this.payments.reduce(function (total, currentValue) { @@ -148,10 +148,10 @@ }, paymentTotal(){ - return this.total ? this.total + parseFloat(this.service_charges.replaceAll(',', '')) : 0; + return this.total ? this.total + parseFloat(this.parameters.service_charges.replaceAll(',', '')) : 0; }, billGroupCurrencyRate(){ - const paymentTotal = parseFloat(this.payment_total.replaceAll(',', '')); + const paymentTotal = parseFloat(this.parameters.payment_total.replaceAll(',', '')); return this.originalTotal && paymentTotal > 0 ? (this.originalTotal / paymentTotal).toFixed(5) : 1; }, is1688Supplier(){ @@ -160,27 +160,15 @@ }, methods: { submitForm(){ - if (this.is1688Supplier) { - this.parameters = { - payments: this.payments, - payment_total: parseFloat(this.payment_total.replaceAll(',', '')), - }; - } else { - this.parameters = { - payments: this.payments, - service_charges: this.service_charges, - }; - } - - console.log(this.parameters) - console.log(this.$v) - - console.log(this.validate) + this.parameters = { + payments: this.payments, + service_charges: this.is1688Supplier ? '0' : this.parameters.service_charges, + payment_total: this.is1688Supplier ? this.parameters.payment_total : '0', + }; this.submit(route('api.transaction.supplier.bill_group.create', this.supplier.id), 'post', 'transactionGroupsListPaymentSection', true, true) }, successHandler(){ - // this.$v.$reset(); this.refreshList(); this.$store.dispatch('toggleSection', {name: 'paymentInProgressBillGroupList', status: !this.$store.getters.isShowing('paymentInProgressBillGroupList')}); this.parameters = { @@ -188,12 +176,6 @@ service_charges: '0', payment_total: '0', }; - this.service_charges = '0'; - this.payment_total = '0'; - }, - errorHandler(error){ - console.log(error) - // this.$v.$reset(); }, }, mixins: [FormHandler] diff --git a/resources/assets/vue/components/general/forms/ValidationErrorComponent.vue b/resources/assets/vue/components/general/forms/ValidationErrorComponent.vue index d85e38a4..e1020c2e 100644 --- a/resources/assets/vue/components/general/forms/ValidationErrorComponent.vue +++ b/resources/assets/vue/components/general/forms/ValidationErrorComponent.vue @@ -1,10 +1,10 @@ From 25de31ea2e2bb0e653f5ad7091a635ce043d18c3 Mon Sep 17 00:00:00 2001 From: Sai0224 Date: Sat, 24 Feb 2024 12:15:26 +0800 Subject: [PATCH 05/58] supplier bill payment refund module --- .../Eloquent/Filters/BelongsToSupplierId.php | 24 ++++++ ...CreateBillGroupPaymentTransactionLogic.php | 6 ++ .../CreateSupplierBillGroupLogic.php | 57 ++++++++++++- .../ControllersLogic/DeleteBillGroupLogic.php | 17 +++- .../CalculatesBillGroupPaymentAmount.php | 4 +- .../Constants/TransactionType.php | 5 ++ .../ExpiredRefundedBookingCommand.php | 16 ++++ app/Http/Resources/BillGroupResource.php | 19 +++++ app/Http/Resources/TransactionResource.php | 7 +- app/Models/BillGroup.php | 8 ++ app/Models/BillGroupRefund.php | 27 +++++++ app/Models/Transaction.php | 14 ++++ ...222130_create_bill_group_refunds_table.php | 22 +++++ .../bookings/elements/BillGroupComponent.vue | 36 +++++++++ .../BillGroupPaymentSummaryComponent.vue | 13 ++- .../elements/SupplierRefundComponent.vue | 80 +++++++++++++++++++ .../TransactionGroupPaymentComponent.vue | 8 -- ...pplierWhiteFormPlaceOrderFormComponent.vue | 58 +++++++++++++- 18 files changed, 403 insertions(+), 18 deletions(-) create mode 100644 app/Classes/General/Eloquent/Filters/BelongsToSupplierId.php create mode 100644 app/Models/BillGroupRefund.php create mode 100644 database/migrations/2024_02_22_222130_create_bill_group_refunds_table.php create mode 100644 resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue diff --git a/app/Classes/General/Eloquent/Filters/BelongsToSupplierId.php b/app/Classes/General/Eloquent/Filters/BelongsToSupplierId.php new file mode 100644 index 00000000..63536412 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/BelongsToSupplierId.php @@ -0,0 +1,24 @@ +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/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php index 5c1ae1bf..92a6343d 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php @@ -68,6 +68,12 @@ class CreateBillGroupPaymentTransactionLogic extends AbstractControllerLogic $billGroupPayment = $this->calculatesBillGroupPaymentAmount->execute($billGroup); $outstanding_amount = $billGroupPayment['outstanding_amount']; + if ($billGroupPayment['outstanding_amount'] == 0) { + if ($billGroup->transactions()->whereIn('status', [ApprovalStatus::PENDING_SUBMISSION, ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->count() !== 0) { + throw new MalformedRequestException('Invalid bill group, payment transaction already exist.'); + } + } + $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 .'.'); diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php index f89af62c..b67db312 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php @@ -21,9 +21,11 @@ use App\Classes\Modules\Documents\Services\CreatesDocument; use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; use App\Classes\Modules\Transactions\Services\CreatesTransaction; +use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; use App\Classes\ValueObjects\Constants\PaymentMethodType; use App\Classes\ValueObjects\Constants\TransactionType; use App\Models\BillGroup; +use App\Models\Transaction; class CreateSupplierBillGroupLogic extends AbstractControllerLogic { @@ -57,6 +59,9 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic /** @var UpdateGroupLogic */ private $updateGroupLogic; + /** @var UpdatesTransactionStatus */ + private $updatesTransactionStatus; + /** * CreateSupplierBillGroupLogic constructor. @@ -66,8 +71,9 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic * @param CreatesFiles $createsFile * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber * @param UpdateGroupLogic $updateGroupLogic + * @param UpdatesTransactionStatus $updatesTransactionStatus */ - public function __construct(FetchesCompany $fetchesCompany, CreatesTransaction $createsTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber, UpdateGroupLogic $updateGroupLogic) + public function __construct(FetchesCompany $fetchesCompany, CreatesTransaction $createsTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber, UpdateGroupLogic $updateGroupLogic, UpdatesTransactionStatus $updatesTransactionStatus) { $this->fetchesCompany = $fetchesCompany; $this->createsTransaction = $createsTransaction; @@ -75,6 +81,7 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic $this->createsFile = $createsFile; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; $this->updateGroupLogic = $updateGroupLogic; + $this->updatesTransactionStatus = $updatesTransactionStatus; } public function logic(Request $request) : JsonResponse @@ -83,6 +90,19 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic $supplier = $this->fetchesCompany->execute(['id' => $request->route('id')]); $payments = $request->input('payments'); + $supplierRefunds = $request->input('supplierRefunds'); + + foreach ($supplierRefunds as $supplierRefund) { + $refund = Transaction::find($supplierRefund['id']); + + if ($refund->owner->transactions()->where('type', TransactionType::BILL)->first()->issuer !== $supplier->id) { + throw new MalformedRequestException('The supplier refund and bill group does not belongs to same supplier.'); + } + + if ($refund->type !== TransactionType::SUPPLIER_REFUND) { + throw new MalformedRequestException('Only transaction type supplier refund can be used for bill refund.'); + } + } $amount = 0; $original_amount = 0; @@ -129,6 +149,41 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic $billGroup->groups()->sync($payment['id'], false); } + //create bill refund + foreach ($supplierRefunds as $supplierRefund) { + $refund = Transaction::find($supplierRefund['id']); + $deductedRefunds = $refund->transactions()->where('type', TransactionType::BILL_REFUND)->where('status', ApprovalStatus::APPROVED)->get(); + $refundDeductableAmount = $refund->amount - $deductedRefunds->sum('amount'); + $refundDeductableOriginalAmount = $refund->original_amount - $deductedRefunds->sum('original_amount'); + + $amount -= round($refundDeductableAmount, 2); + $original_amount -= round($refundDeductableOriginalAmount, 2); + + if ($amount > 0) { + $deductedRefundAmount = $refundDeductableAmount; + $deductedRefundOriginalAmount = $refundDeductableOriginalAmount; + + $this->updatesTransactionStatus->execute($refund, ApprovalStatus::COMPLETED); + } + + if ($amount < 0) { + $deductedRefundAmount = $refundDeductableAmount + $amount; + $deductedRefundOriginalAmount = $refundDeductableOriginalAmount + $original_amount; + } + + $billNumber = $this->generatesTransactionBillNumber->execute('BRFD-'); + + $object = new TransactionObject($billNumber, TransactionType::BILL_REFUND, $supplier->id, 1, + 1, PaymentMethodType::CASH, + $deductedRefundAmount, $deductedRefundOriginalAmount, $refund->currency_id, + $refund->original_currency_id, $deductedRefundOriginalAmount / $deductedRefundAmount, + 0, 0, null, ApprovalStatus::APPROVED, []); + + $transaction = $this->createsTransaction->execute($refund, $object); + + $billGroup->billRefunds()->sync($transaction->id, false); + } + return $this->response([]); } } diff --git a/app/Classes/Modules/Transactions/ControllersLogic/DeleteBillGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/DeleteBillGroupLogic.php index 56464409..1122c111 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/DeleteBillGroupLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/DeleteBillGroupLogic.php @@ -5,6 +5,8 @@ namespace App\Classes\Modules\Transactions\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Transactions\Services\FetchesBillGroup; use App\Classes\Modules\Transactions\Services\DeletesTransaction; +use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; +use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Http\Resources\BillGroupResource; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -28,15 +30,20 @@ class DeleteBillGroupLogic extends AbstractControllerLogic /** @var DeletesTransaction */ private $deletesTransaction; + /** @var UpdatesTransactionStatus */ + private $updatesTransactionStatus; + /** * DeleteBillGroupLogic constructor. * @param FetchesBillGroup $fetchesBillGroup * @param DeletesTransaction $deletesTransaction + * @param UpdatesTransactionStatus $updatesTransactionStatus */ - public function __construct(FetchesBillGroup $fetchesBillGroup, DeletesTransaction $deletesTransaction) + public function __construct(FetchesBillGroup $fetchesBillGroup, DeletesTransaction $deletesTransaction, UpdatesTransactionStatus $updatesTransactionStatus) { $this->fetchesBillGroup = $fetchesBillGroup; $this->deletesTransaction = $deletesTransaction; + $this->updatesTransactionStatus = $updatesTransactionStatus; } /** @@ -59,7 +66,15 @@ class DeleteBillGroupLogic extends AbstractControllerLogic foreach($groups as $group) { $billGroup->groups()->detach($group->id); } + + $billRefunds = $billGroup->billRefunds()->get(); + foreach($billRefunds as $billRefund) { + $billGroup->billRefunds()->detach($billRefund->id); + $this->deletesTransaction->execute($billRefund); + $this->updatesTransactionStatus->execute($billRefund->owner, ApprovalStatus::APPROVED); + } + $billGroup->delete(); return $this->resourceResponse(new BillGroupResource($billGroup)); diff --git a/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php b/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php index 812f8a3c..1a130b41 100644 --- a/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php +++ b/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php @@ -8,11 +8,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')); - $outstanding_amount = $billGroup->amount - $paid_amount - $floating_amount + $billGroup->service_charge; + $outstanding_amount = $billGroup->amount - $bill_refund_amount - $paid_amount - $floating_amount + $billGroup->service_charge; return [ + 'bill_refund_amount' => $bill_refund_amount, 'floating_amount' => $floating_amount, 'paid_amount' => $paid_amount, 'outstanding_amount' => $outstanding_amount, diff --git a/app/Classes/ValueObjects/Constants/TransactionType.php b/app/Classes/ValueObjects/Constants/TransactionType.php index fbab3119..e14930b0 100644 --- a/app/Classes/ValueObjects/Constants/TransactionType.php +++ b/app/Classes/ValueObjects/Constants/TransactionType.php @@ -33,4 +33,9 @@ final class TransactionType { public const CASH_BACK = 13; public const SUPPLIER_PAYMENT = 14; + + public const SUPPLIER_REFUND = 15; + + public const BILL_REFUND = 16; + } diff --git a/app/Console/Commands/ExpiredRefundedBookingCommand.php b/app/Console/Commands/ExpiredRefundedBookingCommand.php index db7e00a7..0fcbd87b 100644 --- a/app/Console/Commands/ExpiredRefundedBookingCommand.php +++ b/app/Console/Commands/ExpiredRefundedBookingCommand.php @@ -151,6 +151,22 @@ class ExpiredRefundedBookingCommand extends Command $transaction = $this->createsTransaction->execute($bookingPayment, $object); } + + if ($bookingInWhiteForm) { + $refund = $bookingPayment->transactions()->supplierRefunds()->where('amount', $transaction->amount)->where('status', ApprovalStatus::APPROVED)->first(); + + if (!$refund) { + $billNumber = $this->generatesTransactionBillNumber->execute('SRFD-'); + + $object = new TransactionObject($billNumber, TransactionType::SUPPLIER_REFUND, 1, $booking->company->id, + 1, PaymentMethodType::CASH, + $transaction->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); + } + } } else { Log::info("Credit note transaction id: {$transaction->id}, booking marking not found, the payment reference is: {$transaction->payment_reference}"); } diff --git a/app/Http/Resources/BillGroupResource.php b/app/Http/Resources/BillGroupResource.php index 6f61aeb7..23c8050e 100644 --- a/app/Http/Resources/BillGroupResource.php +++ b/app/Http/Resources/BillGroupResource.php @@ -18,6 +18,7 @@ class BillGroupResource extends JsonResource public function toArray($request) { $billGroupPayment = (App()->make(CalculatesBillGroupPaymentAmount::class))->execute($this->resource); + $bill_refund_amount = $billGroupPayment['bill_refund_amount']; $floating_amount = $billGroupPayment['floating_amount']; $paid_amount = $billGroupPayment['paid_amount']; $outstanding_amount = $billGroupPayment['outstanding_amount']; @@ -37,6 +38,7 @@ class BillGroupResource extends JsonResource 'currency_rate' => (float) $this->currency_rate, 'status' => $this->status, 'groups' => GroupResource::collection($this->groups), + 'bill_refund_amount' => $bill_refund_amount, 'floating_amount' => $floating_amount, 'paid_amount' => $paid_amount, 'outstanding_amount' => $outstanding_amount, @@ -58,6 +60,23 @@ class BillGroupResource extends JsonResource 'updated_at' => Carbon::parse($transaction->updated_at)->format('d-m-Y h:i:s A'), ]; }), + 'bill_refunds' => $this->billRefunds->map(function ($transaction) { + return [ + 'id' => $transaction->id, + 'type' => (int) $transaction->type, + 'bill_no' => $transaction->bill_no, + 'payment_method' => (float) $transaction->payment_method, + 'amount' => (double) $transaction->amount, + 'original_amount' => (double) $transaction->original_amount, + 'currency' => new CurrencyResource($transaction->currency), + 'original_currency' => new CurrencyResource($transaction->original_currency), + 'service_charge' => (double) $transaction->service_charge, + 'tax' => (double) $transaction->tax, + 'status' => (int) $transaction->status, + 'statusText' => ApprovalStatus::APPROVAL_STATUS_ID[(int) $transaction->status], + 'updated_at' => Carbon::parse($transaction->updated_at)->format('d-m-Y h:i:s A'), + ]; + }), ]; } } diff --git a/app/Http/Resources/TransactionResource.php b/app/Http/Resources/TransactionResource.php index 09967f4c..b431c854 100644 --- a/app/Http/Resources/TransactionResource.php +++ b/app/Http/Resources/TransactionResource.php @@ -3,6 +3,7 @@ namespace App\Http\Resources; use App\Classes\Modules\Bookings\Services\CalculatesBookingRefundAmount; +use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\TransactionType; use App\Models\Booking; use Carbon\Carbon; @@ -19,7 +20,7 @@ class TransactionResource extends JsonResource public function toArray($request) { - $booking = in_array((int)$this->type, [TransactionType::BILL, TransactionType::REFUND])? $this->owner->owner : $this->owner; + $booking = in_array((int)$this->type, [TransactionType::BILL, TransactionType::REFUND, TransactionType::SUPPLIER_REFUND])? $this->owner->owner : $this->owner; $days = $this->created_at->endOfDay()->addWeekdays($booking->service_id === 3 ? 3 : 1); return [ @@ -32,8 +33,8 @@ class TransactionResource extends JsonResource 'recipient_bank_account' => new BankResource($booking->bank), 'issuer_name' => $this->issuerCompany->name, 'issuer_id' => $this->issuerCompany->id, - 'amount' => (double) $this->amount, - 'original_amount' => (double) $this->original_amount, + 'amount' => (double) ($this->type === TransactionType::SUPPLIER_REFUND ? $this->amount - $this->transactions()->where('type', TransactionType::BILL_REFUND)->where('status', ApprovalStatus::APPROVED)->sum('amount') : $this->amount), + 'original_amount' => (double) ($this->type === TransactionType::SUPPLIER_REFUND ? $this->original_amount - $this->transactions()->where('type', TransactionType::BILL_REFUND)->where('status', ApprovalStatus::APPROVED)->sum('original_amount') : $this->original_amount), 'currency' => new CurrencyResource($this->currency), 'original_currency' => new CurrencyResource($this->original_currency), 'service_charge' => (double) $this->service_charge, diff --git a/app/Models/BillGroup.php b/app/Models/BillGroup.php index 6986ee52..9270d8e8 100644 --- a/app/Models/BillGroup.php +++ b/app/Models/BillGroup.php @@ -29,6 +29,14 @@ class BillGroup extends Model implements Documentable, Transactionable return $this->MorphMany(Transaction::class, 'owner'); } + use HasRelationships; + use \Staudenmeir\EloquentHasManyDeep\HasTableAlias; + + public function billRefunds() + { + return $this->belongsToMany(Transaction::class, BillGroupRefund::class); + } + /** * @return MorphMany */ diff --git a/app/Models/BillGroupRefund.php b/app/Models/BillGroupRefund.php new file mode 100644 index 00000000..aa430873 --- /dev/null +++ b/app/Models/BillGroupRefund.php @@ -0,0 +1,27 @@ +BelongsTo(BillGroup::class, 'bill_group_id', 'id'); + } + + /** + * @return BelongsTo + */ + public function transaction(): BelongsTo + { + return $this->BelongsTo(Transaction::class, 'transaction_id', 'id'); + } +} diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 185fdb36..4161632b 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -186,6 +186,20 @@ class Transaction extends AbstractModel implements Documentable, Transactionable return $query->where('type', TransactionType::REFUND); } + /** + * @param Builder $query + * @param string $payment_reference + * @return Builder + */ + public function scopeSupplierRefunds(Builder $query, ?string $payment_reference = NULL) + { + if($payment_reference){ + $query->where('payment_reference', $payment_reference); + } + + return $query->where('type', TransactionType::SUPPLIER_REFUND); + } + /** * @param Builder $query diff --git a/database/migrations/2024_02_22_222130_create_bill_group_refunds_table.php b/database/migrations/2024_02_22_222130_create_bill_group_refunds_table.php new file mode 100644 index 00000000..f7b278b1 --- /dev/null +++ b/database/migrations/2024_02_22_222130_create_bill_group_refunds_table.php @@ -0,0 +1,22 @@ +id(); + $table->foreignId('bill_group_id')->unsigned()->on('bill_groups'); + $table->foreignId('transaction_id')->unsigned()->on('transactions'); + }); + } + + public function down() + { + Schema::dropIfExists('bill_group_refunds'); + } +} diff --git a/resources/assets/vue/components/bookings/elements/BillGroupComponent.vue b/resources/assets/vue/components/bookings/elements/BillGroupComponent.vue index 42727055..e93eb1ad 100644 --- a/resources/assets/vue/components/bookings/elements/BillGroupComponent.vue +++ b/resources/assets/vue/components/bookings/elements/BillGroupComponent.vue @@ -58,6 +58,42 @@
+
+
+
Bill Refunds
+
+
+
+
Date
+
+ {{refund.updated_at}} +
+
+
+
Reference
+
+ {{refund.bill_no}} +
+
+
+
Amount
+
+ {{ refund.currency.short_code }} {{ formatAmount(refund.amount) }} +
+
+
+
Status
+
+ {{ refund.statusText }} +
+
+
+
+
+
No Selected Refunds
+
+
+
Payment History
diff --git a/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue b/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue index 9ad4f1d3..c826f154 100644 --- a/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue +++ b/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue @@ -36,6 +36,17 @@
MYR 0.00
+
+
+
Bill Refund Total:
+
+
+
- {{selectedBillGroup.currency.short_code}} {{formatAmount(selectedBillGroup.bill_refund_amount)}}
+
+
+
MYR 0.00
+
+
Paid Total:
@@ -69,7 +80,7 @@
MYR 0.00
-
+
diff --git a/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue b/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue new file mode 100644 index 00000000..6626ce56 --- /dev/null +++ b/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue @@ -0,0 +1,80 @@ + + + diff --git a/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue b/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue index b86cdce7..7fdd579f 100644 --- a/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue +++ b/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue @@ -117,14 +117,6 @@ this.active = this.payments.some(payment => payment.id === this.item.id); }, methods: { - deleteGroupTransaction() { - this.isLoading = true; - this.submit(this.route('api.transaction.group.delete', this.item.id), 'delete', this.section, true, true); - }, - updateDo() { - this.isLoading = true; - this.submit(this.route('api.transaction.group.bulk.po'), 'post', this.section, true, true); - }, activate(){ this.active = !this.active; this.$emit('input', this.item) diff --git a/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue b/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue index 2ba56062..5b28e017 100644 --- a/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue +++ b/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue @@ -16,7 +16,7 @@
Order Total:
-
{{ this.payments.length > 0 ? this.payments[0].original_currency.short_code : "CNY"}} {{(Math.round((this.originalTotal + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}}
+
{{ this.payments.length > 0 ? this.payments[0].original_currency.short_code : "CNY"}} {{ formatNumber(this.originalTotal) }}
@@ -24,7 +24,7 @@
-
MYR {{(Math.round((this.total + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}}
+
MYR {{ formatNumber(this.total) }}
@@ -43,6 +43,17 @@
{{ billGroupCurrencyRate }}
+
+
+
Bill Refund Total:
+
+
+
- CNY {{ parameters.payment_total }}
+
+
+
- MYR {{ formatNumber(refundTotal > paymentTotal ? paymentTotal : refundTotal) }}
+
+
Payment Total:
@@ -51,7 +62,7 @@
MYR {{ parameters.payment_total }}
-
MYR {{(Math.round((paymentTotal + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}}
+
MYR {{ formatNumber(paymentTotal) }}
@@ -84,6 +95,18 @@ +
+
+
+ Supplier Refund +
+ + + +
+
@@ -108,8 +131,16 @@ required: true }, }, + watch: { + 'supplier': function() { + this.supplierRefundListKey ++; + this.supplierRefunds = [] + }, + }, data(){ return { + supplierRefunds: [], + supplierRefundListKey: 1, parameters: { service_charges: '0', payment_total: '0', @@ -150,6 +181,16 @@ paymentTotal(){ return this.total ? this.total + parseFloat(this.parameters.service_charges.replaceAll(',', '')) : 0; }, + refundOriginalTotal(){ + return this.supplierRefunds.reduce(function (total, currentValue) { + return total + currentValue.original_amount; + }, 0); + }, + refundTotal(){ + return this.supplierRefunds.reduce(function (total, currentValue) { + return total + currentValue.amount; + }, 0); + }, billGroupCurrencyRate(){ const paymentTotal = parseFloat(this.parameters.payment_total.replaceAll(',', '')); return this.originalTotal && paymentTotal > 0 ? (this.originalTotal / paymentTotal).toFixed(5) : 1; @@ -162,6 +203,9 @@ submitForm(){ this.parameters = { payments: this.payments, + supplierRefunds: this.supplierRefunds.sort((a, b) => { + return a.amount - b.amount; + }), service_charges: this.is1688Supplier ? '0' : this.parameters.service_charges, payment_total: this.is1688Supplier ? this.parameters.payment_total : '0', }; @@ -170,6 +214,8 @@ }, successHandler(){ this.refreshList(); + this.supplierRefunds = [] + this.supplierRefundListKey ++; this.$store.dispatch('toggleSection', {name: 'paymentInProgressBillGroupList', status: !this.$store.getters.isShowing('paymentInProgressBillGroupList')}); this.parameters = { payments: [], @@ -177,6 +223,12 @@ payment_total: '0', }; }, + refundOrder(supplierRefund){ + this.supplierRefunds.some(item => item.id === supplierRefund.id) ? this.supplierRefunds = this.supplierRefunds.filter(item => item.id !== supplierRefund.id) : this.supplierRefunds.push(supplierRefund); + }, + formatNumber(value) { + return (Math.round((value + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + } }, mixins: [FormHandler] } From 767d6c84fee67eb6065e5d2ee931c24d76ce98f0 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Sun, 25 Feb 2024 20:43:01 +0800 Subject: [PATCH 06/58] update to bill refund for 1688 supplier --- .../CreateSupplierBillGroupLogic.php | 4 +++- .../elements/SupplierRefundComponent.vue | 7 ++++++ ...pplierWhiteFormPlaceOrderFormComponent.vue | 23 ++++++++++++++----- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php index b67db312..ef0560e7 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php @@ -150,7 +150,9 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic } //create bill refund - foreach ($supplierRefunds as $supplierRefund) { + $amount += $service_charges; + + foreach ($supplierRefunds as $supplierRefund) { $refund = Transaction::find($supplierRefund['id']); $deductedRefunds = $refund->transactions()->where('type', TransactionType::BILL_REFUND)->where('status', ApprovalStatus::APPROVED)->get(); $refundDeductableAmount = $refund->amount - $deductedRefunds->sum('amount'); diff --git a/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue b/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue index 6626ce56..1a42fe6c 100644 --- a/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue +++ b/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue @@ -19,6 +19,9 @@
Amount
+
{{item.currency.short_code}} {{((Math.round(( item.amount + Number.EPSILON) * 100) / 100)).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}}
@@ -39,6 +42,10 @@ type: String, required: true }, + is1688Supplier:{ + type: Boolean, + required: true + }, payments:{ type: Array, required: true diff --git a/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue b/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue index 5b28e017..9b7f8eb1 100644 --- a/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue +++ b/resources/assets/vue/components/bookings/forms/SupplierWhiteFormPlaceOrderFormComponent.vue @@ -48,10 +48,10 @@
Bill Refund Total:
-
- CNY {{ parameters.payment_total }}
+
- {{ this.supplierRefunds.length > 0 ? this.supplierRefunds[0].currency.short_code : 'MYR' }} {{ this.inputPaymentTotal > 0 ? refundTotal > this.inputPaymentTotal ? this.inputPaymentTotal : formatNumber(refundTotal) : '0.00' }}
-
- MYR {{ formatNumber(refundTotal > paymentTotal ? paymentTotal : refundTotal) }}
+
- {{ this.supplierRefunds[0].currency.short_code }} {{ formatNumber(refundTotal > paymentTotal ? paymentTotal : refundTotal) }}
@@ -59,10 +59,18 @@
Payment Total:
-
MYR {{ parameters.payment_total }}
+
MYR {{ formatNumber(this.inputPaymentTotal) }}
-
MYR {{ formatNumber(paymentTotal) }}
+
MYR {{ formatNumber(paymentTotal - refundTotal > 0 ? (paymentTotal - refundTotal) : 0) }}
+
+ +
+
+
Payment Total After Refund:
+
+
+
{{ this.supplierRefunds.length > 0 ? this.supplierRefunds[0].currency.short_code : 'MYR' }} {{ refundTotal > this.inputPaymentTotal ? '0.00' : formatNumber(this.inputPaymentTotal - refundTotal) }}
@@ -102,7 +110,7 @@ @@ -166,6 +174,9 @@ } }, computed: { + inputPaymentTotal(){ + return parseFloat(this.parameters.payment_total.replaceAll(',', '')); + }, originalTotal(){ return this.payments.reduce(function (total, currentValue) { return total + currentValue.original_amount; @@ -192,7 +203,7 @@ }, 0); }, billGroupCurrencyRate(){ - const paymentTotal = parseFloat(this.parameters.payment_total.replaceAll(',', '')); + const paymentTotal = this.inputPaymentTotal; return this.originalTotal && paymentTotal > 0 ? (this.originalTotal / paymentTotal).toFixed(5) : 1; }, is1688Supplier(){ From 5fd2f6ef7f709a5e676bfd8ecfed9660a6dd0784 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Wed, 28 Feb 2024 01:34:39 +0800 Subject: [PATCH 07/58] -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 08/58] 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 09/58] 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 73819e967e34f00996b8a069e06010d71439dbd5 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Wed, 6 Mar 2024 20:56:24 +0800 Subject: [PATCH 10/58] 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 +
+
+
+
+ +
From 4d501c8b7c3a27a9104a6947ccd6ca236bda3c90 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Thu, 7 Mar 2024 17:21:18 +0800 Subject: [PATCH 11/58] update log info --- .../ExpiredRefundedBookingCommand.php | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/Console/Commands/ExpiredRefundedBookingCommand.php b/app/Console/Commands/ExpiredRefundedBookingCommand.php index 87f44f81..92900a71 100644 --- a/app/Console/Commands/ExpiredRefundedBookingCommand.php +++ b/app/Console/Commands/ExpiredRefundedBookingCommand.php @@ -95,7 +95,7 @@ class ExpiredRefundedBookingCommand extends Command if (!$bookingPayment) { $bookingPaymentCount = $booking->transactions()->payments()->count(); if ($bookingPaymentCount > 1) { - Log::info("Credit note transaction id: {$transaction->id}, there are {$bookingPaymentCount} payment for the booking."); + $this->info("Credit note transaction id: {$transaction->id}, there are {$bookingPaymentCount} payment for the booking."); foreach ($booking->transactions()->payments()->get() as $bp) { if ($transaction->amount - $bp->amount < 0.01) { $bookingPayment = $bp; @@ -111,7 +111,7 @@ class ExpiredRefundedBookingCommand extends Command 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}"); + $this->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 @@ -126,11 +126,11 @@ class ExpiredRefundedBookingCommand extends Command //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}"); + $this->info("Credit note transaction id: {$transaction->id} is fully refunded, the refunded amount was {$transaction->amount} the payment reference is: {$transaction->payment_reference}"); + // $this->info("Credit note transaction id: {$transaction->id}, Rejected Booking Transaction Payment id: {$bookingPayment->id}, the payment amount was {$bookingPayment->amount}"); + // $this->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}"); + $this->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(); @@ -138,7 +138,7 @@ class ExpiredRefundedBookingCommand extends Command $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"); + $this->info("Credit note transaction id: {$transaction->id}, already created same amount of refund transaction for same booking payment transaction"); } if (!$refund) { @@ -157,7 +157,7 @@ class ExpiredRefundedBookingCommand extends Command $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}"); + $this->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); @@ -181,16 +181,16 @@ class ExpiredRefundedBookingCommand extends Command // $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"); + // $this->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}"); + $this->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}"); + $this->info("Credit note transaction id: {$transaction->id}, booking marking not found, the payment reference is: {$transaction->payment_reference}"); } } else { - Log::info("Credit note transaction id: {$transaction->id} does not have booking marking, the payment reference is: {$transaction->payment_reference}"); + $this->info("Credit note transaction id: {$transaction->id} does not have booking marking, the payment reference is: {$transaction->payment_reference}"); } } } From 2d34b157f59a2256cd7623770214634f26cfc6f5 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Mon, 11 Mar 2024 01:00:38 +0800 Subject: [PATCH 12/58] update refund section to have 2 tabs, where each tab categorized by full and partial refund --- .../views/pages/dashboards/admin.blade.php | 49 ++++++++++++------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/resources/views/pages/dashboards/admin.blade.php b/resources/views/pages/dashboards/admin.blade.php index 7ccdb219..ac5b1d08 100644 --- a/resources/views/pages/dashboards/admin.blade.php +++ b/resources/views/pages/dashboards/admin.blade.php @@ -27,7 +27,7 @@
-
+
-
Refunds
+
Pre-Refunds
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
Post-Refunds
@@ -79,15 +98,10 @@
-
+
- Pre-Refund -
-
-
-
Fully Refund
@@ -100,8 +114,8 @@
-
-
+
+
Partial Refund
@@ -114,13 +128,12 @@
-
+
+
+
+
+
- Post-Refund -
-
-
-
Fully Refund
@@ -133,8 +146,8 @@
-
-
+
+
Partial Refund
From a1bbc69ec51c87695d7da30eb34bf9c91d4f4d37 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Mon, 11 Mar 2024 22:13:01 +0800 Subject: [PATCH 13/58] -update payment amount under payment history section on booking page -export approved refund payment --- .../elements/PaymentHistoryComponent.vue | 16 +++-- routes/web.php | 59 +++++++++++++++++++ 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue index 68213ea2..f3b3fb38 100644 --- a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue +++ b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue @@ -18,13 +18,13 @@
Payment Amount
- {{item.original_currency.short_code}} {{(Math.round((item.original_amount + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}} + {{item.original_currency.short_code}} {{(Math.round((item.original_amount - item.refunded_amount + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}}
Refunded Amount
- {{item.currency.short_code}} {{(Math.round((totalConvertRefunds + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}} + {{item.original_currency.short_code}} {{(Math.round((item.refunded_amount + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}}
@@ -68,15 +68,13 @@
Payment Amount
- {{item.original_currency.short_code}} {{(Math.round((item.original_amount + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}} + {{item.original_currency.short_code}} {{(Math.round((item.original_amount - item.refunded_amount + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}}
-
-
-
Refunded Amount
-
-
-
{{item.original_currency.short_code}} {{(Math.round((totalRefunds + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}}
+
+
Refunded Amount
+
+ {{item.original_currency.short_code}} {{(Math.round((totalRefunds + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}}
diff --git a/routes/web.php b/routes/web.php index bc613043..2370a7fc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -433,6 +433,65 @@ Route::get('/pending_orders', function(){ echo ''; })->name('orders.pending'); +Route::get('/approve_refunds', function(){ + $payments = Transaction::where('type', TransactionType::PAYMENT)->where('owner_type', Booking::class)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED, ApprovalStatus::REFUNDED]) + ->whereHas('transactions', function ($query) { + return $query->where('type', TransactionType::REFUND)->where('status', ApprovalStatus::APPROVED); + }) + ->orderBy('updated_at', 'DESC') + ->get(); + + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + foreach ($payments as $index => $payment){ + $booking = $payment->owner; + $original_refunds = floatval((App()->make(CalculatesBookingRefundAmount::class))->calculateRefundAmount($payment, $booking->fix_currency_id)); + $refunds = $original_refunds / $payment->currency_rate; + if(!$booking instanceof Booking){ + dd($payment); + } + $bankType = str::length($booking->bank->holder_name) > 4 ? 'Company' : 'Personal'; + + if (!preg_match('/[^A-Za-z0-9]/', $booking->bank->holder_name)) + { + $bankType = str_word_count($booking->bank->holder_name) > 4 ? 'Company' : 'Personal'; + } + + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + echo '
No.Updated AtMarkingPayment MethodRefunded AmountCompany ReferenceRefunded Original AmountServiceLast Updated AtBank TypeBank Holder Name
'.($index + 1).'.'.$payment->updated_at->format('d-M-y').''.$booking->marking.''.\App\Classes\ValueObjects\Constants\PaymentMethodType::PAYMENT_METHODS_ID[$payment->payment_method].''.$payment->currency->short_code.''.number_format($refunds, 5, '.', '').''.$booking->company->reference.''.$payment->original_currency->short_code.''.number_format($original_refunds, 5, '.', '').''.$booking->service->name.''.$payment->updated_at->diffForHumans().''.$bankType.''.$booking->bank->holder_name.'
'; +})->name('orders.refunds'); + Route::get('/group/text/{id}', function($id){ $group = \App\Models\Group::where('id', $id)->first(); From 3cd2e244619ae33e537f9cc842c9194defc7e844 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Mon, 11 Mar 2024 22:18:10 +0800 Subject: [PATCH 14/58] add export refunded transactions button --- resources/views/pages/dashboards/admin.blade.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/resources/views/pages/dashboards/admin.blade.php b/resources/views/pages/dashboards/admin.blade.php index ac5b1d08..25a2500e 100644 --- a/resources/views/pages/dashboards/admin.blade.php +++ b/resources/views/pages/dashboards/admin.blade.php @@ -104,6 +104,11 @@
Fully Refund
+
From b63cea4c09ced24e91cc21185c217c65d433d16e Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Tue, 12 Mar 2024 12:03:49 +0800 Subject: [PATCH 15/58] update purchase order amount and status upon refund approval --- .../UpdateRefundTransactionStatusLogic.php | 11 +++++++++-- .../bookings/forms/PurchaseOrderFormComponent.vue | 10 +++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php index 02107a77..91b82f16 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php @@ -15,7 +15,7 @@ use Illuminate\Http\Request; use App\Classes\Modules\Wallets\Processors\CreditWalletProcessor; use App\Classes\Modules\Bookings\Services\CalculatesBookingPayableAmount; use App\Classes\Modules\Bookings\Services\CalculatesBookingRefundAmount; - +use App\Classes\ValueObjects\Constants\TransactionType; class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic { @@ -91,15 +91,22 @@ class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic $reference = $refundTransaction->amount == $paymentTransaction->amount ? 'Fully Refund for Ref. ' . $booking->marking : 'Partially Refund for Ref. ' . $booking->marking; + $refundAmount = $this->calculatesBookingRefundAmount->calculateRefundAmount($paymentTransaction, $booking->fix_currency_id); + if ($refundTransaction->status == ApprovalStatus::APPROVED) { $this->creditWalletProcessor->execute($booking->company, $refundTransaction->type, $refundTransaction->amount, $reference); + $po_transaction = $booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->first(); + + if ($po_transaction) { + $this->updatesTransactionStatus->execute($po_transaction, (float) number_format($po_transaction->amount, 2, '.', '') === (float) number_format((float)$booking->fix_amount - $refundAmount, 2, '.', '') ? ApprovalStatus::PENDING_VERIFICATION : ApprovalStatus::PENDING_SUBMISSION); + } } if ($supplierRefundTransaction) { $this->updatesTransactionStatus->execute($supplierRefundTransaction, $request->route('status')); } - $paidAmount = $paymentTransaction->original_amount - $this->calculatesBookingRefundAmount->calculateRefundAmount($paymentTransaction, $booking->fix_currency_id); + $paidAmount = $paymentTransaction->original_amount - $refundAmount; if (!$paidAmount > 0) { $this->updatesTransactionStatus->execute($paymentTransaction, ApprovalStatus::REFUNDED); } diff --git a/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue b/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue index 9b8045f9..8df6cfe3 100644 --- a/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue +++ b/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue @@ -117,7 +117,7 @@
-
+
-
{{(Math.round(( poTotal + Number.EPSILON) * 1000) / 1000).toFixed(3)}}/{{(Math.round((data.amount + Number.EPSILON) * 1000) / 1000).toFixed(3)}} {{data.fixed_currency.short_code}}
+
{{(Math.round(( poTotal + Number.EPSILON) * 1000) / 1000).toFixed(3)}}/{{(Math.round((data.amount - data.payment_history[0].refunded_amount + Number.EPSILON) * 1000) / 1000).toFixed(3)}} {{data.fixed_currency.short_code}}
- +
-
+
** you purchase order will be saved but wont be approved until your purchase order's total matches your transfer order's total.
@@ -285,7 +285,7 @@ this.submit(route('api.transaction.po.import', this.data.id), 'post', this.section, true, true); }, successHandler(){ - if((Math.round((this.poTotal + Number.EPSILON) * 1000) / 1000).toFixed(3) === (Math.round((this.data.amount + Number.EPSILON) * 1000) / 1000).toFixed(3)){ + if((Math.round((this.poTotal + Number.EPSILON) * 1000) / 1000).toFixed(3) === (Math.round((this.data.amount - data.payment_history[0].refunded_amount + Number.EPSILON) * 1000) / 1000).toFixed(3)){ this.submitted = true; } this.updateList() From 81c81e3b48ac9d7cbaf4c8cfff916622bebc9b23 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Fri, 15 Mar 2024 10:34:21 +0800 Subject: [PATCH 16/58] -show remark and categorized in export refund booking -make refund function available for internal only, not for customer --- .../CreateBookingRefundLogic.php | 4 ++ .../CalculatesBookingRefundAmount.php | 2 +- .../forms/PurchaseOrderFormComponent.vue | 10 ++--- .../views/pages/dashboards/admin.blade.php | 14 ++++++- routes/web.php | 39 +++++++++++++++---- 5 files changed, 54 insertions(+), 15 deletions(-) diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php index 75ad76a1..062db191 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php @@ -73,6 +73,10 @@ class CreateBookingRefundLogic extends AbstractControllerLogic public function logic(Request $request) : JsonResponse { + if(auth()->user()->type === 3) { + throw new MalformedRequestException('You do not have the permission to refund the order.'); + } + $transaction = $this->fetchesTransaction->execute(['id' => $request->route('payment_id')]); $booking = $transaction->owner; diff --git a/app/Classes/Modules/Bookings/Services/CalculatesBookingRefundAmount.php b/app/Classes/Modules/Bookings/Services/CalculatesBookingRefundAmount.php index 239545af..8792aaa6 100644 --- a/app/Classes/Modules/Bookings/Services/CalculatesBookingRefundAmount.php +++ b/app/Classes/Modules/Bookings/Services/CalculatesBookingRefundAmount.php @@ -9,7 +9,7 @@ class CalculatesBookingRefundAmount { public function execute(Booking $booking, int $type, ?string $payment_reference = null): float { - $refundAmounts = $booking->transactions()->payments()->get()->map(function ($payment) use ($type) { + $refundAmounts = $booking->transactions()->payments()->complete()->get()->map(function ($payment) use ($type) { return $this->calculateRefundAmount($payment, $type); }); diff --git a/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue b/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue index 8df6cfe3..3e0c9ca6 100644 --- a/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue +++ b/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue @@ -117,7 +117,7 @@
-
+
-
{{(Math.round(( poTotal + Number.EPSILON) * 1000) / 1000).toFixed(3)}}/{{(Math.round((data.amount - data.payment_history[0].refunded_amount + Number.EPSILON) * 1000) / 1000).toFixed(3)}} {{data.fixed_currency.short_code}}
+
{{(Math.round(( poTotal + Number.EPSILON) * 1000) / 1000).toFixed(3)}}/{{(Math.round((data.paid_amount + Number.EPSILON) * 1000) / 1000).toFixed(3)}} {{data.fixed_currency.short_code}}
- +
-
+
** you purchase order will be saved but wont be approved until your purchase order's total matches your transfer order's total.
@@ -285,7 +285,7 @@ this.submit(route('api.transaction.po.import', this.data.id), 'post', this.section, true, true); }, successHandler(){ - if((Math.round((this.poTotal + Number.EPSILON) * 1000) / 1000).toFixed(3) === (Math.round((this.data.amount - data.payment_history[0].refunded_amount + Number.EPSILON) * 1000) / 1000).toFixed(3)){ + if((Math.round((this.poTotal + Number.EPSILON) * 1000) / 1000).toFixed(3) === (Math.round((this.data.paid_amount + Number.EPSILON) * 1000) / 1000).toFixed(3)){ this.submitted = true; } this.updateList() diff --git a/resources/views/pages/dashboards/admin.blade.php b/resources/views/pages/dashboards/admin.blade.php index 25a2500e..ac41424c 100644 --- a/resources/views/pages/dashboards/admin.blade.php +++ b/resources/views/pages/dashboards/admin.blade.php @@ -105,7 +105,7 @@ Fully Refund
@@ -123,6 +123,11 @@
Partial Refund
+
@@ -142,7 +147,7 @@ Fully Refund
@@ -160,6 +165,11 @@
Partial Refund
+
diff --git a/routes/web.php b/routes/web.php index 2370a7fc..ade589a5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -433,13 +433,27 @@ Route::get('/pending_orders', function(){ echo ''; })->name('orders.pending'); -Route::get('/approve_refunds', function(){ +Route::get('/approve_refunds', function(Request $request){ + $type = $request->query('type'); $payments = Transaction::where('type', TransactionType::PAYMENT)->where('owner_type', Booking::class)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED, ApprovalStatus::REFUNDED]) - ->whereHas('transactions', function ($query) { - return $query->where('type', TransactionType::REFUND)->where('status', ApprovalStatus::APPROVED); - }) - ->orderBy('updated_at', 'DESC') - ->get(); + ->whereHas('transactions', function ($query) use ($type) { + $query->where('type', TransactionType::REFUND)->where('status', ApprovalStatus::APPROVED); + if (str_contains($type, 'partial')) { + $query->whereColumn('original_amount', '!=','transactions.original_amount'); + } else { + $query->whereColumn('original_amount', 'transactions.original_amount'); + } + }); + + if (str_contains($type, 'post')) { + $payments->whereHas('transactions', function($query) { + $query->where('type', TransactionType::SUPPLIER_REFUND); + }); + } else { + $payments->whereDoesntHave('transactions', function($query) { + $query->where('type', TransactionType::SUPPLIER_REFUND); + }); + } echo ''; echo ''; @@ -452,12 +466,13 @@ Route::get('/approve_refunds', function(){ echo ''; echo ''; echo ''; + echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; - foreach ($payments as $index => $payment){ + foreach ($payments->orderBy('updated_at', 'DESC')->get() as $index => $payment){ $booking = $payment->owner; $original_refunds = floatval((App()->make(CalculatesBookingRefundAmount::class))->calculateRefundAmount($payment, $booking->fix_currency_id)); $refunds = $original_refunds / $payment->currency_rate; @@ -471,6 +486,15 @@ Route::get('/approve_refunds', function(){ $bankType = str_word_count($booking->bank->holder_name) > 4 ? 'Company' : 'Personal'; } + $refundTransaction = $payment->transactions()->refunds()->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->first(); + $remark = $refundTransaction->original_amount === $payment->original_amount ? 'Fully Refund' : 'Partial Refund'; + + if (str_contains($type, 'post')) { + $remark = 'Post ' . $remark; + } else { + $remark = 'Pre ' . $remark; + } + echo ''; echo ''; echo ''; @@ -483,6 +507,7 @@ Route::get('/approve_refunds', function(){ echo ''; echo ''; echo ''; + echo ''; echo ''; echo ''; echo ''; From c498aec61dcfb78314caed6b68326763bfbfa27e Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Sat, 16 Mar 2024 09:44:56 +0800 Subject: [PATCH 17/58] -fix purchase order section state issue when refund request is approved on booking page -fix supplier bill group dashboard payment issue --- .../ApproveBillGroupPaymentVerificationLogic.php | 2 +- .../CreateBillGroupPaymentProofDocumentLogic.php | 2 +- .../CreateBillGroupPaymentTransactionLogic.php | 2 +- .../ControllersLogic/CreateSupplierBillGroupLogic.php | 8 ++++---- .../elements/BillGroupPaymentSummaryComponent.vue | 4 ++-- .../bookings/forms/PurchaseOrderFormComponent.vue | 1 + 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/Classes/Modules/Transactions/ControllersLogic/ApproveBillGroupPaymentVerificationLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/ApproveBillGroupPaymentVerificationLogic.php index f12060b4..00117f9e 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/ApproveBillGroupPaymentVerificationLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/ApproveBillGroupPaymentVerificationLogic.php @@ -81,7 +81,7 @@ class ApproveBillGroupPaymentVerificationLogic extends AbstractControllerLogic $billGroup->status = ApprovalStatus::PENDING_SUBMISSION; $billGroup->save(); } else { - if ($billGroupPayment['outstanding_amount'] <= 0) { + if ($billGroupPayment['outstanding_amount'] <= 0 && $billGroupPayment['floating_amount'] <= 0) { $billGroup->status = ApprovalStatus::APPROVED; $billGroup->save(); } diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentProofDocumentLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentProofDocumentLogic.php index 79e01eb0..2563c230 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentProofDocumentLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentProofDocumentLogic.php @@ -83,7 +83,7 @@ class CreateBillGroupPaymentProofDocumentLogic extends AbstractControllerLogic $billGroup = $transaction->owner; $billGroupPayment = $this->calculatesBillGroupPaymentAmount->execute($billGroup); - if ($billGroupPayment['outstanding_amount'] <= 0) { + if ($billGroupPayment['outstanding_amount'] <= 0 && $billGroup->transactions()->where('status', ApprovalStatus::PENDING_SUBMISSION)->count() === 0) { $billGroup->status = ApprovalStatus::PENDING_VERIFICATION; $billGroup->save(); } diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php index e2fc6dc1..75be47d4 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateBillGroupPaymentTransactionLogic.php @@ -68,7 +68,7 @@ class CreateBillGroupPaymentTransactionLogic extends AbstractControllerLogic $billGroupPayment = $this->calculatesBillGroupPaymentAmount->execute($billGroup); $outstanding_amount = $billGroupPayment['outstanding_amount']; - if ($billGroupPayment['outstanding_amount'] == 0) { + if ($billGroupPayment['outstanding_amount'] <= 0) { if ($billGroup->transactions()->whereIn('status', [ApprovalStatus::PENDING_SUBMISSION, ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->count() !== 0) { throw new MalformedRequestException('Invalid bill group, payment transaction already exist.'); } diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php index 33284726..6213f55f 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php @@ -159,11 +159,11 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic foreach ($supplierRefunds as $supplierRefund) { $refund = Transaction::find($supplierRefund['id']); $deductedRefunds = $refund->transactions()->where('type', TransactionType::BILL_REFUND)->where('status', ApprovalStatus::APPROVED)->get(); - $refundDeductableAmount = $refund->amount - $deductedRefunds->sum('amount'); - $refundDeductableOriginalAmount = $refund->original_amount - $deductedRefunds->sum('original_amount'); + $refundDeductableAmount = round(($refund->amount - $deductedRefunds->sum('amount')), 2); + $refundDeductableOriginalAmount = round(($refund->original_amount - $deductedRefunds->sum('original_amount')), 2); - $amount -= round($refundDeductableAmount, 2); - $original_amount -= round($refundDeductableOriginalAmount, 2); + $amount -= $refundDeductableAmount; + $original_amount -= $refundDeductableOriginalAmount; if ($amount > 0) { $deductedRefundAmount = $refundDeductableAmount; diff --git a/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue b/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue index 284f681d..f84541d1 100644 --- a/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue +++ b/resources/assets/vue/components/bookings/elements/BillGroupPaymentSummaryComponent.vue @@ -80,7 +80,7 @@
MYR 0.00
-
+
@@ -101,7 +101,7 @@
-
+
diff --git a/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue b/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue index 3e0c9ca6..ad3627ba 100644 --- a/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue +++ b/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue @@ -242,6 +242,7 @@ 'data': function () { if (this.data && this.data.purchase_order && this.data.purchase_order.details) { this.products = this.data.purchase_order.details; + this.submitted = this.data.purchase_order ? this.data.purchase_order.status === 1 || this.data.purchase_order.status === 2: false; } else { this.products = []; } From 0a12bca442e128fa05c8056bbb2395b182fbee1a Mon Sep 17 00:00:00 2001 From: edmondlang Date: Sun, 17 Mar 2024 15:03:46 +0800 Subject: [PATCH 18/58] check if have refund in progress --- .../bookings/elements/PaymentHistoryComponent.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue index f3b3fb38..e3be870f 100644 --- a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue +++ b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue @@ -289,7 +289,7 @@
-
+
@@ -434,6 +434,10 @@ TotalRequestedRefund += refunds.status === 2 ? refunds.amount : 0; }); return TotalRequestedRefund; + }, + hasRefundInProgress() { + var refundTransactionsStatus = this.data.transaction_refunds.length > 0 ? this.data.transaction_refunds.map(refund => refund.status) : []; + return refundTransactionsStatus.includes(0) || refundTransactionsStatus.includes(1) } }, methods: { From daa422d41ae15d57c5fb8ef4a65e388256c9a11b Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Mon, 18 Mar 2024 22:13:05 +0800 Subject: [PATCH 19/58] -auto update booking fix amount once refund approve --- .../Services/CalculatesBookingOutstanding.php | 9 +++++++-- .../UpdateRefundTransactionStatusLogic.php | 17 ++++++++++++++--- .../elements/SupplierPendingOrderComponent.vue | 4 ++-- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/app/Classes/Modules/Bookings/Services/CalculatesBookingOutstanding.php b/app/Classes/Modules/Bookings/Services/CalculatesBookingOutstanding.php index 5f2c7733..f3a70a6a 100644 --- a/app/Classes/Modules/Bookings/Services/CalculatesBookingOutstanding.php +++ b/app/Classes/Modules/Bookings/Services/CalculatesBookingOutstanding.php @@ -13,20 +13,25 @@ class CalculatesBookingOutstanding /** @var CalculatesBookingFloatingAmount */ private $calculatesBookingFloatingAmount; + /** @var CalculatesBookingRefundAmount */ + private $calculatesBookingRefundAmount; + /** * CalculatesBookingOutstanding constructor. * @param CalculatesBookingPayableAmount $calculatesBookingPayableAmount * @param CalculatesBookingFloatingAmount $calculatesBookingFloatingAmount + * @param CalculatesBookingRefundAmount $calculatesBookingRefundAmount */ - public function __construct(CalculatesBookingPayableAmount $calculatesBookingPayableAmount, CalculatesBookingFloatingAmount $calculatesBookingFloatingAmount) + public function __construct(CalculatesBookingPayableAmount $calculatesBookingPayableAmount, CalculatesBookingFloatingAmount $calculatesBookingFloatingAmount, CalculatesBookingRefundAmount $calculatesBookingRefundAmount) { $this->calculatesBookingPayableAmount = $calculatesBookingPayableAmount; $this->calculatesBookingFloatingAmount = $calculatesBookingFloatingAmount; + $this->calculatesBookingRefundAmount = $calculatesBookingRefundAmount; } public function execute(Booking $booking){ - return $booking->fix_amount - $this->calculatesBookingFloatingAmount->execute($booking, $booking->fix_currency_id) - $this->calculatesBookingPayableAmount->execute($booking, $booking->fix_currency_id); + return $booking->fix_amount - $this->calculatesBookingFloatingAmount->execute($booking, $booking->fix_currency_id) - $this->calculatesBookingPayableAmount->execute($booking, $booking->fix_currency_id) + $this->calculatesBookingRefundAmount->execute($booking, $booking->fix_currency_id); } } \ No newline at end of file diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php index 91b82f16..25db0f31 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php @@ -4,6 +4,7 @@ namespace App\Classes\Modules\Transactions\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; +use App\Classes\Modules\Bookings\ControllersLogic\UpdateBookingAmountLogic; use App\Classes\Modules\Companies\Services\FetchesCompany; use App\Classes\Modules\Transactions\Services\FetchesTransaction; use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; @@ -51,6 +52,9 @@ class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic /** @var CalculatesBookingRefundAmount */ private $calculatesBookingRefundAmount; + /** @var UpdateBookingAmountLogic */ + private $updateBookingAmountLogic; + /** * CreatePaymentVerificationDocumentLogic constructor. * @param FetchesCompany $fetchesCompany @@ -60,8 +64,9 @@ class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic * @param CreditWalletProcessor $creditWalletProcessor * @param CalculatesBookingPayableAmount $calculatesBookingPayableAmount * @param CalculatesBookingRefundAmount $calculatesBookingRefundAmount + * @param UpdateBookingAmountLogic $updateBookingAmountLogic */ - public function __construct(FetchesCompany $fetchesCompany, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, DeletesDocument $deletesDocument, CreditWalletProcessor $creditWalletProcessor, CalculatesBookingPayableAmount $calculatesBookingPayableAmount, CalculatesBookingRefundAmount $calculatesBookingRefundAmount) + public function __construct(FetchesCompany $fetchesCompany, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, DeletesDocument $deletesDocument, CreditWalletProcessor $creditWalletProcessor, CalculatesBookingPayableAmount $calculatesBookingPayableAmount, CalculatesBookingRefundAmount $calculatesBookingRefundAmount, UpdateBookingAmountLogic $updateBookingAmountLogic) { $this->fetchesCompany = $fetchesCompany; $this->fetchesTransaction = $fetchesTransaction; @@ -70,6 +75,7 @@ class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic $this->creditWalletProcessor = $creditWalletProcessor; $this->calculatesBookingPayableAmount = $calculatesBookingPayableAmount; $this->calculatesBookingRefundAmount = $calculatesBookingRefundAmount; + $this->updateBookingAmountLogic = $updateBookingAmountLogic; } /** @@ -93,20 +99,25 @@ class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic $refundAmount = $this->calculatesBookingRefundAmount->calculateRefundAmount($paymentTransaction, $booking->fix_currency_id); + $paidAmount = $paymentTransaction->original_amount - $refundAmount; + if ($refundTransaction->status == ApprovalStatus::APPROVED) { $this->creditWalletProcessor->execute($booking->company, $refundTransaction->type, $refundTransaction->amount, $reference); $po_transaction = $booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->first(); if ($po_transaction) { $this->updatesTransactionStatus->execute($po_transaction, (float) number_format($po_transaction->amount, 2, '.', '') === (float) number_format((float)$booking->fix_amount - $refundAmount, 2, '.', '') ? ApprovalStatus::PENDING_VERIFICATION : ApprovalStatus::PENDING_SUBMISSION); - } + } + + $request['fix_amount'] = $paidAmount; + $request->route()->setParameter('id', $booking->id); + $this->updateBookingAmountLogic->execute($request); } if ($supplierRefundTransaction) { $this->updatesTransactionStatus->execute($supplierRefundTransaction, $request->route('status')); } - $paidAmount = $paymentTransaction->original_amount - $refundAmount; if (!$paidAmount > 0) { $this->updatesTransactionStatus->execute($paymentTransaction, ApprovalStatus::REFUNDED); } diff --git a/resources/assets/vue/components/bookings/elements/SupplierPendingOrderComponent.vue b/resources/assets/vue/components/bookings/elements/SupplierPendingOrderComponent.vue index 309f2b9b..860a493c 100644 --- a/resources/assets/vue/components/bookings/elements/SupplierPendingOrderComponent.vue +++ b/resources/assets/vue/components/bookings/elements/SupplierPendingOrderComponent.vue @@ -56,7 +56,7 @@ {{item.original_currency.short_code}}
-
+
From 04b8dfb0ddb52c6877eb07ec29506145256b0461 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Tue, 19 Mar 2024 00:23:09 +0800 Subject: [PATCH 20/58] -fix issue where cannot approve PO when we have refunded transaction --- .../Bookings/Services/CalculatesBookingTransferredAmount.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Classes/Modules/Bookings/Services/CalculatesBookingTransferredAmount.php b/app/Classes/Modules/Bookings/Services/CalculatesBookingTransferredAmount.php index fc355d64..099d4571 100644 --- a/app/Classes/Modules/Bookings/Services/CalculatesBookingTransferredAmount.php +++ b/app/Classes/Modules/Bookings/Services/CalculatesBookingTransferredAmount.php @@ -13,7 +13,7 @@ class CalculatesBookingTransferredAmount public function execute(Booking $booking){ return $booking->transactions()->payments()->complete()->whereHas('transactions', function($query){ - return $query->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); + return $query->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->where('type', TransactionType::BILL); })->sum('original_amount'); } From c95c274db7ded39b5c070e72a3dbc74109f20836 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Mon, 25 Mar 2024 00:47:52 +0800 Subject: [PATCH 21/58] update --- .../bookings/elements/SupplierRefundComponent.vue | 9 ++++++--- .../bookings/forms/PurchaseOrderFormComponent.vue | 10 +++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue b/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue index 872ebef4..68839221 100644 --- a/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue +++ b/resources/assets/vue/components/bookings/elements/SupplierRefundComponent.vue @@ -17,11 +17,14 @@ {{item.created_at}}
+
+
Reference
+ +
Amount
-
{{item.currency.short_code}} {{((Math.round(( item.amount + Number.EPSILON) * 100) / 100)).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}}
diff --git a/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue b/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue index ad3627ba..b9a0f2d6 100644 --- a/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue +++ b/resources/assets/vue/components/bookings/forms/PurchaseOrderFormComponent.vue @@ -117,7 +117,7 @@
-
+
-
{{(Math.round(( poTotal + Number.EPSILON) * 1000) / 1000).toFixed(3)}}/{{(Math.round((data.paid_amount + Number.EPSILON) * 1000) / 1000).toFixed(3)}} {{data.fixed_currency.short_code}}
+
{{(Math.round(( poTotal + Number.EPSILON) * 1000) / 1000).toFixed(3)}}/{{(Math.round((data.amount + Number.EPSILON) * 1000) / 1000).toFixed(3)}} {{data.fixed_currency.short_code}}
- +
-
+
** you purchase order will be saved but wont be approved until your purchase order's total matches your transfer order's total.
@@ -286,7 +286,7 @@ this.submit(route('api.transaction.po.import', this.data.id), 'post', this.section, true, true); }, successHandler(){ - if((Math.round((this.poTotal + Number.EPSILON) * 1000) / 1000).toFixed(3) === (Math.round((this.data.paid_amount + Number.EPSILON) * 1000) / 1000).toFixed(3)){ + if((Math.round((this.poTotal + Number.EPSILON) * 1000) / 1000).toFixed(3) === (Math.round((this.data.amount + Number.EPSILON) * 1000) / 1000).toFixed(3)){ this.submitted = true; } this.updateList() From 3deba3468aec8eb4b2526c4370eea62b50a18077 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Mon, 25 Mar 2024 15:06:46 +0800 Subject: [PATCH 22/58] -Approve refund - only super admin -If invoice generated - only super admin can request refund --- .../ControllersLogic/CreateBookingRefundLogic.php | 10 ++++++---- .../UpdateRefundTransactionStatusLogic.php | 7 ++++++- .../bookings/elements/PaymentHistoryComponent.vue | 4 ++-- .../bookings/elements/RefundVerificationComponent.vue | 2 +- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php index 062db191..7e176363 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php @@ -73,14 +73,16 @@ class CreateBookingRefundLogic extends AbstractControllerLogic public function logic(Request $request) : JsonResponse { - if(auth()->user()->type === 3) { - throw new MalformedRequestException('You do not have the permission to refund the order.'); - } - $transaction = $this->fetchesTransaction->execute(['id' => $request->route('payment_id')]); $booking = $transaction->owner; + $invoice = $booking->transactions()->where('type', TransactionType::INVOICE)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->first(); + + if(auth()->user()->type === 3 || ($invoice && !(auth()->user()->type === 0 || auth()->user()->type === 1))) { + throw new MalformedRequestException('You do not have the permission to refund the order.'); + } + $billNumber = $this->generatesTransactionBillNumber->execute('RFD-'); $refund = $transaction->transactions()->refunds()->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->sum('original_amount'); diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php index 25db0f31..615ded20 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php @@ -2,7 +2,7 @@ namespace App\Classes\Modules\Transactions\ControllersLogic; - +use App\Classes\Exceptions\MalformedRequestException; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Bookings\ControllersLogic\UpdateBookingAmountLogic; use App\Classes\Modules\Companies\Services\FetchesCompany; @@ -17,6 +17,7 @@ use App\Classes\Modules\Wallets\Processors\CreditWalletProcessor; use App\Classes\Modules\Bookings\Services\CalculatesBookingPayableAmount; use App\Classes\Modules\Bookings\Services\CalculatesBookingRefundAmount; use App\Classes\ValueObjects\Constants\TransactionType; +use Illuminate\Support\Facades\Auth; class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic { @@ -85,6 +86,10 @@ class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { + if (!(Auth::user()->type === 0 || Auth::user()->type === 1)) { + throw new MalformedRequestException('Only super admin can update refund status.'); + } + $refundTransaction = $this->fetchesTransaction->execute(['id' => $request->route('id')]); $refundTransaction = $this->updatesTransactionStatus->execute($refundTransaction, $request->route('status')); diff --git a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue index e3be870f..ec0c0d7a 100644 --- a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue +++ b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue @@ -290,7 +290,7 @@
-
+
@@ -345,7 +345,7 @@
-
+
-
+
From 3af3c95032ba9592d62d7085800c8840719c30aa Mon Sep 17 00:00:00 2001 From: edmondlang Date: Wed, 27 Mar 2024 01:09:55 +0800 Subject: [PATCH 23/58] show white form transactions in date range --- routes/web.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/routes/web.php b/routes/web.php index b90ef72e..d6798271 100644 --- a/routes/web.php +++ b/routes/web.php @@ -879,3 +879,61 @@ Route::get('/invoice/{marking}/{started_at}/{ended_at}/fix', function($marking, } ); })->name('invoice.fix.byCustomerMarking'); + + +Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', function ($from_date, $to_date) { + $approvedTransactions = Transaction::where('type', TransactionType::PAYMENT)->where('status', ApprovalStatus::APPROVED)->where('owner_type', '!=', Wallet::class)->get(); + + echo '

Approved Payments

'; + echo '
Refunded Original AmountRemarkServiceLast Updated AtBank TypeBank Holder Name
'.($index + 1).'.'.$payment->updated_at->format('d-M-y').''.$payment->original_currency->short_code.''.number_format($original_refunds, 5, '.', '').''.$remark.''.$booking->service->name.''.$payment->updated_at->diffForHumans().''.$bankType.'
'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + foreach ($approvedTransactions as $approvedTransaction) { + echo ''; + echo ''; + echo ''; + echo ''; + } + + echo ''; + echo '
BookingPayment Date
' . $approvedTransaction->owner->marking . '' . $approvedTransaction->created_at . '
'; + + $startDate = Carbon::createFromFormat('d-m-Y', $from_date)->startOfDay(); + $endDate = Carbon::createFromFormat('d-m-Y', $to_date)->endOfDay(); + + $approvalSatatusArray = ApprovalStatus::APPROVAL_STATUS_ID; + + echo '

Bills in the date range

'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + + $datas = Transaction::where('type', TransactionType::BILL)->whereBetween('created_at', [$startDate, $endDate])->get(); + + foreach ($datas as $data) { + echo ''; + $payment = $data->owner; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + + echo ''; + echo '
StatusBills Created AtBookingPayment Date
' . $approvalSatatusArray[$data['status']] . '' . $data->created_at . '' . $data->owner->owner->marking . '' . $payment->created_at . '
'; +}); From 937610272c3a8bf84b61227ac236acdc3cfb4d81 Mon Sep 17 00:00:00 2001 From: Omair Saleh Date: Wed, 27 Mar 2024 09:42:24 +0800 Subject: [PATCH 24/58] tidy up whiteform report --- routes/web.php | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/routes/web.php b/routes/web.php index d6798271..06e0dc67 100644 --- a/routes/web.php +++ b/routes/web.php @@ -882,14 +882,17 @@ Route::get('/invoice/{marking}/{started_at}/{ended_at}/fix', function($marking, Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', function ($from_date, $to_date) { - $approvedTransactions = Transaction::where('type', TransactionType::PAYMENT)->where('status', ApprovalStatus::APPROVED)->where('owner_type', '!=', Wallet::class)->get(); - echo '

Approved Payments

'; + $approvedTransactions = Transaction::where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->where('owner_type', '!=', Wallet::class)->orderBy('status')->get(); + + echo '

Pending Orders Payments

'; echo ''; echo ''; echo ''; echo ''; + echo ''; echo ''; + echo ''; echo ''; echo ''; echo ''; @@ -897,7 +900,9 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', foreach ($approvedTransactions as $approvedTransaction) { echo ''; echo ''; + echo ''; echo ''; + echo ''; echo ''; } @@ -907,30 +912,34 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', $startDate = Carbon::createFromFormat('d-m-Y', $from_date)->startOfDay(); $endDate = Carbon::createFromFormat('d-m-Y', $to_date)->endOfDay(); - $approvalSatatusArray = ApprovalStatus::APPROVAL_STATUS_ID; echo '

Bills in the date range

'; echo '
BookingAmountPayment DateStatus
' . $approvedTransaction->owner->marking . '' . $approvedTransaction->amount . '' . $approvedTransaction->created_at . '' . ApprovalStatus::APPROVAL_STATUS_ID[$approvedTransaction->status] . '
'; echo ''; echo ''; - echo ''; - echo ''; echo ''; - echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; echo ''; echo ''; echo ''; - $datas = Transaction::where('type', TransactionType::BILL)->whereBetween('created_at', [$startDate, $endDate])->get(); + $bills = Transaction::where('type', TransactionType::BILL)->whereBetween('created_at', [$startDate, $endDate])->get(); - foreach ($datas as $data) { + foreach ($bills as $bill) { echo ''; - $payment = $data->owner; - echo ''; - echo ''; - echo ''; + $payment = $bill->owner; + $po = $payment->owner->transaction()->where('type', TransactionType::PURCHASE_ORDER)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->first(); + echo ''; echo ''; + echo ''; + echo ''; + echo ''; + echo ''; echo ''; } From 9a6e41ff3b17553aa838acf65cba7c57946c8d35 Mon Sep 17 00:00:00 2001 From: Omair Saleh Date: Wed, 27 Mar 2024 09:47:42 +0800 Subject: [PATCH 25/58] tidy up whiteform report --- routes/web.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/routes/web.php b/routes/web.php index 06e0dc67..246cb94b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -900,7 +900,7 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', foreach ($approvedTransactions as $approvedTransaction) { echo ''; echo ''; - echo ''; + echo ''; echo ''; echo ''; echo ''; @@ -918,8 +918,10 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo ''; echo ''; echo ''; + echo ''; echo ''; echo ''; + echo ''; echo ''; echo ''; echo ''; @@ -933,10 +935,11 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', foreach ($bills as $bill) { echo ''; $payment = $bill->owner; - $po = $payment->owner->transaction()->where('type', TransactionType::PURCHASE_ORDER)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->first(); + $po = $payment->owner->transactions()->where('type', TransactionType::PURCHASE_ORDER)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->first(); echo ''; echo ''; echo ''; + echo ''; echo ''; echo ''; echo ''; From baa8551b66aff21e8b3e4204ffdbaa255f66b59c Mon Sep 17 00:00:00 2001 From: Omair Saleh Date: Wed, 27 Mar 2024 09:54:58 +0800 Subject: [PATCH 26/58] tidy up whiteform report --- routes/web.php | 1 + 1 file changed, 1 insertion(+) diff --git a/routes/web.php b/routes/web.php index 246cb94b..ab187f16 100644 --- a/routes/web.php +++ b/routes/web.php @@ -936,6 +936,7 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo ''; $payment = $bill->owner; $po = $payment->owner->transactions()->where('type', TransactionType::PURCHASE_ORDER)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->first(); + var_dump($po); echo ''; echo ''; echo ''; From eb857937983887ad7ecc65c41137e863fe8372dc Mon Sep 17 00:00:00 2001 From: Omair Saleh Date: Wed, 27 Mar 2024 10:02:25 +0800 Subject: [PATCH 27/58] tidy up whiteform report --- routes/web.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/routes/web.php b/routes/web.php index ab187f16..d899f657 100644 --- a/routes/web.php +++ b/routes/web.php @@ -936,13 +936,12 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo ''; $payment = $bill->owner; $po = $payment->owner->transactions()->where('type', TransactionType::PURCHASE_ORDER)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->first(); - var_dump($po); echo ''; echo ''; echo ''; echo ''; echo ''; - echo ''; +// echo ''; echo ''; echo ''; } From b9765fbcf7e5b60652927a70d67b101236040391 Mon Sep 17 00:00:00 2001 From: Omair Saleh Date: Wed, 27 Mar 2024 10:03:26 +0800 Subject: [PATCH 28/58] tidy up whiteform report --- routes/web.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routes/web.php b/routes/web.php index d899f657..6f4d12e7 100644 --- a/routes/web.php +++ b/routes/web.php @@ -941,8 +941,8 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo ''; echo ''; echo ''; -// echo ''; - echo ''; + echo ''; + echo ''; echo ''; } From bb1cb6d44e4300ee253a28f486738d95a58cb0c1 Mon Sep 17 00:00:00 2001 From: Omair Saleh Date: Wed, 27 Mar 2024 10:11:02 +0800 Subject: [PATCH 29/58] tidy up whiteform report --- routes/web.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/routes/web.php b/routes/web.php index 6f4d12e7..1143c48c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -901,7 +901,7 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo ''; echo ''; echo ''; - echo ''; + echo ''; echo ''; echo ''; } @@ -937,12 +937,13 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', $payment = $bill->owner; $po = $payment->owner->transactions()->where('type', TransactionType::PURCHASE_ORDER)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->first(); echo ''; - echo ''; - echo ''; + echo ''; + echo ''; + echo ''; echo ''; - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; + echo ''; echo ''; } From dc61f23fa88a9df088d000f973cf8fbcc8c2618d Mon Sep 17 00:00:00 2001 From: Omair Saleh Date: Mon, 1 Apr 2024 12:59:30 +0800 Subject: [PATCH 30/58] include pending verification status to expirying payment function --- .../ControllersLogic/ExpireBookingPaymentControllerLogic.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Classes/Modules/Bookings/ControllersLogic/ExpireBookingPaymentControllerLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/ExpireBookingPaymentControllerLogic.php index 8ee2bbfa..1b0a9ebb 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/ExpireBookingPaymentControllerLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/ExpireBookingPaymentControllerLogic.php @@ -45,7 +45,7 @@ class ExpireBookingPaymentControllerLogic extends AbstractControllerLogic $booking = $this->fetchesBooking->execute(['id' => $request->route('id')]); $payment = $booking->transactions() - ->payments()->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]) + ->payments()->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]) ->first(); $payment->status = ApprovalStatus::EXPIRED; From 02d28f8fba43548b9e1c00865981d751cd8cdc54 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Mon, 8 Apr 2024 21:17:37 +0800 Subject: [PATCH 31/58] fix invoice amount not tally when voucher is apply for booking --- .../CalculatesBookingCurrencyAverageRate.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/app/Classes/Modules/Bookings/Services/CalculatesBookingCurrencyAverageRate.php b/app/Classes/Modules/Bookings/Services/CalculatesBookingCurrencyAverageRate.php index da3fe0b4..9cb7717e 100644 --- a/app/Classes/Modules/Bookings/Services/CalculatesBookingCurrencyAverageRate.php +++ b/app/Classes/Modules/Bookings/Services/CalculatesBookingCurrencyAverageRate.php @@ -24,10 +24,22 @@ class CalculatesBookingCurrencyAverageRate public function execute(Booking $booking, $type){ + $transaction = $booking->transactions() + ->where('type', TransactionType::PAYMENT) + ->latest()->get()[0]; + + $voucherRedemption = $transaction->voucherRedemption; + + $discount = 0; + + if ($voucherRedemption) { + $discount = $voucherRedemption->value; + } + if ($type == TransactionType::PAYMENT) { $totalPayment = $booking->fix_currency_id === 1 ? $booking->transactions()->payments()->complete()->sum('original_amount') : $booking->transactions()->payments()->complete()->selectRaw('sum(amount - service_charge - tax) as sub_total')->get()->sum('sub_total'); - return $this->calculatesBookingPayableAmount->execute($booking, $booking->fix_currency_id) / $totalPayment; + return $this->calculatesBookingPayableAmount->execute($booking, $booking->fix_currency_id) / ($totalPayment + $discount); } else if ($type == TransactionType::BILL) { From aeb0be11bf935becee6301f215750eaa3fdd5387 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Tue, 9 Apr 2024 00:20:19 +0800 Subject: [PATCH 32/58] remove - in the invoice discount section, amount is already in negative --- resources/views/pages/pdfs/purchase_order_table.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/pages/pdfs/purchase_order_table.blade.php b/resources/views/pages/pdfs/purchase_order_table.blade.php index cc47100e..5862ac69 100644 --- a/resources/views/pages/pdfs/purchase_order_table.blade.php +++ b/resources/views/pages/pdfs/purchase_order_table.blade.php @@ -60,7 +60,7 @@ - + @endif From 69e9328e748673128839a993f019670a0145305e Mon Sep 17 00:00:00 2001 From: edmondlang Date: Tue, 16 Apr 2024 22:34:41 +0800 Subject: [PATCH 33/58] fix bug cant approve the refund because booking amount cant be updated, error - Booking Amount cannot be less than xxxxx --- .../Bookings/ControllersLogic/UpdateBookingAmountLogic.php | 2 +- .../ControllersLogic/UpdateRefundTransactionStatusLogic.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingAmountLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingAmountLogic.php index fabdd058..e40a947d 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingAmountLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingAmountLogic.php @@ -81,7 +81,7 @@ class UpdateBookingAmountLogic extends AbstractControllerLogic $minimum_amount = $booking->fix_amount - $this->calculatesBookingOutstanding->execute($booking); - if ((float)$input_amount < $minimum_amount) { + if (((float)$input_amount + 0.01) < (float)$minimum_amount) { throw new MalformedRequestException('Booking Amount cannot be less than '. $minimum_amount .'.'); } diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php index 615ded20..d2fa5ec6 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php @@ -114,7 +114,7 @@ class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic $this->updatesTransactionStatus->execute($po_transaction, (float) number_format($po_transaction->amount, 2, '.', '') === (float) number_format((float)$booking->fix_amount - $refundAmount, 2, '.', '') ? ApprovalStatus::PENDING_VERIFICATION : ApprovalStatus::PENDING_SUBMISSION); } - $request['fix_amount'] = $paidAmount; + $request['fix_amount'] = $booking->fix_amount - $refundAmount; $request->route()->setParameter('id', $booking->id); $this->updateBookingAmountLogic->execute($request); } From a8c13e9425dae66b93fb459d52019c735ec2cd48 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Mon, 22 Apr 2024 18:25:48 +0800 Subject: [PATCH 34/58] comment DB::commit() to fix the database seeder --- database/seeds/DatabaseSeeder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php index 87d72f71..eb94b74f 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeds/DatabaseSeeder.php @@ -48,6 +48,6 @@ class DatabaseSeeder extends Seeder $this->call(DummyDataSeeder::class); } - DB::commit(); + // DB::commit(); } } From 332a12008c37e412620cbe2fb17a2a24483be806 Mon Sep 17 00:00:00 2001 From: Dodowingster Date: Wed, 24 Apr 2024 15:18:28 +0800 Subject: [PATCH 35/58] initial commit --- .../ControllersLogic/CreateRemarkLogic.php | 62 ++++++++++++++++ .../ControllersLogic/DeleteRemarkLogic.php | 66 +++++++++++++++++ .../ControllersLogic/FetchRemarkLogic.php | 59 +++++++++++++++ .../ControllersLogic/ListRemarksLogic.php | 59 +++++++++++++++ .../ControllersLogic/UpdateRemarkLogic.php | 71 ++++++++++++++++++ .../DataTransferObjects/RemarkObject.php | 38 ++++++++++ .../Processors/CreateRemarkProcessor.php | 47 ++++++++++++ .../Remarks/Services/CreatesRemark.php | 31 ++++++++ .../Remarks/Services/DeletesRemark.php | 19 +++++ .../Remarks/Services/FetchesRemark.php | 33 +++++++++ .../Modules/Remarks/Services/ListsRemarks.php | 33 +++++++++ .../Remarks/Services/UpdatesRemark.php | 26 +++++++ .../Standards/Rules/CanCreateRemark.php | 57 +++++++++++++++ .../Standards/Rules/CanDeleteRemark.php | 43 +++++++++++ .../Standards/Rules/CanFetchRemark.php | 43 +++++++++++ .../Standards/Rules/CanListRemarks.php | 43 +++++++++++ .../Standards/Rules/CanUpdateRemark.php | 57 +++++++++++++++ .../Standards/Validators/RemarkValidation.php | 41 +++++++++++ .../Remarks/CreateRemarkController.php | 20 +++++ .../Remarks/DeleteRemarkController.php | 20 +++++ .../Remarks/FetchRemarkController.php | 20 +++++ .../Remarks/ListRemarksController.php | 20 +++++ .../Remarks/UpdateRemarkController.php | 20 +++++ app/Http/Resources/RemarkResource.php | 26 +++++++ .../general/elements/RemarkComponent.vue | 32 ++++++++ .../general/elements/RemarkListComponent.vue | 71 ++++++++++++++++++ .../forms/DeleteRemarkFormComponent.vue | 32 ++++++++ .../forms/RemarkCommentFormComponent.vue | 55 ++++++++++++++ .../general/forms/RemarkFormComponent.vue | 73 +++++++++++++++++++ routes/remark.php | 11 +++ 30 files changed, 1228 insertions(+) create mode 100644 app/Classes/Modules/Remarks/ControllersLogic/CreateRemarkLogic.php create mode 100644 app/Classes/Modules/Remarks/ControllersLogic/DeleteRemarkLogic.php create mode 100644 app/Classes/Modules/Remarks/ControllersLogic/FetchRemarkLogic.php create mode 100644 app/Classes/Modules/Remarks/ControllersLogic/ListRemarksLogic.php create mode 100644 app/Classes/Modules/Remarks/ControllersLogic/UpdateRemarkLogic.php create mode 100644 app/Classes/Modules/Remarks/DataTransferObjects/RemarkObject.php create mode 100644 app/Classes/Modules/Remarks/Processors/CreateRemarkProcessor.php create mode 100644 app/Classes/Modules/Remarks/Services/CreatesRemark.php create mode 100644 app/Classes/Modules/Remarks/Services/DeletesRemark.php create mode 100644 app/Classes/Modules/Remarks/Services/FetchesRemark.php create mode 100644 app/Classes/Modules/Remarks/Services/ListsRemarks.php create mode 100644 app/Classes/Modules/Remarks/Services/UpdatesRemark.php create mode 100644 app/Classes/Modules/Remarks/Standards/Rules/CanCreateRemark.php create mode 100644 app/Classes/Modules/Remarks/Standards/Rules/CanDeleteRemark.php create mode 100644 app/Classes/Modules/Remarks/Standards/Rules/CanFetchRemark.php create mode 100644 app/Classes/Modules/Remarks/Standards/Rules/CanListRemarks.php create mode 100644 app/Classes/Modules/Remarks/Standards/Rules/CanUpdateRemark.php create mode 100644 app/Classes/Modules/Remarks/Standards/Validators/RemarkValidation.php create mode 100644 app/Http/Controllers/Remarks/CreateRemarkController.php create mode 100644 app/Http/Controllers/Remarks/DeleteRemarkController.php create mode 100644 app/Http/Controllers/Remarks/FetchRemarkController.php create mode 100644 app/Http/Controllers/Remarks/ListRemarksController.php create mode 100644 app/Http/Controllers/Remarks/UpdateRemarkController.php create mode 100644 app/Http/Resources/RemarkResource.php create mode 100644 resources/assets/vue/components/general/elements/RemarkComponent.vue create mode 100644 resources/assets/vue/components/general/elements/RemarkListComponent.vue create mode 100644 resources/assets/vue/components/general/forms/DeleteRemarkFormComponent.vue create mode 100644 resources/assets/vue/components/general/forms/RemarkCommentFormComponent.vue create mode 100644 resources/assets/vue/components/general/forms/RemarkFormComponent.vue create mode 100644 routes/remark.php diff --git a/app/Classes/Modules/Remarks/ControllersLogic/CreateRemarkLogic.php b/app/Classes/Modules/Remarks/ControllersLogic/CreateRemarkLogic.php new file mode 100644 index 00000000..46d822c5 --- /dev/null +++ b/app/Classes/Modules/Remarks/ControllersLogic/CreateRemarkLogic.php @@ -0,0 +1,62 @@ + 'Created Remark', + 'message' => 'You have successfully created a new Remark' + ]; + } + + /** @var CreateRemarkProcessor */ + private $createRemarkProcessor; + + /** + * CreateRemarkLogic constructor. + * @param CreateRemarkProcessor $createRemarkProcessor + */ + public function __construct(CreateRemarkProcessor $createRemarkProcessor) + { + $this->createRemarkProcessor = $createRemarkProcessor; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request) : JsonResponse + { + $classs = '\\App\\Models\\' . Str::studly($request->input('model_type')); + + if (!class_exists($classs)) { + throw new MalformedRequestException('Unable to process this entity'); + } + + $remarkOwner = $classs::find($request->route('id')); + + $remarkObject = new RemarkObject($request->input('content'), auth()->user()->id); + + $remmark = $this->createRemarkProcessor->execute($remarkOwner, $remarkObject); + + return $this->resourceResponse(new RemarkResource($remmark)); + } +} diff --git a/app/Classes/Modules/Remarks/ControllersLogic/DeleteRemarkLogic.php b/app/Classes/Modules/Remarks/ControllersLogic/DeleteRemarkLogic.php new file mode 100644 index 00000000..b593d603 --- /dev/null +++ b/app/Classes/Modules/Remarks/ControllersLogic/DeleteRemarkLogic.php @@ -0,0 +1,66 @@ + 'Deleted Remark', + 'message' => 'You have successfully deleted a Remark' + ]; + } + + + /** @var CanDeleteRemark */ + private $canDeleteRemark; + + /** @var DeletesRemark */ + private $deletesRemark; + + /** @var FetchesRemark */ + private $fetchesRemark; + + /** + * DeleteRemarkControllersLogic constructor. + * @param CanDeleteRemark $canDeleteRemark + * @param DeletesRemark $deletesRemark + * @param FetchesRemark $fetchesRemark + */ + public function __construct(CanDeleteRemark $canDeleteRemark, DeletesRemark $deletesRemark, FetchesRemark $fetchesRemark) + { + $this->canDeleteRemark = $canDeleteRemark; + $this->deletesRemark = $deletesRemark; + $this->fetchesRemark = $fetchesRemark; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + $this->canDeleteRemark->passes(); + + $query = $this->fetchesRemark->execute(['id' => $request->route('id')]); + + $this->deletesRemark->execute($query); + + return $this->response([]); + } + +} diff --git a/app/Classes/Modules/Remarks/ControllersLogic/FetchRemarkLogic.php b/app/Classes/Modules/Remarks/ControllersLogic/FetchRemarkLogic.php new file mode 100644 index 00000000..9c5aa5af --- /dev/null +++ b/app/Classes/Modules/Remarks/ControllersLogic/FetchRemarkLogic.php @@ -0,0 +1,59 @@ + 'Retrieved Remark', + 'message' => 'You have successfully retrieved a Remark' + ]; + } + + /** @var CanFetchRemark */ + private $canFetchRemark; + + /** @var FetchesRemark */ + private $fetchesRemark; + + /** + * FetchRemarkControllersLogic constructor. + * @param CanFetchRemark $canFetchRemark + * @param FetchesRemark $fetchesRemark + */ + public function __construct(CanFetchRemark $canFetchRemark, FetchesRemark $fetchesRemark) + { + $this->canFetchRemark = $canFetchRemark; + $this->fetchesRemark = $fetchesRemark; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + $this->canFetchRemark->passes(); + + $query = $this->fetchesRemark->execute(['id' => $request->route('id')]); + + return $this->resourceResponse(new RemarkResource($query)); + } + +} diff --git a/app/Classes/Modules/Remarks/ControllersLogic/ListRemarksLogic.php b/app/Classes/Modules/Remarks/ControllersLogic/ListRemarksLogic.php new file mode 100644 index 00000000..c70ccee1 --- /dev/null +++ b/app/Classes/Modules/Remarks/ControllersLogic/ListRemarksLogic.php @@ -0,0 +1,59 @@ + 'Retrieved Remarks', + 'message' => 'You have successfully retrieved a list of Remarks' + ]; + } + + /** @var CanListRemarks */ + private $canListRemarks; + + /** @var ListsRemarks */ + private $listsRemarks; + + /** + * ListRemarksLogic constructor. + * @param CanListRemarks $canListRemarks + * @param ListsRemarks $listsRemarks + */ + public function __construct(CanListRemarks $canListRemarks, ListsRemarks $listsRemarks) + { + $this->canListRemarks = $canListRemarks; + $this->listsRemarks = $listsRemarks; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + $this->canListRemarks->passes(); + + $query = $this->listsRemarks->execute($this->listsRemarks->deserializeFilters($request->input('filters'))); + + return $this->collectionResponse(RemarkResource::collection($query)); + } + +} diff --git a/app/Classes/Modules/Remarks/ControllersLogic/UpdateRemarkLogic.php b/app/Classes/Modules/Remarks/ControllersLogic/UpdateRemarkLogic.php new file mode 100644 index 00000000..f120efab --- /dev/null +++ b/app/Classes/Modules/Remarks/ControllersLogic/UpdateRemarkLogic.php @@ -0,0 +1,71 @@ + 'Updated Remark', + 'message' => 'You have successfully updated the Remark' + ]; + } + + /** @var CanUpdateRemark */ + private $canUpdateRemark; + + /** @var UpdatesRemark */ + private $updatesRemark; + + /** @var FetchesRemark */ + private $fetchesRemark; + + /** + * UpdateRemarkLogic constructor. + * @param CanUpdateRemark $canUpdateRemark + * @param UpdatesRemark $updatesRemark + * @param FetchesRemark $fetchesRemark + */ + public function __construct(CanUpdateRemark $canUpdateRemark, UpdatesRemark $updatesRemark, FetchesRemark $fetchesRemark) + { + $this->canUpdateRemark = $canUpdateRemark; + $this->updatesRemark = $updatesRemark; + $this->fetchesRemark = $fetchesRemark; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request) : JsonResponse + { + $object = new RemarkObject($request->input('content'), auth()->user()->id); + + $this->canUpdateRemark->passes($object); + + $query = $this->fetchesRemark->execute(['id' => $request->route('id')]); + + $query = $this->updatesRemark->execute($query, $object); + + return $this->resourceResponse(new RemarkResource($query)); + } + +} diff --git a/app/Classes/Modules/Remarks/DataTransferObjects/RemarkObject.php b/app/Classes/Modules/Remarks/DataTransferObjects/RemarkObject.php new file mode 100644 index 00000000..44a9507f --- /dev/null +++ b/app/Classes/Modules/Remarks/DataTransferObjects/RemarkObject.php @@ -0,0 +1,38 @@ +commenterID = $commenterID; + $this->content = $content; + } + + /** + * @return int + */ + public function getCommenterId(): string + { + return $this->commenterID; + } + + /** + * @return string + */ + public function getContent(): ?string + { + return $this->content; + } + +} diff --git a/app/Classes/Modules/Remarks/Processors/CreateRemarkProcessor.php b/app/Classes/Modules/Remarks/Processors/CreateRemarkProcessor.php new file mode 100644 index 00000000..aadbe502 --- /dev/null +++ b/app/Classes/Modules/Remarks/Processors/CreateRemarkProcessor.php @@ -0,0 +1,47 @@ +createsRemark = $createsRemark; + $this->canCreateRemark = $canCreateRemark; + } + + + /** + * @param Remarkable $remarkable + * @param RemarkObject $object + * @return \Illuminate\Database\Eloquent\Model + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function execute(Remarkable $remarkable, RemarkObject $object){ + + $this->canCreateRemark->passes($object); + return $this->createsRemark->execute($remarkable, $object); + + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Remarks/Services/CreatesRemark.php b/app/Classes/Modules/Remarks/Services/CreatesRemark.php new file mode 100644 index 00000000..ac0d57a3 --- /dev/null +++ b/app/Classes/Modules/Remarks/Services/CreatesRemark.php @@ -0,0 +1,31 @@ +commenter_id = $object->getCommenterId(); + $model->content = $object->getContent(); + + return $this->handler($remarkable->remarks(), $model); + + } +} diff --git a/app/Classes/Modules/Remarks/Services/DeletesRemark.php b/app/Classes/Modules/Remarks/Services/DeletesRemark.php new file mode 100644 index 00000000..4c29be9d --- /dev/null +++ b/app/Classes/Modules/Remarks/Services/DeletesRemark.php @@ -0,0 +1,19 @@ +handler($model); + } +} diff --git a/app/Classes/Modules/Remarks/Services/FetchesRemark.php b/app/Classes/Modules/Remarks/Services/FetchesRemark.php new file mode 100644 index 00000000..a3b5c765 --- /dev/null +++ b/app/Classes/Modules/Remarks/Services/FetchesRemark.php @@ -0,0 +1,33 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/Remarks/Services/ListsRemarks.php b/app/Classes/Modules/Remarks/Services/ListsRemarks.php new file mode 100644 index 00000000..53479558 --- /dev/null +++ b/app/Classes/Modules/Remarks/Services/ListsRemarks.php @@ -0,0 +1,33 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/Remarks/Services/UpdatesRemark.php b/app/Classes/Modules/Remarks/Services/UpdatesRemark.php new file mode 100644 index 00000000..4ba9501c --- /dev/null +++ b/app/Classes/Modules/Remarks/Services/UpdatesRemark.php @@ -0,0 +1,26 @@ +commenter_id = $object->getCommenterId(); + $model->content = $object->getContent(); + + return $this->handler($model); + + } +} diff --git a/app/Classes/Modules/Remarks/Standards/Rules/CanCreateRemark.php b/app/Classes/Modules/Remarks/Standards/Rules/CanCreateRemark.php new file mode 100644 index 00000000..a7d2e5b1 --- /dev/null +++ b/app/Classes/Modules/Remarks/Standards/Rules/CanCreateRemark.php @@ -0,0 +1,57 @@ +RemarkValidation = $RemarkValidation; + } + + + /** + * @return bool + */ + protected function authorized($object): bool + { + // TODO Set Authorization rules + return true; + + } + + /** + * @param RemarkObject $object + * @return bool + * @throws \App\Classes\Exceptions\RequestValidationException + */ + protected function validators($object): bool + { + return $this->RemarkValidation->validate($object); + + } + + + /** + * @param RemarkObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } + +} diff --git a/app/Classes/Modules/Remarks/Standards/Rules/CanDeleteRemark.php b/app/Classes/Modules/Remarks/Standards/Rules/CanDeleteRemark.php new file mode 100644 index 00000000..1c61ac9d --- /dev/null +++ b/app/Classes/Modules/Remarks/Standards/Rules/CanDeleteRemark.php @@ -0,0 +1,43 @@ +RemarkValidation = $RemarkValidation; + } + + + /** + * @return bool + */ + protected function authorized($object): bool + { + // TODO Set Authorization rules + return true; + + } + + /** + * @param RemarkObject $object + * @return bool + * @throws \App\Classes\Exceptions\RequestValidationException + */ + protected function validators($object): bool + { + return $this->RemarkValidation->validate($object); + + } + + + /** + * @param RemarkObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } + +} diff --git a/app/Classes/Modules/Remarks/Standards/Validators/RemarkValidation.php b/app/Classes/Modules/Remarks/Standards/Validators/RemarkValidation.php new file mode 100644 index 00000000..b35d3bde --- /dev/null +++ b/app/Classes/Modules/Remarks/Standards/Validators/RemarkValidation.php @@ -0,0 +1,41 @@ + $object->getCommenterId(), + 'content' => $object->getContent(), + ]; + } + + /** + * @return array + */ + protected function rules(): array { + return [ + 'commenter_id' => 'required', + 'content' => 'required', + ]; + } + + /** + * @return array + */ + protected function messages(): array { + return []; + } + +} diff --git a/app/Http/Controllers/Remarks/CreateRemarkController.php b/app/Http/Controllers/Remarks/CreateRemarkController.php new file mode 100644 index 00000000..a66aa8fd --- /dev/null +++ b/app/Http/Controllers/Remarks/CreateRemarkController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/Remarks/DeleteRemarkController.php b/app/Http/Controllers/Remarks/DeleteRemarkController.php new file mode 100644 index 00000000..8d0163c0 --- /dev/null +++ b/app/Http/Controllers/Remarks/DeleteRemarkController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/Remarks/FetchRemarkController.php b/app/Http/Controllers/Remarks/FetchRemarkController.php new file mode 100644 index 00000000..ba43be07 --- /dev/null +++ b/app/Http/Controllers/Remarks/FetchRemarkController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/Remarks/ListRemarksController.php b/app/Http/Controllers/Remarks/ListRemarksController.php new file mode 100644 index 00000000..f76f752e --- /dev/null +++ b/app/Http/Controllers/Remarks/ListRemarksController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/Remarks/UpdateRemarkController.php b/app/Http/Controllers/Remarks/UpdateRemarkController.php new file mode 100644 index 00000000..ae53f6b7 --- /dev/null +++ b/app/Http/Controllers/Remarks/UpdateRemarkController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Resources/RemarkResource.php b/app/Http/Resources/RemarkResource.php new file mode 100644 index 00000000..24081934 --- /dev/null +++ b/app/Http/Resources/RemarkResource.php @@ -0,0 +1,26 @@ + $this->id, + 'commenter' => new UserResource($this->commenter), + 'owner_id' => $this->owner_id, + 'content' => $this->content, + 'created_at' => $this->created_at->format('d-m-Y H:i'), + 'long_ago' => $this->created_at->diffForHumans() + ]; + } +} diff --git a/resources/assets/vue/components/general/elements/RemarkComponent.vue b/resources/assets/vue/components/general/elements/RemarkComponent.vue new file mode 100644 index 00000000..f2f9bf30 --- /dev/null +++ b/resources/assets/vue/components/general/elements/RemarkComponent.vue @@ -0,0 +1,32 @@ + + diff --git a/resources/assets/vue/components/general/elements/RemarkListComponent.vue b/resources/assets/vue/components/general/elements/RemarkListComponent.vue new file mode 100644 index 00000000..da218ea9 --- /dev/null +++ b/resources/assets/vue/components/general/elements/RemarkListComponent.vue @@ -0,0 +1,71 @@ + + diff --git a/resources/assets/vue/components/general/forms/DeleteRemarkFormComponent.vue b/resources/assets/vue/components/general/forms/DeleteRemarkFormComponent.vue new file mode 100644 index 00000000..4e50d8c4 --- /dev/null +++ b/resources/assets/vue/components/general/forms/DeleteRemarkFormComponent.vue @@ -0,0 +1,32 @@ + + diff --git a/resources/assets/vue/components/general/forms/RemarkCommentFormComponent.vue b/resources/assets/vue/components/general/forms/RemarkCommentFormComponent.vue new file mode 100644 index 00000000..7da26ca8 --- /dev/null +++ b/resources/assets/vue/components/general/forms/RemarkCommentFormComponent.vue @@ -0,0 +1,55 @@ + + diff --git a/resources/assets/vue/components/general/forms/RemarkFormComponent.vue b/resources/assets/vue/components/general/forms/RemarkFormComponent.vue new file mode 100644 index 00000000..73a8575f --- /dev/null +++ b/resources/assets/vue/components/general/forms/RemarkFormComponent.vue @@ -0,0 +1,73 @@ + + diff --git a/routes/remark.php b/routes/remark.php new file mode 100644 index 00000000..91ae4676 --- /dev/null +++ b/routes/remark.php @@ -0,0 +1,11 @@ + 'Remarks', 'as' => 'remark.', 'prefix' => 'remark'], function () { + Route::get('/{id}/show', 'FetchRemarkController@fetch')->name('show'); + Route::get('/list', 'ListRemarksController@list')->name('list'); + Route::post('/{id}/create', 'CreateRemarkController@create')->name('create'); + Route::put('/update/{id}', 'UpdateRemarkController@update')->name('update'); + Route::delete('/delete/{id}', 'DeleteRemarkController@delete')->name('delete'); +}); From 631282eaf5205ad975bc82dd04e03e985a9d797f Mon Sep 17 00:00:00 2001 From: edmondlang Date: Wed, 24 Apr 2024 18:09:22 +0800 Subject: [PATCH 36/58] add remarks table migration --- .../ValueObjects/Constants/RemarkTypes.php | 13 ++++++ ...2024_04_24_180633_create_remarks_table.php | 41 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 app/Classes/ValueObjects/Constants/RemarkTypes.php create mode 100644 database/migrations/2024_04_24_180633_create_remarks_table.php diff --git a/app/Classes/ValueObjects/Constants/RemarkTypes.php b/app/Classes/ValueObjects/Constants/RemarkTypes.php new file mode 100644 index 00000000..9629e89a --- /dev/null +++ b/app/Classes/ValueObjects/Constants/RemarkTypes.php @@ -0,0 +1,13 @@ +id(); + $table->morphs('owner'); + $table->bigInteger('commenter_id')->unsigned()->index(); + $table->string('content',200); + $table->integer('type')->default(RemarkTypes::INTERNAL); + $table->softDeletes(); + $table->timestamps(); + }); + + Schema::table('remarks', function (Blueprint $table) { + $table->string('owner_type', 191)->change(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('remarks'); + } +} From 9879b16f2ae1fb371f966c59e4063ca32f559033 Mon Sep 17 00:00:00 2001 From: Dodowingster Date: Thu, 25 Apr 2024 10:22:08 +0800 Subject: [PATCH 37/58] feat: remarks and add remarks --- routes/web.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/routes/web.php b/routes/web.php index 355dc7f1..079831aa 100644 --- a/routes/web.php +++ b/routes/web.php @@ -31,6 +31,7 @@ use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionWithInvo use App\Classes\Modules\Transactions\Services\DeletesTransaction; use Illuminate\Support\Facades\Log; + /* |-------------------------------------------------------------------------- | Web Routes @@ -968,6 +969,7 @@ Route::get('/invoice/{marking}/{started_at}/{ended_at}/fix', function($marking, ); })->name('invoice.fix.byCustomerMarking'); +require __DIR__.'/remark.php'; Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', function ($from_date, $to_date) { @@ -981,6 +983,8 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo ''; echo ''; echo ''; + echo ''; + echo ''; echo ''; echo ''; echo ''; @@ -991,6 +995,13 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo ''; echo ''; echo ''; + echo ''; + echo ''; echo ''; } From 3383f6b138547b352cf24869f409bccafe68f904 Mon Sep 17 00:00:00 2001 From: Dodowingster Date: Thu, 25 Apr 2024 13:39:40 +0800 Subject: [PATCH 38/58] initial commit --- app/Models/Remark.php | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 app/Models/Remark.php diff --git a/app/Models/Remark.php b/app/Models/Remark.php new file mode 100644 index 00000000..f2de3a5c --- /dev/null +++ b/app/Models/Remark.php @@ -0,0 +1,27 @@ +morphTo(); + } + + /** + * @return BelongsTo + */ + public function commenter(): BelongsTo + { + return $this->BelongsTo(User::class, 'commenter_id', 'id'); + } +} From a9414712f5fc037385709d48d238bcd13d464039 Mon Sep 17 00:00:00 2001 From: Dodowingster Date: Thu, 25 Apr 2024 13:40:04 +0800 Subject: [PATCH 39/58] feat: added remark.php --- routes/api.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/routes/api.php b/routes/api.php index 460bd772..2d52b3ea 100644 --- a/routes/api.php +++ b/routes/api.php @@ -67,6 +67,8 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function require __DIR__ . '/milestone.php'; + require __DIR__.'/remark.php'; + // require __DIR__ . '/accounting.php'; //cief todo: To check if this is needed require __DIR__ . '/job.php'; From 7fb4ae724c312398044bf41588a10359b4ede364 Mon Sep 17 00:00:00 2001 From: Dodowingster Date: Thu, 25 Apr 2024 13:40:23 +0800 Subject: [PATCH 40/58] refactor: adding remarks --- routes/web.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/routes/web.php b/routes/web.php index 079831aa..6a8ce6ca 100644 --- a/routes/web.php +++ b/routes/web.php @@ -2,6 +2,7 @@ use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionProcessor; use App\Http\Controllers\Accounting\BankStatementController; +use App\Models\Remark; use Carbon\Carbon; use App\Models\User; use App\Models\Wallet; @@ -969,10 +970,18 @@ Route::get('/invoice/{marking}/{started_at}/{ended_at}/fix', function($marking, ); })->name('invoice.fix.byCustomerMarking'); -require __DIR__.'/remark.php'; +route:: post('/transaction/{id}/create-remark',function ($transactionId) { + $transaction = Transaction::find($transactionId); + $remark = new Remark(); + $remark->content = request('content'); + $remark->transaction_id; + $remark->save(); + return redirect()->back(); +})->name('transaction.create-remark'); Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', function ($from_date, $to_date) { + $approvedTransactions = Transaction::where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->where('owner_type', '!=', Wallet::class)->orderBy('status')->get(); echo '

Pending Orders Payments

'; @@ -997,9 +1006,10 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo '
'; echo ''; echo ''; echo ''; @@ -1048,4 +1058,6 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo ''; echo '
StatusBills Created AtBookingPayment DateCustomer payment dateWhite form dateUpload bank slip DatePO submit datePO approve date
' . $approvalSatatusArray[$data['status']] . '' . $data->created_at . '' . $data->owner->owner->marking . '' . $payment->owner->marking . '' . $payment->created_at . '' . $bill->created_at . '' . $bill->status === ApprovalStatus::APPROVED ? $bill->updated_at : 'Pending Upload' . '' . $po ? $po->updated_at : 'Pending Submission' . '' . $po ? ($po->status === ApprovalStatus::APPROVED ? $po->updated_at : '' ) : '' . '
' . $approvedTransaction->owner->marking . '' . $approvedTransaction->amount . '' . round($approvedTransaction->amount, 2) . '' . $approvedTransaction->created_at . '' . ApprovalStatus::APPROVAL_STATUS_ID[$approvedTransaction->status] . '
BookingAmountCustomer payment dateWhite form dateSupplierUpload bank slip DatePO submit datePO approve date
' . $payment->owner->marking . '' . $payment->created_at . '' . $bill->created_at . '' . $bill->issuerCompany->name . '' . $bill->status === ApprovalStatus::APPROVED ? $bill->updated_at : 'Pending Upload' . '' . $po ? $po->updated_at : 'Pending Submission' . '' . $po ? ($po->status === ApprovalStatus::APPROVED ? $po->updated_at : '' ) : '' . '
' . $payment->owner->marking . '' . $payment->created_at . '' . $bill->created_at . '
' . $payment->owner->marking . '' . $payment->created_at . '' . $bill->created_at . '' . $bill->issuerCompany->name . '' . $bill->status === ApprovalStatus::APPROVED ? $bill->updated_at : 'Pending Upload' . '' . $po ? $po->updated_at : 'Pending Submission' . '' . $po ? $po->updated_at : 'Pending Submission' . '' . $po ? ($po->status === ApprovalStatus::APPROVED ? $po->updated_at : '' ) : '' . '
' . $bill->created_at . '' . $bill->issuerCompany->name . '' . $bill->status === ApprovalStatus::APPROVED ? $bill->updated_at : 'Pending Upload' . '' . $po ? $po->updated_at : 'Pending Submission' . '' . $po ? ($po->status === ApprovalStatus::APPROVED ? $po->updated_at : '' ) : '' . '' . ($po ? $po->updated_at : 'Pending Submission') . '' . ($po ? ($po->status === ApprovalStatus::APPROVED ? $po->updated_at : '' ) : '' ). '
' . $approvedTransaction->owner->marking . '' . round($approvedTransaction->amount, 2) . '' . $approvedTransaction->created_at . '' . $approvedTransaction->created_at->format('d-m-Y h:i A') . '' . ApprovalStatus::APPROVAL_STATUS_ID[$approvedTransaction->status] . '
' . $payment->owner->marking . '' . $payment->created_at . '' . $bill->created_at . '' . round($payment->amount, 2) . '' . $payment->created_at->format('d-m-Y h:i A') . '' . $bill->created_at->format('d-m-Y h:i A') . '' . $bill->issuerCompany->name . '' . $bill->status === ApprovalStatus::APPROVED ? $bill->updated_at : 'Pending Upload' . '' . ($po ? $po->updated_at : 'Pending Submission') . '' . ($po ? ($po->status === ApprovalStatus::APPROVED ? $po->updated_at : '' ) : '' ). '' . ($bill->status === ApprovalStatus::APPROVED ? $bill->updated_at->format('d-m-Y h:i A') : 'Pending Upload') . '' . ($po ? $po->updated_at->format('d-m-Y h:i A') : 'Pending Submission') . '' . ($po ? ($po->status === ApprovalStatus::APPROVED ? $po->updated_at->format('d-m-Y h:i A') : '' ) : '' ). '
Voucher ({{ $voucher_redemption->voucher->code }})-{{ number_format($voucherDiscount, 2) }}{{ number_format($voucherDiscount, 2) }}
AmountPayment DateStatusRemarkAdd Remarks
' . round($approvedTransaction->amount, 2) . '' . $approvedTransaction->created_at->format('d-m-Y h:i A') . '' . ApprovalStatus::APPROVAL_STATUS_ID[$approvedTransaction->status] . '' . $approvedTransaction->remarks . '' ; + echo '
'; + echo ''; + echo ''; + echo '
'; + echo '
' . ApprovalStatus::APPROVAL_STATUS_ID[$approvedTransaction->status] . '' . $approvedTransaction->remarks . '' ; - echo '
'; + echo ''; echo ''; echo ''; + echo csrf_field(); echo '
'; echo '
'; + + }); From 30172a6d7ad214a7d3c2a5821ac554f8a929a3e2 Mon Sep 17 00:00:00 2001 From: Dodowingster Date: Thu, 25 Apr 2024 14:20:31 +0800 Subject: [PATCH 41/58] refactor: proper remark database commit --- routes/web.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/routes/web.php b/routes/web.php index 6a8ce6ca..7dd5a3ef 100644 --- a/routes/web.php +++ b/routes/web.php @@ -974,7 +974,7 @@ route:: post('/transaction/{id}/create-remark',function ($transactionId) { $transaction = Transaction::find($transactionId); $remark = new Remark(); $remark->content = request('content'); - $remark->transaction_id; + $remark->id = $transactionId; $remark->save(); return redirect()->back(); })->name('transaction.create-remark'); @@ -1004,7 +1004,12 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo '' . round($approvedTransaction->amount, 2) . ''; echo '' . $approvedTransaction->created_at->format('d-m-Y h:i A') . ''; echo '' . ApprovalStatus::APPROVAL_STATUS_ID[$approvedTransaction->status] . ''; - echo '' . $approvedTransaction->remarks . ''; + $remark = Remark::where('id', $approvedTransaction->id)->first(); + if ($remark) { + echo '' . $remark->content . ''; + } else { + echo 'No remark found'; + } echo '' ; echo '
'; echo ''; From 29507f51200cef7575b70ff78e6accc5defe17f3 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Thu, 25 Apr 2024 14:50:59 +0800 Subject: [PATCH 42/58] update remark on transactions --- app/Models/Transaction.php | 8 ++++++++ routes/web.php | 22 +++++++++++----------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 4161632b..aba5decc 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -259,4 +259,12 @@ class Transaction extends AbstractModel implements Documentable, Transactionable return $this->morphMany(VoucherEntityMapping::class, 'owner'); } + /** + * @return MorphMany + */ + public function remarks(): morphMany + { + return $this->morphMany(Remark::class, 'owner'); + } + } diff --git a/routes/web.php b/routes/web.php index 7dd5a3ef..7dc095f3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -973,15 +973,17 @@ Route::get('/invoice/{marking}/{started_at}/{ended_at}/fix', function($marking, route:: post('/transaction/{id}/create-remark',function ($transactionId) { $transaction = Transaction::find($transactionId); $remark = new Remark(); + + $remark->owner_type = get_class($transaction); + $remark->owner_id = $transaction->id; + $remark->content = request('content'); - $remark->id = $transactionId; $remark->save(); return redirect()->back(); })->name('transaction.create-remark'); Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', function ($from_date, $to_date) { - $approvedTransactions = Transaction::where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->where('owner_type', '!=', Wallet::class)->orderBy('status')->get(); echo '

Pending Orders Payments

'; @@ -1004,15 +1006,15 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo '' . round($approvedTransaction->amount, 2) . ''; echo '' . $approvedTransaction->created_at->format('d-m-Y h:i A') . ''; echo '' . ApprovalStatus::APPROVAL_STATUS_ID[$approvedTransaction->status] . ''; - $remark = Remark::where('id', $approvedTransaction->id)->first(); - if ($remark) { - echo '' . $remark->content . ''; - } else { - echo 'No remark found'; - } + $remarks = $approvedTransaction->remarks; + echo ''; + foreach ($remarks as $remark) { + echo "

$remark->content

"; + } + echo ''; echo '' ; echo ''; - echo ''; + echo ''; echo ''; echo csrf_field(); echo ''; @@ -1063,6 +1065,4 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo ''; echo ''; - - }); From 32d8b26451acc1fccc6f983432b547a88461b6b1 Mon Sep 17 00:00:00 2001 From: Dodowingster Date: Thu, 25 Apr 2024 15:52:38 +0800 Subject: [PATCH 43/58] feat: added date and time for remarks --- routes/web.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/routes/web.php b/routes/web.php index 7dc095f3..d8ea0f1b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1009,7 +1009,9 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', $remarks = $approvedTransaction->remarks; echo ''; foreach ($remarks as $remark) { - echo "

$remark->content

"; + echo $remark->created_at->format('d-m-Y | h:i A') . ' - '; + echo $remark->content; + echo '
'; } echo ''; echo '' ; From 20cb00ed248da5d86b3dfc88ee3b6cdd1cd66a50 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Thu, 25 Apr 2024 16:48:39 +0800 Subject: [PATCH 44/58] update add remark on white form transactions --- routes/web.php | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/routes/web.php b/routes/web.php index d8ea0f1b..861f5bdf 100644 --- a/routes/web.php +++ b/routes/web.php @@ -994,8 +994,6 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo 'Amount'; echo 'Payment Date'; echo 'Status'; - echo 'Remark'; - echo 'Add Remarks'; echo ''; echo ''; echo ''; @@ -1006,21 +1004,6 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo '' . round($approvedTransaction->amount, 2) . ''; echo '' . $approvedTransaction->created_at->format('d-m-Y h:i A') . ''; echo '' . ApprovalStatus::APPROVAL_STATUS_ID[$approvedTransaction->status] . ''; - $remarks = $approvedTransaction->remarks; - echo ''; - foreach ($remarks as $remark) { - echo $remark->created_at->format('d-m-Y | h:i A') . ' - '; - echo $remark->content; - echo '
'; - } - echo ''; - echo '' ; - echo '
'; - echo ''; - echo ''; - echo csrf_field(); - echo '
'; - echo ''; echo ''; } @@ -1043,6 +1026,8 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo 'Upload bank slip Date'; echo 'PO submit date'; echo 'PO approve date'; + echo 'Remark'; + echo 'Add Remarks'; echo ''; echo ''; echo ''; @@ -1062,6 +1047,21 @@ Route::get('/show-white-form-transactions-in-date-range/{from_date}/{to_date}', echo '' . ($bill->status === ApprovalStatus::APPROVED ? $bill->updated_at->format('d-m-Y h:i A') : 'Pending Upload') . ''; echo '' . ($po ? $po->updated_at->format('d-m-Y h:i A') : 'Pending Submission') . ''; echo '' . ($po ? ($po->status === ApprovalStatus::APPROVED ? $po->updated_at->format('d-m-Y h:i A') : '' ) : '' ). ''; + $remarks = $bill->remarks; + echo ''; + foreach ($remarks as $remark) { + echo $remark->created_at->format('d-m-Y : h:i A') . ' - '; + echo $remark->content; + echo '
'; + } + echo ''; + echo '' ; + echo '
'; + echo ''; + echo ''; + echo csrf_field(); + echo '
'; + echo ''; echo ''; } From 7655853a6de4b28cbdf3f2751d88a125cbee3af2 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Mon, 29 Apr 2024 21:19:34 +0800 Subject: [PATCH 45/58] -open refund function for all admin (ignore whether the booking has invoice or not) -when refund is before the whiteform, auto approve the transaction --- .../ControllersLogic/CreateBookingRefundLogic.php | 15 +++++++++++++-- .../UpdateRefundTransactionStatusLogic.php | 4 ++-- .../bookings/elements/PaymentHistoryComponent.vue | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php index 7e176363..171b4360 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php @@ -14,6 +14,7 @@ use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Transactions\Services\CreatesTransaction; use App\Classes\Modules\Transactions\Services\FetchesTransaction; use App\Classes\Modules\Bookings\Services\FetchesBookingQuotation; +use App\Classes\Modules\Transactions\ControllersLogic\UpdateRefundTransactionStatusLogic; use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; @@ -48,6 +49,9 @@ class CreateBookingRefundLogic extends AbstractControllerLogic /** @var CreatesTransaction */ private $createsTransaction; + /** @var UpdateRefundTransactionStatusLogic */ + private $updateRefundTransactionStatusLogic; + /** * CreateBookingPaymentLogic constructor. * @param FetchesBookingQuotation $fetchBookingQuotation @@ -55,14 +59,16 @@ class CreateBookingRefundLogic extends AbstractControllerLogic * @param UpdatesTransactionStatus $updatesTransactionStatus * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber * @param CreatesTransaction $createsTransaction + * @param UpdateRefundTransactionStatusLogic $updateRefundTransactionStatusLogic */ - public function __construct(FetchesBookingQuotation $fetchBookingQuotation, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatesTransaction $createsTransaction) + public function __construct(FetchesBookingQuotation $fetchBookingQuotation, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatesTransaction $createsTransaction, UpdateRefundTransactionStatusLogic $updateRefundTransactionStatusLogic) { $this->fetchBookingQuotation = $fetchBookingQuotation; $this->fetchesTransaction = $fetchesTransaction; $this->updatesTransactionStatus = $updatesTransactionStatus; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; $this->createsTransaction = $createsTransaction; + $this->updateRefundTransactionStatusLogic = $updateRefundTransactionStatusLogic; } /** @@ -79,7 +85,7 @@ class CreateBookingRefundLogic extends AbstractControllerLogic $invoice = $booking->transactions()->where('type', TransactionType::INVOICE)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->first(); - if(auth()->user()->type === 3 || ($invoice && !(auth()->user()->type === 0 || auth()->user()->type === 1))) { + if(auth()->user()->type === 3) { throw new MalformedRequestException('You do not have the permission to refund the order.'); } @@ -119,6 +125,11 @@ class CreateBookingRefundLogic extends AbstractControllerLogic 0, 0, null, ApprovalStatus::PENDING_VERIFICATION, [], $transaction->bill_no); $transaction = $this->createsTransaction->execute($transaction, $object); + } else { + $request->route()->setParameter('id', $refund_transaction->id); + $request->route()->setParameter('status', ApprovalStatus::APPROVED); + $this->updateRefundTransactionStatusLogic->execute($request); + } return $this->resourceResponse(new TransactionResource($refund_transaction)); diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php index d2fa5ec6..cc98847a 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php @@ -86,8 +86,8 @@ class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { - if (!(Auth::user()->type === 0 || Auth::user()->type === 1)) { - throw new MalformedRequestException('Only super admin can update refund status.'); + if(auth()->user()->type === 3) { + throw new MalformedRequestException('You do not have the permission to refund the order.'); } $refundTransaction = $this->fetchesTransaction->execute(['id' => $request->route('id')]); diff --git a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue index ec0c0d7a..7679b807 100644 --- a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue +++ b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue @@ -290,7 +290,7 @@
-
+
From b528ac66fcdff4a0e02debe14c7a29451b0cc54e Mon Sep 17 00:00:00 2001 From: Omair Saleh Date: Tue, 30 Apr 2024 17:46:25 +0800 Subject: [PATCH 46/58] update estimated delivery date for E2E --- .../Services/GeneratesBookingQuotation.php | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/app/Classes/Modules/Bookings/Services/GeneratesBookingQuotation.php b/app/Classes/Modules/Bookings/Services/GeneratesBookingQuotation.php index 8ea1b88d..3a0b1536 100644 --- a/app/Classes/Modules/Bookings/Services/GeneratesBookingQuotation.php +++ b/app/Classes/Modules/Bookings/Services/GeneratesBookingQuotation.php @@ -19,7 +19,31 @@ class GeneratesBookingQuotation $hours = $date->diffInHours($date->copy()->addMinutes($paymentAttemptLimit)->subDays($days)) ; $minutes = $date->diffInMinutes($date->copy()->addMinutes($paymentAttemptLimit)->subDays($days)->subHours($hours)); - $receive_date = $currencyConversionObject ? Carbon::now()->endOfDay()->addWeekdays($currencyConversionObject->getServiceId() === 3 ? 3 : 1)->timezone('Asia/Singapore')->format('4:00 \P\M, jS M, Y \G\M\T T') : null; + // Initialize $receive_date to null by default + $receive_date = null; + + if ($currencyConversionObject) { + $serviceId = $currencyConversionObject->getServiceId(); + + switch ($serviceId) { + case 3: + $daysToAdd = 3; + break; + case 5: + $daysToAdd = 7; + break; + default: + $daysToAdd = 1; + break; + } + + $receive_date = Carbon::now() + ->endOfDay() + ->addWeekdays($daysToAdd) + ->timezone('Asia/Singapore') + ->format('4:00 PM, jS M, Y GMT T'); + } + return [ 'bank' => new BankResource(Bank::find($calculationObject->getConfigurations()->getBankId())), From f57b1e625f001e8fc9a00a2f1b4547643742398e Mon Sep 17 00:00:00 2001 From: Omair Saleh Date: Tue, 30 Apr 2024 17:49:30 +0800 Subject: [PATCH 47/58] update estimated delivery date for E2E --- .../Modules/Bookings/Services/GeneratesBookingQuotation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Classes/Modules/Bookings/Services/GeneratesBookingQuotation.php b/app/Classes/Modules/Bookings/Services/GeneratesBookingQuotation.php index 3a0b1536..5c1ecdd9 100644 --- a/app/Classes/Modules/Bookings/Services/GeneratesBookingQuotation.php +++ b/app/Classes/Modules/Bookings/Services/GeneratesBookingQuotation.php @@ -41,7 +41,7 @@ class GeneratesBookingQuotation ->endOfDay() ->addWeekdays($daysToAdd) ->timezone('Asia/Singapore') - ->format('4:00 PM, jS M, Y GMT T'); + ->format('4:00 \P\M, jS M, Y \G\M\T T'); } From 76e76e077ac97bbc6a097c89b878b691fee63ddf Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Mon, 6 May 2024 17:20:01 +0800 Subject: [PATCH 48/58] edit transfer fee functionality for individual whiteform --- .../UpdateGroupTransferFeeLogic.php | 82 +++++++++++++++++++ .../Services/CreatesTransaction.php | 7 +- .../UpdateGroupTransferFeeController.php | 20 +++++ app/Http/Resources/GroupResource.php | 8 ++ app/Models/Group.php | 8 ++ .../bookings/elements/BillGroupComponent.vue | 6 ++ .../elements/EditTransferFeeFormComponent.vue | 79 ++++++++++++++++++ .../TransactionGroupPaymentComponent.vue | 18 ++++ routes/transaction.php | 1 + 9 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupTransferFeeLogic.php create mode 100644 app/Http/Controllers/Transactions/UpdateGroupTransferFeeController.php create mode 100644 resources/assets/vue/components/bookings/elements/EditTransferFeeFormComponent.vue diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupTransferFeeLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupTransferFeeLogic.php new file mode 100644 index 00000000..2864eb73 --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupTransferFeeLogic.php @@ -0,0 +1,82 @@ + 'Update Group Transfer Fee', + 'message' => 'You have successfully updated transfer fee for this Group Transaction' + ]; + } + + /** @var FetchesGroup */ + private $fetchesGroup; + + /** @var CreatesTransaction */ + private $createsTransaction; + + /** @var GeneratesTransactionBillNumber */ + private $generatesTransactionBillNumber; + + /** + * UpdateGroupTransferFeeLogic constructor. + * @param FetchesGroup $fetchesGroup + * @param CreatesTransaction $createsTransaction + * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber + */ + public function __construct(FetchesGroup $fetchesGroup, CreatesTransaction $createsTransaction, GeneratesTransactionBillNumber $generatesTransactionBillNumber) + { + $this->fetchesGroup = $fetchesGroup; + $this->createsTransaction = $createsTransaction; + $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function logic(Request $request) : JsonResponse + { + $group = $this->fetchesGroup->execute(['id' => $request->route('id')]); + $supplier = $group->issuerCompany; + $fee = $request->input('fee'); + + $transfer_fee = $group->morphTransactions()->where('type', TransactionType::TRANSFER_FEE)->first(); + + if ($transfer_fee) { + $transfer_fee->amount = $fee; + $transfer_fee->original_amount = $fee; + $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); + + $this->createsTransaction->execute($group, $object); + } + + return $this->resourceResponse(new GroupResource($group)); + } + +} diff --git a/app/Classes/Modules/Transactions/Services/CreatesTransaction.php b/app/Classes/Modules/Transactions/Services/CreatesTransaction.php index 06530564..b545c5ed 100644 --- a/app/Classes/Modules/Transactions/Services/CreatesTransaction.php +++ b/app/Classes/Modules/Transactions/Services/CreatesTransaction.php @@ -5,6 +5,7 @@ namespace App\Classes\Modules\Transactions\Services; use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord; use App\Classes\General\Interfaces\Transactionable; use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; +use App\Models\Group; use App\Models\Transaction; class CreatesTransaction extends AbstractUpdateRelationshipRecord @@ -15,7 +16,7 @@ class CreatesTransaction extends AbstractUpdateRelationshipRecord * @return \Illuminate\Database\Eloquent\Model * @throws \App\Classes\Exceptions\MalformedRequestException */ - public function execute(Transactionable $transactionable, TransactionObject $object) { + public function execute(Transactionable|Group $transactionable, TransactionObject $object) { $model = new Transaction(); $model->bill_no = $object->getBillNo(); $model->type = $object->getTransactionType(); @@ -34,6 +35,10 @@ class CreatesTransaction extends AbstractUpdateRelationshipRecord $model->status = $object->getStatus(); $model->payment_reference = $object->getPaymentReference(); + if ($transactionable instanceof Group) { + return $this->handler($transactionable->morphTransactions(), $model); + } + return $this->handler($transactionable->transactions(), $model); } diff --git a/app/Http/Controllers/Transactions/UpdateGroupTransferFeeController.php b/app/Http/Controllers/Transactions/UpdateGroupTransferFeeController.php new file mode 100644 index 00000000..948dff39 --- /dev/null +++ b/app/Http/Controllers/Transactions/UpdateGroupTransferFeeController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Resources/GroupResource.php b/app/Http/Resources/GroupResource.php index abd017ec..fdddd195 100644 --- a/app/Http/Resources/GroupResource.php +++ b/app/Http/Resources/GroupResource.php @@ -21,6 +21,13 @@ class GroupResource extends JsonResource */ public function toArray($request) { + $transfer_fee = $this->morphTransactions()->where('type', TransactionType::TRANSFER_FEE)->first(); + + if ($transfer_fee) { + $transfer_fee = (float) $transfer_fee->amount; + } else { + $transfer_fee = 0; + } if(!$this->issuerCompany){ dd($this->id); @@ -36,6 +43,7 @@ class GroupResource extends JsonResource 'currency' => new CurrencyResource($this->currency), 'created_at' => Carbon::parse($this->created_at)->format('d-m-Y h:i:s A'), 'currency_rate' => (float) $this->currency_rate, + 'transfer_fee' => $transfer_fee, 'transactions' => $this->transactions()->get()->pluck('owner.owner.marking'), 'complete_transactions' => $this->transactions()->whereHasMorph('owner', [Transaction::class], function($query){ return $query->whereHas('booking', function($query){ diff --git a/app/Models/Group.php b/app/Models/Group.php index 8cb6cd8a..2b8cceae 100644 --- a/app/Models/Group.php +++ b/app/Models/Group.php @@ -21,6 +21,14 @@ class Group extends Model implements Documentable return $this->belongsToMany(Transaction::class, GroupTransaction::class); } + /** + * @return MorphMany + */ + public function morphTransactions(): MorphMany + { + return $this->MorphMany(Transaction::class, 'owner'); + } + /** * @return MorphMany */ diff --git a/resources/assets/vue/components/bookings/elements/BillGroupComponent.vue b/resources/assets/vue/components/bookings/elements/BillGroupComponent.vue index e93eb1ad..9a309cde 100644 --- a/resources/assets/vue/components/bookings/elements/BillGroupComponent.vue +++ b/resources/assets/vue/components/bookings/elements/BillGroupComponent.vue @@ -216,6 +216,12 @@ {{ group.currency.short_code }} {{formatAmount(group.amount)}}
+
+
Transfer Fee
+
+ {{ group.original_currency.short_code }} {{formatAmount(group.transfer_fee)}} +
+
PO Completion
diff --git a/resources/assets/vue/components/bookings/elements/EditTransferFeeFormComponent.vue b/resources/assets/vue/components/bookings/elements/EditTransferFeeFormComponent.vue new file mode 100644 index 00000000..93b01124 --- /dev/null +++ b/resources/assets/vue/components/bookings/elements/EditTransferFeeFormComponent.vue @@ -0,0 +1,79 @@ + + diff --git a/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue b/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue index 7fdd579f..2696ceb5 100644 --- a/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue +++ b/resources/assets/vue/components/bookings/elements/TransactionGroupPaymentComponent.vue @@ -36,6 +36,12 @@ {{item.original_currency.short_code}} {{(Math.round((item.original_amount + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}}
+
+
Transfer Fee
+
+ {{item.original_currency.short_code}} {{(Math.round((item.transfer_fee + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}} +
+
Amount
@@ -75,6 +81,18 @@
+
+
+
+ + + + +
+
+
diff --git a/routes/transaction.php b/routes/transaction.php index d20d160d..654b3fb8 100644 --- a/routes/transaction.php +++ b/routes/transaction.php @@ -32,6 +32,7 @@ Route::group(['prefix' => 'transactions', 'namespace' => 'Transactions', 'as' => Route::get('/list', 'ListGroupsController@list')->name('list'); Route::delete('/{id}/delete', 'DeleteGroupController@delete')->name('delete'); Route::put('/{id}/update', 'UpdateGroupController@update')->name('update'); + Route::put('/{id}/update/fee', 'UpdateGroupTransferFeeController@update')->name('fee.update'); Route::post('/{id}/approve', 'CreateBulkPurchaseOrderDocumentController@aprove')->name('approve'); Route::post('/bulk/po', 'CreateBulkPurchaseOrderDocumentController@create')->name('bulk.po'); From f3413b9c6c22a5d7986317671f2debe3f3d9b5a4 Mon Sep 17 00:00:00 2001 From: Omair Saleh Date: Tue, 7 May 2024 11:20:14 +0800 Subject: [PATCH 49/58] change service description --- .../vue/components/bookings/forms/BookingFormComponent.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/assets/vue/components/bookings/forms/BookingFormComponent.vue b/resources/assets/vue/components/bookings/forms/BookingFormComponent.vue index d9c009b5..9593e940 100644 --- a/resources/assets/vue/components/bookings/forms/BookingFormComponent.vue +++ b/resources/assets/vue/components/bookings/forms/BookingFormComponent.vue @@ -93,8 +93,8 @@
-

Recipient will receive the transfer on the next working day. Check out our three-day transfer option to get a better rate!

-

Enjoy a better rate with this option! The recipient will receive the transfer after three working days.

+

The recipient can expect to receive the transfer within 1-3 working days. Explore our BANK TRANSFER (SAVER) option for a better rate!

+

Enjoy a better rate with this option! The recipient will receive the transfer after 3-5 working days..

From 26f8ca87cd5a5ded079e5da27d259ee67c83b148 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Wed, 8 May 2024 12:58:23 +0800 Subject: [PATCH 50/58] fix partial refund bug --- .../ControllersLogic/UpdateRefundTransactionStatusLogic.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php index cc98847a..6b755db1 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php @@ -100,7 +100,7 @@ class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic $booking = $paymentTransaction->owner; - $reference = $refundTransaction->amount == $paymentTransaction->amount ? 'Fully Refund for Ref. ' . $booking->marking : 'Partially Refund for Ref. ' . $booking->marking; + $reference = $refundTransaction->amount - $paymentTransaction->amount < 0.01 ? 'Fully Refund for Ref. ' . $booking->marking : 'Partially Refund for Ref. ' . $booking->marking; $refundAmount = $this->calculatesBookingRefundAmount->calculateRefundAmount($paymentTransaction, $booking->fix_currency_id); @@ -114,7 +114,7 @@ class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic $this->updatesTransactionStatus->execute($po_transaction, (float) number_format($po_transaction->amount, 2, '.', '') === (float) number_format((float)$booking->fix_amount - $refundAmount, 2, '.', '') ? ApprovalStatus::PENDING_VERIFICATION : ApprovalStatus::PENDING_SUBMISSION); } - $request['fix_amount'] = $booking->fix_amount - $refundAmount; + $request['fix_amount'] = $paidAmount; $request->route()->setParameter('id', $booking->id); $this->updateBookingAmountLogic->execute($request); } From b8d741f57ce70b4d310504d67469168a19d6c189 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Wed, 8 May 2024 20:07:06 +0800 Subject: [PATCH 51/58] fix edit transfer fee bug --- .../UpdateGroupTransferFeeLogic.php | 21 ++++++++++++++++++- .../Services/CreatesTransaction.php | 7 +------ .../elements/EditTransferFeeFormComponent.vue | 2 +- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupTransferFeeLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupTransferFeeLogic.php index 2864eb73..b4cd4d02 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupTransferFeeLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupTransferFeeLogic.php @@ -11,6 +11,7 @@ use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\PaymentMethodType; use App\Classes\ValueObjects\Constants\TransactionType; +use App\Models\Transaction; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -73,7 +74,25 @@ class UpdateGroupTransferFeeLogic extends AbstractControllerLogic $fee, $fee, $group->original_currency_id, $group->original_currency_id, 1, 0, 0, null, ApprovalStatus::APPROVED); - $this->createsTransaction->execute($group, $object); + $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); } return $this->resourceResponse(new GroupResource($group)); diff --git a/app/Classes/Modules/Transactions/Services/CreatesTransaction.php b/app/Classes/Modules/Transactions/Services/CreatesTransaction.php index b545c5ed..06530564 100644 --- a/app/Classes/Modules/Transactions/Services/CreatesTransaction.php +++ b/app/Classes/Modules/Transactions/Services/CreatesTransaction.php @@ -5,7 +5,6 @@ namespace App\Classes\Modules\Transactions\Services; use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord; use App\Classes\General\Interfaces\Transactionable; use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; -use App\Models\Group; use App\Models\Transaction; class CreatesTransaction extends AbstractUpdateRelationshipRecord @@ -16,7 +15,7 @@ class CreatesTransaction extends AbstractUpdateRelationshipRecord * @return \Illuminate\Database\Eloquent\Model * @throws \App\Classes\Exceptions\MalformedRequestException */ - public function execute(Transactionable|Group $transactionable, TransactionObject $object) { + public function execute(Transactionable $transactionable, TransactionObject $object) { $model = new Transaction(); $model->bill_no = $object->getBillNo(); $model->type = $object->getTransactionType(); @@ -35,10 +34,6 @@ class CreatesTransaction extends AbstractUpdateRelationshipRecord $model->status = $object->getStatus(); $model->payment_reference = $object->getPaymentReference(); - if ($transactionable instanceof Group) { - return $this->handler($transactionable->morphTransactions(), $model); - } - return $this->handler($transactionable->transactions(), $model); } diff --git a/resources/assets/vue/components/bookings/elements/EditTransferFeeFormComponent.vue b/resources/assets/vue/components/bookings/elements/EditTransferFeeFormComponent.vue index 93b01124..bb82964a 100644 --- a/resources/assets/vue/components/bookings/elements/EditTransferFeeFormComponent.vue +++ b/resources/assets/vue/components/bookings/elements/EditTransferFeeFormComponent.vue @@ -60,7 +60,7 @@ return { error: '', parameters: { - fee: (Math.round((this.transfer_fee + Number.EPSILON) * 10000) / 10000).toFixed(5) + fee: (Math.round((this.transfer_fee + Number.EPSILON) * 100) / 100).toFixed(2) }, } }, From 2ad1841e54cf7fdff3f2e98d0d21bd44b2a875dc Mon Sep 17 00:00:00 2001 From: edmondlang Date: Thu, 9 May 2024 15:46:12 +0800 Subject: [PATCH 52/58] clean up web export route --- routes/web.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/routes/web.php b/routes/web.php index 861f5bdf..0d14a526 100644 --- a/routes/web.php +++ b/routes/web.php @@ -220,12 +220,6 @@ Route::post('/support', function (Request $request) { Route::get('/online_payment/redirect', 'Billplz\CallbackBillplzController@callback')->name('online_payment.redirect'); -Route::get('/export/customers/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@export'); -Route::get('/export/transactions/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@transactions'); -Route::get('/export/analytic/booking', 'Exports\ExportAnalyticToExcelController@bookingData'); -Route::get('/export/analytic/bills', 'Exports\ExportAnalyticToExcelController@billingData'); -Route::get('/export/customers/leads', 'Exports\ExportCustomersToExcelController@leadsData')->name('leads.export'); - Route::get('/products', function (\App\Classes\Modules\Exports\Services\ExportsProducts $exportsProducts) { return $exportsProducts->download('products.csv', Excel::CSV, ['Content-Type' => 'text/csv']); })->name('products.random'); @@ -293,6 +287,9 @@ Route::get('/export/invoice-transactions/f614e339d7058904a831aad742e24d55', 'Exp Route::get('/export/receipt-transactions/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@receiptTransactions')->name('receiptTransactions.export'); Route::get('/export/imported-invoice-mapped', 'Exports\ExportCustomersToExcelController@importedInvoiceMapped')->name('importedInvoiceMapped.export'); Route::get('/export/imported-receipt-mapped', 'Exports\ExportCustomersToExcelController@importedReceiptMapped')->name('importedReceiptMapped.export'); +Route::get('/export/analytic/booking', 'Exports\ExportAnalyticToExcelController@bookingData'); +Route::get('/export/analytic/bills', 'Exports\ExportAnalyticToExcelController@billingData'); +Route::get('/export/customers/leads', 'Exports\ExportCustomersToExcelController@leadsData')->name('leads.export'); Route::get('/products', function (\App\Classes\Modules\Exports\Services\ExportsProducts $exportsProducts) { $bookings = Booking::where(function($query){ From f03d91ba422a1e5d0f29e559b788a66dbbbb3f9d Mon Sep 17 00:00:00 2001 From: edmondlang Date: Fri, 10 May 2024 00:00:01 +0800 Subject: [PATCH 53/58] add remarks for refund --- .../General/Abstracts/AbstractRule.php | 4 +-- app/Classes/General/Interfaces/Remarkable.php | 13 ++++++++++ .../CreateBookingRefundLogic.php | 14 ++++++++++- .../Standards/Rules/CanCreateRemark.php | 2 +- .../Standards/Rules/CanDeleteRemark.php | 2 +- .../Standards/Rules/CanFetchRemark.php | 2 +- .../Standards/Rules/CanListRemarks.php | 2 +- .../Standards/Rules/CanUpdateRemark.php | 2 +- app/Http/Resources/TransactionResource.php | 1 + app/Models/Transaction.php | 3 ++- .../elements/PaymentHistoryComponent.vue | 8 ++++++ .../elements/RefundConfirmationComponent.vue | 13 +++++++++- .../general/elements/RemarkComponent.vue | 25 ++++++++++++++++--- .../general/elements/RemarkListComponent.vue | 4 +-- .../forms/RemarkCommentFormComponent.vue | 5 +++- 15 files changed, 83 insertions(+), 17 deletions(-) create mode 100644 app/Classes/General/Interfaces/Remarkable.php diff --git a/app/Classes/General/Abstracts/AbstractRule.php b/app/Classes/General/Abstracts/AbstractRule.php index d2e0568b..8a9b6f86 100644 --- a/app/Classes/General/Abstracts/AbstractRule.php +++ b/app/Classes/General/Abstracts/AbstractRule.php @@ -27,7 +27,7 @@ abstract class AbstractRule public function passes(?DataTransferObject $object = null): bool { try { if(!$this->authorized()){ - throw new AccessForbiddenException('You don\'t have permission to preform this action'); + throw new AccessForbiddenException('You don\'t have permission to perform this action'); } $this->validators($object); @@ -36,7 +36,7 @@ abstract class AbstractRule return true; } catch(AccessForbiddenException $exception){ - throw new AccessForbiddenException('You don\'t have permission to preform this action'); + throw new AccessForbiddenException('You don\'t have permission to perform this action'); } catch(\Exception $exception){ throw new RequestValidationException($exception->getMessage()); } diff --git a/app/Classes/General/Interfaces/Remarkable.php b/app/Classes/General/Interfaces/Remarkable.php new file mode 100644 index 00000000..dcbd94ce --- /dev/null +++ b/app/Classes/General/Interfaces/Remarkable.php @@ -0,0 +1,13 @@ +fetchBookingQuotation = $fetchBookingQuotation; $this->fetchesTransaction = $fetchesTransaction; @@ -69,6 +75,7 @@ class CreateBookingRefundLogic extends AbstractControllerLogic $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; $this->createsTransaction = $createsTransaction; $this->updateRefundTransactionStatusLogic = $updateRefundTransactionStatusLogic; + $this->createRemarkProcessor = $createRemarkProcessor; } /** @@ -132,6 +139,11 @@ class CreateBookingRefundLogic extends AbstractControllerLogic } + if($request->input('refundRemark')){ + $remarkObject = new RemarkObject($request->input('refundRemark'), Auth()->user()->id); + $this->createRemarkProcessor->execute($this->fetchesTransaction->execute(['id' => $refund_transaction->id]), $remarkObject); + } + return $this->resourceResponse(new TransactionResource($refund_transaction)); } diff --git a/app/Classes/Modules/Remarks/Standards/Rules/CanCreateRemark.php b/app/Classes/Modules/Remarks/Standards/Rules/CanCreateRemark.php index a7d2e5b1..fc51178f 100644 --- a/app/Classes/Modules/Remarks/Standards/Rules/CanCreateRemark.php +++ b/app/Classes/Modules/Remarks/Standards/Rules/CanCreateRemark.php @@ -26,7 +26,7 @@ class CanCreateRemark extends AbstractRule /** * @return bool */ - protected function authorized($object): bool + protected function authorized(): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Remarks/Standards/Rules/CanDeleteRemark.php b/app/Classes/Modules/Remarks/Standards/Rules/CanDeleteRemark.php index 1c61ac9d..7ddece31 100644 --- a/app/Classes/Modules/Remarks/Standards/Rules/CanDeleteRemark.php +++ b/app/Classes/Modules/Remarks/Standards/Rules/CanDeleteRemark.php @@ -13,7 +13,7 @@ class CanDeleteRemark extends AbstractRule /** * @return bool */ - protected function authorized($object): bool + protected function authorized(): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Remarks/Standards/Rules/CanFetchRemark.php b/app/Classes/Modules/Remarks/Standards/Rules/CanFetchRemark.php index 31ae8301..6642611c 100644 --- a/app/Classes/Modules/Remarks/Standards/Rules/CanFetchRemark.php +++ b/app/Classes/Modules/Remarks/Standards/Rules/CanFetchRemark.php @@ -13,7 +13,7 @@ class CanFetchRemark extends AbstractRule /** * @return bool */ - protected function authorized($object): bool + protected function authorized(): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Remarks/Standards/Rules/CanListRemarks.php b/app/Classes/Modules/Remarks/Standards/Rules/CanListRemarks.php index b1372049..4911a53b 100644 --- a/app/Classes/Modules/Remarks/Standards/Rules/CanListRemarks.php +++ b/app/Classes/Modules/Remarks/Standards/Rules/CanListRemarks.php @@ -13,7 +13,7 @@ class CanListRemarks extends AbstractRule /** * @return bool */ - protected function authorized($object): bool + protected function authorized(): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Remarks/Standards/Rules/CanUpdateRemark.php b/app/Classes/Modules/Remarks/Standards/Rules/CanUpdateRemark.php index f6fd6587..8a8c10e8 100644 --- a/app/Classes/Modules/Remarks/Standards/Rules/CanUpdateRemark.php +++ b/app/Classes/Modules/Remarks/Standards/Rules/CanUpdateRemark.php @@ -26,7 +26,7 @@ class CanUpdateRemark extends AbstractRule /** * @return bool */ - protected function authorized($object): bool + protected function authorized(): bool { // TODO Set Authorization rules return true; diff --git a/app/Http/Resources/TransactionResource.php b/app/Http/Resources/TransactionResource.php index b431c854..d259d777 100644 --- a/app/Http/Resources/TransactionResource.php +++ b/app/Http/Resources/TransactionResource.php @@ -53,6 +53,7 @@ class TransactionResource extends JsonResource 'value' => $days->gt(Carbon::now()) ? '+' : '-', 'duration' => $days->diff(Carbon::now())->format('%d'), ], + 'remarks' => RemarkResource::collection($this->remarks), 'redemption' => new VoucherRedemptionResource($this->voucherRedemption) ]; } diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index aba5decc..31b67e69 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Classes\General\Interfaces\Documentable; +use App\Classes\General\Interfaces\Remarkable; use App\Classes\General\Interfaces\Transactionable; use App\Classes\General\Interfaces\Voucherifiable; use App\Classes\General\Traits\LogData; @@ -21,7 +22,7 @@ use Staudenmeir\EloquentHasManyDeep\HasTableAlias; use App\Models\StatementTransactionOwner; -class Transaction extends AbstractModel implements Documentable, Transactionable, Voucherifiable +class Transaction extends AbstractModel implements Documentable, Transactionable, Voucherifiable, Remarkable { use HasTableAlias; use SoftDeletes; diff --git a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue index 7679b807..ac77bc06 100644 --- a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue +++ b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue @@ -332,6 +332,14 @@
{{ refund.status === 1 ? 'Pending Verification' : refund.status === 2 ? 'Approved' : 'Rejected'}}
+
+ + + + + + +
Amount
diff --git a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue index c87122a5..3470891a 100644 --- a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue +++ b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue @@ -35,6 +35,14 @@
+
+
+ + + + +
+
Paid Amount: {{ paidAmount }}
@@ -71,6 +79,7 @@ export default { data() { return { refundAmount: (Math.round((this.data.original_amount - this.data.refunded_amount + Number.EPSILON) * 100) / 100).toFixed(2), + refundRemark: '', refundMethod: { name: 'Fully Refund', status: false }, refundMethods: [ { name: 'Fully Refund', label: 'Full Refund' }, @@ -82,7 +91,8 @@ export default { return { refundAmount: { maxValue: maxValue(this.refundMaxValue) - } + }, + refundRemark: {} } }, computed: { @@ -96,6 +106,7 @@ export default { methods: { submitForm() { this.parameters.amount = this.refundAmount; + this.parameters.refundRemark = this.refundRemark; this.submit(this.route('api.booking.refund.create', this.data.booking.id, this.data.id), 'post', this.section, true, true) }, updateRefundType(refund) { diff --git a/resources/assets/vue/components/general/elements/RemarkComponent.vue b/resources/assets/vue/components/general/elements/RemarkComponent.vue index f2f9bf30..bd96c5e8 100644 --- a/resources/assets/vue/components/general/elements/RemarkComponent.vue +++ b/resources/assets/vue/components/general/elements/RemarkComponent.vue @@ -3,17 +3,34 @@
-
- +
+

Remarks

- +
+
+
+
+
+
+
+
+
+

Nothing To + Show Here Yet!

+
+
+
+
+
+
+
-
diff --git a/resources/assets/vue/components/general/elements/RemarkListComponent.vue b/resources/assets/vue/components/general/elements/RemarkListComponent.vue index da218ea9..85d8a6a8 100644 --- a/resources/assets/vue/components/general/elements/RemarkListComponent.vue +++ b/resources/assets/vue/components/general/elements/RemarkListComponent.vue @@ -41,12 +41,12 @@

{{item.content}}

- +
- +
diff --git a/resources/assets/vue/components/general/forms/RemarkCommentFormComponent.vue b/resources/assets/vue/components/general/forms/RemarkCommentFormComponent.vue index 7da26ca8..0bada956 100644 --- a/resources/assets/vue/components/general/forms/RemarkCommentFormComponent.vue +++ b/resources/assets/vue/components/general/forms/RemarkCommentFormComponent.vue @@ -1,5 +1,5 @@