Таксономия расходов
Единый справочник по структуре расходов: группы, категории, измерения и правила классификации.
Группы и категории
| Группа | Категории |
|---|---|
| Еда | еда, фрукты, деликатесы, алкоголь |
| Жильё | хозтовары, аренда, ремонт, мебель, бытовая техника |
| ЖКХ и сервисы | коммунальные, мобильник, интернет, сервисы |
| Медицина | медицина, лекарства |
| Красота и ЗОЖ | гигиена, ЗОЖ |
| Спорт | спорт, велосипед, лыжи |
| Хобби и отдых | развлечения, кафе, гаджеты, электроника, инструменты |
| Транспорт | транспорт, машина, топливо |
| Знания и продуктивность | обучение, продуктивность |
| Семья и личное | карманные, подарки, одежда |
| Государство | налог, штрафы |
Описание категорий
- еда — продукты для повседневного питания
- фрукты — свежие фрукты и ягоды (выделены для аналитики здорового питания)
- деликатесы — дорогие / нетипичные продукты
- алкоголь — любые алкогольные напитки
- хозтовары — непитаемые расходники для дома: моющие, щётки, мешки, швабры
- аренда — арендная плата за жильё
- ремонт — обязательный ремонт квартиры (материалы + работа)
- мебель — предметы мебели для жилья
- бытовая техника — электрические устройства, объективно улучшающие среду проживания (увлажнитель, стиральная машина)
- коммунальные — электричество, вода, отопление, вывоз мусора
- мобильник — мобильная связь
- интернет — домашний / мобильный интернет
- сервисы — банковское обслуживание, подписки на базовые сервисы
- медицина — визиты к врачу, анализы, медицинские приборы (тонометр)
- лекарства — аптечные препараты
- гигиена — средства личной гигиены (шампунь, зубная паста, бритва)
- ЗОЖ — инструменты для здоровья и самочувствия (массажёр, коврик для йоги)
- спорт — абонементы, экипировка, соревнования
- велосипед — всё, связанное с велосипедом
- лыжи — ски-пассы, прокат, снаряжение
- развлечения — необязательные траты «для удовольствия» (кино, проектор, ароматизатор)
- кафе — кафе, рестораны, доставка еды
- гаджеты — мелкие необязательные электронные штуки (powerbank, Arduino, адаптеры)
- электроника — реальные устройства: телевизор, компьютер, наушники, телефон
- инструменты — DIY-оборудование для хобби (шуруповёрт, бензопила, газонокосилка)
- транспорт — общественный транспорт, такси, авиабилеты
- машина — обслуживание, страховка, ремонт автомобиля
- топливо — бензин, дизель, зарядка EV
- обучение — курсы, книги, конференции
- продуктивность — софт и подписки для работы/учёбы
- карманные — личные расходы членов семьи
- подарки — подарки на праздники, дни рождения
- одежда — одежда, обувь, аксессуары
- налог — подоходный налог, налог на имущество
- штрафы — штрафы от государства (ПДД, просрочки)
3D-модель расходов
Каждый расход описывается тремя измерениями:
- category — что было куплено (из таблицы выше)
- event — в рамках какого события (может быть пусто; одно событие на расход)
- tags[] — кросс-секторальные ярлыки (плоский фиксированный словарь)
Прежние оси beneficiary и сфера жизни свёрнуты в общий словарь тегов. Ось store исключена из Phase 1.
Словарь тегов (Phase 1, фиксированный)
PWA жёстко зашивает тот же список; отдельных эндпоинтов GET/POST /api/tags в Phase 1 нет.
| Тег | Когда ставить |
|---|---|
| собака | расходы на собаку |
| Аня | расходы для ребёнка |
| Лариса | расходы для жены |
| Андрей | сугубо личные расходы Андрея |
| релокация | расходы, вызванные переездом в другую страну (исторически) |
| профессиональное | расходы на профессиональное развитие / рабочие инструменты |
| дача | расходы, связанные с дачей |
Если ни один тег не подходит — tag_ids[] остаётся пустым (общесемейный расход).
Событие
- В Phase 1 PWA не работает с событиями:
POST /api/expensesвсегда сохраняетevent_id=NULL, отправкаevent_idс клиента отклоняется ошибкой 4xx. - Исторический bootstrap-импорт из таблиц проставляет
event_idчерезimport_mapping+import_mapping_tags: отпуск-YYYYдля строк с конвертом «путешествия» (путешествия,travel,отпуск,sim-travel);командировка-YYYY(только для лет ≤ 2021) для строк сsheet_category="командировка"или конвертомкомандировка.- Длительные события вроде
релокация-в-Сербиюживут вeventsсauto_attach_enabled=false— это hint для будущего receipt-pipeline, а не правило, которое срабатывает на уже сохранённых строках.
Командировки vs релокация
В импортируемых Google Sheets слово «командировка» означает разное в зависимости от года:
| Период | Что значит «командировка» в таблице | теги при импорте | event |
|---|---|---|---|
| ≤ 2021 | реальная рабочая поездка | профессиональное |
командировка-YYYY (создаётся при импорте) |
| ≥ 2022 | переезд в Сербию (не настоящая командировка) | релокация |
— (не создаётся) |
| будущее (после импорта) | — | задаётся вручную через PWA | задаётся будущим receipt-pipeline |
После завершения исторического импорта БД становится source of truth: новые реальные командировки заводятся через PWA с тегом профессиональное. Граница 2021 зашита константой BUSINESS_TRIP_EVENT_LAST_YEAR в src/dinary/services/seed_config.py.
Граничные правила
При классификации неоднозначных покупок применяется принцип мотива покупки:
| Мотив | Категория |
|---|---|
| Обязательный функциональный минимум для дома | хозтовары |
| Электрическое устройство, объективно улучшающее среду | бытовая техника |
| Инструмент для личного здоровья / самочувствия | ЗОЖ |
| Медицинский прибор для измерений / терапии | медицина |
| Необязательная покупка для комфорта / «побаловать себя» | развлечения |
| DIY-оборудование для хобби | инструменты |
Примеры
- увлажнитель → бытовая техника (объективно улучшает микроклимат)
- ароматизатор → развлечения (необязательный комфорт)
- массажёр → ЗОЖ (инструмент для здоровья)
- тонометр → медицина (медицинский прибор)
- швабра, ведро → хозтовары (функциональный минимум)
- шуруповёрт для дачи как DIY-хобби → инструменты + сфера жизни = дача
- шуруповёрт для обязательного ремонта квартиры → ремонт
Страхование
Отдельной категории «страховка» в таксономии нет — страховые платежи распределяются по категории того объекта/сферы, которая страхуется:
| Что страхуем | Категория | Пример источника (sheet_category/sheet_group) |
|---|---|---|
| Квартира / жильё / дача | коммунальные | Household/Страховка, Дача/Страховка, Коммунальные/Страховка |
| Автомобиль (ОСАГО, КАСКО) | машина | Машина/Страховка |
| Жизнь / здоровье | медицина | Страхование жизни, Медицина/Страховка |
Логика: страховка — это плата за содержание конкретного объекта (жильё/машина) либо за медицинские риски, поэтому она попадает в соответствующую функциональную категорию, а не в отдельный «страховочный» бакет.
Книги и обучающие материалы
Книги/журналы/курсы идут в обучение независимо от того, в каком конверте исходной таблицы они встретились (Развлечения/Books, Развлечения/Книги, Развлечения/Журналы, Курсы/*, …). Даже если книга художественная и читается «для удовольствия», по таксономии она остаётся обучением.
Игрушки
Игрушки (Развлечения/Игрушки, Развлечения/Игрушка) идут в развлечения. Если игрушка покупалась ребёнку — тег Аня проставляется отдельно и не влияет на выбор категории.
Валюта
Все суммы в БД хранятся в EUR (поле amount). Дополнительно сохраняются:
amount_original— сумма в исходной валютеcurrency_original— код валюты (RSD,RUB,EUR)
Конвертация производится по курсу Национального банка Сербии (NBS) на 1-е число месяца расхода.