Skip to content

Таксономия расходов

Единый справочник по структуре расходов: группы, категории, измерения и правила классификации.

Группы и категории

Группа Категории
Еда еда, фрукты, деликатесы, алкоголь
Жильё хозтовары, аренда, ремонт, мебель, бытовая техника
ЖКХ и сервисы коммунальные, мобильник, интернет, сервисы
Медицина медицина, лекарства
Красота и ЗОЖ гигиена, ЗОЖ
Спорт спорт, велосипед, лыжи
Хобби и отдых развлечения, кафе, гаджеты, электроника, инструменты
Транспорт транспорт, машина, топливо
Знания и продуктивность обучение, продуктивность
Семья и личное карманные, подарки, одежда
Государство налог, штрафы

Описание категорий

  • еда — продукты для повседневного питания
  • фрукты — свежие фрукты и ягоды (выделены для аналитики здорового питания)
  • деликатесы — дорогие / нетипичные продукты
  • алкоголь — любые алкогольные напитки
  • хозтовары — непитаемые расходники для дома: моющие, щётки, мешки, швабры
  • аренда — арендная плата за жильё
  • ремонт — обязательный ремонт квартиры (материалы + работа)
  • мебель — предметы мебели для жилья
  • бытовая техника — электрические устройства, объективно улучшающие среду проживания (увлажнитель, стиральная машина)
  • коммунальные — электричество, вода, отопление, вывоз мусора
  • мобильник — мобильная связь
  • интернет — домашний / мобильный интернет
  • сервисы — банковское обслуживание, подписки на базовые сервисы
  • медицина — визиты к врачу, анализы, медицинские приборы (тонометр)
  • лекарства — аптечные препараты
  • гигиена — средства личной гигиены (шампунь, зубная паста, бритва)
  • ЗОЖ — инструменты для здоровья и самочувствия (массажёр, коврик для йоги)
  • спорт — абонементы, экипировка, соревнования
  • велосипед — всё, связанное с велосипедом
  • лыжи — ски-пассы, прокат, снаряжение
  • развлечения — необязательные траты «для удовольствия» (кино, проектор, ароматизатор)
  • кафе — кафе, рестораны, доставка еды
  • гаджеты — мелкие необязательные электронные штуки (powerbank, Arduino, адаптеры)
  • электроника — реальные устройства: телевизор, компьютер, наушники, телефон
  • инструменты — DIY-оборудование для хобби (шуруповёрт, бензопила, газонокосилка)
  • транспорт — общественный транспорт, такси, авиабилеты
  • машина — обслуживание, страховка, ремонт автомобиля
  • топливо — бензин, дизель, зарядка EV
  • обучение — курсы, книги, конференции
  • продуктивность — софт и подписки для работы/учёбы
  • карманные — личные расходы членов семьи
  • подарки — подарки на праздники, дни рождения
  • одежда — одежда, обувь, аксессуары
  • налог — подоходный налог, налог на имущество
  • штрафы — штрафы от государства (ПДД, просрочки)

3D-модель расходов

Каждый расход описывается тремя измерениями:

  1. category — что было куплено (из таблицы выше)
  2. event — в рамках какого события (может быть пусто; одно событие на расход)
  3. 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-е число месяца расхода.