From cc558b0af9fbae52eb74e3c234610dfe617b6ea9 Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Sun, 23 Feb 2025 22:04:15 +0800 Subject: [PATCH] Admin Workflow - Code Refactoring --- .../UpdateNextQuestionV1AdminWFLogic.php | 92 ++++++++----------- ...NextQuestionMetadataV1AdminWFProcessor.php | 4 +- .../FetchNextQuestionV1AdminWFProcessor.php | 13 ++- .../SaveAnswerActionV1AdminWFProcessor.php | 8 +- .../SaveAnswerV1AdminWFProcessor.php | 3 + .../forms/AdminWorkFlowFormComponent.vue | 10 +- 6 files changed, 58 insertions(+), 72 deletions(-) diff --git a/app/Classes/Modules/Questionnaires/ControllersLogic/UpdateNextQuestionV1AdminWFLogic.php b/app/Classes/Modules/Questionnaires/ControllersLogic/UpdateNextQuestionV1AdminWFLogic.php index 366cb135..5395a898 100644 --- a/app/Classes/Modules/Questionnaires/ControllersLogic/UpdateNextQuestionV1AdminWFLogic.php +++ b/app/Classes/Modules/Questionnaires/ControllersLogic/UpdateNextQuestionV1AdminWFLogic.php @@ -19,6 +19,7 @@ use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Auth; use App\Http\Resources\QuestionResource; use App\Models\Booking; +use App\Models\QAQuestions; class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic { @@ -90,52 +91,57 @@ class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic public function logic(Request $request) : JsonResponse { $userId = Auth::user()->id; - $currentQuestion = $request->question; - $answerNextQuestionNumber = null; - $answerValue = null; $timeUsedSeconds = 0; $reference = null; $questionMetadata = null; $booking = null; - $isNoGoingBackOverwrite = 0; + $previousAnswer = null; $this->canFetchQuestion->passes(); - if ($request->has('answerObj')) { - $answer = $request->answerObj; - $answerNextQuestionNumber = $answer['next_question_number']; - $answerValue = $answer['value']; - } - - if ($request->has('extra')) { - $extra = $request->extra; - $questionMetadata = $extra['questionMetadata'] ?? null; - $timeUsedSeconds = intval($extra['timeUsedSeconds']) ?? 0; - $reference = $extra['session_id']; - } - - if($questionMetadata){ - $booking = Booking::where('id', $questionMetadata['id'])->first(); + $currentQuestion = $request->question; + $filesUpload = $request->only(['files', 'filesA', 'filesB', 'filesC']); + if ($request->has('questionContext')) { + $questionMetadata = $request->questionContext['questionMetadata'] ?? null; + $timeUsedSeconds = intval($request->questionContext['timeUsedSeconds']) ?? 0; + $reference = $request->questionContext['session_id']; + $booking = $questionMetadata ? Booking::where('id', $questionMetadata['id'])->first() : null; } //Save answer given by user (both next and previous) - $filesUpload = $request->only(['files', 'filesA', 'filesB', 'filesC']); $answerOptionId = 0; if ($request->has('answerObj')) { $answerOptionId = intval($request->answerObj['id']); } - $answerInText = $request->answer; - if ($request->has('isPrevious')){ - $answerInText = "go_back"; - } - $this->saveAnswerProcessor->execute($userId, 0, $currentQuestion, $questionMetadata, $answerInText, $answerOptionId, $filesUpload, $timeUsedSeconds, $request->has('isPrevious'), $reference); + + $this->saveAnswerProcessor->execute($userId, 0, $currentQuestion, $questionMetadata, $request->answer, $answerOptionId, $filesUpload, $timeUsedSeconds, $request->has('isPrevious'), $reference); if(!$request->has('isPrevious')){ - $isNoGoingBackOverwrite = $this->saveAnswerActionProcessor->execute($booking, $questionMetadata, $answerOptionId, $currentQuestion, $filesUpload); + $this->saveAnswerActionProcessor->execute($booking, $questionMetadata, $answerOptionId, $currentQuestion, $filesUpload); } + if ($request->has('questionContext')) { + $previousAnswer = $this->listsUserAnswerSelected->execute(['user_id' => $userId, 'reference' => $reference, 'is_previous' => 0, 'order_by' => (object)['column' => 'id','DESC' => true]])[0]; + } + + if($booking){ + $this->markBookingAsProcessed($booking, $request->has('isPrevious'), $currentQuestion); + } + + //Get returned question (previous or next) and additional metadata if applicable + $returnQuestion = $this->fetchNextQuestionV1AdminWFProcessor->execute($currentQuestion, $request->answerObj, $request->questionContext, $previousAnswer, $booking, $request->has('isPrevious')); + $questionMetadata = $this->fetchNextQuestionMetadataProcessor->execute($returnQuestion, $questionMetadata); + + //When a questionnaire ended, return back the first question + if(is_null($returnQuestion)){ + $returnQuestion = $this->fetchFirstQuestionQAProcessor->execute($request); + } + + return $this->resourceResponse(new QuestionResource($returnQuestion, $userId, $request->has('isPrevious'), $this->isNoGoingBack($returnQuestion), $previousAnswer, $questionMetadata)); + } + + private function markBookingAsProcessed(Booking $booking, bool $isPrevious, array $currentQuestion){ //Marked data that has already been processed so that it does not appear again - $isNoGoingBack = 0; - if($currentQuestion && $currentQuestion['is_end'] === 1 && !$request->has('isPrevious')){ + if($currentQuestion && $currentQuestion['is_end'] === 1 && !$isPrevious){ $key1 = "admin_workflow_processed"; $key2 = "admin_workflow_processing"; if (strpos($currentQuestion['question_number'], '1688') === 0) { @@ -162,36 +168,18 @@ class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic $keyValuePairObject = new KeyValuePairObject($key1, true); $this->createsKeyValuePair->execute($booking, $keyValuePairObject); } - $isNoGoingBack = 1; } + } - $previousAnswer = null; - if ($request->has('extra')) { - $extra = $request->extra; - $reference = $extra['session_id']; - $previousAnswer = $this->listsUserAnswerSelected->execute(['user_id' => $userId, 'reference' => $reference, 'is_previous' => 0, 'order_by' => (object)['column' => 'id','DESC' => true]])[0]; - } + private function isNoGoingBack(QAQuestions $returnQuestion){ - //Get returned question (previous or next) - $returnQuestion = $this->fetchNextQuestionV1AdminWFProcessor->execute($request, $previousAnswer, $booking); - - if($returnQuestion && $returnQuestion->is_start){ - $isNoGoingBack = 1; + if($returnQuestion && ($returnQuestion->is_start || $returnQuestion->is_end)){ + return 1; } else if($returnQuestion && $returnQuestion->is_start === 0 && $returnQuestion && $returnQuestion->is_end === 0){ - $isNoGoingBack = 0; + return 0; } - if($isNoGoingBackOverwrite === 1 && $isNoGoingBack === 0){ - $isNoGoingBack = $isNoGoingBackOverwrite; - } - - $questionMetadata = $this->fetchNextQuestionMetadataProcessor->execute($returnQuestion, $questionMetadata); - - //When a questionnaire ended, return back the first question - if(is_null($returnQuestion)){ - $returnQuestion = $this->fetchFirstQuestionQAProcessor->execute($request); - } - return $this->resourceResponse(new QuestionResource($returnQuestion, $userId, $request->has('isPrevious'), $isNoGoingBack, $previousAnswer, $questionMetadata)); + return 0; } } diff --git a/app/Classes/Modules/Questionnaires/Processors/FetchNextQuestionMetadataV1AdminWFProcessor.php b/app/Classes/Modules/Questionnaires/Processors/FetchNextQuestionMetadataV1AdminWFProcessor.php index d7842e3d..ffecfb1c 100644 --- a/app/Classes/Modules/Questionnaires/Processors/FetchNextQuestionMetadataV1AdminWFProcessor.php +++ b/app/Classes/Modules/Questionnaires/Processors/FetchNextQuestionMetadataV1AdminWFProcessor.php @@ -2,9 +2,11 @@ namespace App\Classes\Modules\Questionnaires\Processors; +use App\Models\QAQuestions; + class FetchNextQuestionMetadataV1AdminWFProcessor { - public function execute($returnQuestion, $questionMetadata) { + public function execute(QAQuestions $returnQuestion, ?array $questionMetadata) { if($returnQuestion && $returnQuestion->question_number === '1688_underpaid_order_1'){ $processed = $questionMetadata['amount_processed']; diff --git a/app/Classes/Modules/Questionnaires/Processors/FetchNextQuestionV1AdminWFProcessor.php b/app/Classes/Modules/Questionnaires/Processors/FetchNextQuestionV1AdminWFProcessor.php index 879b8ef6..59bbbdac 100644 --- a/app/Classes/Modules/Questionnaires/Processors/FetchNextQuestionV1AdminWFProcessor.php +++ b/app/Classes/Modules/Questionnaires/Processors/FetchNextQuestionV1AdminWFProcessor.php @@ -15,6 +15,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Log; use Illuminate\Http\Request; use App\Models\Booking; +use App\Models\QAUserAnswerSelected; class FetchNextQuestionV1AdminWFProcessor { @@ -50,14 +51,13 @@ class FetchNextQuestionV1AdminWFProcessor $this->fetchBookingQuotation = $fetchBookingQuotation; } - public function execute(Request $request, $previousAnswer, $booking){ + public function execute(array $currentQuestion, ?array $currentQuestionAnswer, array $questionContext, QAUserAnswerSelected $previousAnswer, ?Booking $booking, bool $isPrevious){ $isEnd = 0; $questionId = 0; $nextQuestionNumber = ""; $nextNestedQuestion = ""; $nextMainQuestion= ""; $questionnaireSetId = 0; - $currentQuestion = $request->question; $questionType = QAType::DEFAULT; $returnQuestion = null; @@ -70,11 +70,11 @@ class FetchNextQuestionV1AdminWFProcessor $questionnaireSetId = $currentQuestion['questionnaire_set_id']; } - if ($request->has('answerObj') && $request->answerObj['next_question_number']) { - $nextQuestionNumber = $request->answerObj['next_question_number']; + if ($currentQuestionAnswer && $currentQuestionAnswer['next_question_number']) { + $nextQuestionNumber = $currentQuestionAnswer['next_question_number']; } - if ($request->has('isPrevious')) { + if ($isPrevious) { if($previousAnswer) { $previousAnswer->delete(); @@ -105,8 +105,7 @@ class FetchNextQuestionV1AdminWFProcessor //Check if question exists $questions = $this->listsQuestions->execute(['questionnaire_set_id' => $questionnaireSetId, 'question_number' => $question_number]); if($previousAnswer['answer'] === '1688_underpaid_overpaid' && count($questions) == 0){ - $extra = $request->extra; - $questionMetadata = $extra['questionMetadata'] ?? null; + $questionMetadata = $questionContext['questionMetadata'] ?? null; // $processed = round((floatval($questionMetadata['amount_processed']) + PHP_FLOAT_EPSILON) * 1000) / 1000; // $amount = round((floatval($questionMetadata['amount']) + PHP_FLOAT_EPSILON) * 1000) / 1000; $processed = $questionMetadata['amount_processed']; diff --git a/app/Classes/Modules/Questionnaires/Processors/SaveAnswerActionV1AdminWFProcessor.php b/app/Classes/Modules/Questionnaires/Processors/SaveAnswerActionV1AdminWFProcessor.php index 3b729b11..159eca3b 100644 --- a/app/Classes/Modules/Questionnaires/Processors/SaveAnswerActionV1AdminWFProcessor.php +++ b/app/Classes/Modules/Questionnaires/Processors/SaveAnswerActionV1AdminWFProcessor.php @@ -56,11 +56,9 @@ class SaveAnswerActionV1AdminWFProcessor * @return */ public function execute($booking, $questionMetadata, $answerOptionId, $currentQuestion, $filesUpload){ - $isNoGoingBack = 0; $answerOption = QAAnswerOptions::where('id', $answerOptionId)->first(); if($currentQuestion['question_number'] === 'approve_po' && $answerOption && $answerOption->value === "approve_po_approved"){ - $this->approvePurchaseOrderProcessor->execute($questionMetadata['id']); - $isNoGoingBack = 1; + $this->approvePurchaseOrderProcessor->execute($booking); } else if($currentQuestion['question_number'] === '1688_submit') { @@ -79,7 +77,6 @@ class SaveAnswerActionV1AdminWFProcessor $transaction = $this->fetchesTransaction->execute(['id' =>$questionMetadata['payment_history'][0]['transaction_bill']['id']]); $this->createPaymentProofDocumentProcessor->execute($transaction, $filesUpload['filesC']); } - $isNoGoingBack = 1; } } else if($currentQuestion['question_number'] === '1688_underpaid_order_1') @@ -97,12 +94,9 @@ class SaveAnswerActionV1AdminWFProcessor $company = $booking->company()->first(); $employee = $company->employees()->first(); $transaction = $this->createBookingPaymentProcessor->execute($booking, (string) $differenceUnder, 'wallet', "", "", $employee->email); - $isNoGoingBack = 1; } } } - - return $isNoGoingBack; } } diff --git a/app/Classes/Modules/Questionnaires/Processors/SaveAnswerV1AdminWFProcessor.php b/app/Classes/Modules/Questionnaires/Processors/SaveAnswerV1AdminWFProcessor.php index cb772aa8..70ee3c36 100644 --- a/app/Classes/Modules/Questionnaires/Processors/SaveAnswerV1AdminWFProcessor.php +++ b/app/Classes/Modules/Questionnaires/Processors/SaveAnswerV1AdminWFProcessor.php @@ -33,6 +33,9 @@ class SaveAnswerV1AdminWFProcessor $questionId = $currentQuestion['id']; $questionType = $currentQuestion['question_type']; $questionNumber = $currentQuestion['question_number']; + if ($isPrevious){ + $answerInText = "go_back"; + } if(is_null($answer)) { diff --git a/resources/assets/vue/components/general/forms/AdminWorkFlowFormComponent.vue b/resources/assets/vue/components/general/forms/AdminWorkFlowFormComponent.vue index 23b848ee..9c86197f 100644 --- a/resources/assets/vue/components/general/forms/AdminWorkFlowFormComponent.vue +++ b/resources/assets/vue/components/general/forms/AdminWorkFlowFormComponent.vue @@ -603,7 +603,7 @@ this.parameters.answer = this.answer; this.parameters.answerId = this.answerId; this.parameters.answerObj = this.question.question_answers.find(item => item.id === Number(this.answerId)); - this.parameters.extra = {}; + this.parameters.questionContext = {}; this.error = null; this.direction = direction; @@ -632,7 +632,7 @@ this.parameters.filesC = this.filesC; } - this.parameters.extra.timeUsedSeconds = this.stepTime; + this.parameters.questionContext.timeUsedSeconds = this.stepTime; const baseData = { id: this.externalApiResponse?.data?.id, company: this.externalApiResponse?.data?.company, @@ -654,9 +654,9 @@ this.externalApiResponse.data = trimmedData; } - this.parameters.extra.questionMetadata = trimmedData; - this.parameters.extra.user_id = this.$store.getters.getUserId; - this.parameters.extra.session_id = this.sessionId; + this.parameters.questionContext.questionMetadata = trimmedData; + this.parameters.questionContext.user_id = this.$store.getters.getUserId; + this.parameters.questionContext.session_id = this.sessionId; if(direction === 'next'){ if (this.parameters.answer === 'start_work') this.startWork();