Files
Fondex-Driver/lib/controllers/rental_order_details_controller.dart
2025-12-08 23:25:00 +05:00

132 lines
4.8 KiB
Dart

import 'package:driver/constant/show_toast_dialog.dart';
import 'package:driver/models/rental_order_model.dart';
import 'package:driver/utils/fire_store_utils.dart';
import 'package:get/get.dart';
import '../constant/constant.dart';
import '../models/user_model.dart';
class RentalOrderDetailsController extends GetxController {
Rx<RentalOrderModel> order = RentalOrderModel().obs;
RxBool isLoading = true.obs;
RxDouble subTotal = 0.0.obs;
RxDouble discount = 0.0.obs;
RxDouble taxAmount = 0.0.obs;
RxDouble totalAmount = 0.0.obs;
RxDouble adminCommission = 0.0.obs;
RxDouble extraKilometerCharge = 0.0.obs;
RxDouble extraMinutesCharge = 0.0.obs;
Rx<UserModel?> userData = Rx<UserModel?>(null);
@override
void onInit() {
super.onInit();
final args = Get.arguments;
if (args != null && args["rentalOrder"] != null) {
String orderId = args["rentalOrder"];
fetchOrder(orderId);
} else {
isLoading.value = false;
ShowToastDialog.showToast("Invalid order details");
}
}
String getExtraKm() {
try {
final double start = double.tryParse(order.value.startKitoMetersReading ?? '0') ?? 0.0;
final double end = double.tryParse(order.value.endKitoMetersReading ?? '0') ?? 0.0;
final double included = double.tryParse(order.value.rentalPackageModel?.includedDistance?.toString() ?? '0') ?? 0.0;
// Calculate extra km safely
final double extra = (end - start - included);
final double validExtra = extra > 0 ? extra : 0;
return "${validExtra.toStringAsFixed(2)} ${Constant.distanceType}";
} catch (e) {
return "0 ${Constant.distanceType}";
}
}
///Safe calculation after order is loaded
void calculateTotalAmount() {
try {
subTotal.value = double.tryParse(order.value.subTotal?.toString() ?? "0") ?? 0.0;
discount.value = double.tryParse(order.value.discount?.toString() ?? "0") ?? 0.0;
taxAmount.value = 0.0;
if (order.value.endTime != null) {
DateTime start = order.value.startTime!.toDate();
DateTime end = order.value.endTime!.toDate();
// Total rented minutes
int totalMinutes = end.difference(start).inMinutes;
int includedMinutes = (int.tryParse(order.value.rentalPackageModel?.includedHours.toString() ?? "0") ?? 0) * 60;
if (totalMinutes > includedMinutes) {
int extraMinutes = totalMinutes - includedMinutes;
double minuteFare = double.tryParse(order.value.rentalPackageModel?.extraMinuteFare?.toString() ?? "0") ?? 0.0;
extraMinutesCharge.value = extraMinutes * minuteFare;
} else {
extraMinutesCharge.value = 0;
}
}
if (order.value.startKitoMetersReading != null && order.value.endKitoMetersReading != null) {
double startKm = double.tryParse(order.value.startKitoMetersReading?.toString() ?? "0") ?? 0.0;
double endKm = double.tryParse(order.value.endKitoMetersReading?.toString() ?? "0") ?? 0.0;
if (endKm > startKm) {
double totalKm = endKm - startKm;
if (totalKm > double.parse(order.value.rentalPackageModel!.includedDistance!)) {
totalKm = totalKm - double.parse(order.value.rentalPackageModel!.includedDistance!);
double extraKmRate = double.tryParse(order.value.rentalPackageModel?.extraKmFare?.toString() ?? "0") ?? 0.0;
extraKilometerCharge.value = totalKm * extraKmRate;
}
}
}
subTotal.value = subTotal.value + extraKilometerCharge.value + extraMinutesCharge.value;
if (order.value.taxSetting != null) {
for (var element in order.value.taxSetting!) {
taxAmount.value += Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element);
}
}
if (order.value.adminCommission!.isNotEmpty) {
adminCommission.value = Constant.calculateAdminCommission(
amount: (subTotal.value - discount.value).toString(),
adminCommissionType: order.value.adminCommissionType.toString(),
adminCommission: order.value.adminCommission ?? '0');
}
totalAmount.value = (subTotal.value - discount.value) + taxAmount.value;
} catch (e) {
ShowToastDialog.showToast("Failed to calculate total: $e");
}
}
Future<void> fetchOrder(String orderId) async {
try {
isLoading.value = true;
order.value = (await FireStoreUtils.getRentalOrderById(orderId))!;
calculateTotalAmount();
fetchCustomerDetails();
} catch (e) {
ShowToastDialog.showToast("Failed to fetch order details: $e");
} finally {
isLoading.value = false;
}
}
Future<void> fetchCustomerDetails() async {
if (order.value.authorID != null) {
final user = await FireStoreUtils.getUserProfile(order.value.authorID!);
if (user != null) {
userData.value = user;
}
}
}
}