# Биллинг Как считаются счета и подписка. Код: `apps/api/src/billing/`, тесты: `apps/api/src/billing.int.test.ts`. Все даты считаются по времени Еревана. ## Две модели | | Фикс | % от комиссии | | --- | --- | --- | | Когда платят | вперёд, за следующий месяц | после, за прошлый календарный месяц | | Когда выставляется счёт | за 7 дней до окончания подписки | 1-го числа | | Срок оплаты | дата окончания подписки | 8-е число | | Что даёт оплата | подписка продлевается на месяц | подписка действует до 8-го числа следующего месяца | Месяц без сделок на модели «%»: счёт на 0 закрывается сам, подписка продлевается. Минимального платежа нет — это открытый вопрос ТЗ. Плата за установку (Team 500 $, Agency 750 $) начисляется один раз отдельным счётом. Её оплата дату подписки не двигает; исключение — новая компания на модели «%», у которой первого месячного счёта нет: её подписка стартует с оплаты установки. ## Комиссия в разных валютах Комиссию по сделке агент вводит в любой валюте, счёт выставляется в долларах. Курсы задаёт суперадмин: «Счета» → «Курсы валют». В счёте сохраняется курс на момент выставления и расшифровка по сделкам — клиент видит её в разделе «Подписка». ## Смена тарифа - Клиент меняет тариф и модель в разделе «Подписка». Изменение вступает в силу со следующего расчётного месяца: на фиксе — на следующий день после окончания оплаченного периода, на «%» — с 1-го числа. До этого в кабинете видно «Запланировано с такой-то даты», смену можно отменить. - Если оплаченного периода нет (подписка ещё не начиналась или уже закончилась), тариф меняется сразу. - Суперадмин меняет тариф в карточке компании сразу. - Переход на тариф меньше, чем участников в компании, запрещён. - При переходе с фикса на «%» сделки, закрытые до перехода, в счёт не попадают. При уходе с «%» посреди месяца сделки с начала месяца закрываются отдельным счётом. ## Просрочка и напоминания Напоминания уходят руководителю в бот не раньше 10:00: за 7, 3 и 1 день до окончания; после окончания — каждый день с числом оставшихся дней; при ограничении доступа — один раз. Через 15 дней (срок меняет суперадмин) уведомления о лидах останавливаются, CRM работает только на чтение. Раздел «Подписка» открыт всегда. После отметки оплаты доступ возвращается сразу. ## Оплата Сейчас работает ручной режим: суперадмин в разделе «Счета» нажимает «Отметить оплату». Онлайн-оплата подключается без переделки биллинга. Нужно написать класс по контракту `apps/api/src/billing/provider.ts` (создать платёж → ссылка на страницу оплаты; разобрать и проверить уведомление провайдера) и передать его в `buildApp({ payments })` в `apps/api/src/main.ts`. После этого у клиента в счёте появится кнопка «Оплатить», а провайдер будет присылать уведомления на `/api/payments/webhook/<имя провайдера>`. ## Что не решено - Провайдер эквайринга и валюта списания. - Минимальный платёж на модели «%». - Откуда брать курс: сейчас его вручную задаёт суперадмин.