Files
BE_IBL/application/controllers/klinik/Ttv.php
2026-06-12 13:33:37 +07:00

322 lines
9.9 KiB
PHP

<?php
class Ttv extends MY_Controller
{
public function index()
{
echo "TTV API";
}
public function __construct()
{
parent::__construct();
$this->db_onedev = $this->load->database("onedev", true);
$this->db_oneklinik = $this->load->database("onedev", true);
$this->load->library('ibl_encryptor');
}
// -----------------------------------------------------------------------
// POST /klinik/ttv/search
// Listing order yang sudah selesai screening (orderIsScreening='D')
// -----------------------------------------------------------------------
public function search()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
return;
}
$prm = $this->sys_input;
$limit = 20;
$offset = (max(1, intval($prm['current_page'] ?? 1)) - 1) * $limit;
$where = ["o.orderIsScreening = 'D'", "o.orderIsActive = 'Y'"];
$binds = [];
// Filter tanggal
$start_date = $prm['start_date'] ?? date('Y-m-d');
$where[] = "DATE(o.orderDate) = ?";
$binds[] = $start_date;
// Filter status TTV
$status = $prm['status'] ?? '';
if ($status !== '') {
$where[] = "o.orderIsTTV = ?";
$binds[] = $status;
}
// Filter noreg
$noreg = trim($prm['noreg'] ?? '');
if ($noreg !== '') {
$where[] = "p.M_PatientNoReg LIKE ?";
$binds[] = '%' . $noreg . '%';
}
// Filter nama / HP via trigram index (PDP-safe)
$search = trim($prm['search'] ?? '');
if ($search !== '') {
$where[] = "(p.M_PatientName_bidx LIKE ? OR p.M_PatientHP_bidx LIKE ?)";
$binds[] = '%' . $search . '%';
$binds[] = '%' . $search . '%';
}
$where_sql = implode(' AND ', $where);
$sql = "SELECT
'N' AS divider,
p.M_PatientName, p.M_PatientName_enc,
p.M_PatientHP, p.M_PatientHP_enc,
p.M_PatientDOB, p.M_PatientDOB_enc,
p.M_PatientEmail, p.M_PatientEmail_enc,
p.M_PatientPhone, p.M_PatientPhone_enc,
p.M_PatientPOB, p.M_PatientPOB_enc,
p.M_PatientIDNumber, p.M_PatientIDNumber_enc,
p.M_PatientNIK, p.M_PatientNIK_enc,
p.M_PatientPhoto,
p.M_PatientPhotoThumb,
p.M_PatientNoReg,
p.M_PatientJob,
p.M_PatientM_SexID,
p.M_PatientM_TitleID,
p.M_PatientM_IdTypeID,
o.*,
DATE_FORMAT(o.orderDate, '%d-%m-%Y') AS date_order,
'' AS kode_status,
s.M_SexName,
t.M_TitleName
FROM one_klinik.`order` o
JOIN m_patient p ON p.M_PatientID = o.orderM_PatientID AND p.M_PatientIsActive = 'Y'
JOIN m_sex s ON s.M_SexID = p.M_PatientM_SexID
JOIN m_title t ON t.M_TitleID = p.M_PatientM_TitleID
WHERE $where_sql
ORDER BY o.orderDate ASC
LIMIT $limit OFFSET $offset";
$query = $this->db_oneklinik->query($sql, $binds);
if (!$query) {
$this->sys_error_db("ttv search", $this->db_oneklinik);
return;
}
$rows = $query->result_array();
$enc = $this->ibl_encryptor;
foreach ($rows as $k => $v) {
$rows[$k]['M_PatientName'] = $enc->decrypt($v['M_PatientName_enc'] ?? '') ?: $v['M_PatientName'];
$rows[$k]['M_PatientHP'] = $enc->decrypt($v['M_PatientHP_enc'] ?? '') ?: $v['M_PatientHP'];
$rows[$k]['M_PatientDOB'] = $enc->decrypt($v['M_PatientDOB_enc'] ?? '') ?: $v['M_PatientDOB'];
$rows[$k]['M_PatientEmail'] = $enc->decrypt($v['M_PatientEmail_enc'] ?? '') ?: $v['M_PatientEmail'];
$rows[$k]['M_PatientPhone'] = $enc->decrypt($v['M_PatientPhone_enc'] ?? '') ?: $v['M_PatientPhone'];
$rows[$k]['M_PatientPOB'] = $enc->decrypt($v['M_PatientPOB_enc'] ?? '') ?: $v['M_PatientPOB'];
$rows[$k]['M_PatientIDNumber'] = $enc->decrypt($v['M_PatientIDNumber_enc'] ?? '') ?: $v['M_PatientIDNumber'];
$rows[$k]['M_PatientNIK'] = $enc->decrypt($v['M_PatientNIK_enc'] ?? '') ?: $v['M_PatientNIK'];
$rows[$k]['patient_name'] = trim(($v['M_TitleName'] ?? '') . ' ' . $rows[$k]['M_PatientName']);
foreach (array_keys($rows[$k]) as $col) {
if (substr($col, -4) === '_enc') unset($rows[$k][$col]);
}
}
$this->sys_ok(['total' => count($rows), 'records' => $rows]);
}
// -----------------------------------------------------------------------
// POST /klinik/ttv/getttv
// Load data TTV yang sudah pernah disimpan untuk satu order
// -----------------------------------------------------------------------
public function getttv()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
return;
}
$prm = $this->sys_input;
$orderid = intval($prm['orderid'] ?? 0);
if (!$orderid) {
$this->sys_error("orderid required");
return;
}
$row = $this->db_oneklinik->query(
"SELECT orderDoctorVitalSign, orderDoctorSaran AS xnote
FROM one_klinik.order_doctor
WHERE orderDoctorOrderID = ?
ORDER BY orderDoctorID DESC LIMIT 1",
[$orderid]
)->row_array();
$fisiks = null;
$xnote = '';
if ($row) {
$fisiks = $row['orderDoctorVitalSign']
? json_decode($row['orderDoctorVitalSign'], true)
: null;
$xnote = $row['xnote'] ?? '';
}
$this->sys_ok(['fisiks' => $fisiks, 'xnote' => $xnote]);
}
// -----------------------------------------------------------------------
// POST /klinik/ttv/savettv
// Simpan TTV ke order_doctor + order_tanda_vital, set orderIsTTV='D'
// -----------------------------------------------------------------------
public function savettv()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
return;
}
$prm = $this->sys_input;
$userID = $this->sys_user['M_UserID'];
$orderid = intval($prm['orderid'] ?? 0);
$fisiks = $prm['fisiks'] ?? [];
$xnote = $prm['xnote'] ?? '';
if (!$orderid) {
$this->sys_error("orderid required");
return;
}
$fisiks_json = json_encode($fisiks);
// 1. Upsert order_doctor
$exists = $this->db_oneklinik->query(
"SELECT orderDoctorID FROM one_klinik.order_doctor WHERE orderDoctorOrderID = ? LIMIT 1",
[$orderid]
)->row_array();
if ($exists) {
$ok = $this->db_oneklinik->query(
"UPDATE one_klinik.order_doctor
SET orderDoctorVitalSign = ?,
orderDoctorSaran = ?,
orderDoctorLastUpdated = NOW()
WHERE orderDoctorOrderID = ?",
[$fisiks_json, $xnote, $orderid]
);
} else {
$ok = $this->db_oneklinik->query(
"INSERT INTO one_klinik.order_doctor
(orderDoctorOrderID, orderDoctorVitalSign, orderDoctorSaran,
orderDoctorType, orderDoctorIsActive, orderDoctorUserID, orderDoctorCreated)
VALUES (?, ?, ?, 'FORM', 'Y', ?, NOW())",
[$orderid, $fisiks_json, $xnote, $userID]
);
}
if (!$ok) {
$this->sys_error_db("upsert order_doctor", $this->db_oneklinik);
return;
}
// 2. Parse fisiks → nilai terstruktur untuk order_tanda_vital
$ttv = [
'pulse' => 0,
'sistole' => 0,
'diastole' => 0,
'temperature' => 0,
'weight' => 0,
'height' => 0,
'saturation' => 0,
];
foreach ((array)$fisiks as $item) {
$code = $item['id_code'] ?? '';
$value = trim($item['value'] ?? '');
switch ($code) {
case 'tanda_vital_1': $ttv['pulse'] = intval($value); break;
case 'tanda_vital_5':
$parts = explode('/', $value);
$ttv['sistole'] = intval($parts[0] ?? 0);
$ttv['diastole'] = intval($parts[1] ?? 0);
break;
case 'tanda_vital_6': $ttv['temperature'] = intval($value); break;
case 'tanda_vital_7': $ttv['saturation'] = intval($value); break;
case 'status_gizi_1': $ttv['weight'] = intval($value); break;
case 'status_gizi_2': $ttv['height'] = intval($value); break;
}
}
// 3. Upsert order_tanda_vital
$tv_exists = $this->db_oneklinik->query(
"SELECT orderTandaVitalID FROM one_klinik.order_tanda_vital WHERE orderTandaVitalOrderID = ? LIMIT 1",
[$orderid]
)->row_array();
if ($tv_exists) {
$this->db_oneklinik->query(
"UPDATE one_klinik.order_tanda_vital SET
orderTandaVitalPulse = ?,
orderTandaVitalSistole = ?,
orderTandaVitalDiastole = ?,
orderTandaVitalTemperature = ?,
orderTandaVitalWeight = ?,
orderTandaVitalHeight = ?,
orderTandaVitalSaturation = ?,
orderTandaVitalUserID = ?,
orderTandaVitalLastUpdated = NOW()
WHERE orderTandaVitalOrderID = ?",
[$ttv['pulse'], $ttv['sistole'], $ttv['diastole'],
$ttv['temperature'], $ttv['weight'], $ttv['height'],
$ttv['saturation'], $userID, $orderid]
);
} else {
$this->db_oneklinik->query(
"INSERT INTO one_klinik.order_tanda_vital
(orderTandaVitalOrderID, orderTandaVitalPulse, orderTandaVitalSistole,
orderTandaVitalDiastole, orderTandaVitalTemperature, orderTandaVitalWeight,
orderTandaVitalHeight, orderTandaVitalSaturation,
orderTandaVitalIsActive, orderTandaVitalUserID, orderTandaVitalCreated)
VALUES (?,?,?,?,?,?,?,?,'Y',?,NOW())",
[$orderid, $ttv['pulse'], $ttv['sistole'], $ttv['diastole'],
$ttv['temperature'], $ttv['weight'], $ttv['height'],
$ttv['saturation'], $userID]
);
}
// 4. Update status order
$this->db_oneklinik->query(
"UPDATE one_klinik.`order` SET orderIsTTV = 'D', orderUserID = ? WHERE orderID = ?",
[$userID, $orderid]
);
$this->sys_ok(['process' => 'OK']);
}
// -----------------------------------------------------------------------
// POST /klinik/ttv/getsexreg
// Return kartuidentitass, sexes, titles, religions
// -----------------------------------------------------------------------
public function getsexreg()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
return;
}
$rows = [];
$rows['kartuidentitass'] = $this->db_onedev->query(
"SELECT * FROM m_idtype WHERE M_IdTypeIsActive = 'Y'"
)->result_array();
$rows['sexes'] = $this->db_onedev->query(
"SELECT * FROM m_sex WHERE M_SexIsActive = 'Y'"
)->result_array();
$rows['titles'] = $this->db_onedev->query(
"SELECT * FROM m_title WHERE M_TitleIsActive = 'Y'"
)->result_array();
$rows['religions'] = $this->db_onedev->query(
"SELECT * FROM m_religion WHERE M_ReligionIsActive = 'Y'"
)->result_array();
$this->sys_ok($rows);
}
}