fetchesBooking = $fetchesBooking; $this->updatesTransactionStatus = $updatesTransactionStatus; $this->createsTransaction = $createsTransaction; $this->createsTransactionDetail = $createsTransactionDetail; $this->updatesTransaction = $updatesTransaction; $this->deletesTransactionDetails = $deletesTransactionDetails; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; } /** * @return array */ protected function notification():array { return [ 'title' => 'Update Purchase Order', 'message' => 'You have successfully updated you booking\'s purchase order' ]; } /** @var FetchesBooking */ private $fetchesBooking; /** @var UpdatesTransactionStatus */ private $updatesTransactionStatus; /** @var CreatesTransaction */ private $createsTransaction; /** @var CreatesTransactionDetail */ private $createsTransactionDetail; /** @var UpdatesTransaction */ private $updatesTransaction; /** @var DeletesTransactionDetails */ private $deletesTransactionDetails; /** @var GeneratesTransactionBillNumber */ private $generatesTransactionBillNumber; /** * @param Request $request * @return JsonResponse * @throws \App\Classes\Exceptions\MalformedRequestException */ public function logic(Request $request) : JsonResponse { /** @var Booking $booking */ $booking = $this->fetchesBooking->execute(['id' => $request->route('id')]); /** @var Transaction $transaction */ $transaction = $booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->first(); $billNumber = $this->generatesTransactionBillNumber->execute('PO-'); $total = collect($request->input('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, $request->input('products')); !$transaction ? $transaction = $this->createsTransaction->execute($booking, $object) : $transaction = $this->updatesTransaction->execute($transaction, $object); $this->updatesTransactionStatus->execute($transaction, $total === $booking->fix_amount ? ApprovalStatus::PENDING_VERIFICATION : ApprovalStatus::PENDING_SUBMISSION); $this->deletesTransactionDetails->execute($transaction); foreach ($object->getDetails() as $product){ $this->createsTransactionDetail->execute($transaction, $product); } return $this->resourceResponse(new TransactionResource($transaction)); } }