send email for freight order bid

This commit is contained in:
Yisroel Baum 2025-11-17 20:47:12 +02:00
parent 701e4fdce5
commit 21216ab52f
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
2 changed files with 51 additions and 3 deletions

View file

@ -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

View file

@ -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());
}
}