'Update Purchase Order', 'message' => $this->notificationMessage ?? "You have successfully updated your booking's purchase order", ]; } private ?string $notificationMessage = null; /** @var FetchesBooking */ private $fetchesBooking; /** @var GeneratesTransactionBillNumber */ private $generatesTransactionBillNumber; /** @var CreatePurchaseOrderTransactionProcessor */ private $createPurchaseOrderTransactionProcessor; /** @var ETLPurchaseOrderTransactionProcessor */ private $etlPurchaseOrderTransactionProcessor; /** @var CanETLPurchaseOrder */ private $canETLPurchaseOrder; /** * ImportPurchaseOrderTransactionLogic constructor. * @param FetchesBooking $fetchesBooking * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber * @param CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor * @param ETLPurchaseOrderTransactionProcessor $etlPurchaseOrderTransactionProcessor * @param CanETLPurchaseOrder $canETLPurchaseOrder */ public function __construct(FetchesBooking $fetchesBooking, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor, ETLPurchaseOrderTransactionProcessor $etlPurchaseOrderTransactionProcessor, CanETLPurchaseOrder $canETLPurchaseOrder) { $this->fetchesBooking = $fetchesBooking; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; $this->createPurchaseOrderTransactionProcessor = $createPurchaseOrderTransactionProcessor; $this->etlPurchaseOrderTransactionProcessor = $etlPurchaseOrderTransactionProcessor; $this->canETLPurchaseOrder = $canETLPurchaseOrder; } /** * @param Request $request * @param string $id * @return JsonResponse * @throws \App\Classes\Exceptions\MalformedRequestException */ public function logic(Request $request, $id = ''): JsonResponse { $products = []; // Initialize if ($request->has('products') && is_array($request->input('products'))) { $this->canETLPurchaseOrder->passes(); $products = $request->input('products'); $productsMetadata = $request->input('productsMetadata'); $count = collect($products) ->filter(function ($product) { return isset($product['description']) && preg_match('/\p{Han}+/u', $product['description']); }) ->count(); if($count > 10){ ETLPurchaseOrderTransactionV2CommandJob::dispatch($products, $productsMetadata, $request->route('id')); $this->notificationMessage = "Please refresh page in a few minutes"; return $this->response([]); } else{ $products = $this->etlPurchaseOrderTransactionProcessor->execute($products, $productsMetadata); } } else { $object = new DocumentObject('', $request->input('files'), '', ApprovalStatus::APPROVED, 'imports'); foreach ($object->getFiles() as $file) { $collection = Excel::toCollection(null, json_decode($file)->file_info->original->file, null, null, true); $sheet = $collection->first()->skip(1); $products = $sheet->map(function ($row) { Log::info($row); $stockCode = $row[0]; $description = $row[1]; $quantity = $row[2]; $unit_price = $row[3]; return [ 'stockCode' => $stockCode, 'description' => $description, 'quantity' => $quantity, 'unit_price' => $unit_price ]; })->all(); } } /** @var Booking $booking */ $booking = $this->fetchesBooking->execute(['id' => $request->route('id') ?? $id]); $billNumber = $this->generatesTransactionBillNumber->execute('PO-'); $total = collect($products)->sum(function($product){ return $product['quantity'] * floatval(str_replace(',', '', $product['unit_price'])); }); $object = new TransactionObject($billNumber, TransactionType::PURCHASE_ORDER, $booking->company->id, 1, 1, PaymentMethodType::CASH, $total, $total, $booking->fix_currency_id, $booking->fix_currency_id, 1, 0, 0, null, ApprovalStatus::PENDING_SUBMISSION, $products); $transaction = $this->createPurchaseOrderTransactionProcessor->execute($booking, $object); return $this->resourceResponse(new TransactionResource($transaction)); } }