Perbarui judul aplikasi dari 'Penyaluran App' menjadi 'Penerimaan App'. Tambahkan properti baru pada model PenerimaPenyaluranModel untuk mendukung informasi tambahan terkait penyaluran. Modifikasi tampilan di WargaDashboardView dan WargaPengaduanView untuk meningkatkan pengalaman pengguna. Hapus WargaPenyaluranView yang tidak digunakan dan perbarui rute aplikasi untuk mencerminkan perubahan ini.

This commit is contained in:
Khafidh Fuadi
2025-03-16 19:37:37 +07:00
parent a3798f0005
commit 76b167c65c
19 changed files with 1806 additions and 757 deletions

View File

@ -4,9 +4,11 @@ import 'package:penyaluran_app/app/data/models/pengaduan_model.dart';
import 'package:penyaluran_app/app/data/models/pengajuan_kelayakan_bantuan_model.dart';
import 'package:penyaluran_app/app/data/models/user_model.dart';
import 'package:penyaluran_app/app/modules/auth/controllers/auth_controller.dart';
import 'package:penyaluran_app/app/services/supabase_service.dart';
class WargaDashboardController extends GetxController {
final AuthController _authController = Get.find<AuthController>();
final SupabaseService _supabaseService = SupabaseService.to;
final Rx<UserModel?> currentUser = Rx<UserModel?>(null);
@ -58,84 +60,22 @@ class WargaDashboardController extends GetxController {
isLoading.value = true;
try {
// TODO: Implementasi fetch data dari API
// Contoh data dummy untuk pengembangan UI
await Future.delayed(const Duration(seconds: 1));
// Pastikan user sudah login dan memiliki ID
if (user?.id == null) {
throw Exception('User tidak terautentikasi');
}
// Dummy data penerima penyaluran
penerimaPenyaluran.value = [
PenerimaPenyaluranModel(
id: '1',
statusPenerimaan: 'DITERIMA',
tanggalPenerimaan: DateTime.now().subtract(const Duration(days: 5)),
jumlahBantuan: 50000,
keterangan: 'Bantuan Tunai',
),
PenerimaPenyaluranModel(
id: '2',
statusPenerimaan: 'DITERIMA',
tanggalPenerimaan: DateTime.now().subtract(const Duration(days: 15)),
jumlahBantuan: 100000,
keterangan: 'Bantuan Sembako',
),
];
// Ambil data penerima penyaluran dari server
await fetchPenerimaPenyaluran();
totalPenyaluranDiterima.value = penerimaPenyaluran.length;
// Ambil data pengajuan kelayakan dari server
await fetchPengajuanKelayakan();
// Dummy data pengajuan kelayakan
pengajuanKelayakan.value = [
PengajuanKelayakanBantuanModel(
id: '1',
status: StatusKelayakan.MENUNGGU,
createdAt: DateTime.now().subtract(const Duration(days: 2)),
),
PengajuanKelayakanBantuanModel(
id: '2',
status: StatusKelayakan.TERVERIFIKASI,
createdAt: DateTime.now().subtract(const Duration(days: 10)),
),
PengajuanKelayakanBantuanModel(
id: '3',
status: StatusKelayakan.DITOLAK,
createdAt: DateTime.now().subtract(const Duration(days: 20)),
alasanVerifikasi: 'Dokumen tidak lengkap',
),
];
// Ambil data pengaduan dari server
await fetchPengaduan();
totalPengajuanMenunggu.value = pengajuanKelayakan
.where((p) => p.status == StatusKelayakan.MENUNGGU)
.length;
totalPengajuanTerverifikasi.value = pengajuanKelayakan
.where((p) => p.status == StatusKelayakan.TERVERIFIKASI)
.length;
totalPengajuanDitolak.value = pengajuanKelayakan
.where((p) => p.status == StatusKelayakan.DITOLAK)
.length;
// Dummy data pengaduan
pengaduan.value = [
PengaduanModel(
id: '1',
judul: 'Bantuan tidak sesuai',
status: 'PROSES',
tanggalPengaduan: DateTime.now().subtract(const Duration(days: 3)),
),
PengaduanModel(
id: '2',
judul: 'Keterlambatan penyaluran',
status: 'SELESAI',
tanggalPengaduan: DateTime.now().subtract(const Duration(days: 25)),
),
];
totalPengaduan.value = pengaduan.length;
totalPengaduanProses.value =
pengaduan.where((p) => p.status == 'PROSES').length;
totalPengaduanSelesai.value =
pengaduan.where((p) => p.status == 'SELESAI').length;
// Dummy data notifikasi
jumlahNotifikasiBelumDibaca.value = 3;
// Ambil data notifikasi
await fetchNotifikasi();
} catch (e) {
print('Error fetching data: $e');
} finally {
@ -143,6 +83,239 @@ class WargaDashboardController extends GetxController {
}
}
// Fungsi untuk mengambil data penerima penyaluran
Future<void> fetchPenerimaPenyaluran() async {
try {
print('Memulai fetchPenerimaPenyaluran()');
print('User ID: ${user?.id}');
// Pertama, cari warga_id berdasarkan user_id
final wargaResponse = await _supabaseService.client
.from('warga')
.select('id')
.eq('user_id', user!.id)
.single();
print('Warga response: $wargaResponse');
if (wargaResponse == null) {
print('Tidak ditemukan data warga untuk user_id: ${user!.id}');
return;
}
final wargaId = wargaResponse['id'];
print('Warga ID: $wargaId');
// Ambil data penerima penyaluran dengan join ke warga, stok bantuan, dan penyaluran bantuan
final response =
await _supabaseService.client.from('penerima_penyaluran').select('''
*,
warga:warga_id(*),
stok_bantuan:stok_bantuan_id(
*,
kategori_bantuan(*)
),
penyaluran_bantuan:penyaluran_bantuan_id(
*,
lokasi_penyaluran(*)
)
''').eq('warga_id', wargaId).order('created_at', ascending: false);
print('Response dari API: $response');
if (response != null) {
final List<PenerimaPenyaluranModel> penerima = [];
for (var item in response) {
print('Memproses item: $item');
Map<String, dynamic> sanitizedPenerimaData =
Map<String, dynamic>.from(item);
print('Data yang disanitasi: $sanitizedPenerimaData');
if (sanitizedPenerimaData['jumlah_bantuan'] is String) {
var jumlahBantuan = double.tryParse(
sanitizedPenerimaData['jumlah_bantuan'] as String);
print(
'Konversi jumlah_bantuan dari String ke double: $jumlahBantuan');
sanitizedPenerimaData['jumlah_bantuan'] = jumlahBantuan;
}
// Tambahkan informasi apakah bantuan uang atau bukan dan satuan
if (sanitizedPenerimaData['stok_bantuan'] != null) {
print('Stok bantuan: ${sanitizedPenerimaData['stok_bantuan']}');
// Cek apakah bantuan uang
final isUang =
sanitizedPenerimaData['stok_bantuan']['is_uang'] ?? false;
sanitizedPenerimaData['is_uang'] = isUang;
// Ambil satuan
final satuan =
sanitizedPenerimaData['stok_bantuan']['satuan'] ?? '';
sanitizedPenerimaData['satuan'] = satuan;
// Ambil nama kategori bantuan jika tersedia
if (sanitizedPenerimaData['stok_bantuan']['kategori_bantuan'] !=
null) {
final kategoriNama = sanitizedPenerimaData['stok_bantuan']
['kategori_bantuan']['nama'] ??
'';
sanitizedPenerimaData['kategori_nama'] = kategoriNama;
}
print('Is Uang: $isUang, Satuan: $satuan');
}
// Tambahkan informasi dari penyaluran bantuan
if (sanitizedPenerimaData['penyaluran_bantuan'] != null) {
print(
'Penyaluran bantuan: ${sanitizedPenerimaData['penyaluran_bantuan']}');
// Ambil nama penyaluran
final namaPenyaluran =
sanitizedPenerimaData['penyaluran_bantuan']['nama'] ?? '';
sanitizedPenerimaData['nama_penyaluran'] = namaPenyaluran;
// Ambil deskripsi penyaluran
final deskripsiPenyaluran =
sanitizedPenerimaData['penyaluran_bantuan']['deskripsi'] ?? '';
sanitizedPenerimaData['deskripsi_penyaluran'] = deskripsiPenyaluran;
// Ambil lokasi penyaluran jika tersedia
if (sanitizedPenerimaData['penyaluran_bantuan']
['lokasi_penyaluran'] !=
null) {
final lokasiNama = sanitizedPenerimaData['penyaluran_bantuan']
['lokasi_penyaluran']['nama'] ??
'';
sanitizedPenerimaData['lokasi_penyaluran_nama'] = lokasiNama;
final lokasiAlamat = sanitizedPenerimaData['penyaluran_bantuan']
['lokasi_penyaluran']['alamat_lengkap'] ??
'';
sanitizedPenerimaData['lokasi_penyaluran_alamat'] = lokasiAlamat;
}
print('Nama Penyaluran: $namaPenyaluran');
}
var model = PenerimaPenyaluranModel.fromJson(sanitizedPenerimaData);
print('Model yang dibuat: $model');
penerima.add(model);
}
print('Total data yang diproses: ${penerima.length}');
penerimaPenyaluran.assignAll(penerima);
var diterima =
penerima.where((p) => p.statusPenerimaan == 'DITERIMA').length;
print('Total penyaluran diterima: $diterima');
totalPenyaluranDiterima.value = diterima;
}
} catch (e, stackTrace) {
print('Error fetchPenerimaPenyaluran: $e');
print('Stack trace: $stackTrace');
}
}
// Fungsi untuk mengambil data pengajuan kelayakan
Future<void> fetchPengajuanKelayakan() async {
try {
// Pertama, cari warga_id berdasarkan user_id
final wargaResponse = await _supabaseService.client
.from('warga')
.select('id')
.eq('user_id', user!.id)
.single();
if (wargaResponse == null) {
print('Tidak ditemukan data warga untuk user_id: ${user!.id}');
return;
}
final wargaId = wargaResponse['id'];
print('Warga ID untuk pengajuan kelayakan: $wargaId');
final response = await _supabaseService.client
.from('xx02_pengajuan_kelayakan_bantuan')
.select('*')
.eq('warga_id', wargaId)
.order('created_at', ascending: false);
if (response != null) {
final List<PengajuanKelayakanBantuanModel> pengajuan = [];
for (var item in response) {
// Konversi status ke enum
if (item['status'] != null) {
final statusStr = item['status'].toString();
item['status'] = statusStr; // Pastikan status dalam format string
}
pengajuan.add(PengajuanKelayakanBantuanModel.fromJson(item));
}
pengajuanKelayakan.assignAll(pengajuan);
// Hitung jumlah berdasarkan status
totalPengajuanMenunggu.value =
pengajuan.where((p) => p.status == StatusKelayakan.MENUNGGU).length;
totalPengajuanTerverifikasi.value = pengajuan
.where((p) => p.status == StatusKelayakan.TERVERIFIKASI)
.length;
totalPengajuanDitolak.value =
pengajuan.where((p) => p.status == StatusKelayakan.DITOLAK).length;
}
} catch (e) {
print('Error fetching pengajuan kelayakan: $e');
}
}
// Fungsi untuk mengambil data pengaduan
Future<void> fetchPengaduan() async {
try {
final response = await _supabaseService.client
.from('pengaduan')
.select('*')
.eq('pelapor', user!.id)
.order('created_at', ascending: false);
if (response != null) {
final List<PengaduanModel> pengaduanList = [];
for (var item in response) {
pengaduanList.add(PengaduanModel.fromJson(item));
}
pengaduan.assignAll(pengaduanList);
// Hitung jumlah berdasarkan status
totalPengaduan.value = pengaduanList.length;
totalPengaduanProses.value = pengaduanList
.where((p) => p.status == 'PROSES' || p.status == 'DIPROSES')
.length;
totalPengaduanSelesai.value =
pengaduanList.where((p) => p.status == 'SELESAI').length;
}
} catch (e) {
print('Error fetching pengaduan: $e');
}
}
// Fungsi untuk mengambil data notifikasi
Future<void> fetchNotifikasi() async {
try {
final response = await _supabaseService.client
.from('notifikasi')
.select('*')
.eq('user_id', user!.id)
.eq('dibaca', false)
.count();
jumlahNotifikasiBelumDibaca.value = response.count;
} catch (e) {
print('Error fetching notifikasi: $e');
jumlahNotifikasiBelumDibaca.value = 0;
}
}
// Navigasi ke halaman detail
void goToPenyaluranDetail() {
changeTab(1);