Perbarui beberapa file konfigurasi fingerprint untuk arsitektur arm64-v8a, armeabi-v7a, x86, dan x86_64. Modifikasi tampilan dan controller di modul donatur dan petugas desa untuk meningkatkan pengalaman pengguna, termasuk penggantian logika pengambilan data dan penyesuaian tampilan. Hapus kode yang tidak digunakan dan tambahkan fungsionalitas baru untuk mendukung pengelolaan data yang lebih baik.

This commit is contained in:
Khafidh Fuadi
2025-03-27 16:55:56 +07:00
parent f74c058c71
commit f6d3eef2cf
31 changed files with 3372 additions and 1339 deletions

View File

@ -73,17 +73,23 @@ class CounterService extends GetxService {
void updatePengaduanCounter(int diproses) {
jumlahDiproses.value = diproses;
_storage.write(_keyDiproses, diproses);
print('Counter pengaduan updated and saved - Diproses: $diproses');
}
// Metode untuk memperbarui counter notifikasi
void updateNotifikasiCounter(int belumDibaca) {
jumlahNotifikasiBelumDibaca.value = belumDibaca;
_storage.write(_keyNotifikasi, belumDibaca);
print('Counter notifikasi updated and saved - Belum Dibaca: $belumDibaca');
}
// Metode untuk memperbarui counter jadwal
void updateJadwalCounter(int hariIni) {
jumlahJadwalHariIni.value = hariIni;
_storage.write(_keyJadwal, hariIni);
print('Counter jadwal updated and saved - Hari Ini: $hariIni');
}
}

View File

@ -204,6 +204,27 @@ class DetailPenyaluranController extends GetxController {
.update(updateData)
.eq('id', penerima.id!);
// Dapatkan data penerima penyaluran (stok_bantuan_id dan jumlah)
final penerimaData = await _supabaseService.client
.from('penerima_penyaluran')
.select('penyaluran_bantuan_id, stok_bantuan_id, jumlah_bantuan')
.eq('id', penerima.id!)
.single();
if (penerimaData != null) {
final String stokBantuanId = penerimaData['stok_bantuan_id'];
final double jumlah = penerimaData['jumlah_bantuan'] is int
? penerimaData['jumlah_bantuan'].toDouble()
: penerimaData['jumlah_bantuan'];
// Kurangi stok dan catat riwayat
final petugasId = _supabaseService.client.auth.currentUser?.id;
if (petugasId != null) {
await _supabaseService.kurangiStokDariPenyaluran(
penerima.id!, stokBantuanId, jumlah, petugasId);
}
}
// Refresh data setelah konfirmasi berhasil
await refreshData();

View File

@ -24,7 +24,7 @@ class JadwalPenyaluranController extends GetxController {
final RxInt selectedCategoryIndex = 0.obs;
// Data untuk jadwal
final RxList<PenyaluranBantuanModel> jadwalHariIni =
final RxList<PenyaluranBantuanModel> jadwalAktif =
<PenyaluranBantuanModel>[].obs;
final RxList<PenyaluranBantuanModel> jadwalMendatang =
<PenyaluranBantuanModel>[].obs;
@ -97,7 +97,7 @@ class JadwalPenyaluranController extends GetxController {
List<PenyaluranBantuanModel> jadwalToUpdate = [];
List<PenyaluranBantuanModel> jadwalTerlewat = [];
for (var jadwal in jadwalHariIni) {
for (var jadwal in jadwalAktif) {
if (jadwal.tanggalPenyaluran != null) {
final jadwalDateTime =
DateTimeHelper.toLocalDateTime(jadwal.tanggalPenyaluran!);
@ -175,9 +175,9 @@ class JadwalPenyaluranController extends GetxController {
isLoading.value = true;
try {
// Mengambil data jadwal hari ini
final jadwalHariIniData = await _supabaseService.getJadwalHariIni();
if (jadwalHariIniData != null) {
jadwalHariIni.value = jadwalHariIniData
final jadwalAktifData = await _supabaseService.getJadwalAktif();
if (jadwalAktifData != null) {
jadwalAktif.value = jadwalAktifData
.map((data) => PenyaluranBantuanModel.fromJson(data))
.toList();
}

View File

@ -250,29 +250,29 @@ class PelaksanaanPenyaluranController extends GetxController {
filteredPenerima.value = filtered;
}
// Metode untuk memperbarui status penerimaan bantuan
Future<bool> updateStatusPenerimaan(int penerimaId, String status,
{DateTime? tanggalPenerimaan,
String? buktiPenerimaan,
String? keterangan}) async {
try {
final result = await supabaseService.updateStatusPenerimaan(
penerimaId, status,
tanggalPenerimaan: tanggalPenerimaan,
buktiPenerimaan: buktiPenerimaan,
keterangan: keterangan);
// // Metode untuk memperbarui status penerimaan bantuan
// Future<bool> updateStatusPenerimaan(int penerimaId, String status,
// {DateTime? tanggalPenerimaan,
// String? buktiPenerimaan,
// String? keterangan}) async {
// try {
// final result = await supabaseService.updateStatusPenerimaan(
// penerimaId, status,
// tanggalPenerimaan: tanggalPenerimaan,
// buktiPenerimaan: buktiPenerimaan,
// keterangan: keterangan);
// Jika berhasil, perbarui data lokal
if (result) {
await loadPenerimaPenyaluran(activePenyaluranId.value);
}
// // Jika berhasil, perbarui data lokal
// if (result) {
// await loadPenerimaPenyaluran(activePenyaluranId.value);
// }
return result;
} catch (e) {
print('Error updating status penerimaan: $e');
return false;
}
}
// return result;
// } catch (e) {
// print('Error updating status penerimaan: $e');
// return false;
// }
// }
// Metode untuk menyelesaikan jadwal penyaluran
Future<void> completeJadwal(String jadwalId) async {

View File

@ -309,10 +309,10 @@ class PetugasDesaController extends GetxController {
// Metode untuk memuat data jadwal
Future<void> loadJadwalData() async {
try {
final jadwalHariIniData = await _supabaseService.getJadwalHariIni();
if (jadwalHariIniData != null) {
jadwalHariIni.value = jadwalHariIniData;
_counterService.updateJadwalCounter(jadwalHariIniData.length);
final jadwalAktifData = await _supabaseService.getJadwalAktif();
if (jadwalAktifData != null) {
jadwalHariIni.value = jadwalAktifData;
_counterService.updateJadwalCounter(jadwalAktifData.length);
}
} catch (e) {
print('Error loading jadwal data: $e');
@ -360,7 +360,7 @@ class PetugasDesaController extends GetxController {
// Hitung jumlah pengaduan dengan status DIPROSES
for (var item in pengaduanData) {
if (item['status'] == 'DIPROSES') {
if (item['status'] == 'MENUNGGU') {
diproses++;
}
}
@ -609,22 +609,22 @@ class PetugasDesaController extends GetxController {
}
// Metode untuk memperbarui status penerimaan bantuan
Future<bool> updateStatusPenerimaan(int penerimaId, String status,
{DateTime? tanggalPenerimaan,
String? buktiPenerimaan,
String? keterangan}) async {
try {
final result = await _supabaseService.updateStatusPenerimaan(
penerimaId, status,
tanggalPenerimaan: tanggalPenerimaan,
buktiPenerimaan: buktiPenerimaan,
keterangan: keterangan);
return result;
} catch (e) {
print('Error updating status penerimaan: $e');
return false;
}
}
// Future<bool> updateStatusPenerimaan(int penerimaId, String status,
// {DateTime? tanggalPenerimaan,
// String? buktiPenerimaan,
// String? keterangan}) async {
// try {
// final result = await _supabaseService.updateStatusPenerimaan(
// penerimaId, status,
// tanggalPenerimaan: tanggalPenerimaan,
// buktiPenerimaan: buktiPenerimaan,
// keterangan: keterangan);
// return result;
// } catch (e) {
// print('Error updating status penerimaan: $e');
// return false;
// }
// }
// Metode untuk menyelesaikan jadwal penyaluran
Future<void> completeJadwal(String jadwalId) async {

View File

@ -4,10 +4,12 @@ import 'package:penyaluran_app/app/data/models/user_model.dart';
import 'package:penyaluran_app/app/data/models/notifikasi_model.dart';
import 'package:penyaluran_app/app/modules/auth/controllers/auth_controller.dart';
import 'package:penyaluran_app/app/services/supabase_service.dart';
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/counter_service.dart';
class PetugasDesaDashboardController extends GetxController {
final AuthController _authController = Get.find<AuthController>();
final SupabaseService _supabaseService = SupabaseService.to;
late final CounterService _counterService;
final RxBool isLoading = false.obs;
@ -22,6 +24,12 @@ class PetugasDesaDashboardController extends GetxController {
final RxInt totalPenitipanTerverifikasi = 0.obs;
final RxDouble progressPenyaluran = 0.0.obs;
// Data untuk status penyaluran
final RxInt penyaluranDijadwalkan = 0.obs;
final RxInt penyaluranAktif = 0.obs;
final RxInt penyaluranBatal = 0.obs;
final RxInt penyaluranTerlaksana = 0.obs;
// Data untuk notifikasi
final RxList<NotifikasiModel> notifikasiBelumDibaca = <NotifikasiModel>[].obs;
final RxInt jumlahNotifikasiBelumDibaca = 0.obs;
@ -45,13 +53,24 @@ class PetugasDesaDashboardController extends GetxController {
userProfile['desa']?['nama'] ??
(userProfile['desa_id'] != null ? 'Desa' : 'Desa');
// Getter untuk counter dari CounterService
RxInt get jumlahMenunggu => _counterService.jumlahMenunggu;
RxInt get jumlahDiproses => _counterService.jumlahDiproses;
@override
void onInit() {
super.onInit();
// Inisialisasi CounterService jika belum ada
if (!Get.isRegistered<CounterService>()) {
Get.put(CounterService(), permanent: true);
}
_counterService = Get.find<CounterService>();
loadUserProfile();
loadDashboardData();
loadNotifikasiData();
loadJadwalHariIni();
loadJadwalAktif();
}
@override
@ -97,6 +116,15 @@ class PetugasDesaDashboardController extends GetxController {
await _supabaseService.getTotalSemuaPenyaluran();
totalSemuaPenyaluran.value = semuaPenyaluranData ?? 0;
// Mengambil data status penyaluran
final statusPenyaluranData = await _supabaseService.getStatusPenyaluran();
if (statusPenyaluranData != null) {
penyaluranDijadwalkan.value = statusPenyaluranData['dijadwalkan'] ?? 0;
penyaluranAktif.value = statusPenyaluranData['aktif'] ?? 0;
penyaluranBatal.value = statusPenyaluranData['batal'] ?? 0;
penyaluranTerlaksana.value = statusPenyaluranData['terlaksana'] ?? 0;
}
// Menghitung progress penyaluran (persentase penyaluran yang terlaksana dari total semua penyaluran)
if (totalSemuaPenyaluran.value > 0) {
progressPenyaluran.value =
@ -127,9 +155,9 @@ class PetugasDesaDashboardController extends GetxController {
}
}
Future<void> loadJadwalHariIni() async {
Future<void> loadJadwalAktif() async {
try {
final jadwalData = await _supabaseService.getJadwalHariIni();
final jadwalData = await _supabaseService.getJadwalAktif();
if (jadwalData != null) {
jadwalHariIni.value = jadwalData;
}
@ -145,7 +173,7 @@ class PetugasDesaDashboardController extends GetxController {
loadUserProfile(),
loadDashboardData(),
loadNotifikasiData(),
loadJadwalHariIni(),
loadJadwalAktif(),
]);
} catch (e) {
print('Error refreshing data: $e');

View File

@ -302,4 +302,26 @@ class RiwayatStokController extends GetxController {
alasan.value = '';
fotoBukti.value = null;
}
// Metode untuk mendapatkan detail referensi berdasarkan id dan sumber
Future<Map<String, dynamic>?> getReferensiDetail({
required String idReferensi,
required String sumber,
}) async {
try {
Map<String, dynamic>? data;
// Berdasarkan sumber, ambil data dari tabel yang sesuai
if (sumber == 'penitipan') {
data = await _supabaseService.getPenitipanById(idReferensi);
} else if (sumber == 'penerimaan') {
data = await _supabaseService.getPenerimaanById(idReferensi);
}
return data;
} catch (e) {
print('Error getting referensi detail: $e');
throw Exception('Gagal mendapatkan data: $e');
}
}
}