Merge branch 'dillon/74-admin-workflow' into vapor/development

This commit is contained in:
Dillon Ngo
2025-02-15 13:26:19 +08:00
18 changed files with 309 additions and 156 deletions
@@ -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([]);
}
}
@@ -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([]);
}
@@ -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();
@@ -0,0 +1,60 @@
<?php
namespace App\Classes\Modules\Bookings\Processors;
use App\Classes\Modules\Bookings\Processors\CreatePurchaseOrderFor1688OrderProcessor;
use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject;
use App\Classes\Modules\Documents\Services\CreatesDocument;
use App\Classes\Modules\Documents\Services\CreatesFiles;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\DocumentType;
use App\Models\Document;
use App\Models\Booking;
class UploadPurchaseOrderProcessor
{
/** @var CreatesDocument */
private $createsDocument;
/** @var CreatesFiles */
private $createsFile;
/** @var CreatePurchaseOrderFor1688OrderProcessor */
private $createPurchaseOrderFor1688OrderProcessor;
/**
* UploadPurchaseOrderProcessor constructor.
* @param CreatesDocument $createsDocument
* @param CreatesFiles $createsFile
* @param CreatePurchaseOrderFor1688OrderProcessor $createPurchaseOrderFor1688OrderProcessor
*/
public function __construct(CreatesDocument $createsDocument, CreatesFiles $createsFile, CreatePurchaseOrderFor1688OrderProcessor $createPurchaseOrderFor1688OrderProcessor)
{
$this->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);
}
}
}
@@ -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);
@@ -15,7 +15,7 @@ use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class FetchAdminWFBookingLogic extends AbstractControllerLogic
class FetchAdminWF1688BookingLogic extends AbstractControllerLogic
{
/**
@@ -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));
}
}
@@ -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;
}
}
@@ -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);
@@ -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([]);
}
}
}
@@ -0,0 +1,81 @@
<?php
namespace App\Classes\Modules\Transactions\Processors;
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\UpdatesTransactionStatus;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\DocumentType;
use App\Classes\Jobs\SendUserPaymentProofUploadedEmail;
use App\Models\Transaction;
use App\Models\Document;
use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionProcessor;
class CreatePaymentProofDocumentProcessor
{
/** @var CreatesDocument */
private $createsDocument;
/** @var CreatesFiles */
private $createsFile;
/** @var UpdatesTransactionStatus */
private $updatesTransactionStatus;
/** @var CreateInvoiceTransactionProcessor */
private $createInvoiceTransactionProcessor;
/** @var SendUserPaymentProofUploadedEmail */
private $sendUserPaymentProofUploadedEmail;
/**
* CreatePaymentProofDocumentProcessor constructor.
* @param CreatesDocument $createsDocument
* @param CreatesFiles $createsFile
* @param UpdatesTransactionStatus $updatesTransactionStatus
* @param CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor
* @param SendUserPaymentProofUploadedEmail $sendUserPaymentProofUploadedEmail
*/
public function __construct(CreatesDocument $createsDocument, CreatesFiles $createsFile, UpdatesTransactionStatus $updatesTransactionStatus, CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor, SendUserPaymentProofUploadedEmail $sendUserPaymentProofUploadedEmail)
{
$this->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]);
}
}
}
}
@@ -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';
}
@@ -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);
}
+1
View File
@@ -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
{
@@ -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,
@@ -13,7 +13,31 @@
</div>
<div class="col-1">{{ parsedAnswer === 'go_back' ? '' : item.answer }}</div>
<div class="col-2">{{ parsedAnswer }}</div>
<div class="col-1" style="display: flex; flex-wrap: nowrap; gap: 5px;">
<div class="col-1" style="display: flex; flex-wrap: nowrap; gap: 5px;" v-if="item.documentsList != null && item.documentsList.length > 1" >
<div
v-for="document in item.documentsList"
:key="document.id"
style="display: flex; flex-wrap: nowrap; gap: 5px;"
>
<div
v-for="file in document.files"
:key="file.id"
class="col-auto no-padding"
>
<document-file-viewer-component :file="file">
<template v-slot:button>
<button
class="btn btn-xs btn-default bg-master-lightest b-rad-none no-border"
>
<i class="fa fa-download"></i>
</button>
</template>
</document-file-viewer-component>
</div>
</div>
</div>
<div class="col-1" style="display: flex; flex-wrap: nowrap; gap: 5px;" v-else>
<div v-if="item.documents != null" style="display: flex; flex-wrap: nowrap; gap: 5px;">
<div
v-for="file in item.documents.files"
@@ -355,7 +355,7 @@
<!-- QUESTION NAVIGATION -->
<div class="row m-t-50 m-b-10" v-if="question.question_type !== 0">
<div class="col p-r-5">
<button class="btn btn-sm btn-default bg-master-lightest btn-block b-rad-none" :disabled="hidePrevious===1" @click="formTouched = true; submitForm('previous')">Previous</button>
<button class="btn btn-sm btn-default bg-master-lightest btn-block b-rad-none" :disabled="hidePrevious === true" @click="formTouched = true; submitForm('previous')">Previous</button>
</div>
<div class="col p-l-5">
<button class="btn btn-sm btn-primary btn-block b-rad-none" @click="formTouched = true; submitForm('next')">Next</button>
+1 -1
View File
@@ -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');