From f595c43f2c44ef4ec37193bb15d928c47120d3ae Mon Sep 17 00:00:00 2001 From: Dillon Date: Sat, 7 Oct 2023 07:24:06 +0800 Subject: [PATCH] Function for admin to export feedback data --- .../Abstracts/Abstract2ControllerLogic.php | 97 ++++ .../ExportFeedbackDataLogic.php | 57 ++ .../Exports/Services/ExportsFeedback.php | 70 +++ .../Standards/Rules/CanExportFeedback.php | 45 ++ .../Exports/ExportFeedbackDataController.php | 19 + resources/views/errors/404.blade.php | 5 - .../views/errors/illustrated-layout.blade.php | 486 ------------------ resources/views/pages/feedback.blade.php | 10 + routes/web.php | 2 + 9 files changed, 300 insertions(+), 491 deletions(-) create mode 100644 app/Classes/General/Abstracts/Abstract2ControllerLogic.php create mode 100644 app/Classes/Modules/Exports/ControllersLogic/ExportFeedbackDataLogic.php create mode 100644 app/Classes/Modules/Exports/Services/ExportsFeedback.php create mode 100644 app/Classes/Modules/Exports/Standards/Rules/CanExportFeedback.php create mode 100644 app/Http/Controllers/Exports/ExportFeedbackDataController.php delete mode 100644 resources/views/errors/404.blade.php delete mode 100644 resources/views/errors/illustrated-layout.blade.php diff --git a/app/Classes/General/Abstracts/Abstract2ControllerLogic.php b/app/Classes/General/Abstracts/Abstract2ControllerLogic.php new file mode 100644 index 00000000..77342724 --- /dev/null +++ b/app/Classes/General/Abstracts/Abstract2ControllerLogic.php @@ -0,0 +1,97 @@ +notification()['title'] ? $this->notification()['title']: Notifications::UNDEFINED['title']; + } + + /** + * @return string + */ + private function getNotificationMessage():string { + return $this->notification()['message'] ? $this->notification()['message']: Notifications::UNDEFINED['message']; + } + + /** + * @param Request $request + * @return BinaryFileResponse + * @throws ErrorException + */ + abstract protected function logic(Request $request) : BinaryFileResponse; + + /** + * @param Request $request + * @return BinaryFileResponse + */ + public function execute(Request $request) : BinaryFileResponse { + + try { + + DB::beginTransaction(); + + $response = $this->logic($request); + + DB::commit(); + + return $response; + + } catch (ErrorException|GeneralExceptions|TypeError $exception){ + abort(404, $exception->getMessage()); + } + } + + /** + * @param array|null $data + * @return JsonResponse + */ + public function response(?array $data = []) : JsonResponse { + + return (new ApiResponseObject($this->getNotificationTitle().' Successful', + $this->getNotificationMessage(), + HttpStatus::OK_WITH_MESSAGE, $data))->handler(); + } + + /** + * @param JsonResource $resource + * @return JsonResponse + */ + public function resourceResponse(JsonResource $resource){ + return $this->response(['data' => $resource]); + } + + /** + * @param ResourceCollection $collection + * @return JsonResponse + */ + public function collectionResponse(ResourceCollection $collection){ + return $this->response(json_decode($collection->response()->getContent(), true)); + } + +} diff --git a/app/Classes/Modules/Exports/ControllersLogic/ExportFeedbackDataLogic.php b/app/Classes/Modules/Exports/ControllersLogic/ExportFeedbackDataLogic.php new file mode 100644 index 00000000..69b3930f --- /dev/null +++ b/app/Classes/Modules/Exports/ControllersLogic/ExportFeedbackDataLogic.php @@ -0,0 +1,57 @@ + 'Retrieved Feedback', + 'message' => 'You have successfully exported feedback data' + ]; + } + + /** @var ExportsFeedback */ + private $exportsFeedback; + + /** @var CanExportFeedback */ + private $canExportFeedback; + + /** + * ExportFeedbackDataLogic constructor. + * @param ExportsFeedback $exportsFeedback + * @param CanExportFeedback $canExportFeedback + */ + public function __construct(ExportsFeedback $exportsFeedback, CanExportFeedback $canExportFeedback) + { + $this->exportsFeedback = $exportsFeedback; + $this->canExportFeedback = $canExportFeedback; + } + + + /** + * @param Request $request + * @return Response + */ + public function logic(Request $request) : BinaryFileResponse + { + $this->canExportFeedback->passes(); + + $response = $this->exportsFeedback->download('feedback.xls', Excel::XLS, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']); + ob_end_clean(); + + return $response; + } + +} diff --git a/app/Classes/Modules/Exports/Services/ExportsFeedback.php b/app/Classes/Modules/Exports/Services/ExportsFeedback.php new file mode 100644 index 00000000..7bc26265 --- /dev/null +++ b/app/Classes/Modules/Exports/Services/ExportsFeedback.php @@ -0,0 +1,70 @@ +whereHas('questionnaire', function ($innerQuery) { + $innerQuery->where('group', 'feedback'); + })->where('created_at', '>', Carbon::now()->subMonths(1)); + })->orderBy('created_at', 'desc'); + } + + /** + * @param QAUserAnswerSelected $userAnswer + * + * @return array + */ + public function map($userAnswer): array + { + $source = $userAnswer->userSource; + $user = $userAnswer->source_id === 0 ? $userAnswer->user : null; + $user_marking = ''; + if($user){ + $companyModule = $user->companyModule()->first(); + $user_marking = $companyModule ? $companyModule->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference : ""; + } + + return [ + $userAnswer->question->questionnaire->description, + $userAnswer->question->question_text, + $userAnswer->free_text_answer, + $user ? QASystemSourceType::getText(QASystemSourceType::IZYIM) : QASystemSourceType::getText($source->system), + $user ? $user_marking : $source->marking, + $user ? $user->email : $source->email, + Carbon::parse($userAnswer->created_at)->format('d-m-Y'), + ]; + } +} diff --git a/app/Classes/Modules/Exports/Standards/Rules/CanExportFeedback.php b/app/Classes/Modules/Exports/Standards/Rules/CanExportFeedback.php new file mode 100644 index 00000000..5d8b2ec0 --- /dev/null +++ b/app/Classes/Modules/Exports/Standards/Rules/CanExportFeedback.php @@ -0,0 +1,45 @@ +user()->type; + if (in_array($roleToCheck, RoleTypes::ADMIN_ROLES)) { + return true; + } else { + return false; + } + } + + /** + * @param $object + * @return bool + */ + protected function validators($object): bool + { + return true; + + } + + + /** + * @param $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } + +} diff --git a/app/Http/Controllers/Exports/ExportFeedbackDataController.php b/app/Http/Controllers/Exports/ExportFeedbackDataController.php new file mode 100644 index 00000000..254956c5 --- /dev/null +++ b/app/Http/Controllers/Exports/ExportFeedbackDataController.php @@ -0,0 +1,19 @@ +execute($request); + } +} diff --git a/resources/views/errors/404.blade.php b/resources/views/errors/404.blade.php deleted file mode 100644 index 4de4d719..00000000 --- a/resources/views/errors/404.blade.php +++ /dev/null @@ -1,5 +0,0 @@ -@extends('errors::illustrated-layout') - -@section('title', __('Not Found')) -@section('code', '404') -@section('message', __('Not Found')) diff --git a/resources/views/errors/illustrated-layout.blade.php b/resources/views/errors/illustrated-layout.blade.php deleted file mode 100644 index 21a35bab..00000000 --- a/resources/views/errors/illustrated-layout.blade.php +++ /dev/null @@ -1,486 +0,0 @@ - - - - - - - @yield('title') - - - - - - - - - -
-
-
-
- @yield('code', __('Oh no')) -
- -
- -

- @yield('message') -

- - -
-
- -
- @yield('image') -
-
- - diff --git a/resources/views/pages/feedback.blade.php b/resources/views/pages/feedback.blade.php index a34f6442..d4754d65 100644 --- a/resources/views/pages/feedback.blade.php +++ b/resources/views/pages/feedback.blade.php @@ -14,6 +14,16 @@
+ + +
Question Set
Question Text
diff --git a/routes/web.php b/routes/web.php index 4a609cf8..5ef2081c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1198,6 +1198,8 @@ Route::get('/feedback', function () { return view('pages.feedback'); })->name('admin.feedback'); +Route::get('/export/feedback', 'Exports\ExportFeedbackDataController@export')->name('feedback.export'); + Route::get('/404', function () { abort(404); })->name('error.404');