diff --git a/app/Classes/General/Eloquent/Filters/IsAdminFilter.php b/app/Classes/General/Eloquent/Filters/IsAdminFilter.php new file mode 100644 index 00000000..2cc18c03 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/IsAdminFilter.php @@ -0,0 +1,20 @@ +where('is_admin_filter', $value); + } + +} diff --git a/app/Classes/General/Eloquent/Filters/QuestionGroupIn.php b/app/Classes/General/Eloquent/Filters/QuestionGroupIn.php new file mode 100644 index 00000000..bc955ad8 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/QuestionGroupIn.php @@ -0,0 +1,21 @@ +whereHas('question', function ($query) use ($value) { + $query->whereIn('group', $value); + }); + } +} diff --git a/app/Classes/General/Eloquent/Filters/QuestionIn.php b/app/Classes/General/Eloquent/Filters/QuestionIn.php new file mode 100644 index 00000000..ad1911fb --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/QuestionIn.php @@ -0,0 +1,21 @@ +whereHas('question', function ($query) use ($value) { + $query->whereIn('question_number', $value); + }); + } +} diff --git a/app/Classes/Modules/Questionnaires/ControllersLogic/ListQuestionsAnswersLogic.php b/app/Classes/Modules/Questionnaires/ControllersLogic/ListQuestionsAnswersLogic.php index bac51604..d1912b1a 100644 --- a/app/Classes/Modules/Questionnaires/ControllersLogic/ListQuestionsAnswersLogic.php +++ b/app/Classes/Modules/Questionnaires/ControllersLogic/ListQuestionsAnswersLogic.php @@ -30,7 +30,7 @@ class ListQuestionsAnswersLogic extends AbstractControllerLogic private $listsQuestionUserAnswerSelected; /** - * ListQuestionsAnswersQALogic constructor. + * ListQuestionsAnswersLogic constructor. * @param CanListQuestions $canListQuestions * @param ListsQuestionUserAnswerSelected $listsQuestionUserAnswerSelected */ diff --git a/app/Classes/Modules/Questionnaires/ControllersLogic/ListQuestionsLogic.php b/app/Classes/Modules/Questionnaires/ControllersLogic/ListQuestionsLogic.php new file mode 100644 index 00000000..a3d7ffa1 --- /dev/null +++ b/app/Classes/Modules/Questionnaires/ControllersLogic/ListQuestionsLogic.php @@ -0,0 +1,70 @@ + 'Retrieved Questions', + 'message' => 'You have successfully retrieved a list of questions' + ]; + } + + /** @var CanListQuestions */ + private $canListQuestions; + + /** @var ListsQuestions */ + private $listsQuestions; + + /** + * ListQuestionsLogic constructor. + * @param CanListQuestions $canListQuestions + * @param ListsQuestions $listsQuestions + */ + public function __construct(CanListQuestions $canListQuestions, ListsQuestions $listsQuestions) + { + $this->canListQuestions = $canListQuestions; + $this->listsQuestions = $listsQuestions; + } + + + /** + * @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->canListQuestions->passes(); + $setId = 0; + if ($request->route('set_id')) { + $setId = $request->route('set_id'); + } + + if($setId === 0){ + $set = QAQuestionnaireSet::where('group', '1688,approve_po,fill_po')->latest('id')->first(); + $setId = $set->id; + } + + $query = $this->listsQuestions->execute(array_merge($this->listsQuestions->deserializeFilters($request->input('filters')), ['questionnaire_set_id' => $setId])); + + return $this->collectionResponse(QuestionResource::collection($query)); + } + +} diff --git a/app/Http/Controllers/Questionnaires/ListQuestionsController.php b/app/Http/Controllers/Questionnaires/ListQuestionsController.php new file mode 100644 index 00000000..3fc4d75f --- /dev/null +++ b/app/Http/Controllers/Questionnaires/ListQuestionsController.php @@ -0,0 +1,21 @@ +execute($request); + } + +} diff --git a/database/migrations/2024_12_28_142918_add_group_to_qa_questions_table.php b/database/migrations/2024_12_28_142918_add_group_to_qa_questions_table.php index 45cdc103..372874ab 100644 --- a/database/migrations/2024_12_28_142918_add_group_to_qa_questions_table.php +++ b/database/migrations/2024_12_28_142918_add_group_to_qa_questions_table.php @@ -25,7 +25,7 @@ class AddGroupToQaQuestionsTable extends Migration */ public function down() { - Schema::table('questionnaire_set_id', function (Blueprint $table) { + Schema::table('qa_questions', function (Blueprint $table) { $table->dropColumn('group'); }); } diff --git a/database/migrations/2025_02_17_105441_add_is_admin_filter_to_qa_questions_table.php b/database/migrations/2025_02_17_105441_add_is_admin_filter_to_qa_questions_table.php new file mode 100644 index 00000000..b16fb12c --- /dev/null +++ b/database/migrations/2025_02_17_105441_add_is_admin_filter_to_qa_questions_table.php @@ -0,0 +1,32 @@ +boolean('is_admin_filter')->after('url')->default(false); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('qa_questions', function (Blueprint $table) { + $table->dropColumn('is_admin_filter'); + }); + } +} diff --git a/database/seeds/QAWorkFlowSeeder.php b/database/seeds/QAWorkFlowSeeder.php index 80404e1e..6a1ad2d2 100644 --- a/database/seeds/QAWorkFlowSeeder.php +++ b/database/seeds/QAWorkFlowSeeder.php @@ -78,12 +78,13 @@ class QAWorkFlowSeeder extends Seeder 'is_start' => false, 'is_end' => false, 'answer_options' => [ - ['display_text' => 'Need TAC', 'value' => 'Need Tac', 'next_question_number' => '1688_issue_submit'], - ['display_text' => 'Wrong login details', 'value' => 'Wrong Login Details', 'next_question_number' => '1688_issue_submit'], + ['display_text' => 'Need TAC', 'value' => '1688_login_issue_need_tac', 'next_question_number' => '1688_issue_submit'], + ['display_text' => 'Wrong login details', 'value' => '1688_login_issue_wrong_login_details', 'next_question_number' => '1688_issue_submit'], ['display_text' => 'Others', 'value' => '1688_login_issue_others', 'next_question_number' => '1688_login_issue_others'], - ['display_text' => 'Order Cancelled', 'value' => '1688_refund_request', 'next_question_number' => '1688_refund_request'], + ['display_text' => 'Order Cancelled', 'value' => '1688_login_issue_refund_request', 'next_question_number' => '1688_login_issue_refund_request'], ], 'group' => '1688', + 'is_admin_filter' => true ], [ 'question_number' => '1688_login_successful', @@ -105,13 +106,14 @@ class QAWorkFlowSeeder extends Seeder 'is_start' => false, 'is_end' => false, 'answer_options' => [ - ['display_text' => 'Amount not found', 'value' => 'Amount not found', 'next_question_number' => '1688_issue_submit'], - ['display_text' => 'Plus Member', 'value' => 'Plus Member', 'next_question_number' => '1688_issue_submit'], + ['display_text' => 'Amount not found', 'value' => '1688_login_successful_cannot_verify_amount_not_found', 'next_question_number' => '1688_issue_submit'], + ['display_text' => 'Plus Member', 'value' => '1688_login_successful_cannot_verify_plus_member', 'next_question_number' => '1688_issue_submit'], ['display_text' => 'Others', 'value' => '1688_login_successful_cannot_verify_others', 'next_question_number' => '1688_login_successful_cannot_verify_others'], - ['display_text' => 'Customer did not verify 1688 account', 'value' => 'Customer did not verify 1688 account', 'next_question_number' => '1688_issue_submit'], - ['display_text' => 'WorldFirst account linked another account', 'value' => 'WorldFirst account linked another account', 'next_question_number' => '1688_issue_submit'], + ['display_text' => 'Customer did not verify 1688 account', 'value' => '1688_login_successful_cannot_verify_customer_did_not_verify_account', 'next_question_number' => '1688_issue_submit'], + ['display_text' => 'WorldFirst account linked another account', 'value' => '1688_login_successful_cannot_verify_worldfirst_account_linked_another_account', 'next_question_number' => '1688_issue_submit'], ], 'group' => '1688', + 'is_admin_filter' => true ], [ 'question_number' => '1688_login_successful_cannot_verify_others', @@ -121,6 +123,7 @@ class QAWorkFlowSeeder extends Seeder 'is_start' => false, 'is_end' => false, 'group' => '1688', + 'is_admin_filter' => true ], [ 'question_number' => '1688_order_verify', @@ -168,13 +171,14 @@ class QAWorkFlowSeeder extends Seeder 'is_start' => false, 'is_end' => false, 'answer_options' => [ - ['display_text' => 'Wrong Pin Number', 'value' => 'Wrong Pin Number', 'next_question_number' => '1688_issue_submit'], - ['display_text' => 'Not Enough Stock', 'value' => 'Not Enough Stock', 'next_question_number' => '1688_issue_submit'], - ['display_text' => 'Others', 'value' => 'Others', 'next_question_number' => '1688_proceed_order_issue_others'], - ['display_text' => 'No CrossBoarder', 'value' => 'No CrossBoarder', 'next_question_number' => '1688_issue_submit'], - ['display_text' => 'AngPau', 'value' => 'AngPau', 'next_question_number' => '1688_issue_submit'], + ['display_text' => 'Wrong Pin Number', 'value' => '1688_proceed_order_issue_wrong_pin_number', 'next_question_number' => '1688_issue_submit'], + ['display_text' => 'Not Enough Stock', 'value' => '1688_proceed_order_issue_not_enough_stock', 'next_question_number' => '1688_issue_submit'], + ['display_text' => 'Others', 'value' => '1688_proceed_order_issue_others', 'next_question_number' => '1688_proceed_order_issue_others'], + ['display_text' => 'No CrossBoarder', 'value' => '1688_proceed_order_issue_no_crossborder', 'next_question_number' => '1688_issue_submit'], + ['display_text' => 'AngPau', 'value' => '1688_proceed_order_issue_angpau', 'next_question_number' => '1688_issue_submit'], ], 'group' => '1688', + 'is_admin_filter' => true ], [ 'question_number' => '1688_proceed_order_issue_others', @@ -184,6 +188,7 @@ class QAWorkFlowSeeder extends Seeder 'is_start' => false, 'is_end' => false, 'group' => '1688', + 'is_admin_filter' => true ], [ 'question_number' => '1688_login_issue_others', @@ -193,6 +198,7 @@ class QAWorkFlowSeeder extends Seeder 'is_start' => false, 'is_end' => false, 'group' => '1688', + 'is_admin_filter' => true ], [ 'question_number' => '1688_submit', @@ -216,7 +222,7 @@ class QAWorkFlowSeeder extends Seeder 'group' => '1688', ], [ - 'question_number' => '1688_refund_request', + 'question_number' => '1688_login_issue_refund_request', 'question_title' => 'Refund Request sent', 'question_type' => QAType::MULTIPLE_CHOICES, 'is_start' => false, @@ -227,6 +233,52 @@ class QAWorkFlowSeeder extends Seeder ], 'group' => '1688', ], + [ + 'question_number' => '1688_insufficient_order', + 'question_title' => 'Are You Sure this is the correct amount?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => false, + 'answer_options' => [ + ['display_text' => 'Underpaid Order', 'value' => 'underpaid_order_1', 'next_question_number' => '1688_issue_submit'], + ['display_text' => 'Underpaid Order', 'value' => 'underpaid_order_2', 'next_question_number' => '1688_issue_submit'], + ['display_text' => 'Overpaid Order', 'value' => 'underpaid_order_2', 'next_question_number' => '1688_issue_submit'], + ], + 'group' => '1688', + ], + [ + 'question_number' => '1688_underpaid_order_1', + 'question_title' => 'This order is underpaid 1', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => false, + 'answer_options' => [ + ['display_text' => 'Done', 'value' => '1688_issue_submit', 'next_question_number' => '1688_issue_submit'], + ], + 'group' => '1688', + ], + [ + 'question_number' => '1688_underpaid_order_2', + 'question_title' => 'This order is underpaid 2', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => false, + 'answer_options' => [ + ['display_text' => 'Done', 'value' => '1688_issue_submit', 'next_question_number' => '1688_issue_submit'], + ], + 'group' => '1688', + ], + [ + 'question_number' => '1688_overpaid_order', + 'question_title' => 'This order is overpaid', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => false, + 'answer_options' => [ + ['display_text' => 'Done', 'value' => '1688_issue_submit', 'next_question_number' => '1688_issue_submit'], + ], + 'group' => '1688', + ], [ 'question_number' => 'approve_po', 'question_title' => 'approve_po', @@ -305,6 +357,7 @@ class QAWorkFlowSeeder extends Seeder // ['display_text' => 'Next Order', 'value' => 'approve_po', 'next_question_number' => 'approve_po'], ], 'group' => 'approve_po', + 'is_admin_filter' => true ], [ 'question_number' => 'approve_po_reject_others', @@ -314,6 +367,7 @@ class QAWorkFlowSeeder extends Seeder 'is_start' => false, 'is_end' => false, 'group' => 'approve_po', + 'is_admin_filter' => true ], [ 'question_number' => 'approve_po_reject_others_complete', @@ -335,8 +389,45 @@ class QAWorkFlowSeeder extends Seeder 'is_start' => false, 'is_end' => false, 'answer_options' => [ - ['display_text' => 'Sensitive Goods', 'value' => 'Sensitive Goods', 'next_question_number' => 'fill_po_issue_submit'], - ['display_text' => 'Others', 'value' => 'fill_po_issue_others', 'next_question_number' => 'fill_po_issue_others'], + ['display_text' => 'Sensitive Goods', 'value' => 'Sensitive Goods', 'next_question_number' => 'approve_po_edit_po_issue_submit'], + ['display_text' => 'Others', 'value' => 'approve_po_edit_po_issue_others', 'next_question_number' => 'approve_po_edit_po_issue_others'], + ], + 'group' => 'approve_po', + 'is_admin_filter' => true + ], + [ + 'question_number' => 'approve_po_edit_po_issue_submit', + 'question_title' => 'Issue has been submitted', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => true, + 'answer_options' => [ + ['display_text' => 'Stop Working', 'value' => 'stop_working', 'next_question_number' => 'stop_working'], + ['display_text' => 'Next PO (Fill)', 'value' => 'fill_po', 'next_question_number' => 'fill_po'], + ['display_text' => 'Next PO (Approve)', 'value' => 'approve_po', 'next_question_number' => 'approve_po'], + ], + 'group' => 'approve_po', + ], + [ + 'question_number' => 'approve_po_edit_po_issue_others', + 'question_title' => 'What other issues did you encounter? Upload documents if needed', + 'question_type' => QAType::REMARKS_WITH_DOCUMENT_UPLOAD, + 'next_nested_question' => 'approve_po_edit_po_issue_submit', + 'is_start' => false, + 'is_end' => false, + 'group' => 'approve_po', + 'is_admin_filter' => true + ], + [ + 'question_number' => 'approve_po_edit_po_issue_submit', + 'question_title' => 'Issue has been submitted', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => true, + 'answer_options' => [ + ['display_text' => 'Stop Working', 'value' => 'stop_working', 'next_question_number' => 'stop_working'], + ['display_text' => 'Next PO (Fill)', 'value' => 'fill_po', 'next_question_number' => 'fill_po'], + ['display_text' => 'Next PO (Approve)', 'value' => 'approve_po', 'next_question_number' => 'approve_po'], ], 'group' => 'approve_po', ], @@ -348,6 +439,7 @@ class QAWorkFlowSeeder extends Seeder 'is_start' => false, 'is_end' => false, 'group' => 'fill_po', + 'is_admin_filter' => true ], [ 'question_number' => 'fill_po_issue_submit', @@ -362,60 +454,6 @@ class QAWorkFlowSeeder extends Seeder ], 'group' => 'fill_po', ], - [ - 'question_number' => 'stop_working', - 'question_title' => 'Thank you. Reload page to restart.', - 'question_type' => QAType::DEFAULT, - 'is_start' => false, - 'is_end' => true, - 'group' => '', - ], - [ - 'question_number' => '1688_insufficient_order', - 'question_title' => 'Are You Sure this is the correct amount?', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'is_start' => false, - 'is_end' => false, - 'answer_options' => [ - ['display_text' => 'Underpaid Order', 'value' => 'underpaid_order_1', 'next_question_number' => '1688_issue_submit'], - ['display_text' => 'Underpaid Order', 'value' => 'underpaid_order_2', 'next_question_number' => '1688_issue_submit'], - ['display_text' => 'Overpaid Order', 'value' => 'underpaid_order_2', 'next_question_number' => '1688_issue_submit'], - ], - 'group' => '1688', - ], - [ - 'question_number' => '1688_underpaid_order_1', - 'question_title' => 'This order is underpaid 1', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'is_start' => false, - 'is_end' => false, - 'answer_options' => [ - ['display_text' => 'Done', 'value' => '1688_issue_submit', 'next_question_number' => '1688_issue_submit'], - ], - 'group' => '1688', - ], - [ - 'question_number' => '1688_underpaid_order_2', - 'question_title' => 'This order is underpaid 2', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'is_start' => false, - 'is_end' => false, - 'answer_options' => [ - ['display_text' => 'Done', 'value' => '1688_issue_submit', 'next_question_number' => '1688_issue_submit'], - ], - 'group' => '1688', - ], - [ - 'question_number' => '1688_overpaid_order', - 'question_title' => 'This order is overpaid', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'is_start' => false, - 'is_end' => false, - 'answer_options' => [ - ['display_text' => 'Done', 'value' => '1688_issue_submit', 'next_question_number' => '1688_issue_submit'], - ], - 'group' => '1688', - ], [ 'question_number' => 'fill_po_edit', 'question_title' => 'fill_po_edit', @@ -440,6 +478,7 @@ class QAWorkFlowSeeder extends Seeder ['display_text' => 'Others', 'value' => 'fill_po_issue_others', 'next_question_number' => 'fill_po_issue_others'], ], 'group' => 'fill_po', + 'is_admin_filter' => true ], [ 'question_number' => 'fill_po_edit_filled', @@ -454,6 +493,14 @@ class QAWorkFlowSeeder extends Seeder ], 'group' => 'fill_po', ], + [ + 'question_number' => 'stop_working', + 'question_title' => 'Thank you. Reload page to restart.', + 'question_type' => QAType::DEFAULT, + 'is_start' => false, + 'is_end' => true, + 'group' => '', + ], ] ], ]; @@ -495,6 +542,10 @@ class QAWorkFlowSeeder extends Seeder $question->url = $questionData['url']; } + if (isset($questionData['is_admin_filter'])) { + $question->is_admin_filter = $questionData['is_admin_filter']; + } + $question->order = $key + 1; $question->save(); diff --git a/resources/assets/vue/components/admin-workflow/elements/QuestionAnswer2Component.vue b/resources/assets/vue/components/admin-workflow/elements/QuestionAnswer2Component.vue index 09837d9d..50408325 100644 --- a/resources/assets/vue/components/admin-workflow/elements/QuestionAnswer2Component.vue +++ b/resources/assets/vue/components/admin-workflow/elements/QuestionAnswer2Component.vue @@ -54,7 +54,8 @@ -
+ +
@@ -62,7 +63,8 @@
-
+ +
diff --git a/resources/assets/vue/components/admin-workflow/sections/QuestionAnswerSection2Component.vue b/resources/assets/vue/components/admin-workflow/sections/QuestionAnswerSection2Component.vue index 785b4ce5..325216d7 100644 --- a/resources/assets/vue/components/admin-workflow/sections/QuestionAnswerSection2Component.vue +++ b/resources/assets/vue/components/admin-workflow/sections/QuestionAnswerSection2Component.vue @@ -12,15 +12,16 @@
- - - + + +
- - - + + + +
@@ -37,8 +38,23 @@
+
+ + + + +
-
+
+
+ + + + +
+
+ +
Download @@ -88,6 +104,8 @@ data(){ return { filterUserId: "", + filterQuestion: "", + filterQuestionGroup: "", filterQuestionnaireSet: "", filterStartDate: "", filterEndDate: "", @@ -100,16 +118,29 @@ 'order_by': {column: 'created_at', DESC: true}, }, currentKey: 1, + questionGroups: [], } }, + created(){ + this.fetchQuestionnaireSets(); + }, validations: { filterUserId: {}, + filterQuestion: {}, + filterQuestionGroup: {}, filterQuestionnaireSet: {}, filterStartDate: {}, filterEndDate: {}, filterAnswerText: {}, }, methods: { + fetchQuestionnaireSets(){ + this.submit(route('api.questionnaires.list') +'?filters=' + JSON.stringify({ 'per_page': 10, order_by: {column: 'id', DESC: true} }), 'get', this.section, false, false) + }, + successHandler(response){ + this.questionGroups = response.payload.data[0].group; + this.options['question_group_in'] = this.questionGroups; + }, onSelected(userId){ this.updateOptions(); this.currentKey+=1; @@ -118,6 +149,12 @@ // if(this.filterUserId){ // this.options['user_id'] = this.filterUserId; // } + if(this.filterQuestion){ + this.options['question_in'] = [this.filterQuestion]; + } + if(this.filterQuestionGroup){ + this.options['question_group_in'] = [this.filterQuestionGroup]; + } if(this.filterQuestionnaireSet){ this.options['has_questionnaire'] = this.filterQuestionnaireSet; } @@ -137,16 +174,19 @@ }, resetSarch() { this.filterUserId = "", + this.filterQuestion = "", this.filterQuestionGroup = "", this.filterQuestionnaireSet = "", this.filterStartDate = "", this.filterEndDate = "", this.filterAnswerText = "", // delete this.options['user_id']; + delete this.options['question_in']; delete this.options['has_questionnaire']; delete this.options['start_date']; delete this.options['end_date']; delete this.options['answer_like_with_user_id']; + this.options['question_group_in'] = this.questionGroups; this.currentKey+=1; }, }, diff --git a/resources/assets/vue/components/admin-workflow/sections/QuestionAnswerSectionComponent.vue b/resources/assets/vue/components/admin-workflow/sections/QuestionAnswerSectionComponent.vue index 257ed2eb..e274b3fa 100644 --- a/resources/assets/vue/components/admin-workflow/sections/QuestionAnswerSectionComponent.vue +++ b/resources/assets/vue/components/admin-workflow/sections/QuestionAnswerSectionComponent.vue @@ -39,7 +39,8 @@
-
+ +
Download @@ -67,7 +68,6 @@
Created Date
-