Files
BudgetApp/lib/models/category.dart
T
2025-08-20 18:28:10 +03:00

102 lines
3.9 KiB
Dart

import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:hive_ce/hive.dart';
import '../utils/id_generator.dart';
part 'category.g.dart';
@HiveType(typeId: 1000)
/// Модель категории для группировки транзакций
/// Содержит основные параметры для визуализации и классификации
class Category extends Equatable {
/// Уникальный идентификатор категории
@HiveField(0)
final String id;
@HiveField(1)
/// Название категории (например: "Еда", "Транспорт")
final String name;
@HiveField(2)
/// Цвет категории для визуального выделения
final Color color;
@HiveField(3)
/// Код иконки категории для быстрой визуальной идентификации
final int iconCode;
@HiveField(4)
/// Флаг указывающий тип операции:
/// true - доход (например зарплата)
/// false - расход (например покупки)
final bool isIncome;
@HiveField(6)
/// Дата и время последнего обновления объекта
final DateTime updatedAt;
/// Конструктор с обязательными параметрами
Category({
String? id,
required this.name,
required this.color,
required this.iconCode,
required this.isIncome,
DateTime? updatedAt, // Добавлено поле updatedAt, теперь необязательное
}) : id = id ?? IdGenerator.generateId(),
updatedAt = updatedAt ?? DateTime.now(); // Устанавливаем текущее время по умолчанию
/// Метод для преобразования объекта в Map (полезно для работы с БД)
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
'color': color.toARGB32(), // Сохраняем только значение цвета
'icon': iconCode, // Сохраняем код иконки вместо IconData
'isIncome': isIncome,
'updatedAt': updatedAt.toIso8601String(), // Добавлено updatedAt в Map
};
}
/// Фабричный метод для создания объекта из Map (например из БД)
factory Category.fromMap(Map<String, dynamic> map) {
return Category(
id: map['id'],
name: map['name'],
color: Color(map['color']),
iconCode: map['icon'], // Используем код иконки вместо IconData
isIncome: map['isIncome'],
updatedAt: DateTime.parse(map['updatedAt']), // Добавлено updatedAt при создании из Map
);
}
/// Метод для создания копии объекта с возможностью изменения полей
Category copyWith({
String? id,
String? name,
Color? color,
int? iconCode,
bool? isIncome,
String? userId,
}) {
return Category(
id: id ?? this.id,
name: name ?? this.name,
color: color ?? this.color,
iconCode: iconCode ?? this.iconCode,
isIncome: isIncome ?? this.isIncome,
updatedAt: DateTime.now(), // Обновляем updatedAt при каждом копировании
);
}
/// Геттер для получения IconData из кода иконки
/// Это позволяет использовать иконки в UI без хранения IconData в Hive
IconData get icon => IconData(iconCode, fontFamily: 'MaterialIcons');
// Используем Equatable для сравнения объектов по их свойствам.
// В данном случае, мы считаем категории уникальными по их 'id'.
@override
List<Object?> get props => [id];
}