generatesOrderNumber = $generatesOrderNumber; $this->canCreateOrder = $canCreateOrder; $this->createsOrder = $createsOrder; $this->fetchesAddress = $fetchesAddress; $this->createAddress = $createAddress; $this->fetchesCompany = $fetchesCompany; $this->createOrderRolesProcessor = $createOrderRolesProcessor; } /** * @param Request $request * @return Addressable * @throws \App\Classes\Exceptions\AccessForbiddenException * @throws \App\Classes\Exceptions\MalformedRequestException * @throws \App\Classes\Exceptions\RequestValidationException */ public function execute(Request $request){ /** @var CompanyModule $importer */ $importer = $this->fetchesCompany->execute(['id' => $request->get('company_id')])->companyModules()->importers()->first(); $orderObject = new OrderObject($this->generatesOrderNumber->execute(), OrderType::SHARED_CONTAINER, $importer->status === ApprovalStatus::APPROVED ? ApprovalStatus::APPROVED : ApprovalStatus::PENDING_VERIFICATION); $this->canCreateOrder->passes($orderObject); /** @var Order $order */ $order = $this->createsOrder->execute($importer, $orderObject); $address = $this->fetchesAddress->execute(['id' => $request->get('address_id')]); $addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode,$address->reference); $this->createAddress->execute($order, $addressObject); $this->createOrderRolesProcessor->execute($request, $order); return $order; } }