'Retrieved Admin Workflow Next Question', 'message' => 'You have successfully retrieved a Admin Workflow Next Question' ]; } /** @var CanFetchQuestion */ private $canFetchQuestion; /** @var SaveAnswerV1AdminWFProcessor */ private $saveAnswerProcessor; /** @var FetchNextQuestionV1AdminWFProcessor */ private $fetchNextQuestionQAProcessor; /** @var FetchFirstQuestionV1AdminWFProcessor */ private $fetchFirstQuestionQAProcessor; /** @var ListsUserAnswerSelected */ private $listsUserAnswerSelected; /** @var CreatesKeyValuePair */ private $createsKeyValuePair; /** * UpdateNextQuestionV1AdminWFLogic constructor. * @param CanFetchQuestion $canFetchQuestion * @param SaveAnswerV1AdminWFProcessor $saveAnswerProcessor * @param FetchNextQuestionV1AdminWFProcessor $fetchNextQuestionQAProcessor * @param FetchFirstQuestionV1AdminWFProcessor $fetchFirstQuestionQAProcessor * @param ListsUserAnswerSelected $listsUserAnswerSelected * @param CreatesKeyValuePair $createsKeyValuePair */ public function __construct(CanFetchQuestion $canFetchQuestion, SaveAnswerV1AdminWFProcessor $saveAnswerProcessor, FetchNextQuestionV1AdminWFProcessor $fetchNextQuestionQAProcessor, FetchFirstQuestionV1AdminWFProcessor $fetchFirstQuestionQAProcessor, ListsUserAnswerSelected $listsUserAnswerSelected, CreatesKeyValuePair $createsKeyValuePair) { $this->canFetchQuestion = $canFetchQuestion; $this->saveAnswerProcessor = $saveAnswerProcessor; $this->fetchNextQuestionQAProcessor = $fetchNextQuestionQAProcessor; $this->fetchFirstQuestionQAProcessor = $fetchFirstQuestionQAProcessor; $this->listsUserAnswerSelected = $listsUserAnswerSelected; $this->createsKeyValuePair = $createsKeyValuePair; } /** * @param Request $request * @return JsonResponse * @throws MalformedRequestException * @throws ResourceNotFoundException */ public function logic(Request $request) : JsonResponse { $questionId = 0; $userId = Auth::user()->id; $currentQuestion = $request->question; $questionId = $currentQuestion['id']; $questionType = $currentQuestion['question_type']; $currentQuestionNumber = $currentQuestion['question_number']; $answerNextQuestionNumber = null; $answerValue = null; $timeUsedSeconds = 0; $reference = null; $questionMetadata = null; $this->canFetchQuestion->passes(); if ($request->has('answerObj')) { $answer = $request->answerObj; $answerNextQuestionNumber = $answer['next_question_number']; $answerValue = $answer['value']; Log::info('answerNextQuestionNumber: '. $answerNextQuestionNumber); Log::info('answerValue: '. $answerValue); } if ($request->has('extra')) { $extra = $request->extra; $questionMetadata = $extra['questionMetadata'] ?? null; $timeUsedSeconds = intval($extra['timeUsedSeconds']) ?? 0; $reference = $extra['session_id']; } //Save answer given by user (both next and previous) $filesUpload = $request->input('files'); $answerOptionId = 0; if ($request->has('answerObj')) { $answerOptionId = intval($request->answerObj['id']); } $answerInText = $request->answer; if ($request->has('isPrevious')){ $answerInText = "go_back"; } $answer = $this->saveAnswerProcessor->execute($userId, 0, $questionId, $questionType, $questionMetadata, $answerInText, $answerOptionId, $filesUpload, $timeUsedSeconds, $request->has('isPrevious'), $reference); //Marked data that has already been processed so that it does not appear again $isNoGoingBack = null; if($currentQuestion && $currentQuestion['is_end'] === 1){ $booking = Booking::where('id', $questionMetadata['booking']['id'])->first(); $key1 = "admin_workflow_processed"; $key2 = "admin_workflow_processing"; if (strpos($currentQuestion['question_number'], '1688') === 0) { $key1 = '1688_'.$key1; $key2 = '1688_'.$key2; } if (strpos($currentQuestion['question_number'], 'fill_po') === 0) { $key1 = 'fill_po_'.$key1; $key2 = 'fill_po_'.$key2; } if (strpos($currentQuestion['question_number'], 'approve_po') === 0) { $key1 = 'approve_po_'.$key1; $key2 = 'approve_po_'.$key2; } $processingRecord = $booking->attributesKVP()->where('key', $key2)->first(); if ($processingRecord) { $processingRecord->delete(); } $kvp = $booking->attributesKVP()->where('key', $key1)->first(); if(!$kvp){ $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]; } //Get returned question (previous or next) $returnQuestion = $this->fetchNextQuestionQAProcessor->execute($request, $previousAnswer); //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)); } }