5.8 KiB
5.8 KiB
📘 Финансовый модуль
1. Общее описание
Финансовый модуль предназначен для учёта:
- доходов
- расходов
- категорий
Поддерживает два способа ввода расходов:
- Ручной ввод
- Сканирование чека (QR-код)
2. Глоссарий
Доход (Income)
Денежное поступление (зарплата, перевод, подарок и т.д.)
Расход (Expense)
Факт траты денег
Категория (Category)
Классификация доходов и расходов (например: еда, транспорт, зарплата)
Чек (Receipt)
Документ, содержащий информацию о покупке (дата, позиции, сумма)
Позиция (Position)
Отдельная строка в чеке (товар или услуга)
3. Доменная модель
3.1 Positions
positions (
id,
receipt_number,
operation_date,
gtin_code,
product_name,
product_count,
amount,
discount,
name_spd,
category_id,
family_id,
family_member_id,
created_at,
updated_at
)
Описание полей:
receipt_number— номер чека (nullable для ручного ввода)operation_date— дата операцииgtin_code— код товараproduct_name— название товараproduct_count— количествоamount— сумма позицииdiscount— скидкаname_spd— продавецcategory_id— категорияfamily_id— семьяfamily_member_id— участник
3.2 Receipts
receipts (
id,
receipt_number,
ui,
status,
issued_at,
total_amount,
payment_amount,
cash_amount,
another_amount,
clearing_amount,
margin,
currency,
payment_type,
cashbox_number,
cashier,
name_spd,
name_to,
name_np,
type_np,
street_to,
house_to,
kod_soato,
oblast_soato,
rayon_soato,
selsovet_soato,
doc_num,
skno_number,
unp,
success,
family_id,
family_member_id,
created_at
)
Описание:
- хранит агрегированную информацию о чеке
- используется при сканировании QR
- связывается с positions через
receipt_number
3.3 Categories
categories (
id,
name,
type,
family_id,
family_member_id,
created_at
)
Описание полей:
type— income | expense- категория принадлежит семье
4. Бизнес-логика
4.1 Добавление расхода вручную
- пользователь вводит:
- сумму
- описание
- категорию
- создаётся запись в
positions receipt_number = NULL
4.2 Добавление дохода
- аналогично расходу
- используется категория типа
income
4.3 Сканирование чека
Поток:
- Пользователь отправляет QR-код
- Backend получает данные чека через внешний сервис
- Создаётся запись в
receipts - Для каждой позиции создаётся запись в
positions
5. Потоки
Ручной ввод
User → API → positions
Доход
User → API → positions
6. API (черновик)
Создание позиции
POST /positions
{
"amount": 1000,
"category_id": 1,
"description": "Продукты"
}
Сканирование чека
POST /receipts/scan
{
"qr_data": "string"
}
Получение позиций
GET /positions
Фильтры:
- дата
- категория
- тип
- family_id
7. Задачи для разработки
Этап 1 — База
- Переписать SQL-миграции (positions, receipts, categories)
Этап 2 — Категории
- CRUD категорий
- Валидация типа (income/expense)
Этап 3 — Позиции
- Endpoint создания позиции
- Endpoint получения списка
- Фильтрация
Этап 4 — Доходы/расходы
- Определение типа через категорию
- Валидация соответствия
Этап 5 — Чеки
- Endpoint загрузки QR
- Интеграция с сервисом чеков
- Создание receipts
- Создание positions
Этап 6 — Telegram интеграция
- Команды добавления дохода/расхода
- Обработка QR
Этап 7 — Дополнительно
- Автокатегоризация
- Статистика
- Лимиты
8. Архитектурные решения
- Transaction — основная сущность финансов
- Receipt — дополняет транзакцию
- Position - позиции из чека
- Категории определяют тип операции
- Поддержка multi-tenant через family_id
9. Открытые вопросы
- Нужна ли мультивалютность?
- Можно ли редактировать чек?
- Как обрабатывать ошибки OCR?
- Нужны ли роли внутри семьи?