import 'account.dart'; class ReconciliationStatus { final int accountId; final String accountName; final double appBalance; final bool checkedToday; final double? realBalance; final double? difference; ReconciliationStatus({ required this.accountId, required this.accountName, required this.appBalance, required this.checkedToday, this.realBalance, this.difference, }); factory ReconciliationStatus.fromJson(Map json) { return ReconciliationStatus( accountId: json['account_id'] as int, accountName: json['account_name'] as String, appBalance: (json['app_balance'] as num? ?? 0).toDouble(), checkedToday: json['checked_today'] is int ? (json['checked_today'] as int) == 1 : json['checked_today'] as bool? ?? false, realBalance: (json['real_balance'] as num?)?.toDouble(), difference: (json['difference'] as num?)?.toDouble(), ); } Map toJson() { return { 'account_id': accountId, 'account_name': accountName, 'app_balance': appBalance, 'checked_today': checkedToday, 'real_balance': realBalance, 'difference': difference, }; } ReconciliationStatus copyWith({ double? appBalance, bool? checkedToday, double? realBalance, double? difference, }) { return ReconciliationStatus( accountId: accountId, accountName: accountName, appBalance: appBalance ?? this.appBalance, checkedToday: checkedToday ?? this.checkedToday, realBalance: realBalance ?? this.realBalance, difference: difference ?? this.difference, ); } } class DashboardData { final String month; final double totalBalance; final double availableAfterReserves; final double monthlyIncome; final double monthlyExpenses; final double monthlyBalance; final double provisionsCurrentTotal; final double provisionsTargetTotal; final double monthlyChargesRemainingTotal; final double monthlyTransferRemainingTotal; final double monthlyProvisionOperationRemainingTotal; // Nouveaux champs backend : échéancier / opérations prévues ponctuelles. final double scheduledExpensesRemainingTotal; final double scheduledIncomeRemainingTotal; final double scheduledTransferRemainingTotal; final double scheduledProvisionRemainingTotal; final double scheduledNetRemainingTotal; final double projectedMonthBalance; final List accounts; final List reconciliationsToday; DashboardData({ required this.month, required this.totalBalance, required this.availableAfterReserves, required this.monthlyIncome, required this.monthlyExpenses, required this.monthlyBalance, required this.provisionsCurrentTotal, required this.provisionsTargetTotal, required this.monthlyChargesRemainingTotal, required this.monthlyTransferRemainingTotal, required this.monthlyProvisionOperationRemainingTotal, required this.scheduledExpensesRemainingTotal, required this.scheduledIncomeRemainingTotal, required this.scheduledTransferRemainingTotal, required this.scheduledProvisionRemainingTotal, required this.scheduledNetRemainingTotal, required this.projectedMonthBalance, required this.accounts, required this.reconciliationsToday, }); double get plannedExpensesTotal => monthlyChargesRemainingTotal + scheduledExpensesRemainingTotal; double get plannedTransfersTotal => monthlyTransferRemainingTotal + scheduledTransferRemainingTotal; double get plannedProvisionsTotal => monthlyProvisionOperationRemainingTotal + scheduledProvisionRemainingTotal; bool get hasScheduledInfo => scheduledExpensesRemainingTotal != 0 || scheduledIncomeRemainingTotal != 0 || scheduledTransferRemainingTotal != 0 || scheduledProvisionRemainingTotal != 0; factory DashboardData.fromJson(Map json) { final availableRaw = json['available_after_reserves'] ?? json['total_balance'] ?? 0; final monthlyBalance = (json['monthly_balance'] as num? ?? 0).toDouble(); final scheduledIncome = (json['scheduled_income_remaining_total'] as num? ?? 0).toDouble(); final scheduledExpenses = (json['scheduled_expenses_remaining_total'] as num? ?? 0).toDouble(); return DashboardData( month: json['month'] as String? ?? '', totalBalance: (json['total_balance'] as num? ?? 0).toDouble(), availableAfterReserves: (availableRaw as num).toDouble(), monthlyIncome: (json['monthly_income'] as num? ?? 0).toDouble(), monthlyExpenses: (json['monthly_expenses'] as num? ?? 0).toDouble(), monthlyBalance: monthlyBalance, provisionsCurrentTotal: (json['provisions_current_total'] as num? ?? 0).toDouble(), provisionsTargetTotal: (json['provisions_target_total'] as num? ?? 0).toDouble(), monthlyChargesRemainingTotal: (json['monthly_charges_remaining_total'] as num? ?? 0).toDouble(), monthlyTransferRemainingTotal: (json['monthly_transfer_remaining_total'] as num? ?? 0).toDouble(), monthlyProvisionOperationRemainingTotal: (json['monthly_provision_operation_remaining_total'] as num? ?? 0).toDouble(), scheduledExpensesRemainingTotal: scheduledExpenses, scheduledIncomeRemainingTotal: scheduledIncome, scheduledTransferRemainingTotal: (json['scheduled_transfer_remaining_total'] as num? ?? 0).toDouble(), scheduledProvisionRemainingTotal: (json['scheduled_provision_remaining_total'] as num? ?? 0).toDouble(), scheduledNetRemainingTotal: (json['scheduled_net_remaining_total'] as num? ?? (scheduledIncome - scheduledExpenses)).toDouble(), projectedMonthBalance: (json['projected_month_balance'] as num? ?? (monthlyBalance + scheduledIncome - scheduledExpenses)).toDouble(), accounts: (json['accounts'] as List? ?? []) .map((e) => Account.fromJson(e as Map)) .toList(), reconciliationsToday: (json['reconciliations_today'] as List? ?? []) .map((e) => ReconciliationStatus.fromJson(e as Map)) .toList(), ); } Map toJson() { return { 'month': month, 'total_balance': totalBalance, 'available_after_reserves': availableAfterReserves, 'monthly_income': monthlyIncome, 'monthly_expenses': monthlyExpenses, 'monthly_balance': monthlyBalance, 'provisions_current_total': provisionsCurrentTotal, 'provisions_target_total': provisionsTargetTotal, 'monthly_charges_remaining_total': monthlyChargesRemainingTotal, 'monthly_transfer_remaining_total': monthlyTransferRemainingTotal, 'monthly_provision_operation_remaining_total': monthlyProvisionOperationRemainingTotal, 'scheduled_expenses_remaining_total': scheduledExpensesRemainingTotal, 'scheduled_income_remaining_total': scheduledIncomeRemainingTotal, 'scheduled_transfer_remaining_total': scheduledTransferRemainingTotal, 'scheduled_provision_remaining_total': scheduledProvisionRemainingTotal, 'scheduled_net_remaining_total': scheduledNetRemainingTotal, 'projected_month_balance': projectedMonthBalance, 'accounts': accounts.map((e) => e.toJson()).toList(), 'reconciliations_today': reconciliationsToday.map((e) => e.toJson()).toList(), }; } DashboardData copyWith({ String? month, double? totalBalance, double? availableAfterReserves, double? monthlyIncome, double? monthlyExpenses, double? monthlyBalance, double? provisionsCurrentTotal, double? provisionsTargetTotal, double? monthlyChargesRemainingTotal, double? monthlyTransferRemainingTotal, double? monthlyProvisionOperationRemainingTotal, double? scheduledExpensesRemainingTotal, double? scheduledIncomeRemainingTotal, double? scheduledTransferRemainingTotal, double? scheduledProvisionRemainingTotal, double? scheduledNetRemainingTotal, double? projectedMonthBalance, List? accounts, List? reconciliationsToday, }) { return DashboardData( month: month ?? this.month, totalBalance: totalBalance ?? this.totalBalance, availableAfterReserves: availableAfterReserves ?? this.availableAfterReserves, monthlyIncome: monthlyIncome ?? this.monthlyIncome, monthlyExpenses: monthlyExpenses ?? this.monthlyExpenses, monthlyBalance: monthlyBalance ?? this.monthlyBalance, provisionsCurrentTotal: provisionsCurrentTotal ?? this.provisionsCurrentTotal, provisionsTargetTotal: provisionsTargetTotal ?? this.provisionsTargetTotal, monthlyChargesRemainingTotal: monthlyChargesRemainingTotal ?? this.monthlyChargesRemainingTotal, monthlyTransferRemainingTotal: monthlyTransferRemainingTotal ?? this.monthlyTransferRemainingTotal, monthlyProvisionOperationRemainingTotal: monthlyProvisionOperationRemainingTotal ?? this.monthlyProvisionOperationRemainingTotal, scheduledExpensesRemainingTotal: scheduledExpensesRemainingTotal ?? this.scheduledExpensesRemainingTotal, scheduledIncomeRemainingTotal: scheduledIncomeRemainingTotal ?? this.scheduledIncomeRemainingTotal, scheduledTransferRemainingTotal: scheduledTransferRemainingTotal ?? this.scheduledTransferRemainingTotal, scheduledProvisionRemainingTotal: scheduledProvisionRemainingTotal ?? this.scheduledProvisionRemainingTotal, scheduledNetRemainingTotal: scheduledNetRemainingTotal ?? this.scheduledNetRemainingTotal, projectedMonthBalance: projectedMonthBalance ?? this.projectedMonthBalance, accounts: accounts ?? this.accounts, reconciliationsToday: reconciliationsToday ?? this.reconciliationsToday, ); } }