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 = '
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.
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.
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 @@ + +