# 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


