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 @@ -