Files
BudgetApp/lib/models/transaction_record.dart
T
Sanders 42f8e20bf0 Improves: Internationalization and data models
- Adds new localization keys for transaction details.
- Deletes obsolete localization files, switching to a single ARB file per language.
- Adds `Equatable` to data models (`Category`, `Tag`, `TransactionRecord`, `User`) for improved state management and change detection.
- Introduces the transaction creation dialog.
- Adds development note to GEMINI.md

Improves internationalization and data models

- Adds new localization keys for transaction details, supporting enhanced user experience.
- Migrates to single ARB file for each language, streamlining the localization process.
- Implements Equatable in data models (Category, Tag, TransactionRecord, User) for improved state management and simplified change detection.
- Introduces transaction creation dialog, simplifying the transaction creation process.
- Adds development note to GEMINI.md
2025-06-29 23:03:17 +03:00

131 lines
4.6 KiB
Dart

import 'package:equatable/equatable.dart';
import 'package:hive_ce/hive.dart';
import '../../utils/id_generator.dart';
import 'category.dart';
import 'tag.dart';
part 'transaction_record.g.dart';
@HiveType(typeId: 1002)
/// Модель записи о транзакции - основной элемент учета бюджета
/// Содержит все детали финансовой операции
class TransactionRecord extends Equatable {
/// Уникальный идентификатор транзакции
@HiveField(0)
final String id;
@HiveField(1)
/// Ссылка на категорию транзакции
final Category category;
@HiveField(2)
/// Опциональная ссылка на тег (может быть null)
final Tag? tag;
@HiveField(3)
/// Сумма транзакции (отрицательная для расходов)
final double amount;
@HiveField(4)
/// Дата и время совершения операции
final DateTime dateTime;
@HiveField(5)
/// Название продавца/получателя средств
final String vendor;
@HiveField(6)
/// Валюта операции (код валюты, например "RUB", "USD")
final String currency;
// Добавляем новое поле для хранения идентификатора пользователя
@HiveField(7) // Используем следующий доступный номер поля Hive
final String userId;
@HiveField(8)
/// Дата и время последнего обновления объекта
final DateTime updatedAt;
/// Конструктор с обязательными параметрами
TransactionRecord({
String? id,
required this.category,
this.tag,
required this.amount,
required this.dateTime,
required this.vendor,
required this.currency,
required this.userId, // Добавляем userId в конструктор
DateTime? updatedAt, // Добавлено поле updatedAt, теперь необязательное
}) : id = id ?? IdGenerator.generateId(),
updatedAt =
updatedAt ??
DateTime.now(); // Устанавливаем текущее время по умолчанию
/// Преобразование объекта в Map
Map<String, dynamic> toMap() {
return {
'id': id, // Добавляем id в map для fromMap
'category': category.toMap(),
'tag': tag?.toMap(),
'amount': amount,
'dateTime': dateTime.toIso8601String(),
'vendor': vendor,
'currency': currency,
'userId': userId, // Добавляем userId в Map
'updatedAt': updatedAt.toIso8601String(), // Добавлено updatedAt в Map
};
}
/// Создание объекта из Map
factory TransactionRecord.fromMap(Map<String, dynamic> map) {
return TransactionRecord(
id: map['id'],
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'],
userId: map['userId'], // Извлекаем userId из Map
updatedAt: DateTime.parse(
map['updatedAt'],
), // Добавлено updatedAt при создании из Map
);
}
/// Вспомогательный геттер для определения типа операции
/// (доход/расход) на основе категории
bool get isIncome => category.isIncome;
/// Метод для создания копии объекта с возможностью изменения полей
TransactionRecord copyWith({
String? id,
Category? category,
Tag? tag,
double? amount,
DateTime? dateTime,
String? vendor,
String? currency,
String? userId,
}) {
return TransactionRecord(
id: id ?? this.id,
category: category ?? this.category,
tag: tag ?? this.tag,
amount: amount ?? this.amount,
dateTime: dateTime ?? this.dateTime,
vendor: vendor ?? this.vendor,
currency: currency ?? this.currency,
userId: userId ?? this.userId,
updatedAt: DateTime.now(), // Обновляем updatedAt при каждом копировании
);
}
// Используем Equatable для сравнения объектов по их свойствам.
// В данном случае, мы считаем записи транзакций уникальными по их 'id'.
@override
List<Object?> get props => [id];
}