Files
OnBudget/lib/src/features/notification_parsing/domain/entities/parse_draft.dart
T
SandersandClaude Opus 4.8 4f99b80169 Replace account_bindings with per-app default account; build analytics charts
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>
2026-07-18 00:09:12 +03:00

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;
}