102 lines
3.9 KiB
Dart
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];
|
|
}
|