'Update Purchase Order', 'message' => 'You have successfully updated your booking\'s purchase order' ]; } /** @var FetchesBooking */ private $fetchesBooking; /** @var GeneratesTransactionBillNumber */ private $generatesTransactionBillNumber; /** @var CreatePurchaseOrderTransactionProcessor */ private $createPurchaseOrderTransactionProcessor; /** @var RuleEvaluator */ private $ruleEvaluator; /** @var CanPassEditingPORule */ private $canPassEditingPORule; /** * CreatePurchaseOrderTransactionLogic constructor. * @param FetchesBooking $fetchesBooking * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber * @param CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor * @param RuleEvaluator $ruleEvaluator * @param CanPassEditingPORule $canPassEditingPORule */ public function __construct(FetchesBooking $fetchesBooking, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor, RuleEvaluator $ruleEvaluator, CanPassEditingPORule $canPassEditingPORule) { $this->fetchesBooking = $fetchesBooking; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; $this->createPurchaseOrderTransactionProcessor = $createPurchaseOrderTransactionProcessor; $this->ruleEvaluator = $ruleEvaluator; $this->canPassEditingPORule = $canPassEditingPORule; } /** * @param Request $request * @param string $id * @return JsonResponse * @throws \App\Classes\Exceptions\MalformedRequestException * @throws \App\Classes\Exceptions\CriteriaNotFulfilledException */ public function logic(Request $request, $id = '') : JsonResponse { //This checking is excluded for (1) Admin, (2) Update of booking amount post payment as user if(!in_array(Auth::user()->type, RoleTypes::ADMIN_ROLES) && !$request->has('is_privilleged_update')){ $dto = new CreatePurchaseOrderDTO($request->all()); $result = $this->ruleEvaluator->evaluate([ $this->canPassEditingPORule ], $dto); if ($result->failed()) { throw new CriteriaNotFulfilledException("- " . implode("
- ", $result->messages())); } } /** @var Booking $booking */ $booking = $this->fetchesBooking->execute(['id' => $request->route('id') ?? $id]); $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 = $this->createPurchaseOrderTransactionProcessor->execute($booking, $object); return $this->resourceResponse(new TransactionResource($transaction)); } }