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;
    }
}