Files
2026-05-27 03:11:45 -04:00

180 lines
5.6 KiB
Dart

class DashboardMetrics {
final DashboardKpis kpis;
final List<DashboardRecentReservation> recentReservations;
final List<DashboardSourceBreakdown> sourceBreakdown;
final DashboardSubscription? subscription;
const DashboardMetrics({
required this.kpis,
required this.recentReservations,
required this.sourceBreakdown,
required this.subscription,
});
factory DashboardMetrics.fromJson(Map<String, dynamic> json) {
final kpiJson = json['kpis'] as Map<String, dynamic>?;
return DashboardMetrics(
kpis: DashboardKpis.fromJson(kpiJson ?? json),
recentReservations: (json['recentReservations'] as List<dynamic>?)
?.map(
(e) => DashboardRecentReservation.fromJson(
e as Map<String, dynamic>,
),
)
.toList() ??
const [],
sourceBreakdown: (json['sourceBreakdown'] as List<dynamic>?)
?.map(
(e) => DashboardSourceBreakdown.fromJson(
e as Map<String, dynamic>,
),
)
.toList() ??
const [],
subscription: json['subscription'] is Map<String, dynamic>
? DashboardSubscription.fromJson(
json['subscription'] as Map<String, dynamic>,
)
: null,
);
}
factory DashboardMetrics.empty() => DashboardMetrics(
kpis: DashboardKpis.empty(),
recentReservations: const [],
sourceBreakdown: const [],
subscription: null,
);
}
class DashboardKpis {
final int totalBookings;
final int activeVehicles;
final double monthlyRevenue;
final int totalCustomers;
final double bookingsChange;
final double vehiclesChange;
final double revenueChange;
final double customersChange;
const DashboardKpis({
required this.totalBookings,
required this.activeVehicles,
required this.monthlyRevenue,
required this.totalCustomers,
required this.bookingsChange,
required this.vehiclesChange,
required this.revenueChange,
required this.customersChange,
});
factory DashboardKpis.fromJson(Map<String, dynamic> json) => DashboardKpis(
totalBookings:
(json['totalBookings'] as num?)?.toInt() ??
(json['totalReservations'] as num?)?.toInt() ??
0,
activeVehicles:
(json['activeVehicles'] as num?)?.toInt() ??
(json['availableVehicles'] as num?)?.toInt() ??
(json['totalVehicles'] as num?)?.toInt() ??
0,
monthlyRevenue:
(json['monthlyRevenue'] as num?)?.toDouble() ??
(json['totalRevenue'] as num?)?.toDouble() ??
0,
totalCustomers: (json['totalCustomers'] as num?)?.toInt() ?? 0,
bookingsChange: (json['bookingsChange'] as num?)?.toDouble() ?? 0,
vehiclesChange: (json['vehiclesChange'] as num?)?.toDouble() ?? 0,
revenueChange: (json['revenueChange'] as num?)?.toDouble() ?? 0,
customersChange: (json['customersChange'] as num?)?.toDouble() ?? 0,
);
factory DashboardKpis.empty() => const DashboardKpis(
totalBookings: 0,
activeVehicles: 0,
monthlyRevenue: 0,
totalCustomers: 0,
bookingsChange: 0,
vehiclesChange: 0,
revenueChange: 0,
customersChange: 0,
);
}
class DashboardRecentReservation {
final String id;
final String bookingRef;
final String customerName;
final String vehicleName;
final DateTime startDate;
final DateTime endDate;
final String status;
final double totalAmount;
const DashboardRecentReservation({
required this.id,
required this.bookingRef,
required this.customerName,
required this.vehicleName,
required this.startDate,
required this.endDate,
required this.status,
required this.totalAmount,
});
factory DashboardRecentReservation.fromJson(Map<String, dynamic> json) =>
DashboardRecentReservation(
id: json['id'] as String,
bookingRef: json['bookingRef'] as String? ?? '',
customerName: json['customerName'] as String? ?? 'Unknown customer',
vehicleName: json['vehicleName'] as String? ?? 'Unknown vehicle',
startDate: DateTime.tryParse(json['startDate'] as String? ?? '') ??
DateTime.now(),
endDate: DateTime.tryParse(json['endDate'] as String? ?? '') ??
DateTime.now(),
status: json['status'] as String? ?? 'UNKNOWN',
totalAmount: (json['totalAmount'] as num?)?.toDouble() ?? 0,
);
}
class DashboardSourceBreakdown {
final String source;
final int count;
final double revenue;
const DashboardSourceBreakdown({
required this.source,
required this.count,
required this.revenue,
});
factory DashboardSourceBreakdown.fromJson(Map<String, dynamic> json) =>
DashboardSourceBreakdown(
source: json['source'] as String? ?? 'UNKNOWN',
count: (json['count'] as num?)?.toInt() ?? 0,
revenue: (json['revenue'] as num?)?.toDouble() ?? 0,
);
}
class DashboardSubscription {
final String status;
final String? planName;
final DateTime? trialEndsAt;
const DashboardSubscription({
required this.status,
required this.planName,
required this.trialEndsAt,
});
factory DashboardSubscription.fromJson(Map<String, dynamic> json) =>
DashboardSubscription(
status: json['status'] as String? ?? 'ACTIVE',
planName: json['planName'] as String?,
trialEndsAt: json['trialEndsAt'] == null
? null
: DateTime.tryParse(json['trialEndsAt'] as String),
);
}