# Доставка и оплата

## Способы доставки (`/admin/shop/shipping`)

CRUD способов доставки. У каждого:

| Поле | Что |
|---|---|
| `slug` | Машинный ключ |
| `title` | Название (видно покупателю) |
| `description` | Подсказка/детали |
| `mode` | Режим расчёта (см. ниже) |
| `cost` | Базовая стоимость |
| `free_from` | Сумма заказа, начиная с которой бесплатно |
| `is_active` | Показывать в чекауте |
| `sort_order` | Порядок отображения |

### Режимы

| Mode | Поведение |
|---|---|
| `flat` | Фиксированная стоимость = `cost` |
| `by_weight` | Расчёт от веса (требует подключения плагина-калькулятора) |
| `free` | Бесплатно при любой сумме |
| `pickup` | Самовывоз (стоимость = 0, в чекауте может скрывать поле адреса) |

При создании заказа в админке выбор метода доставки автоматически подставляет его стоимость в поле `shipping_cost` (можно перебить вручную).

## Способы оплаты (`/admin/shop/payments`)

Базовая поставка содержит 4 типа:

| Kind | Применение |
|---|---|
| `cash` | Наличные при получении |
| `card_offline` | Карта при получении (терминал у курьера) |
| `online_gateway` | Онлайн-шлюз — требует платёжный плагин |
| `invoice` | Счёт-фактура для B2B |

В колонке `config` (JSON) хранятся ключи API, флаги sandbox и т.п. — структура зависит от подключённого платёжного плагина. Плагин Stripe, например, добавляет методы с `kind=online_gateway` и читает `config.publishable_key`, `config.secret_key`, `config.webhook_secret`.

## Хук для платёжных плагинов

Платёжные шлюзы подключаются через хук `shop.payment.process` (планируется в v1.2). Уже сейчас можно подписаться на `shop.order.created` и инициировать платёж по своей логике:

```php
Hook::addAction('shop.order.created', function (array $order) {
    if ($order['source'] !== 'web') return;
    // ... ваша логика создания платежа
});
```

## Связь с заказом

В заказе хранятся снэпшоты:

- `shipping_method_id`, `shipping_method_title` — id метода + его название на момент покупки.
- `payment_method_id`, `payment_method_title` — то же для оплаты.

Если метод позже удалили — заказ всё равно покажет правильное название.

## База

- `shop_shipping_methods` — `slug`, `title`, `description`, `mode`, `cost`, `free_from`, `is_active`, `sort_order`.
- `shop_payment_methods` — `slug`, `title`, `description`, `kind`, `config` (JSON), `is_active`, `sort_order`.
