FreightOrders/src/FreightOrder/UseCases/CreateFreightOrder.php

112 lines
3.2 KiB
PHP

<?php
namespace FreightQuote\FreightOrder\UseCases;
use FreightQuote\Bid\Bid;
use FreightQuote\Bid\BidRepository;
use FreightQuote\Carrier\Carrier;
use FreightQuote\Carrier\CarrierRepository;
use FreightQuote\Email\Email;
use FreightQuote\Email\Emailer;
use FreightQuote\FreightOrder\FreightOrderRepository;
use FreightQuote\FreightOrder\FreightOrder;
class CreateFreightOrder
{
public function __construct(
private FreightOrderRepository $freightOrderRepo,
private CarrierRepository $carrierRepo,
private BidRepository $bidRepo,
private Emailer $emailer,
) {}
public function execute(
CreateFreightOrderRequestDTO $dto,
): CreateFreightOrderResponseDTO {
$savedFreightOrder = $this->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,
));
}
}