Таксономия расходов
Единый справочник по структуре расходов: группы, категории, измерения и правила классификации.
Группы и категории
| Группа | Категории |
|---|---|
| Еда | еда, фрукты, деликатесы, алкоголь |
| Жильё | хозтовары, аренда, ремонт, мебель, бытовая техника |
| ЖКХ и сервисы | коммунальные, мобильник, интернет, сервисы |
| Медицина | медицина, лекарства |
| Красота и ЗОЖ | гигиена, ЗОЖ |
| Спорт | спорт, велосипед, лыжи |
| Хобби и отдых | развлечения, кафе, гаджеты, электроника, инструменты |
| Транспорт | транспорт, машина, топливо |
| Знания и продуктивность | обучение, продуктивность |
| Семья и личное | карманные, подарки, одежда |
| Государство | налог, штрафы |
Описание категорий
- еда — продукты для повседневного питания
- фрукты — свежие фрукты и ягоды (выделены для аналитики здорового питания)
- деликатесы — дорогие / нетипичные продукты
- алкоголь — любые алкогольные напитки
- хозтовары — непитаемые расходники для дома: моющие, щётки, мешки, швабры
- аренда — арендная плата за жильё
- ремонт — обязательный ремонт квартиры (материалы + работа)
- мебель — предметы мебели для жилья
- бытовая техника — электрические устройства, объективно улучшающие среду проживания (увлажнитель, стиральная машина)
- коммунальные — электричество, вода, отопление, вывоз мусора
- мобильник — мобильная связь
- интернет — домашний / мобильный интернет
- сервисы — банковское обслуживание, подписки на базовые сервисы
- медицина — визиты к врачу, анализы, медицинские приборы (тонометр)
- лекарства — аптечные препараты
- гигиена — средства личной гигиены (шампунь, зубная паста, бритва)
- ЗОЖ — инструменты для здоровья и самочувствия (массажёр, коврик для йоги)
- спорт — абонементы, экипировка, соревнования
- велосипед — всё, связанное с велосипедом
- лыжи — ски-пассы, прокат, снаряжение
- развлечения — необязательные траты «для удовольствия» (кино, проектор, ароматизатор)
- кафе — кафе, рестораны, доставка еды
- гаджеты — мелкие необязательные электронные штуки (powerbank, Arduino, адаптеры)
- электроника — реальные устройства: телевизор, компьютер, наушники, телефон
- инструменты — DIY-оборудование для хобби (шуруповёрт, бензопила, газонокосилка)
- транспорт — общественный транспорт, такси, авиабилеты
- машина — обслуживание, страховка, ремонт автомобиля
- топливо — бензин, дизель, зарядка EV
- обучение — курсы, книги, конференции
- продуктивность — софт и подписки для работы/учёбы
- карманные — личные расходы членов семьи
- подарки — подарки на праздники, дни рождения
- одежда — одежда, обувь, аксессуары
- налог — подоходный налог, налог на имущество
- штрафы — штрафы от государства (ПДД, просрочки)
3D-модель расходов
Каждый расход описывается тремя измерениями:
- category — что было куплено (из таблицы выше)
- event — в рамках какого события (может быть пусто; одно событие на расход)
- tags[] — кросс-секторальные ярлыки (плоский фиксированный словарь)
Прежние оси beneficiary и сфера жизни свёрнуты в общий словарь тегов. Ось store исключена из Phase 1.
Словарь тегов (Phase 1, фиксированный)
PWA жёстко зашивает тот же список; отдельных эндпоинтов GET/POST /api/tags в Phase 1 нет.
| Тег | Когда ставить |
|---|---|
| собака | расходы на собаку |
| Аня | расходы для ребёнка |
| Лариса | расходы для жены |
| Андрей | сугубо личные расходы Андрея |
| релокация | расходы, вызванные переездом в другую страну (исторически) |
| профессиональное | расходы на профессиональное развитие / рабочие инструменты |
| дача | расходы, связанные с дачей |
Если ни один тег не подходит — tag_ids[] остаётся пустым (общесемейный расход).
Событие
- Событие — это опциональный контекст расхода: поездка, лагерь, командировка, релокация и т.п.
- Длительные события вроде
релокация-в-Сербиюживут вeventsсauto_attach_enabled=false— это hint для будущего receipt pipeline, а не правило, которое ретроспективно меняет уже сохранённые строки.
Граничные правила
При классификации неоднозначных покупок применяется принцип мотива покупки:
| Мотив | Категория |
|---|---|
| Обязательный функциональный минимум для дома | хозтовары |
| Электрическое устройство, объективно улучшающее среду | бытовая техника |
| Инструмент для личного здоровья / самочувствия | ЗОЖ |
| Медицинский прибор для измерений / терапии | медицина |
| Необязательная покупка для комфорта / «побаловать себя» | развлечения |
| DIY-оборудование для хобби | инструменты |
Примеры
- увлажнитель → бытовая техника (объективно улучшает микроклимат)
- ароматизатор → развлечения (необязательный комфорт)
- массажёр → ЗОЖ (инструмент для здоровья)
- тонометр → медицина (медицинский прибор)
- швабра, ведро → хозтовары (функциональный минимум)
- шуруповёрт для дачи как DIY-хобби → инструменты + сфера жизни = дача
- шуруповёрт для обязательного ремонта квартиры → ремонт
Страхование
Отдельной категории «страховка» в таксономии нет — страховые платежи распределяются по категории того объекта/сферы, которая страхуется:
| Что страхуем | Категория | Пример источника (sheet_category/sheet_group) |
|---|---|---|
| Квартира / жильё / дача | коммунальные | Household/Страховка, Дача/Страховка, Коммунальные/Страховка |
| Автомобиль (ОСАГО, КАСКО) | машина | Машина/Страховка |
| Жизнь / здоровье | медицина | Страхование жизни, Медицина/Страховка |
Логика: страховка — это плата за содержание конкретного объекта (жильё/машина) либо за медицинские риски, поэтому она попадает в соответствующую функциональную категорию, а не в отдельный «страховочный» бакет.
Книги и обучающие материалы
Книги/журналы/курсы идут в обучение независимо от того, в каком конверте исходной таблицы они встретились (Развлечения/Books, Развлечения/Книги, Развлечения/Журналы, Курсы/*, …). Даже если книга художественная и читается «для удовольствия», по таксономии она остаётся обучением.
Игрушки
Игрушки (Развлечения/Игрушки, Развлечения/Игрушка) идут в развлечения. Если игрушка покупалась ребёнку — тег Аня проставляется отдельно и не влияет на выбор категории.
Валюта
Dinary различает две валюты:
- Учётная валюта (
settings.accounting_currency, по умолчаниюEUR) — в ней хранятся все суммы в БД (полеamount) и выводятся все отчётыinv report-*. Значение привязывается к БД на первомinit_db(строкаaccounting_currencyв таблицеapp_metadata); далее оно является инвариантом — при последующих запусках сервер читает его из БД, а переменная окруженияDINARY_ACCOUNTING_CURRENCYстановится необязательной. Рассогласование env и якоря приводит к отказу старта — это защита от тихой порчи ledger-а опечаткой в.deploy/.env. - Валюта приложения (
settings.app_currency, по умолчаниюRSD) — в ней работает PWA: пользователь вводит суммы в динарах, и при отсутствии поляcurrencyвPOST /api/expensesсервер подставляет именно её вcurrency_original. В отличие от учётной валюты, её можно безопасно менять в любой момент (например, при переезде оператора) — она не хранится и не влияет на уже записанные строки.
Для каждой записи сохраняются:
amount— сумма в учётной валюте (EUR)amount_original— сумма в исходной валюте пользователя (обычно RSD из PWA, либо RUB/EUR для исторического импорта)currency_original— код исходной валюты (RSD,RUB,EUR)
Конвертация производится по курсу Национального банка Сербии (NBS) на 1-е число месяца расхода. Когда currency_original совпадает с учётной валютой, amount == amount_original без округления.