Skip to content

Commit b42497f

Browse files
authored
Merge pull request #438 from HiEventsDev/develop
main <- develop
2 parents d777b8a + f4ba792 commit b42497f

File tree

7 files changed

+143
-78
lines changed

7 files changed

+143
-78
lines changed

backend/app/Jobs/Order/SendOrderDetailsEmailJob.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ public function __construct(private readonly OrderDomainObject $order)
2222

2323
public function handle(SendOrderDetailsService $service): void
2424
{
25-
$service->sendOrderSummaryAndProductEmails($this->order);
25+
$service->sendOrderSummaryAndTicketEmails($this->order);
2626
}
2727
}

backend/app/Services/Domain/Mail/SendOrderDetailsService.php

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@
1818
use HiEvents\Services\Domain\Attendee\SendAttendeeTicketService;
1919
use Illuminate\Mail\Mailer;
2020

21-
readonly class SendOrderDetailsService
21+
class SendOrderDetailsService
2222
{
2323
public function __construct(
24-
private EventRepositoryInterface $eventRepository,
25-
private OrderRepositoryInterface $orderRepository,
26-
private Mailer $mailer,
27-
private SendAttendeeTicketService $sendAttendeeTicketService,
24+
private readonly EventRepositoryInterface $eventRepository,
25+
private readonly OrderRepositoryInterface $orderRepository,
26+
private readonly Mailer $mailer,
27+
private readonly SendAttendeeTicketService $sendAttendeeTicketService,
2828
)
2929
{
3030
}
3131

32-
public function sendOrderSummaryAndProductEmails(OrderDomainObject $order): void
32+
public function sendOrderSummaryAndTicketEmails(OrderDomainObject $order): void
3333
{
3434
$order = $this->orderRepository
3535
->loadRelation(OrderItemDomainObject::class)
@@ -59,6 +59,26 @@ public function sendOrderSummaryAndProductEmails(OrderDomainObject $order): void
5959
}
6060
}
6161

62+
public function sendCustomerOrderSummary(
63+
OrderDomainObject $order,
64+
EventDomainObject $event,
65+
OrganizerDomainObject $organizer,
66+
EventSettingDomainObject $eventSettings,
67+
?InvoiceDomainObject $invoice = null
68+
): void
69+
{
70+
$this->mailer
71+
->to($order->getEmail())
72+
->locale($order->getLocale())
73+
->send(new OrderSummary(
74+
order: $order,
75+
event: $event,
76+
organizer: $organizer,
77+
eventSettings: $eventSettings,
78+
invoice: $invoice,
79+
));
80+
}
81+
6282
private function sendAttendeeTicketEmails(OrderDomainObject $order, EventDomainObject $event): void
6383
{
6484
$sentEmails = [];
@@ -81,16 +101,13 @@ private function sendAttendeeTicketEmails(OrderDomainObject $order, EventDomainO
81101

82102
private function sendOrderSummaryEmails(OrderDomainObject $order, EventDomainObject $event): void
83103
{
84-
$this->mailer
85-
->to($order->getEmail())
86-
->locale($order->getLocale())
87-
->send(new OrderSummary(
88-
order: $order,
89-
event: $event,
90-
organizer: $event->getOrganizer(),
91-
eventSettings: $event->getEventSettings(),
92-
invoice: $order->getLatestInvoice(),
93-
));
104+
$this->sendCustomerOrderSummary(
105+
order: $order,
106+
event: $event,
107+
organizer: $event->getOrganizer(),
108+
eventSettings: $event->getEventSettings(),
109+
invoice: $order->getLatestInvoice(),
110+
);
94111

95112
if ($order->getIsManuallyCreated() || !$event->getEventSettings()->getNotifyOrganizerOfNewOrders()) {
96113
return;

backend/app/Services/Domain/Order/MarkOrderAsPaidService.php

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@
44

55
use HiEvents\DomainObjects\AccountConfigurationDomainObject;
66
use HiEvents\DomainObjects\AccountDomainObject;
7+
use HiEvents\DomainObjects\AttendeeDomainObject;
78
use HiEvents\DomainObjects\Enums\PaymentProviders;
89
use HiEvents\DomainObjects\Enums\WebhookEventType;
910
use HiEvents\DomainObjects\EventDomainObject;
11+
use HiEvents\DomainObjects\EventSettingDomainObject;
1012
use HiEvents\DomainObjects\Generated\OrderDomainObjectAbstract;
13+
use HiEvents\DomainObjects\InvoiceDomainObject;
1114
use HiEvents\DomainObjects\OrderDomainObject;
15+
use HiEvents\DomainObjects\OrderItemDomainObject;
16+
use HiEvents\DomainObjects\OrganizerDomainObject;
1217
use HiEvents\DomainObjects\Status\AttendeeStatus;
1318
use HiEvents\DomainObjects\Status\InvoiceStatus;
1419
use HiEvents\DomainObjects\Status\OrderApplicationFeeStatus;
@@ -21,6 +26,7 @@
2126
use HiEvents\Repository\Interfaces\EventRepositoryInterface;
2227
use HiEvents\Repository\Interfaces\InvoiceRepositoryInterface;
2328
use HiEvents\Repository\Interfaces\OrderRepositoryInterface;
29+
use HiEvents\Services\Domain\Mail\SendOrderDetailsService;
2430
use HiEvents\Services\Infrastructure\Webhook\WebhookDispatchService;
2531
use Illuminate\Database\DatabaseManager;
2632
use Throwable;
@@ -36,6 +42,7 @@ public function __construct(
3642
private readonly OrderApplicationFeeCalculationService $orderApplicationFeeCalculationService,
3743
private readonly EventRepositoryInterface $eventRepository,
3844
private readonly OrderApplicationFeeService $orderApplicationFeeService,
45+
private readonly SendOrderDetailsService $sendOrderDetailsService,
3946
)
4047
{
4148
}
@@ -50,10 +57,19 @@ public function markOrderAsPaid(
5057
{
5158
return $this->databaseManager->transaction(function () use ($orderId, $eventId) {
5259
/** @var OrderDomainObject $order */
53-
$order = $this->orderRepository->findFirstWhere([
54-
OrderDomainObjectAbstract::ID => $orderId,
55-
OrderDomainObjectAbstract::EVENT_ID => $eventId,
56-
]);
60+
$order = $this->orderRepository
61+
->loadRelation(OrderItemDomainObject::class)
62+
->loadRelation(AttendeeDomainObject::class)
63+
->loadRelation(InvoiceDomainObject::class)
64+
->findFirstWhere([
65+
OrderDomainObjectAbstract::ID => $orderId,
66+
OrderDomainObjectAbstract::EVENT_ID => $eventId,
67+
]);
68+
69+
$event = $this->eventRepository
70+
->loadRelation(new Relationship(OrganizerDomainObject::class, name: 'organizer'))
71+
->loadRelation(new Relationship(EventSettingDomainObject::class))
72+
->findById($order->getEventId());
5773

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

8096
$this->storeApplicationFeePayment($updatedOrder);
8197

98+
$this->sendOrderDetailsService->sendCustomerOrderSummary(
99+
order: $updatedOrder,
100+
event: $event,
101+
organizer: $event->getOrganizer(),
102+
eventSettings: $event->getEventSettings(),
103+
invoice: $order->getLatestInvoice(),
104+
);
105+
82106
return $updatedOrder;
83107
});
84108
}

backend/resources/views/emails/orders/organizer/summary-for-organizer.blade.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
</div>
2121
@endif
2222
23+
{{ __('Name') }}: <b>{{ $order->getFullName() }}</b><br>
24+
{{ __('Email') }}: <b>{{ $order->getEmail() }}</b><br>
2325
{{ __('Order Amount:') }} <b>{{ Currency::format($order->getTotalGross(), $event->getCurrency()) }}</b><br>
2426
{{ __('Order ID:') }} <b>{{ $order->getPublicId() }}</b><br>
2527
{{ __('Order Status:') }} <b>{{ $order->getHumanReadableStatus() }}</b>

backend/resources/views/emails/orders/summary.blade.php

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
# {{ __('Your Order is Confirmed! ') }} 🎉
1010

1111
@if($order->isOrderAwaitingOfflinePayment() === false)
12+
1213
<p>
1314
{{ __('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')]) }}
1415
</p>
16+
1517
@else
18+
1619
<div>
1720
<p>
1821
{{ __('Your order is pending payment. Tickets have been issued but will not be valid until payment is received.') }}
@@ -24,18 +27,29 @@
2427
{!! $eventSettings->getOfflinePaymentInstructions() !!}
2528
</div>
2629
</div>
30+
2731
@endif
2832

2933
<p>
3034

31-
## {{ __('Event Details') }}
35+
# {{ __('Event Details') }}
3236
**{{ __('Event Name:') }}** {{ $event->getTitle() }}
3337
<br>
3438
**{{ __('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') }}
3539

3640
</p>
3741

38-
## {{ __('Order Summary') }}
42+
@if($eventSettings->getPostCheckoutMessage() && $order->isOrderCompleted())
43+
<p>
44+
45+
# {{ __('Additional Information') }}
46+
47+
{!! $eventSettings->getPostCheckoutMessage() !!}
48+
49+
</p>
50+
@endif
51+
52+
# {{ __('Order Summary') }}
3953
- **{{ __('Order Number:') }}** {{ $order->getPublicId() }}
4054
- **{{ __('Total Amount:') }}** {{ Currency::format($order->getTotalGross(), $event->getCurrency()) }}
4155

@@ -45,11 +59,6 @@
4559

4660
{{ __('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>.
4761

48-
## {{ __('What\'s Next?') }}
49-
- **{{ __('Download Tickets:') }}** {{ __('Please download your tickets from the order summary page.') }}
50-
- **{{ __('Prepare for the Event:') }}** {{ __('Make sure to note the event date, time, and location.') }}
51-
- **{{ __('Stay Updated:') }}** {{ __('Keep an eye on your email for any updates from the event organizer.') }}
52-
5362
{{ __('Best regards,') }}<br>
5463
{{ config('app.name') }}
5564
</x-mail::message>

backend/routes/mail.php

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<?php
22

33
use HiEvents\DomainObjects\EventDomainObject;
4+
use HiEvents\DomainObjects\EventSettingDomainObject;
45
use HiEvents\DomainObjects\OrderDomainObject;
56
use HiEvents\DomainObjects\OrderItemDomainObject;
67
use HiEvents\DomainObjects\OrganizerDomainObject;
78
use HiEvents\DomainObjects\Status\OrderStatus;
8-
use HiEvents\Mail\Organizer\OrderSummaryForOrganizer;
9+
use HiEvents\Helper\IdHelper;
910
use Illuminate\Support\Facades\Route;
1011

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

2425
$order = (new OrderDomainObject())
26+
->setFirstName('Test')
27+
->setLastName('User')
28+
->setEmail('[email protected]')
2529
->setId(2)
26-
->setPublicId('123')
30+
->setPublicId(IdHelper::publicId('o'))
2731
->setShortId('123')
2832
->setStatus(OrderStatus::COMPLETED->name)
29-
->setOrderItems(collect([$orderItem, $orderItem2]));
33+
->setOrderItems(collect([$orderItem, $orderItem2]))
34+
->setTotalGross(200);
3035

3136
$organizer = (new OrganizerDomainObject())
3237
->setId(1)
3338
->setName('Test Organizer')
3439
->setEmail('[email protected]');
3540

41+
$eventSettings = (new EventSettingDomainObject())
42+
->setSupportEmail('[email protected]')
43+
->setPostCheckoutMessage('Thank you for your order');
44+
3645
$event = (new EventDomainObject())
3746
->setId(1)
3847
->setTitle('Test Event')
3948
->setStartDate(now())
4049
->setTimeZone('UTC')
41-
->setOrganizer($organizer);
50+
->setOrganizer($organizer)
51+
->setEventSettings($eventSettings);
4252

43-
return new OrderSummaryForOrganizer($order, $event);
53+
return new \HiEvents\Mail\Organizer\OrderSummaryForOrganizer(
54+
order: $order,
55+
event: $event,
56+
);
4457
});

frontend/src/components/routes/event/Settings/index.tsx

Lines changed: 45 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -21,52 +21,52 @@ import {useState} from "react";
2121
import {Card} from "../../../common/Card";
2222
import {PaymentAndInvoicingSettings} from "./Sections/PaymentSettings";
2323

24-
const SECTIONS = [
25-
{
26-
id: 'event-details',
27-
label: t`Event Details`,
28-
icon: IconBuildingStore,
29-
component: EventDetailsForm
30-
},
31-
{
32-
id: 'location-settings',
33-
label: t`Location`,
34-
icon: IconMapPin,
35-
component: LocationSettings
36-
},
37-
{
38-
id: 'homepage-settings',
39-
label: t`Checkout`,
40-
icon: IconHome,
41-
component: HomepageAndCheckoutSettings
42-
},
43-
{
44-
id: 'seo-settings',
45-
label: t`SEO`,
46-
icon: IconBrandGoogleAnalytics,
47-
component: SeoSettings
48-
},
49-
{
50-
id: 'email-settings',
51-
label: t`Email`,
52-
icon: IconAt,
53-
component: EmailSettings
54-
},
55-
{
56-
id: 'misc-settings',
57-
label: t`Miscellaneous`,
58-
icon: IconAdjustments,
59-
component: MiscSettings
60-
},
61-
{
62-
id: 'payment-settings',
63-
label: t`Payment & Invoicing`,
64-
icon: IconCreditCard,
65-
component: PaymentAndInvoicingSettings,
66-
}
67-
];
68-
6924
export const Settings = () => {
25+
const SECTIONS = [
26+
{
27+
id: 'event-details',
28+
label: t`Event Details`,
29+
icon: IconBuildingStore,
30+
component: EventDetailsForm
31+
},
32+
{
33+
id: 'location-settings',
34+
label: t`Location`,
35+
icon: IconMapPin,
36+
component: LocationSettings
37+
},
38+
{
39+
id: 'homepage-settings',
40+
label: t`Checkout`,
41+
icon: IconHome,
42+
component: HomepageAndCheckoutSettings
43+
},
44+
{
45+
id: 'seo-settings',
46+
label: t`SEO`,
47+
icon: IconBrandGoogleAnalytics,
48+
component: SeoSettings
49+
},
50+
{
51+
id: 'email-settings',
52+
label: t`Email`,
53+
icon: IconAt,
54+
component: EmailSettings
55+
},
56+
{
57+
id: 'misc-settings',
58+
label: t`Miscellaneous`,
59+
icon: IconAdjustments,
60+
component: MiscSettings
61+
},
62+
{
63+
id: 'payment-settings',
64+
label: t`Payment & Invoicing`,
65+
icon: IconCreditCard,
66+
component: PaymentAndInvoicingSettings,
67+
}
68+
];
69+
7070
const isLargeScreen = useMediaQuery('(min-width: 1200px)', true);
7171
const [activeSection, setActiveSection] = useState(SECTIONS[0].id);
7272

0 commit comments

Comments
 (0)