HandyCafe Docs
owner

Тарифікація сеансів

HandyCafe використовує сегментний механізм тарифікації для розрахунку вартості сеансів у вашому інтернет-кафе або ігровому центрі. Замість застосування єдиної фіксованої ставки на весь сеанс, механізм розбиває кожен сеанс на сегменти з власним тарифним контекстом. Такий підхід забезпечує точний білінг навіть коли сеанси охоплюють кілька часових слотів, зміни тарифів, паузи або відключення.

Основні поняття

Термін Визначення
Базова погодинна ставка Ціна за годину до застосування множників. Встановлюється в Налаштування > Тарифи.
Тарифний слот Іменований часовий період з конкретним множником. 8 слотів з кольоровим кодуванням.
Множник Коефіцієнт, що застосовується до базової ставки. 1.0 = стандартна ціна, 0.5 = половина ціни, 2.0 = подвійна ціна.
Сегмент Безперервний період в сеансі, де тарифний контекст (слот, множник, базова ціна) не змінюється.
Розрахунок Фінальне обчислення суми до сплати при завершенні сеансу.

Базова погодинна ставка

Базова погодинна ставка -- основа всіх розрахунків. Встановлюється в Налаштування > Тарифи і представляє стандартну ціну за годину використання ПК.

Усі внутрішні розрахунки використовують мінорні одиниці валюти (наприклад, копійки для гривень). Якщо ваша базова ставка 30.00 грн за годину, внутрішнє значення -- 3000. Це усуває проблеми округлення з плаваючою точкою.

Підтримка подвійної валюти

HandyCafe підтримує базову та локальну валюту з обмінним (FX) курсом.

  • Базова валюта. Валюта для внутрішніх розрахунків.
  • Локальна валюта. Валюта для відображення клієнтам та оплати.
  • FX-курс. Коефіцієнт конвертації між базовою та локальною валютами.

Якщо обидві валюти збігаються, FX-курс вважається 1.0 і не впливає.

Тарифні слоти

Доступні 8 кольорових тарифних слотів, кожен представляє рівень тарифікації:

Слот Колір Типове використання
Синій Синій Стандартна ставка
Помаранчевий Помаранчевий Вечірня або вихідна надбавка
Червоний Червоний Пікова надбавка
Зелений Зелений Позапікова знижка
Бірюзовий Бірюзовий Студентська або учасницька ставка
Сірий Сірий Святкова або спеціальна ставка
Блакитний Блакитний Нічна ставка
Смарагдовий Смарагдовий Промоційна ставка

Кожен слот має три властивості:

  1. Назва. Описова мітка (наприклад, "Пікові години" або "Нічна знижка").
  2. Множник. Десяткове значення, що модифікує базову ставку. Типові значення: 1.0 (стандартний), 0.5 (половина ціни), 1.5 (надбавка 50%), 2.0 (подвійна ціна).
  3. Дані розкладу. Внутрішнє представлення, що визначає години та дні застосування слоту.

Слоти можна індивідуально увімкнути або вимкнути. Вимкнені слоти ігноруються механізмом тарифікації.

Сітка розкладу

Розклад тарифів -- це матриця 7 днів на 24 години (168 одногодинних блоків). Кожному блоку призначається один тарифний слот. Розклад визначає, який множник діє в будь-який момент.

Сітка налаштовується в Налаштування > Розклад тарифів. Дні -- від понеділка до неділі, години -- від 00:00 до 23:00.

Коли функція розкладу вимкнена (в Налаштування > Тарифи), всі сеанси використовують базову ставку з множником 1.0.

Тарифні сегменти

Сегмент -- це безперервний часовий період в сеансі, де тарифний контекст не змінюється. Механізм тарифікації створює новий сегмент при будь-якій з цих граничних подій:

Межа Тригер
session_start Початок нового сеансу
session_stop Зупинка сеансу
pause Касир призупиняє сеанс
resume Касир відновлює сеанс
tick Годинник переходить межу години в інший тарифний слот
disconnect Клієнтський ПК втрачає мережеве з'єднання
offline Клієнтський ПК переходить у офлайн
load_recovery Сервер перезапускається та відновлює працюючий сеанс

Кожен сегмент фіксує: session_id, час початку, час завершення, ID тарифного слоту, множник, знімок базової ціни, суму та причину створення.

Формула вартості

Вартість одного сегмента:

amount = ceil( (base_price_snapshot * multiplier * duration_seconds) / 3600 )

Механізм використовує цілочисельну арифметику зі масштабуванням у 128-бітних цілих числах для уникнення помилок з плаваючою точкою. Ділення завжди округлюється вгору.

Підсумок сеансу

Загальна вартість сеансу обчислюється у три кроки:

Крок 1: Сума сегментів

raw_total = сума всіх закритих сегментів + часткова сума відкритого сегмента

Крок 2: Округлення

rounded_total = round_up(raw_total, rounding_step)

Округлення завжди вгору (стеля) для захисту доходу.

Крок 3: Мінімальний стартовий збір

final_total = max(rounded_total, startup_fee)

Розрахунок

Розрахунок -- це процес фіналізації білінгу сеансу. Є два етапи:

Початковий розрахунок (лише передплата)

При запуску передплаченого сеансу створюється запис "start" з розрахованою вартістю та стягнутою сумою.

Кінцевий розрахунок

При зупинці будь-якого сеансу створюється запис "stop", що включає розраховану вартість, стягнуту суму, можливе ручне коригування, комісію способу оплати та знімок хронології тарифних сегментів.

Знімок хронології забезпечує повний аудиторський слід розрахунку вартості, сегмент за сегментом.

ПДВ

ПДВ налаштовується як відсоток (0-100%) в Налаштування > Тарифи. Застосовується понад розраховану суму сеансу:

ПДВ = стягнута_сума x (ставка_ПДВ / 100)

Сума ПДВ відображається окремо у діалозі оплати.

Режими передплаченої тарифікації

Фіксація при покупці

Сума фіксується на момент запуску сеансу. Навіть при зміні розкладу сеанс продовжується до закінчення зафіксованого часу.

Живий розклад

Залишковий час перераховується безперервно зі зміною тарифних слотів. У дешевшому слоті час розтягується, у дорожчому -- скорочується.

Практичні приклади

Приклад 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 (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

Приклад 3: Сеанс з паузою

  • Базова ставка: $2.00/год (200 мінорних одиниць)
  • Сеанс: Початок 10:00, Пауза 10:30, Відновлення 11:00, Зупинка 11:45

Розрахунок:

Сегмент 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

Наступні кроки