diff --git a/app/Classes/Modules/Documents/Processors/UploadDocumentForHelpMenuProcessor.php b/app/Classes/Modules/Documents/Processors/UploadDocumentForHelpMenuProcessor.php index 370b1a05..863fcfdc 100644 --- a/app/Classes/Modules/Documents/Processors/UploadDocumentForHelpMenuProcessor.php +++ b/app/Classes/Modules/Documents/Processors/UploadDocumentForHelpMenuProcessor.php @@ -32,12 +32,12 @@ class UploadDocumentForHelpMenuProcessor /** - * @param Request $request + * @param $filesUpload * @param QAUserAnswerSelected qaUserAnswerSelected * @throws \App\Classes\Exceptions\MalformedRequestException */ - public function execute(Request $request, QAUserAnswerSelected $qaUserAnswerSelected) { - $object = new DocumentObject("HELP_MENU", $request->input('files'), + public function execute($filesUpload, QAUserAnswerSelected $qaUserAnswerSelected) { + $object = new DocumentObject("HELP_MENU", $filesUpload, '123456', ApprovalStatus::PENDING_VERIFICATION, 'help_menu'); //cief todo: 123456 cannot be hardcoded /** @var Document $document */ diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php index da1de831..90673bda 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/FetchHelpMenuQuestionLogic.php @@ -4,7 +4,7 @@ namespace App\Classes\Modules\HelpMenu\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; -use App\Classes\Modules\HelpMenu\Standards\Rules\CanFetchHelpMenuQuestionList; +use App\Classes\Modules\HelpMenu\Standards\Rules\CanFetchHelpMenuQuestion; use App\Classes\Modules\HelpMenu\Processors\FetchFirstHelpMenuQuestionProcessor; use App\Http\Resources\HelpMenuQuestionResource; use ErrorException; @@ -25,20 +25,20 @@ class FetchHelpMenuQuestionLogic extends AbstractControllerLogic ]; } - /** @var CanFetchHelpMenuQuestionList */ - private $canFetchHelpMenuQuestionList; + /** @var CanFetchHelpMenuQuestion */ + private $canFetchHelpMenuQuestion; /** @var FetchFirstHelpMenuQuestionProcessor */ private $fetchFirstHelpMenuQuestionProcessor; /** * FetchHelpMenuQuestionLogic constructor. - * @param CanFetchHelpMenuQuestionList $canFetchHelpMenuQuestionList + * @param CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion * @param FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor */ - public function __construct(CanFetchHelpMenuQuestionList $canFetchHelpMenuQuestionList, FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor) + public function __construct(CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion, FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor) { - $this->canFetchHelpMenuQuestionList = $canFetchHelpMenuQuestionList; + $this->canFetchHelpMenuQuestion = $canFetchHelpMenuQuestion; $this->fetchFirstHelpMenuQuestionProcessor = $fetchFirstHelpMenuQuestionProcessor; } @@ -50,7 +50,7 @@ class FetchHelpMenuQuestionLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { - $this->canFetchHelpMenuQuestionList->passes(); + $this->canFetchHelpMenuQuestion->passes(); $userId = Auth::user()->id; diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/GenerateFeedbackUrlLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/GenerateFeedbackUrlLogic.php new file mode 100644 index 00000000..9a40b8b2 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/GenerateFeedbackUrlLogic.php @@ -0,0 +1,54 @@ + 'Generate Feedback Url', + 'message' => 'You have successfully generated a feedback url' + ]; + } + + /** @var CanGenerateFeedbackUrl */ + private $canGenerateFeedbackUrl; + + + /** + * GenerateFeedbackUrlLogic constructor. + * @param CanGenerateFeedbackUrl $canGenerateFeedbackUrl + */ + public function __construct(CanGenerateFeedbackUrl $canGenerateFeedbackUrl) + { + $this->canGenerateFeedbackUrl = $canGenerateFeedbackUrl; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + $this->canGenerateFeedbackUrl->passes(); + + $originalText = $request->input('system') . '|' . $request->input('customer_marking'). '|' . $request->input('email'). '|' . $request->input('question_set'); + $resource = ['token' => Crypt::encryptString($originalText)]; + return $this->response(['data' => $resource]); + } + +} diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/ListHelpMenuQuestionsLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/ListHelpMenuQuestionsLogic.php new file mode 100644 index 00000000..d61b3aa7 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/ListHelpMenuQuestionsLogic.php @@ -0,0 +1,71 @@ + 'Retrieved Questions', + 'message' => 'You have successfully retrieved a list of Questions' + ]; + } + + /** @var CanListHelpMenuQuestions */ + private $canListHelpMenuQuestions; + + /** @var ListsHelpMenuQuestions */ + private $listsHelpMenuQuestions; + + /** + * ListHelpMenuQuestionsLogic constructor. + * @param CanListHelpMenuQuestions $canListHelpMenuQuestions + * @param ListsHelpMenuQuestions $listsHelpMenuQuestions + */ + public function __construct(CanListHelpMenuQuestions $canListHelpMenuQuestions, ListsHelpMenuQuestions $listsHelpMenuQuestions) + { + $this->canListHelpMenuQuestions = $canListHelpMenuQuestions; + $this->listsHelpMenuQuestions = $listsHelpMenuQuestions; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + * @throws \App\Classes\Exceptions\ResourceNotFoundException + */ + public function logic(Request $request) : JsonResponse + { + $this->canListHelpMenuQuestions->passes(); + + try{ + $token = $request->input('token'); + $decriptedToken = Crypt::decryptString($token); + $delimiter = "|"; + $parts = explode($delimiter, $decriptedToken); + $questionSet = $parts[3]; + $query = $this->listsHelpMenuQuestions->execute(['questionnaire_set_id' => $questionSet]); + return $this->collectionResponse(HelpMenuQuestionResource::collection($query)); + } catch(\Exception $exception){ + throw new ResourceNotFoundException($exception->getMessage()); + } + } + +} diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/ListQALogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/ListQALogic.php new file mode 100644 index 00000000..ea99044b --- /dev/null +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/ListQALogic.php @@ -0,0 +1,60 @@ + 'Retrieved Questions Answers', + 'message' => 'You have successfully retrieved a list of questions and answers' + ]; + } + + /** @var CanListHelpMenuQuestions */ + private $canListHelpMenuQuestions; + + /** @var ListsHelpMenuUserAnswerSelected */ + private $listsHelpMenuUserAnswerSelected; + + /** + * ListQALogic constructor. + * @param CanListHelpMenuQuestions $canListHelpMenuQuestions + * @param ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected + */ + public function __construct(CanListHelpMenuQuestions $canListHelpMenuQuestions, ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected) + { + $this->canListHelpMenuQuestions = $canListHelpMenuQuestions; + $this->listsHelpMenuUserAnswerSelected = $listsHelpMenuUserAnswerSelected; + } + + + /** + * @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->canListHelpMenuQuestions->passes(); + + $query = $this->listsHelpMenuUserAnswerSelected->execute($this->listsHelpMenuUserAnswerSelected->deserializeFilters($request->input('filters'))); + + return $this->collectionResponse(HelpMenuQuestionsAnswersResource::collection($query)); + } + +} diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php new file mode 100644 index 00000000..977ebc84 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php @@ -0,0 +1,80 @@ + 'Feedback Submission', + 'message' => 'You have successfully submitted yours answers' + ]; + } + + /** @var SaveHelpMenuAnswerProcessor */ + private $saveHelpMenuAnswerProcessor; + + /** @var UserSourceForQAProcessor */ + private $userSourceForQAProcessor; + + /** + * SubmitQAQuestionsLogic constructor. + * @param SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor + * @param UserSourceForQAProcessor $userSourceForQAProcessor + */ + public function __construct(SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor, UserSourceForQAProcessor $userSourceForQAProcessor) + { + $this->saveHelpMenuAnswerProcessor = $saveHelpMenuAnswerProcessor; + $this->userSourceForQAProcessor = $userSourceForQAProcessor; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + $token = $request->input('token'); + $userId = 0; + $sourceId = 0; + try { + $decriptedToken = Crypt::decryptString($token); + $delimiter = "|"; + $parts = explode($delimiter, $decriptedToken); + $system = $parts[0]; + $customerMarking = $parts[1]; + $email = $parts[2]; + + $result = $this->userSourceForQAProcessor->execute($system, $customerMarking, $email); + $userId = $result['userId']; + $sourceId = $result['sourceId']; + + } catch (\Throwable $e) { + Log::error($e); + } + + $answers = $request->input('answers'); + foreach ($answers as $answer) { + $filesUpload = $request->input('files'); + $this->saveHelpMenuAnswerProcessor->execute($userId, $sourceId, $answer['questionId'], $answer['answer'], $answer['answerId'], $filesUpload); + } + + $response = ['message' => 'Thank you for your feedback.']; + return $this->response(['data' => $response]); + } +} diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php index f29d236e..b01a7235 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/UpdateHelpMenuNextQuestionLogic.php @@ -5,7 +5,7 @@ namespace App\Classes\Modules\HelpMenu\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMSupportTicket; use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMCustomer; -use App\Classes\Modules\HelpMenu\Standards\Rules\CanFetchHelpMenuQuestionList; +use App\Classes\Modules\HelpMenu\Standards\Rules\CanFetchHelpMenuQuestion; use App\Classes\Modules\HelpMenu\Processors\SaveHelpMenuAnswerProcessor; use App\Classes\Modules\HelpMenu\Processors\DeleteHelpMenuAnswerProcessor; use App\Classes\Modules\HelpMenu\Processors\FetchNextHelpMenuQuestionProcessor; @@ -31,8 +31,8 @@ class UpdateHelpMenuNextQuestionLogic extends AbstractControllerLogic ]; } - /** @var CanFetchHelpMenuQuestionList */ - private $canFetchHelpMenuQuestionList; + /** @var CanFetchHelpMenuQuestion */ + private $canFetchHelpMenuQuestion; /** @var SaveHelpMenuAnswerProcessor */ private $saveHelpMenuAnswerProcessor; @@ -54,15 +54,15 @@ class UpdateHelpMenuNextQuestionLogic extends AbstractControllerLogic /** * UpdateHelpMenuNextQuestionLogic constructor. - * @param CanFetchHelpMenuQuestionList $canFetchHelpMenuQuestionList + * @param CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion * @param SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor * @param FetchNextHelpMenuQuestionProcessor $fetchNextHelpMenuQuestionProcessor * @param FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor * @param DeleteHelpMenuAnswerProcessor $deleteHelpMenuAnswerProcessor */ - public function __construct(CanFetchHelpMenuQuestionList $canFetchHelpMenuQuestionList, SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor, FetchNextHelpMenuQuestionProcessor $fetchNextHelpMenuQuestionProcessor, FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor, CreatesPerfexCRMSupportTicket $createsPerfexCRMSupportTicket, FetchesPerfexCRMCustomer $fetchesPerfexCRMCustomer, DeleteHelpMenuAnswerProcessor $deleteHelpMenuAnswerProcessor) + public function __construct(CanFetchHelpMenuQuestion $canFetchHelpMenuQuestion, SaveHelpMenuAnswerProcessor $saveHelpMenuAnswerProcessor, FetchNextHelpMenuQuestionProcessor $fetchNextHelpMenuQuestionProcessor, FetchFirstHelpMenuQuestionProcessor $fetchFirstHelpMenuQuestionProcessor, CreatesPerfexCRMSupportTicket $createsPerfexCRMSupportTicket, FetchesPerfexCRMCustomer $fetchesPerfexCRMCustomer, DeleteHelpMenuAnswerProcessor $deleteHelpMenuAnswerProcessor) { - $this->canFetchHelpMenuQuestionList = $canFetchHelpMenuQuestionList; + $this->canFetchHelpMenuQuestion = $canFetchHelpMenuQuestion; $this->saveHelpMenuAnswerProcessor = $saveHelpMenuAnswerProcessor; $this->fetchNextHelpMenuQuestionProcessor = $fetchNextHelpMenuQuestionProcessor; $this->fetchFirstHelpMenuQuestionProcessor = $fetchFirstHelpMenuQuestionProcessor; @@ -85,14 +85,20 @@ class UpdateHelpMenuNextQuestionLogic extends AbstractControllerLogic $questionId = $currentQuestion['id']; $questionType = $currentQuestion['question_type']; - $this->canFetchHelpMenuQuestionList->passes(); + $this->canFetchHelpMenuQuestion->passes(); //Delete answer $this->deleteHelpMenuAnswerProcessor->execute($userId, $questionId, $request); //Save answer given by user if (!$request->has('isPrevious')) { - $this->saveHelpMenuAnswerProcessor->execute($userId, $questionId, $request); + $filesUpload = $request->input('files'); + $answerOptionId = 0; + if ($request->has('answerObj')) { + $answerOptionId = intval($request->answerObj['id']); + } + $answerInText = $request->answer; + $this->saveHelpMenuAnswerProcessor->execute($userId, 0, $questionId, $answerInText, $answerOptionId, $filesUpload); } //Create ticket at crm diff --git a/app/Classes/Modules/HelpMenu/DataTransferObjects/QAUserSourceObject.php b/app/Classes/Modules/HelpMenu/DataTransferObjects/QAUserSourceObject.php new file mode 100644 index 00000000..3c0791c5 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/DataTransferObjects/QAUserSourceObject.php @@ -0,0 +1,55 @@ +system = $system; + $this->marking = $marking; + $this->email = $email; + } + + /** + * @return string + */ + public function getSystem(): string + { + return $this->system; + } + + /** + * @return string + */ + public function getMarking(): string + { + return $this->marking; + } + + /** + * @return string + */ + public function getEmail(): string + { + return $this->email; + } + +} diff --git a/app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php b/app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php index 1df15ae8..2ba8b928 100644 --- a/app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php +++ b/app/Classes/Modules/HelpMenu/Processors/DeleteHelpMenuAnswerProcessor.php @@ -4,32 +4,32 @@ namespace App\Classes\Modules\HelpMenu\Processors; use App\Models\QAUserAnswerSelected; use App\Classes\Modules\HelpMenu\Services\FetchesHelpMenuUserAnswerSelected; -use App\Classes\Modules\HelpMenu\Services\FetchesHelpMenuUserAnswerSelectedList; +use App\Classes\Modules\HelpMenu\Services\ListsHelpMenuUserAnswerSelected; class DeleteHelpMenuAnswerProcessor { /** @var FetchesHelpMenuUserAnswerSelected */ private $fetchesHelpMenuUserAnswerSelected; - /** @var FetchesHelpMenuUserAnswerSelectedList */ - private $fetchesHelpMenuUserAnswerSelectedList; + /** @var ListsHelpMenuUserAnswerSelected */ + private $listsHelpMenuUserAnswerSelected; /** * DeleteHelpMenuAnswerProcessor constructor. * @param FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected - * @param FetchesHelpMenuUserAnswerSelectedList $fetchesHelpMenuUserAnswerSelectedList + * @param ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected */ - public function __construct(FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected, FetchesHelpMenuUserAnswerSelectedList $fetchesHelpMenuUserAnswerSelectedList) + public function __construct(FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected, ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected) { $this->fetchesHelpMenuUserAnswerSelected = $fetchesHelpMenuUserAnswerSelected; - $this->fetchesHelpMenuUserAnswerSelectedList = $fetchesHelpMenuUserAnswerSelectedList; + $this->listsHelpMenuUserAnswerSelected = $listsHelpMenuUserAnswerSelected; } public function execute($userId, $questionId, $request){ if ($request->has('isPrevious')) { //Get current and previous question's answer try{ - $selectedAnswer = $this->fetchesHelpMenuUserAnswerSelectedList->execute(['user_id' => $userId, 'question_id' => $questionId, 'order_by' => (object)['column' => 'id','DESC' => true]])[0]; + $selectedAnswer = $this->listsHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'question_id' => $questionId, 'order_by' => (object)['column' => 'id','DESC' => true]])[0]; } catch (\Exception $exception){ $selectedAnswer = null; } diff --git a/app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php b/app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php index ec9cc63c..f832c280 100644 --- a/app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php +++ b/app/Classes/Modules/HelpMenu/Processors/FetchNextHelpMenuQuestionProcessor.php @@ -4,7 +4,7 @@ namespace App\Classes\Modules\HelpMenu\Processors; use App\Classes\Modules\HelpMenu\Services\FetchesHelpMenuQuestion; use App\Classes\Modules\HelpMenu\Services\FetchesHelpMenuUserAnswerSelected; -use App\Classes\Modules\HelpMenu\Services\FetchesHelpMenuUserAnswerSelectedList; +use App\Classes\Modules\HelpMenu\Services\ListsHelpMenuUserAnswerSelected; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Classes\ValueObjects\Constants\QAType; @@ -17,19 +17,19 @@ class FetchNextHelpMenuQuestionProcessor /** @var FetchesHelpMenuUserAnswerSelected */ private $fetchesHelpMenuUserAnswerSelected; - /** @var FetchesHelpMenuUserAnswerSelectedList */ - private $fetchesHelpMenuUserAnswerSelectedList; + /** @var ListsHelpMenuUserAnswerSelected */ + private $listsHelpMenuUserAnswerSelected; /** * FetchNextHelpMenuQuestionProcessor constructor. * @param FetchesHelpMenuQuestion $fetchesHelpMenuQuestion * @param FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected - * @param FetchesHelpMenuUserAnswerSelectedList $fetchesHelpMenuUserAnswerSelectedList + * @param ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected */ - public function __construct(FetchesHelpMenuQuestion $fetchesHelpMenuQuestion, FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected, FetchesHelpMenuUserAnswerSelectedList $fetchesHelpMenuUserAnswerSelectedList) + public function __construct(FetchesHelpMenuQuestion $fetchesHelpMenuQuestion, FetchesHelpMenuUserAnswerSelected $fetchesHelpMenuUserAnswerSelected, ListsHelpMenuUserAnswerSelected $listsHelpMenuUserAnswerSelected) { $this->fetchesHelpMenuQuestion = $fetchesHelpMenuQuestion; $this->fetchesHelpMenuUserAnswerSelected = $fetchesHelpMenuUserAnswerSelected; - $this->fetchesHelpMenuUserAnswerSelectedList = $fetchesHelpMenuUserAnswerSelectedList; + $this->listsHelpMenuUserAnswerSelected = $listsHelpMenuUserAnswerSelected; } public function execute(Request $request){ @@ -55,7 +55,7 @@ class FetchNextHelpMenuQuestionProcessor if ($request->has('isPrevious')) { $userId = Auth::user()->id; - $previousAnswer = $this->fetchesHelpMenuUserAnswerSelectedList->execute(['user_id' => $userId, 'order_by' => (object)['column' => 'id','DESC' => true]])[0]; + $previousAnswer = $this->listsHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'order_by' => (object)['column' => 'id','DESC' => true]])[0]; //Get previous question $previousQuestion = $this->fetchesHelpMenuQuestion->execute(['questionnaire_set_id' => 1, 'id' => $previousAnswer['question_id']]); diff --git a/app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php b/app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php index c89a71cc..23a5c34f 100644 --- a/app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php +++ b/app/Classes/Modules/HelpMenu/Processors/SaveHelpMenuAnswerProcessor.php @@ -26,30 +26,29 @@ class SaveHelpMenuAnswerProcessor $this->uploadDocumentForHelpMenuProcessor = $uploadDocumentForHelpMenuProcessor; } - public function execute($userId, $questionId, $request){ - $filesUpload = $request->input('files'); + public function execute($userId, $sourceId, $questionId, $answerInText, $answerOptionId, $filesUpload){ + $answer = null; - try{ - // $answer = $this->fetchesHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'question_id' => $questionId, 'order_by' => ['column' => 'id','DESC' => 1]]); - $answer = $this->fetchesHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'question_id' => $questionId]); - } catch (\Exception $exception){ - $answer = null; - } + // try{ + // // $answer = $this->fetchesHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'question_id' => $questionId, 'order_by' => ['column' => 'id','DESC' => 1]]); + // $answer = $this->fetchesHelpMenuUserAnswerSelected->execute(['user_id' => $userId, 'user_id' => $sourceId, 'question_id' => $questionId]); + // } catch (\Exception $exception){ + // $answer = null; + // } if(is_null($answer)) { $answer = new QAUserAnswerSelected; } $answer->user_id = $userId; + $answer->source_id = $sourceId; $answer->question_id = $questionId; - if ($request->has('answerObj')) { - $answer->answer_option_id = intval($request->answerObj['id']); - } - $answer->free_text_answer = $request->answer; + $answer->answer_option_id = intval($answerOptionId); + $answer->free_text_answer = $answerInText; $answer->save(); if($filesUpload){ - $result = $this->uploadDocumentForHelpMenuProcessor->execute($request, $answer); + $result = $this->uploadDocumentForHelpMenuProcessor->execute($filesUpload, $answer); $newData = array_map(function ($item) { return [ 'document_id' => $item->document_id, diff --git a/app/Classes/Modules/HelpMenu/Processors/UserSourceForQAProcessor.php b/app/Classes/Modules/HelpMenu/Processors/UserSourceForQAProcessor.php new file mode 100644 index 00000000..3ed66deb --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Processors/UserSourceForQAProcessor.php @@ -0,0 +1,70 @@ +fetchesUser = $fetchesUser; + $this->fetchesQAUserSource = $fetchesQAUserSource; + $this->createsQAUserSource = $createsQAUserSource; + } + + public function execute($system, $customerMarking, $email){ + $result = []; + $isFound = false; + if((int)$system === QASystemSourceType::IZYIM){ + try{ + $query = $this->fetchesUser->execute(['email' => $email]); + $result['userId'] = $query->id; + $result['sourceId'] = 0; + $isFound = true; + } catch (ResourceNotFoundException $exception){ + $isFound = false; + } + } + + if(!$isFound){ + try{ + $query = $this->fetchesQAUserSource->execute(['email' => $email]); + $result['userId'] = 0; + $result['sourceId'] = $query->id; + } catch (ResourceNotFoundException $exception){ + $result['sourceId'] = 0; + } + + if($result['sourceId'] === 0){ + $new_object = new QAUserSourceObject($system, $customerMarking, $email); + $query = $this->createsQAUserSource->execute($new_object); + $result['userId'] = 0; + $result['sourceId'] = $query->id; + } + } + + return $result; + } +} diff --git a/app/Classes/Modules/HelpMenu/Services/CreatesQAUserSource.php b/app/Classes/Modules/HelpMenu/Services/CreatesQAUserSource.php new file mode 100644 index 00000000..a55cd6b1 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Services/CreatesQAUserSource.php @@ -0,0 +1,25 @@ +system = $object->getSystem(); + $model->marking = $object->getMarking(); + $model->email = $object->getEmail(); + + return $this->handler($model); + + } +} diff --git a/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuQuestion.php b/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuQuestion.php index e0acb1f6..8491cb77 100644 --- a/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuQuestion.php +++ b/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuQuestion.php @@ -2,7 +2,6 @@ namespace App\Classes\Modules\HelpMenu\Services; - use App\Classes\General\Eloquent\AbstractFetchRecord; use Illuminate\Database\Eloquent\Builder; use App\Models\QAQuestions; diff --git a/app/Classes/Modules/HelpMenu/Services/FetchesQAUserSource.php b/app/Classes/Modules/HelpMenu/Services/FetchesQAUserSource.php new file mode 100644 index 00000000..7c40a0ad --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Services/FetchesQAUserSource.php @@ -0,0 +1,33 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/HelpMenu/Services/ListsHelpMenuQuestions.php b/app/Classes/Modules/HelpMenu/Services/ListsHelpMenuQuestions.php new file mode 100644 index 00000000..572197fc --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Services/ListsHelpMenuQuestions.php @@ -0,0 +1,32 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelectedList.php b/app/Classes/Modules/HelpMenu/Services/ListsHelpMenuUserAnswerSelected.php similarity index 81% rename from app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelectedList.php rename to app/Classes/Modules/HelpMenu/Services/ListsHelpMenuUserAnswerSelected.php index c746494a..96ee660f 100644 --- a/app/Classes/Modules/HelpMenu/Services/FetchesHelpMenuUserAnswerSelectedList.php +++ b/app/Classes/Modules/HelpMenu/Services/ListsHelpMenuUserAnswerSelected.php @@ -6,14 +6,14 @@ use App\Classes\General\Eloquent\AbstractListRecord; use Illuminate\Database\Eloquent\Builder; use App\Models\QAUserAnswerSelected; -class FetchesHelpMenuUserAnswerSelectedList extends AbstractListRecord +class ListsHelpMenuUserAnswerSelected extends AbstractListRecord { /** @var QAUserAnswerSelected */ private $repository; /** - * FetchesHelpMenuUserAnswerSelectedList constructor. + * ListsHelpMenuUserAnswerSelected constructor. * @param QAUserAnswerSelected $repository */ public function __construct(QAUserAnswerSelected $repository) diff --git a/app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestionList.php b/app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestion.php similarity index 83% rename from app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestionList.php rename to app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestion.php index 5bb272dc..61e3ef03 100644 --- a/app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestionList.php +++ b/app/Classes/Modules/HelpMenu/Standards/Rules/CanFetchHelpMenuQuestion.php @@ -5,8 +5,9 @@ namespace App\Classes\Modules\HelpMenu\Standards\Rules; use App\Classes\General\Abstracts\AbstractRule; -class CanFetchHelpMenuQuestionList extends AbstractRule +class CanFetchHelpMenuQuestion extends AbstractRule { + /** * @return bool */ @@ -17,7 +18,7 @@ class CanFetchHelpMenuQuestionList extends AbstractRule } /** - * @param $object + * @param $object * @return bool */ protected function validators($object): bool @@ -26,7 +27,7 @@ class CanFetchHelpMenuQuestionList extends AbstractRule } /** - * @param $object + * @param $object * @return bool */ protected function criteria($object): bool diff --git a/app/Classes/Modules/HelpMenu/Standards/Rules/CanGenerateFeedbackUrl.php b/app/Classes/Modules/HelpMenu/Standards/Rules/CanGenerateFeedbackUrl.php new file mode 100644 index 00000000..6179f7ea --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Standards/Rules/CanGenerateFeedbackUrl.php @@ -0,0 +1,38 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/HelpMenu/ListHelpMenuQuestionsController.php b/app/Http/Controllers/HelpMenu/ListHelpMenuQuestionsController.php new file mode 100644 index 00000000..284f4386 --- /dev/null +++ b/app/Http/Controllers/HelpMenu/ListHelpMenuQuestionsController.php @@ -0,0 +1,19 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/HelpMenu/ListQAController.php b/app/Http/Controllers/HelpMenu/ListQAController.php new file mode 100644 index 00000000..b15dc15c --- /dev/null +++ b/app/Http/Controllers/HelpMenu/ListQAController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/HelpMenu/SubmitQAQuestionsController.php b/app/Http/Controllers/HelpMenu/SubmitQAQuestionsController.php new file mode 100644 index 00000000..6cd03d9b --- /dev/null +++ b/app/Http/Controllers/HelpMenu/SubmitQAQuestionsController.php @@ -0,0 +1,19 @@ +execute($request); + } +} diff --git a/app/Http/Resources/HelpMenuQuestionResource.php b/app/Http/Resources/HelpMenuQuestionResource.php index b14f409b..e41aeb53 100644 --- a/app/Http/Resources/HelpMenuQuestionResource.php +++ b/app/Http/Resources/HelpMenuQuestionResource.php @@ -34,7 +34,7 @@ class HelpMenuQuestionResource extends JsonResource 'question_number' => $q->question_number, 'question_text' => $q->question_text, 'question_type' => $q->question_type, - 'question_answers' => HelpMenuAnswerOptionsResource::collection(QAAnswerOptions::where('question_number', $q->question_number)->get()), + 'question_answers' => HelpMenuAnswerOptionsResource::collection(QAAnswerOptions::where('question_number', $q->question_number)->where('questionnaire_set_id', $q->questionnaire_set_id)->get()), 'questionnaire_set_id' => $q->questionnaire_set_id, 'next_nested_question' => $q->next_nested_question, 'next_main_question' => $q->next_main_question, diff --git a/app/Http/Resources/HelpMenuQuestionsAnswersResource.php b/app/Http/Resources/HelpMenuQuestionsAnswersResource.php new file mode 100644 index 00000000..8dc59fa0 --- /dev/null +++ b/app/Http/Resources/HelpMenuQuestionsAnswersResource.php @@ -0,0 +1,39 @@ +question_id)->first(); + $source = new HelpMenuUserSourceResource($this->userSource); + $user = $this->source_id === 0 ? new UserResource($this->user) : null; + + if($user){ + $user_marking = $user->companyModule()->first()->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference; + } + + return [ + 'question_id' => $this->question_id, + 'questionnaire_set_id' => $question ? $question->questionnaire_set_id : null, + 'question_text' => $question ? $question->question_text : null, + 'free_text_answer' => $this->free_text_answer, + 'source_system' => $user ? QASystemSourceType::getText(QASystemSourceType::IZYIM) : QASystemSourceType::getText($source->system), + 'source_marking' => $user ? $user_marking : $source->marking, + 'source_email' => $user ? $user->email : $source->email, + 'created_at' => Carbon::parse($this->created_at)->format('d-m-Y'), + ]; + } +} diff --git a/app/Http/Resources/HelpMenuUserSourceResource.php b/app/Http/Resources/HelpMenuUserSourceResource.php new file mode 100644 index 00000000..e02d35ff --- /dev/null +++ b/app/Http/Resources/HelpMenuUserSourceResource.php @@ -0,0 +1,23 @@ + $this->system, + 'email' => $this->email, + 'marking' => $this->marking, + ]; + } +} diff --git a/app/Models/QAUserAnswerSelected.php b/app/Models/QAUserAnswerSelected.php index 25d9ef9d..50de039d 100644 --- a/app/Models/QAUserAnswerSelected.php +++ b/app/Models/QAUserAnswerSelected.php @@ -21,4 +21,21 @@ class QAUserAnswerSelected extends AbstractModel implements Documentable { return $this->morphMany(Document::class, 'owner'); } + + /** + * @return BelongsTo + */ + public function userSource(): BelongsTo + { + return $this->BelongsTo(QAUserSource::class, 'source_id', 'id'); + } + + /** + * @return BelongsTo + */ + public function user(): BelongsTo + { + return $this->BelongsTo(User::class, 'user_id', 'id'); + } + } diff --git a/app/Models/QAUserSource.php b/app/Models/QAUserSource.php new file mode 100644 index 00000000..21401df5 --- /dev/null +++ b/app/Models/QAUserSource.php @@ -0,0 +1,9 @@ +id(); $table->string('name'); $table->string('description')->nullable(); - $table->unsignedSmallInteger('order')->default(0); + $table->unsignedBigInteger('order')->default(0); $table->unsignedBigInteger('next_set')->nullable(); - $table->unsignedSmallInteger('version')->default(1); + $table->unsignedBigInteger('version')->default(1); $table->timestamps(); $table->softDeletes(); }); diff --git a/database/migrations/2023_02_20_134124_create_qa_questions_table.php b/database/migrations/2023_02_20_134124_create_qa_questions_table.php index 9a64c4bc..881085aa 100644 --- a/database/migrations/2023_02_20_134124_create_qa_questions_table.php +++ b/database/migrations/2023_02_20_134124_create_qa_questions_table.php @@ -24,7 +24,7 @@ class CreateQAQuestionsTable extends Migration $table->tinyInteger('is_start'); $table->tinyInteger('is_end'); $table->string('end_text')->nullable(); - $table->unsignedInteger('order')->default(0); + $table->unsignedBigInteger('order')->default(0); $table->timestamps(); $table->softDeletes(); diff --git a/database/migrations/2023_02_21_091314_create_qa_answer_options_table.php b/database/migrations/2023_02_21_091314_create_qa_answer_options_table.php index dd3b118e..7c9fcc39 100644 --- a/database/migrations/2023_02_21_091314_create_qa_answer_options_table.php +++ b/database/migrations/2023_02_21_091314_create_qa_answer_options_table.php @@ -17,11 +17,15 @@ class CreateQAAnswerOptionsTable extends Migration $table->id(); $table->text('display_text'); $table->string('value'); - $table->unsignedSmallInteger('order')->default(0); + $table->unsignedBigInteger('order')->default(0); $table->unsignedBigInteger('question_number'); $table->unsignedBigInteger('next_question_number')->nullable(); + $table->unsignedBigInteger('questionnaire_set_id'); $table->timestamps(); $table->softDeletes(); + + $table->foreign('questionnaire_set_id')->references('id')->on('qa_questionnaire_sets'); + }); } diff --git a/database/migrations/2023_09_19_154120_create_qa_user_source_table.php b/database/migrations/2023_09_19_154120_create_qa_user_source_table.php new file mode 100644 index 00000000..638a8d44 --- /dev/null +++ b/database/migrations/2023_09_19_154120_create_qa_user_source_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('system'); + $table->string('email'); + $table->string('marking'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('qa_user_source'); + } +} diff --git a/database/migrations/2023_02_21_091507_create_qa_user_answer_selected_table.php b/database/migrations/2023_09_19_164120_create_qa_user_answer_selected_table.php similarity index 73% rename from database/migrations/2023_02_21_091507_create_qa_user_answer_selected_table.php rename to database/migrations/2023_09_19_164120_create_qa_user_answer_selected_table.php index e529a1f0..3560bfba 100644 --- a/database/migrations/2023_02_21_091507_create_qa_user_answer_selected_table.php +++ b/database/migrations/2023_09_19_164120_create_qa_user_answer_selected_table.php @@ -15,7 +15,8 @@ class CreateQAUserAnswerSelectedTable extends Migration { Schema::create('qa_user_answer_selected', function (Blueprint $table) { $table->id(); - $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('user_id')->default(0); + $table->unsignedBigInteger('source_id')->default(0); $table->unsignedBigInteger('question_id'); $table->unsignedBigInteger('answer_option_id')->default(0); $table->string('free_text_answer')->nullable(); @@ -24,7 +25,8 @@ class CreateQAUserAnswerSelectedTable extends Migration $table->foreign('question_id')->references('id')->on('qa_questions'); // $table->foreign('answer_option_id')->references('id')->on('qa_answer_options'); - $table->foreign('user_id')->references('id')->on('users'); + // $table->foreign('user_id')->references('id')->on('users'); + // $table->foreign('source_id')->references('id')->on('qa_user_source'); }); } @@ -35,6 +37,6 @@ class CreateQAUserAnswerSelectedTable extends Migration */ public function down() { - Schema::dropIfExists('qa_answer_option_selections'); + Schema::dropIfExists('qa_user_answer_selected'); } } diff --git a/database/seeders/QAAnswerOptionsSeeder.php b/database/seeders/QAAnswerOptionsSeeder.php index 9a0b33ae..af13e165 100644 --- a/database/seeders/QAAnswerOptionsSeeder.php +++ b/database/seeders/QAAnswerOptionsSeeder.php @@ -9,12 +9,14 @@ class QAAnswerOptionsSeeder extends Seeder { public function run() { + //Set 1 // Option 1 for Question 10 $answerOption = new QAAnswerOptions; $answerOption->display_text = "Billing"; $answerOption->value = "Billing"; $answerOption->question_number = 10; $answerOption->next_question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 2 for Question 10 @@ -23,6 +25,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Shipping"; $answerOption->question_number = 10; $answerOption->next_question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 3 for Question 10 @@ -31,6 +34,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Returns"; $answerOption->question_number = 10; $answerOption->next_question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 4 for Question 10 @@ -39,6 +43,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Product Information"; $answerOption->question_number = 10; $answerOption->next_question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 5 for Question 10 @@ -47,6 +52,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Technical Support"; $answerOption->question_number = 10; $answerOption->next_question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 6 for Question 10 @@ -55,6 +61,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Shipping Fee Calculation"; $answerOption->question_number = 10; $answerOption->next_question_number = 600; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 7 for Question 10 @@ -63,6 +70,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Error-in Measurements"; $answerOption->question_number = 10; $answerOption->next_question_number = 700; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 8 for Question 10 @@ -71,6 +79,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->value = "Contact Us"; $answerOption->question_number = 10; $answerOption->next_question_number = 800; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 1 for Question 20 @@ -78,6 +87,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 1 for Question 20"; $answerOption->value = "Option 1 for Question 20"; $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 2 for Question 20 @@ -85,6 +95,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 2 for Question 20"; $answerOption->value = "Option 2 for Question 20"; $answerOption->question_number = 20; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 1 for Question 100 @@ -92,6 +103,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 1 for Question 100"; $answerOption->value = "Option 1 for Question 100"; $answerOption->question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 2 for Question 100 @@ -99,6 +111,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 2 for Question 100"; $answerOption->value = "Option 2 for Question 100"; $answerOption->question_number = 100; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 1 for Question 30 @@ -106,6 +119,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 1 for Question 30"; $answerOption->value = "Option 1 for Question 30"; $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 2 for Question 30 @@ -113,6 +127,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 2 for Question 30"; $answerOption->value = "Option 2 for Question 30"; $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 3 for Question 30 @@ -120,6 +135,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 3 for Question 30"; $answerOption->value = "Option 3 for Question 30"; $answerOption->question_number = 30; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); @@ -128,6 +144,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 1 for Question 300"; $answerOption->value = "Option 1 for Question 300"; $answerOption->question_number = 300; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 2 for Question 300 @@ -135,6 +152,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 2 for Question 300"; $answerOption->value = "Option 2 for Question 300"; $answerOption->question_number = 300; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 3 for Question 300 @@ -142,6 +160,7 @@ class QAAnswerOptionsSeeder extends Seeder $answerOption->display_text = "Option 3 for Question 300"; $answerOption->value = "Option 3 for Question 300"; $answerOption->question_number = 300; + $answerOption->questionnaire_set_id = 1; $answerOption->save(); // Option 1 for Question 600 @@ -150,6 +169,25 @@ class QAAnswerOptionsSeeder extends Seeder '; $answerOption->value = "Answer"; $answerOption->question_number = 600; + $answerOption->questionnaire_set_id = 1; + $answerOption->save(); + + + // Set 2 + // Option 1 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "Yes"; + $answerOption->value = "Yes"; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 3; + $answerOption->save(); + + // Option 2 for Question 10 + $answerOption = new QAAnswerOptions; + $answerOption->display_text = "No"; + $answerOption->value = "No"; + $answerOption->question_number = 10; + $answerOption->questionnaire_set_id = 3; $answerOption->save(); } } diff --git a/database/seeders/QAQuestionSeeder.php b/database/seeders/QAQuestionSeeder.php index 77e482e4..6b7321f9 100644 --- a/database/seeders/QAQuestionSeeder.php +++ b/database/seeders/QAQuestionSeeder.php @@ -16,6 +16,18 @@ class QAQuestionSeeder extends Seeder 'name' => 'Set 1', 'description' => 'This is set 1 questions', ], + [ + 'name' => 'Set 2', + 'description' => 'Customer Service Satisfaction Questions', + ], + [ + 'name' => 'Set 3', + 'description' => 'Survey Before conservation with BD ends', + ], + [ + 'name' => 'Set 4', + 'description' => 'After First Order', + ], ]; foreach ($questionnaireSets as $set) { @@ -29,134 +41,182 @@ class QAQuestionSeeder extends Seeder switch ($set['name']) { case 'Set 1': $questions = [ - [ - 'question_number' => 10, - 'question_text' => 'Please select one', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'is_start' => true, - 'is_end' => false, - ], - [ - 'question_number' => 20, - 'question_text' => 'Question text for question number 20?', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 30, - 'question_text' => 'Question text for question number 30?', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'next_nested_question' => 300, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 40, - 'question_text' => 'What is your name?', - 'question_type' => QAType::FREE_TEXT, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 50, - 'question_text' => 'The End', - 'question_type' => QAType::ANSWER, - 'is_start' => false, - 'is_end' => true, - ], - [ - 'question_number' => 60, - 'question_text' => 'We have received your request and will response as soon as possible.', - 'question_type' => QAType::TICKET_CRM, - 'is_start' => false, - 'is_end' => true, - ], - [ - 'question_number' => 100, - 'question_text' => 'Question text for question number 100?', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'next_nested_question' => 110, //200 //3 digits - first level - 'next_main_question' => 20, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 110, - 'question_text' => 'Question text for question number 110?', - 'question_type' => QAType::FREE_TEXT, - 'next_nested_question' => 1000, //1000 //4 digits - second level - 'next_main_question' => 20, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 300, - 'question_text' => 'Question text for question number 300?', - 'question_type' => QAType::MULTIPLE_CHOICES, - 'next_main_question' => 40, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 600, - 'question_text' => 'Shipping Fee Calculations', - 'question_type' => QAType::ANSWER, - 'is_start' => false, - 'is_end' => true, - ], - [ - 'question_number' => 700, - 'question_text' => 'Please enter your measurements', - 'question_type' => QAType::FREE_TEXT, - 'next_nested_question' => 710, - 'next_main_question' => 20, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 710, - 'question_text' => 'Please upload the photo proof', - 'question_type' => QAType::DOCUMENT_UPLOAD, - 'next_main_question' => 60, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 800, - 'question_text' => 'What is your name?', - 'question_type' => QAType::FREE_TEXT, - 'next_nested_question' => 810, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 810, - 'question_text' => 'Click Next to speak to our customer service', - 'question_type' => QAType::FREE_TEXT, - 'is_start' => false, - 'is_end' => true, - 'end_text' => 'We have received your request and will response as soon as possible.', - ], - [ - 'question_number' => 1000, - 'question_text' => 'Question text for question number 1000?', - 'question_type' => QAType::FREE_TEXT, - 'next_nested_question' => 10000, //10000 - 5 digits - 3rd level - 'next_main_question' => 20, - 'is_start' => false, - 'is_end' => false, - ], - [ - 'question_number' => 10000, - 'question_text' => 'Question text for question number 10000?', - 'question_type' => QAType::FREE_TEXT, - 'next_main_question' => 20, - 'is_start' => false, - 'is_end' => false, - ], - ]; - break; + [ + 'question_number' => 10, + 'question_text' => 'Please select one', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => true, + 'is_end' => false, + ], + [ + 'question_number' => 20, + 'question_text' => 'Question text for question number 20?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 30, + 'question_text' => 'Question text for question number 30?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'next_nested_question' => 300, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 40, + 'question_text' => 'What is your name?', + 'question_type' => QAType::FREE_TEXT, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 50, + 'question_text' => 'The End', + 'question_type' => QAType::ANSWER, + 'is_start' => false, + 'is_end' => true, + ], + [ + 'question_number' => 60, + 'question_text' => 'We have received your request and will response as soon as possible.', + 'question_type' => QAType::TICKET_CRM, + 'is_start' => false, + 'is_end' => true, + ], + [ + 'question_number' => 100, + 'question_text' => 'Question text for question number 100?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'next_nested_question' => 110, //200 //3 digits - first level + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 110, + 'question_text' => 'Question text for question number 110?', + 'question_type' => QAType::FREE_TEXT, + 'next_nested_question' => 1000, //1000 //4 digits - second level + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 300, + 'question_text' => 'Question text for question number 300?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'next_main_question' => 40, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 600, + 'question_text' => 'Shipping Fee Calculations', + 'question_type' => QAType::ANSWER, + 'is_start' => false, + 'is_end' => true, + ], + [ + 'question_number' => 700, + 'question_text' => 'Please enter your measurements', + 'question_type' => QAType::FREE_TEXT, + 'next_nested_question' => 710, + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 710, + 'question_text' => 'Please upload the photo proof', + 'question_type' => QAType::DOCUMENT_UPLOAD, + 'next_main_question' => 60, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 800, + 'question_text' => 'What is your name?', + 'question_type' => QAType::FREE_TEXT, + 'next_nested_question' => 810, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 810, + 'question_text' => 'Click Next to speak to our customer service', + 'question_type' => QAType::FREE_TEXT, + 'is_start' => false, + 'is_end' => true, + 'end_text' => 'We have received your request and will response as soon as possible.', + ], + [ + 'question_number' => 1000, + 'question_text' => 'Question text for question number 1000?', + 'question_type' => QAType::FREE_TEXT, + 'next_nested_question' => 10000, //10000 - 5 digits - 3rd level + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + [ + 'question_number' => 10000, + 'question_text' => 'Question text for question number 10000?', + 'question_type' => QAType::FREE_TEXT, + 'next_main_question' => 20, + 'is_start' => false, + 'is_end' => false, + ], + + ]; + break; + case 'Set 2': + $questions = [ + [ + 'question_number' => 10, + 'question_text' => 'How helpful is our agent towards resolving your issue?', + 'question_type' => QAType::RATING_5_STARS, + 'is_start' => true, + 'is_end' => false, + ], + [ + 'question_number' => 20, + 'question_text' => 'How would you rate our customer service experience?', + 'question_type' => QAType::RATING_5_STARS, + 'is_start' => false, + 'is_end' => true, + ] + ]; + break; + case 'Set 3': + $questions = [ + [ + 'question_number' => 10, + 'question_text' => 'Is our service suite for you?', + 'question_type' => QAType::MULTIPLE_CHOICES, + 'is_start' => true, + 'is_end' => false, + ], + [ + 'question_number' => 20, + 'question_text' => 'Can you rate our sales agent performance whether you comfortable when chatting with them', + 'question_type' => QAType::RATING_5_STARS, + 'is_start' => false, + 'is_end' => true, + ] + ]; + break; + case 'Set 4': + $questions = [ + [ + 'question_number' => 10, + 'question_text' => 'How satisfy you are after your first order?', + 'question_type' => QAType::RATING_5_STARS, + 'is_start' => true, + 'is_end' => false, + ] + ]; + break; } foreach ($questions as $key => $questionData) { diff --git a/resources/assets/vue/components/feedback/elements/QuestionAnswerComponent.vue b/resources/assets/vue/components/feedback/elements/QuestionAnswerComponent.vue new file mode 100644 index 00000000..14b42e1c --- /dev/null +++ b/resources/assets/vue/components/feedback/elements/QuestionAnswerComponent.vue @@ -0,0 +1,17 @@ + + diff --git a/resources/assets/vue/components/feedback/forms/FeedbackFormComponent.vue b/resources/assets/vue/components/feedback/forms/FeedbackFormComponent.vue new file mode 100644 index 00000000..81862891 --- /dev/null +++ b/resources/assets/vue/components/feedback/forms/FeedbackFormComponent.vue @@ -0,0 +1,170 @@ + + + diff --git a/resources/assets/vue/components/feedback/forms/GenerateFeedbackLinkFormComponent.vue b/resources/assets/vue/components/feedback/forms/GenerateFeedbackLinkFormComponent.vue new file mode 100644 index 00000000..1cd7f23a --- /dev/null +++ b/resources/assets/vue/components/feedback/forms/GenerateFeedbackLinkFormComponent.vue @@ -0,0 +1,99 @@ + + diff --git a/resources/assets/vue/components/feedback/sections/AdminFeedbackCustomerSectionComponent.vue b/resources/assets/vue/components/feedback/sections/AdminFeedbackCustomerSectionComponent.vue new file mode 100644 index 00000000..1466305f --- /dev/null +++ b/resources/assets/vue/components/feedback/sections/AdminFeedbackCustomerSectionComponent.vue @@ -0,0 +1,12 @@ + + diff --git a/resources/assets/vue/components/feedback/sections/FeedbackCustomerSectionComponent.vue b/resources/assets/vue/components/feedback/sections/FeedbackCustomerSectionComponent.vue new file mode 100644 index 00000000..4030081a --- /dev/null +++ b/resources/assets/vue/components/feedback/sections/FeedbackCustomerSectionComponent.vue @@ -0,0 +1,53 @@ + + diff --git a/resources/assets/vue/components/general/forms/HelpMenuFormComponent.vue b/resources/assets/vue/components/general/forms/HelpMenuFormComponent.vue index 003a980d..bef90475 100644 --- a/resources/assets/vue/components/general/forms/HelpMenuFormComponent.vue +++ b/resources/assets/vue/components/general/forms/HelpMenuFormComponent.vue @@ -66,7 +66,7 @@
Cancel
-
{{ data.remarks.length > 0 ? 'Edit' : (question.is_end === 0 ? 'Next' : 'Finish') }}
+
{{ question.is_end === 0 ? 'Next' : 'Finish' }}
@@ -123,7 +123,7 @@ watch: { pendingQueue(inComplete, oldValue){ if(inComplete){ - this.fetchCompany(); + this.fetchFirstQuestion(); } } }, @@ -131,8 +131,7 @@ this.$store.dispatch('updateListQueue', {'name': this.section}); }, methods: { - fetchCompany(){ - this.isLoading = true; + fetchFirstQuestion(){ this.submit(route('api.helpmenu.first.question'), 'get', this.section, false, false); }, successHandler(response){ @@ -169,7 +168,7 @@ { this.closeModal(); this.reset(); - this.fetchCompany(); + this.fetchFirstQuestion(); } else{ if(this.question.is_end){ @@ -189,7 +188,7 @@ $crisp.push(["do", "message:send", ["text", "Hello there!"]]); this.closeModal(); this.reset(); - this.fetchCompany(); + this.fetchFirstQuestion(); } } else{ @@ -206,7 +205,6 @@ }, reset() { this.parameters = null; - this.isLoading = false; this.answer = ''; this.answerId = 0; this.files = []; diff --git a/resources/assets/vue/general/mixins/guards.js b/resources/assets/vue/general/mixins/guards.js index 168d7d56..9c9245e3 100644 --- a/resources/assets/vue/general/mixins/guards.js +++ b/resources/assets/vue/general/mixins/guards.js @@ -1,7 +1,11 @@ export default { methods: { routesGuard(){ - (!this.$store.getters.isAuthenticated && this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = window.location.href.indexOf(this.route('last_mile_delivery.login')) === 0 ? this.route('last_mile_delivery.login') : this.route('login') : ''; + if(!this.$store.getters.isAuthenticated && this.isProtectedRoute()&& this.isWithTokenRoute()){ + if(window.location.href.indexOf(this.route('feedback.customer')) !== 0){ + window.location.href = window.location.href.indexOf(this.route('last_mile_delivery.login')) === 0 ? this.route('last_mile_delivery.login') : this.route('login') + } + } (this.$store.getters.isAuthenticated && !this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = [7, 8].includes(this.$store.getters.getCompanyModuleType) ? this.route('last_mile_delivery.dashboard') : this.route('dashboard') : ''; }, isProtectedRoute(){ @@ -17,4 +21,4 @@ export default { } } -} \ No newline at end of file +} diff --git a/resources/views/layouts/base_no_login.blade.php b/resources/views/layouts/base_no_login.blade.php new file mode 100644 index 00000000..28150c4f --- /dev/null +++ b/resources/views/layouts/base_no_login.blade.php @@ -0,0 +1,25 @@ +@extends('layouts.base') + +@section('content') +
+
+
+
+
+
+
+
+
+
+ @yield('inner_content') +
+
+
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/pages/feedback.blade.php b/resources/views/pages/feedback.blade.php new file mode 100644 index 00000000..d1b4c6e1 --- /dev/null +++ b/resources/views/pages/feedback.blade.php @@ -0,0 +1,39 @@ +@extends('layouts.base_portal') +@section('inner_content') +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
Question Set
+
Question Text
+
Answer
+
Source System
+
Source Marking
+
Source Email
+
Created Date
+
+
+
+ + + +
+
+
+
+
+
+@endsection diff --git a/resources/views/pages/feedback/customer.blade.php b/resources/views/pages/feedback/customer.blade.php new file mode 100644 index 00000000..5decb580 --- /dev/null +++ b/resources/views/pages/feedback/customer.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.base_no_login') +@section('inner_content') + +@endsection diff --git a/resources/views/partials/menu.blade.php b/resources/views/partials/menu.blade.php index a5842672..791fc3ea 100644 --- a/resources/views/partials/menu.blade.php +++ b/resources/views/partials/menu.blade.php @@ -152,7 +152,7 @@ + style=" fill:#000000;">
Payment And Billing
@@ -163,7 +163,7 @@ + style=" fill:#000000;">
Payment And Billing
@@ -188,6 +188,17 @@
Settings
+
+
+ +
+
+
Feedback
+
+
diff --git a/routes/api.php b/routes/api.php index 9396c38e..873d648c 100644 --- a/routes/api.php +++ b/routes/api.php @@ -24,12 +24,14 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function require __DIR__ . '/delivery.php'; + require __DIR__ . '/feedback.php'; + Route::group(['middleware' => 'valid.token'], function () { Route::get('/storage/{fileName}/fetch', 'Documents\RenderDocumentController@fileStorageServe')->where(['fileName' => '.*'])->name('storage.document.file'); Route::post('online_payment/callback', 'Billplz\CallbackBillplzController@callback')->name('online_payment.callback'); - + Route::post('/import/update-debtor/f614e339d7058904a831aad742e24d55', 'Imports\ImportUpdateDebtorController@import')->name('debtor.import'); require __DIR__ . '/company.php'; @@ -63,7 +65,7 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function require __DIR__ . '/report.php'; require __DIR__ . '/wallet.php'; - + require __DIR__ . '/contact.php'; require __DIR__ . '/help_menu.php'; diff --git a/routes/feedback.php b/routes/feedback.php new file mode 100644 index 00000000..ffd5c4a3 --- /dev/null +++ b/routes/feedback.php @@ -0,0 +1,8 @@ + 'feedback', 'as' => 'feedback.', 'namespace' => 'HelpMenu'], function () { + Route::post('/list', 'ListHelpMenuQuestionsController@list')->name('list.question'); + Route::post('/submit', 'SubmitQAQuestionsController@submit')->name('submit.questions'); +}); diff --git a/routes/help_menu.php b/routes/help_menu.php index a20c2693..60cd4150 100644 --- a/routes/help_menu.php +++ b/routes/help_menu.php @@ -5,4 +5,6 @@ use Illuminate\Support\Facades\Route; Route::group(['prefix' => 'helpmenu', 'as' => 'helpmenu.', 'namespace' => 'HelpMenu'], function () { Route::get('/question', 'FetchHelpMenuQuestionController@fetch')->name('first.question'); Route::post('/question', 'UpdateHelpMenuNextQuestionController@fetch')->name('next.question'); + Route::post('/generate', 'GenerateFeedbackUrlController@generate')->name('feedback.url.generate'); + Route::get('/list', 'ListQAController@list')->name('list.questions.answers'); }); diff --git a/routes/web.php b/routes/web.php index 52a0146e..d9a320ee 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1189,4 +1189,11 @@ Route::get('/duplicate-package-clean-up', function(){ }); +Route::get('/feedback/{token}', function ($token) { + return view('pages.feedback.customer', ['token' => $token]); +})->name('feedback.customer'); + +Route::get('/feedback', function () { + return view('pages.feedback'); +})->name('admin.feedback');