322 lines
11 KiB
Markdown
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
|
|
|
|
|