Тарифікація сеансів
HandyCafe використовує сегментний механізм тарифікації для розрахунку вартості сеансів у вашому інтернет-кафе або ігровому центрі. Замість застосування єдиної фіксованої ставки на весь сеанс, механізм розбиває кожен сеанс на сегменти з власним тарифним контекстом. Такий підхід забезпечує точний білінг навіть коли сеанси охоплюють кілька часових слотів, зміни тарифів, паузи або відключення.
Основні поняття
Перш ніж заглиблюватися в деталі, ось ключові терміни:
| Термін | Визначення |
|---|---|
| Базова погодинна ставка | Ціна за годину до застосування множників. Встановлюється в Налаштування > Тарифи. |
| Тарифний слот | Іменований часовий період з конкретним множником. 8 слотів з кольоровим кодуванням. |
| Множник | Коефіцієнт, що застосовується до базової ставки. 1.0 = стандартна ціна, 0.5 = половина ціни, 2.0 = подвійна ціна. |
| Сегмент | Безперервний період в сеансі, де тарифний контекст (слот, множник, базова ціна) не змінюється. |
| Розрахунок | Фінальне обчислення суми до сплати при завершенні сеансу. |
Базова погодинна ставка
Базова погодинна ставка є основою всіх розрахунків. Встановлюється в Налаштування > Тарифи і представляє стандартну ціну за годину використання ПК.
Усі внутрішні розрахунки використовують мінорні одиниці валюти (наприклад, копійки для гривень). Якщо ваша базова ставка 30.00 грн за годину, внутрішнє значення становить 3000. Це усуває проблеми округлення з плаваючою точкою.
Підтримка подвійної валюти
HandyCafe підтримує базову та локальну валюту з обмінним (FX) курсом. Якщо ви працюєте в країні, де міжнародні ціни відрізняються від локальних:
- Базова валюта. Валюта для внутрішніх розрахунків.
- Локальна валюта. Валюта для відображення клієнтам та оплати.
- FX-курс. Коефіцієнт конвертації між базовою та локальною валютами.
Якщо обидві валюти збігаються, FX-курс вважається 1.0 і не впливає.
Тарифні слоти
Доступні 8 кольорових тарифних слотів, кожен представляє рівень тарифікації:
| Слот | Колір | Типове використання |
|---|---|---|
| Синій | Синій | Стандартна ставка |
| Помаранчевий | Помаранчевий | Вечірня або вихідна надбавка |
| Червоний | Червоний | Пікова надбавка |
| Зелений | Зелений | Позапікова знижка |
| Бірюзовий | Бірюзовий | Студентська або учасницька ставка |
| Сірий | Сірий | Святкова або спеціальна ставка |
| Блакитний | Блакитний | Нічна ставка |
| Смарагдовий | Смарагдовий | Промоційна ставка |
Кожен слот має три властивості:
- Назва. Описова мітка (наприклад, "Пікові години" або "Нічна знижка").
- Множник. Десяткове значення, що модифікує базову ставку. Типові значення: 1.0 (стандартний), 0.5 (половина ціни), 1.5 (надбавка 50%), 2.0 (подвійна ціна). Множник має бути нулем або додатним числом.
- Дані розкладу. Внутрішнє представлення, що визначає години та дні застосування слоту. Керується автоматично через сітку розкладу.
Слоти можна індивідуально увімкнути або вимкнути. Вимкнені слоти ігноруються механізмом тарифікації.
Сітка розкладу
Розклад тарифів є матрицею 7 днів на 24 години (загалом 168 одногодинних блоків). Кожному блоку призначається один тарифний слот. Розклад визначає, який множник діє в будь-який момент.
Сітка налаштовується в Налаштування > Розклад тарифів. Дні йдуть від понеділка до неділі, години від 00:00 до 23:00. Щоб призначити слот часовому блоку, виберіть блок у сітці та оберіть потрібний колір слоту.
Як механізм читає розклад
Внутрішньо кожен годинний блок відповідає позиції в даних розкладу. Механізм перевіряє дані розкладу кожного увімкненого слоту, щоб визначити, який слот активний для конкретного дня та години.
Якщо для певної години в жодного слоту не встановлено біт, механізм повертається до базової ставки з множником 1.0.
Коли функцію розкладу тарифів вимкнено повністю (в Налаштування > Тарифи), усі сеанси використовують базову ставку з множником 1.0 незалежно від часу.
Тарифні сегменти
Сегмент є безперервним часовим періодом в сеансі, де тарифний контекст не змінюється. Механізм тарифікації створює новий сегмент при будь-якій з цих граничних подій:
| Межа | Тригер |
|---|---|
| session_start | Початок нового сеансу |
| session_stop | Зупинка сеансу |
| pause | Касир призупиняє сеанс |
| resume | Касир відновлює призупинений сеанс |
| tick | Годинник переходить межу години в інший тарифний слот |
| disconnect | Клієнтський ПК втрачає мережеве з'єднання |
| offline | Клієнтський ПК переходить у офлайн |
| load_recovery | Сервер перезапускається та відновлює працюючий сеанс |
Кожен сегмент фіксує:
| Поле | Опис |
|---|---|
| session_id | Сеанс, до якого належить цей сегмент |
| segment_start | Позначка часу Unix, коли сегмент почався |
| segment_end | Позначка часу Unix, коли сегмент завершився (null, якщо ще відкритий) |
| pricing_slot_id | Ідентифікатор активного тарифного слоту (наприклад, "blue", "red" або "base") |
| multiplier | Значення множника з тарифного слоту |
| base_price_snapshot | Базова погодинна ставка, зафіксована в момент відкриття сегмента |
| amount | Розрахована вартість цього сегмента (встановлюється при закритті сегмента) |
| boundary_reason | Причина створення цього сегмента |
Навіщо фіксувати знімок базової ціни
Поле base_price_snapshot фіксує базову погодинну ставку саме в момент відкриття сегмента. Це критично, тому що адміністратор може змінити базову ставку посеред сеансу. Завдяки знімку кожен сегмент використовує ставку, яка діяла на його початку, що забезпечує справедливий білінг, придатний для аудиту.
Формула вартості
Вартість одного сегмента обчислюється так:
amount = ceil( (base_price_snapshot * multiplier * duration_seconds) / 3600 )
Точніше, механізм використовує масштабовану цілочисельну арифметику, щоб уникнути помилок з плаваючою точкою:
- Множник масштабується до цілого числа з фіксованою комою (множиться на 1 000 000).
- Обчислення виконується повністю в 128-бітних цілих числах.
- Використовується ділення зі стелею. Результат завжди округлюється вгору до наступної мінорної одиниці.
Розрахунок за хвилинами
Якщо в Налаштування > Тарифи увімкнено параметр розрахунку за хвилинами, формула трохи змінюється:
amount = ceil( (base_price_snapshot * multiplier * used_minutes) / 60 )
Де used_minutes = ceil(duration_seconds / 60). Це означає, що будь-яка неповна хвилина рахується як повна.
Підсумок сеансу
Загальна вартість сеансу обчислюється у три кроки:
Крок 1: Сума сегментів
raw_total = сума всіх закритих сегментів + часткова сума відкритого сегмента
Часткова сума відкритого сегмента обчислюється в реальному часі за наведеною вище формулою з поточною позначкою часу як кінцем сегмента.
Крок 2: Округлення
rounded_total = round_up(raw_total, rounding_step)
Округлення завжди йде вгору (стеля) для захисту доходу. Крок округлення налаштовується в Налаштування > Тарифи. Наприклад, якщо крок округлення дорівнює 50 (тобто $0.50 у валюті з 2 дробовими знаками), сирий підсумок $3.27 округлюється вгору до $3.50.
Крок 3: Мінімальний стартовий збір
final_total = max(rounded_total, startup_fee)
Стартовий збір є мінімальною платою за будь-який сеанс, незалежно від тривалості. Якщо округлений підсумок менший за стартовий збір, стягується стартовий збір.
Розрахунок
Розрахунок є процесом фіналізації білінгу сеансу. Є два етапи розрахунку:
Початковий розрахунок (лише передплата)
При запуску передплаченого сеансу створюється запис розрахунку "start". Він фіксує:
- Розраховану вартість. Обчислену системою вартість купленого часу.
- Стягнуту суму. Суму, яку клієнт фактично сплатив (зазвичай збігається з розрахованою вартістю).
Для режиму передплати "Фіксувати при покупці" ця зафіксована сума визначає вартість сеансу незалежно від змін тарифів під час сеансу.
Кінцевий розрахунок
При зупинці будь-якого сеансу (передплаченого чи постоплатного) створюється запис розрахунку "stop":
| Поле | Опис |
|---|---|
| Розрахована вартість | Обчислений системою підсумок з усіх тарифних сегментів |
| Стягнута сума | Фактично стягнута сума (за замовчуванням дорівнює розрахованій вартості) |
| Сума ручного коригування | Якщо касир вручну скоригував ціну, початкова розрахована вартість зберігається тут |
| Комісійна ставка | Комісійна ставка способу оплати (у відсотках) |
| commission_fee | Розрахована сума комісії |
| fixed_fee | Фіксований збір способу оплати |
| computed_timeline_snapshot | Запис JSON про кожен тарифний сегмент сеансу |
Знімок хронології забезпечує повний аудиторський слід, який показує точно, як обчислювалася вартість, сегмент за сегментом.
Збори способів оплати
Кожен спосіб оплати може мати два типи зборів:
Комісія (базисні пункти)
Комісійна ставка виражається у відсотках. Сума комісії обчислюється застосуванням цієї ставки до стягнутої суми.
Приклад: якщо стягнута сума становить $10.00 (1000 мінорних одиниць), а спосіб оплати має комісійну ставку 2.5%, комісія становить $0.25 (25 мінорних одиниць).
Фіксований збір
Фіксована плата, що вираховується за транзакцію, незалежно від суми. Наприклад, збір за обробку кредитної картки $0.30.
Обидва збори мають інформаційний характер. Вони відображають вартість прийому цього способу оплати для бізнесу. Вони записуються в розрахунок, але не додаються до рахунку клієнта.
ПДВ (податок на додану вартість)
ПДВ налаштовується як відсоток у Налаштування > Тарифи. Дозволений діапазон від 0% до 250%.
ПДВ включено до суми. Податок не нараховується понад неї. Клієнт сплачує суму брутто. Для звітності HandyCafe розділяє її на суму нетто та суму ПДВ:
сума нетто = стягнута сума / (1 + ставка ПДВ)
сума ПДВ = стягнута сума - сума нетто
Нарахування 100.00 зі ставкою ПДВ 20% записується як 83.33 нетто плюс 16.67 ПДВ. Клієнт усе одно платить 100.00.
Сума ПДВ відображається окремо у діалозі оплати, щоб касир бачив розбивку податку.
Дивіться Налаштування тарифів, щоб дізнатися, де встановлюється ставка.
Режими передплаченої тарифікації
Як описано в Управлінні сеансами, передплачені сеанси підтримують два режими тарифікації:
Фіксація при покупці
При запуску передплаченого сеансу розрахунок "start" фіксує стягнуту суму. На час сеансу:
- Час завершення сеансу фіксується на основі куплених хвилин.
- Навіть якщо розклад тарифів змінюється, сеанс триває до закінчення зафіксованого часу.
- Кінцевий розрахунок використовує зафіксовану суму з початкового розрахунку.
Живий розклад
Залишковий час сеансу перераховується безперервно зі зміною тарифних слотів:
- Якщо сеанс переходить у дешевший слот, залишковий час розтягується (клієнт отримує більше хвилин за свої гроші).
- Якщо сеанс переходить у дорожчий слот, залишковий час скорочується.
- Кінцевий розрахунок відображає тарифи, які фактично застосовувалися протягом сеансу.
Дробові знаки
Кількість десяткових знаків для відображення валюти налаштовується (2-4 дробові знаки). Це впливає на те, як суми показуються в інтерфейсі, але не змінює внутрішніх розрахунків у мінорних одиницях.
Приклад: з 2 дробовими знаками $3.50 показується як "3.50". З 3 дробовими знаками це буде "3.500".
Практичні приклади
Приклад 1: Простий постоплатний сеанс
- Базова ставка: $3.00/год (300 мінорних одиниць)
- Розклад: стандартний слот (множник 1.0) весь день
- Сеанс: 10:00 до 11:30 (90 хвилин)
- Стартовий збір: $0.50
Розрахунок:
Сегмент 1: (300 * 1.0 * 5400) / 3600 = 450 мінорних одиниць ($4.50)
Підсумок: max($4.50, $0.50) = $4.50
Приклад 2: Сеанс з двома слотами
- Базова ставка: $4.00/год (400 мінорних одиниць)
- Розклад: Стандартний (1.0) 10:00-12:00, Щасливі години (0.5) 12:00-14:00
- Сеанс: 11:00 до 13:00 (120 хвилин)
- Стартовий збір: $1.00
Розрахунок:
Сегмент 1 (11:00-12:00, стандартний): (400 * 1.0 * 3600) / 3600 = 400 ($4.00)
Сегмент 2 (12:00-13:00, щасливі години): (400 * 0.5 * 3600) / 3600 = 200 ($2.00)
Підсумок: $4.00 + $2.00 = $6.00
Фінально: max($6.00, $1.00) = $6.00
Приклад 3: Сеанс з паузою
- Базова ставка: $2.00/год (200 мінорних одиниць)
- Розклад: стандартний слот (множник 1.0) весь день
- Сеанс: Початок 10:00, Пауза 10:30, Відновлення 11:00, Зупинка 11:45
- Стартовий збір: $0.50
Розрахунок:
Сегмент 1 (10:00-10:30, активний): (200 * 1.0 * 1800) / 3600 = 100 ($1.00)
Пауза (10:30-11:00): без нарахування
Сегмент 2 (11:00-11:45, активний): (200 * 1.0 * 2700) / 3600 = 150 ($1.50)
Підсумок: $1.00 + $1.50 = $2.50
Фінально: max($2.50, $0.50) = $2.50
Наступні кроки
- Управління сеансами: повний життєвий цикл сеансу
- Налаштування тарифів: конфігурація базової ставки, округлення та стартового збору
- Розклад тарифів: налаштування сітки 7x24
- Способи оплати: конфігурація способів оплати з комісіями