Notification parsing: - Drop the account_bindings table/DAO/repo/entity/controller/screen; account resolution now goes senderToAccount rule -> source_apps.defaultAccountId (trusted) -> global default (untrusted -> Inbox), via v1->v2 migration. - Add defaultAccountId to source_apps; per-app settings consolidated into source_app_detail_screen (/settings/parsing/apps/:pkg). - Inbox auto-learns an app default on first Confirm/CreateRule; account picker on the card instead of a disabled button; parse_error_labels extracted. Analytics: - Replace placeholder screen with fl_chart cards (chart_card, chart_theme, month_stepper, month_math domain helper); slim down habit_analysis_screen. Android: add launcher icon (adaptive foreground + colors.xml) and app_name. Tests: migration_v2, analytics (screen/month_math), AI retry, inbox visibility; update resolver/gate/inbox suites for the new resolution path. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
61 lines
2.5 KiB
Dart
61 lines
2.5 KiB
Dart
import 'package:freezed_annotation/freezed_annotation.dart';
|
|
import '../../../../core/database/converters/enum_converters.dart';
|
|
import '../enums.dart';
|
|
|
|
part 'parse_draft.freezed.dart';
|
|
|
|
/// Структурированный результат разбора одного уведомления.
|
|
///
|
|
/// Промежуточный объект pipeline: создаётся regex-parser или ai-parser,
|
|
/// дополняется account_resolver, rule_lookup, затем передаётся в
|
|
/// confidence_scorer и decision gate.
|
|
///
|
|
/// [amount] — минорные единицы (всегда > 0); знак определяется [type].
|
|
/// [source] — какой этап pipeline заполнил draft.
|
|
@freezed
|
|
abstract class ParseDraft with _$ParseDraft {
|
|
const factory ParseDraft({
|
|
required String rawMessageId,
|
|
|
|
/// expense / income / transfer. «ignored» кодируется через отдельный статус
|
|
/// RawMessageStatus, тип здесь — реальный финансовый смысл операции.
|
|
required TransactionType type,
|
|
|
|
/// Сумма в минорных единицах (> 0).
|
|
required int amount,
|
|
@Default('RUB') String currency,
|
|
String? cardLast4,
|
|
|
|
/// Сырое имя мерчанта / отправителя из уведомления, до нормализации.
|
|
String? merchantRaw,
|
|
String? counterpartyName,
|
|
String? counterpartyPhone,
|
|
|
|
/// Дата-время операции из текста уведомления (может быть null).
|
|
DateTime? dateTime,
|
|
|
|
/// Гранулярный вид операции (purchase, refund, fee, …).
|
|
TxKind? kind,
|
|
|
|
/// Подсказка категории от AI («Продукты»). Только для Inbox-предложения,
|
|
/// не применяется автоматически.
|
|
String? categorySuggestion,
|
|
|
|
// Resolved fields — заполняются на последующих шагах pipeline:
|
|
|
|
/// Счёт, разрешённый резолвером (правило / дефолт приложения / глобальный).
|
|
String? accountId,
|
|
|
|
/// Нормализованное имя мерчанта (из правила или rule_candidate).
|
|
String? merchantCanonical,
|
|
|
|
/// Категория из сработавшего правила.
|
|
String? categoryId,
|
|
|
|
/// Целевой счёт для переводов (transfer).
|
|
String? transferToAccountId,
|
|
|
|
required ParseSource source,
|
|
}) = _ParseDraft;
|
|
}
|