kelola penyewa dan beberapa error fix

This commit is contained in:
Andreas Malvino
2025-07-09 16:01:10 +07:00
parent 0423c2fdf9
commit 47766bbdda
90 changed files with 2705 additions and 1555 deletions

View File

@ -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 = '';
}
}

View File

@ -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,
);

View File

@ -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,
);

View File

@ -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();
}

View File

@ -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,
);

View File

@ -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),

View File

@ -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,
);
}