feat: добавить модели Category, Tag и TransactionRecord
This commit is contained in:
@@ -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'],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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'],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user