Otázka 01 / 15
Dokončení objednávky
Kolega dostal za úkol dokončení objednávky v checkoutu: po odeslání košíku se má objednávka uložit a dát o ní vědět zákazníkovi i navazujícím systémům (e-mail, SMS, sklad, Heuréka, analytika). Posílá merge request a před mergem ho máš zrevidovat. Co mu vrátíš?
Ctrl/Cmd+klik na metodu, třídu nebo konstantu otevře její deklaraci, Alt+← vrátí zpět.
app › Services › OrderService.php
<?php declare(strict_types=1);
namespace App\Services;
use App\Data\CustomerDetails;
use App\Mail\OrderConfirmationMail;
use App\Models\Cart;
use App\Models\Order;
use App\Services\Analytics\GoogleAnalyticsClient;
use App\Services\Analytics\HeurekaClient;
use App\Services\Sms\SmsGateway;
use App\Services\Warehouse\WarehouseApi;
use Illuminate\Contracts\Mail\Mailer;
final class OrderService
{
public function __construct(
private readonly Mailer $mailer,
private readonly SmsGateway $smsGateway,
private readonly WarehouseApi $warehouseApi,
private readonly HeurekaClient $heurekaClient,
private readonly GoogleAnalyticsClient $analyticsClient,
)
{}
public function placeOrder(Cart $cart, CustomerDetails $customer): Order
{
$order = Order::createFromCart($cart, $customer);
$order->save();
$this->mailer->to($order->email)->send(new OrderConfirmationMail($order));
if ($order->phone !== null) {
$smsText = __('Thank you for your order no. :number.', ['number' => $order->number]);
$this->smsGateway->send($order->phone, $smsText);
}
$this->warehouseApi->reserveItems($order->number, $order->items);
$this->heurekaClient->logOrder($order->email, $order->items->pluck('sku')->all());
$this->analyticsClient->trackPurchase($order->number, $order->total);
return $order;
}
}