Files
web-antrean/MAPPING_DATA_TO_ERD.md
T
2026-01-14 15:14:07 +07:00

322 lines
11 KiB
Markdown

# 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