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(); $createdBid = $this->createBid( $freightOrderId, $carrier->getId(), ); $this->sendEmail( $carrier->getEmail(), $freightOrder, $createdBid->getBidLink(), ); $bidsCreated[] = $createdBid; } return $bidsCreated; } private function createBid( int $freightOrderId, int $carrierId ): Bid { return $this->bidRepo->save( new Bid( id: null, freightOrderId: $freightOrderId, carrierId: $carrierId, wasOpened: false, ) ); } private function sendEmail( string $emailAddress, FreightOrder $freightOrder, string $bidLink, ): void { $email = new Email(); $email->addRecipient($emailAddress); $email->setSubject('Freight Order Request'); $email->setBody("Please fill out your bid at this link $bidLink"); foreach ($freightOrder->getFileAttachments() as $file) { $email->addAttachment($file); } $this->emailer->send($email); } 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, )); } }