diff --git a/src/FreightOrder/UseCases/CreateFreightOrder.php b/src/FreightOrder/UseCases/CreateFreightOrder.php index fec733b..c50045f 100644 --- a/src/FreightOrder/UseCases/CreateFreightOrder.php +++ b/src/FreightOrder/UseCases/CreateFreightOrder.php @@ -4,6 +4,8 @@ namespace FreightQuote\FreightOrder\UseCases; use FreightQuote\Carrier\Carrier; use FreightQuote\Carrier\CarrierRepository; +use FreightQuote\Email\Email; +use FreightQuote\Email\Emailer; use FreightQuote\FreightOrder\FreightOrderRepository; use FreightQuote\FreightOrder\FreightOrder; @@ -12,6 +14,7 @@ class CreateFreightOrder public function __construct( private FreightOrderRepository $freightOrderRepo, private CarrierRepository $carrierRepo, + private Emailer $emailer, ) {} public function execute( @@ -20,7 +23,7 @@ class CreateFreightOrder $savedFreightOrder = $this->saveFreightOrder($dto); $this->handleCarrierActions( $dto->carrierIds, - $savedFreightOrder->getId() + $savedFreightOrder, ); return $savedFreightOrder; @@ -31,14 +34,27 @@ class CreateFreightOrder */ private function handleCarrierActions( array $carrierIds, - int $freightOrderId + FreightOrder $freightOrder ): void { foreach ($carrierIds as $carrierId) { $carrier = $this->carrierRepo->find($carrierId); - $this->updateCarrierOrderIds($carrier, $freightOrderId); + $this->updateCarrierOrderIds($carrier, $freightOrder->getId()); + $this->sendEmail($carrier->getEmail(), $freightOrder); } } + 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 diff --git a/tests/Unit/FreightOrder/UseCases/CreateFreightOrderTest.php b/tests/Unit/FreightOrder/UseCases/CreateFreightOrderTest.php index 5e6e475..448a417 100644 --- a/tests/Unit/FreightOrder/UseCases/CreateFreightOrderTest.php +++ b/tests/Unit/FreightOrder/UseCases/CreateFreightOrderTest.php @@ -2,6 +2,7 @@ namespace Tests\Unit\FreightOrder\UseCases; +use Tests\Fakes\Email\FakeEmailer; use FreightQuote\Carrier\Carrier; use PHPUnit\Framework\TestCase; use FreightQuote\FreightOrder\UseCases\CreateFreightOrder; @@ -12,17 +13,20 @@ use DateTime; class CreateFreightOrderTest extends TestCase { + private FakeEmailer $emailer; private FakeFreightOrderRepository $freightOrderRepo; private FakeCarrierRepository $carrierRepo; private CreateFreightOrder $useCase; public function setUp(): void { + $this->emailer = new FakeEmailer(); $this->freightOrderRepo = new FakeFreightOrderRepository(); $this->carrierRepo = new FakeCarrierRepository(); $this->useCase = new CreateFreightOrder( $this->freightOrderRepo, $this->carrierRepo, + $this->emailer, ); } @@ -84,4 +88,32 @@ class CreateFreightOrderTest extends TestCase $foundCarrier->getFreightOrderIds() ); } + + public function test_email_is_sent(): void + { + $carrierId = 0; + $this->carrierRepo->save(new Carrier( + id: $carrierId, + email: 'test@email.com', + companyName: 'company name', + contactPerson: 'person', + phoneNumber: '123456798', + notes: 'some notes', + loadProfile: 'LTL/FTL', + countriesServing: ['USA'], + freightOrderIds: [], + )); + $dto = new CreateFreightOrderRequestDTO( + shipFrom: 'ny', + shipTo: 'nj', + pickupDate: new DateTime('+5 days'), + deliveryDeadline: new DateTime('+10 days'), + loadDetails: 'some details', + notes: 'some notes', + fileAttachments: ['path/to/file', 'another/path/file'], + carrierIds: [$carrierId], + ); + $createdFreightOrder = $this->useCase->execute($dto); + $this->assertEquals(1, $this->emailer->getSentEmailCount()); + } }