From a9910c5a127ee44549fe7e4327afb342719ee6b1 Mon Sep 17 00:00:00 2001 From: Martin Kiragu Date: Mon, 24 Apr 2023 21:26:35 +0300 Subject: [PATCH] GroupTransformer --- .../ControllersLogic/DeleteGroupLogic.php | 6 + .../ControllersLogic/ListGroupsLogic.php | 11 +- .../ControllersLogic/UpdateGroupLogic.php | 14 +- app/Models/Group.php | 22 ++- app/Transformers/GroupTransformer.php | 126 ++++++++++++++++++ 5 files changed, 172 insertions(+), 7 deletions(-) create mode 100644 app/Transformers/GroupTransformer.php diff --git a/app/Classes/Modules/Transactions/ControllersLogic/DeleteGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/DeleteGroupLogic.php index 601a1530..94ede815 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/DeleteGroupLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/DeleteGroupLogic.php @@ -8,6 +8,7 @@ use App\Classes\Modules\Transactions\Services\DeletesTransaction; use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Http\Resources\GroupResource; +use App\Transformers\GroupTransformer; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -66,6 +67,11 @@ class DeleteGroupLogic extends AbstractControllerLogic } $group->delete(); + + //no relationship needed + /* return fractal() + ->item($group, new GroupTransformer()) + ->respond(200, [], JSON_PRETTY_PRINT);*/ return $this->resourceResponse(new GroupResource($group)); } diff --git a/app/Classes/Modules/Transactions/ControllersLogic/ListGroupsLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/ListGroupsLogic.php index 5cf99bbe..c03136a9 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/ListGroupsLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/ListGroupsLogic.php @@ -5,6 +5,7 @@ namespace App\Classes\Modules\Transactions\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Transactions\Services\ListsGroups; use App\Http\Resources\GroupResource; +use App\Transformers\GroupTransformer; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -22,7 +23,8 @@ class ListGroupsLogic extends AbstractControllerLogic /** * @return array */ - protected function notification():array { + protected function notification(): array + { return [ 'title' => 'Retrieved Groups', 'message' => 'You have successfully retrieved a list of groups' @@ -32,10 +34,15 @@ class ListGroupsLogic extends AbstractControllerLogic /** @var ListsGroups */ private $listsGroups; - public function logic(Request $request) : JsonResponse + public function logic(Request $request): JsonResponse { $query = $this->listsGroups->execute($this->listsGroups->deserializeFilters($request->input('filters'))); + //no relationship needed + /* return fractal() + ->collection($query, new GroupTransformer()) + ->respond(200, [], JSON_PRETTY_PRINT);*/ + return $this->collectionResponse(GroupResource::collection($query)); } diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php index aa432aea..801a7818 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php @@ -32,7 +32,8 @@ class UpdateGroupLogic extends AbstractControllerLogic /** * @return array */ - protected function notification():array { + protected function notification(): array + { return [ 'title' => 'Update Group Transaction', 'message' => 'You have successfully updated this Group Transaction' @@ -86,7 +87,7 @@ class UpdateGroupLogic extends AbstractControllerLogic * @return JsonResponse * @throws \App\Classes\Exceptions\MalformedRequestException */ - public function logic(Request $request) : JsonResponse + public function logic(Request $request): JsonResponse { $group = $this->fetchesGroup->execute(['id' => $request->route('id')]); @@ -100,7 +101,7 @@ class UpdateGroupLogic extends AbstractControllerLogic // $group->transactions()->update(['amount' => DB::raw('(original_amount * (1 / currency_rate)) + service_charge + tax')]); - foreach($transactions as $transaction) { + foreach ($transactions as $transaction) { $constant = SegmentConstant::where('reference', SegmentConstants::SERVICE_CHARGE)->where('detail->id', $supplier->id)->first(); $serviceCharge = $this->calculatesTransactionServiceCharge->execute($transaction->original_amount, $rate, $constant); @@ -169,7 +170,7 @@ class UpdateGroupLogic extends AbstractControllerLogic $object = new DocumentObject( DocumentType::CURRENCY_VENDOR_ORDER, - [chunk_split('data:application/pdf;base64,'.base64_encode($pdf->output()))], + [chunk_split('data:application/pdf;base64,' . base64_encode($pdf->output()))], '', ApprovalStatus::COMPLETED, 'currency_vendor_order' @@ -179,6 +180,11 @@ class UpdateGroupLogic extends AbstractControllerLogic $document = $this->createsDocument->execute($group, $object); $this->createsFile->execute($document, $object); + //no relationship needed + /* return fractal() + ->item($group, new GroupTransformer()) + ->respond(200, [], JSON_PRETTY_PRINT);*/ + return $this->resourceResponse(new GroupResource($group)); } diff --git a/app/Models/Group.php b/app/Models/Group.php index c8d02a71..a201b1ca 100644 --- a/app/Models/Group.php +++ b/app/Models/Group.php @@ -3,6 +3,9 @@ namespace App\Models; use App\Classes\General\Traits\LogData; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use App\Classes\General\Interfaces\Documentable; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -10,12 +13,29 @@ use Illuminate\Database\Eloquent\Relations\MorphMany; use Staudenmeir\EloquentHasManyDeep\HasManyDeep; use Staudenmeir\EloquentHasManyDeep\HasRelationships; use App\Classes\General\Interfaces\Transactionable; +use Staudenmeir\EloquentHasManyDeep\HasTableAlias; +/** + * App\Models\Group + * + * @property-read Currency|null $currency + * @property-read Collection|Document[] $documents + * @property-read int|null $documents_count + * @property-read CompanyModule|null $issuerCompany + * @property-read Currency|null $original_currency + * @property-read CompanyModule|null $receiverCompany + * @property-read Collection|Transaction[] $transactions + * @property-read int|null $transactions_count + * @method static Builder|Group newModelQuery() + * @method static Builder|Group newQuery() + * @method static Builder|Group query() + * @mixin Eloquent + */ class Group extends Model implements Documentable, Transactionable { use HasRelationships; - use \Staudenmeir\EloquentHasManyDeep\HasTableAlias; + use HasTableAlias; // /** diff --git a/app/Transformers/GroupTransformer.php b/app/Transformers/GroupTransformer.php new file mode 100644 index 00000000..33162b17 --- /dev/null +++ b/app/Transformers/GroupTransformer.php @@ -0,0 +1,126 @@ + $transaction->id, + 'original_amount' => (float)$transaction->original_amount, + 'issuer_name' => $transaction->issuerCompany->name, + 'issuer_id' => $transaction->issuerCompany->id, + 'amount' => (float)$transaction->amount, + 'service_charge' => (float)$transaction->amount, + 'created_at' => Carbon::parse($transaction->created_at)->format('d-m-Y h:i:s A'), + 'currency_rate' => (float)$transaction->currency_rate, + 'transactions' => $this->transactions($transaction), + 'complete_transactions' => $this->complete_transactions($transaction), + 'documents' => [ + 'currency_order' => new DocumentResource($this->documents()->where('document_type', DocumentType::CURRENCY_VENDOR_ORDER)->first()), + 'purchase_order' => new DocumentResource($this->documents()->where('document_type', DocumentType::BULK_PURCHASE_ORDER)->first()) + ] + ]; + } + + /** + * Include Original Currency + * + * @param Transaction $transaction + * @return Item + */ + public function includeOriginalCurrency(Transaction $transaction): Item + { + return $this->item($transaction->original_currency, new CurrencyTransformer()); + } + + /** + * Include Currency + * + * @param Transaction $transaction + * @return Item + */ + public function includeCurrency(Transaction $transaction): Item + { + return $this->item($transaction->currency, new CurrencyTransformer()); + } + + /** + * Get Transactions + * @param Transaction $transaction + * @return Collection + */ + protected function transactions(Transaction $transaction): Collection + { + return $transaction->transactions()->get()->pluck('owner.owner.marking'); + } + + /** + * complete Transactions + * @param Transaction $transaction + * @return Collection + */ + protected function complete_transactions(Transaction $transaction): Collection + { + return $transaction->transactions()->whereHasMorph('owner', [Transaction::class], function ($query) { + return $query->whereHas('booking', function ($query) { + return $query->whereHas('transactions', function ($query) { + return $query->where('type', TransactionType::PURCHASE_ORDER)->where('status', '=', ApprovalStatus::APPROVED); + }); + }); + })->get()->pluck('owner.owner.marking'); + + } + + /** + * Include Documents + * + * @param Transaction $transaction + * @return array + */ + public function includeDocuments(Transaction $transaction): array + { + return [ + 'currency_order' => $this->item($transaction->documents()->where('document_type', DocumentType::CURRENCY_VENDOR_ORDER)->first(), new DocumentTransformer()), + 'purchase_order' => $this->item($transaction->documents()->where('document_type', DocumentType::BULK_PURCHASE_ORDER)->first(), new DocumentTransformer()) + ]; + + } + +} +