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 IconData icon; @HiveField(4) /// Флаг указывающий тип операции: /// true - доход (например зарплата) /// false - расход (например покупки) final bool isIncome; @HiveField(6) /// Дата и время последнего обновления объекта final DateTime updatedAt; /// Конструктор с обязательными параметрами Category({ String? id, required this.name, required this.color, required this.icon, required this.isIncome, DateTime? updatedAt, // Добавлено поле updatedAt, теперь необязательное }) : id = id ?? IdGenerator.generateId(), updatedAt = updatedAt ?? DateTime.now(); // Устанавливаем текущее время по умолчанию /// Метод для преобразования объекта в Map (полезно для работы с БД) Map toMap() { return { 'id': id, 'name': name, 'color': color.toARGB32(), // Сохраняем только значение цвета 'icon': icon.codePoint, 'isIncome': isIncome, 'updatedAt': updatedAt.toIso8601String(), // Добавлено updatedAt в Map }; } /// Фабричный метод для создания объекта из Map (например из БД) factory Category.fromMap(Map map) { return Category( id: map['id'], name: map['name'], color: Color(map['color']), icon: IconData(map['icon'], fontFamily: 'MaterialIcons'), isIncome: map['isIncome'], updatedAt: DateTime.parse(map['updatedAt']), // Добавлено updatedAt при создании из Map ); } /// Метод для создания копии объекта с возможностью изменения полей Category copyWith({ String? id, String? name, Color? color, IconData? icon, bool? isIncome, String? userId, }) { return Category( id: id ?? this.id, name: name ?? this.name, color: color ?? this.color, icon: icon ?? this.icon, isIncome: isIncome ?? this.isIncome, updatedAt: DateTime.now(), // Обновляем updatedAt при каждом копировании ); } // Используем Equatable для сравнения объектов по их свойствам. // В данном случае, мы считаем категории уникальными по их 'id'. @override List get props => [id]; }