Compare commits

...

14 Commits

Author SHA1 Message Date
d6abc163fb Merge pull request 'upd: tambah satuan' (#115) from amalia/06-feb-26 into main
Reviewed-on: http://wibugit.wibudev.com/wibu/jenna-mcp/pulls/115
2026-02-06 17:46:25 +08:00
9c08980bf1 upd: tambah satuan
Deskripsi:
- satuan luas tempat usaha
- satuan pendapatan perbulan
- pada tambah, edit, detail surat

No Issues
2026-02-06 14:39:58 +08:00
a2af3fbe36 Merge pull request 'upd: form tambah surat' (#114) from amalia/21-jan-26 into main
Reviewed-on: http://wibugit.wibudev.com/wibu/jenna-mcp/pulls/114
2026-01-21 11:55:14 +08:00
ec8722ffba upd: form tambah surat
Deskripsi:
- fix select jenis surat pada saat selesai input

No Issue
2026-01-21 09:02:25 +08:00
b0752dac8d Merge pull request 'amalia/20-jan-26' (#113) from amalia/20-jan-26 into main
Reviewed-on: http://wibugit.wibudev.com/wibu/jenna-mcp/pulls/113
2026-01-20 17:28:34 +08:00
a8d3a3a9ff fix: pelayanan surat
Deskripsi:
- mandatory pada form tambah pelayanan surat
- mandatory pada form update pelayanan surat

No Issues
2026-01-20 17:15:16 +08:00
f86703e7d1 rev: button cancel
Deskripsi:
- tambah button clear pada form file tambah pengajuan surat
- tambah button clear pada form file update data pengajuan surat

NO Issues
2026-01-20 10:48:37 +08:00
d8bb33cc93 Merge pull request 'amalia/15-jan-26' (#112) from amalia/15-jan-26 into main
Reviewed-on: http://wibugit.wibudev.com/wibu/jenna-mcp/pulls/112
2026-01-15 14:33:16 +08:00
5807e98069 fix: tambah pengajuan surat pengantar skck
Deskripsi:
- link nya

No Issues
2026-01-15 14:32:28 +08:00
59b4f1d73f fix: surat keterangan kelahiran
Deskripsi:
- update value tanggal_lahir_ayah

No Issues
2026-01-15 14:19:05 +08:00
8bd552ac22 fix: pelayanan surat
Deskripsi:
- link surat

NO Issues
2026-01-15 14:09:32 +08:00
5d48d06513 Merge pull request 'fix : error surat' (#111) from amalia/15-jan-26 into main
Reviewed-on: http://wibugit.wibudev.com/wibu/jenna-mcp/pulls/111
2026-01-15 11:54:25 +08:00
3da163ea1d fix : error surat 2026-01-15 11:53:10 +08:00
57e4f34eb6 Merge pull request 'amalia/14-jan-26' (#110) from amalia/14-jan-26 into main
Reviewed-on: http://wibugit.wibudev.com/wibu/jenna-mcp/pulls/110
2026-01-14 17:43:11 +08:00
8 changed files with 371 additions and 344 deletions

View File

@@ -23,7 +23,7 @@ export default function ModalSurat({
surat, surat,
}: { }: {
open: boolean; open: boolean;
onClose: (val: any) => void; onClose: (val: { success: boolean, data: string }) => void;
surat: string; surat: string;
}) { }) {
const A4Style = { const A4Style = {
@@ -35,7 +35,7 @@ export default function ModalSurat({
fontSize: "14px", fontSize: "14px",
fontFamily: "Times New Roman", fontFamily: "Times New Roman",
}; };
const [uploading, setUploading] = useState<{ text: "Menyiapkan" | "Mengupload" | "Selesai", value: number }>({ text: "Menyiapkan", value: 10 }) const [uploading, setUploading] = useState<{ text: "Menyiapkan" | "Mengupload" | "Selesai" | "Gagal", value: number }>({ text: "Menyiapkan", value: 10 })
const hiddenRef = useRef<any>(null); const hiddenRef = useRef<any>(null);
const { data, mutate, isLoading } = useSWR("surat", () => const { data, mutate, isLoading } = useSWR("surat", () =>
apiFetch.api.surat.detail.get({ apiFetch.api.surat.detail.get({
@@ -45,6 +45,7 @@ export default function ModalSurat({
}), }),
); );
useShallowEffect(() => { useShallowEffect(() => {
mutate(); mutate();
}, []); }, []);
@@ -95,9 +96,21 @@ export default function ModalSurat({
filename: resImg.data?.filename!, filename: resImg.data?.filename!,
}); });
setUploading({ text: "Selesai", value: 100 }); if (resUpdate?.data?.success) {
setUploading({ text: "Selesai", value: 100 });
setTimeout(() => {
onClose({ success: true, data: resUpdate.data?.link });
}, 1000)
} else {
setUploading({ text: "Gagal", value: 100 });
setTimeout(() => {
onClose({ success: false, data: "" });
}, 1000)
}
} else {
setUploading({ text: "Gagal", value: 100 });
setTimeout(() => { setTimeout(() => {
onClose(resUpdate.data?.link); onClose({ success: false, data: "" });
}, 1000) }, 1000)
} }
@@ -110,7 +123,7 @@ export default function ModalSurat({
if (open) { if (open) {
setTimeout(() => { setTimeout(() => {
uploadPdf(); uploadPdf();
}, 5000); }, 3000);
} }
}, [surat, open]); }, [surat, open]);

View File

@@ -7,7 +7,7 @@ export default function SKKelahiran({ data }: { data: any }) {
const getValue = (jenis: string) => const getValue = (jenis: string) =>
_.upperFirst( _.upperFirst(
data.surat.dataText.find((item: any) => item.jenis === jenis)?.value || data.surat.dataText.find((item: any) => item.jenis === jenis)?.value ||
"", "",
); );
const loadImage = async () => { const loadImage = async () => {
@@ -161,7 +161,7 @@ export default function SKKelahiran({ data }: { data: any }) {
<tr> <tr>
<td>Tempat & Tanggal Lahir</td> <td>Tempat & Tanggal Lahir</td>
<td>:</td> <td>:</td>
<td>{`${getValue("tempat_lahir_ayah")}, ${"tanggal_lahir_ayah"}`}</td> <td>{`${getValue("tempat_lahir_ayah")}, ${getValue("tanggal_lahir_ayah")}`}</td>
</tr> </tr>
<tr> <tr>
<td>Pekerjaan</td> <td>Pekerjaan</td>

View File

@@ -90,7 +90,7 @@ export default function SKTempatUsaha({ data }: { data: any }) {
<Row label="Bidang Usaha" value={getValue("bidang_usaha")} /> <Row label="Bidang Usaha" value={getValue("bidang_usaha")} />
<Row label="Alamat Usaha" value={getValue("alamat_usaha")} /> <Row label="Alamat Usaha" value={getValue("alamat_usaha")} />
<Row label="Status Tempat Usaha" value={getValue("status_tempat")} /> <Row label="Status Tempat Usaha" value={getValue("status_tempat")} />
<Row label="Luas Tempat Usaha" value={getValue("luas_usaha")} /> <Row label="Luas Tempat Usaha" value={getValue("luas_usaha") + " m2"} />
<Row label="Jumlah Karyawan" value={getValue("jumlah_karyawan")} /> <Row label="Jumlah Karyawan" value={getValue("jumlah_karyawan")} />
</div> </div>

View File

@@ -8,472 +8,377 @@ export const categoryPelayananSurat = [
{ {
key: "pengantar_kelian", key: "pengantar_kelian",
name: "Pengantar Kelian", name: "Pengantar Kelian",
desc: "Surat Pengantar Kelian Banjar Dinas di Wilayah Masing-masing" desc: "Surat Pengantar Kelian Banjar Dinas di Wilayah Masing-masing",
required: true, satuan: null
}, },
{ {
key: "ktp_kk", key: "ktp_kk",
name: "KTP / KK", name: "KTP / KK",
desc: "Fotokopi KTP atau Kartu Keluarga" desc: "Fotokopi KTP atau Kartu Keluarga",
required: true, satuan: null
}, },
{ {
key: "dokumen_beda", key: "dokumen_beda",
name: "Dokumen Pendukung", name: "Dokumen Pendukung",
desc: "Fotokopi dokumen yang terdapat perbedaan biodata (ijazah, sertifikat, dll)" desc: "Fotokopi dokumen yang terdapat perbedaan biodata (ijazah, sertifikat, dll)",
required: true, satuan: null
} }
], ],
dataText: [], dataText: [],
dataPelengkap: [ dataPelengkap: [
{ key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number" }, { key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number", required: true, satuan: null },
{ key: "nama", name: "Nama Lengkap", desc: "Nama sesuai KTP", type: "text" }, { key: "nama", name: "Nama Lengkap", desc: "Nama sesuai KTP", type: "text", required: true, satuan: null },
{ key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir pemohon", type: "text" }, { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir pemohon", type: "text", required: true, satuan: null },
{ key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir pemohon", type: "date" }, { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir pemohon", type: "date", required: true, satuan: null },
{ {
key: "jenis_kelamin", key: "jenis_kelamin",
name: "Jenis Kelamin", name: "Jenis Kelamin",
desc: "Jenis kelamin pemohon", desc: "Jenis kelamin pemohon",
type: "enum", type: "enum",
options: enumJenisKelamin options: enumJenisKelamin,
required: true, satuan: null
}, },
{ key: "alamat", name: "Alamat", desc: "Alamat lengkap tempat tinggal", type: "text" }, { key: "alamat", name: "Alamat", desc: "Alamat lengkap tempat tinggal", type: "text", required: true, satuan: null },
{ key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon", type: "text" }, { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon", type: "text", required: true, satuan: null },
{ {
key: "dokumen", key: "dokumen",
name: "Nama Dokumen", name: "Nama Dokumen",
desc: "Jenis dokumen yang mengalami perbedaan biodata (cth : ijazah, sertifikat, dll)", desc: "Jenis dokumen yang mengalami perbedaan biodata",
type: "text" type: "text",
required: true, satuan: null
}, },
{ {
key: "data_dokumen", key: "data_dokumen",
name: "Data Dokumen", name: "Data Dokumen",
desc: "Data dokumen yg berbeda (cth : nama, tempat lahir, tanggal lahir, jenis kelamin, alamat, pekerjaan)", desc: "Data dokumen yg berbeda",
type: "text" type: "text",
required: true, satuan: null
}, },
{ { key: "dokumen_a", name: "Data pada Dokumen A", desc: "Data biodata pada dokumen pertama", type: "text", required: true, satuan: null },
key: "dokumen_a", { key: "dokumen_b", name: "Data pada Dokumen B", desc: "Data biodata pada dokumen kedua", type: "text", required: true, satuan: null }
name: "Data pada Dokumen A",
desc: "Data biodata yang tertulis pada dokumen pertama",
type: "text"
},
{
key: "dokumen_b",
name: "Data pada Dokumen B",
desc: "Data biodata yang tertulis pada dokumen kedua",
type: "text"
}
] ]
}, },
{ {
id: "skbelumkawin", id: "skbelumkawin",
name: "Surat Keterangan Belum Kawin", name: "Surat Keterangan Belum Kawin",
syaratDokumen: [ syaratDokumen: [
{ { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true, satuan: null },
key: "pengantar_kelian", { key: "ktp_kk", name: "KTP / KK", desc: "Fotokopi KTP atau Kartu Keluarga", required: true, satuan: null },
name: "Pengantar Kelian", { key: "akta_cerai", name: "Akta Cerai", desc: "Fotokopi akta cerai (jika berstatus janda/duda)", required: false, satuan: null }
desc: "Surat Pengantar Kelian Banjar Dinas"
},
{
key: "ktp_kk",
name: "KTP / KK",
desc: "Fotokopi KTP atau Kartu Keluarga"
},
{
key: "akta_cerai",
name: "Akta Cerai",
desc: "Fotokopi akta cerai (jika berstatus janda/duda)"
}
], ],
dataText: [], dataText: [],
dataPelengkap: [ dataPelengkap: [
{ key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number" }, { key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number", required: true, satuan: null },
{ key: "nama", name: "Nama Lengkap", desc: "Nama sesuai KTP", type: "text" }, { key: "nama", name: "Nama Lengkap", desc: "Nama sesuai KTP", type: "text", required: true, satuan: null },
{ key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir pemohon", type: "text" }, { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir pemohon", type: "text", required: true, satuan: null },
{ key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir pemohon", type: "date" }, { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir pemohon", type: "date", required: true, satuan: null },
{ {
key: "jenis_kelamin", key: "jenis_kelamin",
name: "Jenis Kelamin", name: "Jenis Kelamin",
desc: "Jenis kelamin pemohon", desc: "Jenis kelamin pemohon",
type: "enum", type: "enum",
options: enumJenisKelamin options: enumJenisKelamin,
required: true, satuan: null
}, },
{ key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text" }, { key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text", required: true, satuan: null },
{ {
key: "agama", key: "agama",
name: "Agama", name: "Agama",
desc: "Agama pemohon", desc: "Agama pemohon",
type: "enum", type: "enum",
options: enumAgama options: enumAgama,
required: true, satuan: null
}, },
{ key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon", type: "text" } { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon", type: "text", required: true, satuan: null }
] ]
}, },
{ {
id: "skdomisiliorganisasi", id: "skdomisiliorganisasi",
name: "Surat Keterangan Domisili Organisasi", name: "Surat Keterangan Domisili Organisasi",
syaratDokumen: [ syaratDokumen: [
{ { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true, satuan: null },
key: "pengantar_kelian", { key: "skt_organisasi", name: "SKT Organisasi", desc: "Fotokopi SKT Organisasi", required: true, satuan: null },
name: "Pengantar Kelian", { key: "susunan_pengurus", name: "Susunan Pengurus", desc: "Susunan pengurus organisasi", required: true, satuan: null }
desc: "Surat Pengantar Kelian Banjar Dinas"
},
{
key: "skt_organisasi",
name: "SKT Organisasi",
desc: "Fotokopi SKT Organisasi atau pengukuhan kelompok"
},
{
key: "susunan_pengurus",
name: "Susunan Pengurus",
desc: "Susunan pengurus lengkap dengan kop organisasi"
}
], ],
dataText: [], dataText: [],
dataPelengkap: [ dataPelengkap: [
{ key: "nama_organisasi", name: "Nama Organisasi", desc: "Nama resmi organisasi", type: "text" }, { key: "nama_organisasi", name: "Nama Organisasi", desc: "Nama resmi organisasi", type: "text", required: true, satuan: null },
{ key: "jenis_organisasi", name: "Jenis Organisasi", desc: "Jenis atau bentuk organisasi", type: "text" }, { key: "jenis_organisasi", name: "Jenis Organisasi", desc: "Jenis organisasi", type: "text", required: true, satuan: null },
{ key: "alamat_organisasi", name: "Alamat Organisasi", desc: "Alamat sekretariat organisasi", type: "text" }, { key: "alamat_organisasi", name: "Alamat Organisasi", desc: "Alamat sekretariat", type: "text", required: true, satuan: null },
{ key: "no_telepon", name: "Nomor Telepon", desc: "Nomor telepon organisasi", type: "text" }, { key: "no_telepon", name: "Nomor Telepon", desc: "Nomor telepon organisasi", type: "text", required: true, satuan: null },
{ key: "nama_pimpinan", name: "Nama Pimpinan", desc: "Nama pimpinan organisasi", type: "text" }, { key: "nama_pimpinan", name: "Nama Pimpinan", desc: "Nama pimpinan", type: "text", required: true, satuan: null },
{ key: "keperluan", name: "Keperluan", desc: "Keperluan pembuatan surat", type: "text" } { key: "keperluan", name: "Keperluan", desc: "Keperluan pembuatan surat", type: "text", required: true, satuan: null }
] ]
}, },
{ {
id: "skkelahiran", id: "skkelahiran",
name: "Surat Keterangan Kelahiran", name: "Surat Keterangan Kelahiran",
syaratDokumen: [ syaratDokumen: [
{ { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true, satuan: null },
key: "pengantar_kelian", { key: "surat_lahir", name: "Surat Keterangan Lahir", desc: "Surat keterangan lahir dari bidan/dokter (jika ada)", required: false, satuan: null }
name: "Pengantar Kelian",
desc: "Surat Pengantar Kelian Banjar Dinas"
},
{
key: "surat_lahir",
name: "Surat Keterangan Lahir",
desc: "Surat keterangan lahir dari bidan/dokter (jika ada)"
}
], ],
dataText: [], dataText: [],
dataPelengkap: [ dataPelengkap: [
{ key: "nama_anak", name: "Nama Anak", desc: "Nama bayi/anak", type: "text" }, { key: "nama_anak", name: "Nama Anak", desc: "Nama bayi/anak", type: "text", required: true, satuan: null },
{ key: "tanggal_lahir_anak", name: "Tanggal Lahir Anak", desc: "Tanggal lahir anak", type: "date" }, { key: "tanggal_lahir_anak", name: "Tanggal Lahir Anak", desc: "Tanggal lahir anak", type: "date", required: true, satuan: null },
{ key: "pukul_lahir", name: "Pukul Lahir", desc: "Waktu kelahiran anak", type: "text" }, { key: "pukul_lahir", name: "Pukul Lahir", desc: "Waktu kelahiran", type: "text", required: true, satuan: null },
{ key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat kelahiran anak", type: "text" }, { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat kelahiran", type: "text", required: true, satuan: null },
{ {
key: "jenis_kelamin", key: "jenis_kelamin",
name: "Jenis Kelamin Anak", name: "Jenis Kelamin Anak",
desc: "Jenis kelamin anak", desc: "Jenis kelamin anak",
type: "enum", type: "enum",
options: enumJenisKelamin options: enumJenisKelamin,
required: true, satuan: null
}, },
{ key: "anak_ke", name: "Anak Ke-", desc: "Urutan kelahiran anak", type: "number" }, { key: "anak_ke", name: "Anak Ke-", desc: "Urutan kelahiran", type: "number", required: true, satuan: null },
{ key: "nik_ibu", name: "NIK Ibu", desc: "NIK ibu kandung", type: "number" }, { key: "nik_ibu", name: "NIK Ibu", desc: "NIK ibu kandung", type: "number", required: true, satuan: null },
{ key: "nama_ibu", name: "Nama Ibu", desc: "Nama lengkap ibu", type: "text" }, { key: "nama_ibu", name: "Nama Ibu", desc: "Nama ibu kandung", type: "text", required: true, satuan: null },
{ key: "tempat_lahir_ibu", name: "Tempat Lahir Ibu", desc: "Tempat lahir ibu kandung", type: "text" }, { key: "tempat_lahir_ibu", name: "Tempat Lahir Ibu", desc: "Tempat lahir ibu", type: "text", required: true, satuan: null },
{ key: "tanggal_lahir_ibu", name: "Tanggal Lahir Ibu", desc: "Tanggal lahir ibu kandung", type: "date" }, { key: "tanggal_lahir_ibu", name: "Tanggal Lahir Ibu", desc: "Tanggal lahir ibu", type: "date", required: true, satuan: null },
{ key: "pekerjaan_ibu", name: "Pekerjaan Ibu", desc: "Pekerjaan ibu kandung", type: "text" }, { key: "pekerjaan_ibu", name: "Pekerjaan Ibu", desc: "Pekerjaan ibu", type: "text", required: true, satuan: null },
{ key: "alamat_ibu", name: "Alamat Ibu", desc: "Alamat ibu kandung", type: "text" }, { key: "alamat_ibu", name: "Alamat Ibu", desc: "Alamat ibu", type: "text", required: true, satuan: null },
{ key: "nama_ayah", name: "Nama Ayah", desc: "Nama lengkap ayah", type: "text" }, { key: "nama_ayah", name: "Nama Ayah", desc: "Nama ayah kandung", type: "text", required: true, satuan: null },
{ key: "nik_ayah", name: "NIK Ayah", desc: "NIK ayah kandung", type: "number" }, { key: "nik_ayah", name: "NIK Ayah", desc: "NIK ayah kandung", type: "number", required: true, satuan: null },
{ key: "tempat_lahir_ayah", name: "Tempat Lahir Ayah", desc: "Tempat lahir ayah kandung", type: "text" }, { key: "tempat_lahir_ayah", name: "Tempat Lahir Ayah", desc: "Tempat lahir ayah", type: "text", required: true, satuan: null },
{ key: "tanggal_lahir_ayah", name: "Tanggal Lahir Ayah", desc: "Tanggal lahir ayah kandung", type: "date" }, { key: "tanggal_lahir_ayah", name: "Tanggal Lahir Ayah", desc: "Tanggal lahir ayah", type: "date", required: true, satuan: null },
{ key: "pekerjaan_ayah", name: "Pekerjaan Ayah", desc: "Pekerjaan ayah kandung", type: "text" }, { key: "pekerjaan_ayah", name: "Pekerjaan Ayah", desc: "Pekerjaan ayah", type: "text", required: true, satuan: null },
{ key: "alamat_ayah", name: "Alamat Ayah", desc: "Alamat ayah kandung", type: "text" }, { key: "alamat_ayah", name: "Alamat Ayah", desc: "Alamat ayah", type: "text", required: true, satuan: null },
{ key: "nama_pelapor", name: "Nama Pelapor", desc: "Nama pihak yang melaporkan", type: "text" }, { key: "nama_pelapor", name: "Nama Pelapor", desc: "Nama pelapor", type: "text", required: true, satuan: null },
{ key: "hubungan_pelapor", name: "Hubungan Pelapor", desc: "Hubungan pelapor dengan anak", type: "text" }, { key: "hubungan_pelapor", name: "Hubungan Pelapor", desc: "Hubungan dengan anak", type: "text", required: true, satuan: null },
{ key: "alamat_pelapor", name: "Alamat Pelapor", desc: "Alamat pelapor", type: "text" } { key: "alamat_pelapor", name: "Alamat Pelapor", desc: "Alamat pelapor", type: "text", required: true, satuan: null }
] ]
}, },
{ {
id: "skkelakuanbaik", id: "skkelakuanbaik",
name: "Surat Keterangan Kelakuan Baik (Pengantar SKCK)", name: "Surat Keterangan Kelakuan Baik (Pengantar SKCK)",
syaratDokumen: [ syaratDokumen: [
{ { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true, satuan: null },
key: "pengantar_kelian", { key: "ktp_kk", name: "KTP / KK", desc: "Fotokopi KTP atau KK", required: true, satuan: null }
name: "Pengantar Kelian",
desc: "Surat Pengantar Kelian Banjar Dinas"
},
{
key: "ktp_kk",
name: "KTP / KK",
desc: "Fotokopi KTP atau Kartu Keluarga"
}
], ],
dataText: [], dataText: [],
dataPelengkap: [ dataPelengkap: [
{ key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number" }, { key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number", required: true, satuan: null },
{ key: "nama", name: "Nama Lengkap", desc: "Nama sesuai KTP", type: "text" }, { key: "nama", name: "Nama Lengkap", desc: "Nama sesuai KTP", type: "text", required: true, satuan: null },
{ key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text" }, { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text", required: true, satuan: null },
{ key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date" }, { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date", required: true, satuan: null },
{ {
key: "jenis_kelamin", key: "jenis_kelamin",
name: "Jenis Kelamin", name: "Jenis Kelamin",
desc: "Jenis kelamin pemohon", desc: "Jenis kelamin",
type: "enum", type: "enum",
options: enumJenisKelamin options: enumJenisKelamin,
required: true, satuan: null
}, },
{ {
key: "agama", key: "agama",
name: "Agama", name: "Agama",
desc: "Agama pemohon", desc: "Agama",
type: "enum", type: "enum",
options: enumAgama options: enumAgama,
required: true, satuan: null
}, },
{ key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text" }, { key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text", required: true, satuan: null },
{ key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon", type: "text" }, { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan", type: "text", required: true, satuan: null },
{ key: "polsek", name: "Polsek Tujuan", desc: "Polsek tujuan pembuatan SKCK", type: "text" } { key: "polsek", name: "Polsek Tujuan", desc: "Polsek tujuan", type: "text", required: true, satuan: null }
] ]
}, },
{ {
id: "skkematian", id: "skkematian",
name: "Surat Keterangan Kematian", name: "Surat Keterangan Kematian",
syaratDokumen: [ syaratDokumen: [
{ { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true, satuan: null },
key: "pengantar_kelian", { key: "ktp_kk", name: "KTP / KK", desc: "Fotokopi KTP atau KK", required: true, satuan: null },
name: "Pengantar Kelian", { key: "surat_kematian", name: "Surat Keterangan Kematian", desc: "Surat keterangan kematian dari rumah sakit/dokter (jika ada)", required: false, satuan: null }
desc: "Surat Pengantar Kelian Banjar Dinas"
},
{
key: "ktp_kk",
name: "KTP / KK",
desc: "Fotokopi KTP atau Kartu Keluarga"
},
{
key: "surat_kematian",
name: "Surat Keterangan Kematian",
desc: "Surat keterangan kematian dari rumah sakit/dokter (jika ada)"
}
], ],
dataText: [], dataText: [],
dataPelengkap: [ dataPelengkap: [
{ key: "nik_pelapor", name: "NIK Pelapor", desc: "Nomor Induk Kependudukan pelapor", type: "number" }, { key: "nik_pelapor", name: "NIK Pelapor", desc: "NIK pelapor", type: "number", required: true, satuan: null },
{ key: "nama_pelapor", name: "Nama Pelapor", desc: "Nama lengkap pelapor", type: "text" }, { key: "nama_pelapor", name: "Nama Pelapor", desc: "Nama pelapor", type: "text", required: true, satuan: null },
{ key: "pekerjaan_pelapor", name: "Pekerjaan Pelapor", desc: "Pekerjaan pelapor", type: "text" }, { key: "pekerjaan_pelapor", name: "Pekerjaan Pelapor", desc: "Pekerjaan pelapor", type: "text", required: true, satuan: null },
{ key: "alamat_pelapor", name: "Alamat Pelapor", desc: "Alamat tempat tinggal pelapor", type: "text" }, { key: "alamat_pelapor", name: "Alamat Pelapor", desc: "Alamat pelapor", type: "text", required: true, satuan: null },
{ key: "hubungan_pelapor", name: "Hubungan dengan Almarhum", desc: "Hubungan pelapor dengan almarhum", type: "text" }, { key: "hubungan_pelapor", name: "Hubungan Pelapor", desc: "Hubungan dengan almarhum", type: "text", required: true, satuan: null },
{ key: "nama_almarhum", name: "Nama Almarhum", desc: "Nama lengkap almarhum", type: "text" }, { key: "nama_almarhum", name: "Nama Almarhum", desc: "Nama almarhum", type: "text", required: true, satuan: null },
{ key: "nik_almarhum", name: "NIK Almarhum", desc: "Nomor Induk Kependudukan almarhum", type: "number" }, { key: "nik_almarhum", name: "NIK Almarhum", desc: "NIK almarhum", type: "number", required: true, satuan: null },
{ key: "tempat_lahir_almarhum", name: "Tempat Lahir Almarhum", desc: "Tempat lahir almarhum", type: "text" }, { key: "tempat_lahir_almarhum", name: "Tempat Lahir", desc: "Tempat lahir almarhum", type: "text", required: true, satuan: null },
{ key: "tanggal_lahir_almarhum", name: "Tanggal Lahir Almarhum", desc: "Tanggal lahir almarhum", type: "date" }, { key: "tanggal_lahir_almarhum", name: "Tanggal Lahir", desc: "Tanggal lahir almarhum", type: "date", required: true, satuan: null },
{ key: "alamat_almarhum", name: "Alamat Almarhum", desc: "Alamat terakhir almarhum", type: "text" }, { key: "alamat_almarhum", name: "Alamat", desc: "Alamat terakhir", type: "text", required: true, satuan: null },
{ {
key: "agama_almarhum", key: "agama_almarhum",
name: "Agama Almarhum", name: "Agama Almarhum",
desc: "Agama almarhum", desc: "Agama almarhum",
type: "enum", type: "enum",
options: enumAgama options: enumAgama,
required: true, satuan: null
}, },
{ key: "tanggal_kematian", name: "Tanggal Kematian", desc: "Tanggal meninggal dunia", type: "date" }, { key: "tanggal_kematian", name: "Tanggal Kematian", desc: "Tanggal meninggal dunia", type: "date", required: true, satuan: null },
{ key: "waktu_kematian", name: "Waktu Kematian", desc: "Waktu meninggal dunia", type: "text" }, { key: "waktu_kematian", name: "Waktu Kematian", desc: "Waktu meninggal dunia", type: "text", required: true, satuan: null },
{ key: "tempat_kematian", name: "Tempat Kematian", desc: "Tempat meninggal dunia", type: "text" }, { key: "tempat_kematian", name: "Tempat Kematian", desc: "Tempat meninggal dunia", type: "text", required: true, satuan: null },
{ key: "penyebab_kematian", name: "Penyebab Kematian", desc: "Penyebab meninggal dunia", type: "text" } { key: "penyebab_kematian", name: "Penyebab Kematian", desc: "Penyebab meninggal dunia", type: "text", required: true, satuan: null }
] ]
}, },
{ {
id: "skpenghasilan", id: "skpenghasilan",
name: "Surat Keterangan Penghasilan", name: "Surat Keterangan Penghasilan",
syaratDokumen: [ syaratDokumen: [
{ { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true, satuan: null },
key: "pengantar_kelian", { key: "ktp_ortu_kk", name: "KTP Orang Tua / KK", desc: "Fotokopi KTP orang tua/KK", required: true, satuan: null },
name: "Pengantar Kelian", { key: "surat_pernyataan", name: "Surat Pernyataan Penghasilan", desc: "Surat pernyataan penghasilan bermaterai", required: true, satuan: null }
desc: "Surat Pengantar Kelian Banjar Dinas"
},
{
key: "ktp_ortu_kk",
name: "KTP Orang Tua / KK",
desc: "Fotokopi KTP orang tua atau Kartu Keluarga"
},
{
key: "surat_pernyataan",
name: "Surat Pernyataan",
desc: "Surat pernyataan penghasilan bermaterai"
}
], ],
dataText: [], dataText: [],
dataPelengkap: [ dataPelengkap: [
{ key: "nama", name: "Nama Lengkap", desc: "Nama pemohon", type: "text" }, { key: "nama", name: "Nama Lengkap", desc: "Nama pemohon", type: "text", required: true, satuan: null },
{ key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text" }, { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text", required: true, satuan: null },
{ key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date" }, { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date", required: true, satuan: null },
{ {
key: "jenis_kelamin", key: "jenis_kelamin",
name: "Jenis Kelamin", name: "Jenis Kelamin",
desc: "Jenis kelamin pemohon", desc: "Jenis kelamin",
type: "enum", type: "enum",
options: enumJenisKelamin options: enumJenisKelamin,
required: true, satuan: null
}, },
{ key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text" }, { key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text", required: true, satuan: null },
{ key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon/orang tua", type: "text" }, { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon", type: "text", required: true, satuan: null },
{ key: "penghasilan", name: "Penghasilan", desc: "Jumlah penghasilan per bulan", type: "number" }, { key: "penghasilan", name: "Penghasilan", desc: "Jumlah penghasilan per bulan", type: "number", required: true, satuan: "/Bulan" },
{ key: "alasan", name: "Alasan Permohonan", desc: "Alasan pengajuan surat penghasilan", type: "text" } { key: "alasan", name: "Alasan Permohonan", desc: "Alasan pengajuan surat penghasilan", type: "text", required: true, satuan: null }
] ]
}, },
{ {
id: "sktempatusaha", id: "sktempatusaha",
name: "Surat Keterangan Tempat Usaha", name: "Surat Keterangan Tempat Usaha",
syaratDokumen: [ syaratDokumen: [
{ { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true, satuan: null },
key: "pengantar_kelian", { key: "ktp_kk", name: "KTP / KK", desc: "Fotokopi KTP/KK", required: true, satuan: null },
name: "Pengantar Kelian", { key: "foto_lokasi", name: "Foto Lokasi Usaha", desc: "Foto lokasi usaha", required: true, satuan: null },
desc: "Surat Pengantar Kelian Banjar Dinas" { key: "dokumen_lahan", name: "Dokumen Lahan", desc: "SPPT/Sertifikat/surat sewa tempat usaha", required: true, satuan: null }
},
{
key: "ktp_kk",
name: "KTP / KK",
desc: "Fotokopi KTP atau Kartu Keluarga"
},
{
key: "foto_lokasi",
name: "Foto Lokasi Usaha",
desc: "Foto lokasi usaha dicetak dan distempel oleh Kelian"
},
{
key: "dokumen_lahan",
name: "Dokumen Lahan",
desc: "SPPT, Sertifikat, atau surat sewa tempat usaha"
}
], ],
dataText: [], dataText: [],
dataPelengkap: [ dataPelengkap: [
{ key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number" }, { key: "nik", name: "NIK", desc: "NIK pemilik", type: "number", required: true, satuan: null },
{ key: "nama_pemilik", name: "Nama Pemilik", desc: "Nama pemilik usaha", type: "text" }, { key: "nama_pemilik", name: "Nama Pemilik", desc: "Nama pemilik usaha", type: "text", required: true, satuan: null },
{ key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text" }, { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text", required: true, satuan: null },
{ key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date" }, { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date", required: true, satuan: null },
{ key: "alamat_pemilik", name: "Alamat Pemilik", desc: "Alamat pemilik usaha", type: "text" }, { key: "alamat_pemilik", name: "Alamat Pemilik", desc: "Alamat pemilik", type: "text", required: true, satuan: null },
{ key: "nama_usaha", name: "Nama Usaha", desc: "Nama usaha", type: "text" }, { key: "nama_usaha", name: "Nama Usaha", desc: "Nama usaha", type: "text", required: true, satuan: null },
{ key: "bidang_usaha", name: "Bidang Usaha", desc: "Bidang atau jenis usaha", type: "text" }, { key: "bidang_usaha", name: "Bidang Usaha", desc: "Bidang usaha", type: "text", required: true, satuan: null },
{ key: "alamat_usaha", name: "Alamat Usaha", desc: "Alamat lokasi usaha", type: "text" }, { key: "alamat_usaha", name: "Alamat Usaha", desc: "Alamat usaha", type: "text", required: true, satuan: null },
{ key: "status_tempat", name: "Status Tempat Usaha", desc: "Status kepemilikan tempat usaha", type: "enum", options: enumStatusTempatUsaha }, {
{ key: "luas_usaha", name: "Luas Tempat Usaha", desc: "Luas tempat usaha (m²)", type: "number" }, key: "status_tempat",
{ key: "jumlah_karyawan", name: "Jumlah Karyawan", desc: "Jumlah tenaga kerja", type: "number" }, name: "Status Tempat Usaha",
{ key: "tujuan", name: "Tujuan Pembuatan Surat", desc: "Tujuan pembuatan surat keterangan", type: "text" } desc: "Status kepemilikan tempat usaha",
type: "enum",
options: enumStatusTempatUsaha,
required: true, satuan: null
},
{ key: "luas_usaha", name: "Luas Tempat Usaha", desc: "Luas tempat usaha (m²)", type: "number", required: true, satuan: "m²" },
{ key: "jumlah_karyawan", name: "Jumlah Karyawan", desc: "Jumlah karyawan", type: "number", required: true, satuan: null },
{ key: "tujuan", name: "Tujuan Pembuatan Surat", desc: "Tujuan pembuatan surat keterangan", type: "text", required: true, satuan: null }
] ]
}, },
{ {
id: "sktidakmampu", id: "sktidakmampu",
name: "Surat Keterangan Tidak Mampu", name: "Surat Keterangan Tidak Mampu",
syaratDokumen: [ syaratDokumen: [
{ { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true, satuan: null },
key: "pengantar_kelian", { key: "ktp_kia_kk", name: "KTP / KIA / KK", desc: "Fotokopi KTP/KIA/KK", required: true, satuan: null }
name: "Pengantar Kelian",
desc: "Surat Pengantar Kelian Banjar Dinas"
},
{
key: "ktp_kia_kk",
name: "KTP / KIA / KK",
desc: "Fotokopi KTP, KIA, atau Kartu Keluarga"
}
], ],
dataText: [], dataText: [],
dataPelengkap: [ dataPelengkap: [
{ key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan pemohon", type: "number" }, { key: "nik", name: "NIK", desc: "NIK pemohon", type: "number", required: true, satuan: null },
{ key: "nama", name: "Nama Lengkap", desc: "Nama lengkap pemohon", type: "text" }, { key: "nama Lengkap", name: "Nama", desc: "Nama pemohon", type: "text", required: true, satuan: null },
{ key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir pemohon", type: "text" }, { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text", required: true, satuan: null },
{ key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir pemohon", type: "date" }, { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date", required: true, satuan: null },
{ key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal pemohon", type: "text" }, { key: "alamat", name: "Alamat", desc: "Alamat pemohon", type: "text", required: true, satuan: null },
{ key: "alasan", name: "Alasan Permohonan", desc: "Alasan pengajuan Surat Keterangan Tidak Mampu", type: "text" } { key: "alasan", name: "Alasan Permohonan", desc: "Alasan permohonan", type: "text", required: true, satuan: null }
] ]
}, },
{ {
id: "skusaha", id: "skusaha",
name: "Surat Keterangan Usaha", name: "Surat Keterangan Usaha",
syaratDokumen: [ syaratDokumen: [
{ { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true, satuan: null },
key: "pengantar_kelian", { key: "ktp_kk", name: "KTP / KK", desc: "Fotokopi KTP/KK", required: true, satuan: null },
name: "Pengantar Kelian", { key: "foto_lokasi", name: "Foto Lokasi Usaha", desc: "Foto lokasi usaha", required: true, satuan: null }
desc: "Surat Pengantar Kelian Banjar Dinas"
},
{
key: "ktp_kk",
name: "KTP / KK",
desc: "Fotokopi KTP atau Kartu Keluarga"
},
{
key: "foto_lokasi",
name: "Foto Lokasi Usaha",
desc: "Foto lokasi usaha dicetak dan distempel oleh Kelian"
}
], ],
dataText: [], dataText: [],
dataPelengkap: [ dataPelengkap: [
{ key: "nama", name: "Nama Lengkap", desc: "Nama pemilik usaha", type: "text" }, { key: "nama", name: "Nama Lengkap", desc: "Nama pemilik usaha", type: "text", required: true, satuan: null },
{ {
key: "jenis_kelamin", key: "jenis_kelamin",
name: "Jenis Kelamin", name: "Jenis Kelamin",
desc: "Jenis kelamin pemilik usaha", desc: "Jenis kelamin pemilik usaha",
type: "enum", type: "enum",
options: enumJenisKelamin options: enumJenisKelamin,
required: true, satuan: null
}, },
{ key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text" }, { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text", required: true, satuan: null },
{ key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date" }, { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date", required: true, satuan: null },
{ key: "negara", name: "Kewarganegaraan", desc: "Kewarganegaraan pemilik usaha", type: "text" }, { key: "negara", name: "Kewarganegaraan", desc: "Kewarganegaraan", type: "text", required: true, satuan: null },
{ {
key: "agama", key: "agama",
name: "Agama", name: "Agama",
desc: "Agama pemilik usaha", desc: "Agama",
type: "enum", type: "enum",
options: enumAgama options: enumAgama,
required: true, satuan: null
}, },
{ {
key: "status_perkawinan", key: "status_perkawinan",
name: "Status Perkawinan", name: "Status Perkawinan",
desc: "Status perkawinan", desc: "Status perkawinan",
type: "enum", type: "enum",
options: enumStatusPerkawinan options: enumStatusPerkawinan,
required: true, satuan: null
}, },
{ key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text" }, { key: "alamat", name: "Alamat", desc: "Alamat", type: "text", required: true, satuan: null },
{ key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemilik usaha", type: "text" }, { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan", type: "text", required: true, satuan: null },
{ key: "jenis_usaha", name: "Jenis Usaha", desc: "Jenis usaha yang dijalankan", type: "text" }, { key: "jenis_usaha", name: "Jenis Usaha", desc: "Jenis usaha", type: "text", required: true, satuan: null },
{ key: "alamat_usaha", name: "Alamat Usaha", desc: "Alamat lokasi usaha", type: "text" } { key: "alamat_usaha", name: "Alamat Usaha", desc: "Alamat usaha", type: "text", required: true, satuan: null }
] ]
}, },
{ {
id: "skyatimpiatu", id: "skyatimpiatu",
name: "Surat Keterangan Yatim / Piatu / Yatim Piatu", name: "Surat Keterangan Yatim / Piatu / Yatim Piatu",
syaratDokumen: [ syaratDokumen: [
{ { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true, satuan: null },
key: "pengantar_kelian", { key: "ktp_kia_kk", name: "KTP / KIA / KK", desc: "Fotokopi KTP/KIA/KK", required: true, satuan: null }
name: "Pengantar Kelian",
desc: "Surat Pengantar Kelian Banjar Dinas"
},
{
key: "ktp_kia_kk",
name: "KTP / KIA / KK",
desc: "Fotokopi KTP, KIA, atau Kartu Keluarga"
}
], ],
dataText: [], dataText: [],
dataPelengkap: [ dataPelengkap: [
{ key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number" }, { key: "nik", name: "NIK", desc: "NIK anak", type: "number", required: true, satuan: null },
{ key: "nama", name: "Nama Lengkap", desc: "Nama anak", type: "text" }, { key: "nama", name: "Nama", desc: "Nama anak", type: "text", required: true, satuan: null },
{ key: "tempat_lahir", name: "Tempat Lahir Anak", desc: "Tempat lahir anak", type: "text" }, { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text", required: true, satuan: null },
{ key: "tanggal_lahir", name: "Tanggal Lahir Anak", desc: "Tanggal lahir anak", type: "date" }, { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date", required: true, satuan: null },
{ {
key: "jenis_kelamin", key: "jenis_kelamin",
name: "Jenis Kelamin", name: "Jenis Kelamin",
desc: "Jenis kelamin anak", desc: "Jenis kelamin anak",
type: "enum", type: "enum",
options: enumJenisKelamin options: enumJenisKelamin,
required: true, satuan: null
}, },
{ key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text" }, { key: "alamat", name: "Alamat", desc: "Alamat", type: "text", required: true, satuan: null },
{ key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan (jika ada)", type: "text" }, { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan (jika ada)", type: "text", required: false, satuan: null },
{ key: "nama_ayah", name: "Nama Ayah", desc: "Nama ayah", type: "text", required: true, satuan: null },
{ key: "nama_ayah", name: "Nama Ayah", desc: "Nama ayah kandung", type: "text" },
{ {
key: "status_ayah", key: "status_ayah",
name: "Status Ayah", name: "Status Ayah",
desc: "Status ayah (hidup / meninggal)", desc: "Status ayah",
type: "enum", type: "enum",
options: enumStatusHidup options: enumStatusHidup,
required: true, satuan: null
}, },
{ key: "nama_ibu", name: "Nama Ibu", desc: "Nama ibu kandung", type: "text" }, { key: "nama_ibu", name: "Nama Ibu", desc: "Nama ibu", type: "text", required: true, satuan: null },
{ {
key: "status_ibu", key: "status_ibu",
name: "Status Ibu", name: "Status Ibu",
desc: "Status ibu (hidup / meninggal)", desc: "Status ibu",
type: "enum", type: "enum",
options: enumStatusHidup options: enumStatusHidup,
required: true, satuan: null
} }
] ]
} }
]; ];

View File

@@ -31,7 +31,7 @@ import {
IconInfoCircle, IconInfoCircle,
IconNotes, IconNotes,
IconPhone, IconPhone,
IconUpload, IconUpload
} from "@tabler/icons-react"; } from "@tabler/icons-react";
import dayjs from "dayjs"; import dayjs from "dayjs";
import "dayjs/locale/id"; import "dayjs/locale/id";
@@ -42,6 +42,7 @@ import useSWR from "swr";
type DataItem = { type DataItem = {
key: string; key: string;
value: string; value: string;
required: boolean;
}; };
type FormSurat = { type FormSurat = {
@@ -96,7 +97,7 @@ export default function FormSurat() {
setJenisSuratFix({ name: "", id: "" }); setJenisSuratFix({ name: "", id: "" });
} else { } else {
const namaJenis = fromSlug(jenisSurat); const namaJenis = fromSlug(jenisSurat);
const data = listCategory.find((item: any) => item.name == namaJenis); const data = listCategory.find((item: any) => item.name.toUpperCase() == namaJenis.toUpperCase());
if (!data) return; if (!data) return;
setJenisSuratFix(data); setJenisSuratFix(data);
} }
@@ -119,15 +120,17 @@ export default function FormSurat() {
nama: "", nama: "",
phone: "", phone: "",
dataPelengkap: (get.data?.dataPelengkap || []).map( dataPelengkap: (get.data?.dataPelengkap || []).map(
(item: { key: string }) => ({ (item: { key: string, required: boolean }) => ({
key: item.key, key: item.key,
value: "", value: "",
required: item.required
}), }),
), ),
syaratDokumen: (get.data?.syaratDokumen || []).map( syaratDokumen: (get.data?.syaratDokumen || []).map(
(item: { key: string }) => ({ (item: { key: string, required: boolean }) => ({
key: item.key, key: item.key,
value: "", value: "",
required: item.required
}), }),
), ),
}); });
@@ -167,7 +170,7 @@ export default function FormSurat() {
if (Array.isArray(value)) { if (Array.isArray(value)) {
return value.some( return value.some(
(item) => (item) =>
typeof item.value === "string" && item.value.trim() === "", (typeof item.value === "string" && item.value.trim() === "" && item.required) || (typeof item.value === "object" && item.value === null && item.required),
); );
} }
return typeof value === "string" && value.trim() === ""; return typeof value === "string" && value.trim() === "";
@@ -276,13 +279,14 @@ export default function FormSurat() {
value: any; value: any;
}) { }) {
if (key === "dataPelengkap" || key === "syaratDokumen") { if (key === "dataPelengkap" || key === "syaratDokumen") {
const errorMsg = validateField(value.key, value.value); if (value.required == true) {
const errorMsg = validateField(value.key, value.value);
setErrors((prev) => ({
...prev,
[value.key]: errorMsg,
}));
setErrors((prev) => ({
...prev,
[value.key]: errorMsg,
}));
}
setFormSurat((prev) => ({ setFormSurat((prev) => ({
...prev, ...prev,
[key]: updateArrayByKey(prev[key], value.key, value.value), [key]: updateArrayByKey(prev[key], value.key, value.value),
@@ -381,7 +385,7 @@ export default function FormSurat() {
value: item.name, value: item.name,
label: item.name, label: item.name,
}))} }))}
value={jenisSuratFix.name} value={jenisSuratFix.name == "" ? null : jenisSuratFix.name}
onChange={(value) => { onChange={(value) => {
const slug = toSlug(String(value)); const slug = toSlug(String(value));
navigate("/darmasaba/surat?jenis=" + slug); navigate("/darmasaba/surat?jenis=" + slug);
@@ -400,7 +404,7 @@ export default function FormSurat() {
<Grid> <Grid>
<Grid.Col span={6}> <Grid.Col span={6}>
<TextInput <TextInput
label={<FieldLabel label="Nama" hint="Nama kontak" />} label={<FieldLabel label="Nama" hint="Nama kontak" required />}
placeholder="Budi Setiawan" placeholder="Budi Setiawan"
value={formSurat.nama} value={formSurat.nama}
error={errors.nama_kontak} error={errors.nama_kontak}
@@ -414,6 +418,7 @@ export default function FormSurat() {
<TextInput <TextInput
label={ label={
<FieldLabel <FieldLabel
required
label="Nomor Telephone" label="Nomor Telephone"
hint="Nomor telephone yang dapat dihubungi / terhubung dengan whatsapp" hint="Nomor telephone yang dapat dihubungi / terhubung dengan whatsapp"
/> />
@@ -450,6 +455,7 @@ export default function FormSurat() {
<FieldLabel <FieldLabel
label={item.name} label={item.name}
hint={item.desc} hint={item.desc}
required={item.required}
/> />
} }
data={item.options ?? []} data={item.options ?? []}
@@ -457,7 +463,7 @@ export default function FormSurat() {
onChange={(e) => { onChange={(e) => {
validationForm({ validationForm({
key: "dataPelengkap", key: "dataPelengkap",
value: { key: item.key, value: e }, value: { key: item.key, value: e, required: item.required },
}); });
}} }}
value={ value={
@@ -474,6 +480,7 @@ export default function FormSurat() {
<FieldLabel <FieldLabel
label={item.name} label={item.name}
hint={item.desc} hint={item.desc}
required={item.required}
/> />
} }
placeholder={item.name} placeholder={item.name}
@@ -488,6 +495,7 @@ export default function FormSurat() {
value: { value: {
key: item.key, key: item.key,
value: formatted, value: formatted,
required: item.required,
}, },
}); });
}} }}
@@ -500,6 +508,7 @@ export default function FormSurat() {
<FieldLabel <FieldLabel
label={item.name} label={item.name}
hint={item.desc} hint={item.desc}
required={item.required}
/> />
} }
placeholder={item.name} placeholder={item.name}
@@ -509,6 +518,7 @@ export default function FormSurat() {
value: { value: {
key: item.key, key: item.key,
value: e.target.value, value: e.target.value,
required: item.required,
}, },
}) })
} }
@@ -517,6 +527,10 @@ export default function FormSurat() {
(n: any) => n.key == item.key, (n: any) => n.key == item.key,
)?.value )?.value
} }
rightSection={
item.satuan != null &&
<Text mr={"lg"}>{item.satuan}</Text>
}
/> />
)} )}
</Grid.Col> </Grid.Col>
@@ -545,6 +559,7 @@ export default function FormSurat() {
}) })
} }
name={item.name} name={item.name}
required={item.required}
/> />
</Grid.Col> </Grid.Col>
), ),
@@ -569,10 +584,20 @@ export default function FormSurat() {
); );
} }
function FieldLabel({ label, hint }: { label: string; hint?: string }) { function FieldLabel({ label, hint, required = false, }: { label: string; hint?: string; required?: boolean; }) {
return ( return (
<Group justify="apart" gap="xs" align="center"> <Group justify="apart" gap="xs" align="center">
<Text fw={600}>{label}</Text> <Group gap={4} align="center">
<Text fw={600}>
{label}
{required && (
<Text span c="red" ml={4}>
*
</Text>
)}
</Text>
</Group>
{hint && ( {hint && (
<Tooltip label={hint} withArrow> <Tooltip label={hint} withArrow>
<ActionIcon size={24} variant="subtle"> <ActionIcon size={24} variant="subtle">
@@ -584,6 +609,7 @@ function FieldLabel({ label, hint }: { label: string; hint?: string }) {
); );
} }
function FormSection({ function FormSection({
title, title,
icon, icon,
@@ -619,6 +645,7 @@ function FileInputWrapper({
preview, preview,
name, name,
description, description,
required = false,
}: { }: {
label: string; label: string;
placeholder?: string; placeholder?: string;
@@ -627,12 +654,20 @@ function FileInputWrapper({
preview?: string | null; preview?: string | null;
name: string; name: string;
description?: string; description?: string;
required?: boolean;
}) { }) {
return ( return (
<Stack gap="xs"> <Stack gap="xs">
<Flex direction={"column"}> <Flex direction={"column"}>
<Group justify="apart" align="center"> <Group justify="apart" align="center">
<Text fw={500}>{label}</Text> <Text fw={500}>
{label}
{required && (
<Text span c="red" ml={4}>
*
</Text>
)}
</Text>
</Group> </Group>
{description && ( {description && (
<Text size="sm" c="dimmed" mt={4} style={{ lineHeight: 1.2 }}> <Text size="sm" c="dimmed" mt={4} style={{ lineHeight: 1.2 }}>
@@ -648,6 +683,7 @@ function FileInputWrapper({
leftSection={<IconUpload />} leftSection={<IconUpload />}
aria-label={label} aria-label={label}
name={name} name={name}
clearable={true}
/> />
{preview ? ( {preview ? (

View File

@@ -50,6 +50,7 @@ type UpdateDataItem = {
id: string; id: string;
key: string; key: string;
value: any; value: any;
required: boolean;
}; };
type FormSurat = { type FormSurat = {
@@ -125,10 +126,20 @@ export default function UpdateDataSurat() {
); );
} }
function FieldLabel({ label, hint }: { label: string; hint?: string }) { function FieldLabel({ label, hint, required = false, }: { label: string; hint?: string; required?: boolean; }) {
return ( return (
<Group justify="apart" gap="xs" align="center"> <Group justify="apart" gap="xs" align="center">
<Text fw={600}>{label}</Text> <Group gap={4} align="center">
<Text fw={600}>
{label}
{required && (
<Text span c="red" ml={4}>
*
</Text>
)}
</Text>
</Group>
{hint && ( {hint && (
<Tooltip label={hint} withArrow> <Tooltip label={hint} withArrow>
<ActionIcon size={24} variant="subtle"> <ActionIcon size={24} variant="subtle">
@@ -139,7 +150,6 @@ function FieldLabel({ label, hint }: { label: string; hint?: string }) {
</Group> </Group>
); );
} }
function FormSection({ function FormSection({
title, title,
icon, icon,
@@ -185,6 +195,8 @@ function FileInputWrapper({
description, description,
linkView, linkView,
disabled, disabled,
required = false,
}: { }: {
label: string; label: string;
placeholder?: string; placeholder?: string;
@@ -195,6 +207,7 @@ function FileInputWrapper({
name: string; name: string;
description?: string; description?: string;
disabled?: boolean; disabled?: boolean;
required?: boolean;
}) { }) {
const [viewImg, setViewImg] = useState(""); const [viewImg, setViewImg] = useState("");
const [openedPreviewFile, setOpenedPreviewFile] = useState(false); const [openedPreviewFile, setOpenedPreviewFile] = useState(false);
@@ -219,7 +232,14 @@ function FileInputWrapper({
<Stack gap="xs"> <Stack gap="xs">
<Flex direction={"column"}> <Flex direction={"column"}>
<Group justify="apart" align="center"> <Group justify="apart" align="center">
<Text fw={500}>{label}</Text> <Text fw={500}>
{label}
{required && (
<Text span c="red" ml={4}>
*
</Text>
)}
</Text>
</Group> </Group>
{description && ( {description && (
<Text size="sm" c="dimmed" mt={4} style={{ lineHeight: 1.2 }}> <Text size="sm" c="dimmed" mt={4} style={{ lineHeight: 1.2 }}>
@@ -241,6 +261,7 @@ function FileInputWrapper({
aria-label={label} aria-label={label}
name={name} name={name}
disabled={disabled} disabled={disabled}
clearable={true}
/> />
{preview ? ( {preview ? (
@@ -477,21 +498,33 @@ function DataUpdate({
kategori: "dataPelengkap" | "syaratDokumen"; kategori: "dataPelengkap" | "syaratDokumen";
value: UpdateDataItem; value: UpdateDataItem;
}) { }) {
const errorMsg = validateField(value.key, value.value); if (kategori == "syaratDokumen" && value.value == null) {
setFormSurat((prev) => ({
...prev,
syaratDokumen: prev.syaratDokumen.filter(
(item) => item.id !== value.id
),
}));
} else {
if (value.required == true) {
const errorMsg = validateField(value.key, value.value);
setErrors((prev) => ({
...prev,
[value.id]: errorMsg,
}));
}
setErrors((prev) => ({
...prev,
[value.id]: errorMsg,
}));
setFormSurat((prev) => ({ setFormSurat((prev) => ({
...prev, ...prev,
[kategori]: upsertById(prev[kategori], { [kategori]: upsertById(prev[kategori], {
id: value.id, id: value.id,
key: value.key, key: value.key,
value: value.value, value: value.value,
}), required: value.required,
})); }),
}));
}
} }
@@ -528,7 +561,7 @@ function DataUpdate({
if (Array.isArray(value)) { if (Array.isArray(value)) {
return value.some( return value.some(
(item) => (item) =>
typeof item.value === "string" && item.value.trim() === "", (typeof item.value === "string" && item.value.trim() === "" && item.required) || (typeof item.value === "object" && item.value === null && item.required),
); );
} }
@@ -676,13 +709,13 @@ function DataUpdate({
<Select <Select
disabled={status != "ditolak" && status != "antrian"} disabled={status != "ditolak" && status != "antrian"}
allowDeselect={false} allowDeselect={false}
label={<FieldLabel label={item.name} hint={item.desc} />} label={<FieldLabel label={item.name} hint={item.desc} required={item.required} />}
data={item.options ?? []} data={item.options ?? []}
placeholder={item.name} placeholder={item.name}
onChange={(e) => { onChange={(e) => {
validationForm({ validationForm({
kategori: "dataPelengkap", kategori: "dataPelengkap",
value: { id: item.id, key: item.key, value: e }, value: { id: item.id, key: item.key, value: e, required: item.required },
}); });
}} }}
value={ value={
@@ -697,7 +730,7 @@ function DataUpdate({
disabled={status != "ditolak" && status != "antrian"} disabled={status != "ditolak" && status != "antrian"}
locale="id" locale="id"
valueFormat="DD MMMM YYYY" valueFormat="DD MMMM YYYY"
label={<FieldLabel label={item.name} hint={item.desc} />} label={<FieldLabel label={item.name} hint={item.desc} required={item.required} />}
placeholder={item.name} placeholder={item.name}
onChange={(e) => { onChange={(e) => {
const formatted = e const formatted = e
@@ -709,6 +742,7 @@ function DataUpdate({
id: item.id, id: item.id,
key: item.key, key: item.key,
value: formatted, value: formatted,
required: item.required
}, },
}); });
}} }}
@@ -727,7 +761,7 @@ function DataUpdate({
) : ( ) : (
<TextInput <TextInput
error={errors[item.id]} error={errors[item.id]}
label={<FieldLabel label={item.name} hint={item.desc} />} label={<FieldLabel label={item.name} hint={item.desc} required={item.required} />}
placeholder={item.name} placeholder={item.name}
type={item.type} type={item.type}
onChange={(e) => onChange={(e) =>
@@ -737,6 +771,7 @@ function DataUpdate({
id: item.id, id: item.id,
key: item.key, key: item.key,
value: e.target.value, value: e.target.value,
required: item.required,
}, },
}) })
} }
@@ -746,6 +781,10 @@ function DataUpdate({
dataPelengkap.find((n: any) => n.key == item.key)?.value dataPelengkap.find((n: any) => n.key == item.key)?.value
} }
disabled={status != "ditolak" && status != "antrian"} disabled={status != "ditolak" && status != "antrian"}
rightSection={
item.satuan != null &&
<Text mr={"lg"}>{item.satuan}</Text>
}
/> />
)} )}
</Grid.Col> </Grid.Col>
@@ -754,7 +793,7 @@ function DataUpdate({
</FormSection> </FormSection>
<FormSection <FormSection
title="Syarat Dokumen" title="Syarat Dokumen hjh"
description="Syarat dokumen yang diperlukan" description="Syarat dokumen yang diperlukan"
icon={<IconFiles size={16} />} icon={<IconFiles size={16} />}
> >
@@ -762,6 +801,7 @@ function DataUpdate({
{dataSyaratDokumen.map((item: any, index: number) => ( {dataSyaratDokumen.map((item: any, index: number) => (
<Grid.Col span={6} key={index}> <Grid.Col span={6} key={index}>
<FileInputWrapper <FileInputWrapper
required={item.required}
label={item.desc} label={item.desc}
placeholder={"Upload file terbaru untuk mengupdate"} placeholder={"Upload file terbaru untuk mengupdate"}
accept="image/*,application/pdf" accept="image/*,application/pdf"
@@ -769,7 +809,7 @@ function DataUpdate({
onChange={(file) => onChange={(file) =>
validationForm({ validationForm({
kategori: "syaratDokumen", kategori: "syaratDokumen",
value: { id: item.id, key: item.key, value: file }, value: { id: item.id, key: item.key, value: file, required: item.required },
}) })
} }
name={item.name} name={item.name}

View File

@@ -123,7 +123,7 @@ function DetailDataPengajuan({
const [permissions, setPermissions] = useState<JsonValue[]>([]); const [permissions, setPermissions] = useState<JsonValue[]>([]);
const [viewImg, setViewImg] = useState({ file: "", folder: "" }); const [viewImg, setViewImg] = useState({ file: "", folder: "" });
const [uploading, setUploading] = useState({ ok: false, file: "" }); const [uploading, setUploading] = useState({ ok: false, file: "" });
const [editValue, setEditValue] = useState({ id: "", jenis: "", val: "", option: null as any, type: "", key: "" }) const [editValue, setEditValue] = useState({ id: "", jenis: "", val: "", satuan: null as string | null, option: null as any, type: "", key: "" })
const [openEdit, setOpenEdit] = useState(false) const [openEdit, setOpenEdit] = useState(false)
const [loadingUpdate, setLoadingUpdate] = useState(false) const [loadingUpdate, setLoadingUpdate] = useState(false)
const [loadingFS, setLoadingFS] = useState({ value: false, text: "" }) const [loadingFS, setLoadingFS] = useState({ value: false, text: "" })
@@ -163,6 +163,11 @@ function DetailDataPengajuan({
message: "Success send message to warga", message: "Success send message to warga",
type: "success", type: "success",
}); });
if (status == "selesai") {
onAction()
}
} else { } else {
notification({ notification({
title: "Failed", title: "Failed",
@@ -363,6 +368,10 @@ function DetailDataPengajuan({
type={editValue.type} type={editValue.type}
onChange={(e) => { setEditValue({ ...editValue, val: e.target.value }) }} onChange={(e) => { setEditValue({ ...editValue, val: e.target.value }) }}
value={editValue.val} value={editValue.val}
rightSection={
editValue.satuan != null &&
<Text mr={"lg"}>{editValue.satuan}</Text>
}
/> />
)} )}
<Group justify="center" grow> <Group justify="center" grow>
@@ -460,12 +469,14 @@ function DetailDataPengajuan({
)} )}
</Stack> </Stack>
</Modal> </Modal>
{/* MODAL PREVIEW SURAT */}
{data?.status == "selesai" && !data?.fileSurat && ( {data?.status == "selesai" && !data?.fileSurat && (
<ModalSurat <ModalSurat
open={openedPreview} open={openedPreview}
onClose={(val) => { onClose={(val) => {
setOpenedPreview(false) setOpenedPreview(false)
setUploading({ ok: true, file: val }) setUploading({ ok: val.success, file: val.data })
}} }}
surat={data?.idSurat} surat={data?.idSurat}
/> />
@@ -568,13 +579,13 @@ function DetailDataPengajuan({
direction="row" direction="row"
> >
<Text> <Text>
{_.upperFirst(item.value)} {_.upperFirst(item.value)} {item.satuan}
</Text> </Text>
<ActionIcon <ActionIcon
variant="subtle" variant="subtle"
aria-label="Edit" aria-label="Edit"
onClick={() => { onClick={() => {
setEditValue({ id: item.id, val: item.value, type: item.type, option: item.options, jenis: item.jenis, key: item.key }) setEditValue({ id: item.id, val: item.value, type: item.type, satuan: item.satuan, option: item.options, jenis: item.jenis, key: item.key })
setOpenEdit(true) setOpenEdit(true)
}}> }}>
<IconEdit size={16} /> <IconEdit size={16} />
@@ -637,18 +648,31 @@ function DetailDataPengajuan({
Setujui Setujui
</Button> </Button>
</Group> </Group>
) : data?.status === "selesai" ? ( ) : data?.status === "selesai" ?
<Group justify="center" grow> !data?.fileSurat ?
<Button (
variant="light" <Group justify="center" grow>
onClick={() => { setViewImg({ file: data?.fileSurat, folder: "surat" }) }} <Button
> variant="light"
Surat onClick={() => { setOpenedPreview(true) }}
</Button> >
</Group> Kirim Ulang Surat
) : ( </Button>
<></> </Group>
)} )
:
(
<Group justify="center" grow>
<Button
variant="light"
onClick={() => { setViewImg({ file: data?.fileSurat, folder: "surat" }) }}
>
Surat
</Button>
</Group>
) : (
<></>
)}
</Grid.Col> </Grid.Col>
</Grid> </Grid>
</Stack> </Stack>

View File

@@ -315,6 +315,7 @@ const PelayananRoute = new Elysia({
}[]; name: string; }[]; name: string;
desc: string; desc: string;
key: string; key: string;
satuan?: string;
}[]; }[];
const refMap = new Map( const refMap = new Map(
@@ -336,6 +337,7 @@ const PelayananRoute = new Elysia({
type: ref?.type ?? "", type: ref?.type ?? "",
options: ref?.options ?? [], options: ref?.options ?? [],
order: ref?.order ?? Infinity, order: ref?.order ?? Infinity,
satuan: ref?.satuan ?? null
}; };
}) })
.sort((a, b) => a.order - b.order) .sort((a, b) => a.order - b.order)
@@ -685,17 +687,20 @@ const PelayananRoute = new Elysia({
name: string; name: string;
desc: string; desc: string;
key: string; key: string;
required: boolean;
}[]; }[];
const dataSyaratFix = dataSyarat.map((item) => { const dataSyaratFix = dataSyarat.map((item) => {
const desc = syaratDokumen.find((v) => v.key == item.jenis)?.desc const desc = syaratDokumen.find((v) => v.key == item.jenis)?.desc
const name = syaratDokumen.find((v) => v.key == item.jenis)?.name const name = syaratDokumen.find((v) => v.key == item.jenis)?.name
const required = syaratDokumen.find((v) => v.key == item.jenis)?.required
return { return {
id: item.id, id: item.id,
key: item.jenis, key: item.jenis,
value: item.value, value: item.value,
name: name ?? '', name: name ?? '',
desc: desc ?? '' desc: desc ?? '',
required: required ?? true
} }
}) })
@@ -708,6 +713,8 @@ const PelayananRoute = new Elysia({
name: string; name: string;
desc: string; desc: string;
key: string; key: string;
required: boolean;
satuan?: string;
}[]; }[];
const refMap = new Map( const refMap = new Map(
@@ -730,6 +737,8 @@ const PelayananRoute = new Elysia({
type: ref?.type ?? "", type: ref?.type ?? "",
options: ref?.options ?? [], options: ref?.options ?? [],
order: ref?.order ?? Infinity, order: ref?.order ?? Infinity,
required: ref?.required ?? true,
satuan: ref?.satuan ?? null
}; };
}) })
.sort((a, b) => a.order - b.order) .sort((a, b) => a.order - b.order)