224 lines
9.6 KiB
Dart
224 lines
9.6 KiB
Dart
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<String, dynamic> 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<String, dynamic> 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<Account> accounts;
|
|
final List<ReconciliationStatus> 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<String, dynamic> 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<dynamic>? ?? [])
|
|
.map((e) => Account.fromJson(e as Map<String, dynamic>))
|
|
.toList(),
|
|
reconciliationsToday: (json['reconciliations_today'] as List<dynamic>? ?? [])
|
|
.map((e) => ReconciliationStatus.fromJson(e as Map<String, dynamic>))
|
|
.toList(),
|
|
);
|
|
}
|
|
|
|
Map<String, dynamic> 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<Account>? accounts,
|
|
List<ReconciliationStatus>? 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,
|
|
);
|
|
}
|
|
}
|