Perbarui model dan tampilan untuk mendukung status penyaluran dalam aplikasi. Tambahkan properti statusPenyaluran pada PenerimaPenyaluranModel dan SkemaBantuanModel. Modifikasi tampilan di BantuanCard dan StatusBadge untuk menampilkan status penyaluran dengan lebih baik. Hapus penggunaan prioritas di beberapa model dan tampilan untuk menyederhanakan kode. Implementasikan logika baru di JadwalPenyaluranController untuk memperbarui stok bantuan berdasarkan jumlah yang diterima.
This commit is contained in:
@ -110,33 +110,37 @@ class WargaDashboardController extends GetxController {
|
||||
),
|
||||
penyaluran_bantuan:penyaluran_bantuan_id(
|
||||
*,
|
||||
lokasi_penyaluran(*)
|
||||
lokasi_penyaluran(*),
|
||||
kategori_bantuan(*)
|
||||
)
|
||||
''').eq('warga_id', wargaId).order('created_at', ascending: false);
|
||||
|
||||
final List<PenerimaPenyaluranModel> penerima = [];
|
||||
|
||||
// Loop melalui setiap data penerima
|
||||
for (var item in response) {
|
||||
// Pastikan data penerima sesuai dengan tipe data yang diharapkan
|
||||
Map<String, dynamic> sanitizedPenerimaData =
|
||||
Map<String, dynamic>.from(item);
|
||||
|
||||
// Konversi jumlah_bantuan ke double jika bertipe String
|
||||
if (sanitizedPenerimaData['jumlah_bantuan'] is String) {
|
||||
var jumlahBantuan = double.tryParse(
|
||||
sanitizedPenerimaData['jumlah_bantuan'] as String);
|
||||
sanitizedPenerimaData['jumlah_bantuan'] = jumlahBantuan;
|
||||
sanitizedPenerimaData['jumlah_bantuan'] =
|
||||
double.tryParse(sanitizedPenerimaData['jumlah_bantuan']) ?? 0.0;
|
||||
}
|
||||
|
||||
// Tambahkan informasi apakah bantuan uang atau bukan dan satuan
|
||||
// Ambil data dari stok bantuan jika tersedia
|
||||
if (sanitizedPenerimaData['stok_bantuan'] != null) {
|
||||
// Cek apakah bantuan uang
|
||||
// Cek apakah bantuan berupa uang atau barang
|
||||
final isUang =
|
||||
sanitizedPenerimaData['stok_bantuan']['is_uang'] ?? false;
|
||||
sanitizedPenerimaData['is_uang'] = isUang;
|
||||
|
||||
// Ambil satuan
|
||||
// Ambil satuan bantuan
|
||||
final satuan = sanitizedPenerimaData['stok_bantuan']['satuan'] ?? '';
|
||||
sanitizedPenerimaData['satuan'] = satuan;
|
||||
|
||||
// Ambil nama kategori bantuan jika tersedia
|
||||
// Ambil nama kategori bantuan
|
||||
if (sanitizedPenerimaData['stok_bantuan']['kategori_bantuan'] !=
|
||||
null) {
|
||||
final kategoriNama = sanitizedPenerimaData['stok_bantuan']
|
||||
@ -146,7 +150,7 @@ class WargaDashboardController extends GetxController {
|
||||
}
|
||||
}
|
||||
|
||||
// Tambahkan informasi dari penyaluran bantuan
|
||||
// Ambil data dari penyaluran bantuan jika tersedia
|
||||
if (sanitizedPenerimaData['penyaluran_bantuan'] != null) {
|
||||
// Ambil nama penyaluran
|
||||
final namaPenyaluran =
|
||||
@ -158,6 +162,11 @@ class WargaDashboardController extends GetxController {
|
||||
sanitizedPenerimaData['penyaluran_bantuan']['deskripsi'] ?? '';
|
||||
sanitizedPenerimaData['deskripsi_penyaluran'] = deskripsiPenyaluran;
|
||||
|
||||
// Ambil status penyaluran
|
||||
final statusPenyaluran =
|
||||
sanitizedPenerimaData['penyaluran_bantuan']['status'] ?? '';
|
||||
sanitizedPenerimaData['status_penyaluran'] = statusPenyaluran;
|
||||
|
||||
// Ambil lokasi penyaluran jika tersedia
|
||||
if (sanitizedPenerimaData['penyaluran_bantuan']
|
||||
['lokasi_penyaluran'] !=
|
||||
@ -172,6 +181,19 @@ class WargaDashboardController extends GetxController {
|
||||
'';
|
||||
sanitizedPenerimaData['lokasi_penyaluran_alamat'] = lokasiAlamat;
|
||||
}
|
||||
|
||||
// Ambil kategori bantuan dari relasi langsung jika ada
|
||||
if (sanitizedPenerimaData['penyaluran_bantuan']['kategori_bantuan'] !=
|
||||
null) {
|
||||
final kategoriNama = sanitizedPenerimaData['penyaluran_bantuan']
|
||||
['kategori_bantuan']['nama'] ??
|
||||
'';
|
||||
// Jika belum ada kategori_nama dari stok_bantuan, gunakan dari relasi langsung
|
||||
if (sanitizedPenerimaData['kategori_nama'] == null ||
|
||||
sanitizedPenerimaData['kategori_nama'].isEmpty) {
|
||||
sanitizedPenerimaData['kategori_nama'] = kategoriNama;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var model = PenerimaPenyaluranModel.fromJson(sanitizedPenerimaData);
|
||||
@ -396,4 +418,74 @@ class WargaDashboardController extends GetxController {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Metode untuk menambahkan pengaduan baru
|
||||
Future<bool> addPengaduan({
|
||||
required String judul,
|
||||
required String deskripsi,
|
||||
required String penerimaPenyaluranId,
|
||||
List<String> fotoPengaduanPaths = const [],
|
||||
}) async {
|
||||
try {
|
||||
isLoading.value = true;
|
||||
|
||||
// Cari warga_id berdasarkan user_id
|
||||
final wargaData = await _supabaseService.getWargaByUserId();
|
||||
if (wargaData == null) {
|
||||
throw Exception('Data warga tidak ditemukan');
|
||||
}
|
||||
|
||||
final String wargaId = wargaData['id'];
|
||||
|
||||
// Upload foto pengaduan jika ada
|
||||
List<String> fotoPengaduanUrls = [];
|
||||
if (fotoPengaduanPaths.isNotEmpty) {
|
||||
fotoPengaduanUrls = await _supabaseService.uploadMultipleFiles(
|
||||
fotoPengaduanPaths, 'pengaduan', 'foto_pengaduan') ??
|
||||
[];
|
||||
}
|
||||
|
||||
// Buat objek pengaduan
|
||||
final Map<String, dynamic> pengaduanData = {
|
||||
'judul': judul,
|
||||
'deskripsi': deskripsi,
|
||||
'status': 'MENUNGGU',
|
||||
'warga_id': wargaId,
|
||||
'penerima_penyaluran_id': penerimaPenyaluranId,
|
||||
'foto_pengaduan': fotoPengaduanUrls,
|
||||
'tanggal_pengaduan': DateTime.now().toIso8601String(),
|
||||
'created_at': DateTime.now().toIso8601String(),
|
||||
'updated_at': DateTime.now().toIso8601String(),
|
||||
};
|
||||
|
||||
// Simpan pengaduan ke Supabase
|
||||
await _supabaseService.client.from('pengaduan').insert(pengaduanData);
|
||||
|
||||
// Refresh data pengaduan
|
||||
await fetchPengaduan();
|
||||
|
||||
Get.snackbar(
|
||||
'Berhasil',
|
||||
'Pengaduan berhasil dibuat dan akan segera diproses',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
backgroundColor: Colors.green,
|
||||
colorText: Colors.white,
|
||||
duration: const Duration(seconds: 3),
|
||||
);
|
||||
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('Error membuat pengaduan: $e');
|
||||
Get.snackbar(
|
||||
'Error',
|
||||
'Gagal membuat pengaduan: ${e.toString()}',
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
backgroundColor: Colors.red,
|
||||
colorText: Colors.white,
|
||||
);
|
||||
return false;
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -916,36 +916,12 @@ class WargaDetailPengaduanView extends GetView<WargaDashboardController> {
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
// Prioritas tindakan (jika ada)
|
||||
if (tindakan.prioritas != null) ...[
|
||||
const SizedBox(height: 8),
|
||||
// Menggunakan StatusPill untuk prioritas tindakan
|
||||
StatusPill(
|
||||
status: tindakan.prioritasText,
|
||||
backgroundColor: _getPriorityColor(tindakan.prioritas),
|
||||
textColor: Colors.white,
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Color _getPriorityColor(String? priority) {
|
||||
switch (priority) {
|
||||
case 'TINGGI':
|
||||
return Colors.red;
|
||||
case 'SEDANG':
|
||||
return Colors.orange;
|
||||
case 'RENDAH':
|
||||
return Colors.green;
|
||||
default:
|
||||
return Colors.grey;
|
||||
}
|
||||
}
|
||||
|
||||
void showFullScreenImage(BuildContext context, String imageUrl) {
|
||||
// Buat controller untuk InteractiveViewer
|
||||
final TransformationController transformationController =
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:penyaluran_app/app/modules/warga/controllers/warga_dashboard_controller.dart';
|
||||
import 'package:penyaluran_app/app/widgets/bantuan_card.dart';
|
||||
import 'package:penyaluran_app/app/theme/app_theme.dart';
|
||||
|
||||
class WargaPenerimaanView extends GetView<WargaDashboardController> {
|
||||
const WargaPenerimaanView({super.key});
|
||||
@ -23,15 +24,6 @@ class WargaPenerimaanView extends GetView<WargaDashboardController> {
|
||||
: _buildPenerimaanList(),
|
||||
);
|
||||
}),
|
||||
floatingActionButton: FloatingActionButton(
|
||||
onPressed: () {
|
||||
// Navigasi ke halaman riwayat penerimaan
|
||||
Get.toNamed('/riwayat-penyaluran');
|
||||
},
|
||||
backgroundColor: Colors.blue,
|
||||
tooltip: 'Riwayat Penerimaan',
|
||||
child: const Icon(Icons.history),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -43,13 +35,13 @@ class WargaPenerimaanView extends GetView<WargaDashboardController> {
|
||||
Container(
|
||||
padding: const EdgeInsets.all(20),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.blue.withOpacity(0.1),
|
||||
color: AppTheme.primaryColor.withOpacity(0.1),
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: Icon(
|
||||
Icons.volunteer_activism,
|
||||
size: 80,
|
||||
color: Colors.blue.shade400,
|
||||
color: AppTheme.primaryColor,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
@ -82,6 +74,8 @@ class WargaPenerimaanView extends GetView<WargaDashboardController> {
|
||||
label: const Text('Muat Ulang'),
|
||||
style: ElevatedButton.styleFrom(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12),
|
||||
backgroundColor: AppTheme.primaryColor,
|
||||
foregroundColor: Colors.white,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
|
@ -30,13 +30,13 @@ class WargaPengaduanView extends GetView<WargaDashboardController> {
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Icon(
|
||||
Icons.report_problem,
|
||||
Icons.check_circle_outline,
|
||||
size: 80,
|
||||
color: Colors.grey.shade400,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
Text(
|
||||
'Belum Ada Pengaduan',
|
||||
'Bagus!',
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.bold,
|
||||
@ -45,27 +45,12 @@ class WargaPengaduanView extends GetView<WargaDashboardController> {
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Text(
|
||||
'Anda belum membuat pengaduan',
|
||||
'Belum ada pengaduan yang dibuat',
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
color: Colors.grey.shade600,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
ElevatedButton.icon(
|
||||
onPressed: () {
|
||||
// TODO: Implementasi navigasi ke halaman buat pengaduan
|
||||
Get.toNamed('/buat-pengaduan');
|
||||
},
|
||||
icon: const Icon(Icons.add),
|
||||
label: const Text('Buat Pengaduan Baru'),
|
||||
style: ElevatedButton.styleFrom(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 24,
|
||||
vertical: 12,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
@ -108,16 +108,6 @@ class WargaView extends GetView<WargaDashboardController> {
|
||||
badgeColor: Colors.orange,
|
||||
onTap: () => controller.changeTab(2),
|
||||
),
|
||||
DrawerMenuItem(
|
||||
icon: Icons.assignment_outlined,
|
||||
title: 'Pengajuan Kelayakan',
|
||||
onTap: () {
|
||||
// TODO: Navigasi ke halaman pengajuan kelayakan
|
||||
Get.toNamed('/pengajuan-kelayakan');
|
||||
},
|
||||
badgeCount: controller.totalPengajuanMenunggu.value,
|
||||
badgeColor: Colors.blue,
|
||||
),
|
||||
],
|
||||
)),
|
||||
body: Obx(() {
|
||||
@ -161,20 +151,6 @@ class WargaView extends GetView<WargaDashboardController> {
|
||||
),
|
||||
],
|
||||
)),
|
||||
floatingActionButton: Obx(() {
|
||||
// Tampilkan FAB hanya di halaman pengaduan
|
||||
if (controller.activeTabIndex.value == 2) {
|
||||
return FloatingActionButton(
|
||||
onPressed: () {
|
||||
// TODO: Implementasi navigasi ke halaman buat pengaduan
|
||||
Get.toNamed('/buat-pengaduan');
|
||||
},
|
||||
backgroundColor: AppTheme.primaryColor,
|
||||
child: const Icon(Icons.add),
|
||||
);
|
||||
}
|
||||
return const SizedBox.shrink();
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user