feat: добавить модели Category, Tag и TransactionRecord

This commit is contained in:
2025-06-09 15:36:49 +03:00
parent 966e8f19d0
commit cdc2086fd8
3 changed files with 147 additions and 0 deletions
+53
View File
@@ -0,0 +1,53 @@
import 'package:flutter/material.dart';
/// Модель категории для группировки транзакций
/// Содержит основные параметры для визуализации и классификации
class Category {
/// Уникальный идентификатор категории
final String id;
/// Название категории (например: "Еда", "Транспорт")
final String name;
/// Цвет категории для визуального выделения
final Color color;
/// Иконка категории для быстрой визуальной идентификации
final IconData icon;
/// Флаг указывающий тип операции:
/// true - доход (например зарплата)
/// false - расход (например покупки)
final bool isIncome;
/// Конструктор с обязательными параметрами
const Category({
required this.id,
required this.name,
required this.color,
required this.icon,
required this.isIncome,
});
/// Метод для преобразования объекта в Map (полезно для работы с БД)
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
'color': color.value, // Сохраняем только значение цвета
'icon': icon.codePoint,
'isIncome': isIncome,
};
}
/// Фабричный метод для создания объекта из Map (например из БД)
factory Category.fromMap(Map<String, dynamic> map) {
return Category(
id: map['id'],
name: map['name'],
color: Color(map['color']),
icon: IconData(map['icon'], fontFamily: 'MaterialIcons'),
isIncome: map['isIncome'],
);
}
}
+31
View File
@@ -0,0 +1,31 @@
/// Модель тега для дополнительной маркировки транзакций
/// Позволяет добавлять дополнительные метки к операциям
class Tag {
/// Уникальный идентификатор тега
final String id;
/// Название тега (например: "Важное", "Работа")
final String name;
/// Конструктор с обязательными параметрами
const Tag({
required this.id,
required this.name,
});
/// Преобразование объекта в Map
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
};
}
/// Создание объекта из Map
factory Tag.fromMap(Map<String, dynamic> map) {
return Tag(
id: map['id'],
name: map['name'],
);
}
}
+63
View File
@@ -0,0 +1,63 @@
import 'package:flutter/material.dart';
import 'category.dart';
import 'tag.dart';
/// Модель записи о транзакции - основной элемент учета бюджета
/// Содержит все детали финансовой операции
class TransactionRecord {
/// Ссылка на категорию транзакции
final Category category;
/// Опциональная ссылка на тег (может быть null)
final Tag? tag;
/// Сумма транзакции (отрицательная для расходов)
final double amount;
/// Дата и время совершения операции
final DateTime dateTime;
/// Название продавца/получателя средств
final String vendor;
/// Валюта операции (код валюты, например "RUB", "USD")
final String currency;
/// Конструктор с обязательными параметрами
const TransactionRecord({
required this.category,
this.tag,
required this.amount,
required this.dateTime,
required this.vendor,
required this.currency,
});
/// Преобразование объекта в Map
Map<String, dynamic> toMap() {
return {
'category': category.toMap(),
'tag': tag?.toMap(),
'amount': amount,
'dateTime': dateTime.toIso8601String(),
'vendor': vendor,
'currency': currency,
};
}
/// Создание объекта из Map
factory TransactionRecord.fromMap(Map<String, dynamic> map) {
return TransactionRecord(
category: Category.fromMap(map['category']),
tag: map['tag'] != null ? Tag.fromMap(map['tag']) : null,
amount: map['amount'],
dateTime: DateTime.parse(map['dateTime']),
vendor: map['vendor'],
currency: map['currency'],
);
}
/// Вспомогательный геттер для определения типа операции
/// (доход/расход) на основе категории
bool get isIncome => category.isIncome;
}