# pacs_downloadiso Module — Integration Analysis ## Overview The `pacs_downloadiso` module (under `/data/newsas-git/hisv2/his2_dev_raw/module/pacs_downloadiso/`) is the HIS frontend that drives the mkiso scripts. It runs inside the HIS web app and its JavaScript opens new browser windows pointing at scripts on the **PACS host**. --- ## Two-Server Architecture ``` ┌────────── HIS Server ──────────┐ ┌────── PACS Server ──────┐ │ │ │ │ │ pacs_downloadiso/ │ HTTP │ mkiso.php │ │ index.php (UI) │ ──────→ │ mkiso_multiple.php │ │ pacs_downloadiso.php (API) │ │ send_rimage_multiple.* │ │ │ │ │ │ hiscnf/config.php │ │ ABPACS:11112 │ │ $_PACS_host (PACS server IP)│ │ CDRECORD:10104 │ │ $_PACS │ │ │ │ $_CDPUBLISHER │ │ /usr/local/dcm4che/ │ │ │ │ /usr/bin/genisoimage │ │ DB: rsabt201107 (192.168.2.7) │ │ /var/www/html/microdicom│ │ trxdepartemen │ │ │ │ pacs_result_series │ │ pacsdb_his:3306 │ │ regpas / medrec │ │ (192.168.2.7) │ └────────────────────────────────┘ └─────────────────────────┘ ``` - **HIS DB** (`rsabt201107`) — transaction data, patient registration, PACS result tracking - **PACS DB** (`pacsdb_his`) — `mkiso_multiple.php` queries it directly for patient name lookup via `AccessionNumber` - **Config key**: `$_PACS_host` in `hiscnf/config.php` tells the HIS frontend where the PACS web server is --- ## Endpoints Called by HIS Frontend | HIS JS Function | HTTP Call | PACS Script | Parameters | |-----------------|-----------|-------------|------------| | `dowloadiso()` | `window.open` | `/mkiso.php` | `?accession_number=X` | | `printiso()` | `window.open` | `/send_rimage_multiple.php` | `?accession_number=X` | | `fn_downloadisomultiple()` | `window.open` | `/mkiso_multiple.php` | `?accession_number=X,Y,Z` (JS array .toString()) | | `fn_printisomultiple()` | `window.open` | `/send_rimage_multiple.php` | `?accession_number=X,Y,Z` (JS array .toString()) | ### Single vs Multi accession decision The HIS UI determines which to call based on **how many AccessionNumbers a TrxDepartemenID has**: - **1 AccessionNumber** → shows "Download ISO" button → calls `dowloadiso()` → `/mkiso.php?accession_number=X` - **>1 AccessionNumber** → shows "Download" link → opens multi dialog → calls `fn_downloadisomultiple()` → `/mkiso_multiple.php?accession_number=X,Y,Z` The decision is made in `ambildatapreview()` (line ~163 in `pacs_downloadiso.php`): ```php if($JumAccessionNo>1){ $Action = "..."; } else { $Action = "..."; } ``` --- ## mkiso2.php — NOT Called by HIS **The `mkiso2.php` script is absent from all HIS integration points.** It was found in the local `/data/notes/my-task/mkiso/` directory but: - Not referenced in `pacs_downloadiso/index.php` (JS) - Not referenced in `pacs_downloadiso/pacs_downloadiso.php` (PHP) - Not mentioned in any config `mkiso2.php` is a **DICOM relay** that fetches from `ABPACS@localhost:11112` and forwards to `172.16.0.120:104` using `dcmsend`. It appears to be a standalone utility, possibly run manually or by cron. **Action:** Mark mkiso2.php as lower priority in the migration todo. --- ## send_rimage_multiple.php — Out of Scope Not present in local mkiso project. This is a **CD Publisher print script** on the PACS server. It's conditionally shown only when `$_CDPUBLISHER=='Y'`. Not part of the Java→dcmtk migration. --- ## AJAX API Flow (HIS Backend → PACS Host Resolution) ### 1. Single download path (`dowloadiso()`) ``` User clicks "Download ISO" → AJAX: pacs_downloadiso.php?exe=cek_data_accessionno&AccessionNumber=X → PHP: checks pacs_result_series table for Published='Y' → Response: { OK: "OK", PACS_HOST: "192.168.x.x" } → JS: window.open("http://{PACS_HOST}/mkiso.php?accession_number=X") ``` The `PACS_HOST` comes from `hiscnf/config.php` (`$_PACS_host`). The HIS module never constructs a URL with hardcoded PACS IP — it always resolves via AJAX or config. ### 2. Multi download path (`fn_downloadisomultiple()`) ``` User clicks "Download ISO" (multi dialog) → JS: get_config_pacs() — synchronous AJAX to pacs_downloadiso.php?exe=ambil_config_pacs → Response: { PACS_HOST: "192.168.x.x" } → JS: collects checked AccessionNumbers from flexigrid → JS: window.open("http://{PACS_HOST}/mkiso_multiple.php?accession_number=X,Y,Z") ``` ### 3. Print ISO paths (`printiso()` / `fn_printisomultiple()`) Same pattern but calling `/send_rimage_multiple.php` instead. --- ## Config Dependencies The `pacs_downloadiso.php` backend uses these config variables (from `hiscnf/config.php`): | Config Variable | Purpose | Used In | |----------------|---------|---------| | `$_PACS` | Must be `'1'` to enable the module | `cek_setting_pacs()`, `cek_data_accessionno()`, `ambil_config_pacs()` | | `$_PACS_host` | PACS server IP/hostname (where mkiso scripts live) | `cek_data_accessionno()`, `ambil_config_pacs()` | | `$_CDPUBLISHER` | If `'Y'`, show "Print ISO" button | `index.php` (inline PHP) | | `$_RAD_Workorder` | If `1`, filter by WorkOrder only | `ambildatapreview()` | | `$_trxdepartemen_verif` | If `'Y'`, exclude verification field from query | `ambildatapreview()` | Also includes `hiscnf/pacsdownloadiso.config.php` — only used for `$_CDPUBLISHER`. --- ## Database Tables Involved ### HIS DB (`rsabt201107`) | Table | Role | |-------|------| | `trxdepartemen` | Transaction header — RegID, TrxID, Tanggal, DepartemenID, WorkOrder | | `trxlayanan` | Links TrxLayananID → TrxDepartemenID | | `regpas` | Patient registration — Nama, MEDRECID | | `medrec` | Medical records — Nama (patient name) | | `departemen` | Department — Nama, ModulExternal, NamaModulExternal | | `dokter` | Doctor — Nama | | `masterlayanan` | Service catalog — Nama, ModalityCode | | `pacs_result_series` | PACS result tracking — AccessionNumber, Published, TrxDepartemenID | | `pacs_order_mwl` | PACS worklist — AccessionNumber, TrxDepartemenID | ### PACS DB (`pacsdb_his` on 192.168.2.7) | Table | Use by mkiso_multiple.php | |-------|---------------------------| | `pacs_result_series` | Lookup `MEDRECID`, `RegID` from `AccessionNumber` | | `medrec` | Lookup `Nama` (patient name) from `MEDRECID` | --- ## Key Observations for dcmtk Migration ### 1. `PACS_HOST` is a config variable — must update on the PACS server only The HIS module points to whatever `$_PACS_host` is. **No code changes needed in the HIS module** for the mkiso migration. All changes are on the PACS server where `mkiso.php`, `mkiso_multiple.php`, and `mkiso2.php` live. ### 2. Concurrent requests are possible Multiple HIS users might click "Download ISO" at once. The current Java-based approach binds to **port 10104** (hardcoded). With dcmtk `storescp`, you need a unique port per request to avoid conflicts. ### 3. mkiso2.php is standalone — can be batched Not called by HIS. Can be migrated independently or de-prioritized. ### 4. send_rimage_multiple.php out of scope Not part of the mkiso scripts. Leave as-is. ### 5. No changes to HIS module needed The AJAX calls pass `AccessionNumber` as a query parameter to scripts on the PACS host. The mkiso scripts' **external interface** (GET parameter `accession_number`) does not change. Only the internal DICOM fetching mechanism changes. ### 6. Multi-accession parameter format `mkiso_multiple.php` receives `?accession_number=X,Y,Z` (comma-separated). The `mkiso_multiple.php` script already handles this format via `explode(",", ...)`. No change needed. --- ## Verification Checklist (Post-Migration) - [ ] HIS preview still shows PACS studies with correct Status and Download buttons - [ ] Single accession download: `window.open` to `/mkiso.php?accession_number=X` works - [ ] Multi accession download: `window.open` to `/mkiso_multiple.php?accession_number=X,Y,Z` works - [ ] Print ISO (CD Publisher) still works via `/send_rimage_multiple.php` - [ ] Config check: `cek_setting_pacs()` returns OK - [ ] AJAX: `cek_data_accessionno()` returns correct PACS_HOST and OK status - [ ] AJAX: `ambil_config_pacs()` returns correct PACS_HOST - [ ] No PHP errors in pacs_downloadiso.php after migration