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)}} +