kelola penyewa dan beberapa error fix
This commit is contained in:
@ -185,7 +185,7 @@ class OrderSewaAsetController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
errorMessage.value,
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
);
|
||||
});
|
||||
}
|
||||
@ -211,7 +211,7 @@ class OrderSewaAsetController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Info',
|
||||
'Tidak dapat menampilkan data - data tidak tersedia',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.amber,
|
||||
colorText: Colors.black,
|
||||
duration: const Duration(seconds: 3),
|
||||
@ -231,6 +231,9 @@ class OrderSewaAsetController extends GetxController {
|
||||
debugPrint('💾 Saved asetId to GetStorage: ${asetId.value}');
|
||||
}
|
||||
|
||||
// Bersihkan data controller
|
||||
clearData();
|
||||
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
@ -445,6 +448,9 @@ class OrderSewaAsetController extends GetxController {
|
||||
void onBackPressed() {
|
||||
debugPrint('🔙 Back button pressed in OrderSewaAsetView');
|
||||
|
||||
// Bersihkan data controller sebelum kembali
|
||||
clearData();
|
||||
|
||||
try {
|
||||
// Try to use the navigation service
|
||||
navigationService.backFromOrderSewaAset();
|
||||
@ -2287,7 +2293,7 @@ class OrderSewaAsetController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
message,
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -2299,7 +2305,7 @@ class OrderSewaAsetController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Sukses',
|
||||
message,
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.green,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -2767,7 +2773,7 @@ class OrderSewaAsetController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal membuat pesanan',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -2777,7 +2783,7 @@ class OrderSewaAsetController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Terjadi kesalahan: $e',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -3537,4 +3543,43 @@ class OrderSewaAsetController extends GetxController {
|
||||
isLoadingBookings(false);
|
||||
}
|
||||
}
|
||||
|
||||
// Clear controller data
|
||||
void clearData() {
|
||||
aset.value = null;
|
||||
isLoading.value = true;
|
||||
hasError.value = false;
|
||||
errorMessage.value = '';
|
||||
asetId.value = '';
|
||||
isAset.value = true;
|
||||
isPaket.value = false;
|
||||
assetPhotos.clear();
|
||||
currentPhotoIndex.value = 0;
|
||||
isPhotosLoading.value = false;
|
||||
selectedSatuanWaktu.value = null;
|
||||
duration.value = 1;
|
||||
totalPrice.value = 0;
|
||||
jumlahUnit.value = 1;
|
||||
maxUnit.value = 1;
|
||||
selectedDate.value = '';
|
||||
startHour.value = -1;
|
||||
endHour.value = -1;
|
||||
formattedTimeRange.value = '';
|
||||
startDate.value = null;
|
||||
endDate.value = null;
|
||||
formattedDateRange.value = '';
|
||||
bookedDates.clear();
|
||||
isLoadingBookedDates.value = false;
|
||||
maxDayLimit.value = 0;
|
||||
availableHours.clear();
|
||||
bookedHours.clear();
|
||||
selectedHours.clear();
|
||||
bookedHoursList.clear();
|
||||
isLoadingBookings.value = false;
|
||||
hourlyInventory.clear();
|
||||
unavailableDatesForHourly.clear();
|
||||
paketItems.clear();
|
||||
isPaketItemsLoaded.value = false;
|
||||
paketId.value = '';
|
||||
}
|
||||
}
|
||||
|
@ -141,7 +141,7 @@ class OrderSewaPaketController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal memuat data paket',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -152,7 +152,7 @@ class OrderSewaPaketController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Terjadi kesalahan saat memuat data paket',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -166,10 +166,10 @@ class OrderSewaPaketController extends GetxController {
|
||||
try {
|
||||
debugPrint('🔄 Processing paket data for ID: $id');
|
||||
debugPrint('📦 Raw paket data type: ${rawPaket.runtimeType}');
|
||||
|
||||
|
||||
// Initialize loadedPaket with a default value
|
||||
late final PaketModel loadedPaket;
|
||||
|
||||
|
||||
try {
|
||||
// Handle Map directly - pakets from getPakets() are always maps
|
||||
loadedPaket = PaketModel.fromMap(rawPaket);
|
||||
@ -183,10 +183,16 @@ class OrderSewaPaketController extends GetxController {
|
||||
deskripsi: getPaketDeskripsi(rawPaket),
|
||||
harga: getPaketHarga(rawPaket),
|
||||
kuantitas: getPaketKuantitas(rawPaket),
|
||||
foto: const <String>[], // Initialize with empty list, will be populated later
|
||||
foto:
|
||||
const <
|
||||
String
|
||||
>[], // Initialize with empty list, will be populated later
|
||||
satuanWaktuSewa: getPaketSatuanWaktuSewa(rawPaket),
|
||||
foto_paket: getPaketMainPhoto(rawPaket),
|
||||
images: const <String>[], // Initialize with empty list, will be populated later
|
||||
images:
|
||||
const <
|
||||
String
|
||||
>[], // Initialize with empty list, will be populated later
|
||||
createdAt: DateTime.now(),
|
||||
updatedAt: DateTime.now(),
|
||||
);
|
||||
@ -352,7 +358,7 @@ class OrderSewaPaketController extends GetxController {
|
||||
if (items.isNotEmpty) {
|
||||
paketItems.value = items;
|
||||
debugPrint('✅ Loaded ${paketItems.length} package items');
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('❌ Error loading paket items: $e');
|
||||
paketItems.value = [];
|
||||
@ -1030,7 +1036,7 @@ class OrderSewaPaketController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Waktu Tidak Tersedia',
|
||||
'Jam ini tidak tersedia karena ada aset dalam paket yang sudah dipesan',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.orange,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -1114,7 +1120,7 @@ class OrderSewaPaketController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Data paket tidak lengkap',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -1131,7 +1137,7 @@ class OrderSewaPaketController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Silakan pilih waktu sewa',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -1163,7 +1169,7 @@ class OrderSewaPaketController extends GetxController {
|
||||
durasi: orderData['durasi'] ?? 1, // Default to 1 if not provided
|
||||
totalHarga: orderData['total_harga'].toInt(),
|
||||
);
|
||||
|
||||
|
||||
// Create a mock result for navigation
|
||||
final resultData = {
|
||||
'id': 'order_${DateTime.now().millisecondsSinceEpoch}',
|
||||
@ -1174,21 +1180,23 @@ class OrderSewaPaketController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Sukses',
|
||||
'Pesanan berhasil dibuat',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.green,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
|
||||
// Navigate to payment page
|
||||
if (result && resultData != null && resultData['id'] != null) {
|
||||
navigationService.navigateToPembayaranSewa(resultData['id'].toString());
|
||||
navigationService.navigateToPembayaranSewa(
|
||||
resultData['id'].toString(),
|
||||
);
|
||||
} else if (result) {
|
||||
// If result is true but we don't have an ID, navigate back to sewa aset
|
||||
navigationService.navigateToSewaAset();
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal mendapatkan ID pesanan',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -1196,7 +1204,7 @@ class OrderSewaPaketController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal membuat pesanan',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -1205,7 +1213,7 @@ class OrderSewaPaketController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal membuat pesanan',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -1215,7 +1223,7 @@ class OrderSewaPaketController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Terjadi kesalahan: $e',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -1392,7 +1400,7 @@ class OrderSewaPaketController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Peringatan',
|
||||
'Pilih tanggal terlebih dahulu',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.orange,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
|
@ -378,7 +378,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Pesanan Dibatalkan',
|
||||
'Batas waktu pembayaran telah berakhir',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
duration: Duration(seconds: 5),
|
||||
@ -417,7 +417,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal mengambil foto: ${e.toString()}',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -443,7 +443,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal memilih foto dari galeri: ${e.toString()}',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -459,7 +459,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Mohon unggah bukti pembayaran terlebih dahulu',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -541,7 +541,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Sukses',
|
||||
'Bukti pembayaran berhasil diunggah',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.green,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -550,7 +550,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal mengunggah bukti pembayaran: ${e.toString()}',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -654,7 +654,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Sukses',
|
||||
'Pembayaran tunai berhasil disubmit',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.green,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -1090,7 +1090,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Berhasil',
|
||||
'Data berhasil diperbarui',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.green,
|
||||
colorText: Colors.white,
|
||||
duration: const Duration(seconds: 2),
|
||||
@ -1104,7 +1104,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal memperbarui data',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
|
@ -305,6 +305,9 @@ class PembayaranSewaController extends GetxController
|
||||
: 0,
|
||||
'status': rentalData['status'] ?? 'MENUNGGU PEMBAYARAN',
|
||||
'created_at': DateTime.now().toString(),
|
||||
'updated_at':
|
||||
DateTime.now()
|
||||
.toString(), // Explicitly set updated_at for countdown
|
||||
'denda': 0, // Default value
|
||||
'keterangan': '', // Default value
|
||||
'image_url': rentalData['imageUrl'],
|
||||
@ -359,13 +362,19 @@ class PembayaranSewaController extends GetxController
|
||||
'price_per_unit': 10000,
|
||||
'total_price': 50000,
|
||||
'status': 'MENUNGGU PEMBAYARAN',
|
||||
'created_at':
|
||||
DateTime.now().toString(), // Use this for countdown calculation
|
||||
'created_at': DateTime.now().toString(),
|
||||
'updated_at':
|
||||
DateTime.now()
|
||||
.toString(), // Explicitly set updated_at for countdown
|
||||
'denda': 20000, // Dummy data for denda
|
||||
'keterangan':
|
||||
'Terjadi kerusakan pada bagian kaki', // Dummy keterangan for denda
|
||||
};
|
||||
|
||||
debugPrint(
|
||||
'DEBUG: Set updated_at in orderDetails: ${orderDetails.value['updated_at']}',
|
||||
);
|
||||
|
||||
// Update the current step based on the status
|
||||
updateCurrentStepBasedOnStatus();
|
||||
|
||||
@ -433,14 +442,27 @@ class PembayaranSewaController extends GetxController
|
||||
if (data['status'] != null &&
|
||||
data['status'].toString().isNotEmpty) {
|
||||
val?['status'] = data['status'];
|
||||
debugPrint(
|
||||
'📊 Order status from sewa_aset: \\${data['status']}',
|
||||
);
|
||||
debugPrint('📊 Order status from sewa_aset: ${data['status']}');
|
||||
}
|
||||
// Tambahkan mapping updated_at
|
||||
|
||||
// Ensure updated_at is always set
|
||||
if (data['updated_at'] != null) {
|
||||
val?['updated_at'] = data['updated_at'];
|
||||
debugPrint(
|
||||
'📅 Using updated_at from database: ${data['updated_at']}',
|
||||
);
|
||||
} else if (data['created_at'] != null) {
|
||||
val?['updated_at'] = data['created_at'];
|
||||
debugPrint(
|
||||
'📅 Using created_at as fallback for updated_at: ${data['created_at']}',
|
||||
);
|
||||
} else {
|
||||
val?['updated_at'] = DateTime.now().toIso8601String();
|
||||
debugPrint(
|
||||
'📅 Using current timestamp as fallback for updated_at',
|
||||
);
|
||||
}
|
||||
|
||||
// Format rental period
|
||||
if (data['waktu_mulai'] != null &&
|
||||
data['waktu_selesai'] != null) {
|
||||
@ -448,12 +470,12 @@ class PembayaranSewaController extends GetxController
|
||||
final startTime = DateTime.parse(data['waktu_mulai']);
|
||||
final endTime = DateTime.parse(data['waktu_selesai']);
|
||||
val?['rental_period'] =
|
||||
'\\${startTime.day}/\\${startTime.month}/\\${startTime.year}, \\${startTime.hour}:\\${startTime.minute.toString().padLeft(2, '0')} - \\${endTime.hour}:\\${endTime.minute.toString().padLeft(2, '0')}';
|
||||
'${startTime.day}/${startTime.month}/${startTime.year}, ${startTime.hour}:${startTime.minute.toString().padLeft(2, '0')} - ${endTime.hour}:${endTime.minute.toString().padLeft(2, '0')}';
|
||||
debugPrint(
|
||||
'✅ Successfully formatted rental period: \\${val?['rental_period']}',
|
||||
'✅ Successfully formatted rental period: ${val?['rental_period']}',
|
||||
);
|
||||
} catch (e) {
|
||||
debugPrint('❌ Error parsing date: \\${e}');
|
||||
debugPrint('❌ Error parsing date: ${e}');
|
||||
}
|
||||
} else {
|
||||
debugPrint(
|
||||
@ -577,7 +599,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Pesanan Dibatalkan',
|
||||
'Batas waktu pembayaran telah berakhir',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
duration: Duration(seconds: 5),
|
||||
@ -624,7 +646,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal mengambil foto: \\${e.toString()}',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -653,7 +675,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal memilih foto dari galeri: \\${e.toString()}',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -679,7 +701,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Mohon unggah bukti pembayaran terlebih dahulu',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -691,7 +713,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Info',
|
||||
'Tidak ada perubahan yang perlu disimpan',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.blue,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -843,7 +865,7 @@ class PembayaranSewaController extends GetxController
|
||||
val?['status'] == 'PEMBAYARAN DENDA') {
|
||||
val?['status'] = 'PERIKSA PEMBAYARAN DENDA';
|
||||
} else {
|
||||
val?['status'] = 'MEMERIKSA PEMBAYARAN';
|
||||
val?['status'] = 'PERIKSA PEMBAYARAN';
|
||||
}
|
||||
});
|
||||
|
||||
@ -894,7 +916,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Sukses',
|
||||
'Bukti pembayaran berhasil diunggah',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.green,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -903,7 +925,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal mengunggah bukti pembayaran: ${e.toString()}',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -930,19 +952,19 @@ class PembayaranSewaController extends GetxController
|
||||
newStatus = 'MENUNGGU PEMBAYARAN';
|
||||
break;
|
||||
case 1:
|
||||
newStatus = 'MEMERIKSA PEMBAYARAN';
|
||||
newStatus = 'PERIKSA PEMBAYARAN';
|
||||
break;
|
||||
case 2:
|
||||
newStatus = 'DITERIMA';
|
||||
break;
|
||||
case 3:
|
||||
newStatus = 'PENGEMBALIAN';
|
||||
newStatus = 'DIKEMBALIKAN';
|
||||
break;
|
||||
case 4:
|
||||
newStatus = 'PEMBAYARAN DENDA';
|
||||
break;
|
||||
case 5:
|
||||
newStatus = 'MEMERIKSA PEMBAYARAN DENDA';
|
||||
newStatus = 'PERIKSA PEMBAYARAN DENDA';
|
||||
break;
|
||||
case 6:
|
||||
newStatus = 'SELESAI';
|
||||
@ -965,7 +987,7 @@ class PembayaranSewaController extends GetxController
|
||||
case 'MENUNGGU PEMBAYARAN':
|
||||
currentStep.value = 0;
|
||||
break;
|
||||
case 'MEMERIKSA PEMBAYARAN':
|
||||
case 'PERIKSA PEMBAYARAN':
|
||||
currentStep.value = 1;
|
||||
break;
|
||||
case 'DITERIMA':
|
||||
@ -974,7 +996,7 @@ class PembayaranSewaController extends GetxController
|
||||
case 'AKTIF':
|
||||
currentStep.value = 3;
|
||||
break;
|
||||
case 'PENGEMBALIAN':
|
||||
case 'DIKEMBALIKAN':
|
||||
currentStep.value = 4;
|
||||
break;
|
||||
case 'PEMBAYARAN DENDA':
|
||||
@ -1003,7 +1025,7 @@ class PembayaranSewaController extends GetxController
|
||||
void submitCashPayment() {
|
||||
// Update order status
|
||||
orderDetails.update((val) {
|
||||
val?['status'] = 'MEMERIKSA PEMBAYARAN';
|
||||
val?['status'] = 'PERIKSA PEMBAYARAN';
|
||||
});
|
||||
|
||||
// Cancel countdown timer as payment has been submitted
|
||||
@ -1013,7 +1035,7 @@ class PembayaranSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Sukses',
|
||||
'Pembayaran tunai berhasil disubmit',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.green,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -1266,7 +1288,20 @@ class PembayaranSewaController extends GetxController
|
||||
updateCurrentStepBasedOnStatus();
|
||||
|
||||
// Restart countdown timer if needed
|
||||
if (orderDetails.value['status'] == 'MENUNGGU PEMBAYARAN') {
|
||||
if ((orderDetails.value['status'] ?? '').toString().toUpperCase() ==
|
||||
'MENUNGGU PEMBAYARAN') {
|
||||
debugPrint('Status is MENUNGGU PEMBAYARAN, restarting countdown timer');
|
||||
|
||||
// Ensure updated_at is set to current time if refreshing with MENUNGGU PEMBAYARAN status
|
||||
if (orderDetails.value['updated_at'] == null) {
|
||||
orderDetails.update((val) {
|
||||
val?['updated_at'] = DateTime.now().toIso8601String();
|
||||
});
|
||||
debugPrint(
|
||||
'Set updated_at to current time: ${orderDetails.value['updated_at']}',
|
||||
);
|
||||
}
|
||||
|
||||
_countdownTimer?.cancel();
|
||||
startCountdownTimer();
|
||||
}
|
||||
|
@ -168,7 +168,7 @@ class SewaAsetController extends GetxController
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Terjadi kesalahan saat memuat data aset',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -279,7 +279,7 @@ class SewaAsetController extends GetxController
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
message,
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -321,7 +321,7 @@ class SewaAsetController extends GetxController
|
||||
Get.snackbar(
|
||||
'Sukses',
|
||||
'Pesanan berhasil dibuat',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.green,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -383,7 +383,7 @@ class SewaAsetController extends GetxController
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Terjadi kesalahan saat memuat data paket',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -429,7 +429,7 @@ class SewaAsetController extends GetxController
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal memuat data paket. Silakan coba lagi nanti.',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -470,7 +470,7 @@ class SewaAsetController extends GetxController
|
||||
Get.snackbar(
|
||||
'Sukses',
|
||||
'Pesanan paket berhasil dibuat',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.green,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
|
@ -46,30 +46,51 @@ class WargaDashboardController extends GetxController {
|
||||
final dendaAktifCount = 0.obs;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
void onInit() async {
|
||||
super.onInit();
|
||||
|
||||
// Set navigation index to Home (0)
|
||||
navigationService.setNavIndex(0);
|
||||
|
||||
// Load user data
|
||||
fetchProfileFromWargaDesa();
|
||||
_loadUserData();
|
||||
// Check if navigation is coming from login
|
||||
final args = Get.arguments;
|
||||
final bool isFromLogin = args != null && args['from_login'] == true;
|
||||
|
||||
// Load sample data
|
||||
_loadSampleData();
|
||||
if (isFromLogin) {
|
||||
print('onInit: Navigation from login detected, prioritizing data fetch');
|
||||
}
|
||||
|
||||
// Load dummy data for bills and penalties
|
||||
loadDummyData();
|
||||
// Verifikasi bahwa pengguna sudah login sebelum melakukan fetch data
|
||||
if (_authProvider.currentUser != null) {
|
||||
// Prioritize loading user profile data first
|
||||
await fetchProfileFromWargaDesa();
|
||||
|
||||
// Load unpaid rentals
|
||||
loadUnpaidRentals();
|
||||
// If the profile data was not loaded successfully, try again after a short delay
|
||||
if (userName.value == 'Pengguna Warga' || userNik.value.isEmpty) {
|
||||
print('onInit: Profile data not loaded, retrying after delay');
|
||||
await Future.delayed(const Duration(milliseconds: 800));
|
||||
await fetchProfileFromWargaDesa();
|
||||
}
|
||||
|
||||
// Debug count sewa_aset by status
|
||||
_debugCountSewaAset();
|
||||
// Load other user data
|
||||
await _loadUserData();
|
||||
|
||||
// Load sewa aktif
|
||||
loadActiveRentals();
|
||||
// Load other data in parallel to speed up the dashboard initialization
|
||||
Future.wait([
|
||||
_loadSampleData(),
|
||||
loadDummyData(),
|
||||
loadUnpaidRentals(),
|
||||
_debugCountSewaAset(),
|
||||
loadActiveRentals(),
|
||||
]).then((_) => print('onInit: All data loaded successfully'));
|
||||
|
||||
// If coming from login, make sure UI is updated
|
||||
if (isFromLogin) {
|
||||
update();
|
||||
}
|
||||
} else {
|
||||
print('onInit: User not logged in, skipping data fetch');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _loadUserData() async {
|
||||
@ -116,7 +137,7 @@ class WargaDashboardController extends GetxController {
|
||||
}
|
||||
}
|
||||
|
||||
void _loadSampleData() {
|
||||
Future<void> _loadSampleData() async {
|
||||
// Clear any existing data
|
||||
activeRentals.clear();
|
||||
|
||||
@ -147,10 +168,37 @@ class WargaDashboardController extends GetxController {
|
||||
navigationService.toSewaAset();
|
||||
}
|
||||
|
||||
void refreshData() {
|
||||
fetchProfileFromWargaDesa();
|
||||
_loadSampleData();
|
||||
loadDummyData();
|
||||
Future<void> refreshData() async {
|
||||
print('refreshData: Refreshing dashboard data');
|
||||
try {
|
||||
// First fetch profile data
|
||||
await fetchProfileFromWargaDesa();
|
||||
await _loadUserData();
|
||||
|
||||
// Then load all other data in parallel
|
||||
await Future.wait([
|
||||
_loadSampleData(),
|
||||
loadDummyData(),
|
||||
loadUnpaidRentals(),
|
||||
loadActiveRentals(),
|
||||
_debugCountSewaAset(),
|
||||
]);
|
||||
|
||||
// Update UI
|
||||
update();
|
||||
print('refreshData: Dashboard data refreshed successfully');
|
||||
} catch (e) {
|
||||
print('refreshData: Error refreshing data: $e');
|
||||
// Show error message to user
|
||||
Get.snackbar(
|
||||
'Perhatian',
|
||||
'Terjadi kesalahan saat memuat data',
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red.shade100,
|
||||
colorText: Colors.red.shade900,
|
||||
duration: const Duration(seconds: 3),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void onNavItemTapped(int index) {
|
||||
@ -176,12 +224,14 @@ class WargaDashboardController extends GetxController {
|
||||
Get.toNamed(Routes.WARGA_SEWA, arguments: {'tab': 3});
|
||||
}
|
||||
|
||||
void logout() async {
|
||||
Future<void> logout() async {
|
||||
print('logout: Logging out user');
|
||||
await _authProvider.signOut();
|
||||
navigationService.toLogin();
|
||||
print('logout: User logged out and redirected to login screen');
|
||||
}
|
||||
|
||||
void loadDummyData() {
|
||||
Future<void> loadDummyData() async {
|
||||
// Dummy active bills
|
||||
activeBills.clear();
|
||||
activeBills.add({
|
||||
@ -331,24 +381,77 @@ class WargaDashboardController extends GetxController {
|
||||
Future<void> fetchProfileFromWargaDesa() async {
|
||||
try {
|
||||
final user = _authProvider.currentUser;
|
||||
if (user == null) return;
|
||||
if (user == null) {
|
||||
print(
|
||||
'fetchProfileFromWargaDesa: No current user found, skipping fetch',
|
||||
);
|
||||
return; // Exit early if no user is logged in
|
||||
}
|
||||
|
||||
final userId = user.id;
|
||||
print('fetchProfileFromWargaDesa: Fetching data for user: $userId');
|
||||
|
||||
final data =
|
||||
await _authProvider.client
|
||||
.from('warga_desa')
|
||||
.select('nik, alamat, email, nama_lengkap, no_hp, avatar')
|
||||
.eq('user_id', userId)
|
||||
.maybeSingle();
|
||||
|
||||
if (data != null) {
|
||||
print('fetchProfileFromWargaDesa: Data retrieved successfully');
|
||||
userNik.value = data['nik']?.toString() ?? '';
|
||||
userAddress.value = data['alamat']?.toString() ?? '';
|
||||
userEmail.value = data['email']?.toString() ?? '';
|
||||
userName.value = data['nama_lengkap']?.toString() ?? '';
|
||||
userPhone.value = data['no_hp']?.toString() ?? '';
|
||||
userAvatar.value = data['avatar']?.toString() ?? '';
|
||||
|
||||
// Trigger UI refresh
|
||||
update();
|
||||
print('fetchProfileFromWargaDesa: Profile data updated');
|
||||
} else {
|
||||
print('fetchProfileFromWargaDesa: No data found for user: $userId');
|
||||
}
|
||||
} catch (e) {
|
||||
print('Error fetching profile from warga_desa: $e');
|
||||
// If it fails, try again after a delay
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
try {
|
||||
await _retryFetchProfile();
|
||||
} catch (retryError) {
|
||||
print('Retry error fetching profile: $retryError');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Helper method to retry fetching profile
|
||||
Future<void> _retryFetchProfile() async {
|
||||
final user = _authProvider.currentUser;
|
||||
if (user == null) {
|
||||
print('_retryFetchProfile: No current user found, skipping retry');
|
||||
return; // Exit early if no user is logged in
|
||||
}
|
||||
|
||||
print('_retryFetchProfile: Retrying fetch for user: ${user.id}');
|
||||
|
||||
final data =
|
||||
await _authProvider.client
|
||||
.from('warga_desa')
|
||||
.select('nik, alamat, email, nama_lengkap, no_hp, avatar')
|
||||
.eq('user_id', user.id)
|
||||
.maybeSingle();
|
||||
|
||||
if (data != null) {
|
||||
print('_retryFetchProfile: Data retrieved successfully on retry');
|
||||
userNik.value = data['nik']?.toString() ?? '';
|
||||
userAddress.value = data['alamat']?.toString() ?? '';
|
||||
userEmail.value = data['email']?.toString() ?? '';
|
||||
userName.value = data['nama_lengkap']?.toString() ?? '';
|
||||
userPhone.value = data['no_hp']?.toString() ?? '';
|
||||
userAvatar.value = data['avatar']?.toString() ?? '';
|
||||
update();
|
||||
print('_retryFetchProfile: Profile data updated');
|
||||
}
|
||||
}
|
||||
|
||||
@ -533,7 +636,7 @@ class WargaDashboardController extends GetxController {
|
||||
Get.snackbar(
|
||||
'Gagal',
|
||||
'Tidak dapat mengakses ${source == ImageSource.camera ? 'kamera' : 'galeri'}',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red.shade700,
|
||||
colorText: Colors.white,
|
||||
duration: const Duration(seconds: 3),
|
||||
|
@ -254,10 +254,28 @@ class WargaSewaController extends GetxController
|
||||
|
||||
debugPrint('Fetched ${sewaAsetList.length} sewa_aset records');
|
||||
|
||||
// Debug the structure of the first record if available
|
||||
if (sewaAsetList.isNotEmpty) {
|
||||
debugPrint('Sample sewa_aset record: ${sewaAsetList.first}');
|
||||
debugPrint('updated_at field: ${sewaAsetList.first['updated_at']}');
|
||||
}
|
||||
|
||||
// Process each sewa_aset record
|
||||
for (var sewaAset in sewaAsetList) {
|
||||
final processedData = await _processRentalData(sewaAset);
|
||||
processedData['status'] = sewaAset['status'] ?? 'MENUNGGU PEMBAYARAN';
|
||||
|
||||
// Ensure updated_at is set correctly
|
||||
if (sewaAset['updated_at'] == null &&
|
||||
processedData['status'] == 'MENUNGGU PEMBAYARAN') {
|
||||
// If updated_at is null but status is MENUNGGU PEMBAYARAN, use created_at as fallback
|
||||
processedData['updated_at'] =
|
||||
sewaAset['created_at'] ?? DateTime.now().toIso8601String();
|
||||
debugPrint(
|
||||
'Using created_at as fallback for updated_at: ${processedData['updated_at']}',
|
||||
);
|
||||
}
|
||||
|
||||
rentals.add(processedData);
|
||||
}
|
||||
|
||||
@ -321,7 +339,7 @@ class WargaSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Berhasil',
|
||||
'Pesanan berhasil dibatalkan',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.green,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -337,7 +355,7 @@ class WargaSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Gagal',
|
||||
'Gagal membatalkan pesanan: $e',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
@ -377,7 +395,7 @@ class WargaSewaController extends GetxController
|
||||
Get.snackbar(
|
||||
'Info',
|
||||
'Navigasi ke halaman pembayaran',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user