diff --git a/application/controllers/mockup/fo/walk_in_registration_stemcell/Order.php b/application/controllers/mockup/fo/walk_in_registration_stemcell/Order.php index 15a5179..8a6ec98 100644 --- a/application/controllers/mockup/fo/walk_in_registration_stemcell/Order.php +++ b/application/controllers/mockup/fo/walk_in_registration_stemcell/Order.php @@ -777,6 +777,16 @@ class Order extends MY_Controller } } + if ($icd10_code != '') { + $fn_save_icd10 = $this->save_icd10($header_id, $icd10_code, $icd10_display, $userid); + if (!$fn_save_icd10['status']) { + $this->db_smartone->trans_rollback(); + $message = $fn_save_icd10['message'] ?? 'Terjadi kesalahan saat menyimpan data ICD10'; + $this->sys_error($message); + exit; + } + } + $this->db_smartone->trans_commit(); //print_r($dt_menu); $xurl = ''; @@ -3614,4 +3624,70 @@ GROUP BY T_SampleStationID "; return $row; } } + + function save_icd10($header_id, $icd10_code, $icd10_name, $userid) + { + $check = $this->db_smartone->query( + "SELECT T_OrderHeaderICD10ID FROM t_orderheader_icd10 WHERE T_OrderHeaderICD10T_OrderHeaderID = ? LIMIT 1", + [$header_id] + ); + if ($check && $check->num_rows() > 0) { + return ['status' => true]; + } + + $sql = "INSERT IGNORE INTO t_orderheader_icd10 ( + T_OrderHeaderICD10T_OrderHeaderID, + T_OrderHeaderICD10Code, + T_OrderHeaderICD10Name, + T_OrderHeaderICD10IsActive, + T_OrderHeaderICD10Created, + T_OrderHeaderICD10CreatedUserID, + T_OrderHeaderICD10LastUpdated, + T_OrderHeaderICD10LastUpdatedUserID + ) VALUES (?, ?, ?, 'Y', NOW(), ?, NOW(), ?)"; + + $query = $this->db_smartone->query($sql, [ + $header_id, + $icd10_code, + $icd10_name, + $userid, + $userid + ]); + + if (!$query) { + $this->insert_log_error($this->db_smartone->last_query(), ['INSERT_T_ORDERHEADER_ICD10', 'order/save'], [ + 'header_id' => $header_id, + 'icd10_code' => $icd10_code, + 'error' => $this->db_smartone->error() + ]); + return ['status' => false, 'message' => 'error insert t_orderheader_icd10 | ' . $this->db_smartone->error()['message']]; + } + + return ['status' => true]; + } + + function search_icd10() + { + if (!$this->isLogin) { + $this->sys_error("Invalid Token"); + exit; + } + + $prm = $this->sys_input; + + $sql = "SELECT terminology.*, CONCAT(code,' | ', display) as display_name + FROM one_terminology.terminology + WHERE + attribute_path = 'icd10' AND ( code LIKE CONCAT('%',?,'%') OR MATCH (display) AGAINST (? IN NATURAL LANGUAGE MODE) OR CONCAT(code,' | ', display) LIKE CONCAT('%',?,'%')) + GROUP BY code"; + $query = $this->db_onedev->query($sql, array($prm['search'], $prm['search'], $prm['search'])); + if (!$query) { + $this->sys_error("Gagal cari ICD10"); + } + + $result = $query->result_array(); + + $this->sys_ok($result); + exit; + } } diff --git a/docs_icd10_walk_in_registration_stemcell.md b/docs_icd10_walk_in_registration_stemcell.md new file mode 100644 index 0000000..9d1e10f --- /dev/null +++ b/docs_icd10_walk_in_registration_stemcell.md @@ -0,0 +1,127 @@ +# Dokumentasi API ICD10 — Walk-in Registration Stemcell + +Base URL dev: + +```text +https://devcpone.aplikasi.web.id/one-api/mockup/fo/walk_in_registration_stemcell/order +``` + +Semua response API menggunakan format standar: + +```json +{ + "status": "OK", + "data": [] +} +``` + +Jika gagal: + +```json +{ + "status": "ERR", + "message": "Pesan error" +} +``` + +--- + +## 1. Search ICD10 + +Digunakan untuk mencari data ICD10 berdasarkan kode atau nama diagnosis. Hasil dapat digunakan untuk mengisi field `selected_icd10` pada saat registrasi. + +**Endpoint:** + +```http +POST /search_icd10 +``` + +**Request body:** + +| Field | Tipe | Wajib | Keterangan | +|----------|--------|-------|-------------------------------------| +| `search` | string | Ya | Kata kunci pencarian (kode / nama) | + +**Contoh request:** + +```json +{ + "search": "diabetes" +} +``` + +**Contoh response sukses:** + +```json +{ + "status": "OK", + "data": [ + { + "code": "E11", + "display": "Type 2 diabetes mellitus", + "display_name": "E11 | Type 2 diabetes mellitus" + }, + { + "code": "E10", + "display": "Type 1 diabetes mellitus", + "display_name": "E10 | Type 1 diabetes mellitus" + } + ] +} +``` + +**Contoh curl:** + +```bash +curl -X POST "https://devcpone.aplikasi.web.id/one-api/mockup/fo/walk_in_registration_stemcell/order/search_icd10" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer {token}" \ + -d '{"search": "diabetes"}' +``` + +**Catatan:** +- Pencarian mendukung kode ICD10 (contoh: `E11`), nama diagnosis, maupun kombinasi keduanya. +- Gunakan field `code` dan `display` dari hasil pencarian untuk mengisi `selected_icd10` pada payload `save`. + +--- + +## 2. Save (dengan ICD10) + +Fungsi `save` yang sudah ada kini secara otomatis menyimpan data ICD10 ke tabel `t_orderheader_icd10` jika field `selected_icd10` diisi. + +**Endpoint:** + +```http +POST /save +``` + +**Tambahan field pada request body:** + +| Field | Tipe | Wajib | Keterangan | +|-----------------|--------|-------|--------------------------------------------------| +| `selected_icd10` | object | Tidak | Objek ICD10 yang dipilih dari hasil `search_icd10` | + +**Struktur `selected_icd10`:** + +| Field | Tipe | Keterangan | +|-----------|--------|-------------------------| +| `code` | string | Kode ICD10 (contoh: `E11`) | +| `display` | string | Nama diagnosis | + +**Contoh potongan request body:** + +```json +{ + "selected_icd10": { + "code": "E11", + "display": "Type 2 diabetes mellitus" + }, + ...field lainnya seperti biasa... +} +``` + +**Perilaku:** +- Jika `selected_icd10` tidak diisi atau `code` kosong, data ICD10 tidak disimpan dan proses save tetap berjalan normal. +- Jika `selected_icd10` diisi, sistem akan menyimpan satu record ke `t_orderheader_icd10`. +- Satu order header hanya boleh punya satu record ICD10. Jika sudah ada, insert akan dilewati (tidak error). +- Jika insert ICD10 gagal, seluruh transaksi save akan di-rollback. diff --git a/scripts/sql/2026-06-25_create_t_orderheader_icd10.sql b/scripts/sql/2026-06-25_create_t_orderheader_icd10.sql new file mode 100644 index 0000000..2f01b52 --- /dev/null +++ b/scripts/sql/2026-06-25_create_t_orderheader_icd10.sql @@ -0,0 +1,16 @@ +CREATE TABLE IF NOT EXISTS cpone.`t_orderheader_icd10` ( + `T_OrderHeaderICD10ID` INT NOT NULL AUTO_INCREMENT, + `T_OrderHeaderICD10T_OrderHeaderID` INT NOT NULL DEFAULT 0, + `T_OrderHeaderICD10Code` VARCHAR(25) DEFAULT NULL, + `T_OrderHeaderICD10Name` TEXT DEFAULT NULL, + `T_OrderHeaderICD10IsActive` CHAR(1) NOT NULL DEFAULT 'Y', + `T_OrderHeaderICD10Created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `T_OrderHeaderICD10CreatedUserID` INT NOT NULL DEFAULT 0, + `T_OrderHeaderICD10LastUpdated` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `T_OrderHeaderICD10LastUpdatedUserID` INT NOT NULL DEFAULT 0, + PRIMARY KEY (`T_OrderHeaderICD10ID`), + KEY `T_OrderHeaderICD10T_OrderHeaderID` (`T_OrderHeaderICD10T_OrderHeaderID`), + KEY `T_OrderHeaderICD10Code` (`T_OrderHeaderICD10Code`), + KEY `T_OrderHeaderICD10IsActive` (`T_OrderHeaderICD10IsActive`), + UNIQUE KEY `uq_orderheader_icd10` (`T_OrderHeaderICD10T_OrderHeaderID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;