Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion backend/app/Jobs/Order/SendOrderDetailsEmailJob.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ public function __construct(private readonly OrderDomainObject $order)

public function handle(SendOrderDetailsService $service): void
{
$service->sendOrderSummaryAndProductEmails($this->order);
$service->sendOrderSummaryAndTicketEmails($this->order);
}
}
49 changes: 33 additions & 16 deletions backend/app/Services/Domain/Mail/SendOrderDetailsService.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,18 @@
use HiEvents\Services\Domain\Attendee\SendAttendeeTicketService;
use Illuminate\Mail\Mailer;

readonly class SendOrderDetailsService
class SendOrderDetailsService
{
public function __construct(
private EventRepositoryInterface $eventRepository,
private OrderRepositoryInterface $orderRepository,
private Mailer $mailer,
private SendAttendeeTicketService $sendAttendeeTicketService,
private readonly EventRepositoryInterface $eventRepository,
private readonly OrderRepositoryInterface $orderRepository,
private readonly Mailer $mailer,
private readonly SendAttendeeTicketService $sendAttendeeTicketService,
)
{
}

public function sendOrderSummaryAndProductEmails(OrderDomainObject $order): void
public function sendOrderSummaryAndTicketEmails(OrderDomainObject $order): void
{
$order = $this->orderRepository
->loadRelation(OrderItemDomainObject::class)
Expand Down Expand Up @@ -59,6 +59,26 @@ public function sendOrderSummaryAndProductEmails(OrderDomainObject $order): void
}
}

public function sendCustomerOrderSummary(
OrderDomainObject $order,
EventDomainObject $event,
OrganizerDomainObject $organizer,
EventSettingDomainObject $eventSettings,
?InvoiceDomainObject $invoice = null
): void
{
$this->mailer
->to($order->getEmail())
->locale($order->getLocale())
->send(new OrderSummary(
order: $order,
event: $event,
organizer: $organizer,
eventSettings: $eventSettings,
invoice: $invoice,
));
}

private function sendAttendeeTicketEmails(OrderDomainObject $order, EventDomainObject $event): void
{
$sentEmails = [];
Expand All @@ -81,16 +101,13 @@ private function sendAttendeeTicketEmails(OrderDomainObject $order, EventDomainO

private function sendOrderSummaryEmails(OrderDomainObject $order, EventDomainObject $event): void
{
$this->mailer
->to($order->getEmail())
->locale($order->getLocale())
->send(new OrderSummary(
order: $order,
event: $event,
organizer: $event->getOrganizer(),
eventSettings: $event->getEventSettings(),
invoice: $order->getLatestInvoice(),
));
$this->sendCustomerOrderSummary(
order: $order,
event: $event,
organizer: $event->getOrganizer(),
eventSettings: $event->getEventSettings(),
invoice: $order->getLatestInvoice(),
);

if ($order->getIsManuallyCreated() || !$event->getEventSettings()->getNotifyOrganizerOfNewOrders()) {
return;
Expand Down
32 changes: 28 additions & 4 deletions backend/app/Services/Domain/Order/MarkOrderAsPaidService.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,16 @@

use HiEvents\DomainObjects\AccountConfigurationDomainObject;
use HiEvents\DomainObjects\AccountDomainObject;
use HiEvents\DomainObjects\AttendeeDomainObject;
use HiEvents\DomainObjects\Enums\PaymentProviders;
use HiEvents\DomainObjects\Enums\WebhookEventType;
use HiEvents\DomainObjects\EventDomainObject;
use HiEvents\DomainObjects\EventSettingDomainObject;
use HiEvents\DomainObjects\Generated\OrderDomainObjectAbstract;
use HiEvents\DomainObjects\InvoiceDomainObject;
use HiEvents\DomainObjects\OrderDomainObject;
use HiEvents\DomainObjects\OrderItemDomainObject;
use HiEvents\DomainObjects\OrganizerDomainObject;
use HiEvents\DomainObjects\Status\AttendeeStatus;
use HiEvents\DomainObjects\Status\InvoiceStatus;
use HiEvents\DomainObjects\Status\OrderApplicationFeeStatus;
Expand All @@ -21,6 +26,7 @@
use HiEvents\Repository\Interfaces\EventRepositoryInterface;
use HiEvents\Repository\Interfaces\InvoiceRepositoryInterface;
use HiEvents\Repository\Interfaces\OrderRepositoryInterface;
use HiEvents\Services\Domain\Mail\SendOrderDetailsService;
use HiEvents\Services\Infrastructure\Webhook\WebhookDispatchService;
use Illuminate\Database\DatabaseManager;
use Throwable;
Expand All @@ -36,6 +42,7 @@ public function __construct(
private readonly OrderApplicationFeeCalculationService $orderApplicationFeeCalculationService,
private readonly EventRepositoryInterface $eventRepository,
private readonly OrderApplicationFeeService $orderApplicationFeeService,
private readonly SendOrderDetailsService $sendOrderDetailsService,
)
{
}
Expand All @@ -50,10 +57,19 @@ public function markOrderAsPaid(
{
return $this->databaseManager->transaction(function () use ($orderId, $eventId) {
/** @var OrderDomainObject $order */
$order = $this->orderRepository->findFirstWhere([
OrderDomainObjectAbstract::ID => $orderId,
OrderDomainObjectAbstract::EVENT_ID => $eventId,
]);
$order = $this->orderRepository
->loadRelation(OrderItemDomainObject::class)
->loadRelation(AttendeeDomainObject::class)
->loadRelation(InvoiceDomainObject::class)
->findFirstWhere([
OrderDomainObjectAbstract::ID => $orderId,
OrderDomainObjectAbstract::EVENT_ID => $eventId,
]);

$event = $this->eventRepository
->loadRelation(new Relationship(OrganizerDomainObject::class, name: 'organizer'))
->loadRelation(new Relationship(EventSettingDomainObject::class))
->findById($order->getEventId());

if ($order->getStatus() !== OrderStatus::AWAITING_OFFLINE_PAYMENT->name) {
throw new ResourceConflictException(__('Order is not awaiting offline payment'));
Expand All @@ -79,6 +95,14 @@ public function markOrderAsPaid(

$this->storeApplicationFeePayment($updatedOrder);

$this->sendOrderDetailsService->sendCustomerOrderSummary(
order: $updatedOrder,
event: $event,
organizer: $event->getOrganizer(),
eventSettings: $event->getEventSettings(),
invoice: $order->getLatestInvoice(),
);

return $updatedOrder;
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
</div>
@endif

{{ __('Name') }}: <b>{{ $order->getFullName() }}</b><br>
{{ __('Email') }}: <b>{{ $order->getEmail() }}</b><br>
{{ __('Order Amount:') }} <b>{{ Currency::format($order->getTotalGross(), $event->getCurrency()) }}</b><br>
{{ __('Order ID:') }} <b>{{ $order->getPublicId() }}</b><br>
{{ __('Order Status:') }} <b>{{ $order->getHumanReadableStatus() }}</b>
Expand Down
23 changes: 16 additions & 7 deletions backend/resources/views/emails/orders/summary.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@
# {{ __('Your Order is Confirmed! ') }} 🎉

@if($order->isOrderAwaitingOfflinePayment() === false)

<p>
{{ __('Congratulations! Your order for :eventTitle on :eventDate at :eventTime was successful. Please find your order details below.', ['eventTitle' => $event->getTitle(), 'eventDate' => (new Carbon(DateHelper::convertFromUTC($event->getStartDate(), $event->getTimezone())))->format('F j, Y'), 'eventTime' => (new Carbon(DateHelper::convertFromUTC($event->getStartDate(), $event->getTimezone())))->format('g:i A')]) }}
</p>

@else

<div>
<p>
{{ __('Your order is pending payment. Tickets have been issued but will not be valid until payment is received.') }}
Expand All @@ -24,18 +27,29 @@
{!! $eventSettings->getOfflinePaymentInstructions() !!}
</div>
</div>

@endif

<p>

## {{ __('Event Details') }}
# {{ __('Event Details') }}
**{{ __('Event Name:') }}** {{ $event->getTitle() }}
<br>
**{{ __('Date & Time:') }}** {{ (new Carbon(DateHelper::convertFromUTC($event->getStartDate(), $event->getTimezone())))->format('F j, Y') }} at {{ (new Carbon(DateHelper::convertFromUTC($event->getStartDate(), $event->getTimezone())))->format('g:i A') }}

</p>

## {{ __('Order Summary') }}
@if($eventSettings->getPostCheckoutMessage() && $order->isOrderCompleted())
<p>

# {{ __('Additional Information') }}

{!! $eventSettings->getPostCheckoutMessage() !!}

</p>
@endif

# {{ __('Order Summary') }}
- **{{ __('Order Number:') }}** {{ $order->getPublicId() }}
- **{{ __('Total Amount:') }}** {{ Currency::format($order->getTotalGross(), $event->getCurrency()) }}

Expand All @@ -45,11 +59,6 @@

{{ __('If you have any questions or need assistance, feel free to reach out to our friendly support team at') }} <a href="mailto:{{ $organizer->getEmail() }}">{{ $organizer->getEmail() }}</a>.

## {{ __('What\'s Next?') }}
- **{{ __('Download Tickets:') }}** {{ __('Please download your tickets from the order summary page.') }}
- **{{ __('Prepare for the Event:') }}** {{ __('Make sure to note the event date, time, and location.') }}
- **{{ __('Stay Updated:') }}** {{ __('Keep an eye on your email for any updates from the event organizer.') }}

{{ __('Best regards,') }}<br>
{{ config('app.name') }}
</x-mail::message>
23 changes: 18 additions & 5 deletions backend/routes/mail.php
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
<?php

use HiEvents\DomainObjects\EventDomainObject;
use HiEvents\DomainObjects\EventSettingDomainObject;
use HiEvents\DomainObjects\OrderDomainObject;
use HiEvents\DomainObjects\OrderItemDomainObject;
use HiEvents\DomainObjects\OrganizerDomainObject;
use HiEvents\DomainObjects\Status\OrderStatus;
use HiEvents\Mail\Organizer\OrderSummaryForOrganizer;
use HiEvents\Helper\IdHelper;
use Illuminate\Support\Facades\Route;

Route::get('/mail-test', static function () {
Expand All @@ -22,23 +23,35 @@
->setItemName('Test Item');

$order = (new OrderDomainObject())
->setFirstName('Test')
->setLastName('User')
->setEmail('test@test.com')
->setId(2)
->setPublicId('123')
->setPublicId(IdHelper::publicId('o'))
->setShortId('123')
->setStatus(OrderStatus::COMPLETED->name)
->setOrderItems(collect([$orderItem, $orderItem2]));
->setOrderItems(collect([$orderItem, $orderItem2]))
->setTotalGross(200);

$organizer = (new OrganizerDomainObject())
->setId(1)
->setName('Test Organizer')
->setEmail('s@d.com');

$eventSettings = (new EventSettingDomainObject())
->setSupportEmail('d@d.com')
->setPostCheckoutMessage('Thank you for your order');

$event = (new EventDomainObject())
->setId(1)
->setTitle('Test Event')
->setStartDate(now())
->setTimeZone('UTC')
->setOrganizer($organizer);
->setOrganizer($organizer)
->setEventSettings($eventSettings);

return new OrderSummaryForOrganizer($order, $event);
return new \HiEvents\Mail\Organizer\OrderSummaryForOrganizer(
order: $order,
event: $event,
);
});
Loading