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:
@ -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);
|
||||
|
Reference in New Issue
Block a user