# Mapping Data Structure ke ERD Dokumen ini menjelaskan mapping antara struktur data pasien di `queueStore.js` (baris 607-622) ke tabel-tabel dalam ERD. ## Struktur Data di Code (queueStore.js) ```javascript { no: newNo, jamPanggil: "HH:MM", barcode: "26011395625", noAntrian: "KL0001 | Klinik - 26011395625", shift: "Shift 1", klinik: "KANDUNGAN", fastTrack: "TIDAK" | "YA", pembayaran: "BPJS" | "UMUM", status: "di-loket" | "waiting" | ..., processStage: "klinik" | "loket" | ..., createdAt: "2026-01-13T16:51:35.502Z", referencePatient: "UM1001 | Online - 26011395625" | null, loket: "Loket A" (optional), loketId: 1 (optional) } ``` --- ## Mapping ke Tabel ERD ### 1. **data_kunjungan_antrean** (Tabel Utama Kunjungan) | Field Code | Field ERD | Keterangan | |------------|-----------|------------| | `barcode` | `Barcode` | Barcode unik pasien (string) | | `createdAt` | `Tanggal_daftar` | Tanggal dan waktu pendaftaran antrian | | - | `Pasien` | FK ke `data_pasien.id` (harus dicari/lookup berdasarkan barcode atau dibuat baru) | | - | `Tanggal_periksa` | Tanggal pemeriksaan (bisa sama dengan Tanggal_daftar atau null) | | - | `Tanggal_check_in` | Tanggal check-in (null jika belum check-in) | | - | `Check_in` | Status check-in (boolean/flag) | | - | `Surat_rujukan` | Surat rujukan (null jika tidak ada) | | - | `Surat_kontrol` | Surat kontrol (null jika tidak ada) | | - | `SEP` | SEP BPJS (null jika tidak ada) | | - | `Status_active` | Status aktif (default: 1 = Active) | **Catatan:** - `barcode` langsung map ke field `Barcode` - `createdAt` map ke `Tanggal_daftar` - `referencePatient` bisa digunakan untuk tracking kunjungan sebelumnya (relasi ke `data_kunjungan_antrean` lain) --- ### 2. **data_kunjungan_tempat_layanan** (Detail Tempat Layanan) | Field Code | Field ERD | Keterangan | |------------|-----------|------------| | `no` | `Nomor_tiket` | Nomor urut antrian (integer) | | `noAntrian` | - | Bisa disimpan sebagai informasi tambahan atau di-generate dari `Nomor_tiket` | | `klinik` | `Jenis_layanan` (?) | FK ke `data_jenis_layanan.id` (harus lookup berdasarkan nama klinik) | | `pembayaran` | `Penjamin` | FK ke `daftar_penjamin.id` (harus lookup: "BPJS" → id penjamin BPJS, "UMUM" → id penjamin UMUM) | | `loket` | `Loket` | FK ke `data_loket.id` (harus lookup berdasarkan nama loket) | | `loketId` | `Loket` | FK ke `data_loket.id` (jika ada, langsung gunakan) | | `fastTrack` | `Status_fasttrack` | FK ke lookup `ID: Status_fasttrack` (1 = True jika "YA", 0 = False jika "TIDAK") | | `fastTrack` | `Alasan_fasttrack` | Alasan fast track (string, bisa null jika "TIDAK") | | `processStage` | `Status_kunjungan` | FK ke lookup `ID: Status_kunjungan` (harus mapping: "loket" → 1, "klinik" → 2, dll) | | `shift` | - | Shift diambil dari `data_jenis_layanan_shift` berdasarkan jadwal | | - | `FK_kunjunganantrean_ten` | FK ke `data_kunjungan_antrean.id` | | - | `Jenis_kunjungan` | FK ke `daftar_jenis_kunjungan.id` (default atau lookup) | | - | `Jenis_pelayanan` | FK ke `daftar_jenis_pelayanan.id` (bisa dari `data_jenis_layanan.Jenis_pelayanan`) | | - | `Dokter` | FK ke `data_pegawai.id` (null jika belum ditentukan) | | - | `Jam_awal` | Jam mulai pelayanan (bisa dari `jamPanggil` atau null) | | - | `Jam_selesai` | Jam selesai pelayanan (null jika belum selesai) | | - | `Tanggal_ambil_hasil` | Tanggal ambil hasil (null jika belum) | | - | `Status_active` | Status aktif (default: 1 = Active) | **Mapping Status:** - `status: "di-loket"` → `Status_kunjungan` = 1 (LOKET) - `status: "waiting"` → `Status_kunjungan` = 2 (PENDING) atau sesuai lookup - `processStage: "klinik"` → `Status_kunjungan` = 2 (KLINIK) - `processStage: "loket"` → `Status_kunjungan` = 1 (LOKET) **Mapping FastTrack:** - `fastTrack: "YA"` → `Status_fasttrack` = 1 (True) - `fastTrack: "TIDAK"` → `Status_fasttrack` = 0 (False) --- ### 3. **data_kunjungan_tempat_panggilan** (Riwayat Panggilan) | Field Code | Field ERD | Keterangan | |------------|-----------|------------| | `jamPanggil` | `Jam_panggilan` | Jam panggilan pasien (format: "HH:MM") | | `status` | `Status_panggilan` | FK ke lookup `ID: Status_panggilan` (harus mapping berdasarkan context) | | `processStage` | `Status_kunjungan` | FK ke lookup `ID: Status_kunjungan` | | - | `Nama_tempat_panggilan` | Nama tempat panggilan (bisa dari `loket` atau `klinik`) | | - | `FK_kunjungantempallayana` | FK ke `data_kunjungan_tempat_layanan.id` | | - | `Status_active` | Status aktif (default: 1 = Active) | **Mapping Status Panggilan:** - Panggilan di Anjungan → `Status_panggilan` = 1 (ANJUNGAN) - Panggilan di Pendaftaran → `Status_panggilan` = 2 (PENDAFTARAN) - Panggilan di Pelayanan → `Status_panggilan` = 3 (PELAYANAN) - Panggilan ambil hasil → `Status_panggilan` = 4 (AMBIL HASIL) --- ### 4. **data_kunjungan_tempat_layanan_detail** (Detail Status Kunjungan) | Field Code | Field ERD | Keterangan | |------------|-----------|------------| | `createdAt` | `Tanggal_detail` | Tanggal detail status (bisa dari `createdAt`) | | `status` | `Status_kunjungan` | FK ke lookup `ID: Status_kunjungan` | | - | `FK_kunjungantempallayana` | FK ke `data_kunjungan_tempat_layanan.id` | | - | `Status_active` | Status aktif (default: 1 = Active) | **Catatan:** Tabel ini untuk tracking perubahan status kunjungan dari waktu ke waktu. --- ### 5. **data_pasien** (Data Pasien - Jika Belum Ada) | Field Code | Field ERD | Keterangan | |------------|-----------|------------| | `barcode` | `Nomor_rekamedik` | Bisa digunakan sebagai nomor rekam medis sementara | | - | `Nama` | Nama pasien (harus diinput atau dari sistem lain) | | - | `Nomor_identitas` | NIK/KTP (harus diinput atau dari sistem lain) | | - | `Nomor_bpjs` | Nomor BPJS (jika `pembayaran` = "BPJS") | | - | `Status_antrean` | Status antrian pasien | | - | `Status_active` | Status aktif (default: 1 = Active) | **Catatan:** Jika pasien belum ada di database, harus dibuat record baru di `data_pasien` terlebih dahulu. --- ### 6. **Lookup Tables yang Digunakan** #### **ID: Status_fasttrack** - 0: False - 1: True #### **ID: Status_kunjungan** - 1: LOKET - 2: KLINIK - 3: FARMASI - 4: PENUNJANG - 5: RAWAT INAP **Atau (versi status):** - 1: ACTIVE - 2: PENDING - 3: TERLAMBAT - 4: KONSUL - 5: BATAL - 6: GAGAL - 7: AMBIL HASIL - 8: SELESAI PELAYANAN #### **ID: Status_panggilan** - 1: ANJUNGAN - 2: PENDAFTARAN - 3: PELAYANAN - 4: AMBIL HASIL #### **ID: Status_active** - 0: Disabled - 1: Active --- ## Alur Penyimpanan Data ### Step 1: Cek/Create Pasien 1. Cari `data_pasien` berdasarkan `barcode` atau `Nomor_rekamedik` 2. Jika tidak ada, buat record baru di `data_pasien` ### Step 2: Create Kunjungan Antrean 1. Insert ke `data_kunjungan_antrean`: - `Barcode` = `barcode` - `Pasien` = `data_pasien.id` (dari step 1) - `Tanggal_daftar` = `createdAt` - `Status_active` = 1 ### Step 3: Create Tempat Layanan 1. Lookup `data_jenis_layanan.id` berdasarkan `klinik` (nama klinik) 2. Lookup `daftar_penjamin.id` berdasarkan `pembayaran` ("BPJS" atau "UMUM") 3. Lookup `data_loket.id` berdasarkan `loket` atau `loketId` 4. Insert ke `data_kunjungan_tempat_layanan`: - `Nomor_tiket` = `no` - `FK_kunjunganantrean_ten` = `data_kunjungan_antrean.id` (dari step 2) - `Jenis_layanan` = `data_jenis_layanan.id` - `Penjamin` = `daftar_penjamin.id` - `Loket` = `data_loket.id` - `Status_fasttrack` = 1 jika `fastTrack` = "YA", else 0 - `Status_kunjungan` = mapping dari `processStage` atau `status` - `Status_active` = 1 ### Step 4: Create Panggilan (Jika Ada) 1. Insert ke `data_kunjungan_tempat_panggilan`: - `FK_kunjungantempallayana` = `data_kunjungan_tempat_layanan.id` (dari step 3) - `Jam_panggilan` = `jamPanggil` - `Nama_tempat_panggilan` = `loket` atau `klinik` - `Status_panggilan` = mapping berdasarkan context - `Status_kunjungan` = mapping dari `processStage` - `Status_active` = 1 ### Step 5: Create Detail Status (Optional) 1. Insert ke `data_kunjungan_tempat_layanan_detail`: - `FK_kunjungantempallayana` = `data_kunjungan_tempat_layanan.id` - `Tanggal_detail` = `createdAt` - `Status_kunjungan` = mapping dari `status` atau `processStage` - `Status_active` = 1 --- ## Field yang Tidak Langsung Map ### Field yang Perlu Lookup/Transform: 1. **`klinik`** → Perlu lookup ke `data_jenis_layanan.id` berdasarkan nama 2. **`pembayaran`** → Perlu lookup ke `daftar_penjamin.id` berdasarkan value ("BPJS" atau "UMUM") 3. **`loket`** → Perlu lookup ke `data_loket.id` berdasarkan nama loket 4. **`shift`** → Perlu lookup ke `data_jenis_layanan_shift.id` berdasarkan shift dan jadwal 5. **`status`** → Perlu mapping ke lookup `ID: Status_kunjungan` 6. **`processStage`** → Perlu mapping ke lookup `ID: Status_kunjungan` 7. **`fastTrack`** → Perlu mapping ke lookup `ID: Status_fasttrack` (0 atau 1) ### Field yang Hanya untuk Display/Reference: 1. **`noAntrian`** → Format display, bisa di-generate ulang dari `Nomor_tiket` dan `Barcode` 2. **`referencePatient`** → Reference ke kunjungan sebelumnya (relasi ke `data_kunjungan_antrean` lain) --- ## Contoh Mapping Lengkap ### Input Data: ```javascript { no: 1, jamPanggil: "12:49", barcode: "26011395625", noAntrian: "UM1001 | Online - 26011395625", shift: "Shift 1", klinik: "KANDUNGAN", fastTrack: "YA", pembayaran: "BPJS", status: "di-loket", processStage: "loket", createdAt: "2026-01-13T16:51:35.502Z", loket: "Loket A", loketId: 1 } ``` ### Output ke Database: #### data_kunjungan_antrean: ```sql INSERT INTO data_kunjungan_antrean ( Barcode, Pasien, Tanggal_daftar, Status_active ) VALUES ( '26011395625', [data_pasien.id], -- dari lookup '2026-01-13T16:51:35.502Z', 1 ); ``` #### data_kunjungan_tempat_layanan: ```sql INSERT INTO data_kunjungan_tempat_layanan ( Nomor_tiket, FK_kunjunganantrean_ten, Penjamin, -- lookup dari "BPJS" Jenis_layanan, -- lookup dari "KANDUNGAN" Loket, -- lookup dari "Loket A" atau langsung 1 Status_fasttrack, -- 1 (karena "YA") Status_kunjungan, -- 1 (karena "loket" → LOKET) Status_active ) VALUES ( 1, [data_kunjungan_antrean.id], [daftar_penjamin.id WHERE Penjamin = 'BPJS'], [data_jenis_layanan.id WHERE Nama_jenis_layanan = 'KANDUNGAN'], 1, 1, 1, 1 ); ``` #### data_kunjungan_tempat_panggilan: ```sql INSERT INTO data_kunjungan_tempat_panggilan ( FK_kunjungantempallayana, Jam_panggilan, Nama_tempat_panggilan, Status_panggilan, -- 2 (PENDAFTARAN) atau sesuai context Status_kunjungan, -- 1 (LOKET) Status_active ) VALUES ( [data_kunjungan_tempat_layanan.id], '12:49', 'Loket A', 2, -- PENDAFTARAN 1, -- LOKET 1 ); ``` --- ## Catatan Penting 1. **Foreign Key Lookups**: Banyak field yang memerlukan lookup ke tabel lain sebelum insert 2. **Status Mapping**: Field `status` dan `processStage` perlu mapping ke lookup table `ID: Status_kunjungan` 3. **Default Values**: Field yang tidak ada di code perlu diisi dengan default value atau null 4. **Relasi**: `referencePatient` bisa digunakan untuk membuat relasi ke `data_kunjungan_antrean` sebelumnya 5. **Shift**: Field `shift` perlu diambil dari `data_jenis_layanan_shift` berdasarkan jadwal dan jenis layanan