mirror of
https://gitlab.com/CIEFWorldwideSdnBhd/exchange-2.0.git
synced 2026-08-22 14:04:01 +00:00
Admin Workflow - New UI for Admin to go through questions and answers
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class EndDate implements Filter
|
||||
{
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->whereDate('created_at', '<=', Carbon::parse($value)->format('Y-m-d'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class HasQuestionnaire implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->whereHas('question', function ($subquery) use($value){
|
||||
$subquery->whereHas('questionnaire', function ($subsubquery) use($value){
|
||||
$subsubquery->where('id', $value);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
|
||||
use App\Models\QAUserAnswerSelected;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class IdAfter implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
[$id, $questionGroups] = $value;
|
||||
|
||||
$nextId = QAUserAnswerSelected::where('id', '>', $id)
|
||||
->whereIn('answer', $questionGroups)
|
||||
->orderBy('id', 'asc')
|
||||
->limit(1)
|
||||
->value('id');
|
||||
|
||||
if ($nextId) {
|
||||
return $builder->where('id', '>', $id)
|
||||
->where('id', '<', $nextId);
|
||||
}
|
||||
|
||||
return $builder->where('id', '>', $id);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class StartDate implements Filter
|
||||
{
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->whereDate('created_at', '>=', Carbon::parse($value)->format('Y-m-d'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use App\Classes\ValueObjects\Constants\QuestionGroup;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
|
||||
class WithAnswers implements Filter
|
||||
{
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->where(function ($query) use($value){
|
||||
if($value){
|
||||
$query->where('answer', '=', $value);
|
||||
}
|
||||
else{
|
||||
$query->whereIn('answer', QuestionGroup::QUESTION_GROUPS);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Exports\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Exports\Services\ExportsQuestionsAnswers;
|
||||
use App\Classes\Modules\Exports\Standards\Rules\CanExportQuestionsAnswers;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Classes\General\AWSS3Helper;
|
||||
use App\Classes\General\Helper;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
|
||||
|
||||
class ExportQuestionsAnswersLogic extends AbstractControllerLogic
|
||||
{
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Export Questions & Answers',
|
||||
'message' => 'You have successfully exported data'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var ExportsQuestionsAnswers */
|
||||
private $exportsQuestionsAnswers;
|
||||
|
||||
/** @var CanExportQuestionsAnswers */
|
||||
private $canExport;
|
||||
|
||||
/**
|
||||
* ExportFeedbackDataLogic constructor.
|
||||
* @param ExportsQuestionsAnswers $exportsQuestionsAnswers
|
||||
* @param CanExportQuestionsAnswers $canExport
|
||||
*/
|
||||
public function __construct(ExportsQuestionsAnswers $exportsQuestionsAnswers, CanExportQuestionsAnswers $canExport)
|
||||
{
|
||||
$this->exportsQuestionsAnswers = $exportsQuestionsAnswers;
|
||||
$this->canExport = $canExport;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
public function logic(Request $request) : JsonResponse
|
||||
{
|
||||
$this->canExport->passes();
|
||||
|
||||
$this->exportsQuestionsAnswers->setFilters(Helper::deserializeFilters($request->input('filters')));
|
||||
|
||||
$exportFileName = 'qas.xls';
|
||||
$filesystemDriver = Storage::getDefaultDriver();
|
||||
if($filesystemDriver === 's3'){
|
||||
return $this->response([ 'src' => AWSS3Helper::S3Exportable($exportFileName, $this->exportsQuestionsAnswers) ]);
|
||||
}
|
||||
|
||||
return $this->response([ 'src' => null ]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace App\Classes\Modules\Exports\Services;
|
||||
|
||||
|
||||
use App\Models\QAUserAnswerSelected;
|
||||
use Maatwebsite\Excel\Concerns\Exportable;
|
||||
use Maatwebsite\Excel\Concerns\FromQuery;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadingRow;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
|
||||
use App\Classes\General\Eloquent\ApplyFiltersToQuery;
|
||||
use App\Classes\ValueObjects\Constants\QuestionGroup;
|
||||
use Carbon\Carbon;
|
||||
|
||||
class ExportsQuestionsAnswers implements FromQuery, WithHeadings, WithHeadingRow, WithMapping, ShouldAutoSize
|
||||
{
|
||||
|
||||
use Exportable;
|
||||
|
||||
private $filters;
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'Id',
|
||||
'Version',
|
||||
'Question Set',
|
||||
'Question Text',
|
||||
'Answer Text',
|
||||
'Answer Value',
|
||||
'Source Email',
|
||||
'Time(Seconds)',
|
||||
'Created Date',
|
||||
'MAIN?'
|
||||
];
|
||||
}
|
||||
|
||||
public function setFilters(array $filters = []): void
|
||||
{
|
||||
$this->filters = $filters;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Illuminate\Support\Collection|mixed
|
||||
*/
|
||||
public function query()
|
||||
{
|
||||
$data = (new ApplyFiltersToQuery())->execute(QAUserAnswerSelected::query(), $this->filters, true);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param QAUserAnswerSelected $userAnswer
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function map($userAnswer): array
|
||||
{
|
||||
$source = $userAnswer->userSource;
|
||||
$user = $userAnswer->source_id === 0 ? $userAnswer->user : null;
|
||||
$answer = $userAnswer->answer()->first();
|
||||
$rows = [[
|
||||
$userAnswer->id,
|
||||
$userAnswer->question->questionnaire->version,
|
||||
$userAnswer->question->questionnaire->description,
|
||||
$userAnswer->question->question_title,
|
||||
$answer ? $answer->display_text : null,
|
||||
$answer ? $answer->value : null,
|
||||
$user ? $user->email : $source->email,
|
||||
$userAnswer->time_used_seconds,
|
||||
Carbon::parse($userAnswer->created_at)->format('d-m-Y'),
|
||||
"YES"
|
||||
]];
|
||||
|
||||
|
||||
$nextId = QAUserAnswerSelected::where('id', '>', $userAnswer->id)
|
||||
->whereIn('answer', QuestionGroup::QUESTION_GROUPS)
|
||||
->orderBy('id', 'asc')
|
||||
->limit(1)
|
||||
->value('id');
|
||||
|
||||
if ($nextId) {
|
||||
$temp = QAUserAnswerSelected::where('reference', '=', $userAnswer->reference)->where('id', '>', $userAnswer->id)
|
||||
->where('id', '<', $nextId)->get();
|
||||
}
|
||||
else{
|
||||
$temp = QAUserAnswerSelected::where('reference', '=', $userAnswer->reference)->where('id', '>', $userAnswer->id)->get();
|
||||
}
|
||||
|
||||
foreach ($temp as $relatedAnswer) {
|
||||
$source = $relatedAnswer->userSource;
|
||||
$user = $relatedAnswer->source_id === 0 ? $relatedAnswer->user : null;
|
||||
$answer = $relatedAnswer->answer()->first();
|
||||
|
||||
$rows[] = [
|
||||
$relatedAnswer->id,
|
||||
$relatedAnswer->question->questionnaire->version,
|
||||
$relatedAnswer->question->questionnaire->description,
|
||||
$relatedAnswer->question->question_title,
|
||||
$answer ? $answer->display_text : null,
|
||||
$answer ? $answer->value : null,
|
||||
$user ? $user->email : $source->email,
|
||||
$relatedAnswer->time_used_seconds,
|
||||
Carbon::parse($relatedAnswer->created_at)->format('d-m-Y'),
|
||||
];
|
||||
}
|
||||
|
||||
return $rows;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Exports\Standards\Rules;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractRule;
|
||||
use App\Classes\ValueObjects\Constants\RoleTypes;
|
||||
|
||||
class CanExportQuestionsAnswers extends AbstractRule
|
||||
{
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
protected function authorized($object): bool
|
||||
{
|
||||
if(Auth()->user()){
|
||||
$roleToCheck = Auth()->user()->type;
|
||||
if (in_array($roleToCheck, RoleTypes::ADMIN_ROLES)) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $object
|
||||
* @return bool
|
||||
*/
|
||||
protected function validators($object): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param $object
|
||||
* @return bool
|
||||
*/
|
||||
protected function criteria($object): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Questionnaires\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Questionnaires\Services\ListsQuestionnaireSet;
|
||||
use App\Classes\Modules\Questionnaires\Standards\Rules\CanListQuestions;
|
||||
use App\Http\Resources\QuestionnaireSetsResource;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ListQuestionnaireSetLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Retrieved Questionnaire Sets',
|
||||
'message' => 'You have successfully retrieved a list of questionnaire sets'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var CanListQuestions */
|
||||
private $canListQuestions;
|
||||
|
||||
/** @var ListsQuestionnaireSet */
|
||||
private $listsQuestionnaireSet;
|
||||
|
||||
/**
|
||||
* ListQuestionnaireSetLogic constructor.
|
||||
* @param CanListQuestions $canListQuestions
|
||||
* @param ListsQuestionnaireSet $listsQuestionnaires
|
||||
*/
|
||||
public function __construct(CanListQuestions $canListQuestions, ListsQuestionnaireSet $listsQuestionnaireSet)
|
||||
{
|
||||
$this->canListQuestions = $canListQuestions;
|
||||
$this->listsQuestionnaireSet = $listsQuestionnaireSet;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @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->canListQuestions->passes(); //cief todo: 74
|
||||
|
||||
$query = $this->listsQuestionnaireSet->execute($this->listsQuestionnaireSet->deserializeFilters($request->input('filters')));
|
||||
|
||||
return $this->collectionResponse(QuestionnaireSetsResource::collection($query));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Questionnaires\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Questionnaires\Services\ListsQuestionUserAnswerSelected;
|
||||
use App\Classes\Modules\Questionnaires\Standards\Rules\CanListQuestions;
|
||||
use App\Http\Resources\QuestionsAnswersResource;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ListQuestionsAnswersLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Retrieved Questions Answers',
|
||||
'message' => 'You have successfully retrieved a list of questions and answers'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var CanListQuestions */
|
||||
private $canListQuestions;
|
||||
|
||||
/** @var ListsQuestionUserAnswerSelected */
|
||||
private $listsQuestionUserAnswerSelected;
|
||||
|
||||
/**
|
||||
* ListQuestionsAnswersQALogic constructor.
|
||||
* @param CanListQuestions $canListQuestions
|
||||
* @param ListsQuestionUserAnswerSelected $listsQuestionUserAnswerSelected
|
||||
*/
|
||||
public function __construct(CanListQuestions $canListQuestions, ListsQuestionUserAnswerSelected $listsQuestionUserAnswerSelected)
|
||||
{
|
||||
$this->canListQuestions = $canListQuestions;
|
||||
$this->listsQuestionUserAnswerSelected = $listsQuestionUserAnswerSelected;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @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->canListQuestions->passes();
|
||||
|
||||
$query = $this->listsQuestionUserAnswerSelected->execute($this->listsQuestionUserAnswerSelected->deserializeFilters($request->input('filters')));
|
||||
|
||||
return $this->collectionResponse(QuestionsAnswersResource::collection($query));
|
||||
}
|
||||
|
||||
}
|
||||
+4
-4
@@ -8,7 +8,7 @@ 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\Questionnaires\Services\ListsQuestionUserAnswerSelected;
|
||||
use App\Classes\Modules\Accounts\Services\CreatesKeyValuePair;
|
||||
use App\Classes\Modules\Accounts\DataTransferObjects\KeyValuePairObject;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
@@ -43,7 +43,7 @@ class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic
|
||||
/** @var FetchFirstQuestionV1AdminWFProcessor */
|
||||
private $fetchFirstQuestionQAProcessor;
|
||||
|
||||
/** @var ListsUserAnswerSelected */
|
||||
/** @var ListsQuestionUserAnswerSelected */
|
||||
private $listsUserAnswerSelected;
|
||||
|
||||
/** @var CreatesKeyValuePair */
|
||||
@@ -55,10 +55,10 @@ class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic
|
||||
* @param SaveAnswerV1AdminWFProcessor $saveAnswerProcessor
|
||||
* @param FetchNextQuestionV1AdminWFProcessor $fetchNextQuestionQAProcessor
|
||||
* @param FetchFirstQuestionV1AdminWFProcessor $fetchFirstQuestionQAProcessor
|
||||
* @param ListsUserAnswerSelected $listsUserAnswerSelected
|
||||
* @param ListsQuestionUserAnswerSelected $listsUserAnswerSelected
|
||||
* @param CreatesKeyValuePair $createsKeyValuePair
|
||||
*/
|
||||
public function __construct(CanFetchQuestion $canFetchQuestion, SaveAnswerV1AdminWFProcessor $saveAnswerProcessor, FetchNextQuestionV1AdminWFProcessor $fetchNextQuestionQAProcessor, FetchFirstQuestionV1AdminWFProcessor $fetchFirstQuestionQAProcessor, ListsUserAnswerSelected $listsUserAnswerSelected, CreatesKeyValuePair $createsKeyValuePair)
|
||||
public function __construct(CanFetchQuestion $canFetchQuestion, SaveAnswerV1AdminWFProcessor $saveAnswerProcessor, FetchNextQuestionV1AdminWFProcessor $fetchNextQuestionQAProcessor, FetchFirstQuestionV1AdminWFProcessor $fetchFirstQuestionQAProcessor, ListsQuestionUserAnswerSelected $listsUserAnswerSelected, CreatesKeyValuePair $createsKeyValuePair)
|
||||
{
|
||||
$this->canFetchQuestion = $canFetchQuestion;
|
||||
$this->saveAnswerProcessor = $saveAnswerProcessor;
|
||||
|
||||
+2
-2
@@ -7,14 +7,14 @@ use App\Classes\General\Eloquent\AbstractListRecord;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use App\Models\QAUserAnswerSelected;
|
||||
|
||||
class ListsUserAnswerSelected extends AbstractListRecord
|
||||
class ListsQuestionUserAnswerSelected extends AbstractListRecord
|
||||
{
|
||||
|
||||
/** @var QAUserAnswerSelected */
|
||||
private $repository;
|
||||
|
||||
/**
|
||||
* ListsUserAnswerSelected constructor.
|
||||
* ListsQuestionUserAnswerSelected constructor.
|
||||
* @param QAUserAnswerSelected $repository
|
||||
*/
|
||||
public function __construct(QAUserAnswerSelected $repository)
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Questionnaires\Services;
|
||||
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractListRecord;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use App\Models\QAQuestionnaireSet;
|
||||
|
||||
class ListsQuestionnaireSet extends AbstractListRecord
|
||||
{
|
||||
|
||||
/** @var QAQuestionnaireSet */
|
||||
private $repository;
|
||||
|
||||
/**
|
||||
* ListsQuestionnaireSet constructor.
|
||||
* @param QAQuestionnaireSet $repository
|
||||
*/
|
||||
public function __construct(QAQuestionnaireSet $repository)
|
||||
{
|
||||
$this->repository = $repository;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return Builder
|
||||
*/
|
||||
public function getRepository(): Builder
|
||||
{
|
||||
return $this->repository->newQuery();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\ValueObjects\Constants;
|
||||
|
||||
final class QuestionGroup {
|
||||
|
||||
public const _1688 = '1688';
|
||||
public const APPROVE_PO = 'approve_po';
|
||||
public const FILL_PO = 'fill_po';
|
||||
|
||||
const OPTIONS_QUESTION_GROUP = [
|
||||
['text' => '1688', 'id' => QuestionGroup::_1688],
|
||||
['text' => 'approve_po', 'id' => QuestionGroup::APPROVE_PO],
|
||||
['text' => 'fill_po', 'id' => QuestionGroup::FILL_PO],
|
||||
];
|
||||
|
||||
const QUESTION_GROUPS = [
|
||||
QuestionGroup::_1688,
|
||||
QuestionGroup::APPROVE_PO,
|
||||
QuestionGroup::FILL_PO,
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Exports;
|
||||
|
||||
|
||||
use App\Classes\Modules\Exports\ControllersLogic\ExportQuestionsAnswersLogic;
|
||||
use Illuminate\Http\Request;
|
||||
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
|
||||
class ExportQuestionsAnswersController
|
||||
{
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param ExportQuestionsAnswersLogic $logic
|
||||
* @return BinaryFileResponse
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function export(Request $request, ExportQuestionsAnswersLogic $logic) {
|
||||
return $logic->execute($request);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace App\Http\Controllers\AdminWorkflow;
|
||||
namespace App\Http\Controllers\Questionnaires;
|
||||
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use App\Models\Booking;
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Questionnaires;
|
||||
|
||||
|
||||
use App\Classes\Modules\Questionnaires\ControllersLogic\ListQuestionnaireSetLogic;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ListQuestionnaireSetController
|
||||
{
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param ListQuestionnaireSetLogic $logic
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function list(Request $request, ListQuestionnaireSetLogic $logic): JsonResponse {
|
||||
return $logic->execute($request);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Questionnaires;
|
||||
|
||||
|
||||
use App\Classes\Modules\Questionnaires\ControllersLogic\ListQuestionsAnswersLogic;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ListQuestionsAnswersController
|
||||
{
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param ListQuestionsAnswersQALogic $logic
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function list(Request $request, ListQuestionsAnswersLogic $logic): JsonResponse {
|
||||
return $logic->execute($request);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -16,8 +16,9 @@ class QuestionnaireSetsResource extends JsonResource
|
||||
public function toArray($request)
|
||||
{
|
||||
return [
|
||||
// 'name' => $this->name,
|
||||
// 'description' => $this->description,
|
||||
'id' => $this->id,
|
||||
'name' => $this->name,
|
||||
'description' => $this->description,
|
||||
'group' => $this->group,
|
||||
'version' => $this->version,
|
||||
];
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
namespace App\Http\Resources;
|
||||
|
||||
|
||||
use App\Classes\ValueObjects\Constants\DocumentType;
|
||||
use App\Classes\ValueObjects\Constants\QuestionGroup;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
use App\Models\QAAnswerOptions;
|
||||
use App\Models\QAQuestions;
|
||||
@@ -24,20 +26,27 @@ class QuestionsAnswersResource extends JsonResource
|
||||
$answerOption = QAAnswerOptions::where('id', $this->answer_option_id)->first();
|
||||
|
||||
$user_marking = '';
|
||||
if($user){
|
||||
$companyModule = $user->companyModule()->first();
|
||||
$user_marking = $companyModule ? $companyModule->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference : "";
|
||||
}
|
||||
// if($user){
|
||||
// $companyModule = $user->companyModule()->first();
|
||||
// $user_marking = $companyModule ? $companyModule->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference : "";
|
||||
// }
|
||||
|
||||
return [
|
||||
'id' => $this->id,
|
||||
'question_id' => $this->question_id,
|
||||
'question_groups' => QuestionGroup::QUESTION_GROUPS,
|
||||
'questionnaire' => new QuestionnaireSetsResource($this->question->questionnaire),
|
||||
'question_title' => $question ? $question->question_title : null,
|
||||
'question_type' => $question ? $question->question_type : 0,
|
||||
'question_metadata' => $this->question_metadata,
|
||||
'answer' => $answerOption ? $answerOption->display_text : null,
|
||||
'answer_value' => $answerOption ? $answerOption->value : null,
|
||||
'answer_value' => $this->answer,
|
||||
'documents' => new DocumentResource($this->documents->whereIn('document_type', DocumentType::ADMIN_WORK_FLOW)->first()),
|
||||
'reference' => $this->reference,
|
||||
'source_system' => null,
|
||||
'source_marking' => $user ? $user_marking : $source->marking,
|
||||
'source_email' => $user ? $user->email : $source->email,
|
||||
'time' => $this->time_used_seconds,
|
||||
'created_at' => Carbon::parse($this->created_at)->format('d-m-Y'),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -16,4 +16,12 @@ class QAQuestions extends AbstractModel
|
||||
{
|
||||
return $this->BelongsTo(QAQuestionnaireSet::class, 'questionnaire_set_id', 'id');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return HasMany
|
||||
*/
|
||||
public function userAnswers()
|
||||
{
|
||||
return $this->hasMany(QAUserAnswerSelected::class, 'question_id', 'id');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddGroupToQaQuestionsTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('qa_questions', function (Blueprint $table) {
|
||||
$table->string('group')->after('questionnaire_set_id')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('questionnaire_set_id', function (Blueprint $table) {
|
||||
$table->dropColumn('group');
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ use Database\Seeders\CompaniesTableDevelopmentSeeder;
|
||||
use Database\Seeders\CurrenciesTableDevelopmentSeeder;
|
||||
use Database\Seeders\CurrencyRatesTableDevelopmentSeeder;
|
||||
use Database\Seeders\DummyDataSeeder;
|
||||
use Database\Seeders\QAWorkFlowSeeder;
|
||||
use Database\Seeders\SegmentConstantsTableDevelopmentSeeder;
|
||||
use Database\Seeders\SegmentsTableDevelopmentSeeder;
|
||||
use Database\Seeders\ServiceTypesTableDevelopmentSeeder;
|
||||
@@ -20,7 +21,7 @@ class DatabaseSeeder extends Seeder
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
DB::beginTransaction();
|
||||
DB::beginTransaction();
|
||||
|
||||
//General
|
||||
$this->call(CountriesTableSeeder::class);
|
||||
@@ -49,7 +50,7 @@ class DatabaseSeeder extends Seeder
|
||||
}
|
||||
|
||||
// Admin Work Flow
|
||||
// $this->call(QAWorkFlow2Seeder::class);
|
||||
// $this->call(QAWorkFlowSeeder::class);
|
||||
|
||||
// DB::commit();
|
||||
}
|
||||
|
||||
@@ -1,13 +1,21 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use App\Models\QAQuestionnaireSet;
|
||||
use App\Models\QAQuestions;
|
||||
use App\Models\QAAnswerOptions;
|
||||
use App\Classes\ValueObjects\Constants\QAType;
|
||||
|
||||
class QAWorkFlow2Seeder extends Seeder
|
||||
class QAWorkFlowSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
$questionnaireSets = [
|
||||
@@ -27,6 +35,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Yes', 'value' => 'start_work', 'next_question_number' => 'start_work'],
|
||||
['display_text' => 'No', 'value' => 'no_work', 'next_question_number' => 'no_work'],
|
||||
],
|
||||
'group' => '',
|
||||
],
|
||||
[
|
||||
'question_number' => 'start_work',
|
||||
@@ -39,6 +48,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Approve PO', 'value' => 'approve_po', 'next_question_number' => 'approve_po'],
|
||||
['display_text' => 'Fill PO', 'value' => 'fill_po', 'next_question_number' => 'fill_po'],
|
||||
],
|
||||
'group' => '',
|
||||
],
|
||||
[
|
||||
'question_number' => 'no_work',
|
||||
@@ -46,6 +56,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
'question_type' => QAType::DEFAULT,
|
||||
'is_start' => false,
|
||||
'is_end' => true,
|
||||
'group' => '',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688',
|
||||
@@ -58,6 +69,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Login Issue', 'value' => '1688_login_issue', 'btn_color' => 'warning', 'next_question_number' => '1688_login_issue'],
|
||||
['display_text' => 'Login Successful', 'value' => '1688_login_successful', 'next_question_number' => '1688_login_successful'],
|
||||
],
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_login_issue',
|
||||
@@ -71,6 +83,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Others', 'value' => '1688_login_issue_others', 'next_question_number' => '1688_login_issue_others'],
|
||||
['display_text' => 'Order Cancelled', 'value' => '1688_refund_request', 'next_question_number' => '1688_refund_request'],
|
||||
],
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_login_successful',
|
||||
@@ -83,6 +96,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => "Can't verify order?", 'value' => '1688_login_successful_cannot_verify', 'next_question_number' => '1688_login_successful_cannot_verify'],
|
||||
['display_text' => 'Order Verified', 'value' => '1688_order_verify', 'next_question_number' => '1688_order_verify'],
|
||||
],
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_login_successful_cannot_verify',
|
||||
@@ -97,6 +111,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Customer did not verify 1688 account', 'value' => 'Customer did not verify 1688 account', 'next_question_number' => '1688_issue_submit'],
|
||||
['display_text' => 'WorldFirst account linked another account', 'value' => 'WorldFirst account linked another account', 'next_question_number' => '1688_issue_submit'],
|
||||
],
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_login_successful_cannot_verify_others',
|
||||
@@ -105,6 +120,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
'next_nested_question' => '1688_issue_submit',
|
||||
'is_start' => false,
|
||||
'is_end' => false,
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_order_verify',
|
||||
@@ -118,6 +134,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
'answer_options' => [
|
||||
['display_text' => 'Yes', 'value' => '1688_order_verification', 'next_question_number' => '1688_order_verification'],
|
||||
],
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_order_verification',
|
||||
@@ -129,6 +146,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Yes', 'value' => '1688_proceed_order', 'next_question_number' => '1688_proceed_order'],
|
||||
['display_text' => 'No', 'value' => '1688_insufficient_order', 'next_question_number' => '1688_insufficient_order'],
|
||||
],
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_proceed_order',
|
||||
@@ -140,6 +158,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Yes', 'value' => '1688_submit', 'next_question_number' => '1688_submit'],
|
||||
['display_text' => 'Got Issue', 'value' => '1688_proceed_order_issue', 'next_question_number' => '1688_proceed_order_issue'],
|
||||
],
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_proceed_order_issue',
|
||||
@@ -154,6 +173,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'No CrossBoarder', 'value' => 'No CrossBoarder', 'next_question_number' => '1688_issue_submit'],
|
||||
['display_text' => 'AngPau', 'value' => 'AngPau', 'next_question_number' => '1688_issue_submit'],
|
||||
],
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_proceed_order_issue_others',
|
||||
@@ -162,6 +182,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
'next_nested_question' => '1688_issue_submit',
|
||||
'is_start' => false,
|
||||
'is_end' => false,
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_login_issue_others',
|
||||
@@ -170,6 +191,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
'next_nested_question' => '1688_issue_submit',
|
||||
'is_start' => false,
|
||||
'is_end' => false,
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_submit',
|
||||
@@ -178,6 +200,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
'next_nested_question' => '1688_issue_submit',
|
||||
'is_start' => false,
|
||||
'is_end' => false,
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_issue_submit',
|
||||
@@ -189,6 +212,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Stop Working', 'value' => 'stop_working', 'next_question_number' => 'stop_working'],
|
||||
['display_text' => 'Next Order', 'value' => '1688', 'next_question_number' => '1688'],
|
||||
],
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_refund_request',
|
||||
@@ -200,6 +224,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Stop Working', 'value' => 'stop_working', 'next_question_number' => 'stop_working'],
|
||||
['display_text' => 'Next Order', 'value' => '1688', 'next_question_number' => '1688'],
|
||||
],
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => 'approve_po',
|
||||
@@ -213,6 +238,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Edit PO', 'value' => 'approve_po_edit', 'next_question_number' => 'approve_po_edit'],
|
||||
['display_text' => 'Reject', 'value' => 'approve_po_reject', 'next_question_number' => 'approve_po_reject'],
|
||||
],
|
||||
'group' => 'approve_po',
|
||||
],
|
||||
[
|
||||
'question_number' => 'fill_po',
|
||||
@@ -224,6 +250,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
'answer_options' => [
|
||||
['display_text' => 'Edit PO', 'value' => 'fill_po_edit', 'next_question_number' => 'fill_po_edit'],
|
||||
],
|
||||
'group' => 'fill_po',
|
||||
],
|
||||
[
|
||||
'question_number' => 'approve_po_filled',
|
||||
@@ -236,6 +263,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Next PO (Fill)', 'value' => 'fill_po', 'next_question_number' => 'fill_po'],
|
||||
['display_text' => 'Next PO (Approve)', 'value' => 'approve_po', 'next_question_number' => 'approve_po'],
|
||||
],
|
||||
'group' => 'approve_po',
|
||||
],
|
||||
[
|
||||
'question_number' => 'approve_po_approved',
|
||||
@@ -248,6 +276,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Next PO (Fill)', 'value' => 'fill_po', 'next_question_number' => 'fill_po'],
|
||||
['display_text' => 'Next PO (Approve)', 'value' => 'approve_po', 'next_question_number' => 'approve_po'],
|
||||
],
|
||||
'group' => 'approve_po',
|
||||
],
|
||||
[
|
||||
'question_number' => 'approve_po_edit',
|
||||
@@ -260,6 +289,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Issue?', 'value' => 'approve_po_edit_po_issue', 'next_question_number' => 'approve_po_edit_po_issue'],
|
||||
['display_text' => 'Done', 'value' => 'approve_po_filled', 'next_question_number' => 'approve_po_filled'],
|
||||
],
|
||||
'group' => 'approve_po',
|
||||
],
|
||||
[
|
||||
'question_number' => 'approve_po_reject',
|
||||
@@ -273,6 +303,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Stop Working', 'value' => 'stop_working', 'next_question_number' => 'stop_working'],
|
||||
['display_text' => 'Next Order', 'value' => 'approve_po', 'next_question_number' => 'approve_po'],
|
||||
],
|
||||
'group' => 'approve_po',
|
||||
],
|
||||
[
|
||||
'question_number' => 'approve_po_reject_others',
|
||||
@@ -281,6 +312,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
'next_nested_question' => 'approve_po_reject_others_complete',
|
||||
'is_start' => false,
|
||||
'is_end' => false,
|
||||
'group' => 'approve_po',
|
||||
],
|
||||
[
|
||||
'question_number' => 'approve_po_reject_others_complete',
|
||||
@@ -293,6 +325,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Next PO (Fill)', 'value' => 'fill_po', 'next_question_number' => 'fill_po'],
|
||||
['display_text' => 'Next PO (Approve)', 'value' => 'approve_po', 'next_question_number' => 'approve_po'],
|
||||
],
|
||||
'group' => 'approve_po',
|
||||
],
|
||||
[
|
||||
'question_number' => 'approve_po_edit_po_issue',
|
||||
@@ -304,6 +337,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Sensitive Goods', 'value' => 'Sensitive Goods', 'next_question_number' => 'fill_po_issue_submit'],
|
||||
['display_text' => 'Others', 'value' => 'fill_po_issue_others', 'next_question_number' => 'fill_po_issue_others'],
|
||||
],
|
||||
'group' => 'approve_po',
|
||||
],
|
||||
[
|
||||
'question_number' => 'fill_po_issue_others',
|
||||
@@ -312,6 +346,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
'next_nested_question' => 'fill_po_issue_submit',
|
||||
'is_start' => false,
|
||||
'is_end' => false,
|
||||
'group' => 'fill_po',
|
||||
],
|
||||
[
|
||||
'question_number' => 'fill_po_issue_submit',
|
||||
@@ -324,6 +359,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Next PO (Fill)', 'value' => 'fill_po', 'next_question_number' => 'fill_po'],
|
||||
['display_text' => 'Next PO (Approve)', 'value' => 'approve_po', 'next_question_number' => 'approve_po'],
|
||||
],
|
||||
'group' => 'fill_po',
|
||||
],
|
||||
[
|
||||
'question_number' => 'stop_working',
|
||||
@@ -331,6 +367,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
'question_type' => QAType::DEFAULT,
|
||||
'is_start' => false,
|
||||
'is_end' => true,
|
||||
'group' => '',
|
||||
],
|
||||
[
|
||||
'question_number' => '1688_insufficient_order',
|
||||
@@ -343,6 +380,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Underpaid Order', 'value' => 'underpaird_order_2', 'next_question_number' => ''],
|
||||
['display_text' => 'Overpaid Order', 'value' => 'underpaird_order_2', 'next_question_number' => ''],
|
||||
],
|
||||
'group' => '1688',
|
||||
],
|
||||
[
|
||||
'question_number' => 'fill_po_edit',
|
||||
@@ -355,6 +393,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Issue?', 'value' => 'fill_po_edit_issue', 'next_question_number' => 'fill_po_edit_issue'],
|
||||
['display_text' => 'Done', 'value' => 'fill_po_edit_filled', 'next_question_number' => 'fill_po_edit_filled'],
|
||||
],
|
||||
'group' => 'fill_po',
|
||||
],
|
||||
[
|
||||
'question_number' => 'fill_po_edit_issue',
|
||||
@@ -366,6 +405,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Sensitive Goods', 'value' => 'Sensitive Goods', 'next_question_number' => 'fill_po_issue_submit'],
|
||||
['display_text' => 'Others', 'value' => 'fill_po_issue_others', 'next_question_number' => 'fill_po_issue_others'],
|
||||
],
|
||||
'group' => 'fill_po',
|
||||
],
|
||||
[
|
||||
'question_number' => 'fill_po_edit_filled',
|
||||
@@ -378,6 +418,7 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
['display_text' => 'Next PO (Fill)', 'value' => 'fill_po', 'next_question_number' => 'fill_po'],
|
||||
['display_text' => 'Next PO (Approve)', 'value' => 'approve_po', 'next_question_number' => 'approve_po'],
|
||||
],
|
||||
'group' => 'fill_po',
|
||||
],
|
||||
]
|
||||
],
|
||||
@@ -399,6 +440,9 @@ class QAWorkFlow2Seeder extends Seeder
|
||||
}
|
||||
$question->question_type = $questionData['question_type'];
|
||||
$question->questionnaire_set_id = $questionnaireSet->id;
|
||||
if (isset($questionData['group']) && $questionData['group'] != '') {
|
||||
$question->group = $questionData['group'];
|
||||
}
|
||||
|
||||
if (isset($questionData['next_nested_question'])) {
|
||||
$question->next_nested_question = $questionData['next_nested_question'];
|
||||
@@ -0,0 +1,144 @@
|
||||
<template>
|
||||
<div class="row parentContainer m-b-10">
|
||||
<div class="col p-l-0">
|
||||
<div class="row m-l-15 p-t-10 b-a align-items-center pointer shadow bg-white rounded b-white">
|
||||
<div class="col-12">
|
||||
<div class="row m-b-10">
|
||||
<div class="col-1">{{ item.id }}</div>
|
||||
<div class="col-1">{{ item.questionnaire.version }} - {{ item.questionnaire.description }}</div>
|
||||
<div class="col-2">{{ item.question_title }}</div>
|
||||
<div class="col-1">{{ item.answer }}</div>
|
||||
<div class="col-1">{{ item.answer_value }}</div>
|
||||
<div class="col-2">{{ item.source_email }}</div>
|
||||
<div class="col-1">{{ item.time }}</div>
|
||||
<div class="col-1">{{ item.created_at }}</div>
|
||||
<div class="col parentContainer position-static">
|
||||
<div class="row align-items-center justify-content-end">
|
||||
<!-- <div class="col-auto position-static no-padding requestModal" data-type="deleteBillGroup">
|
||||
<div class="btn bg-grey no-border">
|
||||
<i class="fa fa-times text-danger"></i>
|
||||
</div>
|
||||
<modal-component class="animate__animated animate__fast animate__fadeIn" type="deleteBillGroup">
|
||||
<general-confirmation-form-component
|
||||
contentText="Are you sure you want to delete this Bill Group?"
|
||||
modalType="delete"
|
||||
class="text-center"
|
||||
:apiRoute="route('api.transaction.group.bill.delete', item.id)"
|
||||
apiMethod="delete"
|
||||
:section="section"
|
||||
>
|
||||
</general-confirmation-form-component>
|
||||
</modal-component>
|
||||
</div> -->
|
||||
<div class="col-auto no-padding" v-show="showExpandedIcon">
|
||||
<div class="btn btn-sm btn-default b-rad-none no-border" @click="expand()">
|
||||
<i class="fa fa-download" :class="[{'fa-angle-up': expanded}, {'fa-angle-down': !expanded}]"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto no-padding" v-if="loading">
|
||||
<div class="btn btn-sm btn-default b-rad-none no-border">
|
||||
<span class="spinner"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row m-b-10" v-show="expanded">
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="row align-items-center m-t-10 p-t-10 p-b-10 b-t b-grey muted all-caps fs-10">
|
||||
<div class="col-1">Id</div>
|
||||
<div class="col-2">Question Text</div>
|
||||
<div class="col-1">Answer Text</div>
|
||||
<div class="col-2">Answer Value</div>
|
||||
<div class="col-1">Time(seconds)</div>
|
||||
<div class="col-1">Order/Booking/Transfer</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<list-component style="min-height: auto;" :section="section" :endpoint="route('api.questionnaires.qa.list')" :options="options">
|
||||
<template slot="list" slot-scope="{data}">
|
||||
<question-answer-inner-component :data="data"></question-answer-inner-component>
|
||||
</template>
|
||||
</list-component>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import componentHandler from '../../../general/mixins/componentHandler';
|
||||
export default {
|
||||
data(){
|
||||
return {
|
||||
section: 'listQuestionAnswerInner-' + this.data.reference + '-' + this.data.id,
|
||||
expanded: false,
|
||||
options: {
|
||||
'order_by': {column: 'created_at', DESC: false},
|
||||
},
|
||||
showExpandedIcon: false,
|
||||
loading: true
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
pendingQueue(inComplete){
|
||||
if(!inComplete){
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
expandedList(newValue){
|
||||
if (Array.isArray(newValue)) {
|
||||
if(newValue.length > 0){
|
||||
this.showExpandedIcon = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
expandedList () {
|
||||
return this.$store.getters.getListData(this.section);
|
||||
},
|
||||
pendingQueue() {
|
||||
return this.$store.getters.isInCompleteQueue(this.section);
|
||||
}
|
||||
},
|
||||
created(){
|
||||
this.options['reference'] = this.item.reference;
|
||||
this.options['id_after'] = [this.item.id, this.item.question_groups];
|
||||
|
||||
},
|
||||
methods: {
|
||||
expand(){
|
||||
this.expanded = !this.expanded;
|
||||
},
|
||||
|
||||
},
|
||||
mixins: [componentHandler]
|
||||
}
|
||||
</script>
|
||||
<style scoped>
|
||||
.spinner {
|
||||
border: 2px solid rgba(0, 0, 0, 0.1);
|
||||
border-left-color: #000;
|
||||
border-radius: 50%;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
animation: spin 1s linear infinite;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% {
|
||||
transform: translate(-50%, -50%) rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
transform: translate(-50%, -50%) rotate(360deg);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
<template>
|
||||
<div class="row parentContainer">
|
||||
<div class="col-1">{{ item.id }}</div>
|
||||
<div class="col-2">{{ item.question_title }}</div>
|
||||
<div class="col-1">{{ item.answer }}</div>
|
||||
<div class="col-2">{{ parsedAnswer }}</div>
|
||||
<div class="col-1">{{ item.time }}</div>
|
||||
<div class="col-1">
|
||||
<a :href="route('booking.details', JSON.parse(item.question_metadata).booking.marking)"
|
||||
target="_blank">{{ JSON.parse(item.question_metadata).booking.marking }}
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-1">
|
||||
<document-file-viewer-component v-if="item.documents" :file="item.documents.files[0]">
|
||||
<template slot="button">
|
||||
<button class="btn btn-xs btn-default bg-master-lightest b-rad-none no-border">
|
||||
<i class="fa fa-eye"></i>
|
||||
</button>
|
||||
</template>
|
||||
</document-file-viewer-component>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import componentHandler from '../../../general/mixins/componentHandler';
|
||||
export default {
|
||||
computed: {
|
||||
parsedAnswer() {
|
||||
try {
|
||||
const parsed = this.item && this.item.answer_value ? JSON.parse(this.item.answer_value) : null;
|
||||
return parsed && parsed.text ? parsed.text : this.item.answer_value;
|
||||
} catch (error) {
|
||||
// console.error("Error parsing JSON:", error);
|
||||
return this.item.answer_value;
|
||||
}
|
||||
},
|
||||
},
|
||||
mixins: [componentHandler]
|
||||
}
|
||||
</script>
|
||||
+165
@@ -0,0 +1,165 @@
|
||||
|
||||
<template>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<validation-wrapper-component selectable :validator="$v.filterQuestionnaireSet">
|
||||
<label>Questionnaire Set</label>
|
||||
<selectable-component :endpoint="route('api.questionnaires.list')" :section="section + 'QuestionnaireSet'" valueColumn="id" :labelColumn="['version', 'name']" v-model="filterQuestionnaireSet"></selectable-component>
|
||||
</validation-wrapper-component>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<validation-wrapper-component selectable :validator="$v.filterQuestionGroup">
|
||||
<label>Question Group</label>
|
||||
<selectable-hard-coded-component section="questionGroupSelectable" :selectable-options="questionGroups" v-model="filterQuestionGroup"></selectable-hard-coded-component >
|
||||
</validation-wrapper-component>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<validation-wrapper-component selectable :validator="$v.filterUserId">
|
||||
<label>Users</label>
|
||||
<selectable-component :endpoint="route('api.account.user.list') + '?filters=' + JSON.stringify(userListOptions)" :section="section + 'UserList'" valueColumn="id" :labelColumn="['name', 'email']" v-model="filterUserId"></selectable-component>
|
||||
</validation-wrapper-component>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row m-t-10">
|
||||
<div class="col-md-4">
|
||||
<validation-wrapper-component :validator="$v.filterStartDate">
|
||||
<label class="all-caps">Start Date</label>
|
||||
<date-picker-component v-model.lazy="filterStartDate"></date-picker-component>
|
||||
</validation-wrapper-component>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<validation-wrapper-component :validator="$v.filterEndDate">
|
||||
<label class="all-caps">End Date</label>
|
||||
<date-picker-component v-model.lazy="filterEndDate"></date-picker-component>
|
||||
</validation-wrapper-component>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row justify-content-end m-t-10">
|
||||
<div class="col-auto p-l-0">
|
||||
<open-link-in-new-tab-component custom-class="btn btn-sm b-rad-none fs-14" :url="route('api.questionnaires.qa.export') + '?filters=' + JSON.stringify(this.options)" :is-url-protected="true" :onClick="exportAction">
|
||||
<i class="fa fa-download lh-40"></i> Download
|
||||
</open-link-in-new-tab-component>
|
||||
</div>
|
||||
<div class="col-auto p-l-0">
|
||||
<div class="btn b-rad-none" @click="resetSarch">
|
||||
<i class="fa fa-refresh lh-40"></i> Clear
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto p-l-0">
|
||||
<div class="btn btn-primary b-rad-none" @click="onSelected">
|
||||
<i class="fa fa-search lh-40"></i> Search
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row align-items-center m-t-10 p-t-10 p-b-10 b-t b-grey muted all-caps fs-10">
|
||||
<div class="col-1">Id</div>
|
||||
<div class="col-1">Version/Question Set</div>
|
||||
<div class="col-2">Question Text</div>
|
||||
<div class="col-1">Answer Text</div>
|
||||
<div class="col-1">Answer Value</div>
|
||||
<div class="col-2">Source Email</div>
|
||||
<div class="col-1">Time(seconds)</div>
|
||||
<div class="col-1">Created Date</div>
|
||||
</div>
|
||||
</div>
|
||||
<list-component style="min-height: 600px;" :key="currentKey" :section="'list' + section" :endpoint="route('api.questionnaires.qa.list')" :options="options">
|
||||
<template slot="list" slot-scope="{data}">
|
||||
<question-answer-component :key="data.id" :data="data"></question-answer-component>
|
||||
</template>
|
||||
</list-component>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { required } from "vuelidate/lib/validators";
|
||||
export default {
|
||||
props: {
|
||||
section:{
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
questionGroups: {
|
||||
type: Array,
|
||||
required: true
|
||||
},
|
||||
},
|
||||
data(){
|
||||
return {
|
||||
filterUserId: "",
|
||||
filterQuestionGroup: "",
|
||||
filterQuestionnaireSet: "",
|
||||
filterStartDate: "",
|
||||
filterEndDate: "",
|
||||
userListOptions: {
|
||||
'type_in': this.$store.getters.isSuperAdmin ? [1, 2] : [2],
|
||||
},
|
||||
options: {
|
||||
'per_page': 10,
|
||||
'order_by': {column: 'created_at', DESC: false},
|
||||
'with_answers': "",
|
||||
},
|
||||
currentKey: 1,
|
||||
}
|
||||
},
|
||||
created(){
|
||||
this.submit(route('api.company.list') + '?filters=' + JSON.stringify({'business_type': 3, 'status_in': [1, 2, 0]}), 'get', 'transactionGroupsListPaymentSection', false, false)
|
||||
},
|
||||
validations: {
|
||||
filterUserId: {},
|
||||
filterQuestionGroup: {},
|
||||
filterQuestionnaireSet: {},
|
||||
filterStartDate: {},
|
||||
filterEndDate: {},
|
||||
},
|
||||
methods: {
|
||||
onSelected(userId){
|
||||
this.updateOptions();
|
||||
this.currentKey+=1;
|
||||
// this.updateList();
|
||||
},
|
||||
updateOptions(){
|
||||
if(this.filterUserId){
|
||||
this.options['user_id'] = this.filterUserId;
|
||||
}
|
||||
if(this.filterQuestionGroup){
|
||||
this.options['with_answers'] = this.filterQuestionGroup;
|
||||
}
|
||||
if(this.filterQuestionnaireSet){
|
||||
this.options['has_questionnaire'] = this.filterQuestionnaireSet;
|
||||
}
|
||||
if(this.filterStartDate){
|
||||
this.options['start_date'] = this.filterStartDate;
|
||||
}
|
||||
if(this.filterEndDate){
|
||||
this.options['end_date'] = this.filterEndDate;
|
||||
}
|
||||
},
|
||||
exportAction(){
|
||||
this.updateOptions();
|
||||
return route('api.questionnaires.qa.export') + '?filters=' + JSON.stringify(this.options);
|
||||
},
|
||||
resetSarch() {
|
||||
this.filterUserId = "",
|
||||
this.filterQuestionGroup = "",
|
||||
this.filterQuestionnaireSet = "",
|
||||
this.filterStartDate = "",
|
||||
this.filterEndDate = "",
|
||||
this.options['with_answers'] = "";
|
||||
delete this.options['user_id'];
|
||||
delete this.options['has_questionnaire'];
|
||||
delete this.options['start_date'];
|
||||
delete this.options['end_date'];
|
||||
this.currentKey+=1;
|
||||
},
|
||||
// updateList(){
|
||||
// this.$refs.questionsAnswersList.updateFilters({'per_page': 10, 'has_questionnaire_group_in':['feedback'], 'user_id': this.filterUserId, order_by: {column: 'created_at', DESC: false}});
|
||||
// },
|
||||
},
|
||||
}
|
||||
</script>
|
||||
@@ -33,6 +33,10 @@
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
onClick: {
|
||||
type: Function,
|
||||
default: null
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@@ -75,6 +79,9 @@
|
||||
});
|
||||
},
|
||||
handleClick(){
|
||||
if(this.onClick){
|
||||
this.url = this.onClick();
|
||||
}
|
||||
this.isDownloading = true;
|
||||
if(window.LARAVEL_VAPOR_ENABLED){
|
||||
this.submit(this.url, 'get', this.section, false, false);
|
||||
|
||||
+9
-2
@@ -14,8 +14,15 @@ export default {
|
||||
getListDetails: (state) => (name) => {
|
||||
return state.queue.find(list => list.name === name);
|
||||
},
|
||||
// getListData: (state, getters) => (name) => {
|
||||
// return (!getters.isInCompleteQueue()) ? state.queue.find(list => list.name === name).data : [];
|
||||
// },
|
||||
getListData: (state, getters) => (name) => {
|
||||
return (!getters.isInCompleteQueue()) ? state.queue.find(list => list.name === name).data : [];
|
||||
if (!getters.isInCompleteQueue(name)) {
|
||||
const list = state.queue.find(list => list.name === name);
|
||||
return list ? list.data : [];
|
||||
}
|
||||
return [];
|
||||
},
|
||||
getSelectableList: (state, getters) => (name) => {
|
||||
let list = state.queue.find(list => list.name === name);
|
||||
@@ -68,4 +75,4 @@ export default {
|
||||
store.commit('SET_LIST_COMPLETE', {name: payload.name, data: payload.data});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
@extends('layouts.base_portal')
|
||||
@section('inner_content')
|
||||
<!-- <div class="row" v-if="$store.getters.isAdmin">
|
||||
<div class="col">
|
||||
<admin-feedback-customer-section-component></admin-feedback-customer-section-component>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<div class="row d-none" :class="[{'d-flex': $store.getters.isAdmin}]" v-if="$store.getters.isAdmin">
|
||||
<div class="col no-padding">
|
||||
<question-answer-section-component section="questionsAnswersSection" :question-groups="{{ json_encode(\App\Classes\ValueObjects\Constants\QuestionGroup::OPTIONS_QUESTION_GROUP) }}"></question-answer-section-component>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -5,7 +5,7 @@ use App\Classes\Modules\Accounts\Services\CreatesKeyValuePair;
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use App\Classes\ValueObjects\Constants\TransactionType;
|
||||
use App\Classes\ValueObjects\Constants\BookingAttributeNames;
|
||||
use App\Http\Controllers\AdminWorkflow\AdminWorkflowBaseController;
|
||||
use App\Http\Controllers\Questionnaires\AdminWorkflowBaseController;
|
||||
use App\Http\Resources\BookingResource;
|
||||
use App\Models\Booking;
|
||||
use App\Models\KeyValuePair;
|
||||
@@ -44,12 +44,10 @@ if (!function_exists('markedProcessing')) {
|
||||
}
|
||||
}
|
||||
|
||||
Route::group(['prefix' => 'admin-work-flow', 'as' => 'admin_work_flow.', 'namespace' => 'AdminWorkFlow'], function () {
|
||||
|
||||
Route::group(['prefix' => 'admin-work-flow', 'as' => 'admin_work_flow.', 'namespace' => 'Questionnaires'], function () {
|
||||
|
||||
Route::get('/fetch-oldest-order', [AdminWorkflowBaseController::class, 'fetchOldestOrder'])->name('fetch_oldest_order');
|
||||
|
||||
|
||||
Route::get('/fetch-pending-approved-po', function () {
|
||||
$excludedBookingIds = KeyValuePair::where('owner_type', 'App\Models\Booking')
|
||||
->where(function ($query) {
|
||||
|
||||
@@ -3,7 +3,12 @@
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::group(['prefix' => 'questionnaires', 'as' => 'questionnaires.', 'namespace' => 'Questionnaires'], function () {
|
||||
Route::get('/list', 'ListQuestionnaireSetController@list')->name('list');
|
||||
Route::get('/{set_id}', 'FetchQuestionV1AdminWFController@fetch')->name('first.question');
|
||||
Route::post('/question', 'UpdateNextQuestionV1AdminWFController@fetch')->name('next.question');
|
||||
Route::get('/list', 'ListQuestionsAnswersQAController@list')->name('list.questions.answers');
|
||||
|
||||
Route::group(['prefix' => 'qa', 'as' => 'qa.'], function () {
|
||||
Route::get('/list', 'ListQuestionsAnswersController@list')->name('list');
|
||||
Route::get('/export', '\\App\\Http\\Controllers\\Exports\\ExportQuestionsAnswersController@export')->name('export');
|
||||
});
|
||||
});
|
||||
|
||||
+6
-1
@@ -1342,4 +1342,9 @@ Route::get('/site.webmanifest', function () {
|
||||
|
||||
Route::get('/admin-workflow', function () {
|
||||
return view('pages.dashboards.admin_work_flow');
|
||||
})->name('admin-work-flow');
|
||||
})->name('admin-workflow');
|
||||
|
||||
|
||||
Route::get('/admin-workflow/list', function () {
|
||||
return view('pages.admin-workflow.list-workflow');
|
||||
})->name('admin-workflow.list');
|
||||
|
||||
Reference in New Issue
Block a user