Files
tripz-llc/apps/driver/lib/models/model/order_data.dart
T
HamzaandClaude Opus 4.8 6234e66471 feat: Gemini AI (doc OCR + face match) + role-assignment endpoints
- GeminiService (integrations/gemini, @Global): extractDocument (OCR fields) + faceMatch; graceful if no GEMINI_API_KEY
- documents: face-match now real via Gemini; POST /admin/documents/:id/ocr extracts fields for CS auto-fill
- roles: PATCH /admin/users/:id/role (admin) + POST /platform/users/role (bootstrap via x-platform-secret)
- config: gemini + platform.secret; .env.example entries

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 20:01:26 +03:00

186 lines
6.5 KiB
Dart
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// lib/models/model/order_data.dart
class OrderData {
final String customerName;
final String customerToken;
final double tripDistanceKm; // The total trip distance in kilometers
final String price;
final String startLocationAddress;
final String endLocationAddress;
final double
distanceToPassengerKm; // The distance to the passenger in kilometers
final int tripDurationMinutes; // Total trip duration in minutes (rounded up)
final int
durationToPassengerMinutes; // Duration to reach the passenger in minutes (rounded up)
final String rideType;
final String orderId;
final String passengerId;
final String passengerRate;
final String? rawStartCoordinates;
final String? rawEndCoordinates;
OrderData({
required this.customerName,
required this.customerToken,
required this.tripDistanceKm,
required this.price,
required this.startLocationAddress,
required this.endLocationAddress,
required this.distanceToPassengerKm,
required this.tripDurationMinutes,
required this.durationToPassengerMinutes,
required this.rideType,
required this.orderId,
required this.passengerId,
required this.passengerRate,
this.rawStartCoordinates,
this.rawEndCoordinates,
});
// --- NEW: Factory constructor to create an instance from a Map ---
// This is the missing method that was causing the error.
factory OrderData.fromMap(Map<String, dynamic> map) {
return OrderData(
// For strings, provide a default value in case the map key is null
customerName: map['customerName']?.toString() ?? 'Unknown Customer',
customerToken: map['customerToken']?.toString() ?? 'Unknown token',
// For numbers, cast from 'num' to handle both int and double, with a default value
tripDistanceKm: (map['tripDistanceKm'] as num?)?.toDouble() ?? 0.0,
price: map['price']?.toString() ?? '0',
startLocationAddress:
map['startLocationAddress']?.toString() ?? 'Unknown Address',
endLocationAddress:
map['endLocationAddress']?.toString() ?? 'Unknown Address',
distanceToPassengerKm:
(map['distanceToPassengerKm'] as num?)?.toDouble() ?? 0.0,
tripDurationMinutes: (map['tripDurationMinutes'] as num?)?.toInt() ?? 0,
durationToPassengerMinutes:
(map['durationToPassengerMinutes'] as num?)?.toInt() ?? 0,
rideType: map['rideType']?.toString() ?? 'Unknown',
orderId: map['orderId']?.toString() ?? 'N/A',
passengerId: map['passengerId']?.toString() ?? 'N/A',
passengerRate: map['passengerRate']?.toString() ?? 'N/A',
// For nullable strings, direct access is fine as it returns null if the key doesn't exist
rawStartCoordinates: map['rawStartCoordinates'],
rawEndCoordinates: map['rawEndCoordinates'],
);
}
// A helper function to convert seconds to rounded-up minutes
static int _secondsToRoundedUpMinutes(String secondsString) {
final seconds = double.tryParse(secondsString) ?? 0.0;
if (seconds <= 0) return 0;
return (seconds / 60)
.ceil(); // .ceil() rounds up (e.g., 0.1 minutes becomes 1 minute)
}
// Your existing factory for creating an instance from a List
factory OrderData.fromList(List<dynamic> list) {
double distanceToPassengerMeters =
list.length > 12 ? (double.tryParse(list[12].toString()) ?? 0.0) : 0.0;
return OrderData(
customerName: list.length > 8 ? list[8].toString() : 'Unknown Customer',
customerToken: list.length > 9 ? list[9].toString() : 'Unknown token',
tripDistanceKm:
list.length > 5 ? (double.tryParse(list[5].toString()) ?? 0.0) : 0.0,
price: list.length > 2 ? list[2].toString().split('.')[0] : '0',
startLocationAddress:
list.length > 29 ? list[29].toString() : 'Unknown Address',
endLocationAddress:
list.length > 30 ? list[30].toString() : 'Unknown Address',
distanceToPassengerKm:
distanceToPassengerMeters / 1000.0, // Convert meters to kilometers
tripDurationMinutes:
list.length > 4 ? _secondsToRoundedUpMinutes(list[4].toString()) : 0,
durationToPassengerMinutes: list.length > 15
? _secondsToRoundedUpMinutes(list[15].toString())
: 0,
rideType:
list.length > 31 ? _getRideType(list[31].toString()) : 'Unknown',
orderId: list.length > 16 ? list[16].toString() : 'N/A',
passengerId: list.length > 7 ? list[7].toString() : 'N/A',
passengerRate: list.length > 33 ? list[33].toString() : 'N/A',
rawStartCoordinates: list.isNotEmpty ? list[0].toString() : null,
rawEndCoordinates: list.length > 1 ? list[1].toString() : null,
);
}
static String _getRideType(String type) {
switch (type) {
case 'Comfort':
return '‏كمفورت ❄️';
case 'Lady':
return '‏ليدي 👩';
case 'Speed':
return '‏‏‏سبيد 🔻';
case 'Mashwari':
return '‏مشواري';
case 'Rayeh Gai':
return 'رايح جاي';
default:
return type;
}
}
// Getter to parse start coordinates
Map<String, double?>? get startCoordinates {
if (rawStartCoordinates == null) return null;
final parts = rawStartCoordinates!.split(',');
if (parts.length == 2) {
return {
'lat': double.tryParse(parts[0].trim()),
'lng': double.tryParse(parts[1].trim())
};
}
return null;
}
// Getter to parse end coordinates
Map<String, double?>? get endCoordinates {
if (rawEndCoordinates == null) return null;
final parts = rawEndCoordinates!.split(',');
if (parts.length == 2) {
return {
'lat': double.tryParse(parts[0].trim()),
'lng': double.tryParse(parts[1].trim())
};
}
return null;
}
// Your existing method to convert the object TO a Map.
// This is used to pass the data from the overlay to the main app.
Map<String, dynamic> toMap() {
return {
'customerName': customerName,
'tripDistanceKm': tripDistanceKm,
'price': price,
'startLocationAddress': startLocationAddress,
'endLocationAddress': endLocationAddress,
'distanceToPassengerKm': distanceToPassengerKm,
'tripDurationMinutes': tripDurationMinutes,
'durationToPassengerMinutes': durationToPassengerMinutes,
'rideType': rideType,
'orderId': orderId,
'passengerId': passengerId,
'passengerRate': passengerRate,
'rawStartCoordinates': rawStartCoordinates,
'rawEndCoordinates': rawEndCoordinates,
};
}
}