diff --git a/app/Classes/Modules/Exports/Services/ExportsFeedback.php b/app/Classes/Modules/Exports/Services/ExportsFeedback.php index eec7b786..1e07a854 100644 --- a/app/Classes/Modules/Exports/Services/ExportsFeedback.php +++ b/app/Classes/Modules/Exports/Services/ExportsFeedback.php @@ -20,9 +20,11 @@ class ExportsFeedback implements FromQuery, WithHeadings, WithHeadingRow, WithMa public function headings(): array { return [ + 'Version', 'Question Set', 'Question Text', - 'Answer', + 'Answer Text', + 'Answer Value', 'Source System', 'Source Marking', 'Source Email', @@ -56,11 +58,14 @@ class ExportsFeedback implements FromQuery, WithHeadings, WithHeadingRow, WithMa $companyModule = $user->companyModule()->first(); $user_marking = $companyModule ? $companyModule->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference : ""; } + $answer = $userAnswer->answer; return [ + $userAnswer->question->questionnaire->version, $userAnswer->question->questionnaire->description, $userAnswer->question->question_text, $userAnswer->free_text_answer, + $answer->value, $user ? QASystemSourceType::getText(QASystemSourceType::IZYIM) : QASystemSourceType::getText($source->system), $user ? $user_marking : $source->marking, $user ? $user->email : $source->email, diff --git a/app/Http/Resources/HelpMenuQuestionResource.php b/app/Http/Resources/HelpMenuQuestionResource.php index e41aeb53..516c3d54 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)->where('questionnaire_set_id', $q->questionnaire_set_id)->get()), + 'question_answers' => HelpMenuAnswerOptionsResource::collection(QAAnswerOptions::where('question_number', $q->question_number)->where('questionnaire_set_id', $q->questionnaire_set_id)->orderBy('order', 'ASC')->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/HelpMenuQuestionnaireSetsResource.php b/app/Http/Resources/HelpMenuQuestionnaireSetsResource.php index 7c629a1d..d7143b99 100644 --- a/app/Http/Resources/HelpMenuQuestionnaireSetsResource.php +++ b/app/Http/Resources/HelpMenuQuestionnaireSetsResource.php @@ -18,6 +18,7 @@ class HelpMenuQuestionnaireSetsResource extends JsonResource 'name' => $this->name, 'description' => $this->description, 'group' => $this->group, + 'version' => $this->version, ]; } } diff --git a/app/Http/Resources/HelpMenuQuestionsAnswersResource.php b/app/Http/Resources/HelpMenuQuestionsAnswersResource.php index 98314a16..1136ed9b 100644 --- a/app/Http/Resources/HelpMenuQuestionsAnswersResource.php +++ b/app/Http/Resources/HelpMenuQuestionsAnswersResource.php @@ -4,6 +4,7 @@ namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; use App\Classes\ValueObjects\Constants\QASystemSourceType; +use App\Models\QAAnswerOptions; use App\Models\QAQuestions; use Carbon\Carbon; @@ -20,6 +21,7 @@ class HelpMenuQuestionsAnswersResource extends JsonResource $question = QAQuestions::where('id', $this->question_id)->first(); $source = new HelpMenuUserSourceResource($this->userSource); $user = $this->source_id === 0 ? new UserResource($this->user) : null; + $answerOption = QAAnswerOptions::where('id', $this->answer_option_id)->first(); $user_marking = ''; if($user){ @@ -32,6 +34,7 @@ class HelpMenuQuestionsAnswersResource extends JsonResource 'questionnaire' => new HelpMenuQuestionnaireSetsResource($this->question->questionnaire), 'question_text' => $question ? $question->question_text : null, 'free_text_answer' => $this->free_text_answer, + 'answer_value' => $answerOption ? $answerOption->value : null, '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, diff --git a/app/Models/QAUserAnswerSelected.php b/app/Models/QAUserAnswerSelected.php index e85296aa..5b4cf2a1 100644 --- a/app/Models/QAUserAnswerSelected.php +++ b/app/Models/QAUserAnswerSelected.php @@ -46,4 +46,13 @@ class QAUserAnswerSelected extends AbstractModel implements Documentable return $this->BelongsTo(QAQuestions::class, 'question_id', 'id'); } + + /** + * @return BelongsTo + */ + public function answer(): BelongsTo + { + return $this->BelongsTo(QAAnswerOptions::class, 'answer_option_id', 'id'); + } + } diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index ed1872de..76038b92 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -26,7 +26,12 @@ class DatabaseSeeder extends Seeder // $this->call(QAQuestionsDemoSeeder::class); //DEMO POC // $this->call(QAAnswerOptionsDemoSeeder::class); //DEMO POC + // 20230928 Set 1 to Set 3 // $this->call(QAQuestionsSeeder::class); // $this->call(QAAnswerOptionsSeeder::class); + + // 20231121 Set 4 to Set 6 + // $this->call(QAQuestions2Seeder::class); + // $this->call(QAAnswerOptions2Seeder::class); } } diff --git a/database/seeders/QAAnswerOptions2Seeder.php b/database/seeders/QAAnswerOptions2Seeder.php new file mode 100644 index 00000000..f9aafe42 --- /dev/null +++ b/database/seeders/QAAnswerOptions2Seeder.php @@ -0,0 +1,395 @@ +display_text = "Very Dissatisfied"; + $answerOption->value = "1"; + $answerOption->order = 1; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 4; + $answerOption->save(); + + // Option 2 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Dissatisfied"; + $answerOption->value = "2"; + $answerOption->order = 2; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 4; + $answerOption->save(); + + // Option 3 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Neutral"; + $answerOption->value = "3"; + $answerOption->order = 3; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 4; + $answerOption->save(); + + // Option 4 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Satisfied"; + $answerOption->value = "4"; + $answerOption->order = 4; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 4; + $answerOption->save(); + + // Option 5 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Very Satisfied"; + $answerOption->value = "5"; + $answerOption->order = 5; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 4; + $answerOption->save(); + + + + // Set 1 + // Option 1 for Question 20 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Yes"; + $answerOption->value = "3"; + $answerOption->order = 3; + $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 4; + $answerOption->save(); + + // Option 2 for Question 20 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Partially"; + $answerOption->value = "2"; + $answerOption->order = 2; + $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 4; + $answerOption->save(); + + // Option 3 for Question 20 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "No"; + $answerOption->value = "1"; + $answerOption->order = 1; + $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 4; + $answerOption->save(); + + + + // Set 1 + // Option 1 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Very Clear"; + $answerOption->value = "5"; + $answerOption->order = 5; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 4; + $answerOption->save(); + + // Option 2 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Clear"; + $answerOption->value = "4"; + $answerOption->order = 4; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 4; + $answerOption->save(); + + // Option 3 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Neutral"; + $answerOption->value = "3"; + $answerOption->order = 3; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 4; + $answerOption->save(); + + // Option 4 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Unclear"; + $answerOption->value = "2"; + $answerOption->order = 2; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 4; + $answerOption->save(); + + // Option 5 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Very Unclear"; + $answerOption->value = "1"; + $answerOption->order = 1; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 4; + $answerOption->save(); + + + + + + // Set 2 + // Option 1 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Yes"; + $answerOption->value = "3"; + $answerOption->order = 3; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 5; + $answerOption->save(); + + // Option 2 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Somewhat"; + $answerOption->value = "2"; + $answerOption->order = 2; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 5; + $answerOption->save(); + + // Option 3 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "No"; + $answerOption->value = "1"; + $answerOption->order = 1; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 5; + $answerOption->save(); + + + + // Set 2 + // Option 1 for Question 20 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Exceeded Expectations"; + $answerOption->value = "3"; + $answerOption->order = 3; + $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 5; + $answerOption->save(); + + // Option 2 for Question 20 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Met Expectations"; + $answerOption->value = "2"; + $answerOption->order = 2; + $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 5; + $answerOption->save(); + + // Option 3 for Question 20 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Below Expectations"; + $answerOption->value = "1"; + $answerOption->order = 1; + $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 5; + $answerOption->save(); + + + + // Set 2 + // Option 1 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Very Dissatisfied"; + $answerOption->value = "1"; + $answerOption->order = 1; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 5; + $answerOption->save(); + + // Option 2 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Dissatisfied"; + $answerOption->value = "2"; + $answerOption->order = 2; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 5; + $answerOption->save(); + + // Option 3 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Neutral"; + $answerOption->value = "3"; + $answerOption->order = 3; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 5; + $answerOption->save(); + + // Option 4 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Satisfied"; + $answerOption->value = "4"; + $answerOption->order = 4; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 5; + $answerOption->save(); + + // Option 5 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Very Satisfied"; + $answerOption->value = "5"; + $answerOption->order = 5; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 5; + $answerOption->save(); + + + + + + // Set 3 + // Option 1 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Immediately"; + $answerOption->value = "5"; + $answerOption->order = 5; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + // Option 2 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Within a few hours"; + $answerOption->value = "4"; + $answerOption->order = 4; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + // Option 3 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Within a day"; + $answerOption->value = "3"; + $answerOption->order = 3; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + // Option 4 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "More than a day"; + $answerOption->value = "2"; + $answerOption->order = 2; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + // Option 5 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Never received a response"; + $answerOption->value = "1"; + $answerOption->order = 1; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + + + // Set 3 + // Option 1 for Question 20 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Very Clear"; + $answerOption->value = "5"; + $answerOption->order = 5; + $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + // Option 2 for Question 20 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Clear"; + $answerOption->value = "4"; + $answerOption->order = 4; + $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + // Option 3 for Question 20 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Neutral"; + $answerOption->value = "3"; + $answerOption->order = 3; + $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + // Option 4 for Question 20 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Unclear"; + $answerOption->value = "2"; + $answerOption->order = 2; + $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + // Option 5 for Question 20 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Very Unclear"; + $answerOption->value = "1"; + $answerOption->order = 1; + $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + + + // Set 3 + // Option 1 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Very Likely"; + $answerOption->value = "5"; + $answerOption->order = 5; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + // Option 2 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Likely"; + $answerOption->value = "4"; + $answerOption->order = 4; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + // Option 3 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Neutral"; + $answerOption->value = "3"; + $answerOption->order = 3; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + // Option 4 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Unlikely"; + $answerOption->value = "2"; + $answerOption->order = 2; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + // Option 5 for Question 30 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Very Unlikely"; + $answerOption->value = "1"; + $answerOption->order = 1; + $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 6; + $answerOption->save(); + + + + } +} diff --git a/database/seeders/QAQuestions2Seeder.php b/database/seeders/QAQuestions2Seeder.php new file mode 100644 index 00000000..54e55edc --- /dev/null +++ b/database/seeders/QAQuestions2Seeder.php @@ -0,0 +1,148 @@ + 'Set 1', + 'description' => 'Customer Support Satisfaction Survey', + 'group' => 'feedback', + 'version' => 2 + ], + [ + 'name' => 'Set 2', + 'description' => 'First Order Experience Feedback', + 'group' => 'feedback', + 'version' => 2 + ], + [ + 'name' => 'Set 3', + 'description' => 'Sales Inquiry Experience', + 'group' => 'feedback', + 'version' => 2 + ], + ]; + + foreach ($questionnaireSets as $set) { + $questionnaireSet = QAQuestionnaireSet::create([ + 'name' => $set['name'], + 'description' => $set['description'], + 'group' => $set['group'], + 'version' => $set['version'], + ]); + + $questions = []; + + switch ($set['name']) { + case 'Set 1': + $questions = [ + [ + 'question_number' => 10, + 'question_text' => 'On a scale of 1 to 5, how satisfied are you with the time it took to receive a response?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => true, + 'is_end' => false, + ], + [ + 'question_number' => 20, + 'question_text' => 'Was your issue resolved during this interaction?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 30, + 'question_text' => 'How clear and understandable was the communication from the support team?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => true, + ] + ]; + break; + case 'Set 2': + $questions = [ + [ + 'question_number' => 10, + 'question_text' => 'Did you find what you were looking for without any issues?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => true, + 'is_end' => false, + ], + [ + 'question_number' => 20, + 'question_text' => 'Did the service meet your expectations?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 30, + 'question_text' => 'On a scale of 1 to 5, how satisfied are you with the delivery time?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => true, + ] + ]; + break; + case 'Set 3': + $questions = [ + [ + 'question_number' => 10, + 'question_text' => 'How quickly did our sales team respond to your inquiry?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => true, + 'is_end' => false, + ], + [ + 'question_number' => 20, + 'question_text' => 'Was the information provided by our sales team clear and easy to understand?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 30, + 'question_text' => 'After interacting with our sales team, how likely are you to use our service?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => true, + ] + ]; + 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/feedback/elements/QuestionAnswerComponent.vue b/resources/assets/vue/components/feedback/elements/QuestionAnswerComponent.vue index 1ad87455..252df086 100644 --- a/resources/assets/vue/components/feedback/elements/QuestionAnswerComponent.vue +++ b/resources/assets/vue/components/feedback/elements/QuestionAnswerComponent.vue @@ -1,8 +1,10 @@