# Генератор смет студии «Кадр» — инструкция

Программа считает смету съёмки по прайсу студии и собирает готовый HTML-файл
(один файл, открывается в любом браузере, печатается на А4).

## Прайс, по которому считает программа

| Позиция | Цена |
|---|---|
| Съёмка | 3 000 ₽ за час |
| Монтаж | 2 000 ₽ за один ролик |
| Выезд | 1 000 ₽ за заказ (одной строкой, если выезд нужен) |

НДС, скидки и наценки не начисляются — в смете только эти три позиции.

## Где лежат файлы

* программа: `/root/kadr-smeta/kadr_smeta.py`
* готовая смета по кафе «Маяк»: `/root/kadr-smeta/smeta-kafe-mayak.html`
* опубликованные копии: https://lochkanov.mxmu.ru/kadr-smeta/
  (оттуда скачивается программа и открывается смета)

## Как сделать смету новому клиенту

```bash
cd /root/kadr-smeta
python3 kadr_smeta.py --client 'Кафе «Маяк»' --hours 2 --videos 3 --travel yes
```

Параметры:

| Параметр | Значение |
|---|---|
| `--client` | имя клиента (в тексте сметы и в имени файла) |
| `--hours` | часы съёмки, неотрицательное число (можно 1.5) |
| `--videos` | число роликов на монтаж, неотрицательное целое |
| `--travel` | выезд: `yes` или `no` (по умолчанию `yes`) |
| `--date` | дата в смете, ГГГГ-ММ-ДД (по умолчанию сегодняшняя) |
| `--out` | путь к HTML-файлу (по умолчанию `smeta-<клиент>.html`) |
| `--json` | дополнительно напечатать расчёт в JSON |

Примеры:

```bash
# Только съёмка, без монтажа и выезда
python3 kadr_smeta.py --client 'Фитнес-клуб «Разгон»' --hours 4 --videos 0 --travel no

# Съёмка два с половиной часа, один ролик, выезд, своя дата
python3 kadr_smeta.py --client 'Стоматология «Белый ключ»' --hours 2.5 --videos 1 --date 2026-09-20
```

После запуска в консоли печатается разбивка и итог, а HTML рядом:

```
Смета: smeta-kafe-mayak.html
  Съёмка   2 часа: 6 000 ₽
  Монтаж   3 ролика: 6 000 ₽
  Выезд    1 заказ: 1 000 ₽
  Итого: 13 000 ₽
```

## Проверка примера (кафе «Маяк»)

2 часа съёмки × 3 000 = 6 000 ₽, 3 ролика × 2 000 = 6 000 ₽, выезд 1 000 ₽.
Итого 13 000 ₽.

## Что программа не примет

* отрицательные количества — «Отрицательное количество не принимается: часы съёмки = -2», код возврата 2;
* нечисловые значения — «Часы съёмки должны быть числом, а не «abc»»;
* дробное число роликов — «Число роликов должно быть целым»;
* непонятный ответ про выезд — «ответьте да или нет».

При ошибке HTML-файл не создаётся и старая смета не перезаписывается: сначала
исправляем ввод, потом получаем файл.

## Мелочи, которые уже учтены

* Склонения: «1 час», «2 часа», «5 часов», «1 ролик», «3 ролика».
* Суммы с разделителем тысяч: «13 000 ₽».
* Нулевые позиции в смету не попадают: указали 0 роликов — строки монтажа нет.
* Вёрстка печатная: Ctrl+P в браузере даёт аккуратный лист без фона и тени.
* Программа работает и как библиотека (Python): `build_estimate()` считает,
  `render_html()` отдаёт HTML-строку — можно вызывать из других скриптов.

## Использование как библиотеки

```python
from kadr_smeta import build_estimate, render_html, save_html

est = build_estimate("Кафе «Маяк»", hours=2, videos=3, travel=True)
save_html(est, "smeta-kafe-mayak.html")
print(est["total"])   # 13000
```

---

Учебный пример: студия «Кадр» и её клиенты вымышлены.
