From adf8ed05c1d5844cc5a9826cc16c7fbf1a6e94a1 Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Sat, 15 Feb 2025 13:24:42 +0800 Subject: [PATCH] Admin Workflow - Fix Tested Issues - upload 3 documents at one step --- .../ApprovePurchaseOrderLogic.php | 13 ++- .../UploadPurchaseOrderLogic.php | 52 ++---------- .../ApprovePurchaseOrderProcessor.php | 8 +- .../UploadPurchaseOrderProcessor.php | 60 ++++++++++++++ .../Processors/UploadDocumentProcessor.php | 7 +- ...c.php => FetchAdminWF1688BookingLogic.php} | 2 +- .../UpdateNextQuestionV1AdminWFLogic.php | 21 +++-- .../SaveAnswerActionV1AdminWFProcessor.php | 46 ++++++++++- .../SaveAnswerV1AdminWFProcessor.php | 63 +++++++++------ .../CreatePaymentProofDocumentLogic.php | 71 +++------------- .../CreatePaymentProofDocumentProcessor.php | 81 +++++++++++++++++++ .../ValueObjects/Constants/DocumentType.php | 3 + .../AdminWorkflowBaseController.php | 6 +- app/Http/Resources/QuestionResource.php | 1 + .../Resources/QuestionsAnswersResource.php | 1 + .../elements/QuestionAnswerInnerComponent.vue | 26 +++++- .../forms/AdminWorkFlowFormComponent.vue | 2 +- routes/admin_workflow.php | 2 +- 18 files changed, 309 insertions(+), 156 deletions(-) create mode 100644 app/Classes/Modules/Bookings/Processors/UploadPurchaseOrderProcessor.php rename app/Classes/Modules/Questionnaires/ControllersLogic/{FetchAdminWFBookingLogic.php => FetchAdminWF1688BookingLogic.php} (98%) create mode 100644 app/Classes/Modules/Transactions/Processors/CreatePaymentProofDocumentProcessor.php diff --git a/app/Classes/Modules/Bookings/ControllersLogic/ApprovePurchaseOrderLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/ApprovePurchaseOrderLogic.php index f790feca..57406e1f 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/ApprovePurchaseOrderLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/ApprovePurchaseOrderLogic.php @@ -5,6 +5,7 @@ namespace App\Classes\Modules\Bookings\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Bookings\Processors\ApprovePurchaseOrderProcessor; +use App\Classes\Modules\Bookings\Services\FetchesBooking; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -21,16 +22,21 @@ class ApprovePurchaseOrderLogic extends AbstractControllerLogic ]; } + /** @var FetchesBooking */ + private $fetchesBooking; + /** @var ApprovePurchaseOrderProcessor */ private $approvePurchaseOrderProcessor; /** * ApprovePurchaseOrderLogic constructor. + * @param FetchesBooking $fetchesBooking * @param ApprovePurchaseOrderProcessor $approvePurchaseOrderProcessor */ - public function __construct(ApprovePurchaseOrderProcessor $approvePurchaseOrderProcessor) + public function __construct(ApprovePurchaseOrderProcessor $approvePurchaseOrderProcessor, FetchesBooking $fetchesBooking) { $this->approvePurchaseOrderProcessor = $approvePurchaseOrderProcessor; + $this->fetchesBooking = $fetchesBooking; } /** @@ -40,7 +46,10 @@ class ApprovePurchaseOrderLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { - $this->approvePurchaseOrderProcessor->execute($request->route('id')); + $booking = $this->fetchesBooking->execute(['id' => $request->route('id')]); + + $this->approvePurchaseOrderProcessor->execute($booking); + return $this->response([]); } } diff --git a/app/Classes/Modules/Bookings/ControllersLogic/UploadPurchaseOrderLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/UploadPurchaseOrderLogic.php index ef6124cf..ab183a1f 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/UploadPurchaseOrderLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/UploadPurchaseOrderLogic.php @@ -4,25 +4,8 @@ namespace App\Classes\Modules\Bookings\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; -use App\Classes\Modules\Bookings\Processors\CreatePurchaseOrderFor1688OrderProcessor; +use App\Classes\Modules\Bookings\Processors\UploadPurchaseOrderProcessor; use App\Classes\Modules\Bookings\Services\FetchesBooking; -use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; -use App\Classes\Modules\Documents\Services\ApprovesDocument; -use App\Classes\Modules\Documents\Services\CreatesDocument; -use App\Classes\Modules\Documents\Services\CreatesFiles; -use App\Classes\Modules\Documents\Services\FetchesDocument; -use App\Classes\Modules\Documents\Services\RejectsDocument; -use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; -use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionProcessor; -use App\Classes\Modules\Transactions\Processors\CreatePurchaseOrderTransactionProcessor; -use App\Classes\Modules\Transactions\Services\FetchesTransaction; -use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; -use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; -use App\Classes\ValueObjects\Constants\ApprovalStatus; -use App\Classes\ValueObjects\Constants\DocumentType; -use App\Classes\ValueObjects\Constants\PaymentMethodType; -use App\Classes\ValueObjects\Constants\TransactionType; -use App\Models\Document; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -42,29 +25,19 @@ class UploadPurchaseOrderLogic extends AbstractControllerLogic /** @var FetchesBooking */ private $fetchesBooking; - /** @var CreatesDocument */ - private $createsDocument; - - /** @var CreatesFiles */ - private $createsFile; - - /** @var CreatePurchaseOrderFor1688OrderProcessor */ - private $createPurchaseOrderFor1688OrderProcessor; + /** @var UploadPurchaseOrderProcessor */ + private $uploadPurchaseOrderProcessor; /** * UploadPurchaseOrderLogic constructor. * @param FetchesBooking $fetchesBooking - * @param CreatesDocument $createsDocument - * @param CreatesFiles $createsFile - * @param CreatePurchaseOrderFor1688OrderProcessor $createPurchaseOrderFor1688OrderProcessor + * @param UploadPurchaseOrderProcessor $uploadPurchaseOrderProcessor */ - public function __construct(FetchesBooking $fetchesBooking, CreatesDocument $createsDocument, CreatesFiles $createsFile, CreatePurchaseOrderFor1688OrderProcessor $createPurchaseOrderFor1688OrderProcessor) + public function __construct(FetchesBooking $fetchesBooking, UploadPurchaseOrderProcessor $uploadPurchaseOrderProcessor) { $this->fetchesBooking = $fetchesBooking; - $this->createsDocument = $createsDocument; - $this->createsFile = $createsFile; - $this->createPurchaseOrderFor1688OrderProcessor = $createPurchaseOrderFor1688OrderProcessor; + $this->uploadPurchaseOrderProcessor = $uploadPurchaseOrderProcessor; } /** @@ -74,19 +47,8 @@ class UploadPurchaseOrderLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { - $booking = $this->fetchesBooking->execute(['id' => $request->route('id')]); - - $object = new DocumentObject(DocumentType::ECOMMERCE_PURCHASE_ORDER, $request->input('files'), '', ApprovalStatus::APPROVED, '1688_purchase_orders'); - - /** @var Document $document */ - $document = $this->createsDocument->execute($booking, $object); - - $this->createsFile->execute($document, $object); - - if(!in_array($booking->company->id, [199, 510])){ - $this->createPurchaseOrderFor1688OrderProcessor->execute($booking); - } + $this->uploadPurchaseOrderProcessor->execute($booking, $request->input('files')); return $this->response([]); } diff --git a/app/Classes/Modules/Bookings/Processors/ApprovePurchaseOrderProcessor.php b/app/Classes/Modules/Bookings/Processors/ApprovePurchaseOrderProcessor.php index 1a1a0341..e5021c06 100644 --- a/app/Classes/Modules/Bookings/Processors/ApprovePurchaseOrderProcessor.php +++ b/app/Classes/Modules/Bookings/Processors/ApprovePurchaseOrderProcessor.php @@ -8,6 +8,7 @@ use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionProcesso use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\TransactionType; +use App\Models\Booking; class ApprovePurchaseOrderProcessor { @@ -35,14 +36,11 @@ class ApprovePurchaseOrderProcessor } /** - * @param int $bookingId + * @param Booking $booking * @return void * @throws \App\Classes\Exceptions\MalformedRequestException - * @throws \App\Classes\Exceptions\JobResourceNotFoundException */ - public function execute(int $bookingId) { - - $booking = $this->fetchesBooking->execute(['id' => $bookingId]); + public function execute(Booking $booking) { $purchaseOrder = $booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->first(); diff --git a/app/Classes/Modules/Bookings/Processors/UploadPurchaseOrderProcessor.php b/app/Classes/Modules/Bookings/Processors/UploadPurchaseOrderProcessor.php new file mode 100644 index 00000000..85203e86 --- /dev/null +++ b/app/Classes/Modules/Bookings/Processors/UploadPurchaseOrderProcessor.php @@ -0,0 +1,60 @@ +createsDocument = $createsDocument; + $this->createsFile = $createsFile; + $this->createPurchaseOrderFor1688OrderProcessor = $createPurchaseOrderFor1688OrderProcessor; + } + + /** + * @param Booking $booking + * @param array $files + * @return void + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function execute(Booking $booking, array $files) + { + $object = new DocumentObject(DocumentType::ECOMMERCE_PURCHASE_ORDER, $files, '', ApprovalStatus::APPROVED, '1688_purchase_orders'); + + /** @var Document $document */ + $document = $this->createsDocument->execute($booking, $object); + + $this->createsFile->execute($document, $object); + + if(!in_array($booking->company->id, [199, 510])){ + $this->createPurchaseOrderFor1688OrderProcessor->execute($booking); + } + } + +} diff --git a/app/Classes/Modules/Documents/Processors/UploadDocumentProcessor.php b/app/Classes/Modules/Documents/Processors/UploadDocumentProcessor.php index 7868f06f..d6cd77e7 100644 --- a/app/Classes/Modules/Documents/Processors/UploadDocumentProcessor.php +++ b/app/Classes/Modules/Documents/Processors/UploadDocumentProcessor.php @@ -33,13 +33,14 @@ class UploadDocumentProcessor /** - * @param $filesUpload * @param QAUserAnswerSelected qaUserAnswerSelected + * @param array $filesUpload * @param string $path + * @param string $documentType * @throws \App\Classes\Exceptions\MalformedRequestException */ - public function execute($filesUpload, QAUserAnswerSelected $qaUserAnswerSelected, string $path) { - $object = new DocumentObject(DocumentType::ADMIN_WORK_FLOW, $filesUpload, '', ApprovalStatus::PENDING_VERIFICATION, $path); + public function execute(QAUserAnswerSelected $qaUserAnswerSelected, $filesUpload, string $path, string $documentType = DocumentType::ADMIN_WORK_FLOW) { + $object = new DocumentObject($documentType, $filesUpload, '', ApprovalStatus::PENDING_VERIFICATION, $path); /** @var Document $document */ $document = $this->createsDocument->execute($qaUserAnswerSelected, $object); diff --git a/app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWFBookingLogic.php b/app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWF1688BookingLogic.php similarity index 98% rename from app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWFBookingLogic.php rename to app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWF1688BookingLogic.php index 5b0b1cd1..205b6dbe 100644 --- a/app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWFBookingLogic.php +++ b/app/Classes/Modules/Questionnaires/ControllersLogic/FetchAdminWF1688BookingLogic.php @@ -15,7 +15,7 @@ use ErrorException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -class FetchAdminWFBookingLogic extends AbstractControllerLogic +class FetchAdminWF1688BookingLogic extends AbstractControllerLogic { /** diff --git a/app/Classes/Modules/Questionnaires/ControllersLogic/UpdateNextQuestionV1AdminWFLogic.php b/app/Classes/Modules/Questionnaires/ControllersLogic/UpdateNextQuestionV1AdminWFLogic.php index 2f18fc4d..67440946 100644 --- a/app/Classes/Modules/Questionnaires/ControllersLogic/UpdateNextQuestionV1AdminWFLogic.php +++ b/app/Classes/Modules/Questionnaires/ControllersLogic/UpdateNextQuestionV1AdminWFLogic.php @@ -96,6 +96,8 @@ class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic $timeUsedSeconds = 0; $reference = null; $questionMetadata = null; + $booking = null; + $isNoGoingBackOverwrite = 0; $this->canFetchQuestion->passes(); @@ -103,8 +105,6 @@ class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic $answer = $request->answerObj; $answerNextQuestionNumber = $answer['next_question_number']; $answerValue = $answer['value']; - Log::info('answerNextQuestionNumber: '. $answerNextQuestionNumber); - Log::info('answerValue: '. $answerValue); } if ($request->has('extra')) { @@ -114,6 +114,10 @@ class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic $reference = $extra['session_id']; } + if($questionMetadata){ + $booking = Booking::where('id', $questionMetadata['id'])->first(); + } + //Save answer given by user (both next and previous) $filesUpload = $request->only(['files', 'filesA', 'filesB', 'filesC']); $answerOptionId = 0; @@ -125,13 +129,13 @@ class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic $answerInText = "go_back"; } $answer = $this->saveAnswerProcessor->execute($userId, 0, $currentQuestion['id'], $currentQuestion['question_type'], $questionMetadata, $answerInText, $answerOptionId, $filesUpload, $timeUsedSeconds, $request->has('isPrevious'), $reference); - $this->saveAnswerActionProcessor->execute($questionMetadata, $answerOptionId); + if(!$request->has('isPrevious')){ + $isNoGoingBackOverwrite = $this->saveAnswerActionProcessor->execute($booking, $questionMetadata, $answerOptionId, $currentQuestion, $filesUpload); + } //Marked data that has already been processed so that it does not appear again - $isNoGoingBack = null; + $isNoGoingBack = 0; if($currentQuestion && $currentQuestion['is_end'] === 1 && !$request->has('isPrevious')){ - $booking = Booking::where('id', $questionMetadata['id'])->first(); - $key1 = "admin_workflow_processed"; $key2 = "admin_workflow_processing"; if (strpos($currentQuestion['question_number'], '1688') === 0) { @@ -178,13 +182,16 @@ class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic $isNoGoingBack = 0; } + if($isNoGoingBackOverwrite === 1 && $isNoGoingBack === 0){ + $isNoGoingBack = $isNoGoingBackOverwrite; + } + $returnQuestion = $this->fetchNextQuestionMetadataProcessor->execute($returnQuestion, $questionMetadata); //When a questionnaire ended, return back the first question if(is_null($returnQuestion)){ $returnQuestion = $this->fetchFirstQuestionQAProcessor->execute($request); } - return $this->resourceResponse(new QuestionResource($returnQuestion, $userId, $request->has('isPrevious'), $isNoGoingBack, $previousAnswer)); } } diff --git a/app/Classes/Modules/Questionnaires/Processors/SaveAnswerActionV1AdminWFProcessor.php b/app/Classes/Modules/Questionnaires/Processors/SaveAnswerActionV1AdminWFProcessor.php index 737f8758..872e253c 100644 --- a/app/Classes/Modules/Questionnaires/Processors/SaveAnswerActionV1AdminWFProcessor.php +++ b/app/Classes/Modules/Questionnaires/Processors/SaveAnswerActionV1AdminWFProcessor.php @@ -4,6 +4,9 @@ namespace App\Classes\Modules\Questionnaires\Processors; use App\Classes\Modules\Bookings\Processors\ApprovePurchaseOrderProcessor; +use App\Classes\Modules\Bookings\Processors\UploadPurchaseOrderProcessor; +use App\Classes\Modules\Transactions\Processors\CreatePaymentProofDocumentProcessor; +use App\Classes\Modules\Transactions\Services\FetchesTransaction; use App\Models\QAAnswerOptions; use Illuminate\Support\Facades\Log; @@ -12,22 +15,61 @@ class SaveAnswerActionV1AdminWFProcessor /** @var ApprovePurchaseOrderProcessor */ private $approvePurchaseOrderProcessor; + /** @var UploadPurchaseOrderProcessor */ + private $uploadPurchaseOrderProcessor; + + /** @var CreatePaymentProofDocumentProcessor */ + private $createPaymentProofDocumentProcessor; + + /** @var FetchesTransaction */ + private $fetchesTransaction; + /** * SaveAnswerActionV1AdminWFProcessor constructor. * @param ApprovePurchaseOrderProcessor $approvePurchaseOrderProcessor + * @param UploadPurchaseOrderProcessor $uploadPurchaseOrderProcessor + * @param CreatePaymentProofDocumentProcessor $createPaymentProofDocumentProcessor + * @param FetchesTransaction $fetchesTransaction */ - public function __construct(ApprovePurchaseOrderProcessor $approvePurchaseOrderProcessor) + public function __construct(ApprovePurchaseOrderProcessor $approvePurchaseOrderProcessor, UploadPurchaseOrderProcessor $uploadPurchaseOrderProcessor, CreatePaymentProofDocumentProcessor $createPaymentProofDocumentProcessor, FetchesTransaction $fetchesTransaction) { $this->approvePurchaseOrderProcessor = $approvePurchaseOrderProcessor; + $this->uploadPurchaseOrderProcessor = $uploadPurchaseOrderProcessor; + $this->createPaymentProofDocumentProcessor = $createPaymentProofDocumentProcessor; + $this->fetchesTransaction = $fetchesTransaction; } /** * @return */ - public function execute($questionMetadata, $answerOptionId){ + public function execute($booking, $questionMetadata, $answerOptionId, $currentQuestion, $filesUpload){ + $isNoGoingBack = 0; $answerOption = QAAnswerOptions::where('id', $answerOptionId)->first(); if($answerOption && $answerOption->value === "approve_po_approved"){ $this->approvePurchaseOrderProcessor->execute($questionMetadata['id']); + $isNoGoingBack = 1; } + else if($currentQuestion['question_number'] === '1688_submit') + { + if($filesUpload){ + if ($booking && isset($filesUpload['filesA']) && isset($filesUpload['filesB'])) + { + $mergedFilesUpload = array_merge( + $filesUpload['filesA'] ?? [], + $filesUpload['filesB'] ?? [] + ); + $this->uploadPurchaseOrderProcessor->execute($booking, $mergedFilesUpload); + } + + if (isset($filesUpload['filesC']) && isset($questionMetadata['payment_history'][0]['transaction_bill']['id'])) + { + $transaction = $this->fetchesTransaction->execute(['id' =>$questionMetadata['payment_history'][0]['transaction_bill']['id']]); + $this->createPaymentProofDocumentProcessor->execute($transaction, $filesUpload['filesC']); + } + $isNoGoingBack = 1; + } + } + + return $isNoGoingBack; } } diff --git a/app/Classes/Modules/Questionnaires/Processors/SaveAnswerV1AdminWFProcessor.php b/app/Classes/Modules/Questionnaires/Processors/SaveAnswerV1AdminWFProcessor.php index e33018e1..3d8f107a 100644 --- a/app/Classes/Modules/Questionnaires/Processors/SaveAnswerV1AdminWFProcessor.php +++ b/app/Classes/Modules/Questionnaires/Processors/SaveAnswerV1AdminWFProcessor.php @@ -5,6 +5,7 @@ namespace App\Classes\Modules\Questionnaires\Processors; use App\Models\QAUserAnswerSelected; use App\Classes\Modules\Documents\Processors\UploadDocumentProcessor; +use App\Classes\ValueObjects\Constants\DocumentType; use App\Classes\ValueObjects\Constants\QAType; use Illuminate\Support\Facades\Log; @@ -50,7 +51,15 @@ class SaveAnswerV1AdminWFProcessor if (isset($filesUpload['filesA'])) { foreach ($filesUpload as $key => $files) { - $attachments[$key] = $this->saveFile($answer, $files); + if($key === 'filesA'){ + $attachments[$key] = $this->saveFile($answer, $files, 'questionnaires', DocumentType::ADMIN_WORK_FLOW.'/'.DocumentType::ECOMMERCE_PURCHASE_ORDER_EN); + } + else if($key === "filesB"){ + $attachments[$key] = $this->saveFile($answer, $files, 'questionnaires', DocumentType::ADMIN_WORK_FLOW.'/'.DocumentType::ECOMMERCE_PURCHASE_ORDER_CH); + } + else if($key === "filesC"){ + $attachments[$key] = $this->saveFile($answer, $files, 'questionnaires', DocumentType::ADMIN_WORK_FLOW.'/'.DocumentType::CURRENCY_VENDOR_PAYMENT_PROOF); + } } } else if (isset($filesUpload['files']) && $filesUpload['files']) @@ -59,39 +68,47 @@ class SaveAnswerV1AdminWFProcessor } } - if($questionType === QAType::SUBMIT_1688_3_TYPES_DOCUMENTS){ - $structuredAnswer = [ - 'files' => $attachments, - ]; - $answer->answer = json_encode($structuredAnswer); + if(!$isPrevious) { + if($questionType === QAType::SUBMIT_1688_3_TYPES_DOCUMENTS){ + $structuredAnswer = [ + 'text' => "3_DOCUMENTS_UPLOADED", + 'files' => $attachments, + ]; + $answer->answer = json_encode($structuredAnswer); + } + else if($questionType === QAType::REMARKS_WITH_DOCUMENT_UPLOAD){ + $structuredAnswer = [ + 'text' => $answerInText, + 'files' => $attachments, + ]; + $answer->answer = json_encode($structuredAnswer); + } + else if($questionType === QAType::DOCUMENT_UPLOAD){ + $structuredAnswer = [ + 'files' => $attachments, + ]; + $answer->answer = json_encode($structuredAnswer); + } + else { + $answer->answer = $answerInText; + } } - else if($questionType === QAType::REMARKS_WITH_DOCUMENT_UPLOAD){ - $structuredAnswer = [ - 'text' => $answerInText, - 'files' => $attachments, - ]; - $answer->answer = json_encode($structuredAnswer); - } - else if($questionType === QAType::DOCUMENT_UPLOAD){ - $structuredAnswer = [ - 'files' => $attachments, - ]; - $answer->answer = json_encode($structuredAnswer); - } - else { + else { $answer->answer = $answerInText; } + $answer->save(); return $answer; } - private function saveFile($answer, $files){ - $result = $this->uploadDocumentForProcessor->execute($files, $answer, 'questionnaires'); - $attachment = array_map(function ($item) { + private function saveFile(QAUserAnswerSelected $answer, array $files, string $path = 'questionnaires', string $documentType = DocumentType::ADMIN_WORK_FLOW){ + $result = $this->uploadDocumentForProcessor->execute($answer, $files, $path, $documentType); + $attachment = array_map(function ($item) use($documentType) { return [ 'name' => $item->document_id, 'file_id' => $item->id, + 'document_type'=> $documentType, ]; }, $result); diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreatePaymentProofDocumentLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreatePaymentProofDocumentLogic.php index 46534d77..9e619ee1 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreatePaymentProofDocumentLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreatePaymentProofDocumentLogic.php @@ -4,24 +4,10 @@ namespace App\Classes\Modules\Transactions\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; -use App\Classes\Modules\Companies\Services\FetchesCompany; -use App\Classes\Modules\Companies\Services\UpdatesCompanyStatus; -use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; -use App\Classes\Modules\Documents\Services\CreatesDocument; -use App\Classes\Modules\Documents\Services\CreatesFiles; -use App\Classes\Modules\Transactions\Services\FetchesTransaction; -use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; -use App\Classes\ValueObjects\Constants\ApprovalStatus; -use App\Classes\ValueObjects\Constants\CompanyType; -use App\Classes\ValueObjects\Constants\DocumentType; -use App\Classes\Jobs\SendUserPaymentProofUploadedEmail; -use App\Models\Company; -use App\Models\Document; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; - -use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionProcessor; - +use App\Classes\Modules\Transactions\Services\FetchesTransaction; +use App\Classes\Modules\Transactions\Processors\CreatePaymentProofDocumentProcessor; class CreatePaymentProofDocumentLogic extends AbstractControllerLogic { @@ -39,37 +25,18 @@ class CreatePaymentProofDocumentLogic extends AbstractControllerLogic /** @var FetchesTransaction */ private $fetchesTransaction; - /** @var CreatesDocument */ - private $createsDocument; - - /** @var CreatesFiles */ - private $createsFile; - - /** @var UpdatesTransactionStatus */ - private $updatesTransactionStatus; - - /** @var CreateInvoiceTransactionProcessor */ - private $createInvoiceTransactionProcessor; - - /** @var SendUserPaymentProofUploadedEmail */ - private $sendUserPaymentProofUploadedEmail; + /** @var CreatePaymentProofDocumentProcessor */ + private $createPaymentProofDocumentProcessor; /** * CreatePaymentProofDocumentLogic constructor. + * @param CreatePaymentProofDocumentProcessor $createPaymentProofDocumentProcessor * @param FetchesTransaction $fetchesTransaction - * @param CreatesDocument $createsDocument - * @param CreatesFiles $createsFile - * @param UpdatesTransactionStatus $updatesTransactionStatus - * @param CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor */ - public function __construct(FetchesTransaction $fetchesTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, UpdatesTransactionStatus $updatesTransactionStatus, CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor, SendUserPaymentProofUploadedEmail $sendUserPaymentProofUploadedEmail) + public function __construct(CreatePaymentProofDocumentProcessor $createPaymentProofDocumentProcessor, FetchesTransaction $fetchesTransaction) { + $this->createPaymentProofDocumentProcessor = $createPaymentProofDocumentProcessor; $this->fetchesTransaction = $fetchesTransaction; - $this->createsDocument = $createsDocument; - $this->createsFile = $createsFile; - $this->updatesTransactionStatus = $updatesTransactionStatus; - $this->createInvoiceTransactionProcessor = $createInvoiceTransactionProcessor; - $this->sendUserPaymentProofUploadedEmail = $sendUserPaymentProofUploadedEmail; } /** @@ -79,30 +46,10 @@ class CreatePaymentProofDocumentLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { - $transaction = $this->fetchesTransaction->execute(['id' => $request->route('id')]); - - $object = new DocumentObject(DocumentType::CURRENCY_VENDOR_PAYMENT_PROOF, $request->input('files'), '', ApprovalStatus::APPROVED, 'china_bank_slip'); - - /** @var Document $document */ - $document = $this->createsDocument->execute($transaction, $object); - - $file = $this->createsFile->execute($document, $object); - - $this->updatesTransactionStatus->execute($transaction, ApprovalStatus::APPROVED); - - $this->createInvoiceTransactionProcessor->execute($transaction->owner->booking); - - // send email to customer - // todo: a function to send a proof to the receipiant, they have to give us a email of the receipiant and also need to submiited purchase order - $companyEmployee = $transaction->owner->booking->company->employees; - foreach ($companyEmployee as $employee) { - if (app()->environment('production') || in_array($employee->email, ['cief.enquirycntr@gmail.com', 'tech.ciefmalaysia@gmail.com'])) { - $this->sendUserPaymentProofUploadedEmail::dispatch($employee, $transaction->owner->booking, $file[0]); - } - } + $this->createPaymentProofDocumentProcessor->execute($transaction, $request->input('files')); return $this->response([]); } -} \ No newline at end of file +} diff --git a/app/Classes/Modules/Transactions/Processors/CreatePaymentProofDocumentProcessor.php b/app/Classes/Modules/Transactions/Processors/CreatePaymentProofDocumentProcessor.php new file mode 100644 index 00000000..29dc8e5d --- /dev/null +++ b/app/Classes/Modules/Transactions/Processors/CreatePaymentProofDocumentProcessor.php @@ -0,0 +1,81 @@ +createsDocument = $createsDocument; + $this->createsFile = $createsFile; + $this->updatesTransactionStatus = $updatesTransactionStatus; + $this->createInvoiceTransactionProcessor = $createInvoiceTransactionProcessor; + $this->sendUserPaymentProofUploadedEmail = $sendUserPaymentProofUploadedEmail; + } + + /** + * @param Transaction $transaction + * @param array $files + * @return void + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function execute(Transaction $transaction, array $files) + { + $object = new DocumentObject(DocumentType::CURRENCY_VENDOR_PAYMENT_PROOF, $files, '', ApprovalStatus::APPROVED, 'china_bank_slip'); + + /** @var Document $document */ + $document = $this->createsDocument->execute($transaction, $object); + + $file = $this->createsFile->execute($document, $object); + + $this->updatesTransactionStatus->execute($transaction, ApprovalStatus::APPROVED); + + $this->createInvoiceTransactionProcessor->execute($transaction->owner->booking); + + // send email to customer + // todo: a function to send a proof to the receipiant, they have to give us a email of the receipiant and also need to submiited purchase order + $companyEmployee = $transaction->owner->booking->company->employees; + foreach ($companyEmployee as $employee) { + if (app()->environment('production') || in_array($employee->email, ['cief.enquirycntr@gmail.com', 'tech.ciefmalaysia@gmail.com'])) { + $this->sendUserPaymentProofUploadedEmail::dispatch($employee, $transaction->owner->booking, $file[0]); + } + } + } + +} diff --git a/app/Classes/ValueObjects/Constants/DocumentType.php b/app/Classes/ValueObjects/Constants/DocumentType.php index a7b22383..f2fe0b09 100644 --- a/app/Classes/ValueObjects/Constants/DocumentType.php +++ b/app/Classes/ValueObjects/Constants/DocumentType.php @@ -28,5 +28,8 @@ final class DocumentType { public const BULK_PURCHASE_ORDER = 'BULK_PURCHASE_ORDER'; public const BILL_GROUP_PAYMENT_PROOF = 'BILL_GROUP_PAYMENT_PROOF'; + public const ADMIN_WORK_FLOW = 'ADMIN_WORK_FLOW'; + public const ECOMMERCE_PURCHASE_ORDER_EN = 'ECOMMERCE_PURCHASE_ORDER_EN'; + public const ECOMMERCE_PURCHASE_ORDER_CH = 'ECOMMERCE_PURCHASE_ORDER_CH'; } diff --git a/app/Http/Controllers/Questionnaires/AdminWorkflowBaseController.php b/app/Http/Controllers/Questionnaires/AdminWorkflowBaseController.php index a3c95140..c94cbe6b 100644 --- a/app/Http/Controllers/Questionnaires/AdminWorkflowBaseController.php +++ b/app/Http/Controllers/Questionnaires/AdminWorkflowBaseController.php @@ -2,7 +2,7 @@ namespace App\Http\Controllers\Questionnaires; -use App\Classes\Modules\Questionnaires\ControllersLogic\FetchAdminWFBookingLogic; +use App\Classes\Modules\Questionnaires\ControllersLogic\FetchAdminWF1688BookingLogic; use App\Classes\Modules\Questionnaires\ControllersLogic\FetchAdminWFModelAttributesLogic; use App\Classes\Modules\Questionnaires\ControllersLogic\FetchAdminWFPendingApprovalPOLogic; use App\Classes\Modules\Questionnaires\ControllersLogic\FetchAdminWFPendingFillPOLogic; @@ -14,10 +14,10 @@ class AdminWorkflowBaseController { /** * @param Request $request - * @param FetchAdminWFBookingLogic $logic + * @param FetchAdminWF1688BookingLogic $logic * @return JsonResponse */ - public function fetchBooking(Request $request, FetchAdminWFBookingLogic $logic): JsonResponse { + public function fetchBooking(Request $request, FetchAdminWF1688BookingLogic $logic): JsonResponse { return $logic->execute($request); } diff --git a/app/Http/Resources/QuestionResource.php b/app/Http/Resources/QuestionResource.php index 3519a27a..45872f33 100644 --- a/app/Http/Resources/QuestionResource.php +++ b/app/Http/Resources/QuestionResource.php @@ -7,6 +7,7 @@ use Illuminate\Http\Resources\Json\JsonResource; use App\Models\QAQuestions; use App\Models\QAAnswerOptions; use App\Models\QAUserAnswerSelected; +use Illuminate\Support\Facades\Log; class QuestionResource extends JsonResource { diff --git a/app/Http/Resources/QuestionsAnswersResource.php b/app/Http/Resources/QuestionsAnswersResource.php index 45fcae0c..78c0a7e6 100644 --- a/app/Http/Resources/QuestionsAnswersResource.php +++ b/app/Http/Resources/QuestionsAnswersResource.php @@ -36,6 +36,7 @@ class QuestionsAnswersResource extends JsonResource 'question_metadata' => $this->question_metadata, 'answer' => $answerOption ? $answerOption->display_text : null, 'answer_value' => $this->answer, + 'documentsList' => DocumentResource::collection($this->documents), 'documents' => new DocumentResource($this->documents->whereIn('document_type', DocumentType::ADMIN_WORK_FLOW)->first()), 'reference' => $this->reference, 'source_system' => null, diff --git a/resources/assets/vue/components/admin-workflow/elements/QuestionAnswerInnerComponent.vue b/resources/assets/vue/components/admin-workflow/elements/QuestionAnswerInnerComponent.vue index cba13645..3ec6006c 100644 --- a/resources/assets/vue/components/admin-workflow/elements/QuestionAnswerInnerComponent.vue +++ b/resources/assets/vue/components/admin-workflow/elements/QuestionAnswerInnerComponent.vue @@ -13,7 +13,31 @@
{{ parsedAnswer === 'go_back' ? '' : item.answer }}
{{ parsedAnswer }}
-
+ +
+
+
+ + + +
+
+
+
- +
diff --git a/routes/admin_workflow.php b/routes/admin_workflow.php index 65f888ee..201df14e 100644 --- a/routes/admin_workflow.php +++ b/routes/admin_workflow.php @@ -47,7 +47,7 @@ if (!function_exists('markedProcessing')) { Route::group(['prefix' => 'admin-work-flow', 'as' => 'admin_work_flow.', 'namespace' => 'Questionnaires'], function () { Route::get('/fetch-booking', [AdminWorkflowBaseController::class, 'fetchBooking'])->name('fetch_oldest_order'); - Route::get('{booking_id}/fetch-model-attributes', [AdminWorkflowBaseController::class, 'fetchModelAttributes'])->name('fetch_model_attributes'); + // Route::get('{booking_id}/fetch-model-attributes', [AdminWorkflowBaseController::class, 'fetchModelAttributes'])->name('fetch_model_attributes'); Route::get('/fetch-pending-approved-po', [AdminWorkflowBaseController::class, 'fetchPendingApprovalPO'])->name('fetch_pending_approve_po'); Route::get('/fetch-pending-fill-po', [AdminWorkflowBaseController::class, 'fetchPendingFillPO'])->name('fetch_pending_fill_po');