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Прийняти оплату пізніше — масово зі списку учасників
Якщо людей записали через «Запис без оплати», гроші можна прийняти згодом одразу від кількох учасників, не відкриваючи кожного окремо.
- Відкрийте список учасників події → відмітьте галочками потрібних → у шапці списку зʼявиться кнопка «Прийняти оплату».
- У майстрі поле «Журнал» за замовчуванням підтягує касу основного гіда події (можна змінити). Нижче — рядок на кожного вибраного учасника з трьома полями, що редагуються: «Тип квитка», «Ціна квитка» та «Сума до сплати» (за замовчуванням несплачений залишок).
- Зміна типу квитка чи ціни. Якщо в рядку змінити «Тип квитка» (учасника буде переведено на інший квиток цієї події) або вручну виправити «Ціну квитка», поле «Сума до сплати» автоматично перерахується під нову ціну. При «Зареєструвати» замовлення на продаж учасника теж перепишеться на новий квиток/ціну.
- Часткова оплата. Поле «Сума до сплати» можна зменшити — напр. при ціні квитка 300 прийняти лише 150. Учасник залишиться «Підтверджено» (не «Оплачено»), поки решту не буде внесено; повторний запуск майстра підставить залишок.
- «Зареєструвати» реєструє платіж по кожному рядку → повністю оплачені учасники переходять у стан «Оплачено», а стовпець «Оплачено» у Бюджеті оновлюється.
- Обмеження: усі вибрані учасники мають належати одній події; якщо серед них є вже повністю оплачений або без замовлення на продаж — майстер зупиниться з попередженням.
5Статуси учасника у списку
У списку учасників (та у статус-барі картки) стан кожної реєстрації позначено кольоровим тегом:
- Непідтверджено — реєстрація в чернетці, оплату/підтвердження ще не отримано.
- Підтверджено — учасника підтверджено (раніше називалося «Зареєстровано»). Нова назва діє скрізь: у списку, у статус-барі картки та у фільтрах.
- Оплачено — оплату прийнято повністю.
- Відвідав — учасник прийшов на подію.
- Скасовано — реєстрацію скасовано (мʼяке видалення).
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
})