76 lines
2.3 KiB
Dart
76 lines
2.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:hive/hive.dart';
|
|
|
|
part 'transaction_record.g.dart';
|
|
|
|
@HiveType(typeId: 2)
|
|
import 'category.dart';
|
|
import 'tag.dart';
|
|
|
|
/// Модель записи о транзакции - основной элемент учета бюджета
|
|
/// Содержит все детали финансовой операции
|
|
class TransactionRecord {
|
|
|
|
/// Уникальный идентификатор транзакции
|
|
@HiveField(0)
|
|
final String id;
|
|
|
|
/// Ссылка на категорию транзакции
|
|
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.id,
|
|
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(
|
|
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'],
|
|
);
|
|
}
|
|
|
|
/// Вспомогательный геттер для определения типа операции
|
|
/// (доход/расход) на основе категории
|
|
bool get isIncome => category.isIncome;
|
|
}
|