updatesDeliveryArrangement = $updatesDeliveryArrangement; $this->updatesSchedule = $updatesSchedule; $this->createsContact = $createsContact; $this->updatesTrackingNumber = $updatesTrackingNumber; } /** * @param String $orderId * @param Request $request * @return JsonResponse * @throws InternalServerErrorException */ public function execute(String $orderId, Request $request){ try { $deliveryArrangementObject = new DeliveryArrangementObject($request->input('type'), $request->input('vehicle_no')); $arrangementId = $this->updatesDeliveryArrangement->execute($orderId, $deliveryArrangementObject); $scheduleObject = new ScheduleObject($request->input('schedule')['ETA'], $request->input('schedule')['ETD'], 1, $request->input('schedule')['remark']); $this->updatesSchedule->execute($arrangementId, $scheduleObject); if($deliveryArrangementObject->getType() === 0){ $contactObject = new ContactObject(Constants::MODULE_TYPES['driver'], $arrangementId, $request->input('name'), $request->input('contact')); Contact::updateOrCreate(['type' => $contactObject->getType(), 'reference_id' => $contactObject->getReferenceId()], ['name' => $contactObject->getName(), 'contact' => $contactObject->getContact()]); $this->createsContact->execute($contactObject, Constants::MODULE_TYPES['driver'], $arrangementId); } if($deliveryArrangementObject->getType() === 1){ $trackingNumberObject = new TrackingNumberObject(1, $request->input('tracking_number'), $request->input('courier')); $this->updatesTrackingNumber->execute($orderId, $trackingNumberObject); } return new JsonResponse(null, HttpStatus::RESOURCE_CREATED); } catch (\Exception $exception){ throw new InternalServerErrorException("Failed to update order's shipping arrangement because {$exception->getMessage()}"); } } }