Кто есть кто
ЦСОКонсьерж-сервис. Создаёт поручение, передаёт реквизиты клиенту.
ПАПлатежный агент. Курс, УИН, выплата партнёру, журнал событий.
КлиентПлатит рубли на счёт ПА по УИН или ссылке.
Банк / формаВыписка по УИН (8.1) или оплата картой на форме (8.2).
ПартнёрОтель, ресторан, трансфер. Подтверждает услугу вебхуком.
8.1 INVOICE — инвойс и SWIFT
Партнёр выставил инвойс в своей валюте. Клиент платит рубли на счёт ПА, ПА конвертирует и отправляет SWIFT MT103.
sequenceDiagram
participant CSO as ЦСО
participant PA as ПА
participant Client as Клиент
participant BankNR as Банк-нерезидент
participant Partner as Партнёр
CSO->>PA: POST /v1/orders (scenario INVOICE)
PA-->>CSO: 201 pa_order_id, DRAFT
CSO->>PA: PATCH /assign
CSO->>PA: POST /payment-details
PA->>PA: Фиксация курса, генерация УИН
PA-->>CSO: Реквизиты ПА в рублях + УИН, AWAITING_PAYMENT
Client->>PA: Перевод рублей на счёт ПА (УИН в назначении)
Note over PA: Выписка банка счёта ПА → POST /v1/callbacks/bank/statement
PA->>PA: Сверка по УИН, CLIENT_PAID
PA->>BankNR: Покупка валюты, FX_EXECUTED
BankNR->>Partner: SWIFT MT103 на IBAN партнёра
PA-->>CSO: order.partner_paid + подтверждение SWIFT
Partner->>PA: POST /v1/callbacks/partner/service-confirmed
PA-->>CSO: order.status_changed COMPLETED
8.2 PAYMENT_LINK — форма партнёра
Инвойса нет: у партнёра платёжная страница. Клиент платит рубли ПА, ПА оплачивает форму иностранной картой.
sequenceDiagram
participant CSO as ЦСО
participant PA as ПА
participant Client as Клиент
participant Form as Форма партнёра
participant Partner as Партнёр
CSO->>PA: POST /v1/orders (scenario PAYMENT_LINK)
CSO->>PA: PATCH /assign
CSO->>PA: POST /payment-details
PA-->>CSO: Платёжная ссылка в рублях, AWAITING_PAYMENT
Client->>PA: Оплата рублями по ссылке
PA->>PA: CLIENT_PAID, конвертация в валюту
PA->>Form: Оплата иностранной картой
Form-->>PA: Код авторизации и чек
PA-->>CSO: order.partner_paid
Partner->>PA: Подтверждение услуги
PA-->>CSO: COMPLETED
Воронка статусов
Переходы атомарны и пишутся в журнал. Любой шаг вне схемы — 409.
stateDiagram-v2
[*] --> DRAFT
DRAFT --> IN_PROGRESS: взято в работу
DRAFT --> PENDING_DOCS: запрошены документы
PENDING_DOCS --> IN_PROGRESS: документы получены
IN_PROGRESS --> PENDING_DOCS: запрошены документы
IN_PROGRESS --> FX_FIXED: курс зафиксирован
FX_FIXED --> AWAITING_PAYMENT: реквизиты выданы
AWAITING_PAYMENT --> CLIENT_PAID: поступили рубли
CLIENT_PAID --> FX_EXECUTED: конвертация
FX_EXECUTED --> PARTNER_PAID: партнёр оплачен
PARTNER_PAID --> COMPLETED: услуга подтверждена
DRAFT --> REJECTED
PENDING_DOCS --> REJECTED
IN_PROGRESS --> REJECTED
FX_FIXED --> REJECTED
AWAITING_PAYMENT --> REJECTED
CLIENT_PAID --> REFUND_INITIATED
FX_EXECUTED --> REFUND_INITIATED
PARTNER_PAID --> REFUND_INITIATED
REFUND_INITIATED --> REFUNDED
DRAFT --> EXPIRED
PENDING_DOCS --> EXPIRED
IN_PROGRESS --> EXPIRED
FX_FIXED --> EXPIRED
AWAITING_PAYMENT --> EXPIRED
Сценарий рассказа
Дев-стенд: meafdev.ru. После рестарта API снова npm run demo:seed (данные в памяти процесса).
Вход Ops: admin@meafcoop.com / Admin123!
- Dashboard — воронка «как в проде»: ждут оплату, ждут документы, ждут ваучер, закрытые, возврат. Через ~30 с на Webhooks появится DLQ (вебхуки партнёров на example.com не доставляются).
- CSO-DEMO-HOTEL-ROMA — полный 8.1 до COMPLETED. Карточка: УИН, SWIFT, чек, журнал событий.
- CSO-DEMO-ISTANBUL-DINNER — полный 8.2. Отличие: выплата картой на форме, не MT103 (auth code на карточке).
- CSO-DEMO-AWAIT-UIN — AWAITING_PAYMENT. На карточке УИН и р/с: «это отдаём клиенту». Для 8.2 ссылка ПА открывается как
/pay/{id}. - CSO-DEMO-NEED-PASSPORT — PENDING_DOCS. Очередь оператора.
- CSO-DEMO-DRAFT-DUBAI — DRAFT. «Assign на себя», затем «Выдать реквизиты» вживую (роль Operator / Superadmin).
- CSO-DEMO-WAIT-VOUCHER — PARTNER_PAID: деньги ушли, услуги ещё нет. Кнопка «Услуга подтверждена» закрывает в COMPLETED.
- CSO-DEMO-REJECTED и CSO-DEMO-REFUNDED — отказ до оплаты и возврат после выплаты.
- CSO-DEMO-EXPIRED — просроченный deadline; cron раз в минуту переводит в EXPIRED.
Портфель сида
| order_id | Статус | Сценарий | Партнёр |
|---|---|---|---|
CSO-DEMO-HOTEL-ROMA | COMPLETED | INVOICE | PARTNER-777 |
CSO-DEMO-ISTANBUL-DINNER | COMPLETED | PAYMENT_LINK | PARTNER-301 |
CSO-DEMO-DUBAI-TRANSFER | COMPLETED | INVOICE | PARTNER-512 |
CSO-DEMO-AWAIT-UIN | AWAITING_PAYMENT | INVOICE | PARTNER-777 |
CSO-DEMO-AWAIT-LINK | AWAITING_PAYMENT | PAYMENT_LINK | PARTNER-301 |
CSO-DEMO-NEED-PASSPORT | PENDING_DOCS | INVOICE | PARTNER-777 |
CSO-DEMO-DRAFT-DUBAI | DRAFT | INVOICE | PARTNER-512 |
CSO-DEMO-IN-PROGRESS | IN_PROGRESS | PAYMENT_LINK | PARTNER-301 |
CSO-DEMO-WAIT-VOUCHER | PARTNER_PAID | INVOICE | PARTNER-777 |
CSO-DEMO-REJECTED | REJECTED | INVOICE | PARTNER-512 |
CSO-DEMO-REFUNDED | REFUNDED | INVOICE | PARTNER-777 |
CSO-DEMO-EXPIRED | EXPIRED | PAYMENT_LINK | PARTNER-301 |