Perbarui model dan tampilan untuk mendukung perubahan struktur data pengguna. Ganti properti nama dan telepon dengan namaLengkap dan noHp di beberapa model, termasuk DonaturModel, PetugasDesaModel, dan WargaModel. Modifikasi tampilan dan controller untuk menggunakan properti baru ini. Tambahkan fungsionalitas baru untuk menampilkan nama lengkap dan nomor telepon dengan lebih baik di berbagai tampilan. Perbarui rute dan logika aplikasi untuk mencerminkan perubahan ini.

This commit is contained in:
Khafidh Fuadi
2025-03-25 10:43:21 +07:00
parent 54c4660302
commit 8e9553d1fc
39 changed files with 1819 additions and 704 deletions

View File

@ -1,24 +1,26 @@
import 'dart:convert';
class DonaturModel {
final String? id;
final String? nama;
final String id; // Primary key yang juga foreign key ke auth.users(id)
final String? namaLengkap;
final String? alamat;
final String? telepon;
final String? noHp;
final String? email;
final String? jenis;
final String? deskripsi;
final String? status;
final DateTime? createdAt;
final DateTime? updatedAt;
DonaturModel({
this.id,
this.nama,
required this.id,
this.namaLengkap,
this.alamat,
this.telepon,
this.noHp,
this.email,
this.jenis,
this.status,
this.deskripsi,
this.status = 'AKTIF',
this.createdAt,
this.updatedAt,
});
@ -30,11 +32,12 @@ class DonaturModel {
factory DonaturModel.fromJson(Map<String, dynamic> json) => DonaturModel(
id: json["id"],
nama: json["nama"],
namaLengkap: json["nama_lengkap"],
alamat: json["alamat"],
telepon: json["telepon"],
noHp: json["no_hp"],
email: json["email"],
jenis: json["jenis"],
deskripsi: json["deskripsi"],
status: json["status"] ?? 'AKTIF',
createdAt: json["created_at"] != null
? DateTime.parse(json["created_at"])
@ -46,13 +49,20 @@ class DonaturModel {
Map<String, dynamic> toJson() => {
"id": id,
"nama": nama,
"nama_lengkap": namaLengkap,
"alamat": alamat,
"telepon": telepon,
"no_hp": noHp,
"email": email,
"jenis": jenis,
"deskripsi": deskripsi,
"status": status ?? 'AKTIF',
"created_at": createdAt?.toIso8601String(),
"updated_at": updatedAt?.toIso8601String(),
};
// Helper method untuk mendapatkan nama yang ditampilkan
String get displayName => namaLengkap ?? 'Donatur';
// Getter untuk kompatibilitas dengan kode yang masih menggunakan nama
String? get nama => namaLengkap;
}

View File

@ -1,26 +1,31 @@
import 'dart:convert';
import 'package:penyaluran_app/app/data/models/desa_model.dart';
class PetugasDesaModel {
final String? id;
final String? nama;
final String? alamatLengkap;
final String? noTelp;
final String id; // Primary key yang juga foreign key ke auth.users(id)
final String? desaId;
final String? namaLengkap;
final String? alamat;
final String? noHp;
final String? email;
final String? jabatan;
final String? userId;
final String? nip;
final DateTime? createdAt;
final DateTime? updatedAt;
final DesaModel? desa;
PetugasDesaModel({
this.id,
this.nama,
this.alamatLengkap,
this.noTelp,
required this.id,
this.desaId,
this.namaLengkap,
this.alamat,
this.noHp,
this.email,
this.jabatan,
this.userId,
this.nip,
this.createdAt,
this.updatedAt,
this.desa,
});
factory PetugasDesaModel.fromRawJson(String str) =>
@ -28,32 +33,44 @@ class PetugasDesaModel {
String toRawJson() => json.encode(toJson());
factory PetugasDesaModel.fromJson(Map<String, dynamic> json) =>
PetugasDesaModel(
id: json["id"],
nama: json["nama"],
alamatLengkap: json["alamat_lengkap"],
noTelp: json["no_telp"],
email: json["email"],
jabatan: json["jabatan"],
userId: json["user_id"],
createdAt: json["created_at"] != null
? DateTime.parse(json["created_at"])
: null,
updatedAt: json["updated_at"] != null
? DateTime.parse(json["updated_at"])
: null,
);
factory PetugasDesaModel.fromJson(Map<String, dynamic> json) {
DesaModel? desa;
if (json["desa"] != null && json["desa"] is Map<String, dynamic>) {
desa = DesaModel.fromJson(json["desa"]);
}
return PetugasDesaModel(
id: json["id"],
desaId: json["desa_id"],
namaLengkap: json["nama_lengkap"],
alamat: json["alamat"],
noHp: json["no_hp"],
email: json["email"],
jabatan: json["jabatan"],
nip: json["nip"],
createdAt: json["created_at"] != null
? DateTime.parse(json["created_at"])
: null,
updatedAt: json["updated_at"] != null
? DateTime.parse(json["updated_at"])
: null,
desa: desa,
);
}
Map<String, dynamic> toJson() => {
"id": id,
"nama": nama,
"alamat_lengkap": alamatLengkap,
"no_telp": noTelp,
"desa_id": desaId,
"nama_lengkap": namaLengkap,
"alamat": alamat,
"no_hp": noHp,
"email": email,
"jabatan": jabatan,
"user_id": userId,
"nip": nip,
"created_at": createdAt?.toIso8601String(),
"updated_at": updatedAt?.toIso8601String(),
};
// Helper method untuk mendapatkan nama yang ditampilkan
String get displayName => namaLengkap ?? 'Petugas Desa';
}

View File

@ -101,20 +101,16 @@ class TindakanPengaduanModel {
// 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'];
if (petugas != null && petugas!['nama_lengkap'] != null) {
return petugas!['nama_lengkap'];
}
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'];
if (verifikator != null && verifikator!['nama_lengkap'] != null) {
return verifikator!['nama_lengkap'];
}
return 'Belum diverifikasi';
}

View File

@ -1,51 +1,58 @@
import 'package:penyaluran_app/app/data/models/desa_model.dart';
class UserModel {
// Model dasar untuk pengguna dengan informasi autentikasi umum
class BaseUserModel {
final String id;
final String email;
final String? name;
final String? avatar;
final String role;
final int? roleId;
final String roleName;
final bool isActive;
final DesaModel? desa;
final String? desaId;
final DateTime? lastLogin;
final DateTime? createdAt;
final DateTime? updatedAt;
final String? name;
final String? role;
final DesaModel? desa;
UserModel({
BaseUserModel({
required this.id,
required this.email,
this.name,
this.avatar,
required this.role,
this.roleId,
required this.roleName,
this.isActive = true,
this.desa,
this.desaId,
this.lastLogin,
this.createdAt,
this.updatedAt,
this.name,
this.role,
this.desa,
});
factory UserModel.fromJson(Map<String, dynamic> json) {
factory BaseUserModel.fromJson(Map<String, dynamic> json) {
// Pastikan id dan email tidak null
if (json['id'] == null || json['email'] == null) {
throw Exception('UserModel: id dan email tidak boleh null');
throw Exception('BaseUserModel: id dan email tidak boleh null');
}
// Parse desa jika ada
DesaModel? desaModel;
// Dapatkan roleName, default ke 'warga' jika tidak tersedia
String roleName = 'warga';
if (json['roles'] != null && json['roles']['role_name'] != null) {
roleName = json['roles']['role_name'];
} else if (json['role'] != null) {
roleName = json['role'];
}
// Parse desa data jika ada
DesaModel? desa;
if (json['desa'] != null && json['desa'] is Map<String, dynamic>) {
desaModel = DesaModel.fromJson(json['desa'] as Map<String, dynamic>);
desa = DesaModel.fromJson(json['desa']);
}
return UserModel(
return BaseUserModel(
id: json['id'],
email: json['email'],
name: json['name'],
avatar: json['avatar'],
desa: desaModel,
desaId: json['desa_id'],
role: json['role'] ?? 'WARGA',
roleId: json['role_id'],
roleName: roleName,
isActive: json['is_active'] ?? true,
lastLogin: json['last_login'] != null
? DateTime.parse(json['last_login'])
@ -56,6 +63,9 @@ class UserModel {
updatedAt: json['updated_at'] != null
? DateTime.parse(json['updated_at'])
: null,
name: json['name'],
role: roleName,
desa: desa,
);
}
@ -63,83 +73,25 @@ class UserModel {
return {
'id': id,
'email': email,
'name': name,
'avatar': avatar,
'desa_id': desaId,
'desa': desa?.toJson(),
'role': role,
'role_id': roleId,
'role': roleName,
'is_active': isActive,
'last_login': lastLogin?.toIso8601String(),
'created_at': createdAt?.toIso8601String(),
'updated_at': updatedAt?.toIso8601String(),
};
}
UserModel copyWith({
String? id,
String? email,
String? name,
String? avatar,
DesaModel? desa,
String? desaId,
String? role,
bool? isActive,
DateTime? lastLogin,
DateTime? createdAt,
DateTime? updatedAt,
}) {
return UserModel(
id: id ?? this.id,
email: email ?? this.email,
name: name ?? this.name,
avatar: avatar ?? this.avatar,
desa: desa ?? this.desa,
desaId: desaId ?? this.desaId,
role: role ?? this.role,
isActive: isActive ?? this.isActive,
lastLogin: lastLogin ?? this.lastLogin,
createdAt: createdAt ?? this.createdAt,
updatedAt: updatedAt ?? this.updatedAt,
);
}
}
class User {
final String? id;
final String? name;
final String? email;
final String? phone;
final String? role;
final String? token;
User({
this.id,
this.name,
this.email,
this.phone,
this.role,
this.token,
});
factory User.fromJson(Map<String, dynamic> json) {
return User(
id: json['id'],
name: json['name'],
email: json['email'],
phone: json['phone'],
role: json['role'],
token: json['token'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'email': email,
'phone': phone,
'role': role,
'token': token,
'desa': desa?.toJson(),
};
}
}
// Class untuk menampung data user lengkap (BaseUserModel + data spesifik role)
class UserData<T> {
final BaseUserModel baseUser;
final T roleData;
UserData({
required this.baseUser,
required this.roleData,
});
}

View File

@ -1,41 +1,44 @@
import 'dart:convert';
import 'package:penyaluran_app/app/data/models/desa_model.dart';
// warga == penerima bantuan
class WargaModel {
final String? id;
final String? nama;
final String? nik;
final String id; // Primary key yang juga foreign key ke auth.users(id)
final String? desaId;
final String? namaLengkap;
final String? alamat;
final String? desa;
final String? kecamatan;
final String? kabupaten;
final String? provinsi;
final String? telepon;
final String? noHp;
final String? email;
final String? nik;
final String? tempatLahir;
final DateTime? tanggalLahir;
final String? jenisKelamin;
final String? agama;
final String? kategoriEkonomi;
final String? status;
final String? catatan;
final String? kategori; // Contoh: 'lansia', 'disabilitas', 'miskin', dll
final String? status; // Contoh: 'AKTIF', 'NONAKTIF'
final String? lokasiPenyaluranId; // Referensi ke LokasiPenyaluran
final DateTime? createdAt;
final DateTime? updatedAt;
final DesaModel? desa;
WargaModel({
this.id,
this.nama,
this.nik,
required this.id,
this.desaId,
this.namaLengkap,
this.alamat,
this.desa,
this.kecamatan,
this.kabupaten,
this.provinsi,
this.telepon,
this.noHp,
this.email,
this.nik,
this.tempatLahir,
this.tanggalLahir,
this.jenisKelamin,
this.agama,
this.kategoriEkonomi,
this.status = 'AKTIF',
this.catatan,
this.kategori,
this.status,
this.lokasiPenyaluranId,
this.createdAt,
this.updatedAt,
this.desa,
});
factory WargaModel.fromRawJson(String str) =>
@ -43,45 +46,58 @@ class WargaModel {
String toRawJson() => json.encode(toJson());
factory WargaModel.fromJson(Map<String, dynamic> json) => WargaModel(
id: json["id"],
nama: json["nama"],
nik: json["nik"],
alamat: json["alamat"],
desa: json["desa"],
kecamatan: json["kecamatan"],
kabupaten: json["kabupaten"],
provinsi: json["provinsi"],
telepon: json["telepon"] ?? json["no_telp"],
email: json["email"],
catatan: json["catatan"],
kategori: json["kategori"],
status: json["status"],
lokasiPenyaluranId: json["lokasi_penyaluran_id"],
createdAt: json["created_at"] != null
? DateTime.parse(json["created_at"])
: null,
updatedAt: json["updated_at"] != null
? DateTime.parse(json["updated_at"])
: null,
);
factory WargaModel.fromJson(Map<String, dynamic> json) {
DesaModel? desa;
if (json["desa"] != null && json["desa"] is Map<String, dynamic>) {
desa = DesaModel.fromJson(json["desa"]);
}
return WargaModel(
id: json["id"],
desaId: json["desa_id"],
namaLengkap: json["nama_lengkap"],
alamat: json["alamat"],
noHp: json["no_hp"],
email: json["email"],
nik: json["nik"],
tempatLahir: json["tempat_lahir"],
tanggalLahir: json["tanggal_lahir"] != null
? DateTime.parse(json["tanggal_lahir"])
: null,
jenisKelamin: json["jenis_kelamin"],
agama: json["agama"],
kategoriEkonomi: json["kategori_ekonomi"],
status: json["status"] ?? 'AKTIF',
catatan: json["catatan"],
createdAt: json["created_at"] != null
? DateTime.parse(json["created_at"])
: null,
updatedAt: json["updated_at"] != null
? DateTime.parse(json["updated_at"])
: null,
desa: desa,
);
}
Map<String, dynamic> toJson() => {
"id": id,
"nama": nama,
"nik": nik,
"desa_id": desaId,
"nama_lengkap": namaLengkap,
"alamat": alamat,
"desa": desa,
"kecamatan": kecamatan,
"kabupaten": kabupaten,
"provinsi": provinsi,
"telepon": telepon,
"no_hp": noHp,
"email": email,
"catatan": catatan,
"kategori": kategori,
"nik": nik,
"tempat_lahir": tempatLahir,
"tanggal_lahir": tanggalLahir?.toIso8601String(),
"jenis_kelamin": jenisKelamin,
"agama": agama,
"kategori_ekonomi": kategoriEkonomi,
"status": status,
"lokasi_penyaluran_id": lokasiPenyaluranId,
"catatan": catatan,
"created_at": createdAt?.toIso8601String(),
"updated_at": updatedAt?.toIso8601String(),
};
// Helper method untuk mendapatkan nama yang ditampilkan
String get displayName => namaLengkap ?? 'Warga';
}