Admin Workflow - New UI for Admin to go through questions and answers

This commit is contained in:
Dillon Ngo
2025-01-03 01:51:33 +08:00
parent 2bbe7e4eab
commit 2e625828e7
34 changed files with 1097 additions and 25 deletions
@@ -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));
}
}
@@ -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;
@@ -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,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'),
];
}
+8
View File
@@ -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');
});
}
}
+3 -2
View File
@@ -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>
@@ -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>
@@ -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
View File
@@ -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
+2 -4
View File
@@ -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) {
+6 -1
View File
@@ -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
View File
@@ -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');