Kitworks Event Suite — повний гід з налаштування
Від чистої бази до проданого квитка та розрахунку з гідом. На прикладі екскурсійної компанії «Цікавий Київ» (Odoo 19).
Цей гід проходить весь шлях з нуля на чистій базі event19 з demo-даними. Усі скриншоти — реальні екрани локального стека Odoo 19.
0. Що це за система і кому вона потрібна
Kitworks Event Suite — це надбудова над модулем Events ядра Odoo, заточена під компанії, що регулярно проводять платні заходи з виїзним персоналом: екскурсійні бюро, тури, майстер-класи, виїзні лекції. Ключові відмінності від «голого» Odoo Events:
Один шаблон екскурсії → з нього штампуються десятки конкретних подій (регулярних або індивідуальних) однією дією.
Повний / пільговий / дитячий квиток з автоматичним розрахунком ціни від базової, з вікнами продажу.
Планований / підтверджений / оплачений дохід і витрати в одній таблиці, що перераховується автоматично.
Ставка гіда (за годину / за подію / за групу / % прибутку), гаманець гіда та взаєморозрахунок після турів.
Транспорт, харчування, вхідні квитки — з формулою «фікс + на людину + мінімалка» і одержувачем оплати.
Створення подій, реєстрацій та продаж квитків із зовнішнього сайту (WordPress/WooCommerce).
1. Які модулі встановити для якого функціоналу
Suite складається з ~34 опційних модулів kw_event_*. Встановлюйте не «усе підряд», а під потрібний функціонал — залежності підтягнуться автоматично. Нижче — групи за призначенням.
1.1 База (встановити завжди)
| Модуль | Що дає |
|---|---|
kw_event_catalog | Каталог екскурсій — шаблони подій, місця збору (start places), тривалість, тип. |
kw_event_sale | Квитки як товари: типи квитків, пресети, знижки, вікна продажу, продаж через Sale Order. |
kw_event_type_ui | Перемикачі вкладок на типі події (Питання / Спілкування / Мульти-слоти). |
kw_event_config | Загальні налаштування suite (меню «Конфігурація»). |
1.2 Ціни та квитки
| Модуль | Що дає |
|---|---|
kw_event_catalog_ticket_preset | Базова ціна квитка на каталозі + перевизначення ціни/знижки на рівні каталогу (kw.event.catalog.ticket). |
kw_event_catalog_price | Прайс-логіка для каталогу. |
kw_event_registration_payment | Оплата реєстрації, статуси «оплачено», звʼязок з платежами. |
kw_event_invoice_preset / kw_invoice_preset | Пресети рахунків для швидкого виставлення. |
1.3 Бюджет та аналітика
| Модуль | Що дає |
|---|---|
kw_event_sale_account | Двигун бюджету події — матриця Планований/Підтверджений/Оплачений; event._kw_recompute_budget. |
kw_event_state_analytic_matrix + kw_matrix_widget | Віджет-матриця станів аналітики на вкладці «Бюджет». |
kw_event_account | Привʼязка події до аналітичного рахунку, проводки. |
kw_purchase_analytic | Аналітика на закупівлях (витрати події). |
1.4 Гіди / виконавці та витрати
| Модуль | Що дає |
|---|---|
kw_event_performer | Гід/виконавець як партнер; гаманець гіда (каса гіда). |
kw_event_performer_fee | Ставка гіда: за годину / за подію / за групу / % прибутку. |
kw_event_performer_fee_invoice | Рахунки підряднику (гіду) за його ставкою. |
kw_event_performer_settlement | Взаєморозрахунок з гідом: вкладка розрахунків, майстер по кількох турах, кольори списку. |
kw_event_expense | Види витрат: фікс + на людину + мінімалка, групові тарифи, одержувач оплати. |
kw_event_catalog_expense | Витрати на рівні каталогу (автододаються в подію). |
kw_event_catalog_performer | Гіди за замовчуванням на каталозі. |
1.5 Логістика, формати, додаткове
| Модуль | Що дає |
|---|---|
kw_event_truckage (+ kw_truckage*) | Транспорт/логістика: автобуси, водії, тип ТЗ під розмір групи. |
kw_event_online | Онлайн-події (без локації). |
kw_event_parent | Складені події: батьківська подія з під-подіями (багатоденний тур). |
kw_event_seats_plan | Планована кількість місць (seats_plan) для бюджету. |
kw_event_language / kw_event_catalog_language | Мови екскурсій. |
kw_event_timezone | Часовий пояс за замовчуванням на типі події. |
kw_event_utm | UTM-мітки (звідки прийшов учасник), вкладка «Маркетинг». |
kw_event_client_mode | Режим «є клієнт» (B2B-захід на замовлення) + прапор «учасники впливають на бюджет». |
kw_event_customer | Клієнт події (замовник). |
kw_event_registration_participant / kw_event_registration_extra | Додаткові поля учасника (паспорт, дата народження тощо). |
kw_event_attendee_ops | Масові операції над учасниками. |
kw_event_access / kw_event_catalog_access | Права доступу до подій і каталогу. |
kw_events_api | REST API /kw_api/* (потребує kw_api). |
kw_event_catalog, kw_event_sale, kw_event_catalog_ticket_preset, kw_event_sale_account, kw_event_state_analytic_matrix, kw_event_expense, kw_event_catalog_expense, kw_event_performer, kw_event_performer_fee, kw_event_performer_settlement, kw_event_seats_plan, kw_event_type_ui, kw_event_registration_payment. Решта — за потребою (онлайн, транспорт, API, UTM).2. Які довідники заповнити і в якому порядку
Порядок важливий: кожен наступний довідник посилається на попередній. Не можна зробити каталог без типу події, а тип події без продукту-квитка не дасть продавати.
1Компанія, валюта, журнали
- Компанія — назва, реквізити, лого («Цікавий Київ»).
- Валюта — UAH як основна.
- Журнали обліку: Каса (Cash), Банк (Bank), Продажі, Закупівлі. Для кожного гіда згодом створюється окрема каса-гаманець.
2Податки та продукти-послуги
- Налаштувати ставки ПДВ / без ПДВ під ваш режим оподаткування.
- Базові продукти-послуги для витрат (вони створюються автоматично з видів витрат, але можна й вручну).
3Мови екскурсій (kw.event.language)
Українська, англійська тощо. Прапор «Іноземна» відрізняє внутрішні мови від іноземних.
4Місця збору (kw.event.start.place)
Точки старту екскурсій («Майдан Незалежності», «Золоті ворота») з адресою та координатами. Перевикористовуються в каталозі.
5Типи квитків та пресети
- Типи квитків додаються в окремому довіднику (меню «Типи квитків»). Атрибут товару створювати не треба — системний атрибут «Тип квитка» підвʼязується автоматично до кожного нового запису.
- Створіть значення: Повний, Пільговий, Дитячий — кожне зі знижкою (
kw_price_discount+ тип знижки %/грн) та вікнами продажу (днів до події). - Зберіть їх у пресет (
kw.event.ticket.preset), напр. «Стандартні квитки екскурсії».
6Види витрат (kw.event.expense)
Транспорт, харчування, вхідні квитки — з формулою та одержувачем оплати. Деталі — розділ 3.
7Гіди та їхні ставки
- Контакт гіда (партнер) з позначкою «Виконавець» (
kw_event_is_performer). - Каса-гаманець гіда створювати не треба — журнал «Готівка в <ім'я>» створюється автоматично, щойно партнера позначено виконавцем.
- Ставки у вкладці «Performance fee»: за годину / за подію / за групу / %. Деталі — розділ 4.
8Типи подій (event.type)
«Регулярна екскурсія», «Індивідуальна екскурсія», «Онлайн-лекція» — з усіма перемикачами (пресети квитків, вкладки, бюджет). Деталі — розділ 5.
9Каталог екскурсій (kw.event.catalog)
Фінальний крок налаштування: шаблон конкретної екскурсії, що звʼязує все вище. Деталі — розділ 6.
3. Види витрат
Вид витрат (kw.event.expense) — це багаторазова категорія собівартості події: оренда автобуса, обід, вхідні квитки до музею. Кожен вид описує формулу вартості, продукт для обліку і одержувача оплати.
3.1 Поля виду витрат
| Поле | Призначення |
|---|---|
| Назва | «Оренда автобуса», «Обід», «Вхідні квитки». |
| Продукт (product_id) | Товар/послуга для рахунка постачальнику (створюється автоматично, якщо немає). |
| Фіксована вартість (fixed_cost) | Базова сума незалежно від кількості людей. |
| Вартість на людину (person_cost) | Додається за кожного учасника. |
| Мінімальна вартість (minimal_cost) | Підлога: підсумок не може бути нижчим. |
| Одержувач оплати (cash_recipient) | performer — гіду · manager — менеджеру події · partner — компанії-постачальнику. |
| Журнал (journal_id) | Журнал оплати (для грошового потоку). |
| Групові тарифи (group_expense_ids) | Різна ціна для діапазонів кількості (1–15, 16–30, 31+). |
3.2 Формула вартості
підсумок = fixed_cost + (person_cost × К-сть_учасників) + груповий_тариф + коригування
фінал = max(підсумок, minimal_cost)
- Група 10 осіб: 20 + 8×10 = 100 грн
- Група 25 осіб: 20 + 8×25 = 220 грн
3.3 Три суми кожної витрати в події
Коли вид витрат потрапляє в подію (рядок kw.event.expense.line), система рахує три величини — вони ж видно у вкладці «Бюджет»:
| Сума | Від чого рахується | Де видно |
|---|---|---|
| Планована (planned) | За планованою к-стю місць (kw_seats_plan) | Колонка «Планований» |
| Підтверджена / «До сплати» (confirmed) | За фактичними реєстраціями (стан open/done) | «Підтверджений» + вкладка розрахунків |
| Оплачена (paid) | Сума проведених рахунків постачальника | «Оплачений» + розрахунок з гідом |
custom_amount замінює розраховану «Підтверджену» суму. Напр. вид витрат рахує 500 грн, але ви домовилися на 400 — вписуєте 400, і саме 400 піде в бюджет, у рахунок та в розрахунок з гідом.3.4 Витрати на каталозі
У каталозі (kw.event.catalog.expense) перелічуються види витрат, які автоматично клонуються в кожну подію, створену з цього каталогу. Так ви один раз описуєте собівартість екскурсії, а далі вона зʼявляється в кожному виїзді.
4. Принципи розрахунку ставки гіда
Ставка гіда — це сума, яку компанія платить гіду за проведену екскурсію. Suite підтримує чотири способи розрахунку. Спосіб задається у вкладці «Performance fee» на контакті гіда (kw.event.performance.type.fee), а сума фіксується на події у вкладці «Виконавці» (kw.event.performance).
ставка × тривалість події.
25 грн/год × 3 год = 75 грн
Фіксована сума за виїзд, незалежно від людей і годин.
напр. 100 грн / екскурсію
Різна сума для діапазонів розміру групи.
1–5 → 50 · 6–10 → 75 · 11+ → 100
Відсоток від чистого прибутку події (дохід − усі витрати). Рахується при завершенні події.
15% × max(0, прибуток)
4.1 Як це працює на події
У вкладці «Виконавці» додаєте рядок: гід + тип виступу (Екскурсовод) + спосіб розрахунку. Система:
- Бере ставку гіда з його довідника ставок.
- Для фіксованих типів:
сума = ставка × кількість(1 для per_event, години для per_hour). - Для %: відкладається до завершення події (бо потрібен підсумковий прибуток).
confirmed_amount(«До сплати») =custom_amount(якщо вписали вручну) або розрахована сума.
4.2 Особливість «% від прибутку»
гонорар = % × max(0, прибуток). Клемп на нулі — при збитку гонорар не стає відʼємним. Остаточний нарахунок і рахунок підряднику створюються коли подія переходить у стан «Завершено».5. Тип події — за що відповідає кожне налаштування
Тип події (event.type) — це «профіль поведінки» події. Більшість налаштувань — це перемикачі-фічі: вмикаєш — зʼявляється вкладка/поле/логіка, вимикаєш — приховується (і відповідні записи не створюються).
5.1 Видимість вкладок (UI)
| Поле | За замовч. | Що робить |
|---|---|---|
Показати вкладку «Питання»kw_show_question_page | Так | Вкладка з кастомними питаннями реєстрації. Вимкнено → вкладки немає. |
Показати вкладку «Спілкування»kw_show_communication_page | Так | Заплановані листи учасникам (підтвердження, нагадування). Вимкнено → вкладка зникає і заплановані листи видаляються. |
Показати мульти-слотиkw_show_multi_slots | Так | Реєстрація на кілька слотів однієї події. |
Показати сторінку «Маркетинг»kw_show_marketing_page | Так | UTM-мітки (джерело/канал/кампанія) для відстеження звідки прийшов учасник. |
5.2 Формат і структура події
| Поле | За замовч. | Що робить |
|---|---|---|
Онлайн kw_is_online | Ні | Подія онлайн-лише: локація не обовʼязкова, інші шаблони листів. |
Складена kw_is_compound | Ні | Батьківська подія з під-подіями (багатоденний тур). Один рівень вкладеності. |
Потребує перевезення kw_is_truckage | Ні | Вмикає панель логістики/транспорту (автобуси, водії). |
5.3 Квитки та ціни
| Поле | За замовч. | Що робить |
|---|---|---|
Має квиток kw_has_ticket | Так | Реєстрація вимагає вибору типу квитка з ціною. Вимкнено → проста реєстрація імʼя/email без цін. |
Інтервал дат квитків kw_use_ticket_date_interval | Так | Вікна продажу рахуються як зсув у днях від дати події (відкрити за 30 днів, закрити за 5). Вимкнено → дати вручну. |
Авто-підтвердження реєстрацій auto_confirm | Так | Учасник підтверджується одразу. Вимкнено → реєстрація в чернетці, потрібне ручне підтвердження. |
Набори квитків preset_ids | — | Пресети, з яких автоматично генеруються квитки при створенні події (якщо каталог не перевизначає). |
Продукт продажу kw_sale_product_id | — | Запасний товар для SO, якщо немає товару-квитка. |
5.4 Клієнт і бюджет
| Поле | За замовч. | Що робить |
|---|---|---|
Має клієнта kw_event_has_client | Ні | B2B-режим: подія на замовлення зовнішнього клієнта, якому виставляють рахунок. |
Учасники впливають на бюджет kw_is_attendee_affect_budget | Так | Увімкнено → витрати/дохід на місце множаться на к-сть учасників. Вимкнено → фіксований бюджет незалежно від відвідуваності (flat-fee). |
Часовий пояс default_timezone | — | ТЗ за замовчуванням для подій цього типу (Europe/Kyiv). |
6. Створюємо екскурсію в каталозі
Практична частина. Створюємо каталог «Оглядова екскурсія Старим Києвом» — шаблон, з якого далі штампуватимемо конкретні виїзди.
1Відкрийте «Події → Каталог» і натисніть «Новий»
Заповніть шапку каталогу:
- Каталожна назва — «Оглядова екскурсія Старим Києвом».
- Тривалість 2,5 · Тип інтервалу — годин (екскурсія триває 2,5 год).
- Типи подій — обидва: «Регулярна екскурсія» і «Індивідуальна екскурсія» (каталог годиться для обох форматів).
- Місце початку — «Майдан Незалежності», «Золоті ворота».
- Мова — Українська, Англійська.
- Базова ціна квитка — 400 грн (від неї рахуються знижки пресету).
- Набір квитків — «Стандартні квитки екскурсії» (Повний/Пільговий/Дитячий).
- Запланована кількість людей 20 · Мінімум місць 10 (нижче — тур скасовується).
- Метод розрахунку витрат за замовчуванням — «За подію» (так рахується гонорар гіда).
2Вкладка «Витрати» — собівартість туру
Додайте види витрат, що автоматично потраплятимуть у кожну подію з цього каталогу: «Оренда автобуса» (фікс 2000, отримувач — Партнер) та «Вхідні квитки до музею» (60 грн/особа, отримувач — Гід, бо гід купує квитки на місці готівкою).
3Вкладка «Хто може проводити»
Закріпіть гіда за каталогом: «Олександр Екскурсовод», тип виступу «Екскурсовод», розрахунок «За подію». Цей гід підставлятиметься в нові події за замовчуванням.
7. Регулярна подія з каталогу
З каталогу створюємо регулярний виїзд на конкретну дату з авто-згенерованими квитками.
1На каталозі натисніть «Створити подію»
Відкривається майстер, попередньо заповнений із каталогу: каталог, Категорія = «Регулярна екскурсія», мова, набір квитків, запланована/мінімальна к-сть, гід. Лишається задати дату/час і місце початку.
2Подію створено — квитки згенерувались автоматично
Натисніть «Створити подію». Система створює event.event і з пресету каталогу сама генерує квитки з розрахованими цінами та вікнами продажу. Зверху — лічильники (Учасники, Оплати, Витрати), статуси «Новий → Зарезервовано → Оголошено → Закінчений», вкладки suite (Квитки, Зв'язок, Витрати, Запитання, Гонорари, Розрахунки з гідом, Маркетинг, Бюджет).
3Вкладка «Квитки»
Три типи квитків з пресету, ціни розраховані від базової 400 ₴: Повний 400 ₴, Пільговий 200 ₴ (−50%), Дитячий 0 ₴ (−100%). Вікна продажу: відкрито за 30 днів, закрито за 1 день до події.
8. Індивідуальна подія
Той самий каталог, але індивідуальний захід на замовлення (режим «є клієнт»).
1Створення з тим самим каталогом, але іншою категорією
У майстрі «Створити подію» змініть Категорію на «Індивідуальна екскурсія». Каталог один і той самий — змінюється лише тип події, а з ним і поведінка.
2Різниця: зʼявляється поле «Клієнт»
Оскільки тип «Індивідуальна екскурсія» має увімкнений прапор «Має клієнта», на події зʼявляється поле Клієнт — замовник заходу, якому виставлятимуть рахунок за весь тур (а не продаватимуть окремі квитки відвідувачам). Вкладка «Зв'язок» одразу містить автоматичні листи (підтвердження, нагадування за 1 год і за 3 дні) — це фіча «Показати вкладку Спілкування».
9. Як записувати людей і продавати квитки
Реєстрація учасників + продаж квитків + прийом оплати — все в одному майстрі «Запис/Квитки».
1Кнопка «Запис/Квитки» на події
Відкриває майстер продажу. Заповніть:
- Партнер — покупець (хто оплачує; для роздрібу можна загального).
- Прайс-лист — обовʼязковий.
- Кількості по типах квитків (напр. Повний ×3, Пільговий ×2).
- Тип оплати «Оплата гіду» + Куди сплачують — каса гіда, якщо гроші збирає гід на місці готівкою. Саме так надходження потрапляють у гаманець гіда для подальшого розрахунку.
2«Купити квитки» — що відбувається
Одна дія робить одразу все:
- створює 5 реєстрацій (учасників) у стані «open»;
- створює замовлення на продаж (SO) з рядками-квитками;
- реєструє платіж 1 600 ₴ у касу гіда (статус «оплачено»).
Кнопка «Запис без оплати» — лише реєструє людей без прийому грошей (оплата пізніше).
3Бюджет одразу оновлюється
Вкладка «Бюджет» показує матрицю в трьох станах. Числа круглі, бо компанія без ПДВ:
- Заплановано (на 20 місць): дохід 8 000, витрати 3 700 (автобус 2 000 + вхідні 60×20 + гонорар 500), баланс +4 300.
- Записано (5 фактичних): дохід 1 600, витрати 2 800 (вхідні 60×5=300), баланс −1 200.
- Оплачено: 1 600 надійшло, баланс +1 600.
4Прийняти оплату пізніше — масово зі списку учасників
Якщо людей записали через «Запис без оплати», гроші можна прийняти згодом одразу від кількох учасників, не відкриваючи кожного окремо.
- Відкрийте список учасників події → відмітьте галочками потрібних → у шапці списку зʼявиться кнопка «Прийняти оплату».
- У майстрі поле «Журнал» за замовчуванням підтягує касу основного гіда події (можна змінити). Нижче — рядок на кожного вибраного учасника з полем «Сума» (за замовчуванням несплачений залишок), суму можна редагувати.
- «Зареєструвати» реєструє платіж по кожному рядку → учасники переходять у стан «Оплачено», а стовпець «Оплачено» у Бюджеті оновлюється.
- Обмеження: усі вибрані учасники мають належати одній події; якщо серед них є вже повністю оплачений або без замовлення на продаж — майстер зупиниться з попередженням.
10. Концепція оплати гіду та взаєморозрахунок
Це найтонша частина. Ідея: гід має власний «гаманець» (каса), у який падають готівкові оплати з його екскурсій, і з якого оплачуються його витрати й гонорар. Після туру рахується, хто кому винен, і робиться один підсумковий переказ.
10.1 Гаманець гіда
Кожному гіду автоматично заводиться окрема каса («Готівка в <ім'я>») — щойно партнера позначено «Виконавець». Окремо її створювати не треба. Баланс каси = скільки готівки «на руках» у гіда. Позитивний — гід має нашу готівку; відʼємний — компанія винна гіду.
10.2 Вкладка «Розрахунки з гідом» (одна екскурсія)
На події вкладка показує чотири блоки:
| Блок | Що це |
|---|---|
| Надходження (Receipts) | Готівка, що впала в гаманець гіда з продажів цієї події. |
| Витрати й гонорари (Owed) | Скільки винні гіду: його витрати (cash_recipient = performer) + його ставка. |
| Сплачено (Paid) | Скільки вже виплачено по рахунках підрядника. |
| До сплати = max(Owed − Paid, 0) | Залишок. Якщо > 0 — зʼявляється кнопка «Сплатити». |
Підсумок події:
net = Надходження − Винні_гіду − Раніше_переказано
Гід винен компанії = max(net, 0)
Компанія винна гіду = max(−net, 0)
Розраховано? = усі «До сплати» = 0 І net = 0
Гід зібрав готівкою в свій гаманець: 1 600 ₴ (5 квитків).
Компанія винна гіду: гонорар 500 ₴ + вхідні квитки, що він купив за свої 300 ₴ = 800 ₴.
net = 1 600 − 800 = 800 ₴ → гід винен компанії 800 ₴.
Кнопки «Оплатити» гасять гонорар і витрати гіда (стовпчик «Оплачено»), а «Перевести компанії» переказує підсумкові 800 ₴ з гаманця гіда в касу компанії — після чого подія стає зеленою (розраховано).
10.3 Взаєморозрахунок по кількох екскурсіях
Кнопка «Розрахувати» у списку подій відкриває майстер (kw.event.guide.multi.settlement.wizard), що зводить гіда одразу по кількох турах, пулячи його гаманець:
- Обираєте гіда (зі списку гідів з касою).
- Підтягуються всі нерозраховані тури цього гіда.
- Кожен тур показує «гід винен компанії» або «компанія винна гіду»; галочкою обираєте, які звести.
- Майстер рахує net по всіх обраних — прибуткова екскурсія перекриває збиткову.
- По кожній події гасяться рахунки з гаманця, фіксується
kw_settlement_transferred, і робиться один підсумковий переказ пулового net.
Тур А: гід винен компанії 1200 грн. Тур Б: компанія винна гіду 300 грн (виїзд був збитковим/гід доплатив за вхідні).
Пуловий net = 1200 − 300 = 900 грн → один переказ: гід здає 900 грн. Замість двох окремих рухів — один.
10.4 Кольори списку турів
| Колір | Умова | Значення |
|---|---|---|
| 🔴 Червоний | kw_under_min_seats | Не набрано мінімум місць. |
| 🔵 Синій | є активність, не розраховано | Є нерозраховані витрати/гонорари — треба звести. |
| 🟢 Зелений | є активність, розраховано | Повністю зведено (усе сплачено, net = 0). |
| ⚪ Без кольору | немає активності | Нічого робити. |
11. REST API
Модуль kw_events_api дає REST-ендпоінти /kw_api/* для інтеграції із зовнішнім сайтом (WordPress/WooCommerce): створення подій, реєстрація учасників, продаж і оплата квитків. Автентифікація — токенна.
11.1 Автентифікація
Спершу отримуєте токен, далі передаєте його у заголовку Authorization: Bearer <token> (або access_token). Токен живе 24 год (налаштовується).
POST /kw_api/event_auth
// запит
{ "db": "event19", "login": "admin", "password": "admin" }
// відповідь
{ "status":"200", "result":"OK",
"data": { "uid":2, "access_token":"abc123…", "expires_in":"2026-07-01 12:30:45" } }
11.2 Створення події
POST /kw_api/create_event (потрібен токен)
Створює подію з каталогу. Ідемпотентно за ключем слоту (catalog_id, date_begin, date_end) — повторний виклик не плодить дублі.
| Параметр | Обовʼязк. | Опис |
|---|---|---|
event_name | так | Назва події. |
start_datetime / end_datetime | так | ISO 8601, у ТЗ користувача. |
catalog_id | ні | Каталог-шаблон (місця, мова, гіди, ціни). |
event_type_id | ні | Тип події. |
seats_max / seats_plan | ні | Макс. і планована к-сть місць. |
base_ticket_price | ні | Базова ціна для пресетів квитків. |
disc_price | ні | Ціна пільгового квитка (перевизначає формулу пресета). |
preset_id, guide_id, language_id | ні | Пресет квитків, гід, мова. |
utm_source/medium/campaign | ні | UTM-мітки. |
curl -X POST https://HOST/kw_api/create_event \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"event_name": "Оглядова Старим Києвом — 15.08",
"start_datetime": "2026-08-15T11:00:00",
"end_datetime": "2026-08-15T13:30:00",
"catalog_id": 5,
"seats_max": 25,
"base_ticket_price": 400
}'
// → { "data": { "event_id": 42 } }
11.3 Реєстрація / продаж квитків
POST /kw_api/create_registration
Створює один або кілька квитків-реєстрацій. Ідемпотентно за order (advisory-lock проти подвійного спрацювання). Кожен квиток — у власному savepoint.
| Параметр | Обовʼязк. | Опис |
|---|---|---|
event_id | так | ID події. |
tickets[] | так | Масив: ticket_id (значення атрибута типу квитка), price, опц. coupon_code, certificate_number. |
order | ні | Зовнішній № замовлення (WP) — вмикає ідемпотентність. |
name, email, phone | ні | Дані учасника. |
is_paid, journal_id | ні | Позначити оплаченим + журнал для реєстрації платежу. |
payment_status | ні | 0=чернетка · 1=відкрито · 2=оплачено. |
curl -X POST https://HOST/kw_api/create_registration \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"event_id": 42,
"order": "WP-2026-08-001",
"tickets": [ { "ticket_id": 1, "price": 400 } ],
"name": "Олена Коваль", "email": "olena@example.com",
"phone": "+380501234567", "is_paid": true, "journal_id": 6, "payment_status": 2
}'
// → { "data": { "event_id":42, "registrations":[123], "order":"WP-2026-08-001" } }
11.4 Інші ендпоінти
| Метод | Шлях | Призначення |
|---|---|---|
| PUT | /kw_api/change_registration | Замінити всі квитки замовлення (видаляє старі, створює нові). Заборонено для оплачених. |
| PUT | /kw_api/update_registration | Оновити лише статус оплати (payment_status) без перестворення квитків. |
| DELETE | /kw_api/delete_registration | Скасувати реєстрації замовлення (state = cancel, мʼяке видалення). |
11.5 Формат відповіді
{
"status": "200", // код HTTP рядком
"result": "OK", // OK | error
"error": "", // код помилки: auth_error | parameters_missing | validation_error
"message": "", // повідомлення для користувача
"data": { ... }, // корисне навантаження
"count": 1 // к-сть полів у data
}
11.6 Повний приклад (Python)
import requests
BASE = "https://HOST"
# 1. токен
tok = requests.post(f"{BASE}/kw_api/event_auth",
json={"db":"event19","login":"admin","password":"admin"}
).json()["data"]["access_token"]
H = {"Authorization": f"Bearer {tok}"}
# 2. подія
ev = requests.post(f"{BASE}/kw_api/create_event", headers=H, json={
"event_name":"Оглядова Старим Києвом — 15.08",
"start_datetime":"2026-08-15T11:00:00",
"end_datetime":"2026-08-15T13:30:00",
"catalog_id":5, "seats_max":25, "base_ticket_price":400
}).json()["data"]["event_id"]
# 3. продаж квитка + оплата
requests.post(f"{BASE}/kw_api/create_registration", headers=H, json={
"event_id":ev, "order":"WP-2026-08-001",
"tickets":[{"ticket_id":1,"price":400}],
"name":"Олена Коваль","email":"olena@example.com",
"is_paid":True,"journal_id":6,"payment_status":2
})