Admin Workflow - Code Refactoring

This commit is contained in:
Dillon Ngo
2025-02-23 22:04:15 +08:00
parent f2ba89d3e4
commit cc558b0af9
6 changed files with 58 additions and 72 deletions
@@ -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;
}
}
@@ -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'];
@@ -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'];
@@ -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;
}
}
@@ -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))
{
@@ -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();