class FuelEntry { final String id; final String vehicleId; final DateTime date; final double gallons; final double pricePerGallon; final double totalCost; final String? receiptImagePath; final String? receiptDriveFileId; final DateTime updatedAt; FuelEntry({ required this.id, required this.vehicleId, required this.date, required this.gallons, required this.pricePerGallon, required this.totalCost, required this.updatedAt, this.receiptImagePath, this.receiptDriveFileId, }); /// True once the receipt photo has been uploaded to Drive and the local /// copy removed. Viewing it then requires downloading it on demand. bool get isReceiptUploadedToDrive => receiptImagePath == null && receiptDriveFileId != null; /// True while a receipt photo exists only locally and still needs to be /// uploaded next sync. bool get hasPendingLocalReceipt => receiptImagePath != null; FuelEntry copyWith({ String? receiptImagePath, String? receiptDriveFileId, DateTime? updatedAt, bool clearReceiptImagePath = false, }) { return FuelEntry( id: id, vehicleId: vehicleId, date: date, gallons: gallons, pricePerGallon: pricePerGallon, totalCost: totalCost, updatedAt: updatedAt ?? this.updatedAt, receiptImagePath: clearReceiptImagePath ? null : (receiptImagePath ?? this.receiptImagePath), receiptDriveFileId: receiptDriveFileId ?? this.receiptDriveFileId, ); } Map toJson() => { 'id': id, 'vehicleId': vehicleId, 'date': date.toIso8601String(), 'gallons': gallons, 'pricePerGallon': pricePerGallon, 'totalCost': totalCost, 'receiptImagePath': receiptImagePath, 'receiptDriveFileId': receiptDriveFileId, 'updatedAt': updatedAt.toIso8601String(), }; factory FuelEntry.fromJson(Map json) => FuelEntry( id: json['id'] as String, vehicleId: json['vehicleId'] as String, date: DateTime.parse(json['date'] as String), gallons: (json['gallons'] as num).toDouble(), pricePerGallon: (json['pricePerGallon'] as num).toDouble(), totalCost: (json['totalCost'] as num).toDouble(), receiptImagePath: json['receiptImagePath'] as String?, receiptDriveFileId: json['receiptDriveFileId'] as String?, updatedAt: json['updatedAt'] != null ? DateTime.parse(json['updatedAt'] as String) : DateTime.fromMillisecondsSinceEpoch(0), ); }