Files
exchange-2.0/app/Classes/Modules/Questionnaires/ControllersLogic/UpdateNextQuestionV1AdminWFLogic.php
T
2024-12-02 23:06:44 +08:00

165 lines
6.8 KiB
PHP

<?php
namespace App\Classes\Modules\Questionnaires\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Questionnaires\Standards\Rules\CanFetchQuestion;
use App\Classes\Modules\Questionnaires\Processors\SaveAnswerV1AdminWFProcessor;
use App\Classes\Modules\Questionnaires\Processors\FetchNextQuestionV1AdminWFProcessor;
use App\Classes\Modules\Questionnaires\Processors\FetchFirstQuestionV1AdminWFProcessor;
use App\Classes\Modules\Questionnaires\Services\ListsUserAnswerSelected;
use App\Classes\Modules\Accounts\Services\CreatesKeyValuePair;
use App\Classes\Modules\Accounts\DataTransferObjects\KeyValuePairObject;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Auth;
use App\Http\Resources\QuestionResource;
use App\Models\Booking;
class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => '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();
Log::info('currentQuestion: '. json_encode($currentQuestion));
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();
$kvp = $answer->attributesKVP()->where('key', 'App\Models\Bank')->where('value', $questionMetadata['booking']['id'])->latest()->first();
$key = "admin_workflow_processed";
if (strpos($currentQuestion['question_number'], '1688') === 0) {
$key = '1688_'.$key;
}
if (strpos($currentQuestion['question_number'], 'fill_po') === 0) {
$key = 'fill_po_'.$key;
}
if (strpos($currentQuestion['question_number'], 'approve_po') === 0) {
$key = 'approve_po_'.$key;
}
if(!$kvp){
$keyValuePairObject = new KeyValuePairObject($key, 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));
}
}