Commit Graph

279 Commits

Author SHA1 Message Date
sas.fajri
1830710859 FHM08062601IBL - add untracked artefact 2026-06-08 09:03:50 +07:00
sas.fajri
68cda67c56 FHM31052601IBL - update runbook pdp: masking satu kata, controller baru, mcu staging & dashboard enc
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 20:11:58 +07:00
sas.fajri
065e3ebb34 FHM31052601IBL - pdp masking & enkripsi patient di controller dan SP mcu
- mask_name nama satu kata: tampil 2 char + bintang sisanya
- masking + enkripsi insert/update m_patient di Registrationv3, ibl_registration/Patient, Patientv4, setupmcuoffline-ibl/Preregister, mcuoffline/Preregisterapp
- masking insert ke mcu_preregister_patients (PatientName, KTP, NIK, Email, Hp)
- search patient pakai bidx, decrypt setelah query di mcuoffline/Preregisterapp
- matching existing patient ganti LIKE ke bidx search
- SP sp_upsert_mcu_patient_by_preregister_id & sp_upsert_mcu_patient_by_mgm_mcuid JOIN m_patient ambil _enc, simpan ke one_lab_dashboard.mcu_patient
- ALTER mcu_patient.Mcu_PatientName dan Mcu_PatientDOB ke TEXT

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 20:10:15 +07:00
sas.fajri
8c49b3356f FHM31052601IBL - tambah prompt dan checklist implementasi ke IBL production server
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 18:19:49 +07:00
sas.fajri
6ec3f338ee FHM31052601IBL - Report.php: auto populate cache + fetch_birt_pdf saat show=Y
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 18:18:52 +07:00
sas.fajri
620c8b051d FHM31052601IBL - update runbook: disk space warning, patient_print_cache, sp_rpt_t_002_eng
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 18:16:29 +07:00
sas.fajri
d4ecd7f06d FHM31052601IBL - populate decrypt cache sebelum semua BIRT/PDF fetch
- Ibl_patient_decrypt: tambah fetch_birt_pdf() + pre_cache_and_get_url()
- Reporturl.php: auto pre-cache sebelum return URL atau fetch PDF
- Rv_patient.php: pre_cache sebelum return URL ke frontend
- tgram/Hasil.php: fetch_birt_pdf() via dl_report()
- Qr_report_uploader.php: populate/delete cache wrapping download_file()
- Ibl_merge_report_gateway.php: populate/delete cache wrapping Go merge service call
- send_email.php: populate_birt_cache() + delete_birt_cache() untuk email attachment

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 18:04:36 +07:00
sas.fajri
a88360b1b1 FHM31052601IBL - update runbook: dokumentasi BIRT proxy + FPDF decrypt strategy
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 17:50:14 +07:00
sas.fajri
5c9daffb38 FHM31052601IBL - FPDF controllers: decrypt PII via Ibl_patient_decrypt library
- Ibl_patient_decrypt: helper populate/delete patient_print_cache + decrypt_row
- Inform_consent, Medical_checkup_report: decrypt langsung dari _enc (direct SQL)
- Kartu_kontrol, Rpt_t_002, Rpt_t_002_eng: populate cache sebelum call SP,
  delete cache setelah SP selesai

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 17:49:45 +07:00
sas.fajri
d7930d5dbc FHM31052601IBL - BIRT proxy + 5 SP header decrypt via patient_print_cache
- Birt_proxy.php: decrypt PII sebelum call BIRT, cache 5 menit
- 5 SP (hasil_header, _2, _eng, fo_001, card_patient): tambah LEFT JOIN
  ke patient_print_cache dengan COALESCE fallback ke masked data
- SP signature tidak berubah, .rptdesign tidak perlu diupdate

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 17:33:02 +07:00
sas.fajri
34d90c95b6 FHM31052601IBL - sampling & klinik controllers: decrypt PII pasien untuk pengambilan sampel
- samplinglab-v15, samplingradiodiagnostic-v5, samplingelectromedis-v5,
  doctorclinicv2: search via bidx, nolab search tanpa nama, decrypt di hasil
- sampling-lab-mobile-cpone-v10: decrypt nama/HP/email/DOB/NIP
- klinik/Registrationv3: search bidx (nama/HP/DOB/NIK), hapus address search, decrypt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 17:04:20 +07:00
sas.fajri
09c5f70284 FHM31052601IBL - fix mask_patient_plaintext: cursor-based pagination, pisahkan masking nama
Nama ditangani remask_patient_name.php (decrypt dari _enc).
Script ini handle HP/email/alamat/NIK/POB dengan cursor-based
agar tidak infinite loop pada nama pendek satu kata.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 16:53:17 +07:00
sas.fajri
90c156e51a FHM31052601IBL - strip PII (patient_name/address/phone/email) dari order_log sebelum INSERT
Data pasien tidak perlu masuk log — identitas sudah terenkripsi di m_patient
dan bisa di-trace via T_OrderHeaderID → M_PatientID.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 16:52:58 +07:00
sas.fajri
de7444d5d5 FHM31052601IBL - drop _enc hasil lab: nilai klinis bukan PII, trigger butuh plaintext
t_orderdetail, t_orderheader, so_resultentry*, member_eligible tidak dienkripsi.
Perlindungan via enkripsi identitas pasien (m_patient) + access control.
Hanya t_orderdelivery (email/HP delivery) yang tetap dienkripsi.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 15:49:37 +07:00
sas.fajri
c1b9891727 FHM31052601IBL - update runbook production: lengkapi semua step dan troubleshooting
Tambah: step truncate log_patient, format masking terbaru,
troubleshooting disk full + MySQL crash, controller sprint berikutnya.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 15:37:42 +07:00
sas.fajri
18501d07b8 FHM31052601IBL - batalkan enkripsi mcu_resume_results JSON
JSON tidak mengandung PII langsung (nama/NIK/DOB/alamat).
Enkripsi akan memberatkan global MCU report.
Data source (t_orderdetail) sudah dienkripsi.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 15:26:57 +07:00
sas.fajri
f744a25be8 FHM31052601IBL - tambah runbook implementasi enkripsi PII untuk production
Dokumentasi lengkap urutan eksekusi, field yang dienkripsi,
format masking, disk space requirement, dan restore procedure.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 15:24:24 +07:00
sas.fajri
f667050200 FHM31052601IBL - update format masking nama: kata pertama penuh + inisial kata berikutnya
"FAJRI HARDHITA" → "FAJRI H*******" lebih readable untuk operasional.
Script remask_patient_name.php untuk re-apply ke data yang sudah dimasking.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 15:23:19 +07:00
sas.fajri
ab7ed1c667 FHM31052601IBL - script migrasi NIK bidx dan address enc terpisah
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 15:19:55 +07:00
sas.fajri
a2d69d1618 FHM31052601IBL - search patient by nama/HP/DOB/NIK, hapus address bidx, tambah NIK bidx
- Search sekarang: nama, HP, DOB, NIK (alamat dihapus - boros disk)
- Tambah M_PatientNIK_bidx untuk search by NIK
- Migration script: NIK bidx + hapus address bidx dari m_patientaddress

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 15:15:33 +07:00
sas.fajri
5350ab51cc FHM31052601IBL - Patientv4: masterdata pasien tampil data lengkap (decrypt _enc)
- search() pakai trigram bidx, return data terdekripsi
- save()/newpatient(): enkripsi + masking plaintext
- getaddress(): dekripsi alamat
- savenewaddress()/saveeditaddress(): enkripsi + masking alamat

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 14:55:43 +07:00
sas.fajri
82640c3d3b FHM31052601IBL - Patient add_new/edit: tulis masked value ke kolom plaintext lama
Kolom lama (M_PatientName, HP, Email, dll) kini menyimpan nilai masked.
Data asli tetap aman di _enc. Konsisten dengan bulk masking script.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 14:49:09 +07:00
sas.fajri
e990609523 FHM31052601IBL - script masking kolom plaintext PII m_patient & m_patientaddress
Semua 300+ controller otomatis tampilkan data termasking tanpa perlu
diupdate satu-satu. Data asli tetap aman di kolom _enc.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 14:47:29 +07:00
sas.fajri
6c0394aea3 FHM31052601IBL - migration script enkripsi t_orderdelivery destination
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 14:32:54 +07:00
sas.fajri
17a788baac FHM31052601IBL - update FO registration controllers: decrypt PII sebelum return response
- Payment, History, Delivery: load ibl_encryptor, decrypt Name/Email/HP
- Order, Order copy: decrypt patient_name di get_header & get_order_header
- Order: pre-fetch decrypt email/HP sebelum UNION delivery query
- Order: enkripsi T_OrderDeliveryDestination saat INSERT, decrypt saat SELECT
- SQL: tambah kolom T_OrderDeliveryDestination_enc
- migrate_encrypt_results: tambah migrasi t_orderdelivery

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 14:31:54 +07:00
sas.fajri
c63afddaa0 FHM31052601IBL - update trigger m_patient & m_patientaddress pakai _enc di log JSON
Ganti field PII plaintext (Name, HP, Email, DOB, NIK, IDNumber, dll)
dengan field _enc di JSON log_patient. Trigger m_patient_bu tetap
UPPER-kan M_PatientName untuk backward compat.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 14:20:23 +07:00
sas.fajri
2d7151b154 FHM31052601IBL - fix syntax migrate_encrypt_results.php compat PHP 7.2
Ganti arrow function fn() ke closure biasa karena server pakai PHP 7.2

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 14:12:58 +07:00
sas.fajri
c410d7bbd9 FHM31052601IBL - implementasi enkripsi PII pasien dan data medis (UU PDP)
- Tambah .env loader di index.php untuk IBL_ENCRYPT_KEY dan IBL_ENCRYPT_SEARCH_KEY
- Library Ibl_encryptor: AES-256-GCM encrypt/decrypt + trigram blind index untuk partial search
- SQL migration: tambah kolom _enc dan _bidx di 16 tabel (m_patient, m_patientaddress, hasil lab, log)
- Script backup_pdp_tables.sh: backup tabel terdampak sebelum migrasi
- Script migrate_encrypt_patient.php: enkripsi batch 178K data PII pasien
- Script migrate_encrypt_results.php: enkripsi data medis hasil lab dan log
- Patient.php: search via trigram blind index, add_new/edit enkripsi sebelum save

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 14:07:42 +07:00
sas.fajri
cf8ef0e590 FHM29052601IBL - add GET /report/qr/{id} preview endpoint dari qr_printout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 16:33:00 +07:00
sas.fajri
a3f9e04787 FHM29052601IBL - simplify stream_from_qr_printout tanpa get_order_header
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 16:02:46 +07:00
sas.fajri
84e0d60d23 FHM29052601IBL - add merge_from_qr endpoint via qr_printout URLs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 15:54:16 +07:00
sas.fajri
fd9511171b FHM29052601IBL - implement ibl_merge_report_service Go service
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 15:39:51 +07:00
sas.fajri
f2f1aed4b2 FHM29052601IBL - integrate merge gateway 2026-05-29 14:21:47 +07:00
sas.fajri
bd904ddeb1 FHM29052601IBL - Initial Deploy Merge Report 2026-05-29 13:02:54 +07:00
sas.fajri
6206acadad Fix savefisik column names 2026-05-26 07:04:16 +07:00
sas.fajri
6d7563151d Seed riwayat from form template 2026-05-26 06:15:27 +07:00
sas.fajri
566f3f9b09 Reuse preregister form row 2026-05-25 22:43:13 +07:00
sas.fajri
7dec255168 riwayatpreregisterform: join m_company via mgm_mcu bukan CompanyNumber
JOIN m_company langsung dari Mcu_PreregisterPatientsCompanyNumber diganti
LEFT JOIN mgm_mcu → m_company, karena CompanyNumber bisa kosong tapi
Mgm_McuM_CompanyID selalu terisi.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 22:02:11 +07:00
sas.fajri
34b9f3fac2 Dedup group result details 2026-05-25 11:06:42 +07:00
sas.fajri
7007e8d9cf Add xray upload endpoints 2026-05-25 06:28:57 +07:00
sas.fajri
900af581eb Search nolab by lab number OR patient name in search_v2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 22:37:27 +07:00
sas.fajri
2d6c2b9fa2 Add status/name/nolab/company filters to search_v2
Previously search_v2 ignored all filters from the request.
Now status=''/any, name, nolab, company are applied dynamically.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 22:36:26 +07:00
sas.fajri
46c3138f3c Deactivate t_send_email when email delivery unchecked (chex=N)
When save_delivery_additional_other receives chex=N for an EMAIL
delivery, also set t_send_email.T_SendEmailIsActive='N' for rows
with status D/E/C — previously only t_orderdelivery was deactivated.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 22:20:13 +07:00
sas.fajri
67d4431361 Log cancel and send actions to one_lab_log.t_send_email_log via db_log
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 22:15:13 +07:00
sas.fajri
bc8b0dd0df Add cancel_email endpoint: only cancels when status is S
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 22:13:02 +07:00
sas.fajri
6dec35217f Align status flow: D=Draft S=Sending P=Process R=Received E=Error C=Cancel
Script picks S, locks to P, sets R on success.
On failure: back to S for retry; after max retry (3) sets E and logs to one_lab_log.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 22:07:51 +07:00
sas.fajri
409c156310 Set status P (processing) before send, revert to S on failure
Prevents UI re-trigger while email is in flight. Status flow:
S (scheduled) → P (processing) → D (delivered) / S (failed, retryable)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 22:04:06 +07:00
sas.fajri
d83f0f303b Insert send log to one_lab_log.t_send_email_log with correct schema
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 21:59:42 +07:00
sas.fajri
1c588f1d7d Build T_SendEmailReports from qr_printout with id/url/result format
Done.php send_email_v2: query qr_printout to build structured reports
array [{"id","url","result"}] using QR_PrintOutGroup_ResultName instead
of relying on client-supplied reports param.

send_email.php: parse both old (URL string) and new (object) formats;
use result field as PDF attachment filename.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 21:52:31 +07:00
sas.fajri
69772125b5 Insert delivery record to t_send_email_log on successful send
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 21:48:06 +07:00