78 lines
2.5 KiB
Dart
78 lines
2.5 KiB
Dart
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<String, dynamic> 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<String, dynamic> 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),
|
|
);
|
|
}
|