Skip to content

Commit 03be81e

Browse files
committed
Add ability to edit order
1 parent 0604787 commit 03be81e

File tree

37 files changed

+763
-8070
lines changed

37 files changed

+763
-8070
lines changed

backend/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ yarn-error.log
1919
/.vscode
2020
.idea
2121
/app-back
22+
bootstrap/cache

backend/app/DomainObjects/Generated/OrderDomainObjectAbstract.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ abstract class OrderDomainObjectAbstract extends \HiEvents\DomainObjects\Abstrac
4040
final public const TOTAL_FEE = 'total_fee';
4141
final public const LOCALE = 'locale';
4242
final public const PAYMENT_PROVIDER = 'payment_provider';
43+
final public const NOTES = 'notes';
4344

4445
protected int $id;
4546
protected int $event_id;
@@ -71,6 +72,7 @@ abstract class OrderDomainObjectAbstract extends \HiEvents\DomainObjects\Abstrac
7172
protected float $total_fee = 0.0;
7273
protected string $locale = 'en';
7374
protected ?string $payment_provider = null;
75+
protected ?string $notes = null;
7476

7577
public function toArray(): array
7678
{
@@ -105,6 +107,7 @@ public function toArray(): array
105107
'total_fee' => $this->total_fee ?? null,
106108
'locale' => $this->locale ?? null,
107109
'payment_provider' => $this->payment_provider ?? null,
110+
'notes' => $this->notes ?? null,
108111
];
109112
}
110113

@@ -437,4 +440,15 @@ public function getPaymentProvider(): ?string
437440
{
438441
return $this->payment_provider;
439442
}
443+
444+
public function setNotes(?string $notes): self
445+
{
446+
$this->notes = $notes;
447+
return $this;
448+
}
449+
450+
public function getNotes(): ?string
451+
{
452+
return $this->notes;
453+
}
440454
}

backend/app/Exports/OrdersExport.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public function headings(): array
6464
__('Is Free Order'),
6565
__('Is Manually Created'),
6666
__('Billing Address'),
67+
__('Notes')
6768
], $questionTitles);
6869
}
6970

@@ -105,6 +106,7 @@ public function map($order): array
105106
$order->isFreeOrder(),
106107
$order->getIsManuallyCreated(),
107108
$order->getBillingAddressString(),
109+
$order->getNotes(),
108110
], $answers->toArray());
109111
}
110112

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace HiEvents\Http\Actions\Orders;
4+
5+
use HiEvents\DomainObjects\EventDomainObject;
6+
use HiEvents\Http\Actions\BaseAction;
7+
use HiEvents\Http\Request\Order\EditOrderRequest;
8+
use HiEvents\Resources\Order\OrderResource;
9+
use HiEvents\Services\Application\Handlers\Order\DTO\EditOrderDTO;
10+
use HiEvents\Services\Application\Handlers\Order\EditOrderHandler;
11+
use Illuminate\Http\JsonResponse;
12+
13+
class EditOrderAction extends BaseAction
14+
{
15+
public function __construct(
16+
private readonly EditOrderHandler $handler
17+
)
18+
{
19+
}
20+
21+
public function __invoke(EditOrderRequest $request, int $eventId, int $orderId): JsonResponse
22+
{
23+
$this->isActionAuthorized($eventId, EventDomainObject::class);
24+
25+
$order = $this->handler->handle(new EditOrderDTO(
26+
id: $orderId,
27+
first_name: $request->validated('first_name'),
28+
last_name: $request->validated('last_name'),
29+
email: $request->validated('email'),
30+
notes: $request->validated('notes'),
31+
));
32+
33+
return $this->resourceResponse(OrderResource::class, $order);
34+
}
35+
36+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace HiEvents\Http\Request\Order;
4+
5+
use HiEvents\Http\Request\BaseRequest;
6+
use HiEvents\Validators\Rules\RulesHelper;
7+
8+
class EditOrderRequest extends BaseRequest
9+
{
10+
public function rules(): array
11+
{
12+
return [
13+
'email' => RulesHelper::REQUIRED_EMAIL,
14+
'first_name' => RulesHelper::REQUIRED_STRING,
15+
'last_name' => RulesHelper::REQUIRED_STRING,
16+
'notes' => RulesHelper::OPTIONAL_TEXT_MEDIUM_LENGTH,
17+
];
18+
}
19+
}

backend/app/Resources/Order/OrderResource.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ public function toArray(Request $request): array
3939
'is_free_order' => $this->isFreeOrder(),
4040
'is_manually_created' => $this->getIsManuallyCreated(),
4141
'taxes_and_fees_rollup' => $this->getTaxesAndFeesRollup(),
42+
'address' => $this->getAddress(),
43+
'notes' => $this->getNotes(),
4244
'order_items' => $this->when(
4345
!is_null($this->getOrderItems()),
4446
fn() => OrderItemResource::collection($this->getOrderItems())

backend/app/Services/Application/Handlers/Event/CreateEventHandler.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,17 @@
99
use HiEvents\Services\Application\Handlers\Event\DTO\CreateEventDTO;
1010
use HiEvents\Services\Domain\Event\CreateEventService;
1111
use HiEvents\Services\Domain\Organizer\OrganizerFetchService;
12+
use HiEvents\Services\Domain\ProductCategory\CreateProductCategoryService;
13+
use Illuminate\Database\DatabaseManager;
1214
use Throwable;
1315

1416
class CreateEventHandler
1517
{
1618
public function __construct(
17-
private readonly CreateEventService $createEventService,
18-
private readonly OrganizerFetchService $organizerFetchService
19+
private readonly CreateEventService $createEventService,
20+
private readonly OrganizerFetchService $organizerFetchService,
21+
private readonly CreateProductCategoryService $createProductCategoryService,
22+
private readonly DatabaseManager $databaseManager,
1923
)
2024
{
2125
}
@@ -25,6 +29,15 @@ public function __construct(
2529
* @throws Throwable
2630
*/
2731
public function handle(CreateEventDTO $eventData): EventDomainObject
32+
{
33+
return $this->databaseManager->transaction(fn() => $this->createEvent($eventData));
34+
}
35+
36+
/**
37+
* @throws OrganizerNotFoundException
38+
* @throws Throwable
39+
*/
40+
private function createEvent(CreateEventDTO $eventData): EventDomainObject
2841
{
2942
$organizer = $this->organizerFetchService->fetchOrganizer(
3043
organizerId: $eventData->organizer_id,
@@ -46,6 +59,10 @@ public function handle(CreateEventDTO $eventData): EventDomainObject
4659
->setEventSettings($eventData->event_settings)
4760
->setLocationDetails($eventData->location_details?->toArray());
4861

49-
return $this->createEventService->createEvent($event);
62+
$newEvent = $this->createEventService->createEvent($event);
63+
64+
$this->createProductCategoryService->createDefaultProductCategory($newEvent);
65+
66+
return $newEvent;
5067
}
5168
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace HiEvents\Services\Application\Handlers\Order\DTO;
4+
5+
use HiEvents\DataTransferObjects\BaseDTO;
6+
7+
class EditOrderDTO extends BaseDTO
8+
{
9+
public function __construct(
10+
public int $id,
11+
public string $first_name,
12+
public string $last_name,
13+
public string $email,
14+
public ?string $notes,
15+
)
16+
{
17+
}
18+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace HiEvents\Services\Application\Handlers\Order;
4+
5+
use HiEvents\DomainObjects\OrderDomainObject;
6+
use HiEvents\Services\Application\Handlers\Order\DTO\EditOrderDTO;
7+
use HiEvents\Services\Domain\Order\EditOrderService;
8+
use Psr\Log\LoggerInterface;
9+
10+
class EditOrderHandler
11+
{
12+
public function __construct(
13+
private readonly EditOrderService $editOrderService,
14+
private readonly LoggerInterface $logger,
15+
)
16+
{
17+
}
18+
19+
public function handle(EditOrderDTO $dto): OrderDomainObject
20+
{
21+
$this->logger->info(__('Editing order with ID: :id', [
22+
'id' => $dto->id,
23+
]));
24+
25+
return $this->editOrderService->editOrder(
26+
id: $dto->id,
27+
first_name: $dto->first_name,
28+
last_name: $dto->last_name,
29+
email: $dto->email,
30+
notes: $dto->notes
31+
);
32+
}
33+
}

backend/app/Services/Application/Handlers/Order/MarkOrderAsPaidHandler.php

Lines changed: 11 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -2,98 +2,35 @@
22

33
namespace HiEvents\Services\Application\Handlers\Order;
44

5-
use HiEvents\DomainObjects\Generated\OrderDomainObjectAbstract;
65
use HiEvents\DomainObjects\OrderDomainObject;
7-
use HiEvents\DomainObjects\Status\AttendeeStatus;
8-
use HiEvents\DomainObjects\Status\InvoiceStatus;
9-
use HiEvents\DomainObjects\Status\OrderPaymentStatus;
10-
use HiEvents\DomainObjects\Status\OrderStatus;
11-
use HiEvents\Events\OrderStatusChangedEvent;
126
use HiEvents\Exceptions\ResourceConflictException;
13-
use HiEvents\Repository\Interfaces\AttendeeRepositoryInterface;
14-
use HiEvents\Repository\Interfaces\InvoiceRepositoryInterface;
15-
use HiEvents\Repository\Interfaces\OrderRepositoryInterface;
167
use HiEvents\Services\Application\Handlers\Order\DTO\MarkOrderAsPaidDTO;
17-
use Illuminate\Database\DatabaseManager;
8+
use HiEvents\Services\Domain\Order\MarkOrderAsPaidService;
9+
use Psr\Log\LoggerInterface;
1810
use Throwable;
1911

2012
class MarkOrderAsPaidHandler
2113
{
2214
public function __construct(
23-
private readonly OrderRepositoryInterface $orderRepository,
24-
private readonly DatabaseManager $databaseManager,
25-
private readonly InvoiceRepositoryInterface $invoiceRepository,
26-
private readonly AttendeeRepositoryInterface $attendeeRepository,
15+
private readonly MarkOrderAsPaidService $markOrderAsPaidService,
16+
private readonly LoggerInterface $logger,
2717
)
2818
{
2919
}
3020

3121
/**
32-
* @throws ResourceConflictException
33-
* @throws Throwable
22+
* @throws ResourceConflictException|Throwable
3423
*/
3524
public function handle(MarkOrderAsPaidDTO $dto): OrderDomainObject
3625
{
37-
return $this->databaseManager->transaction(fn() => $this->markOrderAsPaid($dto));
38-
}
39-
40-
/**
41-
* @throws ResourceConflictException
42-
*/
43-
private function markOrderAsPaid(MarkOrderAsPaidDTO $dto): OrderDomainObject
44-
{
45-
/** @var OrderDomainObject $order */
46-
$order = $this->orderRepository->findFirstWhere([
47-
OrderDomainObjectAbstract::ID => $dto->orderId,
48-
OrderDomainObjectAbstract::EVENT_ID => $dto->eventId,
49-
]);
50-
51-
if ($order->getStatus() !== OrderStatus::AWAITING_OFFLINE_PAYMENT->name) {
52-
throw new ResourceConflictException(__('Order is not awaiting offline payment'));
53-
}
54-
55-
$this->updateOrderStatus($dto);
56-
57-
$this->updateOrderInvoice($dto);
58-
59-
$updatedOrder = $this->orderRepository->findById($dto->orderId);
60-
61-
$this->updateAttendeeStatuses($updatedOrder);
62-
63-
OrderStatusChangedEvent::dispatch($updatedOrder, false);
64-
65-
return $updatedOrder;
66-
}
67-
68-
private function updateOrderInvoice(MarkOrderAsPaidDTO $dto): void
69-
{
70-
$invoice = $this->invoiceRepository->findLatestInvoiceForOrder($dto->orderId);
71-
72-
if ($invoice) {
73-
$this->invoiceRepository->updateFromArray($invoice->getId(), [
74-
'status' => InvoiceStatus::PAID->name,
75-
]);
76-
}
77-
}
78-
79-
private function updateOrderStatus(MarkOrderAsPaidDTO $dto): void
80-
{
81-
$this->orderRepository->updateFromArray($dto->orderId, [
82-
OrderDomainObjectAbstract::STATUS => OrderStatus::COMPLETED->name,
83-
OrderDomainObjectAbstract::PAYMENT_STATUS => OrderPaymentStatus::PAYMENT_RECEIVED->name,
26+
$this->logger->info(__('Marking order as paid'), [
27+
'orderId' => $dto->orderId,
28+
'eventId' => $dto->eventId,
8429
]);
85-
}
8630

87-
private function updateAttendeeStatuses(OrderDomainObject $updatedOrder): void
88-
{
89-
$this->attendeeRepository->updateWhere(
90-
attributes: [
91-
'status' => AttendeeStatus::ACTIVE->name,
92-
],
93-
where: [
94-
'order_id' => $updatedOrder->getId(),
95-
'status' => AttendeeStatus::AWAITING_PAYMENT->name,
96-
],
31+
return $this->markOrderAsPaidService->markOrderAsPaid(
32+
$dto->orderId,
33+
$dto->eventId,
9734
);
9835
}
9936
}

0 commit comments

Comments
 (0)