From abe1f3df2b5983ca1cc49af016b299ffadf7d2d8 Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Fri, 3 Jan 2025 19:40:00 +0800 Subject: [PATCH] Admin Workflow - API code refactor to fetch booking information --- .../ControllersLogic/FetchBookingLogic.php | 4 +- .../FetchAdminWFBookingLogic.php | 100 ++++++++++++++++++ .../FetchAdminWFModelAttributesLogic.php | 75 +++++++++++++ .../AdminWorkflowBaseController.php | 71 ++++--------- app/Http/Resources/BookingBaseResource.php | 26 +++++ .../forms/AdminWorkFlowFormComponent.vue | 6 +- routes/admin_workflow.php | 25 +---- 7 files changed, 228 insertions(+), 79 deletions(-) create mode 100644 app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWFBookingLogic.php create mode 100644 app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWFModelAttributesLogic.php create mode 100644 app/Http/Resources/BookingBaseResource.php diff --git a/app/Classes/Modules/Bookings/ControllersLogic/FetchBookingLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/FetchBookingLogic.php index d1f2286e..711ae1cb 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/FetchBookingLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/FetchBookingLogic.php @@ -19,7 +19,7 @@ class FetchBookingLogic extends AbstractControllerLogic protected function notification():array { return [ 'title' => 'Retrieved Booking', - 'message' => 'You have successfully retrieved a Address' + 'message' => 'You have successfully retrieved a Booking' ]; } @@ -58,4 +58,4 @@ class FetchBookingLogic extends AbstractControllerLogic } -} \ No newline at end of file +} diff --git a/app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWFBookingLogic.php b/app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWFBookingLogic.php new file mode 100644 index 00000000..77dc0372 --- /dev/null +++ b/app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWFBookingLogic.php @@ -0,0 +1,100 @@ + 'Retrieved Booking for Admin Workflow ', + 'message' => 'You have successfully retrieved a Booking for Admin Workflow' + ]; + } + + /** @var CanFetchQuestion */ + private $canFetchQuestion; + + /** + * FetchAdminWFBookingLogic constructor. + * @param CanFetchQuestion $canFetchQuestion + */ + public function __construct(CanFetchQuestion $canFetchQuestion) + { + $this->canFetchQuestion = $canFetchQuestion; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + $this->canFetchQuestion->passes(); + + $excludedBookingIds = KeyValuePair::where('owner_type', 'App\Models\Booking') + ->where(function ($query) { + $query->where('key', '1688_admin_workflow_processed') + ->orWhere(function ($query) { + $query->where('key', '1688_admin_workflow_processing') + ->where('updated_at', '>', Carbon::now()->subHour()); + }); + }) + ->pluck('owner_id') + ->filter(function ($value) { + return is_numeric($value); + }) + ->toArray(); + + + $timeAgo = Carbon::now()->subMonths(6); + $serviceId = 4; + $booking = Booking::where('service_id', $serviceId) + ->where('status', ApprovalStatus::APPROVED) + ->whereNotIn('id', $excludedBookingIds) + ->whereHas('bills', function ($query) { + $query->whereHas('groupTransaction', function ($query) { + $query->whereHas('group', function ($query) { + $query->whereDoesntHave('billGroup')->whereIn('issuer', [2]); + }); + }); + }) + ->where('created_at', '>=', $timeAgo) + ->latest() + ->first(); + + if(!$booking){ + return responseJson(null, 'No booking found', 404); + } + + markedProcessing($booking, '1688_admin_workflow_processing'); + + // return responseJson([ + // 'passwords' => $booking->bank->holder_name ?? null, + // 'account_no' => $booking->bank->account_no ?? null, + // 'pin' => $booking->bank->bank_branch ?? null, + // 'holder_name' => $booking->bank->holder_name ?? null, + // 'booking' => $booking + // ]); + + return $this->resourceResponse(new BookingBaseResource($booking)); + } + +} diff --git a/app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWFModelAttributesLogic.php b/app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWFModelAttributesLogic.php new file mode 100644 index 00000000..456f51cf --- /dev/null +++ b/app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWFModelAttributesLogic.php @@ -0,0 +1,75 @@ + 'Retrieved Model Attributes for Admin Workflow ', + 'message' => 'You have successfully retrieved Model Attributes for Admin Workflow' + ]; + } + + /** @var CanFetchQuestion */ + private $canFetchQuestion; + + + /** + * FetchAdminWFModelAttributesLogic constructor. + * @param CanFetchQuestion $canFetchQuestion + */ + public function __construct(CanFetchQuestion $canFetchQuestion) + { + $this->canFetchQuestion = $canFetchQuestion; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + $this->canFetchQuestion->passes(); + + $booking = Booking::find($request->route('booking_id')); + + if (!$booking) { + return responseJson(null, 'No booking found', 404); + } + + $attributes = $booking->modelAttributes() + ->where('name', BookingAttributeNames::ORDER_REFERENCE_NO) + ->get(['id', 'value']) + ->map(fn ($attr) => $attr->only(['id', 'value'])); + + $transaction = $booking->bills()->first(); //cief todo: 74 - more than 1 record? + return responseJson([ + 'booking' => $booking, + 'booking_attributes' => $attributes, + 'reference' =>$transaction->owner->owner->marking, + 'marking' => $transaction->owner->owner->company->reference, + 'currency_rate' => $transaction->currency_rate, + 'total_amount' =>$transaction->currency->short_code . ' ' . number_format((float)$transaction->amount, 2, '.', '') + ]); + + return $this->resourceResponse(new BookingBaseResource($booking)); + } + +} diff --git a/app/Http/Controllers/Questionnaires/AdminWorkflowBaseController.php b/app/Http/Controllers/Questionnaires/AdminWorkflowBaseController.php index 068728a7..4214984c 100644 --- a/app/Http/Controllers/Questionnaires/AdminWorkflowBaseController.php +++ b/app/Http/Controllers/Questionnaires/AdminWorkflowBaseController.php @@ -1,61 +1,30 @@ where(function ($query) { - $query->where('key', '1688_admin_workflow_processed') - ->orWhere(function ($query) { - $query->where('key', '1688_admin_workflow_processing') - ->where('updated_at', '>', Carbon::now()->subHour()); - }); - }) - ->pluck('owner_id') - ->filter(function ($value) { - return is_numeric($value); - }) - ->toArray(); + /** + * @param Request $request + * @param FetchQuestionV1AdminWFLogic $logic + * @return JsonResponse + */ + public function fetchBooking(Request $request, FetchAdminWFBookingLogic $logic): JsonResponse { + return $logic->execute($request); + } - - $timeAgo = Carbon::now()->subMonths(6); - $serviceId = 4; - $booking = Booking::where('service_id', $serviceId) - ->where('status', ApprovalStatus::APPROVED) - ->whereNotIn('id', $excludedBookingIds) - ->whereHas('bills', function ($query) { - $query->whereHas('groupTransaction', function ($query) { - $query->whereHas('group', function ($query) { - $query->whereDoesntHave('billGroup')->whereIn('issuer', [2]); - }); - }); - }) - ->where('created_at', '>=', $timeAgo) - ->latest() - ->first(); - - if(!$booking){ - return responseJson(null, 'No booking found', 404); - } - - markedProcessing($booking, '1688_admin_workflow_processing'); - - return responseJson([ - 'passwords' => $booking->bank->holder_name ?? null, - 'account_no' => $booking->bank->account_no ?? null, - 'pin' => $booking->bank->bank_branch ?? null, - 'holder_name' => $booking->bank->holder_name ?? null, - 'booking' => $booking - ]); + /** + * @param Request $request + * @param FetchAdminWFModelAttributesLogic $logic + * @return JsonResponse + */ + public function fetchModelAttributes(Request $request, FetchAdminWFModelAttributesLogic $logic): JsonResponse { + return $logic->execute($request); } } diff --git a/app/Http/Resources/BookingBaseResource.php b/app/Http/Resources/BookingBaseResource.php new file mode 100644 index 00000000..945812f8 --- /dev/null +++ b/app/Http/Resources/BookingBaseResource.php @@ -0,0 +1,26 @@ + $this->id, + 'company' => new CompanyResource($this->company), + 'bank' => new BankResource($this->bank), + 'marking' => $this->marking, + ]; + } +} diff --git a/resources/assets/vue/components/general/forms/AdminWorkFlowFormComponent.vue b/resources/assets/vue/components/general/forms/AdminWorkFlowFormComponent.vue index 96fc0717..4e0db9e5 100644 --- a/resources/assets/vue/components/general/forms/AdminWorkFlowFormComponent.vue +++ b/resources/assets/vue/components/general/forms/AdminWorkFlowFormComponent.vue @@ -39,7 +39,7 @@ -

{{ externalApiResponse.data.account_no }}

+

{{ externalApiResponse.data.booking.bank.account_no }}

@@ -48,7 +48,7 @@ -

{{ externalApiResponse.data.holder_name }}

+

{{ externalApiResponse.data.booking.bank.holder_name }}

@@ -57,7 +57,7 @@ -

{{ externalApiResponse.data.pin }}

+

{{ externalApiResponse.data.booking.bank.bank_branch }}

diff --git a/routes/admin_workflow.php b/routes/admin_workflow.php index 13a1f5d7..b5ff7d03 100644 --- a/routes/admin_workflow.php +++ b/routes/admin_workflow.php @@ -46,7 +46,8 @@ if (!function_exists('markedProcessing')) { Route::group(['prefix' => 'admin-work-flow', 'as' => 'admin_work_flow.', 'namespace' => 'Questionnaires'], function () { - Route::get('/fetch-oldest-order', [AdminWorkflowBaseController::class, 'fetchOldestOrder'])->name('fetch_oldest_order'); + Route::get('/fetch-booking', [AdminWorkflowBaseController::class, 'fetchBooking'])->name('fetch_oldest_order'); + Route::get('{booking_id}/fetch-model-attributes', [AdminWorkflowBaseController::class, 'fetchModelAttributes'])->name('fetch_model_attributes'); Route::get('/fetch-pending-approved-po', function () { $excludedBookingIds = KeyValuePair::where('owner_type', 'App\Models\Booking') @@ -122,28 +123,6 @@ Route::group(['prefix' => 'admin-work-flow', 'as' => 'admin_work_flow.', 'namesp })->name('fetch_pending_fill_po'); - Route::get('{booking_id}/fetch-model-attributes', function ($bookingId) { - $booking = Booking::find($bookingId); - - if (!$booking) { - return responseJson(null, 'No booking found', 404); - } - - $attributes = $booking->modelAttributes() - ->where('name', BookingAttributeNames::ORDER_REFERENCE_NO) - ->get(['id', 'value']) - ->map(fn ($attr) => $attr->only(['id', 'value'])); - - $transaction = $booking->bills()->first(); //cief todo: 74 - more than 1 record? - return responseJson([ - 'booking' => $booking, - 'booking_attributes' => $attributes, - 'reference' =>$transaction->owner->owner->marking, - 'marking' => $transaction->owner->owner->company->reference, - 'currency_rate' => $transaction->currency_rate, - 'total_amount' =>$transaction->currency->short_code . ' ' . number_format((float)$transaction->amount, 2, '.', '') - ]); - })->name('fetch_model_attributes'); // Route::post('/add-workflow-timestamp', function (Request $request) {