Гість зробив замовлення через QR-меню ChoiceQR — офіціанту чи менеджеру не треба вручну переносити його в KeyCRM. Стенд ловить вебхук order.created від ChoiceQR (реальна схема з їхньої документації), мапить кожне поле на формат KeyCRM, відсікає повтори одного й того ж замовлення і показує, що піде в KeyCRM ще до того, як там з'явиться платний ключ.
webhook order.created: клієнт, товари, доставка, оплата
дедуп за ID замовлення, мапінг полів, лог помилок
POST /order: покупець, товари, оплата, коментар
Ім'я, телефон, адреса доставки, спосіб доставки, дата/час, товари з кількістю і ціною, загальна сума, коментар клієнта, спосіб оплати, джерело — усе з реальної схеми order.created ChoiceQR.
ChoiceQR повторює вебхук, якщо не отримав 2xx. Сервіс запам'ятовує ID замовлення і другий прихід тієї ж події просто позначає як дубль — у KeyCRM нічого зайвого не потрапить.
Якщо KeyCRM відповів помилкою, недоступний, або формат замовлення несподіваний — запис іде у публічний лог нижче з причиною, нічого не губиться мовчки.
Той самий дедуп-шар і той самий event-роутинг за type легко покриє наступні події ChoiceQR — order.accepted, order.cancelled, order.delivery.update — це вже зміна статусу в KeyCRM, друге питання клієнта в ТЗ.
| Потрібно клієнту | ChoiceQR (order.created) | KeyCRM (POST /order) | ||
|---|---|---|---|---|
| ім'я клієнта | → | delivery.customer.name | → | buyer.full_name |
| телефон | → | delivery.customer.phone | → | buyer.phone |
| адреса доставки | → | delivery.customer.address.* | → | manager_comment (адреса) |
| спосіб доставки | → | type (delivery/takeaway/table) | → | manager_comment (тип) |
| дата та час доставки | → | delivery.when | → | manager_comment (час) |
| товари, кількість, ціна | → | items[]{name,count,price} | → | products[]{name,quantity,price} |
| загальна сума | → | total | → | payment_amount |
| коментар клієнта | → | customerComments[] | → | manager_comment |
| спосіб оплати | → | payBy | → | payment_method |
| джерело замовлення | → | (фіксовано: ChoiceQR) | → | source_id |
KeyCRM не має окремих полів під адресу/дату доставки на рівні API-замовлення — тому вони йдуть у manager_comment читабельним рядком; якщо потрібно окремими колонками — це два додаткові кастомні поля в KeyCRM, налаштовуються за хвилини в самому KeyCRM.
Зліва — приклад вебхука ChoiceQR (можна редагувати), справа — що піде в KeyCRM і що відповість цей сервіс. Другий клік по тій самій кнопці без змін ID покаже дедуп дублів.
POST /demo/choiceqr-keycrm/api/webhook з реальною відповіддю._id у прикладі — друга відповідь буде "duplicate": true, це і є захист від дублів із ТЗ.