From 5b00b7b45fb75f2f7bcc062849724fa0c7fa999c Mon Sep 17 00:00:00 2001 From: Dillon Date: Thu, 4 May 2023 15:19:04 +0800 Subject: [PATCH 01/55] Help Menu prototype v0.1 --- .../General/Eloquent/Filters/IdNext.php | 18 ++ .../Eloquent/Filters/NextMainQuestion.php | 18 ++ .../General/Eloquent/Filters/QuestionId.php | 19 ++ .../Eloquent/Filters/QuestionNumber.php | 19 ++ .../Eloquent/Filters/QuestionnaireSetId.php | 19 ++ .../General/Eloquent/Filters/UserId.php | 18 ++ .../UploadDocumentForHelpMenuProcessor.php | 50 ++++ .../FetchHelpMenuQuestionLogic.php | 62 +++++ .../UpdateHelpMenuNextQuestionLogic.php | 124 +++++++++ .../DeleteHelpMenuAnswerProcessor.php | 51 ++++ .../FetchFirstHelpMenuQuestionProcessor.php | 32 +++ .../FetchNextHelpMenuQuestionProcessor.php | 93 +++++++ .../SaveHelpMenuAnswerProcessor.php | 63 +++++ .../Services/FetchesHelpMenuQuestion.php | 33 +++ .../FetchesHelpMenuUserAnswerSelected.php | 32 +++ .../FetchesHelpMenuUserAnswerSelectedList.php | 32 +++ .../Rules/CanFetchHelpMenuQuestionList.php | 37 +++ .../CreatesPerfexCRMSupportTicket.php | 43 ++++ app/Classes/ValueObjects/Constants/QAType.php | 18 ++ .../FetchHelpMenuQuestionController.php | 20 ++ .../UpdateHelpMenuNextQuestionController.php | 19 ++ .../HelpMenuAnswerOptionsResource.php | 26 ++ .../Resources/HelpMenuQuestionResource.php | 53 ++++ .../HelpMenuQuestionnaireAnswersResource.php | 24 ++ app/Models/QAAnswerOptions.php | 9 + app/Models/QAQuestionnaireSet.php | 10 + app/Models/QAQuestions.php | 9 + app/Models/QAUserAnswerSelected.php | 24 ++ ...100_create_qa_questionnaire_sets_table.php | 37 +++ ...02_20_134124_create_qa_questions_table.php | 45 ++++ ..._091314_create_qa_answer_options_table.php | 37 +++ ...7_create_qa_user_answer_selected_table.php | 40 +++ database/seeders/DatabaseSeeder.php | 3 + database/seeders/QAAnswerOptionsSeeder.php | 155 ++++++++++++ database/seeders/QAQuestionSeeder.php | 187 ++++++++++++++ .../general/forms/HelpMenuFormComponent.vue | 235 ++++++++++++++++++ .../general/forms/RemarkFormComponent.vue | 7 +- .../sections/OrderProfileSectionComponent.vue | 6 +- routes/api.php | 2 + routes/help_menu.php | 8 + 40 files changed, 1732 insertions(+), 5 deletions(-) create mode 100644 app/Classes/General/Eloquent/Filters/IdNext.php create mode 100644 app/Classes/General/Eloquent/Filters/NextMainQuestion.php create mode 100644 app/Classes/General/Eloquent/Filters/QuestionId.php create mode 100644 app/Classes/General/Eloquent/Filters/QuestionNumber.php create mode 100644 app/Classes/General/Eloquent/Filters/QuestionnaireSetId.php create mode 100644 app/Classes/General/Eloquent/Filters/UserId.php create mode 100644 app/Classes/Modules/Documents/Processors/UploadDocumentForHelpMenuProcessor.php create mode 100644 app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php create mode 100644 app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php create mode 100644 app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php create mode 100644 app/Classes/Modules/HelpMenu/Processors/FetchFirstHelpMenuQuestionProcessor.php create mode 100644 app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php create mode 100644 app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php create mode 100644 app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuQuestion.php create mode 100644 app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelected.php create mode 100644 app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelectedList.php create mode 100644 app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestionList.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMSupportTicket.php create mode 100644 app/Classes/ValueObjects/Constants/QAType.php create mode 100644 app/Http/Controllers/HelpMenu/FetchHelpMenuQuestionController.php create mode 100644 app/Http/Controllers/HelpMenu/UpdateHelpMenuNextQuestionController.php create mode 100644 app/Http/Resources/HelpMenuAnswerOptionsResource.php create mode 100644 app/Http/Resources/HelpMenuQuestionResource.php create mode 100644 app/Http/Resources/HelpMenuQuestionnaireAnswersResource.php create mode 100644 app/Models/QAAnswerOptions.php create mode 100644 app/Models/QAQuestionnaireSet.php create mode 100644 app/Models/QAQuestions.php create mode 100644 app/Models/QAUserAnswerSelected.php create mode 100644 database/migrations/2023_02_20_134100_create_qa_questionnaire_sets_table.php create mode 100644 database/migrations/2023_02_20_134124_create_qa_questions_table.php create mode 100644 database/migrations/2023_02_21_091314_create_qa_answer_options_table.php create mode 100644 database/migrations/2023_02_21_091507_create_qa_user_answer_selected_table.php create mode 100644 database/seeders/QAAnswerOptionsSeeder.php create mode 100644 database/seeders/QAQuestionSeeder.php create mode 100644 resources/assets/vue/components/general/forms/HelpMenuFormComponent.vue create mode 100644 routes/help_menu.php diff --git a/app/Classes/General/Eloquent/Filters/IdNext.php b/app/Classes/General/Eloquent/Filters/IdNext.php new file mode 100644 index 00000000..88d6d936 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/IdNext.php @@ -0,0 +1,18 @@ +where('id', '>', $value); + } +} diff --git a/app/Classes/General/Eloquent/Filters/NextMainQuestion.php b/app/Classes/General/Eloquent/Filters/NextMainQuestion.php new file mode 100644 index 00000000..044fea6f --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/NextMainQuestion.php @@ -0,0 +1,18 @@ +where('next_main_question', $value); + } +} diff --git a/app/Classes/General/Eloquent/Filters/QuestionId.php b/app/Classes/General/Eloquent/Filters/QuestionId.php new file mode 100644 index 00000000..3d7da287 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/QuestionId.php @@ -0,0 +1,19 @@ +where('question_id', $value); + } + +} diff --git a/app/Classes/General/Eloquent/Filters/QuestionNumber.php b/app/Classes/General/Eloquent/Filters/QuestionNumber.php new file mode 100644 index 00000000..fcdd3c29 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/QuestionNumber.php @@ -0,0 +1,19 @@ +where('question_number', $value); + } + +} diff --git a/app/Classes/General/Eloquent/Filters/QuestionnaireSetId.php b/app/Classes/General/Eloquent/Filters/QuestionnaireSetId.php new file mode 100644 index 00000000..41006e7f --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/QuestionnaireSetId.php @@ -0,0 +1,19 @@ +where('questionnaire_set_id', $value); + } + +} diff --git a/app/Classes/General/Eloquent/Filters/UserId.php b/app/Classes/General/Eloquent/Filters/UserId.php new file mode 100644 index 00000000..54fe6719 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/UserId.php @@ -0,0 +1,18 @@ +where('user_id', $value); + } +} diff --git a/app/Classes/Modules/Documents/Processors/UploadDocumentForHelpMenuProcessor.php b/app/Classes/Modules/Documents/Processors/UploadDocumentForHelpMenuProcessor.php new file mode 100644 index 00000000..370b1a05 --- /dev/null +++ b/app/Classes/Modules/Documents/Processors/UploadDocumentForHelpMenuProcessor.php @@ -0,0 +1,50 @@ +createsDocument = $createsDocument; + $this->createsFiles = $createsFiles; + } + + + /** + * @param Request $request + * @param QAUserAnswerSelected qaUserAnswerSelected + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function execute(Request $request, QAUserAnswerSelected $qaUserAnswerSelected) { + $object = new DocumentObject("HELP_MENU", $request->input('files'), + '123456', ApprovalStatus::PENDING_VERIFICATION, 'help_menu'); //cief todo: 123456 cannot be hardcoded + + /** @var Document $document */ + $document = $this->createsDocument->execute($qaUserAnswerSelected, $object); + + $result = $this->createsFiles->execute($document, $object); + return $result; + } + +} diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php new file mode 100644 index 00000000..da1de831 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php @@ -0,0 +1,62 @@ + 'Retrieved Help Menu First Question', + 'message' => 'You have successfully retrieved a Help Menu First Question' + ]; + } + + /** @var CanFetchHelpMenuQuestionList */ + private $canFetchHelpMenuQuestionList; + + /** @var FetchFirstHelpMenuQuestionProcessor */ + private $fetchFirstHelpMenuQuestionProcessor; + + /** + * FetchHelpMenuQuestionLogic constructor. + * @param CanFetchHelpMenuQuestionList $canFetchHelpMenuQuestionList + * @param FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor + */ + public function __construct(CanFetchHelpMenuQuestionList $canFetchHelpMenuQuestionList, FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor) + { + $this->canFetchHelpMenuQuestionList = $canFetchHelpMenuQuestionList; + $this->fetchFirstHelpMenuQuestionProcessor = $fetchFirstHelpMenuQuestionProcessor; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + $this->canFetchHelpMenuQuestionList->passes(); + + $userId = Auth::user()->id; + + $query = $this->fetchFirstHelpMenuQuestionProcessor->execute($request); + + return $this->resourceResponse(new HelpMenuQuestionResource($query, $userId)); + } + +} diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php new file mode 100644 index 00000000..f29d236e --- /dev/null +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php @@ -0,0 +1,124 @@ + 'Retrieved Help Menu Next Question', + 'message' => 'You have successfully retrieved a Help Menu Next Question' + ]; + } + + /** @var CanFetchHelpMenuQuestionList */ + private $canFetchHelpMenuQuestionList; + + /** @var SaveHelpMenuAnswerProcessor */ + private $saveHelpMenuAnswerProcessor; + + /** @var DeleteHelpMenuAnswerProcessor */ + private $deleteHelpMenuAnswerProcessor; + + /** @var FetchNextHelpMenuQuestionProcessor */ + private $fetchNextHelpMenuQuestionProcessor; + + /** @var FetchFirstHelpMenuQuestionProcessor */ + private $fetchFirstHelpMenuQuestionProcessor; + + /** @var CreatesPerfexCRMSupportTicket */ + private $createsPerfexCRMSupportTicket; + + /** @var FetchesPerfexCRMCustomer */ + private $fetchesPerfexCRMCustomer; + + /** + * UpdateHelpMenuNextQuestionLogic constructor. + * @param CanFetchHelpMenuQuestionList $canFetchHelpMenuQuestionList + * @param SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor + * @param FetchNextHelpMenuQuestionProcessor $fetchNextHelpMenuQuestionProcessor + * @param FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor + * @param DeleteHelpMenuAnswerProcessor $deleteHelpMenuAnswerProcessor + */ + public function __construct(CanFetchHelpMenuQuestionList $canFetchHelpMenuQuestionList, SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor, FetchNextHelpMenuQuestionProcessor $fetchNextHelpMenuQuestionProcessor, FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor, CreatesPerfexCRMSupportTicket $createsPerfexCRMSupportTicket, FetchesPerfexCRMCustomer $fetchesPerfexCRMCustomer, DeleteHelpMenuAnswerProcessor $deleteHelpMenuAnswerProcessor) + { + $this->canFetchHelpMenuQuestionList = $canFetchHelpMenuQuestionList; + $this->saveHelpMenuAnswerProcessor = $saveHelpMenuAnswerProcessor; + $this->fetchNextHelpMenuQuestionProcessor = $fetchNextHelpMenuQuestionProcessor; + $this->fetchFirstHelpMenuQuestionProcessor = $fetchFirstHelpMenuQuestionProcessor; + $this->createsPerfexCRMSupportTicket = $createsPerfexCRMSupportTicket; + $this->fetchesPerfexCRMCustomer = $fetchesPerfexCRMCustomer; + $this->deleteHelpMenuAnswerProcessor = $deleteHelpMenuAnswerProcessor; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + $questionId = 0; + $userId = Auth::user()->id; + $currentQuestion = $request->question; + $questionId = $currentQuestion['id']; + $questionType = $currentQuestion['question_type']; + + $this->canFetchHelpMenuQuestionList->passes(); + + //Delete answer + $this->deleteHelpMenuAnswerProcessor->execute($userId, $questionId, $request); + + //Save answer given by user + if (!$request->has('isPrevious')) { + $this->saveHelpMenuAnswerProcessor->execute($userId, $questionId, $request); + } + + //Create ticket at crm + if (!$request->has('isPrevious')) { + if($questionType == QAType::TICKET_CRM){ + $email = Auth::user()->email; + $customer = $this->fetchesPerfexCRMCustomer->execute($email); + $subject = "test subject 3"; + $department = 1; + $contactid = 0; + $userid = 0; + if($customer){ + $contactid = $customer->id; + $userid = $customer->userid; + } + $this->createsPerfexCRMSupportTicket->execute($subject, $department, $contactid, $userid); + } + } + + //Get returned question (previous or next) + $returnQuestion = $this->fetchNextHelpMenuQuestionProcessor->execute($request); + //When a questionnaire ended, return back the first question + if(is_null($returnQuestion)){ + $returnQuestion = $this->fetchFirstHelpMenuQuestionProcessor->execute($request); + } + + return $this->resourceResponse(new HelpMenuQuestionResource($returnQuestion, $userId)); + } +} diff --git a/app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php b/app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php new file mode 100644 index 00000000..1df15ae8 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php @@ -0,0 +1,51 @@ +fetchesHelpMenuUserAnswerSelected = $fetchesHelpMenuUserAnswerSelected; + $this->fetchesHelpMenuUserAnswerSelectedList = $fetchesHelpMenuUserAnswerSelectedList; + } + + public function execute($userId, $questionId, $request){ + if ($request->has('isPrevious')) { + //Get current and previous question's answer + try{ + $selectedAnswer = $this->fetchesHelpMenuUserAnswerSelectedList->execute(['user_id' => $userId, 'question_id' => $questionId, 'order_by' => (object)['column' => 'id','DESC' => true]])[0]; + } catch (\Exception $exception){ + $selectedAnswer = null; + } + + if($selectedAnswer) + { + $this->fetchesHelpMenuUserAnswerSelected->execute(['id' => $selectedAnswer['id']])->delete(); + } + } + else{ + //Delete all answer's belongs to the user + $currentQuestion = $request->question; + $isStart = $currentQuestion['is_start']; + if($isStart){ + QAUserAnswerSelected::where('user_id', $userId)->delete(); + } + } + } +} diff --git a/app/Classes/Modules/HelpMenu/Processors/FetchFirstHelpMenuQuestionProcessor.php b/app/Classes/Modules/HelpMenu/Processors/FetchFirstHelpMenuQuestionProcessor.php new file mode 100644 index 00000000..45c66ee4 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Processors/FetchFirstHelpMenuQuestionProcessor.php @@ -0,0 +1,32 @@ +fetchesHelpMenuQuestion = $fetchesHelpMenuQuestion; + } + + public function execute(Request $request){ + try { + $query = $this->fetchesHelpMenuQuestion->execute(['questionnaire_set_id' => 1]); + return $query; + } catch (\Exception $exception){ + throw new ErrorException($exception->getMessage(), $exception->getCode()); + } + } +} diff --git a/app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php b/app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php new file mode 100644 index 00000000..ec9cc63c --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php @@ -0,0 +1,93 @@ +fetchesHelpMenuQuestion = $fetchesHelpMenuQuestion; + $this->fetchesHelpMenuUserAnswerSelected = $fetchesHelpMenuUserAnswerSelected; + $this->fetchesHelpMenuUserAnswerSelectedList = $fetchesHelpMenuUserAnswerSelectedList; + } + + public function execute(Request $request){ + $isEnd = 0; + $questionId = 0; + $nextQuestionNumber = 0; + $nextNestedQuestion = 0; + $nextMainQuestion= 0; + $currentQuestion = $request->question; + $questionType = QAType::DEFAULT; + $returnQuestion = null; + + if ($currentQuestion && array_key_exists('id', $currentQuestion)) { + $questionId = $currentQuestion['id']; + $isEnd = $currentQuestion['is_end']; + $questionType = $currentQuestion['question_type']; + $nextNestedQuestion = $currentQuestion['next_nested_question']; + $nextMainQuestion = $currentQuestion['next_main_question']; + } + if ($request->has('answerObj')) { + $nextQuestionNumber = $request->answerObj['next_question_number']; + } + + if ($request->has('isPrevious')) { + $userId = Auth::user()->id; + $previousAnswer = $this->fetchesHelpMenuUserAnswerSelectedList->execute(['user_id' => $userId, 'order_by' => (object)['column' => 'id','DESC' => true]])[0]; + + //Get previous question + $previousQuestion = $this->fetchesHelpMenuQuestion->execute(['questionnaire_set_id' => 1, 'id' => $previousAnswer['question_id']]); + $returnQuestion = $previousQuestion; + } + else{ + //Get next question + $nextQuestion = null; + $question_number = 0; + if($nextQuestionNumber != 0){ + $question_number = $nextQuestionNumber; + } + else if($nextNestedQuestion != 0){ + $question_number = $nextNestedQuestion; + } + else { + $question_number = $nextMainQuestion; + } + + if($isEnd){ + $returnQuestion = null; + } + else if($question_number != 0){ + $nextQuestion = $this->fetchesHelpMenuQuestion->execute(['questionnaire_set_id' => 1, 'question_number' => $question_number]); + $returnQuestion = $nextQuestion; + } + else if (array_key_exists('id', $request->input('question'))) { + $nextQuestion = $this->fetchesHelpMenuQuestion->execute(['questionnaire_set_id' => 1, 'id_next' => $questionId, 'next_main_question' => null]); + $returnQuestion = $nextQuestion; + } + } + + return $returnQuestion; + } +} diff --git a/app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php b/app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php new file mode 100644 index 00000000..c89a71cc --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php @@ -0,0 +1,63 @@ +fetchesHelpMenuUserAnswerSelected = $fetchesHelpMenuUserAnswerSelected; + $this->uploadDocumentForHelpMenuProcessor = $uploadDocumentForHelpMenuProcessor; + } + + public function execute($userId, $questionId, $request){ + $filesUpload = $request->input('files'); + $answer = null; + try{ + // $answer = $this->fetchesHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'question_id' => $questionId, 'order_by' => ['column' => 'id','DESC' => 1]]); + $answer = $this->fetchesHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'question_id' => $questionId]); + } catch (\Exception $exception){ + $answer = null; + } + + if(is_null($answer)) + { + $answer = new QAUserAnswerSelected; + } + $answer->user_id = $userId; + $answer->question_id = $questionId; + if ($request->has('answerObj')) { + $answer->answer_option_id = intval($request->answerObj['id']); + } + $answer->free_text_answer = $request->answer; + $answer->save(); + + if($filesUpload){ + $result = $this->uploadDocumentForHelpMenuProcessor->execute($request, $answer); + $newData = array_map(function ($item) { + return [ + 'document_id' => $item->document_id, + 'file_id' => $item->id, + ]; + }, $result); + $answer->free_text_answer = json_encode($newData); + $answer->save(); + } + } +} diff --git a/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuQuestion.php b/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuQuestion.php new file mode 100644 index 00000000..e0acb1f6 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuQuestion.php @@ -0,0 +1,33 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelected.php b/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelected.php new file mode 100644 index 00000000..32aa2875 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelected.php @@ -0,0 +1,32 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelectedList.php b/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelectedList.php new file mode 100644 index 00000000..c746494a --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelectedList.php @@ -0,0 +1,32 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestionList.php b/app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestionList.php new file mode 100644 index 00000000..5bb272dc --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestionList.php @@ -0,0 +1,37 @@ + $subject, + 'department' => $department, + 'contactid' => $contactid, + 'userid' => $userid, + ]; + + $response = Http::asForm()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->post(config('perfexcrm.base_url').'/api/tickets',$data); + + if($response->successful()){ + $data = $response->json(); + return (object) $data; + }else{ + Log::error($response); + return null; + } + }catch(\Exception $exception){ + throw new MalformedRequestException('Unable to get correct response from Perfex CRM server: ' . $exception->getMessage()); + } + } +} diff --git a/app/Classes/ValueObjects/Constants/QAType.php b/app/Classes/ValueObjects/Constants/QAType.php new file mode 100644 index 00000000..a0251736 --- /dev/null +++ b/app/Classes/ValueObjects/Constants/QAType.php @@ -0,0 +1,18 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/HelpMenu/UpdateHelpMenuNextQuestionController.php b/app/Http/Controllers/HelpMenu/UpdateHelpMenuNextQuestionController.php new file mode 100644 index 00000000..929c9429 --- /dev/null +++ b/app/Http/Controllers/HelpMenu/UpdateHelpMenuNextQuestionController.php @@ -0,0 +1,19 @@ +execute($request); + } +} diff --git a/app/Http/Resources/HelpMenuAnswerOptionsResource.php b/app/Http/Resources/HelpMenuAnswerOptionsResource.php new file mode 100644 index 00000000..e250c435 --- /dev/null +++ b/app/Http/Resources/HelpMenuAnswerOptionsResource.php @@ -0,0 +1,26 @@ + $this->id, + 'display_text' => $this->display_text, + 'value' => $this->value, + 'order' => $this->order, + 'question_number' => $this->question_number, + 'next_question_number' => $this->next_question_number, + ]; + } +} diff --git a/app/Http/Resources/HelpMenuQuestionResource.php b/app/Http/Resources/HelpMenuQuestionResource.php new file mode 100644 index 00000000..b14f409b --- /dev/null +++ b/app/Http/Resources/HelpMenuQuestionResource.php @@ -0,0 +1,53 @@ +question = $question; + $this->userId = $userId; + } + /** + * Transform the resource into an array. + * + * @param \Illuminate\Http\Request $request + * @return array + */ + public function toArray($request) + { + if($this->question){ + $q = (object)$this->question; + return [ + 'id' => $q->id, + 'question_number' => $q->question_number, + 'question_text' => $q->question_text, + 'question_type' => $q->question_type, + 'question_answers' => HelpMenuAnswerOptionsResource::collection(QAAnswerOptions::where('question_number', $q->question_number)->get()), + 'questionnaire_set_id' => $q->questionnaire_set_id, + 'next_nested_question' => $q->next_nested_question, + 'next_main_question' => $q->next_main_question, + 'is_start' => $q->is_start, + 'is_end' => $q->is_end, + 'end_text' => $q->end_text, + 'order' => $q->order, + 'answer' => QAUserAnswerSelected::where('question_id', $q->id)->where('user_id', $this->userId)->first(), + 'questionnaire_answers' => $q->is_end ? HelpMenuQuestionnaireAnswersResource::collection(QAUserAnswerSelected::where('user_id', $this->userId)->get()) : null, + ]; + } + else{ + return []; + } + } +} diff --git a/app/Http/Resources/HelpMenuQuestionnaireAnswersResource.php b/app/Http/Resources/HelpMenuQuestionnaireAnswersResource.php new file mode 100644 index 00000000..b65e690c --- /dev/null +++ b/app/Http/Resources/HelpMenuQuestionnaireAnswersResource.php @@ -0,0 +1,24 @@ +question_id)->first(); + return [ + 'question_text' => $question ? $question->question_text : null, + 'free_text_answer' => $this->free_text_answer + ]; + } +} diff --git a/app/Models/QAAnswerOptions.php b/app/Models/QAAnswerOptions.php new file mode 100644 index 00000000..cd2eca79 --- /dev/null +++ b/app/Models/QAAnswerOptions.php @@ -0,0 +1,9 @@ +morphMany(Document::class, 'owner'); + } +} diff --git a/database/migrations/2023_02_20_134100_create_qa_questionnaire_sets_table.php b/database/migrations/2023_02_20_134100_create_qa_questionnaire_sets_table.php new file mode 100644 index 00000000..7a57a88f --- /dev/null +++ b/database/migrations/2023_02_20_134100_create_qa_questionnaire_sets_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('name'); + $table->string('description')->nullable(); + $table->unsignedSmallInteger('order')->default(0); + $table->unsignedBigInteger('next_set')->nullable(); + $table->unsignedSmallInteger('version')->default(1); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('qa_questionnaire_sets'); + } +} diff --git a/database/migrations/2023_02_20_134124_create_qa_questions_table.php b/database/migrations/2023_02_20_134124_create_qa_questions_table.php new file mode 100644 index 00000000..9a64c4bc --- /dev/null +++ b/database/migrations/2023_02_20_134124_create_qa_questions_table.php @@ -0,0 +1,45 @@ +id(); + $table->unsignedBigInteger('question_number'); + $table->text('question_text'); + $table->unsignedBigInteger('questionnaire_set_id'); + $table->unsignedBigInteger('next_nested_question')->nullable(); + $table->unsignedBigInteger('next_main_question')->nullable(); + $table->unsignedBigInteger('question_type'); + $table->tinyInteger('is_start'); + $table->tinyInteger('is_end'); + $table->string('end_text')->nullable(); + $table->unsignedInteger('order')->default(0); + $table->timestamps(); + $table->softDeletes(); + + $table->foreign('questionnaire_set_id')->references('id')->on('qa_questionnaire_sets'); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('qa_questions'); + } +} diff --git a/database/migrations/2023_02_21_091314_create_qa_answer_options_table.php b/database/migrations/2023_02_21_091314_create_qa_answer_options_table.php new file mode 100644 index 00000000..dd3b118e --- /dev/null +++ b/database/migrations/2023_02_21_091314_create_qa_answer_options_table.php @@ -0,0 +1,37 @@ +id(); + $table->text('display_text'); + $table->string('value'); + $table->unsignedSmallInteger('order')->default(0); + $table->unsignedBigInteger('question_number'); + $table->unsignedBigInteger('next_question_number')->nullable(); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('qa_answer_options'); + } +} diff --git a/database/migrations/2023_02_21_091507_create_qa_user_answer_selected_table.php b/database/migrations/2023_02_21_091507_create_qa_user_answer_selected_table.php new file mode 100644 index 00000000..e529a1f0 --- /dev/null +++ b/database/migrations/2023_02_21_091507_create_qa_user_answer_selected_table.php @@ -0,0 +1,40 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('question_id'); + $table->unsignedBigInteger('answer_option_id')->default(0); + $table->string('free_text_answer')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->foreign('question_id')->references('id')->on('qa_questions'); + // $table->foreign('answer_option_id')->references('id')->on('qa_answer_options'); + $table->foreign('user_id')->references('id')->on('users'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('qa_answer_option_selections'); + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index cf9474f7..3e85a5dc 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -21,5 +21,8 @@ class DatabaseSeeder extends Seeder $this->call(SegmentConstantsTableSeeder::class); $this->call(DummyDataSeeder::class); + + // $this->call(QAQuestionSeeder::class); + // $this->call(QAAnswerOptionsSeeder::class); } } diff --git a/database/seeders/QAAnswerOptionsSeeder.php b/database/seeders/QAAnswerOptionsSeeder.php new file mode 100644 index 00000000..9a0b33ae --- /dev/null +++ b/database/seeders/QAAnswerOptionsSeeder.php @@ -0,0 +1,155 @@ +display_text = "Billing"; + $answerOption->value = "Billing"; + $answerOption->question_number = 10; + $answerOption->next_question_number = 100; + $answerOption->save(); + + // Option 2 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Shipping"; + $answerOption->value = "Shipping"; + $answerOption->question_number = 10; + $answerOption->next_question_number = 100; + $answerOption->save(); + + // Option 3 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Returns"; + $answerOption->value = "Returns"; + $answerOption->question_number = 10; + $answerOption->next_question_number = 100; + $answerOption->save(); + + // Option 4 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Product Information"; + $answerOption->value = "Product Information"; + $answerOption->question_number = 10; + $answerOption->next_question_number = 100; + $answerOption->save(); + + // Option 5 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Technical Support"; + $answerOption->value = "Technical Support"; + $answerOption->question_number = 10; + $answerOption->next_question_number = 100; + $answerOption->save(); + + // Option 6 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Shipping Fee Calculation"; + $answerOption->value = "Shipping Fee Calculation"; + $answerOption->question_number = 10; + $answerOption->next_question_number = 600; + $answerOption->save(); + + // Option 7 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Error-in Measurements"; + $answerOption->value = "Error-in Measurements"; + $answerOption->question_number = 10; + $answerOption->next_question_number = 700; + $answerOption->save(); + + // Option 8 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Contact Us"; + $answerOption->value = "Contact Us"; + $answerOption->question_number = 10; + $answerOption->next_question_number = 800; + $answerOption->save(); + + // Option 1 for Question 20 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Option 1 for Question 20"; + $answerOption->value = "Option 1 for Question 20"; + $answerOption->question_number = 20; + $answerOption->save(); + + // Option 2 for Question 20 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Option 2 for Question 20"; + $answerOption->value = "Option 2 for Question 20"; + $answerOption->question_number = 20; + $answerOption->save(); + + // Option 1 for Question 100 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Option 1 for Question 100"; + $answerOption->value = "Option 1 for Question 100"; + $answerOption->question_number = 100; + $answerOption->save(); + + // Option 2 for Question 100 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Option 2 for Question 100"; + $answerOption->value = "Option 2 for Question 100"; + $answerOption->question_number = 100; + $answerOption->save(); + + // Option 1 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Option 1 for Question 30"; + $answerOption->value = "Option 1 for Question 30"; + $answerOption->question_number = 30; + $answerOption->save(); + + // Option 2 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Option 2 for Question 30"; + $answerOption->value = "Option 2 for Question 30"; + $answerOption->question_number = 30; + $answerOption->save(); + + // Option 3 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Option 3 for Question 30"; + $answerOption->value = "Option 3 for Question 30"; + $answerOption->question_number = 30; + $answerOption->save(); + + + // Option 1 for Question 300 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Option 1 for Question 300"; + $answerOption->value = "Option 1 for Question 300"; + $answerOption->question_number = 300; + $answerOption->save(); + + // Option 2 for Question 300 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Option 2 for Question 300"; + $answerOption->value = "Option 2 for Question 300"; + $answerOption->question_number = 300; + $answerOption->save(); + + // Option 3 for Question 300 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Option 3 for Question 300"; + $answerOption->value = "Option 3 for Question 300"; + $answerOption->question_number = 300; + $answerOption->save(); + + // Option 1 for Question 600 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = '

Et harum accusamus eum quis dolorum?

Lorem ipsum dolor sit amet. Est corporis voluptas et repudiandae libero Aut quis! Est aperiam voluptatum eum quidem rerumnam deserunt sit internos possimus non dolore voluptate. Vel explicabo aliquam Sit sunt ut maxime voluptatibus non vero libero ad ratione dolore.

Ea incidunt dolor in obcaecati harum ut dignissimos facilis!

Et adipisci illo et laborum internos Nam aperiam est ipsa nisi non quia architecto ut itaque autem. Eos maiores sunt Et voluptas aut expedita quidem aut odio repellendus eum neque voluptate et iusto nisi vel consequatur quos. Sit doloribus omnis in minima illoQui soluta est omnis quasi vel officia reiciendis qui aliquid quis! Sed odit esse aut sint laborumEa internos et magni amet sed dolores omnis hic totam temporibus ut quia numquam.

Et laborum quaerat vel animi ipsum.

Aut quos libero Et explicabo qui enim libero id rerum ipsa. Est quod tempora est soluta enimaut quasi aut eligendi fugit et fugit Quis.

+ '; + $answerOption->value = "Answer"; + $answerOption->question_number = 600; + $answerOption->save(); + } +} diff --git a/database/seeders/QAQuestionSeeder.php b/database/seeders/QAQuestionSeeder.php new file mode 100644 index 00000000..77e482e4 --- /dev/null +++ b/database/seeders/QAQuestionSeeder.php @@ -0,0 +1,187 @@ + 'Set 1', + 'description' => 'This is set 1 questions', + ], + ]; + + foreach ($questionnaireSets as $set) { + $questionnaireSet = QAQuestionnaireSet::create([ + 'name' => $set['name'], + 'description' => $set['description'], + ]); + + $questions = []; + + switch ($set['name']) { + case 'Set 1': + $questions = [ + [ + 'question_number' => 10, + 'question_text' => 'Please select one', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => true, + 'is_end' => false, + ], + [ + 'question_number' => 20, + 'question_text' => 'Question text for question number 20?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 30, + 'question_text' => 'Question text for question number 30?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'next_nested_question' => 300, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 40, + 'question_text' => 'What is your name?', + 'question_type' => QAType::FREE_TEXT, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 50, + 'question_text' => 'The End', + 'question_type' => QAType::ANSWER, + 'is_start' => false, + 'is_end' => true, + ], + [ + 'question_number' => 60, + 'question_text' => 'We have received your request and will response as soon as possible.', + 'question_type' => QAType::TICKET_CRM, + 'is_start' => false, + 'is_end' => true, + ], + [ + 'question_number' => 100, + 'question_text' => 'Question text for question number 100?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'next_nested_question' => 110, //200 //3 digits - first level + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 110, + 'question_text' => 'Question text for question number 110?', + 'question_type' => QAType::FREE_TEXT, + 'next_nested_question' => 1000, //1000 //4 digits - second level + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 300, + 'question_text' => 'Question text for question number 300?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'next_main_question' => 40, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 600, + 'question_text' => 'Shipping Fee Calculations', + 'question_type' => QAType::ANSWER, + 'is_start' => false, + 'is_end' => true, + ], + [ + 'question_number' => 700, + 'question_text' => 'Please enter your measurements', + 'question_type' => QAType::FREE_TEXT, + 'next_nested_question' => 710, + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 710, + 'question_text' => 'Please upload the photo proof', + 'question_type' => QAType::DOCUMENT_UPLOAD, + 'next_main_question' => 60, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 800, + 'question_text' => 'What is your name?', + 'question_type' => QAType::FREE_TEXT, + 'next_nested_question' => 810, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 810, + 'question_text' => 'Click Next to speak to our customer service', + 'question_type' => QAType::FREE_TEXT, + 'is_start' => false, + 'is_end' => true, + 'end_text' => 'We have received your request and will response as soon as possible.', + ], + [ + 'question_number' => 1000, + 'question_text' => 'Question text for question number 1000?', + 'question_type' => QAType::FREE_TEXT, + 'next_nested_question' => 10000, //10000 - 5 digits - 3rd level + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 10000, + 'question_text' => 'Question text for question number 10000?', + 'question_type' => QAType::FREE_TEXT, + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + ]; + break; + } + + foreach ($questions as $key => $questionData) { + $question = new QAQuestions; + $question->question_number = $questionData['question_number']; + $question->question_text = $questionData['question_text']; + $question->question_type = $questionData['question_type']; + $question->questionnaire_set_id = $questionnaireSet->id; + + if (isset($questionData['next_nested_question'])) { + $question->next_nested_question = $questionData['next_nested_question']; + } + if (isset($questionData['next_main_question'])) { + $question->next_main_question = $questionData['next_main_question']; + } + + $question->is_start = $questionData['is_start']; + $question->is_end = $questionData['is_end']; + if (isset($questionData['end_text'])) { + $question->end_text = $questionData['end_text']; + } + + $question->order = $key + 1; + $question->save(); + } + } + } +} diff --git a/resources/assets/vue/components/general/forms/HelpMenuFormComponent.vue b/resources/assets/vue/components/general/forms/HelpMenuFormComponent.vue new file mode 100644 index 00000000..003a980d --- /dev/null +++ b/resources/assets/vue/components/general/forms/HelpMenuFormComponent.vue @@ -0,0 +1,235 @@ + + diff --git a/resources/assets/vue/components/general/forms/RemarkFormComponent.vue b/resources/assets/vue/components/general/forms/RemarkFormComponent.vue index 8b67c246..73a8575f 100644 --- a/resources/assets/vue/components/general/forms/RemarkFormComponent.vue +++ b/resources/assets/vue/components/general/forms/RemarkFormComponent.vue @@ -36,6 +36,7 @@ \ No newline at end of file + diff --git a/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue b/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue index 0b48c640..6e6771c0 100644 --- a/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue +++ b/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue @@ -25,9 +25,13 @@
Change Order Number
+
Help Menu
+ + +
@@ -500,4 +504,4 @@ } } } - \ No newline at end of file + diff --git a/routes/api.php b/routes/api.php index 0946a13b..56e0968c 100644 --- a/routes/api.php +++ b/routes/api.php @@ -64,6 +64,8 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function require __DIR__ . '/contact.php'; + require __DIR__ . '/help_menu.php'; + }); require __DIR__ . '/announcement.php'; diff --git a/routes/help_menu.php b/routes/help_menu.php new file mode 100644 index 00000000..a20c2693 --- /dev/null +++ b/routes/help_menu.php @@ -0,0 +1,8 @@ + 'helpmenu', 'as' => 'helpmenu.', 'namespace' => 'HelpMenu'], function () { + Route::get('/question', 'FetchHelpMenuQuestionController@fetch')->name('first.question'); + Route::post('/question', 'UpdateHelpMenuNextQuestionController@fetch')->name('next.question'); +}); From 18579d5c1d75d14144b3e53fca19f8313378b50c Mon Sep 17 00:00:00 2001 From: Dillon Date: Thu, 4 May 2023 15:42:16 +0800 Subject: [PATCH 02/55] Implement help menu on new order profile version 2 component --- .../orders/sections/OrderProfileV2SectionComponent.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/assets/vue/components/orders/sections/OrderProfileV2SectionComponent.vue b/resources/assets/vue/components/orders/sections/OrderProfileV2SectionComponent.vue index 9615fc13..6ad5331c 100644 --- a/resources/assets/vue/components/orders/sections/OrderProfileV2SectionComponent.vue +++ b/resources/assets/vue/components/orders/sections/OrderProfileV2SectionComponent.vue @@ -25,9 +25,13 @@
Change Order Number
+
Help Menu
+ + +
@@ -200,4 +204,4 @@ } } } - \ No newline at end of file + From 42561a7c569efc51a80eb2aa36ef367f7906302d Mon Sep 17 00:00:00 2001 From: Dillon Date: Thu, 21 Sep 2023 00:19:21 +0800 Subject: [PATCH 03/55] New Customer Satisfaction Feedback Module --- .../UploadDocumentForHelpMenuProcessor.php | 6 +- .../FetchHelpMenuQuestionLogic.php | 14 +- .../GenerateFeedbackUrlLogic.php | 54 +++ .../ListHelpMenuQuestionsLogic.php | 71 ++++ .../HelpMenu/ControllersLogic/ListQALogic.php | 60 ++++ .../SubmitQAQuestionsLogic.php | 80 +++++ .../UpdateHelpMenuNextQuestionLogic.php | 22 +- .../QAUserSourceObject.php | 55 +++ .../DeleteHelpMenuAnswerProcessor.php | 14 +- .../FetchNextHelpMenuQuestionProcessor.php | 14 +- .../SaveHelpMenuAnswerProcessor.php | 25 +- .../Processors/UserSourceForQAProcessor.php | 70 ++++ .../HelpMenu/Services/CreatesQAUserSource.php | 25 ++ .../Services/FetchesHelpMenuQuestion.php | 1 - .../HelpMenu/Services/FetchesQAUserSource.php | 33 ++ .../Services/ListsHelpMenuQuestions.php | 32 ++ ...hp => ListsHelpMenuUserAnswerSelected.php} | 4 +- ...nList.php => CanFetchHelpMenuQuestion.php} | 7 +- .../Rules/CanGenerateFeedbackUrl.php | 38 +++ .../Rules/CanListHelpMenuQuestions.php | 41 +++ .../Constants/QASystemSourceType.php | 25 ++ app/Classes/ValueObjects/Constants/QAType.php | 2 + .../GenerateFeedbackUrlController.php | 20 ++ .../ListHelpMenuQuestionsController.php | 19 ++ .../Controllers/HelpMenu/ListQAController.php | 20 ++ .../HelpMenu/SubmitQAQuestionsController.php | 19 ++ .../Resources/HelpMenuQuestionResource.php | 2 +- .../HelpMenuQuestionsAnswersResource.php | 39 +++ .../Resources/HelpMenuUserSourceResource.php | 23 ++ app/Models/QAUserAnswerSelected.php | 17 + app/Models/QAUserSource.php | 9 + ...100_create_qa_questionnaire_sets_table.php | 4 +- ...02_20_134124_create_qa_questions_table.php | 2 +- ..._091314_create_qa_answer_options_table.php | 6 +- ..._19_154120_create_qa_user_source_table.php | 34 ++ ..._create_qa_user_answer_selected_table.php} | 8 +- database/seeders/QAAnswerOptionsSeeder.php | 38 +++ database/seeders/QAQuestionSeeder.php | 316 +++++++++++------- .../elements/QuestionAnswerComponent.vue | 17 + .../feedback/forms/FeedbackFormComponent.vue | 170 ++++++++++ .../GenerateFeedbackLinkFormComponent.vue | 99 ++++++ .../AdminFeedbackCustomerSectionComponent.vue | 12 + .../FeedbackCustomerSectionComponent.vue | 53 +++ .../general/forms/HelpMenuFormComponent.vue | 12 +- resources/assets/vue/general/mixins/guards.js | 8 +- .../views/layouts/base_no_login.blade.php | 25 ++ resources/views/pages/feedback.blade.php | 39 +++ .../views/pages/feedback/customer.blade.php | 4 + resources/views/partials/menu.blade.php | 15 +- routes/api.php | 6 +- routes/feedback.php | 8 + routes/help_menu.php | 2 + routes/web.php | 7 + 53 files changed, 1546 insertions(+), 200 deletions(-) create mode 100644 app/Classes/Modules/HelpMenu/ControllersLogic/GenerateFeedbackUrlLogic.php create mode 100644 app/Classes/Modules/HelpMenu/ControllersLogic/ListHelpMenuQuestionsLogic.php create mode 100644 app/Classes/Modules/HelpMenu/ControllersLogic/ListQALogic.php create mode 100644 app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php create mode 100644 app/Classes/Modules/HelpMenu/DataTransferObjects/QAUserSourceObject.php create mode 100644 app/Classes/Modules/HelpMenu/Processors/UserSourceForQAProcessor.php create mode 100644 app/Classes/Modules/HelpMenu/Services/CreatesQAUserSource.php create mode 100644 app/Classes/Modules/HelpMenu/Services/FetchesQAUserSource.php create mode 100644 app/Classes/Modules/HelpMenu/Services/ListsHelpMenuQuestions.php rename app/Classes/Modules/HelpMenu/Services/{FetchesHelpMenuUserAnswerSelectedList.php => ListsHelpMenuUserAnswerSelected.php} (81%) rename app/Classes/Modules/HelpMenu/Standards/Rules/{CanFetchHelpMenuQuestionList.php => CanFetchHelpMenuQuestion.php} (83%) create mode 100644 app/Classes/Modules/HelpMenu/Standards/Rules/CanGenerateFeedbackUrl.php create mode 100644 app/Classes/Modules/HelpMenu/Standards/Rules/CanListHelpMenuQuestions.php create mode 100644 app/Classes/ValueObjects/Constants/QASystemSourceType.php create mode 100644 app/Http/Controllers/HelpMenu/GenerateFeedbackUrlController.php create mode 100644 app/Http/Controllers/HelpMenu/ListHelpMenuQuestionsController.php create mode 100644 app/Http/Controllers/HelpMenu/ListQAController.php create mode 100644 app/Http/Controllers/HelpMenu/SubmitQAQuestionsController.php create mode 100644 app/Http/Resources/HelpMenuQuestionsAnswersResource.php create mode 100644 app/Http/Resources/HelpMenuUserSourceResource.php create mode 100644 app/Models/QAUserSource.php create mode 100644 database/migrations/2023_09_19_154120_create_qa_user_source_table.php rename database/migrations/{2023_02_21_091507_create_qa_user_answer_selected_table.php => 2023_09_19_164120_create_qa_user_answer_selected_table.php} (73%) create mode 100644 resources/assets/vue/components/feedback/elements/QuestionAnswerComponent.vue create mode 100644 resources/assets/vue/components/feedback/forms/FeedbackFormComponent.vue create mode 100644 resources/assets/vue/components/feedback/forms/GenerateFeedbackLinkFormComponent.vue create mode 100644 resources/assets/vue/components/feedback/sections/AdminFeedbackCustomerSectionComponent.vue create mode 100644 resources/assets/vue/components/feedback/sections/FeedbackCustomerSectionComponent.vue create mode 100644 resources/views/layouts/base_no_login.blade.php create mode 100644 resources/views/pages/feedback.blade.php create mode 100644 resources/views/pages/feedback/customer.blade.php create mode 100644 routes/feedback.php diff --git a/app/Classes/Modules/Documents/Processors/UploadDocumentForHelpMenuProcessor.php b/app/Classes/Modules/Documents/Processors/UploadDocumentForHelpMenuProcessor.php index 370b1a05..863fcfdc 100644 --- a/app/Classes/Modules/Documents/Processors/UploadDocumentForHelpMenuProcessor.php +++ b/app/Classes/Modules/Documents/Processors/UploadDocumentForHelpMenuProcessor.php @@ -32,12 +32,12 @@ class UploadDocumentForHelpMenuProcessor /** - * @param Request $request + * @param $filesUpload * @param QAUserAnswerSelected qaUserAnswerSelected * @throws \App\Classes\Exceptions\MalformedRequestException */ - public function execute(Request $request, QAUserAnswerSelected $qaUserAnswerSelected) { - $object = new DocumentObject("HELP_MENU", $request->input('files'), + public function execute($filesUpload, QAUserAnswerSelected $qaUserAnswerSelected) { + $object = new DocumentObject("HELP_MENU", $filesUpload, '123456', ApprovalStatus::PENDING_VERIFICATION, 'help_menu'); //cief todo: 123456 cannot be hardcoded /** @var Document $document */ diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php index da1de831..90673bda 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php @@ -4,7 +4,7 @@ namespace App\Classes\Modules\HelpMenu\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; -use App\Classes\Modules\HelpMenu\Standards\Rules\CanFetchHelpMenuQuestionList; +use App\Classes\Modules\HelpMenu\Standards\Rules\CanFetchHelpMenuQuestion; use App\Classes\Modules\HelpMenu\Processors\FetchFirstHelpMenuQuestionProcessor; use App\Http\Resources\HelpMenuQuestionResource; use ErrorException; @@ -25,20 +25,20 @@ class FetchHelpMenuQuestionLogic extends AbstractControllerLogic ]; } - /** @var CanFetchHelpMenuQuestionList */ - private $canFetchHelpMenuQuestionList; + /** @var CanFetchHelpMenuQuestion */ + private $canFetchHelpMenuQuestion; /** @var FetchFirstHelpMenuQuestionProcessor */ private $fetchFirstHelpMenuQuestionProcessor; /** * FetchHelpMenuQuestionLogic constructor. - * @param CanFetchHelpMenuQuestionList $canFetchHelpMenuQuestionList + * @param CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion * @param FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor */ - public function __construct(CanFetchHelpMenuQuestionList $canFetchHelpMenuQuestionList, FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor) + public function __construct(CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion, FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor) { - $this->canFetchHelpMenuQuestionList = $canFetchHelpMenuQuestionList; + $this->canFetchHelpMenuQuestion = $canFetchHelpMenuQuestion; $this->fetchFirstHelpMenuQuestionProcessor = $fetchFirstHelpMenuQuestionProcessor; } @@ -50,7 +50,7 @@ class FetchHelpMenuQuestionLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { - $this->canFetchHelpMenuQuestionList->passes(); + $this->canFetchHelpMenuQuestion->passes(); $userId = Auth::user()->id; diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/GenerateFeedbackUrlLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/GenerateFeedbackUrlLogic.php new file mode 100644 index 00000000..9a40b8b2 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/GenerateFeedbackUrlLogic.php @@ -0,0 +1,54 @@ + 'Generate Feedback Url', + 'message' => 'You have successfully generated a feedback url' + ]; + } + + /** @var CanGenerateFeedbackUrl */ + private $canGenerateFeedbackUrl; + + + /** + * GenerateFeedbackUrlLogic constructor. + * @param CanGenerateFeedbackUrl $canGenerateFeedbackUrl + */ + public function __construct(CanGenerateFeedbackUrl $canGenerateFeedbackUrl) + { + $this->canGenerateFeedbackUrl = $canGenerateFeedbackUrl; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + $this->canGenerateFeedbackUrl->passes(); + + $originalText = $request->input('system') . '|' . $request->input('customer_marking'). '|' . $request->input('email'). '|' . $request->input('question_set'); + $resource = ['token' => Crypt::encryptString($originalText)]; + return $this->response(['data' => $resource]); + } + +} diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/ListHelpMenuQuestionsLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/ListHelpMenuQuestionsLogic.php new file mode 100644 index 00000000..d61b3aa7 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/ListHelpMenuQuestionsLogic.php @@ -0,0 +1,71 @@ + 'Retrieved Questions', + 'message' => 'You have successfully retrieved a list of Questions' + ]; + } + + /** @var CanListHelpMenuQuestions */ + private $canListHelpMenuQuestions; + + /** @var ListsHelpMenuQuestions */ + private $listsHelpMenuQuestions; + + /** + * ListHelpMenuQuestionsLogic constructor. + * @param CanListHelpMenuQuestions $canListHelpMenuQuestions + * @param ListsHelpMenuQuestions $listsHelpMenuQuestions + */ + public function __construct(CanListHelpMenuQuestions $canListHelpMenuQuestions, ListsHelpMenuQuestions $listsHelpMenuQuestions) + { + $this->canListHelpMenuQuestions = $canListHelpMenuQuestions; + $this->listsHelpMenuQuestions = $listsHelpMenuQuestions; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + * @throws \App\Classes\Exceptions\ResourceNotFoundException + */ + public function logic(Request $request) : JsonResponse + { + $this->canListHelpMenuQuestions->passes(); + + try{ + $token = $request->input('token'); + $decriptedToken = Crypt::decryptString($token); + $delimiter = "|"; + $parts = explode($delimiter, $decriptedToken); + $questionSet = $parts[3]; + $query = $this->listsHelpMenuQuestions->execute(['questionnaire_set_id' => $questionSet]); + return $this->collectionResponse(HelpMenuQuestionResource::collection($query)); + } catch(\Exception $exception){ + throw new ResourceNotFoundException($exception->getMessage()); + } + } + +} diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/ListQALogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/ListQALogic.php new file mode 100644 index 00000000..ea99044b --- /dev/null +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/ListQALogic.php @@ -0,0 +1,60 @@ + 'Retrieved Questions Answers', + 'message' => 'You have successfully retrieved a list of questions and answers' + ]; + } + + /** @var CanListHelpMenuQuestions */ + private $canListHelpMenuQuestions; + + /** @var ListsHelpMenuUserAnswerSelected */ + private $listsHelpMenuUserAnswerSelected; + + /** + * ListQALogic constructor. + * @param CanListHelpMenuQuestions $canListHelpMenuQuestions + * @param ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected + */ + public function __construct(CanListHelpMenuQuestions $canListHelpMenuQuestions, ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected) + { + $this->canListHelpMenuQuestions = $canListHelpMenuQuestions; + $this->listsHelpMenuUserAnswerSelected = $listsHelpMenuUserAnswerSelected; + } + + + /** + * @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 + { + $this->canListHelpMenuQuestions->passes(); + + $query = $this->listsHelpMenuUserAnswerSelected->execute($this->listsHelpMenuUserAnswerSelected->deserializeFilters($request->input('filters'))); + + return $this->collectionResponse(HelpMenuQuestionsAnswersResource::collection($query)); + } + +} diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php new file mode 100644 index 00000000..977ebc84 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php @@ -0,0 +1,80 @@ + 'Feedback Submission', + 'message' => 'You have successfully submitted yours answers' + ]; + } + + /** @var SaveHelpMenuAnswerProcessor */ + private $saveHelpMenuAnswerProcessor; + + /** @var UserSourceForQAProcessor */ + private $userSourceForQAProcessor; + + /** + * SubmitQAQuestionsLogic constructor. + * @param SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor + * @param UserSourceForQAProcessor $userSourceForQAProcessor + */ + public function __construct(SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor, UserSourceForQAProcessor $userSourceForQAProcessor) + { + $this->saveHelpMenuAnswerProcessor = $saveHelpMenuAnswerProcessor; + $this->userSourceForQAProcessor = $userSourceForQAProcessor; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + $token = $request->input('token'); + $userId = 0; + $sourceId = 0; + try { + $decriptedToken = Crypt::decryptString($token); + $delimiter = "|"; + $parts = explode($delimiter, $decriptedToken); + $system = $parts[0]; + $customerMarking = $parts[1]; + $email = $parts[2]; + + $result = $this->userSourceForQAProcessor->execute($system, $customerMarking, $email); + $userId = $result['userId']; + $sourceId = $result['sourceId']; + + } catch (\Throwable $e) { + Log::error($e); + } + + $answers = $request->input('answers'); + foreach ($answers as $answer) { + $filesUpload = $request->input('files'); + $this->saveHelpMenuAnswerProcessor->execute($userId, $sourceId, $answer['questionId'], $answer['answer'], $answer['answerId'], $filesUpload); + } + + $response = ['message' => 'Thank you for your feedback.']; + return $this->response(['data' => $response]); + } +} diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php index f29d236e..b01a7235 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php @@ -5,7 +5,7 @@ namespace App\Classes\Modules\HelpMenu\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMSupportTicket; use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMCustomer; -use App\Classes\Modules\HelpMenu\Standards\Rules\CanFetchHelpMenuQuestionList; +use App\Classes\Modules\HelpMenu\Standards\Rules\CanFetchHelpMenuQuestion; use App\Classes\Modules\HelpMenu\Processors\SaveHelpMenuAnswerProcessor; use App\Classes\Modules\HelpMenu\Processors\DeleteHelpMenuAnswerProcessor; use App\Classes\Modules\HelpMenu\Processors\FetchNextHelpMenuQuestionProcessor; @@ -31,8 +31,8 @@ class UpdateHelpMenuNextQuestionLogic extends AbstractControllerLogic ]; } - /** @var CanFetchHelpMenuQuestionList */ - private $canFetchHelpMenuQuestionList; + /** @var CanFetchHelpMenuQuestion */ + private $canFetchHelpMenuQuestion; /** @var SaveHelpMenuAnswerProcessor */ private $saveHelpMenuAnswerProcessor; @@ -54,15 +54,15 @@ class UpdateHelpMenuNextQuestionLogic extends AbstractControllerLogic /** * UpdateHelpMenuNextQuestionLogic constructor. - * @param CanFetchHelpMenuQuestionList $canFetchHelpMenuQuestionList + * @param CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion * @param SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor * @param FetchNextHelpMenuQuestionProcessor $fetchNextHelpMenuQuestionProcessor * @param FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor * @param DeleteHelpMenuAnswerProcessor $deleteHelpMenuAnswerProcessor */ - public function __construct(CanFetchHelpMenuQuestionList $canFetchHelpMenuQuestionList, SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor, FetchNextHelpMenuQuestionProcessor $fetchNextHelpMenuQuestionProcessor, FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor, CreatesPerfexCRMSupportTicket $createsPerfexCRMSupportTicket, FetchesPerfexCRMCustomer $fetchesPerfexCRMCustomer, DeleteHelpMenuAnswerProcessor $deleteHelpMenuAnswerProcessor) + public function __construct(CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion, SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor, FetchNextHelpMenuQuestionProcessor $fetchNextHelpMenuQuestionProcessor, FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor, CreatesPerfexCRMSupportTicket $createsPerfexCRMSupportTicket, FetchesPerfexCRMCustomer $fetchesPerfexCRMCustomer, DeleteHelpMenuAnswerProcessor $deleteHelpMenuAnswerProcessor) { - $this->canFetchHelpMenuQuestionList = $canFetchHelpMenuQuestionList; + $this->canFetchHelpMenuQuestion = $canFetchHelpMenuQuestion; $this->saveHelpMenuAnswerProcessor = $saveHelpMenuAnswerProcessor; $this->fetchNextHelpMenuQuestionProcessor = $fetchNextHelpMenuQuestionProcessor; $this->fetchFirstHelpMenuQuestionProcessor = $fetchFirstHelpMenuQuestionProcessor; @@ -85,14 +85,20 @@ class UpdateHelpMenuNextQuestionLogic extends AbstractControllerLogic $questionId = $currentQuestion['id']; $questionType = $currentQuestion['question_type']; - $this->canFetchHelpMenuQuestionList->passes(); + $this->canFetchHelpMenuQuestion->passes(); //Delete answer $this->deleteHelpMenuAnswerProcessor->execute($userId, $questionId, $request); //Save answer given by user if (!$request->has('isPrevious')) { - $this->saveHelpMenuAnswerProcessor->execute($userId, $questionId, $request); + $filesUpload = $request->input('files'); + $answerOptionId = 0; + if ($request->has('answerObj')) { + $answerOptionId = intval($request->answerObj['id']); + } + $answerInText = $request->answer; + $this->saveHelpMenuAnswerProcessor->execute($userId, 0, $questionId, $answerInText, $answerOptionId, $filesUpload); } //Create ticket at crm diff --git a/app/Classes/Modules/HelpMenu/DataTransferObjects/QAUserSourceObject.php b/app/Classes/Modules/HelpMenu/DataTransferObjects/QAUserSourceObject.php new file mode 100644 index 00000000..3c0791c5 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/DataTransferObjects/QAUserSourceObject.php @@ -0,0 +1,55 @@ +system = $system; + $this->marking = $marking; + $this->email = $email; + } + + /** + * @return string + */ + public function getSystem(): string + { + return $this->system; + } + + /** + * @return string + */ + public function getMarking(): string + { + return $this->marking; + } + + /** + * @return string + */ + public function getEmail(): string + { + return $this->email; + } + +} diff --git a/app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php b/app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php index 1df15ae8..2ba8b928 100644 --- a/app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php +++ b/app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php @@ -4,32 +4,32 @@ namespace App\Classes\Modules\HelpMenu\Processors; use App\Models\QAUserAnswerSelected; use App\Classes\Modules\HelpMenu\Services\FetchesHelpMenuUserAnswerSelected; -use App\Classes\Modules\HelpMenu\Services\FetchesHelpMenuUserAnswerSelectedList; +use App\Classes\Modules\HelpMenu\Services\ListsHelpMenuUserAnswerSelected; class DeleteHelpMenuAnswerProcessor { /** @var FetchesHelpMenuUserAnswerSelected */ private $fetchesHelpMenuUserAnswerSelected; - /** @var FetchesHelpMenuUserAnswerSelectedList */ - private $fetchesHelpMenuUserAnswerSelectedList; + /** @var ListsHelpMenuUserAnswerSelected */ + private $listsHelpMenuUserAnswerSelected; /** * DeleteHelpMenuAnswerProcessor constructor. * @param FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected - * @param FetchesHelpMenuUserAnswerSelectedList $fetchesHelpMenuUserAnswerSelectedList + * @param ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected */ - public function __construct(FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected, FetchesHelpMenuUserAnswerSelectedList $fetchesHelpMenuUserAnswerSelectedList) + public function __construct(FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected, ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected) { $this->fetchesHelpMenuUserAnswerSelected = $fetchesHelpMenuUserAnswerSelected; - $this->fetchesHelpMenuUserAnswerSelectedList = $fetchesHelpMenuUserAnswerSelectedList; + $this->listsHelpMenuUserAnswerSelected = $listsHelpMenuUserAnswerSelected; } public function execute($userId, $questionId, $request){ if ($request->has('isPrevious')) { //Get current and previous question's answer try{ - $selectedAnswer = $this->fetchesHelpMenuUserAnswerSelectedList->execute(['user_id' => $userId, 'question_id' => $questionId, 'order_by' => (object)['column' => 'id','DESC' => true]])[0]; + $selectedAnswer = $this->listsHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'question_id' => $questionId, 'order_by' => (object)['column' => 'id','DESC' => true]])[0]; } catch (\Exception $exception){ $selectedAnswer = null; } diff --git a/app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php b/app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php index ec9cc63c..f832c280 100644 --- a/app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php +++ b/app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php @@ -4,7 +4,7 @@ namespace App\Classes\Modules\HelpMenu\Processors; use App\Classes\Modules\HelpMenu\Services\FetchesHelpMenuQuestion; use App\Classes\Modules\HelpMenu\Services\FetchesHelpMenuUserAnswerSelected; -use App\Classes\Modules\HelpMenu\Services\FetchesHelpMenuUserAnswerSelectedList; +use App\Classes\Modules\HelpMenu\Services\ListsHelpMenuUserAnswerSelected; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Classes\ValueObjects\Constants\QAType; @@ -17,19 +17,19 @@ class FetchNextHelpMenuQuestionProcessor /** @var FetchesHelpMenuUserAnswerSelected */ private $fetchesHelpMenuUserAnswerSelected; - /** @var FetchesHelpMenuUserAnswerSelectedList */ - private $fetchesHelpMenuUserAnswerSelectedList; + /** @var ListsHelpMenuUserAnswerSelected */ + private $listsHelpMenuUserAnswerSelected; /** * FetchNextHelpMenuQuestionProcessor constructor. * @param FetchesHelpMenuQuestion $fetchesHelpMenuQuestion * @param FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected - * @param FetchesHelpMenuUserAnswerSelectedList $fetchesHelpMenuUserAnswerSelectedList + * @param ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected */ - public function __construct(FetchesHelpMenuQuestion $fetchesHelpMenuQuestion, FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected, FetchesHelpMenuUserAnswerSelectedList $fetchesHelpMenuUserAnswerSelectedList) + public function __construct(FetchesHelpMenuQuestion $fetchesHelpMenuQuestion, FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected, ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected) { $this->fetchesHelpMenuQuestion = $fetchesHelpMenuQuestion; $this->fetchesHelpMenuUserAnswerSelected = $fetchesHelpMenuUserAnswerSelected; - $this->fetchesHelpMenuUserAnswerSelectedList = $fetchesHelpMenuUserAnswerSelectedList; + $this->listsHelpMenuUserAnswerSelected = $listsHelpMenuUserAnswerSelected; } public function execute(Request $request){ @@ -55,7 +55,7 @@ class FetchNextHelpMenuQuestionProcessor if ($request->has('isPrevious')) { $userId = Auth::user()->id; - $previousAnswer = $this->fetchesHelpMenuUserAnswerSelectedList->execute(['user_id' => $userId, 'order_by' => (object)['column' => 'id','DESC' => true]])[0]; + $previousAnswer = $this->listsHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'order_by' => (object)['column' => 'id','DESC' => true]])[0]; //Get previous question $previousQuestion = $this->fetchesHelpMenuQuestion->execute(['questionnaire_set_id' => 1, 'id' => $previousAnswer['question_id']]); diff --git a/app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php b/app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php index c89a71cc..23a5c34f 100644 --- a/app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php +++ b/app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php @@ -26,30 +26,29 @@ class SaveHelpMenuAnswerProcessor $this->uploadDocumentForHelpMenuProcessor = $uploadDocumentForHelpMenuProcessor; } - public function execute($userId, $questionId, $request){ - $filesUpload = $request->input('files'); + public function execute($userId, $sourceId, $questionId, $answerInText, $answerOptionId, $filesUpload){ + $answer = null; - try{ - // $answer = $this->fetchesHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'question_id' => $questionId, 'order_by' => ['column' => 'id','DESC' => 1]]); - $answer = $this->fetchesHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'question_id' => $questionId]); - } catch (\Exception $exception){ - $answer = null; - } + // try{ + // // $answer = $this->fetchesHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'question_id' => $questionId, 'order_by' => ['column' => 'id','DESC' => 1]]); + // $answer = $this->fetchesHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'user_id' => $sourceId, 'question_id' => $questionId]); + // } catch (\Exception $exception){ + // $answer = null; + // } if(is_null($answer)) { $answer = new QAUserAnswerSelected; } $answer->user_id = $userId; + $answer->source_id = $sourceId; $answer->question_id = $questionId; - if ($request->has('answerObj')) { - $answer->answer_option_id = intval($request->answerObj['id']); - } - $answer->free_text_answer = $request->answer; + $answer->answer_option_id = intval($answerOptionId); + $answer->free_text_answer = $answerInText; $answer->save(); if($filesUpload){ - $result = $this->uploadDocumentForHelpMenuProcessor->execute($request, $answer); + $result = $this->uploadDocumentForHelpMenuProcessor->execute($filesUpload, $answer); $newData = array_map(function ($item) { return [ 'document_id' => $item->document_id, diff --git a/app/Classes/Modules/HelpMenu/Processors/UserSourceForQAProcessor.php b/app/Classes/Modules/HelpMenu/Processors/UserSourceForQAProcessor.php new file mode 100644 index 00000000..3ed66deb --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Processors/UserSourceForQAProcessor.php @@ -0,0 +1,70 @@ +fetchesUser = $fetchesUser; + $this->fetchesQAUserSource = $fetchesQAUserSource; + $this->createsQAUserSource = $createsQAUserSource; + } + + public function execute($system, $customerMarking, $email){ + $result = []; + $isFound = false; + if((int)$system === QASystemSourceType::IZYIM){ + try{ + $query = $this->fetchesUser->execute(['email' => $email]); + $result['userId'] = $query->id; + $result['sourceId'] = 0; + $isFound = true; + } catch (ResourceNotFoundException $exception){ + $isFound = false; + } + } + + if(!$isFound){ + try{ + $query = $this->fetchesQAUserSource->execute(['email' => $email]); + $result['userId'] = 0; + $result['sourceId'] = $query->id; + } catch (ResourceNotFoundException $exception){ + $result['sourceId'] = 0; + } + + if($result['sourceId'] === 0){ + $new_object = new QAUserSourceObject($system, $customerMarking, $email); + $query = $this->createsQAUserSource->execute($new_object); + $result['userId'] = 0; + $result['sourceId'] = $query->id; + } + } + + return $result; + } +} diff --git a/app/Classes/Modules/HelpMenu/Services/CreatesQAUserSource.php b/app/Classes/Modules/HelpMenu/Services/CreatesQAUserSource.php new file mode 100644 index 00000000..a55cd6b1 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Services/CreatesQAUserSource.php @@ -0,0 +1,25 @@ +system = $object->getSystem(); + $model->marking = $object->getMarking(); + $model->email = $object->getEmail(); + + return $this->handler($model); + + } +} diff --git a/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuQuestion.php b/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuQuestion.php index e0acb1f6..8491cb77 100644 --- a/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuQuestion.php +++ b/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuQuestion.php @@ -2,7 +2,6 @@ namespace App\Classes\Modules\HelpMenu\Services; - use App\Classes\General\Eloquent\AbstractFetchRecord; use Illuminate\Database\Eloquent\Builder; use App\Models\QAQuestions; diff --git a/app/Classes/Modules/HelpMenu/Services/FetchesQAUserSource.php b/app/Classes/Modules/HelpMenu/Services/FetchesQAUserSource.php new file mode 100644 index 00000000..7c40a0ad --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Services/FetchesQAUserSource.php @@ -0,0 +1,33 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/HelpMenu/Services/ListsHelpMenuQuestions.php b/app/Classes/Modules/HelpMenu/Services/ListsHelpMenuQuestions.php new file mode 100644 index 00000000..572197fc --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Services/ListsHelpMenuQuestions.php @@ -0,0 +1,32 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelectedList.php b/app/Classes/Modules/HelpMenu/Services/ListsHelpMenuUserAnswerSelected.php similarity index 81% rename from app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelectedList.php rename to app/Classes/Modules/HelpMenu/Services/ListsHelpMenuUserAnswerSelected.php index c746494a..96ee660f 100644 --- a/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelectedList.php +++ b/app/Classes/Modules/HelpMenu/Services/ListsHelpMenuUserAnswerSelected.php @@ -6,14 +6,14 @@ use App\Classes\General\Eloquent\AbstractListRecord; use Illuminate\Database\Eloquent\Builder; use App\Models\QAUserAnswerSelected; -class FetchesHelpMenuUserAnswerSelectedList extends AbstractListRecord +class ListsHelpMenuUserAnswerSelected extends AbstractListRecord { /** @var QAUserAnswerSelected */ private $repository; /** - * FetchesHelpMenuUserAnswerSelectedList constructor. + * ListsHelpMenuUserAnswerSelected constructor. * @param QAUserAnswerSelected $repository */ public function __construct(QAUserAnswerSelected $repository) diff --git a/app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestionList.php b/app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestion.php similarity index 83% rename from app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestionList.php rename to app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestion.php index 5bb272dc..61e3ef03 100644 --- a/app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestionList.php +++ b/app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestion.php @@ -5,8 +5,9 @@ namespace App\Classes\Modules\HelpMenu\Standards\Rules; use App\Classes\General\Abstracts\AbstractRule; -class CanFetchHelpMenuQuestionList extends AbstractRule +class CanFetchHelpMenuQuestion extends AbstractRule { + /** * @return bool */ @@ -17,7 +18,7 @@ class CanFetchHelpMenuQuestionList extends AbstractRule } /** - * @param $object + * @param $object * @return bool */ protected function validators($object): bool @@ -26,7 +27,7 @@ class CanFetchHelpMenuQuestionList extends AbstractRule } /** - * @param $object + * @param $object * @return bool */ protected function criteria($object): bool diff --git a/app/Classes/Modules/HelpMenu/Standards/Rules/CanGenerateFeedbackUrl.php b/app/Classes/Modules/HelpMenu/Standards/Rules/CanGenerateFeedbackUrl.php new file mode 100644 index 00000000..6179f7ea --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Standards/Rules/CanGenerateFeedbackUrl.php @@ -0,0 +1,38 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/HelpMenu/ListHelpMenuQuestionsController.php b/app/Http/Controllers/HelpMenu/ListHelpMenuQuestionsController.php new file mode 100644 index 00000000..284f4386 --- /dev/null +++ b/app/Http/Controllers/HelpMenu/ListHelpMenuQuestionsController.php @@ -0,0 +1,19 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/HelpMenu/ListQAController.php b/app/Http/Controllers/HelpMenu/ListQAController.php new file mode 100644 index 00000000..b15dc15c --- /dev/null +++ b/app/Http/Controllers/HelpMenu/ListQAController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/HelpMenu/SubmitQAQuestionsController.php b/app/Http/Controllers/HelpMenu/SubmitQAQuestionsController.php new file mode 100644 index 00000000..6cd03d9b --- /dev/null +++ b/app/Http/Controllers/HelpMenu/SubmitQAQuestionsController.php @@ -0,0 +1,19 @@ +execute($request); + } +} diff --git a/app/Http/Resources/HelpMenuQuestionResource.php b/app/Http/Resources/HelpMenuQuestionResource.php index b14f409b..e41aeb53 100644 --- a/app/Http/Resources/HelpMenuQuestionResource.php +++ b/app/Http/Resources/HelpMenuQuestionResource.php @@ -34,7 +34,7 @@ class HelpMenuQuestionResource extends JsonResource 'question_number' => $q->question_number, 'question_text' => $q->question_text, 'question_type' => $q->question_type, - 'question_answers' => HelpMenuAnswerOptionsResource::collection(QAAnswerOptions::where('question_number', $q->question_number)->get()), + 'question_answers' => HelpMenuAnswerOptionsResource::collection(QAAnswerOptions::where('question_number', $q->question_number)->where('questionnaire_set_id', $q->questionnaire_set_id)->get()), 'questionnaire_set_id' => $q->questionnaire_set_id, 'next_nested_question' => $q->next_nested_question, 'next_main_question' => $q->next_main_question, diff --git a/app/Http/Resources/HelpMenuQuestionsAnswersResource.php b/app/Http/Resources/HelpMenuQuestionsAnswersResource.php new file mode 100644 index 00000000..8dc59fa0 --- /dev/null +++ b/app/Http/Resources/HelpMenuQuestionsAnswersResource.php @@ -0,0 +1,39 @@ +question_id)->first(); + $source = new HelpMenuUserSourceResource($this->userSource); + $user = $this->source_id === 0 ? new UserResource($this->user) : null; + + if($user){ + $user_marking = $user->companyModule()->first()->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference; + } + + return [ + 'question_id' => $this->question_id, + 'questionnaire_set_id' => $question ? $question->questionnaire_set_id : null, + 'question_text' => $question ? $question->question_text : null, + 'free_text_answer' => $this->free_text_answer, + 'source_system' => $user ? QASystemSourceType::getText(QASystemSourceType::IZYIM) : QASystemSourceType::getText($source->system), + 'source_marking' => $user ? $user_marking : $source->marking, + 'source_email' => $user ? $user->email : $source->email, + 'created_at' => Carbon::parse($this->created_at)->format('d-m-Y'), + ]; + } +} diff --git a/app/Http/Resources/HelpMenuUserSourceResource.php b/app/Http/Resources/HelpMenuUserSourceResource.php new file mode 100644 index 00000000..e02d35ff --- /dev/null +++ b/app/Http/Resources/HelpMenuUserSourceResource.php @@ -0,0 +1,23 @@ + $this->system, + 'email' => $this->email, + 'marking' => $this->marking, + ]; + } +} diff --git a/app/Models/QAUserAnswerSelected.php b/app/Models/QAUserAnswerSelected.php index 25d9ef9d..50de039d 100644 --- a/app/Models/QAUserAnswerSelected.php +++ b/app/Models/QAUserAnswerSelected.php @@ -21,4 +21,21 @@ class QAUserAnswerSelected extends AbstractModel implements Documentable { return $this->morphMany(Document::class, 'owner'); } + + /** + * @return BelongsTo + */ + public function userSource(): BelongsTo + { + return $this->BelongsTo(QAUserSource::class, 'source_id', 'id'); + } + + /** + * @return BelongsTo + */ + public function user(): BelongsTo + { + return $this->BelongsTo(User::class, 'user_id', 'id'); + } + } diff --git a/app/Models/QAUserSource.php b/app/Models/QAUserSource.php new file mode 100644 index 00000000..21401df5 --- /dev/null +++ b/app/Models/QAUserSource.php @@ -0,0 +1,9 @@ +id(); $table->string('name'); $table->string('description')->nullable(); - $table->unsignedSmallInteger('order')->default(0); + $table->unsignedBigInteger('order')->default(0); $table->unsignedBigInteger('next_set')->nullable(); - $table->unsignedSmallInteger('version')->default(1); + $table->unsignedBigInteger('version')->default(1); $table->timestamps(); $table->softDeletes(); }); diff --git a/database/migrations/2023_02_20_134124_create_qa_questions_table.php b/database/migrations/2023_02_20_134124_create_qa_questions_table.php index 9a64c4bc..881085aa 100644 --- a/database/migrations/2023_02_20_134124_create_qa_questions_table.php +++ b/database/migrations/2023_02_20_134124_create_qa_questions_table.php @@ -24,7 +24,7 @@ class CreateQAQuestionsTable extends Migration $table->tinyInteger('is_start'); $table->tinyInteger('is_end'); $table->string('end_text')->nullable(); - $table->unsignedInteger('order')->default(0); + $table->unsignedBigInteger('order')->default(0); $table->timestamps(); $table->softDeletes(); diff --git a/database/migrations/2023_02_21_091314_create_qa_answer_options_table.php b/database/migrations/2023_02_21_091314_create_qa_answer_options_table.php index dd3b118e..7c9fcc39 100644 --- a/database/migrations/2023_02_21_091314_create_qa_answer_options_table.php +++ b/database/migrations/2023_02_21_091314_create_qa_answer_options_table.php @@ -17,11 +17,15 @@ class CreateQAAnswerOptionsTable extends Migration $table->id(); $table->text('display_text'); $table->string('value'); - $table->unsignedSmallInteger('order')->default(0); + $table->unsignedBigInteger('order')->default(0); $table->unsignedBigInteger('question_number'); $table->unsignedBigInteger('next_question_number')->nullable(); + $table->unsignedBigInteger('questionnaire_set_id'); $table->timestamps(); $table->softDeletes(); + + $table->foreign('questionnaire_set_id')->references('id')->on('qa_questionnaire_sets'); + }); } diff --git a/database/migrations/2023_09_19_154120_create_qa_user_source_table.php b/database/migrations/2023_09_19_154120_create_qa_user_source_table.php new file mode 100644 index 00000000..638a8d44 --- /dev/null +++ b/database/migrations/2023_09_19_154120_create_qa_user_source_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('system'); + $table->string('email'); + $table->string('marking'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('qa_user_source'); + } +} diff --git a/database/migrations/2023_02_21_091507_create_qa_user_answer_selected_table.php b/database/migrations/2023_09_19_164120_create_qa_user_answer_selected_table.php similarity index 73% rename from database/migrations/2023_02_21_091507_create_qa_user_answer_selected_table.php rename to database/migrations/2023_09_19_164120_create_qa_user_answer_selected_table.php index e529a1f0..3560bfba 100644 --- a/database/migrations/2023_02_21_091507_create_qa_user_answer_selected_table.php +++ b/database/migrations/2023_09_19_164120_create_qa_user_answer_selected_table.php @@ -15,7 +15,8 @@ class CreateQAUserAnswerSelectedTable extends Migration { Schema::create('qa_user_answer_selected', function (Blueprint $table) { $table->id(); - $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('user_id')->default(0); + $table->unsignedBigInteger('source_id')->default(0); $table->unsignedBigInteger('question_id'); $table->unsignedBigInteger('answer_option_id')->default(0); $table->string('free_text_answer')->nullable(); @@ -24,7 +25,8 @@ class CreateQAUserAnswerSelectedTable extends Migration $table->foreign('question_id')->references('id')->on('qa_questions'); // $table->foreign('answer_option_id')->references('id')->on('qa_answer_options'); - $table->foreign('user_id')->references('id')->on('users'); + // $table->foreign('user_id')->references('id')->on('users'); + // $table->foreign('source_id')->references('id')->on('qa_user_source'); }); } @@ -35,6 +37,6 @@ class CreateQAUserAnswerSelectedTable extends Migration */ public function down() { - Schema::dropIfExists('qa_answer_option_selections'); + Schema::dropIfExists('qa_user_answer_selected'); } } diff --git a/database/seeders/QAAnswerOptionsSeeder.php b/database/seeders/QAAnswerOptionsSeeder.php index 9a0b33ae..af13e165 100644 --- a/database/seeders/QAAnswerOptionsSeeder.php +++ b/database/seeders/QAAnswerOptionsSeeder.php @@ -9,12 +9,14 @@ class QAAnswerOptionsSeeder extends Seeder { public function run() { + //Set 1 // Option 1 for Question 10 $answerOption = new QAAnswerOptions; $answerOption->display_text = "Billing"; $answerOption->value = "Billing"; $answerOption->question_number = 10; $answerOption->next_question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 2 for Question 10 @@ -23,6 +25,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Shipping"; $answerOption->question_number = 10; $answerOption->next_question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 3 for Question 10 @@ -31,6 +34,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Returns"; $answerOption->question_number = 10; $answerOption->next_question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 4 for Question 10 @@ -39,6 +43,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Product Information"; $answerOption->question_number = 10; $answerOption->next_question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 5 for Question 10 @@ -47,6 +52,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Technical Support"; $answerOption->question_number = 10; $answerOption->next_question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 6 for Question 10 @@ -55,6 +61,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Shipping Fee Calculation"; $answerOption->question_number = 10; $answerOption->next_question_number = 600; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 7 for Question 10 @@ -63,6 +70,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Error-in Measurements"; $answerOption->question_number = 10; $answerOption->next_question_number = 700; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 8 for Question 10 @@ -71,6 +79,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Contact Us"; $answerOption->question_number = 10; $answerOption->next_question_number = 800; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 1 for Question 20 @@ -78,6 +87,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 1 for Question 20"; $answerOption->value = "Option 1 for Question 20"; $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 2 for Question 20 @@ -85,6 +95,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 2 for Question 20"; $answerOption->value = "Option 2 for Question 20"; $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 1 for Question 100 @@ -92,6 +103,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 1 for Question 100"; $answerOption->value = "Option 1 for Question 100"; $answerOption->question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 2 for Question 100 @@ -99,6 +111,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 2 for Question 100"; $answerOption->value = "Option 2 for Question 100"; $answerOption->question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 1 for Question 30 @@ -106,6 +119,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 1 for Question 30"; $answerOption->value = "Option 1 for Question 30"; $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 2 for Question 30 @@ -113,6 +127,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 2 for Question 30"; $answerOption->value = "Option 2 for Question 30"; $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 3 for Question 30 @@ -120,6 +135,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 3 for Question 30"; $answerOption->value = "Option 3 for Question 30"; $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); @@ -128,6 +144,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 1 for Question 300"; $answerOption->value = "Option 1 for Question 300"; $answerOption->question_number = 300; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 2 for Question 300 @@ -135,6 +152,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 2 for Question 300"; $answerOption->value = "Option 2 for Question 300"; $answerOption->question_number = 300; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 3 for Question 300 @@ -142,6 +160,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 3 for Question 300"; $answerOption->value = "Option 3 for Question 300"; $answerOption->question_number = 300; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 1 for Question 600 @@ -150,6 +169,25 @@ class QAAnswerOptionsSeeder extends Seeder '; $answerOption->value = "Answer"; $answerOption->question_number = 600; + $answerOption->questionnaire_set_id = 1; + $answerOption->save(); + + + // Set 2 + // Option 1 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Yes"; + $answerOption->value = "Yes"; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 3; + $answerOption->save(); + + // Option 2 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "No"; + $answerOption->value = "No"; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 3; $answerOption->save(); } } diff --git a/database/seeders/QAQuestionSeeder.php b/database/seeders/QAQuestionSeeder.php index 77e482e4..6b7321f9 100644 --- a/database/seeders/QAQuestionSeeder.php +++ b/database/seeders/QAQuestionSeeder.php @@ -16,6 +16,18 @@ class QAQuestionSeeder extends Seeder 'name' => 'Set 1', 'description' => 'This is set 1 questions', ], + [ + 'name' => 'Set 2', + 'description' => 'Customer Service Satisfaction Questions', + ], + [ + 'name' => 'Set 3', + 'description' => 'Survey Before conservation with BD ends', + ], + [ + 'name' => 'Set 4', + 'description' => 'After First Order', + ], ]; foreach ($questionnaireSets as $set) { @@ -29,134 +41,182 @@ class QAQuestionSeeder extends Seeder switch ($set['name']) { case 'Set 1': $questions = [ - [ - 'question_number' => 10, - 'question_text' => 'Please select one', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'is_start' => true, - 'is_end' => false, - ], - [ - 'question_number' => 20, - 'question_text' => 'Question text for question number 20?', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 30, - 'question_text' => 'Question text for question number 30?', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'next_nested_question' => 300, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 40, - 'question_text' => 'What is your name?', - 'question_type' => QAType::FREE_TEXT, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 50, - 'question_text' => 'The End', - 'question_type' => QAType::ANSWER, - 'is_start' => false, - 'is_end' => true, - ], - [ - 'question_number' => 60, - 'question_text' => 'We have received your request and will response as soon as possible.', - 'question_type' => QAType::TICKET_CRM, - 'is_start' => false, - 'is_end' => true, - ], - [ - 'question_number' => 100, - 'question_text' => 'Question text for question number 100?', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'next_nested_question' => 110, //200 //3 digits - first level - 'next_main_question' => 20, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 110, - 'question_text' => 'Question text for question number 110?', - 'question_type' => QAType::FREE_TEXT, - 'next_nested_question' => 1000, //1000 //4 digits - second level - 'next_main_question' => 20, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 300, - 'question_text' => 'Question text for question number 300?', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'next_main_question' => 40, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 600, - 'question_text' => 'Shipping Fee Calculations', - 'question_type' => QAType::ANSWER, - 'is_start' => false, - 'is_end' => true, - ], - [ - 'question_number' => 700, - 'question_text' => 'Please enter your measurements', - 'question_type' => QAType::FREE_TEXT, - 'next_nested_question' => 710, - 'next_main_question' => 20, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 710, - 'question_text' => 'Please upload the photo proof', - 'question_type' => QAType::DOCUMENT_UPLOAD, - 'next_main_question' => 60, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 800, - 'question_text' => 'What is your name?', - 'question_type' => QAType::FREE_TEXT, - 'next_nested_question' => 810, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 810, - 'question_text' => 'Click Next to speak to our customer service', - 'question_type' => QAType::FREE_TEXT, - 'is_start' => false, - 'is_end' => true, - 'end_text' => 'We have received your request and will response as soon as possible.', - ], - [ - 'question_number' => 1000, - 'question_text' => 'Question text for question number 1000?', - 'question_type' => QAType::FREE_TEXT, - 'next_nested_question' => 10000, //10000 - 5 digits - 3rd level - 'next_main_question' => 20, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 10000, - 'question_text' => 'Question text for question number 10000?', - 'question_type' => QAType::FREE_TEXT, - 'next_main_question' => 20, - 'is_start' => false, - 'is_end' => false, - ], - ]; - break; + [ + 'question_number' => 10, + 'question_text' => 'Please select one', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => true, + 'is_end' => false, + ], + [ + 'question_number' => 20, + 'question_text' => 'Question text for question number 20?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 30, + 'question_text' => 'Question text for question number 30?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'next_nested_question' => 300, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 40, + 'question_text' => 'What is your name?', + 'question_type' => QAType::FREE_TEXT, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 50, + 'question_text' => 'The End', + 'question_type' => QAType::ANSWER, + 'is_start' => false, + 'is_end' => true, + ], + [ + 'question_number' => 60, + 'question_text' => 'We have received your request and will response as soon as possible.', + 'question_type' => QAType::TICKET_CRM, + 'is_start' => false, + 'is_end' => true, + ], + [ + 'question_number' => 100, + 'question_text' => 'Question text for question number 100?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'next_nested_question' => 110, //200 //3 digits - first level + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 110, + 'question_text' => 'Question text for question number 110?', + 'question_type' => QAType::FREE_TEXT, + 'next_nested_question' => 1000, //1000 //4 digits - second level + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 300, + 'question_text' => 'Question text for question number 300?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'next_main_question' => 40, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 600, + 'question_text' => 'Shipping Fee Calculations', + 'question_type' => QAType::ANSWER, + 'is_start' => false, + 'is_end' => true, + ], + [ + 'question_number' => 700, + 'question_text' => 'Please enter your measurements', + 'question_type' => QAType::FREE_TEXT, + 'next_nested_question' => 710, + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 710, + 'question_text' => 'Please upload the photo proof', + 'question_type' => QAType::DOCUMENT_UPLOAD, + 'next_main_question' => 60, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 800, + 'question_text' => 'What is your name?', + 'question_type' => QAType::FREE_TEXT, + 'next_nested_question' => 810, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 810, + 'question_text' => 'Click Next to speak to our customer service', + 'question_type' => QAType::FREE_TEXT, + 'is_start' => false, + 'is_end' => true, + 'end_text' => 'We have received your request and will response as soon as possible.', + ], + [ + 'question_number' => 1000, + 'question_text' => 'Question text for question number 1000?', + 'question_type' => QAType::FREE_TEXT, + 'next_nested_question' => 10000, //10000 - 5 digits - 3rd level + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 10000, + 'question_text' => 'Question text for question number 10000?', + 'question_type' => QAType::FREE_TEXT, + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + + ]; + break; + case 'Set 2': + $questions = [ + [ + 'question_number' => 10, + 'question_text' => 'How helpful is our agent towards resolving your issue?', + 'question_type' => QAType::RATING_5_STARS, + 'is_start' => true, + 'is_end' => false, + ], + [ + 'question_number' => 20, + 'question_text' => 'How would you rate our customer service experience?', + 'question_type' => QAType::RATING_5_STARS, + 'is_start' => false, + 'is_end' => true, + ] + ]; + break; + case 'Set 3': + $questions = [ + [ + 'question_number' => 10, + 'question_text' => 'Is our service suite for you?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => true, + 'is_end' => false, + ], + [ + 'question_number' => 20, + 'question_text' => 'Can you rate our sales agent performance whether you comfortable when chatting with them', + 'question_type' => QAType::RATING_5_STARS, + 'is_start' => false, + 'is_end' => true, + ] + ]; + break; + case 'Set 4': + $questions = [ + [ + 'question_number' => 10, + 'question_text' => 'How satisfy you are after your first order?', + 'question_type' => QAType::RATING_5_STARS, + 'is_start' => true, + 'is_end' => false, + ] + ]; + break; } foreach ($questions as $key => $questionData) { diff --git a/resources/assets/vue/components/feedback/elements/QuestionAnswerComponent.vue b/resources/assets/vue/components/feedback/elements/QuestionAnswerComponent.vue new file mode 100644 index 00000000..14b42e1c --- /dev/null +++ b/resources/assets/vue/components/feedback/elements/QuestionAnswerComponent.vue @@ -0,0 +1,17 @@ + + diff --git a/resources/assets/vue/components/feedback/forms/FeedbackFormComponent.vue b/resources/assets/vue/components/feedback/forms/FeedbackFormComponent.vue new file mode 100644 index 00000000..81862891 --- /dev/null +++ b/resources/assets/vue/components/feedback/forms/FeedbackFormComponent.vue @@ -0,0 +1,170 @@ + + + diff --git a/resources/assets/vue/components/feedback/forms/GenerateFeedbackLinkFormComponent.vue b/resources/assets/vue/components/feedback/forms/GenerateFeedbackLinkFormComponent.vue new file mode 100644 index 00000000..1cd7f23a --- /dev/null +++ b/resources/assets/vue/components/feedback/forms/GenerateFeedbackLinkFormComponent.vue @@ -0,0 +1,99 @@ + + diff --git a/resources/assets/vue/components/feedback/sections/AdminFeedbackCustomerSectionComponent.vue b/resources/assets/vue/components/feedback/sections/AdminFeedbackCustomerSectionComponent.vue new file mode 100644 index 00000000..1466305f --- /dev/null +++ b/resources/assets/vue/components/feedback/sections/AdminFeedbackCustomerSectionComponent.vue @@ -0,0 +1,12 @@ + + diff --git a/resources/assets/vue/components/feedback/sections/FeedbackCustomerSectionComponent.vue b/resources/assets/vue/components/feedback/sections/FeedbackCustomerSectionComponent.vue new file mode 100644 index 00000000..4030081a --- /dev/null +++ b/resources/assets/vue/components/feedback/sections/FeedbackCustomerSectionComponent.vue @@ -0,0 +1,53 @@ + + diff --git a/resources/assets/vue/components/general/forms/HelpMenuFormComponent.vue b/resources/assets/vue/components/general/forms/HelpMenuFormComponent.vue index 003a980d..bef90475 100644 --- a/resources/assets/vue/components/general/forms/HelpMenuFormComponent.vue +++ b/resources/assets/vue/components/general/forms/HelpMenuFormComponent.vue @@ -66,7 +66,7 @@
Cancel
-
{{ data.remarks.length > 0 ? 'Edit' : (question.is_end === 0 ? 'Next' : 'Finish') }}
+
{{ question.is_end === 0 ? 'Next' : 'Finish' }}
@@ -123,7 +123,7 @@ watch: { pendingQueue(inComplete, oldValue){ if(inComplete){ - this.fetchCompany(); + this.fetchFirstQuestion(); } } }, @@ -131,8 +131,7 @@ this.$store.dispatch('updateListQueue', {'name': this.section}); }, methods: { - fetchCompany(){ - this.isLoading = true; + fetchFirstQuestion(){ this.submit(route('api.helpmenu.first.question'), 'get', this.section, false, false); }, successHandler(response){ @@ -169,7 +168,7 @@ { this.closeModal(); this.reset(); - this.fetchCompany(); + this.fetchFirstQuestion(); } else{ if(this.question.is_end){ @@ -189,7 +188,7 @@ $crisp.push(["do", "message:send", ["text", "Hello there!"]]); this.closeModal(); this.reset(); - this.fetchCompany(); + this.fetchFirstQuestion(); } } else{ @@ -206,7 +205,6 @@ }, reset() { this.parameters = null; - this.isLoading = false; this.answer = ''; this.answerId = 0; this.files = []; diff --git a/resources/assets/vue/general/mixins/guards.js b/resources/assets/vue/general/mixins/guards.js index 168d7d56..9c9245e3 100644 --- a/resources/assets/vue/general/mixins/guards.js +++ b/resources/assets/vue/general/mixins/guards.js @@ -1,7 +1,11 @@ export default { methods: { routesGuard(){ - (!this.$store.getters.isAuthenticated && this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = window.location.href.indexOf(this.route('last_mile_delivery.login')) === 0 ? this.route('last_mile_delivery.login') : this.route('login') : ''; + if(!this.$store.getters.isAuthenticated && this.isProtectedRoute()&& this.isWithTokenRoute()){ + if(window.location.href.indexOf(this.route('feedback.customer')) !== 0){ + window.location.href = window.location.href.indexOf(this.route('last_mile_delivery.login')) === 0 ? this.route('last_mile_delivery.login') : this.route('login') + } + } (this.$store.getters.isAuthenticated && !this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = [7, 8].includes(this.$store.getters.getCompanyModuleType) ? this.route('last_mile_delivery.dashboard') : this.route('dashboard') : ''; }, isProtectedRoute(){ @@ -17,4 +21,4 @@ export default { } } -} \ No newline at end of file +} diff --git a/resources/views/layouts/base_no_login.blade.php b/resources/views/layouts/base_no_login.blade.php new file mode 100644 index 00000000..28150c4f --- /dev/null +++ b/resources/views/layouts/base_no_login.blade.php @@ -0,0 +1,25 @@ +@extends('layouts.base') + +@section('content') +
+
+
+
+
+
+
+
+
+
+ @yield('inner_content') +
+
+
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/pages/feedback.blade.php b/resources/views/pages/feedback.blade.php new file mode 100644 index 00000000..d1b4c6e1 --- /dev/null +++ b/resources/views/pages/feedback.blade.php @@ -0,0 +1,39 @@ +@extends('layouts.base_portal') +@section('inner_content') +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
Question Set
+
Question Text
+
Answer
+
Source System
+
Source Marking
+
Source Email
+
Created Date
+
+
+
+ + + +
+
+
+
+
+
+@endsection diff --git a/resources/views/pages/feedback/customer.blade.php b/resources/views/pages/feedback/customer.blade.php new file mode 100644 index 00000000..5decb580 --- /dev/null +++ b/resources/views/pages/feedback/customer.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.base_no_login') +@section('inner_content') + +@endsection diff --git a/resources/views/partials/menu.blade.php b/resources/views/partials/menu.blade.php index a5842672..791fc3ea 100644 --- a/resources/views/partials/menu.blade.php +++ b/resources/views/partials/menu.blade.php @@ -152,7 +152,7 @@ + style=" fill:#000000;">
Payment And Billing
@@ -163,7 +163,7 @@ + style=" fill:#000000;">
Payment And Billing
@@ -188,6 +188,17 @@
Settings
+
+
+ +
+
+
Feedback
+
+
diff --git a/routes/api.php b/routes/api.php index 9396c38e..873d648c 100644 --- a/routes/api.php +++ b/routes/api.php @@ -24,12 +24,14 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function require __DIR__ . '/delivery.php'; + require __DIR__ . '/feedback.php'; + Route::group(['middleware' => 'valid.token'], function () { Route::get('/storage/{fileName}/fetch', 'Documents\RenderDocumentController@fileStorageServe')->where(['fileName' => '.*'])->name('storage.document.file'); Route::post('online_payment/callback', 'Billplz\CallbackBillplzController@callback')->name('online_payment.callback'); - + Route::post('/import/update-debtor/f614e339d7058904a831aad742e24d55', 'Imports\ImportUpdateDebtorController@import')->name('debtor.import'); require __DIR__ . '/company.php'; @@ -63,7 +65,7 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function require __DIR__ . '/report.php'; require __DIR__ . '/wallet.php'; - + require __DIR__ . '/contact.php'; require __DIR__ . '/help_menu.php'; diff --git a/routes/feedback.php b/routes/feedback.php new file mode 100644 index 00000000..ffd5c4a3 --- /dev/null +++ b/routes/feedback.php @@ -0,0 +1,8 @@ + 'feedback', 'as' => 'feedback.', 'namespace' => 'HelpMenu'], function () { + Route::post('/list', 'ListHelpMenuQuestionsController@list')->name('list.question'); + Route::post('/submit', 'SubmitQAQuestionsController@submit')->name('submit.questions'); +}); diff --git a/routes/help_menu.php b/routes/help_menu.php index a20c2693..60cd4150 100644 --- a/routes/help_menu.php +++ b/routes/help_menu.php @@ -5,4 +5,6 @@ use Illuminate\Support\Facades\Route; Route::group(['prefix' => 'helpmenu', 'as' => 'helpmenu.', 'namespace' => 'HelpMenu'], function () { Route::get('/question', 'FetchHelpMenuQuestionController@fetch')->name('first.question'); Route::post('/question', 'UpdateHelpMenuNextQuestionController@fetch')->name('next.question'); + Route::post('/generate', 'GenerateFeedbackUrlController@generate')->name('feedback.url.generate'); + Route::get('/list', 'ListQAController@list')->name('list.questions.answers'); }); diff --git a/routes/web.php b/routes/web.php index 52a0146e..d9a320ee 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1189,4 +1189,11 @@ Route::get('/duplicate-package-clean-up', function(){ }); +Route::get('/feedback/{token}', function ($token) { + return view('pages.feedback.customer', ['token' => $token]); +})->name('feedback.customer'); + +Route::get('/feedback', function () { + return view('pages.feedback'); +})->name('admin.feedback'); From 0cdff7c5442403e1036596ba7df4e604f9dd0c68 Mon Sep 17 00:00:00 2001 From: Dillon Date: Thu, 21 Sep 2023 08:04:33 +0800 Subject: [PATCH 04/55] Fix a problem customer marking cannot be found --- app/Http/Resources/HelpMenuQuestionsAnswersResource.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Http/Resources/HelpMenuQuestionsAnswersResource.php b/app/Http/Resources/HelpMenuQuestionsAnswersResource.php index 8dc59fa0..41542444 100644 --- a/app/Http/Resources/HelpMenuQuestionsAnswersResource.php +++ b/app/Http/Resources/HelpMenuQuestionsAnswersResource.php @@ -21,8 +21,10 @@ class HelpMenuQuestionsAnswersResource extends JsonResource $source = new HelpMenuUserSourceResource($this->userSource); $user = $this->source_id === 0 ? new UserResource($this->user) : null; + $user_marking = ''; if($user){ - $user_marking = $user->companyModule()->first()->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference; + $companyModule = $user->companyModule()->first(); + $user_marking = $companyModule ? $companyModule->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference : ""; } return [ From 90b85c0df1eb8e970cbff70bcd2ca34cc4142b74 Mon Sep 17 00:00:00 2001 From: Dillon Date: Thu, 21 Sep 2023 20:16:22 +0800 Subject: [PATCH 05/55] Rename --- .../FetchHelpMenuQuestionLogic.php | 14 +++--- .../SubmitQAQuestionsLogic.php | 14 +++--- .../UpdateHelpMenuNextQuestionLogic.php | 50 +++++++++---------- ...cessor.php => DeleteAnswerQAProcessor.php} | 4 +- ....php => FetchFirstQuestionQAProcessor.php} | 4 +- ...r.php => FetchNextQuestionQAProcessor.php} | 4 +- ...rProcessor.php => SaveAnswerProcessor.php} | 4 +- 7 files changed, 47 insertions(+), 47 deletions(-) rename app/Classes/Modules/HelpMenu/Processors/{DeleteHelpMenuAnswerProcessor.php => DeleteAnswerQAProcessor.php} (95%) rename app/Classes/Modules/HelpMenu/Processors/{FetchFirstHelpMenuQuestionProcessor.php => FetchFirstQuestionQAProcessor.php} (89%) rename app/Classes/Modules/HelpMenu/Processors/{FetchNextHelpMenuQuestionProcessor.php => FetchNextQuestionQAProcessor.php} (97%) rename app/Classes/Modules/HelpMenu/Processors/{SaveHelpMenuAnswerProcessor.php => SaveAnswerProcessor.php} (96%) diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php index 90673bda..207dad2c 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php @@ -5,7 +5,7 @@ namespace App\Classes\Modules\HelpMenu\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\HelpMenu\Standards\Rules\CanFetchHelpMenuQuestion; -use App\Classes\Modules\HelpMenu\Processors\FetchFirstHelpMenuQuestionProcessor; +use App\Classes\Modules\HelpMenu\Processors\FetchFirstQuestionQAProcessor; use App\Http\Resources\HelpMenuQuestionResource; use ErrorException; use Illuminate\Http\JsonResponse; @@ -28,18 +28,18 @@ class FetchHelpMenuQuestionLogic extends AbstractControllerLogic /** @var CanFetchHelpMenuQuestion */ private $canFetchHelpMenuQuestion; - /** @var FetchFirstHelpMenuQuestionProcessor */ - private $fetchFirstHelpMenuQuestionProcessor; + /** @var FetchFirstQuestionQAProcessor */ + private $fetchFirstQuestionQAProcessor; /** * FetchHelpMenuQuestionLogic constructor. * @param CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion - * @param FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor + * @param FetchFirstQuestionQAProcessor $fetchFirstQuestionQAProcessor */ - public function __construct(CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion, FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor) + public function __construct(CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion, FetchFirstQuestionQAProcessor $fetchFirstQuestionQAProcessor) { $this->canFetchHelpMenuQuestion = $canFetchHelpMenuQuestion; - $this->fetchFirstHelpMenuQuestionProcessor = $fetchFirstHelpMenuQuestionProcessor; + $this->fetchFirstQuestionQAProcessor = $fetchFirstQuestionQAProcessor; } @@ -54,7 +54,7 @@ class FetchHelpMenuQuestionLogic extends AbstractControllerLogic $userId = Auth::user()->id; - $query = $this->fetchFirstHelpMenuQuestionProcessor->execute($request); + $query = $this->fetchFirstQuestionQAProcessor->execute($request); return $this->resourceResponse(new HelpMenuQuestionResource($query, $userId)); } diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php index 977ebc84..c46532c8 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php @@ -3,7 +3,7 @@ namespace App\Classes\Modules\HelpMenu\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; -use App\Classes\Modules\HelpMenu\Processors\SaveHelpMenuAnswerProcessor; +use App\Classes\Modules\HelpMenu\Processors\SaveAnswerProcessor; use App\Classes\Modules\HelpMenu\Processors\UserSourceForQAProcessor; use ErrorException; use Illuminate\Http\JsonResponse; @@ -24,20 +24,20 @@ class SubmitQAQuestionsLogic extends AbstractControllerLogic ]; } - /** @var SaveHelpMenuAnswerProcessor */ - private $saveHelpMenuAnswerProcessor; + /** @var SaveAnswerProcessor */ + private $saveAnswerProcessor; /** @var UserSourceForQAProcessor */ private $userSourceForQAProcessor; /** * SubmitQAQuestionsLogic constructor. - * @param SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor + * @param SaveAnswerProcessor $saveAnswerProcessor * @param UserSourceForQAProcessor $userSourceForQAProcessor */ - public function __construct(SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor, UserSourceForQAProcessor $userSourceForQAProcessor) + public function __construct(SaveAnswerProcessor $saveAnswerProcessor, UserSourceForQAProcessor $userSourceForQAProcessor) { - $this->saveHelpMenuAnswerProcessor = $saveHelpMenuAnswerProcessor; + $this->saveAnswerProcessor = $saveAnswerProcessor; $this->userSourceForQAProcessor = $userSourceForQAProcessor; } @@ -71,7 +71,7 @@ class SubmitQAQuestionsLogic extends AbstractControllerLogic $answers = $request->input('answers'); foreach ($answers as $answer) { $filesUpload = $request->input('files'); - $this->saveHelpMenuAnswerProcessor->execute($userId, $sourceId, $answer['questionId'], $answer['answer'], $answer['answerId'], $filesUpload); + $this->saveAnswerProcessor->execute($userId, $sourceId, $answer['questionId'], $answer['answer'], $answer['answerId'], $filesUpload); } $response = ['message' => 'Thank you for your feedback.']; diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php index b01a7235..4516ba97 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php @@ -6,10 +6,10 @@ use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMSupportTicket; use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMCustomer; use App\Classes\Modules\HelpMenu\Standards\Rules\CanFetchHelpMenuQuestion; -use App\Classes\Modules\HelpMenu\Processors\SaveHelpMenuAnswerProcessor; -use App\Classes\Modules\HelpMenu\Processors\DeleteHelpMenuAnswerProcessor; -use App\Classes\Modules\HelpMenu\Processors\FetchNextHelpMenuQuestionProcessor; -use App\Classes\Modules\HelpMenu\Processors\FetchFirstHelpMenuQuestionProcessor; +use App\Classes\Modules\HelpMenu\Processors\SaveAnswerProcessor; +use App\Classes\Modules\HelpMenu\Processors\DeleteAnswerQAProcessor; +use App\Classes\Modules\HelpMenu\Processors\FetchNextQuestionQAProcessor; +use App\Classes\Modules\HelpMenu\Processors\FetchFirstQuestionQAProcessor; use App\Http\Resources\HelpMenuQuestionResource; use ErrorException; use Illuminate\Http\JsonResponse; @@ -34,17 +34,17 @@ class UpdateHelpMenuNextQuestionLogic extends AbstractControllerLogic /** @var CanFetchHelpMenuQuestion */ private $canFetchHelpMenuQuestion; - /** @var SaveHelpMenuAnswerProcessor */ - private $saveHelpMenuAnswerProcessor; + /** @var SaveAnswerProcessor */ + private $saveAnswerProcessor; - /** @var DeleteHelpMenuAnswerProcessor */ - private $deleteHelpMenuAnswerProcessor; + /** @var DeleteAnswerQAProcessor */ + private $deleteAnswerQAProcessor; - /** @var FetchNextHelpMenuQuestionProcessor */ - private $fetchNextHelpMenuQuestionProcessor; + /** @var FetchNextQuestionQAProcessor */ + private $fetchNextQuestionQAProcessor; - /** @var FetchFirstHelpMenuQuestionProcessor */ - private $fetchFirstHelpMenuQuestionProcessor; + /** @var FetchFirstQuestionQAProcessor */ + private $fetchFirstQuestionQAProcessor; /** @var CreatesPerfexCRMSupportTicket */ private $createsPerfexCRMSupportTicket; @@ -55,20 +55,20 @@ class UpdateHelpMenuNextQuestionLogic extends AbstractControllerLogic /** * UpdateHelpMenuNextQuestionLogic constructor. * @param CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion - * @param SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor - * @param FetchNextHelpMenuQuestionProcessor $fetchNextHelpMenuQuestionProcessor - * @param FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor - * @param DeleteHelpMenuAnswerProcessor $deleteHelpMenuAnswerProcessor + * @param SaveAnswerProcessor $saveAnswerProcessor + * @param FetchNextQuestionQAProcessor $fetchNextQuestionQAProcessor + * @param FetchFirstQuestionQAProcessor $fetchFirstQuestionQAProcessor + * @param DeleteAnswerQAProcessor $deleteAnswerQAProcessor */ - public function __construct(CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion, SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor, FetchNextHelpMenuQuestionProcessor $fetchNextHelpMenuQuestionProcessor, FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor, CreatesPerfexCRMSupportTicket $createsPerfexCRMSupportTicket, FetchesPerfexCRMCustomer $fetchesPerfexCRMCustomer, DeleteHelpMenuAnswerProcessor $deleteHelpMenuAnswerProcessor) + public function __construct(CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion, SaveAnswerProcessor $saveAnswerProcessor, FetchNextQuestionQAProcessor $fetchNextQuestionQAProcessor, FetchFirstQuestionQAProcessor $fetchFirstQuestionQAProcessor, CreatesPerfexCRMSupportTicket $createsPerfexCRMSupportTicket, FetchesPerfexCRMCustomer $fetchesPerfexCRMCustomer, DeleteAnswerQAProcessor $deleteAnswerQAProcessor) { $this->canFetchHelpMenuQuestion = $canFetchHelpMenuQuestion; - $this->saveHelpMenuAnswerProcessor = $saveHelpMenuAnswerProcessor; - $this->fetchNextHelpMenuQuestionProcessor = $fetchNextHelpMenuQuestionProcessor; - $this->fetchFirstHelpMenuQuestionProcessor = $fetchFirstHelpMenuQuestionProcessor; + $this->saveAnswerProcessor = $saveAnswerProcessor; + $this->fetchNextQuestionQAProcessor = $fetchNextQuestionQAProcessor; + $this->fetchFirstQuestionQAProcessor = $fetchFirstQuestionQAProcessor; $this->createsPerfexCRMSupportTicket = $createsPerfexCRMSupportTicket; $this->fetchesPerfexCRMCustomer = $fetchesPerfexCRMCustomer; - $this->deleteHelpMenuAnswerProcessor = $deleteHelpMenuAnswerProcessor; + $this->deleteAnswerQAProcessor = $deleteAnswerQAProcessor; } @@ -88,7 +88,7 @@ class UpdateHelpMenuNextQuestionLogic extends AbstractControllerLogic $this->canFetchHelpMenuQuestion->passes(); //Delete answer - $this->deleteHelpMenuAnswerProcessor->execute($userId, $questionId, $request); + $this->deleteAnswerQAProcessor->execute($userId, $questionId, $request); //Save answer given by user if (!$request->has('isPrevious')) { @@ -98,7 +98,7 @@ class UpdateHelpMenuNextQuestionLogic extends AbstractControllerLogic $answerOptionId = intval($request->answerObj['id']); } $answerInText = $request->answer; - $this->saveHelpMenuAnswerProcessor->execute($userId, 0, $questionId, $answerInText, $answerOptionId, $filesUpload); + $this->saveAnswerProcessor->execute($userId, 0, $questionId, $answerInText, $answerOptionId, $filesUpload); } //Create ticket at crm @@ -119,10 +119,10 @@ class UpdateHelpMenuNextQuestionLogic extends AbstractControllerLogic } //Get returned question (previous or next) - $returnQuestion = $this->fetchNextHelpMenuQuestionProcessor->execute($request); + $returnQuestion = $this->fetchNextQuestionQAProcessor->execute($request); //When a questionnaire ended, return back the first question if(is_null($returnQuestion)){ - $returnQuestion = $this->fetchFirstHelpMenuQuestionProcessor->execute($request); + $returnQuestion = $this->fetchFirstQuestionQAProcessor->execute($request); } return $this->resourceResponse(new HelpMenuQuestionResource($returnQuestion, $userId)); diff --git a/app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php b/app/Classes/Modules/HelpMenu/Processors/DeleteAnswerQAProcessor.php similarity index 95% rename from app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php rename to app/Classes/Modules/HelpMenu/Processors/DeleteAnswerQAProcessor.php index 2ba8b928..ff0b9c1f 100644 --- a/app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php +++ b/app/Classes/Modules/HelpMenu/Processors/DeleteAnswerQAProcessor.php @@ -6,7 +6,7 @@ use App\Models\QAUserAnswerSelected; use App\Classes\Modules\HelpMenu\Services\FetchesHelpMenuUserAnswerSelected; use App\Classes\Modules\HelpMenu\Services\ListsHelpMenuUserAnswerSelected; -class DeleteHelpMenuAnswerProcessor +class DeleteAnswerQAProcessor { /** @var FetchesHelpMenuUserAnswerSelected */ private $fetchesHelpMenuUserAnswerSelected; @@ -15,7 +15,7 @@ class DeleteHelpMenuAnswerProcessor private $listsHelpMenuUserAnswerSelected; /** - * DeleteHelpMenuAnswerProcessor constructor. + * DeleteAnswerQAProcessor constructor. * @param FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected * @param ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected */ diff --git a/app/Classes/Modules/HelpMenu/Processors/FetchFirstHelpMenuQuestionProcessor.php b/app/Classes/Modules/HelpMenu/Processors/FetchFirstQuestionQAProcessor.php similarity index 89% rename from app/Classes/Modules/HelpMenu/Processors/FetchFirstHelpMenuQuestionProcessor.php rename to app/Classes/Modules/HelpMenu/Processors/FetchFirstQuestionQAProcessor.php index 45c66ee4..9f463418 100644 --- a/app/Classes/Modules/HelpMenu/Processors/FetchFirstHelpMenuQuestionProcessor.php +++ b/app/Classes/Modules/HelpMenu/Processors/FetchFirstQuestionQAProcessor.php @@ -7,13 +7,13 @@ use ErrorException; use Illuminate\Http\Request; -class FetchFirstHelpMenuQuestionProcessor +class FetchFirstQuestionQAProcessor { /** @var FetchesHelpMenuQuestion */ private $fetchesHelpMenuQuestion; /** - * FetchFirstHelpMenuQuestionProcessor constructor. + * FetchFirstQuestionQAProcessor constructor. * @param FetchesHelpMenuQuestion $fetchesHelpMenuQuestion */ public function __construct(FetchesHelpMenuQuestion $fetchesHelpMenuQuestion) diff --git a/app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php b/app/Classes/Modules/HelpMenu/Processors/FetchNextQuestionQAProcessor.php similarity index 97% rename from app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php rename to app/Classes/Modules/HelpMenu/Processors/FetchNextQuestionQAProcessor.php index f832c280..d9fc9a0a 100644 --- a/app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php +++ b/app/Classes/Modules/HelpMenu/Processors/FetchNextQuestionQAProcessor.php @@ -9,7 +9,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Classes\ValueObjects\Constants\QAType; -class FetchNextHelpMenuQuestionProcessor +class FetchNextQuestionQAProcessor { /** @var FetchesHelpMenuQuestion */ private $fetchesHelpMenuQuestion; @@ -20,7 +20,7 @@ class FetchNextHelpMenuQuestionProcessor /** @var ListsHelpMenuUserAnswerSelected */ private $listsHelpMenuUserAnswerSelected; /** - * FetchNextHelpMenuQuestionProcessor constructor. + * FetchNextQuestionQAProcessor constructor. * @param FetchesHelpMenuQuestion $fetchesHelpMenuQuestion * @param FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected * @param ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected diff --git a/app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php b/app/Classes/Modules/HelpMenu/Processors/SaveAnswerProcessor.php similarity index 96% rename from app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php rename to app/Classes/Modules/HelpMenu/Processors/SaveAnswerProcessor.php index 23a5c34f..5830bc0f 100644 --- a/app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php +++ b/app/Classes/Modules/HelpMenu/Processors/SaveAnswerProcessor.php @@ -7,7 +7,7 @@ use App\Classes\Modules\HelpMenu\Services\FetchesHelpMenuUserAnswerSelected; use App\Classes\Modules\Documents\Processors\UploadDocumentForHelpMenuProcessor; -class SaveHelpMenuAnswerProcessor +class SaveAnswerProcessor { /** @var FetchesHelpMenuUserAnswerSelected */ private $fetchesHelpMenuUserAnswerSelected; @@ -16,7 +16,7 @@ class SaveHelpMenuAnswerProcessor private $uploadDocumentForHelpMenuProcessor; /** - * SaveHelpMenuAnswerProcessor constructor. + * SaveAnswerProcessor constructor. * @param FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected * @param UploadDocumentForHelpMenuProcessor $uploadDocumentForHelpMenuProcessor */ From fe67cc6c5b1a88362b641a5a06120d669245e55c Mon Sep 17 00:00:00 2001 From: Dillon Date: Thu, 21 Sep 2023 20:35:14 +0800 Subject: [PATCH 06/55] Rename --- ...tionLogic.php => FetchQuestionQALogic.php} | 4 ++-- ...ic.php => ListQuestionsAnswersQALogic.php} | 4 ++-- ...ionsLogic.php => ListQuestionsQALogic.php} | 4 ++-- ...ogic.php => UpdateNextQuestionQALogic.php} | 4 ++-- .../FetchHelpMenuQuestionController.php | 20 ------------------- .../HelpMenu/FetchQuestionQAController.php | 20 +++++++++++++++++++ .../ListHelpMenuQuestionsController.php | 19 ------------------ .../ListQuestionsAnswersQAController.php | 20 +++++++++++++++++++ ...ller.php => ListQuestionsQAController.php} | 9 ++++----- ...php => UpdateNextQuestionQAController.php} | 6 +++--- routes/feedback.php | 2 +- routes/help_menu.php | 6 +++--- 12 files changed, 59 insertions(+), 59 deletions(-) rename app/Classes/Modules/HelpMenu/ControllersLogic/{FetchHelpMenuQuestionLogic.php => FetchQuestionQALogic.php} (94%) rename app/Classes/Modules/HelpMenu/ControllersLogic/{ListQALogic.php => ListQuestionsAnswersQALogic.php} (94%) rename app/Classes/Modules/HelpMenu/ControllersLogic/{ListHelpMenuQuestionsLogic.php => ListQuestionsQALogic.php} (95%) rename app/Classes/Modules/HelpMenu/ControllersLogic/{UpdateHelpMenuNextQuestionLogic.php => UpdateNextQuestionQALogic.php} (97%) delete mode 100644 app/Http/Controllers/HelpMenu/FetchHelpMenuQuestionController.php create mode 100644 app/Http/Controllers/HelpMenu/FetchQuestionQAController.php delete mode 100644 app/Http/Controllers/HelpMenu/ListHelpMenuQuestionsController.php create mode 100644 app/Http/Controllers/HelpMenu/ListQuestionsAnswersQAController.php rename app/Http/Controllers/HelpMenu/{ListQAController.php => ListQuestionsQAController.php} (50%) rename app/Http/Controllers/HelpMenu/{UpdateHelpMenuNextQuestionController.php => UpdateNextQuestionQAController.php} (55%) diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/FetchQuestionQALogic.php similarity index 94% rename from app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php rename to app/Classes/Modules/HelpMenu/ControllersLogic/FetchQuestionQALogic.php index 207dad2c..6b2f9e03 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/FetchQuestionQALogic.php @@ -12,7 +12,7 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; -class FetchHelpMenuQuestionLogic extends AbstractControllerLogic +class FetchQuestionQALogic extends AbstractControllerLogic { /** @@ -32,7 +32,7 @@ class FetchHelpMenuQuestionLogic extends AbstractControllerLogic private $fetchFirstQuestionQAProcessor; /** - * FetchHelpMenuQuestionLogic constructor. + * FetchQuestionQALogic constructor. * @param CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion * @param FetchFirstQuestionQAProcessor $fetchFirstQuestionQAProcessor */ diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/ListQALogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/ListQuestionsAnswersQALogic.php similarity index 94% rename from app/Classes/Modules/HelpMenu/ControllersLogic/ListQALogic.php rename to app/Classes/Modules/HelpMenu/ControllersLogic/ListQuestionsAnswersQALogic.php index ea99044b..4b1c0d2b 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/ListQALogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/ListQuestionsAnswersQALogic.php @@ -10,7 +10,7 @@ use App\Http\Resources\HelpMenuQuestionsAnswersResource; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -class ListQALogic extends AbstractControllerLogic +class ListQuestionsAnswersQALogic extends AbstractControllerLogic { /** @@ -30,7 +30,7 @@ class ListQALogic extends AbstractControllerLogic private $listsHelpMenuUserAnswerSelected; /** - * ListQALogic constructor. + * ListQuestionsAnswersQALogic constructor. * @param CanListHelpMenuQuestions $canListHelpMenuQuestions * @param ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected */ diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/ListHelpMenuQuestionsLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/ListQuestionsQALogic.php similarity index 95% rename from app/Classes/Modules/HelpMenu/ControllersLogic/ListHelpMenuQuestionsLogic.php rename to app/Classes/Modules/HelpMenu/ControllersLogic/ListQuestionsQALogic.php index d61b3aa7..b6ead768 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/ListHelpMenuQuestionsLogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/ListQuestionsQALogic.php @@ -12,7 +12,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Crypt; use App\Classes\Exceptions\ResourceNotFoundException; -class ListHelpMenuQuestionsLogic extends AbstractControllerLogic +class ListQuestionsQALogic extends AbstractControllerLogic { /** @@ -32,7 +32,7 @@ class ListHelpMenuQuestionsLogic extends AbstractControllerLogic private $listsHelpMenuQuestions; /** - * ListHelpMenuQuestionsLogic constructor. + * ListQuestionsQALogic constructor. * @param CanListHelpMenuQuestions $canListHelpMenuQuestions * @param ListsHelpMenuQuestions $listsHelpMenuQuestions */ diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateNextQuestionQALogic.php similarity index 97% rename from app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php rename to app/Classes/Modules/HelpMenu/ControllersLogic/UpdateNextQuestionQALogic.php index 4516ba97..99a35c6c 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateNextQuestionQALogic.php @@ -18,7 +18,7 @@ use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Auth; use App\Classes\ValueObjects\Constants\QAType; -class UpdateHelpMenuNextQuestionLogic extends AbstractControllerLogic +class UpdateNextQuestionQALogic extends AbstractControllerLogic { /** @@ -53,7 +53,7 @@ class UpdateHelpMenuNextQuestionLogic extends AbstractControllerLogic private $fetchesPerfexCRMCustomer; /** - * UpdateHelpMenuNextQuestionLogic constructor. + * UpdateNextQuestionQALogic constructor. * @param CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion * @param SaveAnswerProcessor $saveAnswerProcessor * @param FetchNextQuestionQAProcessor $fetchNextQuestionQAProcessor diff --git a/app/Http/Controllers/HelpMenu/FetchHelpMenuQuestionController.php b/app/Http/Controllers/HelpMenu/FetchHelpMenuQuestionController.php deleted file mode 100644 index 53c6f62a..00000000 --- a/app/Http/Controllers/HelpMenu/FetchHelpMenuQuestionController.php +++ /dev/null @@ -1,20 +0,0 @@ -execute($request); - } - -} diff --git a/app/Http/Controllers/HelpMenu/FetchQuestionQAController.php b/app/Http/Controllers/HelpMenu/FetchQuestionQAController.php new file mode 100644 index 00000000..22ebb169 --- /dev/null +++ b/app/Http/Controllers/HelpMenu/FetchQuestionQAController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/HelpMenu/ListHelpMenuQuestionsController.php b/app/Http/Controllers/HelpMenu/ListHelpMenuQuestionsController.php deleted file mode 100644 index 284f4386..00000000 --- a/app/Http/Controllers/HelpMenu/ListHelpMenuQuestionsController.php +++ /dev/null @@ -1,19 +0,0 @@ -execute($request); - } -} diff --git a/app/Http/Controllers/HelpMenu/ListQuestionsAnswersQAController.php b/app/Http/Controllers/HelpMenu/ListQuestionsAnswersQAController.php new file mode 100644 index 00000000..68825164 --- /dev/null +++ b/app/Http/Controllers/HelpMenu/ListQuestionsAnswersQAController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/HelpMenu/ListQAController.php b/app/Http/Controllers/HelpMenu/ListQuestionsQAController.php similarity index 50% rename from app/Http/Controllers/HelpMenu/ListQAController.php rename to app/Http/Controllers/HelpMenu/ListQuestionsQAController.php index b15dc15c..d1beced6 100644 --- a/app/Http/Controllers/HelpMenu/ListQAController.php +++ b/app/Http/Controllers/HelpMenu/ListQuestionsQAController.php @@ -2,19 +2,18 @@ namespace App\Http\Controllers\HelpMenu; -use App\Classes\Modules\HelpMenu\ControllersLogic\ListQALogic; +use App\Classes\Modules\HelpMenu\ControllersLogic\ListQuestionsQALogic; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -class ListQAController +class ListQuestionsQAController { /** * @param Request $request - * @param ListQALogic $logic + * @param ListQuestionsQALogic $logic * @return JsonResponse */ - public function list(Request $request, ListQALogic $logic): JsonResponse { + public function list(Request $request, ListQuestionsQALogic $logic): JsonResponse { return $logic->execute($request); } - } diff --git a/app/Http/Controllers/HelpMenu/UpdateHelpMenuNextQuestionController.php b/app/Http/Controllers/HelpMenu/UpdateNextQuestionQAController.php similarity index 55% rename from app/Http/Controllers/HelpMenu/UpdateHelpMenuNextQuestionController.php rename to app/Http/Controllers/HelpMenu/UpdateNextQuestionQAController.php index 929c9429..bb1d42a7 100644 --- a/app/Http/Controllers/HelpMenu/UpdateHelpMenuNextQuestionController.php +++ b/app/Http/Controllers/HelpMenu/UpdateNextQuestionQAController.php @@ -2,18 +2,18 @@ namespace App\Http\Controllers\HelpMenu; -use App\Classes\Modules\HelpMenu\ControllersLogic\UpdateHelpMenuNextQuestionLogic; +use App\Classes\Modules\HelpMenu\ControllersLogic\UpdateNextQuestionQALogic; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -class UpdateHelpMenuNextQuestionController +class UpdateNextQuestionQAController { /** * @param Request $request * @param FetchQAQuestionListLogic $logic * @return JsonResponse */ - public function fetch(Request $request, UpdateHelpMenuNextQuestionLogic $logic): JsonResponse { + public function fetch(Request $request, UpdateNextQuestionQALogic $logic): JsonResponse { return $logic->execute($request); } } diff --git a/routes/feedback.php b/routes/feedback.php index ffd5c4a3..d692889a 100644 --- a/routes/feedback.php +++ b/routes/feedback.php @@ -3,6 +3,6 @@ use Illuminate\Support\Facades\Route; Route::group(['prefix' => 'feedback', 'as' => 'feedback.', 'namespace' => 'HelpMenu'], function () { - Route::post('/list', 'ListHelpMenuQuestionsController@list')->name('list.question'); + Route::post('/list', 'ListQuestionsQAController@list')->name('list.question'); Route::post('/submit', 'SubmitQAQuestionsController@submit')->name('submit.questions'); }); diff --git a/routes/help_menu.php b/routes/help_menu.php index 60cd4150..04ce8d03 100644 --- a/routes/help_menu.php +++ b/routes/help_menu.php @@ -3,8 +3,8 @@ use Illuminate\Support\Facades\Route; Route::group(['prefix' => 'helpmenu', 'as' => 'helpmenu.', 'namespace' => 'HelpMenu'], function () { - Route::get('/question', 'FetchHelpMenuQuestionController@fetch')->name('first.question'); - Route::post('/question', 'UpdateHelpMenuNextQuestionController@fetch')->name('next.question'); + Route::get('/question', 'FetchQuestionQAController@fetch')->name('first.question'); + Route::post('/question', 'UpdateNextQuestionQAController@fetch')->name('next.question'); Route::post('/generate', 'GenerateFeedbackUrlController@generate')->name('feedback.url.generate'); - Route::get('/list', 'ListQAController@list')->name('list.questions.answers'); + Route::get('/list', 'ListQuestionsAnswersQAController@list')->name('list.questions.answers'); }); From 25417ba5bed42f4c14e4b97cd50bb1062f6a17b3 Mon Sep 17 00:00:00 2001 From: Dillon Date: Thu, 21 Sep 2023 21:31:25 +0800 Subject: [PATCH 07/55] New api for public use to get feedback url --- routes/apipub.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/routes/apipub.php b/routes/apipub.php index aecebdb3..13fbfb61 100644 --- a/routes/apipub.php +++ b/routes/apipub.php @@ -8,5 +8,9 @@ Route::group(['middleware' => 'apipub', 'prefix' => 'v1', 'as' => 'apipub.'], fu Route::get('transactions/mappable/query/with-details', 'Transactions\ListMappableTransactionWithDetailsController@list')->name('transaction.mappable.list.with_details'); Route::get('transactions/mappable/query', 'Transactions\ListMappableTransactionsController@list')->name('transaction.mappable.list'); Route::get('groups/query', 'Transactions\ListGroupsController@list')->name('group.list'); + + Route::group(['prefix' => 'feedback', 'as' => 'feedback.', 'namespace' => 'HelpMenu'], function () { + Route::post('/generate', 'GenerateFeedbackUrlController@generate')->name('feedback.url.generate'); + }); }); }); From 1dbad7d6e5349d80b2417ccfbe0478a33085eafc Mon Sep 17 00:00:00 2001 From: Dillon Date: Sat, 23 Sep 2023 16:47:58 +0800 Subject: [PATCH 08/55] Minor UI fix on navigation --- resources/views/partials/menu.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/partials/menu.blade.php b/resources/views/partials/menu.blade.php index 791fc3ea..a065866f 100644 --- a/resources/views/partials/menu.blade.php +++ b/resources/views/partials/menu.blade.php @@ -169,7 +169,7 @@
Payment And Billing
-
+
Settings
-
+
Date: Sat, 23 Sep 2023 16:53:18 +0800 Subject: [PATCH 09/55] Minor UI fix on /feedback admin page --- resources/views/pages/feedback.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/pages/feedback.blade.php b/resources/views/pages/feedback.blade.php index d1b4c6e1..e893e81b 100644 --- a/resources/views/pages/feedback.blade.php +++ b/resources/views/pages/feedback.blade.php @@ -6,7 +6,7 @@
-
+
From 707ef9d9f3766e103324e79a33e2a6209cfaee99 Mon Sep 17 00:00:00 2001 From: Dillon Date: Sat, 23 Sep 2023 17:36:46 +0800 Subject: [PATCH 10/55] Minor UI fix on /feedback admin page --- resources/views/partials/menu.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/partials/menu.blade.php b/resources/views/partials/menu.blade.php index a065866f..97991b8e 100644 --- a/resources/views/partials/menu.blade.php +++ b/resources/views/partials/menu.blade.php @@ -189,11 +189,11 @@
-
+
+ style=" fill:#000000;">
Feedback
From fe000b7a6f725fa05670fc40d6d27a7eac5772d7 Mon Sep 17 00:00:00 2001 From: Dillon Date: Sat, 23 Sep 2023 18:07:46 +0800 Subject: [PATCH 11/55] Minor UI fix on front end --- .../components/feedback/forms/FeedbackFormComponent.vue | 7 +------ .../sections/AdminFeedbackCustomerSectionComponent.vue | 1 - .../feedback/sections/FeedbackCustomerSectionComponent.vue | 1 - resources/views/partials/menu.blade.php | 2 +- 4 files changed, 2 insertions(+), 9 deletions(-) diff --git a/resources/assets/vue/components/feedback/forms/FeedbackFormComponent.vue b/resources/assets/vue/components/feedback/forms/FeedbackFormComponent.vue index 81862891..10927094 100644 --- a/resources/assets/vue/components/feedback/forms/FeedbackFormComponent.vue +++ b/resources/assets/vue/components/feedback/forms/FeedbackFormComponent.vue @@ -2,7 +2,7 @@
-
+
@@ -112,11 +112,6 @@ } } }, - computed: { - pendingQueue () { - return this.$store.getters.isInCompleteQueue(this.section); - } - }, created(){ this.$store.dispatch('updateListQueue', {'name': this.section}); }, diff --git a/resources/assets/vue/components/feedback/sections/AdminFeedbackCustomerSectionComponent.vue b/resources/assets/vue/components/feedback/sections/AdminFeedbackCustomerSectionComponent.vue index 1466305f..7b8f9106 100644 --- a/resources/assets/vue/components/feedback/sections/AdminFeedbackCustomerSectionComponent.vue +++ b/resources/assets/vue/components/feedback/sections/AdminFeedbackCustomerSectionComponent.vue @@ -1,6 +1,5 @@