2.5 KiB
2.5 KiB
Модель данных
Room schema
transactions
TransactionEntity:
| Поле | Тип | Назначение |
|---|---|---|
id |
String | UUID |
amount |
Double | сумма |
date |
Long | epoch millis |
note |
String | заметка |
categoryName |
String | snapshot категории |
categoryIcon |
String | иконка |
categoryEmoji |
String | emoji |
categoryColorName |
String | цвет |
isBalanceAdjustment |
Boolean | корректировка |
kindRawValue |
String | income/expense |
updatedAt |
Long | версия для sync |
Индексы: updatedAt, date.
categories
Пользовательские категории:
idnameiconemojicolorNamekindRawValuecreatedAtupdatedAt
Индекс (name, kindRawValue) помогает находить категории по имени и типу.
budgets
idcategoryNamecategoryIconcategoryEmojilimitAmountmonthStartupdatedAt
deletion_journal
Локальный журнал tombstones:
id = entity:recordIdentityrecordIdupdatedAt
Built-in categories
Expense:
- Продукты
- Транспорт
- Дом
- Развлечения
- Здоровье
- Покупки
- Подписки
- Образование
- Другое
Income:
- Зарплата
- Подработка
- Инвестиции
- Подарок
- Другое
Они не являются Room entities.
Финансовые правила
Общий баланс
sum(income.amount) - sum(expense.amount)
isBalanceAdjustment здесь не исключается.
Периодическая аналитика
FinanceMath.summary исключает:
- все balance adjustments;
- записи вне
[start, endExclusive).
Spending
FinanceMath.spending:
- берёт только expenses;
- исключает adjustments;
- группирует по category name;
- сортирует по убыванию суммы.
Category snapshot
Transaction и budget не имеют Room relationship на CategoryEntity. Они хранят presentation data непосредственно.
Это позволяет удалять пользовательскую категорию, не разрушая исторические операции.
Поэтому rename категории распространяется вручную на связанные transactions/budgets.