saveFreightOrder($dto); $bidsCreated = $this->handleCarrierActions( $dto->carrierIds, $savedFreightOrder, ); return new CreateFreightOrderResponseDTO( $savedFreightOrder, $bidsCreated ); } /** * @param int[] $carrierIds * @return Bid[] */ private function handleCarrierActions( array $carrierIds, FreightOrder $freightOrder, ): array { $bidsCreated = []; foreach ($carrierIds as $carrierId) { $carrier = $this->carrierRepo->find($carrierId); $freightOrderId = $freightOrder->getId(); $this->updateCarrierOrderIds($carrier, $freightOrderId); $this->sendEmail($carrier->getEmail(), $freightOrder); $bidsCreated[] = $this->createBid( $freightOrderId, $carrier->getId(), ); } return $bidsCreated; } private function createBid( int $freightOrderId, int $carrierId ): Bid { return $this->bidRepo->save( new Bid( id: null, freightOrderId: $freightOrderId, carrierId: $carrierId, ) ); } private function sendEmail(string $emailAddress, FreightOrder $freightOrder): void { $email = new Email(); $email->addRecipient($emailAddress); $email->setSubject('Freight Order Request'); $email->setBody('Please fill out your bid at this link xxxxxxx'); foreach ($freightOrder->getFileAttachments() as $file) { $email->addAttachment($file); } $this->emailer->send($email); } private function updateCarrierOrderIds( Carrier $carrier, int $freightOrderId ): void { $carrierFreightOrderIds = $carrier->getFreightOrderIds(); $carrierFreightOrderIds[] = $freightOrderId; $carrier->setFreightOrderIds($carrierFreightOrderIds); $this->carrierRepo->save($carrier); } private function saveFreightOrder( CreateFreightOrderRequestDTO $dto, ): FreightOrder { return $this->freightOrderRepo->save( new FreightOrder( null, $dto->shipFrom, $dto->shipTo, $dto->pickupDate, $dto->deliveryDeadline, $dto->loadDetails, $dto->notes, $dto->fileAttachments, $dto->carrierIds, )); } }