FHM09062601IBL - update runbook PDP: field tabel, DOB VARCHAR, NIK_bidx dari IDNumber, migration steps baru
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
36
CLAUDE.md
36
CLAUDE.md
@@ -21,38 +21,12 @@
|
|||||||
|
|
||||||
## PDP Encryption & BIRT Report
|
## PDP Encryption & BIRT Report
|
||||||
|
|
||||||
UU PDP No. 27/2022 mengharuskan enkripsi PII pasien. `M_PatientDOB`, `M_PatientName`, dll
|
Dokumentasi lengkap ada di **`docs/pdp-encryption-runbook.md`**.
|
||||||
di-mask di kolom plain, nilai asli ada di kolom `_enc` (AES-256-GCM).
|
|
||||||
|
|
||||||
### Pola kolom PDP di m_patient
|
Poin penting yang sering terlewat:
|
||||||
|
- `M_PatientNIK_bidx` diisi dari **`M_PatientIDNumber`**, bukan kolom `M_PatientNIK`
|
||||||
| Kolom plain | Tipe | Isi plain | `_enc` | `_bidx` | Sumber bidx |
|
- `M_PatientDOB` bertipe `VARCHAR(20)` (bukan DATE) agar masked value `**-**-YYYY` tersimpan
|
||||||
|---|---|---|---|---|---|
|
- `Mcu_PreregisterPatientsDOB` juga `VARCHAR(20)` — tidak punya `_enc`, data asli di `m_patient`
|
||||||
| `M_PatientName` | VARCHAR | masked (`A*** B***`) | ✓ | ✓ | `M_PatientName` |
|
|
||||||
| `M_PatientHP` | VARCHAR | masked | ✓ | ✓ | `M_PatientHP` |
|
|
||||||
| `M_PatientDOB` | **VARCHAR(20)** | masked (`**-**-YYYY`) | ✓ | ✓ | `M_PatientDOB` (format d-m-Y) |
|
|
||||||
| `M_PatientIDNumber` | VARCHAR | masked (`1234**...**09`) | ✓ | — | — |
|
|
||||||
| `M_PatientNIK` | VARCHAR | plain (kosong/lama) | ✓ | ✓ | **`M_PatientIDNumber`** ← penting |
|
|
||||||
|
|
||||||
`M_PatientDOB` diubah ke `VARCHAR(20)` (dari DATE) agar nilai masked `**-**-YYYY` bisa tersimpan.
|
|
||||||
`_mask_dob($v)` menerima format `d-m-Y` dan mengembalikan `**-**-YYYY`.
|
|
||||||
|
|
||||||
**`M_PatientNIK_bidx` diisi dari `M_PatientIDNumber`**, bukan dari kolom `M_PatientNIK`.
|
|
||||||
Ini pola yang dipakai `ibl_registration/Patient.php` dan `Registrationv3.php`.
|
|
||||||
Search e[3] (format `Nama+HP+DOB+NIK`) menggunakan `JSON_CONTAINS(M_PatientNIK_bidx, '"hash"')`.
|
|
||||||
|
|
||||||
Data lama yang disimpan sebelum pola ini diterapkan tidak akan punya `M_PatientNIK_bidx`
|
|
||||||
— perlu di-save ulang atau backfill script untuk bisa dicari by IDNumber.
|
|
||||||
|
|
||||||
### Daftar migration PDP yang sudah diterapkan
|
|
||||||
|
|
||||||
| File | Keterangan |
|
|
||||||
|---|---|
|
|
||||||
| `sql/manual_changes/2026-05-31-pdp-encrypt-columns.sql` | Tambah kolom `_enc` dan `_bidx` di m_patient, m_patientaddress, log tables |
|
|
||||||
| `sql/manual_changes/2026-05-31-pdp-update-triggers-enc.sql` | Update trigger untuk populate `_enc` |
|
|
||||||
| `sql/manual_changes/2026-06-08-pdp-fo-birt-sp-patient-print-cache.sql` | SP cache untuk BIRT |
|
|
||||||
| `sql/manual_changes/2026-06-11-alter-m-patient-dob-to-varchar.sql` | Ubah `M_PatientDOB` DATE → VARCHAR(20) |
|
|
||||||
| `sql/manual_changes/2026-06-11-alter-mcu-preregister-dob-to-varchar.sql` | Ubah `Mcu_PreregisterPatientsDOB` DATE → VARCHAR(20) |
|
|
||||||
|
|
||||||
### Pola wajib: PHP Proxy Stream
|
### Pola wajib: PHP Proxy Stream
|
||||||
|
|
||||||
|
|||||||
@@ -84,10 +84,17 @@ mysql one_lab < sql/manual_changes/2026-05-31-pdp-encrypt-columns.sql
|
|||||||
# Update trigger m_patient & m_patientaddress (pakai _enc di log JSON)
|
# Update trigger m_patient & m_patientaddress (pakai _enc di log JSON)
|
||||||
mysql one_lab < sql/manual_changes/2026-05-31-pdp-update-triggers-enc.sql
|
mysql one_lab < sql/manual_changes/2026-05-31-pdp-update-triggers-enc.sql
|
||||||
|
|
||||||
|
# Ubah M_PatientDOB dari DATE ke VARCHAR(20) agar masked value tersimpan
|
||||||
|
mysql one_lab < sql/manual_changes/2026-06-11-alter-m-patient-dob-to-varchar.sql
|
||||||
|
|
||||||
|
# Ubah Mcu_PreregisterPatientsDOB dari DATE ke VARCHAR(20) (sama)
|
||||||
|
mysql one_lab < sql/manual_changes/2026-06-11-alter-mcu-preregister-dob-to-varchar.sql
|
||||||
|
|
||||||
# Verifikasi kolom terbentuk
|
# Verifikasi kolom terbentuk
|
||||||
mysql -e "SHOW COLUMNS FROM one_lab.m_patient LIKE '%_enc';"
|
mysql -e "SHOW COLUMNS FROM one_lab.m_patient LIKE '%_enc';"
|
||||||
mysql -e "SHOW COLUMNS FROM one_lab.m_patient LIKE '%_bidx';"
|
mysql -e "SHOW COLUMNS FROM one_lab.m_patient LIKE '%_bidx';"
|
||||||
mysql -e "SHOW COLUMNS FROM one_lab.m_patientaddress LIKE '%_enc';"
|
mysql -e "SHOW COLUMNS FROM one_lab.m_patientaddress LIKE '%_enc';"
|
||||||
|
mysql -e "SHOW COLUMNS FROM one_lab.m_patient WHERE Field = 'M_PatientDOB'\G"
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -258,17 +265,17 @@ mysql -e "SHOW STATUS LIKE 'Threads_connected';"
|
|||||||
## Field yang Dienkripsi
|
## Field yang Dienkripsi
|
||||||
|
|
||||||
### `one_lab.m_patient`
|
### `one_lab.m_patient`
|
||||||
| Field | `_enc` | `_bidx` (search) |
|
| Field | Tipe kolom plain | `_enc` | `_bidx` (search) | Catatan |
|
||||||
|-------|:------:|:----------------:|
|
|-------|:---:|:------:|:----------------:|---------|
|
||||||
| M_PatientName | ✅ | ✅ |
|
| M_PatientName | VARCHAR | ✅ | ✅ | |
|
||||||
| M_PatientHP | ✅ | ✅ |
|
| M_PatientHP | VARCHAR | ✅ | ✅ | |
|
||||||
| M_PatientDOB | ✅ | ✅ |
|
| M_PatientDOB | **VARCHAR(20)** | ✅ | ✅ | Diubah dari DATE → VARCHAR agar mask `**-**-YYYY` tersimpan |
|
||||||
| M_PatientNIK | ✅ | ✅ |
|
| M_PatientNIK | VARCHAR | ✅ | ✅ | ⚠️ `M_PatientNIK_bidx` diisi dari **`M_PatientIDNumber`**, bukan NIK |
|
||||||
| M_PatientEmail | ✅ | — |
|
| M_PatientEmail | VARCHAR | ✅ | — | |
|
||||||
| M_PatientPhone | ✅ | — |
|
| M_PatientPhone | VARCHAR | ✅ | — | |
|
||||||
| M_PatientPOB | ✅ | — |
|
| M_PatientPOB | VARCHAR | ✅ | — | |
|
||||||
| M_PatientIDNumber | ✅ | — |
|
| M_PatientIDNumber | VARCHAR | ✅ | — | Masked plain, bidx-nya lewat `M_PatientNIK_bidx` |
|
||||||
| M_PatientNIP | ✅ | — |
|
| M_PatientNIP | VARCHAR | ✅ | — | |
|
||||||
|
|
||||||
### `one_lab.m_patientaddress`
|
### `one_lab.m_patientaddress`
|
||||||
| Field | `_enc` | `_bidx` |
|
| Field | `_enc` | `_bidx` |
|
||||||
@@ -373,13 +380,16 @@ mysql one_lab < sql/manual_changes/2026-05-31-pdp-birt-sp-cache-join.sql
|
|||||||
|
|
||||||
Data PII yang dimasking saat INSERT ke staging table `mcu_preregister_patients`:
|
Data PII yang dimasking saat INSERT ke staging table `mcu_preregister_patients`:
|
||||||
|
|
||||||
| Field | Mask |
|
| Field | Tipe kolom | Mask |
|
||||||
|-------|------|
|
|-------|:---:|------|
|
||||||
| `*PatientName` | `_mask_name()` |
|
| `*PatientName` | VARCHAR | `_mask_name()` |
|
||||||
| `*KTP` | `_mask_id()` |
|
| `*KTP` | VARCHAR | `_mask_id()` |
|
||||||
| `*NIP` / `*NIK` | `_mask_id()` |
|
| `*NIP` / `*NIK` | VARCHAR | `_mask_id()` |
|
||||||
| `*Email` | `_mask_email()` |
|
| `*Email` | VARCHAR | `_mask_email()` |
|
||||||
| `*Hp` | `_mask_phone()` |
|
| `*Hp` | VARCHAR | `_mask_phone()` |
|
||||||
|
| `*DOB` | **VARCHAR(20)** | `_mask_dob()` — diubah dari DATE → VARCHAR agar mask `**-**-YYYY` tersimpan |
|
||||||
|
|
||||||
|
Tidak ada kolom `_enc` di tabel ini — data asli bisa diambil dari `m_patient` via `*M_PatientID`.
|
||||||
|
|
||||||
4 lokasi INSERT yang sudah diupdate: `savecsv()` & `save()` di setupmcuoffline-ibl, `save()` & `savenewform()` di mcuoffline/Preregisterapp.
|
4 lokasi INSERT yang sudah diupdate: `savecsv()` & `save()` di setupmcuoffline-ibl, `save()` & `savenewform()` di mcuoffline/Preregisterapp.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user