diff --git a/app/Classes/Modules/Bookings/ControllersLogic/DeletePurchaseOrderPdfLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/DeletePurchaseOrderPdfLogic.php index 5bc44d34..79078cd3 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/DeletePurchaseOrderPdfLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/DeletePurchaseOrderPdfLogic.php @@ -57,7 +57,7 @@ class DeletePurchaseOrderPdfLogic extends AbstractControllerLogic { $booking = $this->fetchesBooking->execute(['id' => $request->route('id')]); - $document = $booking->documents()->where('document_type', DocumentType::ECOMMERCE_PURCHASE_ORDER)->first(); + $document = $booking->documents()->where('document_type', DocumentType::ECOMMERCE_PURCHASE_ORDER)->latest()->first(); $this->canDeleteDocument->passes(); diff --git a/app/Classes/Modules/Transactions/ControllersLogic/ImportPurchaseOrderTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/ImportPurchaseOrderTransactionLogic.php index 4df5799a..aa5eb7e4 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/ImportPurchaseOrderTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/ImportPurchaseOrderTransactionLogic.php @@ -6,6 +6,9 @@ namespace App\Classes\Modules\Transactions\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Jobs\Commands\V2\ETLPurchaseOrderTransactionV2CommandJob; use App\Classes\Modules\Bookings\Services\FetchesBooking; +use App\Classes\Modules\Documents\Services\CreatesDocument; +use App\Classes\Modules\Documents\Services\DeletesDocument; +use App\Classes\Modules\Documents\Services\CreatesFiles; use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; use App\Classes\Modules\Transactions\Processors\CreatePurchaseOrderTransactionProcessor; @@ -15,8 +18,10 @@ use App\Classes\Modules\Transactions\Standards\Rules\CanETLPurchaseOrder; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\PaymentMethodType; use App\Classes\ValueObjects\Constants\TransactionType; +use App\Classes\ValueObjects\Constants\DocumentType; use App\Http\Resources\TransactionResource; use App\Models\Booking; +use App\Models\Document; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; @@ -53,6 +58,15 @@ class ImportPurchaseOrderTransactionLogic extends AbstractControllerLogic /** @var CanETLPurchaseOrder */ private $canETLPurchaseOrder; + /** @var CreatesDocument */ + private $createsDocument; + + /** @var DeletesDocument */ + private $deletesDocument; + + /** @var CreatesFiles */ + private $createsFile; + /** * ImportPurchaseOrderTransactionLogic constructor. * @param FetchesBooking $fetchesBooking @@ -60,14 +74,20 @@ class ImportPurchaseOrderTransactionLogic extends AbstractControllerLogic * @param CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor * @param ETLPDFPurchaseOrderClaudeProcessor $eTLPDFPurchaseOrderClaudeProcessor * @param CanETLPurchaseOrder $canETLPurchaseOrder + * @param CreatesDocument $createsDocument + * @param DeletesDocument $deletesDocument + * @param CreatesFiles $createsFile */ - public function __construct(FetchesBooking $fetchesBooking, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor, ETLPDFPurchaseOrderClaudeProcessor $eTLPDFPurchaseOrderClaudeProcessor, CanETLPurchaseOrder $canETLPurchaseOrder) + public function __construct(FetchesBooking $fetchesBooking, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor, ETLPDFPurchaseOrderClaudeProcessor $eTLPDFPurchaseOrderClaudeProcessor, CanETLPurchaseOrder $canETLPurchaseOrder, CreatesDocument $createsDocument, DeletesDocument $deletesDocument, CreatesFiles $createsFile) { $this->fetchesBooking = $fetchesBooking; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; $this->createPurchaseOrderTransactionProcessor = $createPurchaseOrderTransactionProcessor; $this->eTLPDFPurchaseOrderClaudeProcessor = $eTLPDFPurchaseOrderClaudeProcessor; $this->canETLPurchaseOrder = $canETLPurchaseOrder; + $this->createsDocument = $createsDocument; + $this->deletesDocument = $deletesDocument; + $this->createsFile = $createsFile; } /** @@ -79,38 +99,80 @@ class ImportPurchaseOrderTransactionLogic extends AbstractControllerLogic public function logic(Request $request, $id = ''): JsonResponse { $products = []; // Initialize + + /** @var Booking $booking */ + $booking = $this->fetchesBooking->execute(['id' => $request->route('id') ?? $id]); + if ($request->has('products') && is_array($request->input('products'))) { $this->canETLPurchaseOrder->passes(); $products = $request->input('products'); if(empty($products)){ - $files = $request->input('files'); - $files = $request->input('files'); - + $files = $request->input('files', []); $maxSize = 150 * 1024; // 150 KB $totalSize = 0; - foreach ($files as $index => $fileBase64) { - if (preg_match('/^data:application\/pdf;base64,/', $fileBase64)) { - $fileBase64 = preg_replace('/^data:application\/pdf;base64,/', '', $fileBase64); + $base64FilesEN = []; // files with "EN" in the name + $base64FilesOther = []; // files without "EN" + + foreach ($files as $index => $file) { + if (!isset($file['base64'])) { + Log::info("Missing base64 for file index {$index}"); + continue; } - $fileContent = base64_decode($fileBase64, true); - if ($fileContent === false) { - Log::info("Invalid Base64 for file index {$index}"); - } + $fileBase64 = $file['base64']; + $fileName = $file['name'] ?? "file_{$index}"; - $totalSize += strlen($fileContent); + if (stripos($fileName, 'EN') !== false) { + $base64FilesEN[] = $fileBase64; + if (preg_match('/^data:application\/pdf;base64,/', $fileBase64)) { + $cleanBase64 = preg_replace('/^data:application\/pdf;base64,/', '', $fileBase64); + } + else{ + $cleanBase64 = $fileBase64; + } + + $fileContent = base64_decode($cleanBase64, true); + if ($fileContent === false) { + Log::info("Invalid Base64 for file index {$index}"); + } + + $totalSize += strlen($fileContent); + } else { + $base64FilesOther[] = $fileBase64; + } } - if ($totalSize > $maxSize) { - ETLPurchaseOrderTransactionV2CommandJob::dispatch($files, $request->route('id')); - $this->notificationMessage = "Please refresh page in a few minutes"; - return $this->response([]); + //Keep a copy of all PDF files uploaded include pdf file with 'EN' as part of its filename + $allBase64Files = array_merge($base64FilesEN, $base64FilesOther); + + $deleteDocument = $booking->documents()->where('document_type', DocumentType::ECOMMERCE_PURCHASE_ORDER)->latest()->first(); + if($deleteDocument){ + $this->deletesDocument->execute($deleteDocument); + } + + $object = new DocumentObject(DocumentType::ECOMMERCE_PURCHASE_ORDER, $allBase64Files, '', ApprovalStatus::APPROVED, '1688_purchase_orders'); + + /** @var Document $document */ + $document = $this->createsDocument->execute($booking, $object); + + $this->createsFile->execute($document, $object); + + //ETL only applicable for pdf file with 'EN' as part of its filename + if ($totalSize > 0) { + if ($totalSize > $maxSize) { + ETLPurchaseOrderTransactionV2CommandJob::dispatch($base64FilesEN, $request->route('id')); + $this->notificationMessage = "Please refresh page in a few minutes"; + return $this->response([]); + } + else{ + $products = $this->eTLPDFPurchaseOrderClaudeProcessor->execute($base64FilesEN); + } } else{ - $products = $this->eTLPDFPurchaseOrderClaudeProcessor->execute($files); + return $this->response([]); } } } @@ -139,9 +201,6 @@ class ImportPurchaseOrderTransactionLogic extends AbstractControllerLogic } - /** @var Booking $booking */ - $booking = $this->fetchesBooking->execute(['id' => $request->route('id') ?? $id]); - $billNumber = $this->generatesTransactionBillNumber->execute('PO-'); $total = collect($products)->sum(function($product){ diff --git a/resources/assets/vue/components/bookings/forms/PdfUpload1688Component.vue b/resources/assets/vue/components/bookings/forms/PdfUpload1688Component.vue index a0bbeab3..3abd89fb 100644 --- a/resources/assets/vue/components/bookings/forms/PdfUpload1688Component.vue +++ b/resources/assets/vue/components/bookings/forms/PdfUpload1688Component.vue @@ -6,7 +6,7 @@