Tambahkan dependensi baru timeline_tile versi 2.0.0 ke dalam pubspec.yaml dan pubspec.lock. Perbarui model PengaduanModel dan TindakanPengaduanModel untuk mendukung struktur data yang lebih kompleks, termasuk penambahan properti baru. Modifikasi PengaduanController untuk menggunakan metode baru dalam mengambil data pengaduan dengan detail penerima penyaluran. Perbarui tampilan di PengaduanView untuk meningkatkan pengalaman pengguna dengan menampilkan informasi penyaluran bantuan yang lebih lengkap.

This commit is contained in:
Khafidh Fuadi
2025-03-16 22:15:45 +07:00
parent 76b167c65c
commit c9587758c6
20 changed files with 3572 additions and 368 deletions

View File

@ -5,26 +5,28 @@ class PengaduanModel {
final String? judul;
final String? deskripsi;
final String? status;
final String? kategori;
final String? pelapor;
final String? kontakPelapor;
final List<String>? gambarUrls;
final String? wargaId;
final List<dynamic>? fotoPengaduan;
final String? penerimaPenyaluranId;
final DateTime? tanggalPengaduan;
final DateTime? createdAt;
final DateTime? updatedAt;
final Map<String, dynamic>? penerimaPenyaluran;
final Map<String, dynamic>? warga;
PengaduanModel({
this.id,
this.judul,
this.deskripsi,
this.status,
this.kategori,
this.pelapor,
this.kontakPelapor,
this.gambarUrls,
this.wargaId,
this.fotoPengaduan,
this.penerimaPenyaluranId,
this.tanggalPengaduan,
this.createdAt,
this.updatedAt,
this.penerimaPenyaluran,
this.warga,
});
factory PengaduanModel.fromRawJson(String str) =>
@ -37,12 +39,9 @@ class PengaduanModel {
judul: json["judul"],
deskripsi: json["deskripsi"],
status: json["status"],
kategori: json["kategori"],
pelapor: json["pelapor"],
kontakPelapor: json["kontak_pelapor"],
gambarUrls: json["gambar_urls"] == null
? null
: List<String>.from(json["gambar_urls"].map((x) => x)),
wargaId: json["warga_id"],
fotoPengaduan: json["foto_pengaduan"],
penerimaPenyaluranId: json["penerima_penyaluran_id"],
tanggalPengaduan: json["tanggal_pengaduan"] != null
? DateTime.parse(json["tanggal_pengaduan"])
: null,
@ -52,6 +51,8 @@ class PengaduanModel {
updatedAt: json["updated_at"] != null
? DateTime.parse(json["updated_at"])
: null,
penerimaPenyaluran: json["penerima_penyaluran"],
warga: json["warga"],
);
Map<String, dynamic> toJson() => {
@ -59,14 +60,47 @@ class PengaduanModel {
"judul": judul,
"deskripsi": deskripsi,
"status": status,
"kategori": kategori,
"pelapor": pelapor,
"kontak_pelapor": kontakPelapor,
"gambar_urls": gambarUrls == null
? null
: List<dynamic>.from(gambarUrls!.map((x) => x)),
"warga_id": wargaId,
"foto_pengaduan": fotoPengaduan,
"penerima_penyaluran_id": penerimaPenyaluranId,
"tanggal_pengaduan": tanggalPengaduan?.toIso8601String(),
"created_at": createdAt?.toIso8601String(),
"updated_at": updatedAt?.toIso8601String(),
"penerima_penyaluran": penerimaPenyaluran,
"warga": warga,
};
// Getter untuk mendapatkan informasi penyaluran bantuan
Map<String, dynamic>? get penyaluranBantuan {
return penerimaPenyaluran?['penyaluran_bantuan'];
}
// Getter untuk mendapatkan informasi stok bantuan
Map<String, dynamic>? get stokBantuan {
return penerimaPenyaluran?['stok_bantuan'];
}
// Getter untuk mendapatkan nama penyaluran
String get namaPenyaluran {
return penyaluranBantuan?['nama'] ?? 'Tidak ada data';
}
// Getter untuk mendapatkan deskripsi penyaluran
String get deskripsiPenyaluran {
return penyaluranBantuan?['deskripsi'] ?? 'Tidak ada deskripsi';
}
// Getter untuk mendapatkan jenis bantuan
String get jenisBantuan {
return stokBantuan?['kategori_bantuan']?['nama'] ?? 'Tidak diketahui';
}
// Getter untuk mendapatkan jumlah bantuan yang diterima
String get jumlahBantuan {
final jumlah = penerimaPenyaluran?['jumlah_bantuan'];
final satuan = penerimaPenyaluran?['satuan'] ?? '';
if (jumlah == null) return 'Tidak diketahui';
return '$jumlah $satuan';
}
}

View File

@ -5,22 +5,46 @@ class TindakanPengaduanModel {
final String? pengaduanId;
final String? tindakan;
final String? catatan;
final String? status;
final String? statusTindakan; // PROSES, SELESAI
final String? prioritas; // RENDAH, SEDANG, TINGGI
final String? kategoriTindakan; // Kategori tindakan enum
final String? petugasId;
final String? verifikatorId;
final String? hasilTindakan;
final List<dynamic>? buktiTindakan;
final DateTime? estimasiSelesai;
final DateTime? tanggalTindakan;
final DateTime? tanggalVerifikasi;
final DateTime? createdAt;
final DateTime? updatedAt;
final double? biayaTindakan;
final String? feedbackWarga;
final int? ratingWarga;
final Map<String, dynamic>? petugas; // Data petugas yang melakukan tindakan
final Map<String, dynamic>? verifikator; // Data petugas yang memverifikasi
TindakanPengaduanModel({
this.id,
this.pengaduanId,
this.tindakan,
this.catatan,
this.status,
this.statusTindakan,
this.prioritas,
this.kategoriTindakan,
this.petugasId,
this.verifikatorId,
this.hasilTindakan,
this.buktiTindakan,
this.estimasiSelesai,
this.tanggalTindakan,
this.tanggalVerifikasi,
this.createdAt,
this.updatedAt,
this.biayaTindakan,
this.feedbackWarga,
this.ratingWarga,
this.petugas,
this.verifikator,
});
factory TindakanPengaduanModel.fromRawJson(String str) =>
@ -34,17 +58,35 @@ class TindakanPengaduanModel {
pengaduanId: json["pengaduan_id"],
tindakan: json["tindakan"],
catatan: json["catatan"],
status: json["status"],
statusTindakan: json["status_tindakan"],
prioritas: json["prioritas"],
kategoriTindakan: json["kategori_tindakan"],
petugasId: json["petugas_id"],
verifikatorId: json["verifikator_id"],
hasilTindakan: json["hasil_tindakan"],
buktiTindakan: json["bukti_tindakan"],
estimasiSelesai: json["estimasi_selesai"] != null
? DateTime.parse(json["estimasi_selesai"])
: null,
tanggalTindakan: json["tanggal_tindakan"] != null
? DateTime.parse(json["tanggal_tindakan"])
: null,
tanggalVerifikasi: json["tanggal_verifikasi"] != null
? DateTime.parse(json["tanggal_verifikasi"])
: null,
createdAt: json["created_at"] != null
? DateTime.parse(json["created_at"])
: null,
updatedAt: json["updated_at"] != null
? DateTime.parse(json["updated_at"])
: null,
biayaTindakan: json["biaya_tindakan"] != null
? double.parse(json["biaya_tindakan"].toString())
: null,
feedbackWarga: json["feedback_warga"],
ratingWarga: json["rating_warga"],
petugas: json["petugas"],
verifikator: json["verifikator"],
);
Map<String, dynamic> toJson() => {
@ -52,10 +94,79 @@ class TindakanPengaduanModel {
"pengaduan_id": pengaduanId,
"tindakan": tindakan,
"catatan": catatan,
"status": status,
"status_tindakan": statusTindakan,
"prioritas": prioritas,
"kategori_tindakan": kategoriTindakan,
"petugas_id": petugasId,
"verifikator_id": verifikatorId,
"hasil_tindakan": hasilTindakan,
"bukti_tindakan": buktiTindakan,
"estimasi_selesai": estimasiSelesai?.toIso8601String(),
"tanggal_tindakan": tanggalTindakan?.toIso8601String(),
"tanggal_verifikasi": tanggalVerifikasi?.toIso8601String(),
"created_at": createdAt?.toIso8601String(),
"updated_at": updatedAt?.toIso8601String(),
"biaya_tindakan": biayaTindakan,
"feedback_warga": feedbackWarga,
"rating_warga": ratingWarga,
"petugas": petugas,
"verifikator": verifikator,
};
// Getter untuk mendapatkan nama petugas
String get namaPetugas {
if (petugas != null && petugas!['nama'] != null) {
return petugas!['nama'];
} else if (petugas != null && petugas!['name'] != null) {
return petugas!['name'];
}
return 'Petugas';
}
// Getter untuk mendapatkan nama verifikator
String get namaVerifikator {
if (verifikator != null && verifikator!['nama'] != null) {
return verifikator!['nama'];
} else if (verifikator != null && verifikator!['name'] != null) {
return verifikator!['name'];
}
return 'Belum diverifikasi';
}
// Getter untuk mendapatkan status tindakan yang lebih user-friendly
String get statusTindakanText {
switch (statusTindakan) {
case 'PROSES':
return 'Dalam Proses';
case 'SELESAI':
return 'Selesai';
default:
return statusTindakan ?? 'Tidak Diketahui';
}
}
// Getter untuk mendapatkan prioritas yang lebih user-friendly
String get prioritasText {
switch (prioritas) {
case 'RENDAH':
return 'Prioritas Rendah';
case 'SEDANG':
return 'Prioritas Sedang';
case 'TINGGI':
return 'Prioritas Tinggi';
default:
return prioritas ?? 'Tidak Diketahui';
}
}
// Getter untuk mendapatkan kategori tindakan yang lebih user-friendly
String get kategoriTindakanText {
if (kategoriTindakan == null) return 'Tidak Diketahui';
// Mengubah format SNAKE_CASE menjadi Title Case
return kategoriTindakan!
.split('_')
.map((word) => word[0].toUpperCase() + word.substring(1).toLowerCase())
.join(' ');
}
}