Perbarui beberapa file konfigurasi fingerprint untuk arsitektur arm64-v8a, armeabi-v7a, x86, dan x86_64. Modifikasi model SkemaBantuan untuk menggunakan operator null-aware pada jumlah diterima per orang. Perbarui logika pengambilan data di AuthProvider untuk menyederhanakan pengecekan dan logging. Tambahkan fungsionalitas baru di DonaturDashboardController untuk mengunggah foto bantuan dan memperbarui data yang disimpan. Hapus tampilan yang tidak digunakan di DonaturRiwayatPenitipanView dan perbarui tampilan di beberapa view untuk meningkatkan pengalaman pengguna.
This commit is contained in:
@ -39,35 +39,14 @@ class DetailPenyaluranController extends GetxController {
|
||||
if (penyaluran.value?.id != null) {
|
||||
loadPenyaluranDetails(penyaluran.value!.id!);
|
||||
}
|
||||
checkUserRole();
|
||||
} else if (penyaluranId != null) {
|
||||
// Jika hanya ID penyaluran yang diterima
|
||||
loadPenyaluranData(penyaluranId);
|
||||
checkUserRole();
|
||||
} else {
|
||||
isLoading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> checkUserRole() async {
|
||||
try {
|
||||
final user = _supabaseService.client.auth.currentUser;
|
||||
if (user != null) {
|
||||
final userData = await _supabaseService.client
|
||||
.from('user_profile')
|
||||
.select('role')
|
||||
.eq('id', user.id)
|
||||
.single();
|
||||
|
||||
if (userData['role'] == 'PETUGASDESA') {
|
||||
isPetugasDesa.value = true;
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
print('Error checking user role: $e');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> loadPenyaluranData(String penyaluranId) async {
|
||||
try {
|
||||
isLoading.value = true;
|
||||
@ -522,36 +501,33 @@ class DetailPenyaluranController extends GetxController {
|
||||
.eq('qr_code_hash', qrHash)
|
||||
.single();
|
||||
|
||||
if (data != null) {
|
||||
// Jika penerima ditemukan, konversi ke model
|
||||
final Map<String, dynamic> sanitizedPenerimaData =
|
||||
Map<String, dynamic>.from(data);
|
||||
// Jika penerima ditemukan, konversi ke model
|
||||
final Map<String, dynamic> sanitizedPenerimaData =
|
||||
Map<String, dynamic>.from(data);
|
||||
|
||||
// Konversi jumlah_bantuan ke double jika bertipe String
|
||||
if (sanitizedPenerimaData['jumlah_bantuan'] is String) {
|
||||
sanitizedPenerimaData['jumlah_bantuan'] = double.tryParse(
|
||||
sanitizedPenerimaData['jumlah_bantuan'] as String);
|
||||
}
|
||||
|
||||
// Konversi data ke model
|
||||
final penerima =
|
||||
PenerimaPenyaluranModel.fromJson(sanitizedPenerimaData);
|
||||
|
||||
// Set isProcessing ke false sebelum navigasi untuk menghindari masalah loading
|
||||
isProcessing.value = false;
|
||||
|
||||
// Navigasi ke halaman konfirmasi dengan data terbaru
|
||||
await Get.toNamed('/petugas-desa/konfirmasi-penerima/${penerima.id}',
|
||||
arguments: {
|
||||
'penerima': penerima,
|
||||
'tanggal_penyaluran': penyaluran.value?.tanggalPenyaluran
|
||||
});
|
||||
|
||||
// Refresh data
|
||||
await refreshData();
|
||||
return true;
|
||||
// Konversi jumlah_bantuan ke double jika bertipe String
|
||||
if (sanitizedPenerimaData['jumlah_bantuan'] is String) {
|
||||
sanitizedPenerimaData['jumlah_bantuan'] =
|
||||
double.tryParse(sanitizedPenerimaData['jumlah_bantuan'] as String);
|
||||
}
|
||||
|
||||
// Konversi data ke model
|
||||
final penerima = PenerimaPenyaluranModel.fromJson(sanitizedPenerimaData);
|
||||
|
||||
// Set isProcessing ke false sebelum navigasi untuk menghindari masalah loading
|
||||
isProcessing.value = false;
|
||||
|
||||
// Navigasi ke halaman konfirmasi dengan data terbaru
|
||||
await Get.toNamed('/petugas-desa/konfirmasi-penerima/${penerima.id}',
|
||||
arguments: {
|
||||
'penerima': penerima,
|
||||
'tanggal_penyaluran': penyaluran.value?.tanggalPenyaluran
|
||||
});
|
||||
|
||||
// Refresh data
|
||||
await refreshData();
|
||||
return true;
|
||||
|
||||
return false;
|
||||
} catch (e) {
|
||||
print('Error verifikasi QR code: $e');
|
||||
|
@ -448,7 +448,7 @@ class JadwalPenyaluranController extends GetxController {
|
||||
.eq('id', stokBantuanId)
|
||||
.single();
|
||||
|
||||
if (stokData != null && stokData['total_stok'] != null) {
|
||||
if (stokData['total_stok'] != null) {
|
||||
final currentStok = stokData['total_stok'].toDouble();
|
||||
final newStok = currentStok - totalStokDibutuhkan;
|
||||
|
||||
|
@ -197,9 +197,63 @@ class PenitipanBantuanController extends GetxController {
|
||||
}
|
||||
|
||||
Future<void> pickfotoBuktiSerahTerima() async {
|
||||
try {
|
||||
// Tampilkan bottom sheet untuk memilih sumber foto
|
||||
Get.bottomSheet(
|
||||
Container(
|
||||
padding: const EdgeInsets.all(16),
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
|
||||
),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(
|
||||
'Pilih Sumber Foto',
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 16,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
ListTile(
|
||||
leading: const Icon(Icons.camera_alt),
|
||||
title: const Text('Kamera'),
|
||||
onTap: () {
|
||||
Get.back();
|
||||
_pickfotoBuktiSerahTerimaFrom(ImageSource.camera);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: const Icon(Icons.photo_library),
|
||||
title: const Text('Galeri'),
|
||||
onTap: () {
|
||||
Get.back();
|
||||
_pickfotoBuktiSerahTerimaFrom(ImageSource.gallery);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
} catch (e) {
|
||||
print('Error showing bottom sheet: $e');
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Terjadi kesalahan: ${e.toString()}',
|
||||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Fungsi helper untuk mengambil foto dari sumber yang dipilih
|
||||
Future<void> _pickfotoBuktiSerahTerimaFrom(ImageSource source) async {
|
||||
try {
|
||||
final pickedFile = await _imagePicker.pickImage(
|
||||
source: ImageSource.camera,
|
||||
source: source,
|
||||
imageQuality: 70,
|
||||
maxWidth: 1000,
|
||||
);
|
||||
|
@ -74,9 +74,7 @@ class PetugasDesaController extends GetxController {
|
||||
String get nama {
|
||||
// 1. Coba ambil dari AuthController displayName yang paling lengkap
|
||||
final authDisplayName = _authController.displayName;
|
||||
if (authDisplayName != null &&
|
||||
authDisplayName != 'Pengguna' &&
|
||||
authDisplayName != user?.email) {
|
||||
if (authDisplayName != 'Pengguna' && authDisplayName != user?.email) {
|
||||
return authDisplayName;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user