generatesPurchaseOrderProducts = $generatesPurchaseOrderProducts; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; $this->createPurchaseOrderTransactionProcessor = $createPurchaseOrderTransactionProcessor; } /** * @return array */ protected function notification():array { return [ 'title' => 'Purchase Order Approval', 'message' => 'You have successfully updated the Purchase order status' ]; } /** @var GeneratesPurchaseOrderProducts */ private $generatesPurchaseOrderProducts; /** @var GeneratesTransactionBillNumber */ private $generatesTransactionBillNumber; /** @var CreatePurchaseOrderTransactionProcessor */ private $createPurchaseOrderTransactionProcessor; /** * @param Request $request * @return JsonResponse * @throws \App\Classes\Exceptions\MalformedRequestException */ public function logic(Request $request) : JsonResponse { $bookings = Booking::where('service_id', '!=', 4)->where(function($query){ return $query->whereMonth('created_at', '=', 03)->whereYear('created_at', 2023); })->whereDoesntHave('transactions', function($q){ $q->where('type', TransactionType::PURCHASE_ORDER); $q->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED]); })->get(); foreach ($bookings as $booking) { $po = Transaction::where('type', TransactionType::PURCHASE_ORDER) ->where('status', ApprovalStatus::APPROVED)->where('issuer', $booking->company_id) ->select('*', DB::raw('abs(amount - ' . $booking->fix_amount . ') as nearest_price'))->orderBy('nearest_price')->first(); if (!$po) { $po = Transaction::where('type', TransactionType::PURCHASE_ORDER) ->where('status', ApprovalStatus::APPROVED)->select('*', DB::raw('abs(amount - ' . $booking->fix_amount . ') as nearest_price'))->orderBy('nearest_price')->first(); } $products = $this->generatesPurchaseOrderProducts->execute($po, $booking->fix_amount); $deference = $booking->fix_amount - $products->sum('total'); if($deference > -150 && $deference < 150 && $deference != 0) { $products->push([ 'description' => $deference < 0 ? 'Discount':'Shipping Fee', 'quantity' => 1, 'stockCode' => '', 'total' => $deference, 'unit_price' => $deference ]); } $billNumber = $this->generatesTransactionBillNumber->execute('XPO-'); $total = $products->sum('total'); $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->toArray()); $this->createPurchaseOrderTransactionProcessor->execute($booking, $object); } return $this->response([]); } }