25-10-2/1

This commit is contained in:
Hamza-Ayed
2025-10-02 01:19:38 +03:00
parent f08ee61a7e
commit 95fb065bdb
43 changed files with 13917 additions and 13426 deletions

View File

@@ -664,14 +664,22 @@ class MapDriverController extends GetxController {
return d['message'];
}
// ... other controller code ...
/// Refactored function to finish a ride with consolidated API calls.
void finishRideFromDriver1() async {
// Show a loading indicator to the user
Get.dialog(Center(child: CircularProgressIndicator()),
barrierDismissible: false);
isRideFinished = true;
isRideStarted = false;
isPriceWindow = false;
box.write(BoxName.rideStatus, 'Finished');
Log.print('rideStatus from map 664 : ${box.read(BoxName.rideStatus)}');
Log.print(
'rideStatus from map (refactored) : ${box.read(BoxName.rideStatus)}');
// Calculate totalCost more concisely
// --- 1. Calculate Total Cost (Logic remains the same) ---
if (price < 16000) {
totalCost = (carType == 'Comfort' ||
carType == 'Mishwar Vip' ||
@@ -690,224 +698,100 @@ class MapDriverController extends GetxController {
paymentAmount = totalCost;
box.write(BoxName.statusDriverLocation, 'off');
// Prepare data for API calls
// --- 2. Prepare Payloads for Consolidated API Calls ---
final nowString = DateTime.now().toString();
final basePayload = {
'id': (rideId),
final rideUpdatePayload = {
'rideId': rideId.toString(),
'rideTimeFinish': nowString,
'status': 'Finished',
'price': totalCost,
};
final driverOrderPayload = {
'order_id': (rideId.toString()),
'status': 'Finished'
final String paymentAuthToken =
await generateTokenDriver(paymentAmount.toString());
final paymentProcessingPayload = {
'rideId': rideId.toString(),
'driverId': box.read(BoxName.driverID).toString(),
'passengerId': passengerId.toString(),
'paymentAmount': paymentAmount,
'paymentMethod': paymentMethod,
'walletChecked': walletChecked.toString(),
'passengerWalletBurc': passengerWalletBurc.toString(),
'authToken': paymentAuthToken,
};
// List to hold all asynchronous operations
List<Future<dynamic>> futures = [];
// --- 3. Execute API Calls in Parallel ---
try {
List<Future<dynamic>> apiCalls = [];
// API calls that can run in parallel
futures.add(CRUD().post(
link: "${AppLink.seferCairoServer}/ride/rides/update.php",
payload: basePayload,
));
futures.add(CRUD().post(
link: "${AppLink.seferCairoServer}/ride/driver_order/update.php",
payload: driverOrderPayload,
));
apiCalls.add(CRUD().post(
link: "${AppLink.seferCairoServer}/ride/rides//finish_ride_updates.php",
payload: rideUpdatePayload,
));
// Wallet transactions (can potentially be parallelized if independent)
if (walletChecked == 'true') {
paymentToken = await generateTokenPassenger(
((-1) * double.parse(paymentAmount)).toString());
futures
.add(CRUD().postWallet(link: AppLink.addPassengersWallet, payload: {
'passenger_id': (passengerId),
'balance': ((-1) * double.parse(paymentAmount)).toString(),
'token': paymentToken,
}));
apiCalls.add(CRUD().postWallet(
link:
"${AppLink.seferPaymentServer}/ride/payment/process_ride_payments.php",
payload: paymentProcessingPayload,
));
final results = await Future.wait(apiCalls);
// --- 4. *** CRITICAL STEP: Verify BOTH results were successful *** ---
// Assuming CRUD().post returns a Map<String, dynamic> like {'success': true, 'message': '...'}
final rideUpdateResult = results[0];
final paymentResult = results[1];
if (rideUpdateResult['status'] == 'success' &&
paymentResult['status'] == 'success') {
// --- SUCCESS: Both API calls succeeded, now proceed ---
Get.back(); // Dismiss the loading indicator
Get.put(DriverBehaviorController())
.sendSummaryToServer(driverId, rideId);
Get.find<FirebaseMessagesController>().sendNotificationToDriverMAP(
"Driver Finish Trip".tr,
'${'you will pay to Driver'.tr} $paymentAmount \$',
tokenPassenger,
[
box.read(BoxName.driverID),
rideId,
box.read(BoxName.tokenDriver),
paymentAmount.toString()
],
'ding.wav');
Get.to(() => RatePassenger(), arguments: {
'passengerId': passengerId,
'rideId': rideId,
'price': paymentAmount.toString(),
'walletChecked': walletChecked
});
} else {
// --- FAILURE: One or both API calls failed ---
// The transaction on the server side would have been rolled back.
// We throw an exception to be caught by the catch block, which will revert the UI state.
throw Exception(
'One of the server operations failed. Ride Update: ${rideUpdateResult['message']} | Payment: ${paymentResult['message']}');
}
} catch (e) {
// --- CATCH ALL ERRORS (Network, Server Failure, etc.) ---
Get.back(); // Dismiss the loading indicator
Log.print("Error finishing ride: $e");
Get.snackbar("Error", "Could not finish the ride. Please try again.");
// Revert state because the operation failed
isRideFinished = false;
isRideStarted = true;
isPriceWindow = true;
box.write(BoxName.rideStatus, 'InProgress'); // Revert status
}
paymentToken = await generateTokenDriver(paymentAmount.toString());
futures.add(CRUD().postWallet(link: AppLink.addDrivePayment, payload: {
'rideId': (rideId),
'amount': paymentAmount,
'payment_method':
walletChecked == 'true' ? "${paymentMethod}Ride" : paymentMethod,
'passengerID': (passengerId),
'token': paymentToken,
'driverID': box.read(BoxName.driverID).toString(),
}));
if (double.parse(passengerWalletBurc) < 0) {
final paymentToken1 = await generateTokenPassenger(
((-1) * double.parse(passengerWalletBurc)).toString());
futures
.add(CRUD().postWallet(link: AppLink.addPassengersWallet, payload: {
'passenger_id': (passengerId),
'token': paymentToken1,
'balance': ((-1) * double.parse(passengerWalletBurc)).toString()
}));
}
double pointsSubtraction = double.parse(paymentAmount) * (-1) * 0.1;
final paymentToken2 =
await generateTokenDriver((pointsSubtraction).toStringAsFixed(0));
futures
.add(CRUD().postWallet(link: AppLink.addDriversWalletPoints, payload: {
'paymentID': 'rideId${(rideId)}',
'amount': (pointsSubtraction).toStringAsFixed(0),
'paymentMethod': paymentMethod,
'token': paymentToken2,
'driverID': box.read(BoxName.driverID).toString(),
}));
// Wait for all independent API calls to complete
await Future.wait(futures);
Get.put(DriverBehaviorController()).sendSummaryToServer(driverId, rideId);
// Send notification (this likely depends on previous steps)
Get.find<FirebaseMessagesController>().sendNotificationToDriverMAP(
"Driver Finish Trip".tr,
'${'you will pay to Driver'.tr} $paymentAmount \$',
tokenPassenger,
[
box.read(BoxName.driverID),
rideId,
box.read(BoxName.tokenDriver),
paymentAmount.toString()
],
'ding.wav');
// Navigate to the next screen (likely depends on previous steps being done)
Get.to(() => RatePassenger(), arguments: {
'passengerId': passengerId,
'rideId': rideId,
'price': paymentAmount.toString(),
'walletChecked': walletChecked
});
}
// void finishRideFromDriver1() async {
// // if (carType != 'Comfort' || carType != 'Free Ride') {
// isRideFinished = true;
// isRideStarted = false;
// isPriceWindow = false;
// box.write(BoxName.rideStatus, 'Finished');
// // Get.find<HomeCaptainController>().changeToAppliedRide('Finished');
// // Get.find<HomeCaptainController>().update();
// totalCost = price < 20
// ? carType != 'Comfort' && carType != 'Mishwar Vip' && carType != 'Lady'
// ? '20'
// : '30'
// : price < double.parse(totalPricePassenger)
// ? totalPricePassenger
// : carType != 'Comfort' &&
// carType != 'Mishwar Vip' &&
// carType != 'Lady'
// ? totalPricePassenger
// : price.toStringAsFixed(2);
// paymentAmount = totalCost;
// box.write(BoxName.statusDriverLocation, 'off');
// // changeRideToBeginToPassenger();
// await CRUD().post(
// link: "${AppLink.seferCairoServer}/ride/rides/update.php",
// payload: {
// 'id': rideId,
// 'rideTimeFinish': DateTime.now().toString(),
// 'status': 'Finished',
// 'price': totalCost,
// });
// CRUD().post(
// link: "${AppLink.seferCairoServer}/ride/driver_order/update.php",
// payload: {
// // 'driver_id': box.read(BoxName.driverID).toString(),
// 'order_id': rideId.toString(),
// 'status': 'Finished'
// });
// if (AppLink.endPoint != AppLink.seferCairoServer) {
// CRUD().post(
// link: "${AppLink.endPoint}/ride/rides/update.php",
// payload: {
// 'id': rideId,
// 'rideTimeFinish': DateTime.now().toString(),
// 'status': 'Finished',
// 'price': totalCost,
// },
// );
// CRUD().post(
// link: "${AppLink.endPoint}/ride/driver_order/update.php",
// payload: {
// // 'driver_id': box.read(BoxName.driverID).toString(),
// 'order_id': rideId.toString(),
// 'status': 'Finished'
// });
// }
// if (walletChecked == 'true') {
// paymentToken = await generateTokenPassenger(
// ((-1) * double.parse(paymentAmount)).toString());
// await CRUD().post(link: AppLink.addPassengersWallet, payload: {
// 'passenger_id': passengerId,
// 'balance': ((-1) * double.parse(paymentAmount)).toString(),
// 'token': paymentToken,
// });
// }
// paymentToken = await generateTokenDriver(paymentAmount.toString());
// await CRUD().post(link: AppLink.addDrivePayment, payload: {
// 'rideId': rideId,
// 'amount': paymentAmount,
// 'payment_method':
// walletChecked == 'true' ? "${paymentMethod}Ride" : paymentMethod,
// 'passengerID': passengerId,
// 'token': paymentToken,
// 'driverID': box.read(BoxName.driverID).toString(),
// });
// if (double.parse(passengerWalletBurc) < 0) {
// // for zero passenger
// var paymentToken1 = await generateTokenPassenger(
// ((-1) * double.parse(passengerWalletBurc)).toString());
// await CRUD().post(link: AppLink.addPassengersWallet, payload: {
// 'passenger_id': passengerId,
// 'token': paymentToken1,
// 'balance': ((-1) * double.parse(passengerWalletBurc)).toString()
// });
// }
// double pointsSubtraction = 0;
// pointsSubtraction =
// double.parse(paymentAmount) * (-1) * .08; //for 300 from 3000
// var paymentToken2 =
// await generateTokenDriver((pointsSubtraction).toStringAsFixed(0));
// var res = await CRUD().post(link: AppLink.addDriversWalletPoints, payload: {
// 'paymentID': 'rideId$rideId',
// 'amount': (pointsSubtraction).toStringAsFixed(0),
// 'paymentMethod': paymentMethod,
// 'token': paymentToken2,
// 'driverID': box.read(BoxName.driverID).toString(),
// });
// Future.delayed(const Duration(milliseconds: 300));
// Get.find<FirebaseMessagesController>().sendNotificationToDriverMAP(
// "Driver Finish Trip".tr,
// '${'you will pay to Driver'.tr} $paymentAmount \$',
// tokenPassenger,
// [
// box.read(BoxName.driverID),
// rideId,
// box.read(BoxName.tokenDriver),
// // carType == 'Comfort' || carType == 'Mishwar Vip'
// // ? price.toStringAsFixed(2)
// // : totalPassenger
// paymentAmount.toString()
// ],
// 'ding.wav');
// Get.to(() => RatePassenger(), arguments: {
// 'passengerId': passengerId,
// 'rideId': rideId,
// 'price': paymentAmount.toString(), //price
// 'walletChecked': walletChecked
// });
// // Get.back();
// }
void cancelCheckRideFromPassenger() async {
var res = await CRUD().get(
@@ -1426,7 +1310,9 @@ class MapDriverController extends GetxController {
if (activeRouteSteps.isNotEmpty) {
currentInstruction =
_parseInstruction(activeRouteSteps[0]['html_instructions']);
Get.find<TextToSpeechController>().speakText(currentInstruction);
Get.isRegistered<TextToSpeechController>()
? Get.find<TextToSpeechController>().speakText(currentInstruction)
: Get.put(TextToSpeechController()).speakText(currentInstruction);
}
// تحديث الكاميرا لتناسب المسار الجديد
@@ -1491,7 +1377,9 @@ class MapDriverController extends GetxController {
currentStepIndex++;
currentInstruction = _parseInstruction(
activeRouteSteps[currentStepIndex]['html_instructions']);
Get.find<TextToSpeechController>().speakText(currentInstruction);
Get.isRegistered<TextToSpeechController>()
? Get.find<TextToSpeechController>().speakText(currentInstruction)
: Get.put(TextToSpeechController()).speakText(currentInstruction);
// -->> هنا يتم تحديث لون المسار <<--
_updateTraveledPath();