FHM09062601IBL - fix mcuofflineapp Preregisterapp: apply PDP compliance (mask/enc/bidx)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sas.fajri
2026-06-11 13:58:11 +07:00
parent f8d487079b
commit 1bdb54d1c2

View File

@@ -12,8 +12,26 @@ class Preregisterapp extends MY_Controller
{
parent::__construct();
$this->db_onedev = $this->load->database("onedev", true);
$this->load->library('ibl_encryptor');
}
private function _mask_name($v) {
if (!$v) return $v;
$v = trim($v);
$words = preg_split('/\s+/', $v);
$out = [];
foreach ($words as $w) {
$l = mb_strlen($w, 'UTF-8');
if ($l <= 2) { $out[] = '***'; continue; }
$out[] = mb_substr($w, 0, 2, 'UTF-8') . str_repeat('*', max(3, $l - 2));
}
return implode(' ', $out);
}
private function _mask_phone($v) { if (!$v) return $v; $d=preg_replace('/[^0-9]/','',trim($v)); $l=strlen($d); if($l<=4) return '****'; if($l<=8) return substr($d,0,4).str_repeat('*',$l-4); return substr($d,0,4).str_repeat('*',$l-7).substr($d,-3); }
private function _mask_email($v) { if (!$v||strpos($v,'@')===false) return $v; [$loc,$dom]=explode('@',$v,2); return mb_substr($loc,0,min(2,mb_strlen($loc,'UTF-8')),'UTF-8').'***@'.$dom; }
private function _mask_id($v) { if (!$v) return $v; $v=trim($v); $l=strlen($v); if($l<=4) return '****'; return substr($v,0,4).str_repeat('*',max(3,$l-6)).($l>6?substr($v,-2):''); }
private function _mask_dob($v) { if (!$v) return $v; $p=explode('-',$v); return (count($p)===3) ? '**-**-'.$p[2] : '****-**-**'; }
public function get_setup_by_id()
{
try {
@@ -270,8 +288,8 @@ class Preregisterapp extends MY_Controller
Mcu_PreregisterPatientsPatientName,
' ',
IFNULL(Mcu_PreregisterPatientsPatientSuffix,'')) as patient_fullname,
DATE_FORMAT(Mcu_PreregisterPatientsDOB,'%d-%m-%Y') as dob,
DATE_FORMAT(Mcu_PreregisterPatientsDOB,'%d-%m-%Y') as Mcu_PreregisterPatientsDOB,
Mcu_PreregisterPatientsDOB as dob,
Mcu_PreregisterPatientsDOB,
IFNULL(M_PatientAddressDescription, '') as M_PatientAddress,
M_PatientAddressCity,
IFNULL(M_PatientAddressCountry, 'ID') as M_PatientAddressCountry,
@@ -440,11 +458,25 @@ class Preregisterapp extends MY_Controller
if ($prm['search'] != '') {
$e = explode('+', $prm['search']);
if (isset($e[0]))
$q['name'] = "AND M_PatientName LIKE '%{$e[0]}%'";
if (isset($e[1]))
$q['dob'] = "AND ((DATE_FORMAT(M_PatientDOB, '%d-%m-%Y') LIKE '%{$e[1]}%' and M_PatientDOB IS NOT NULL) OR (M_PatientDOB IS NULL AND '{$e[1]}' = ''))";
if (isset($e[2]))
if (isset($e[0]) && $e[0] != '') {
$name_toks = $this->ibl_encryptor->query_tokens($e[0]);
$name_conds = [];
foreach ($name_toks as $tok) {
$tok_esc = $this->db_onedev->escape_str($tok);
$name_conds[] = "JSON_CONTAINS(M_PatientName_bidx, '\"$tok_esc\"')";
}
if ($name_conds) $q['name'] = "AND " . implode(' AND ', $name_conds);
}
if (isset($e[1]) && $e[1] != '') {
$dob_toks = $this->ibl_encryptor->query_tokens($e[1]);
$dob_conds = [];
foreach ($dob_toks as $tok) {
$tok_esc = $this->db_onedev->escape_str($tok);
$dob_conds[] = "JSON_CONTAINS(M_PatientDOB_bidx, '\"$tok_esc\"')";
}
if ($dob_conds) $q['dob'] = "AND " . implode(' AND ', $dob_conds);
}
if (isset($e[2]) && $e[2] != '')
$q['nik'] = "AND M_PatientNIP LIKE '%{$e[2]}%'";
}
@@ -453,7 +485,7 @@ class Preregisterapp extends MY_Controller
'N' divider,
concat(IFNULL(M_TitleName,''),' ',IFNULL(M_PatientPrefix,''),' ',M_PatientName,' ',IFNULL(M_PatientSuffix,'')) M_PatientName,
M_PatientName M_PatientRealName, M_TitleID, M_TitleName, M_PatientM_SexID,
DATE_FORMAT(M_PatientDOB,'%d-%m-%Y') as dob_ina,
M_PatientDOB as dob_ina,
IFNULL(M_PatientReligionCode, '-') M_PatientReligionCode,
M_PatientNoReg as Mcu_PreregisterPatientsPID,
M_PatientIdentifierValue as Mcu_PreregisterPatientsKTP,
@@ -601,20 +633,21 @@ class Preregisterapp extends MY_Controller
?
)";
//echo $query;
$m_dob_ptp = $this->_mask_dob(date('d-m-Y', strtotime($pdob)));
$rows = $this->db_onedev->query($query, [
$setup['Mgm_McuID'],
$v['Mcu_PreregisterPatientsPID'],
$v['M_PatientID'],
$v['Mcu_PreregisterPatientsKTP'],
$v['Mcu_PreregisterPatientsKTP'] ? $this->_mask_id($v['Mcu_PreregisterPatientsKTP']) : '',
$v['M_PatientPrefix'],
$v['M_PatientRealName'],
$this->_mask_name($v['M_PatientRealName']),
$v['M_PatientSuffix'],
$v['M_PatientM_SexID'],
$pdob,
$m_dob_ptp,
$v['M_PatientReligionCode'],
$v['Mcu_PreregisterPatientsJob'],
$v['Mcu_PreregisterPatientsEmail'],
$v['Mcu_PreregisterPatientsHp'],
$this->_mask_email($v['Mcu_PreregisterPatientsEmail']),
$this->_mask_phone($v['Mcu_PreregisterPatientsHp']),
$v['Mcu_PreregisterPatientsPosisi'],
$v['Mcu_PreregisterPatientsDivisi'],
$v['Mcu_PreregisterPatientsLocation'],
@@ -660,22 +693,39 @@ class Preregisterapp extends MY_Controller
$IdentifierSystem = 'http://terminology.hl7.org/CodeSystem/v2-0203';
}
$enc_new = $this->ibl_encryptor;
$plain_name_new = $v['Mcu_PreregisterPatientsPatientName'];
$plain_ktp_new = $v['Mcu_PreregisterPatientsKTP'];
$plain_email_new = $v['Mcu_PreregisterPatientsEmail'];
$plain_hp_new = $v['Mcu_PreregisterPatientsHp'];
$dob_str_new = date('d-m-Y', strtotime($pdob));
$sql = "INSERT INTO m_patient (
M_PatientPrefix,
M_PatientName,
M_PatientName_enc,
M_PatientName_bidx,
M_PatientSuffix,
M_PatientM_TitleID,
M_PatientM_SexID,
M_PatientDOB,
M_PatientDOB_enc,
M_PatientDOB_bidx,
M_PatientIdentifierCode,
M_PatientIdentifierSystem,
M_PatientIdentifierValue,
M_PatientIDNumber,
M_PatientIDNumber_enc,
M_PatientNIK_bidx,
M_PatientPosisi,
M_PatientDivisi,
M_PatientLocation,
M_PatientJob,
M_PatientEmail,
M_PatientEmail_enc,
M_PatientHP,
M_PatientHP_enc,
M_PatientHP_bidx,
M_PatientCreatedUserID,
M_PatientNIP,
M_PatientDepartement,
@@ -683,31 +733,39 @@ class Preregisterapp extends MY_Controller
M_PatientCreated,
M_PatientRegisteredByCompanyID
)
VALUES(
'{$v["Mcu_PreregisterPatientsPatientPrefix"]}',
'{$nameNewPn}',
'{$v["Mcu_PreregisterPatientsPatientSuffix"]}',
'{$title_id}',
'{$v["M_PatientM_SexID"]}',
'{$pdob}',
'{$typeIdentifier}',
'{$IdentifierSystem}',
'{$v["Mcu_PreregisterPatientsKTP"]}',
'{$v['Mcu_PreregisterPatientsPosisi']}',
'{$v['Mcu_PreregisterPatientsDivisi']}',
'{$v['Mcu_PreregisterPatientsLocation']}',
'{$v['Mcu_PreregisterPatientsJob']}',
'{$v['Mcu_PreregisterPatientsEmail']}',
'{$v['Mcu_PreregisterPatientsHp']}',
'{$userid}',
'{$v['Mcu_PreregisterPatientsNIK']}',
'{$v['Mcu_PreregisterPatientsDepartment']}',
'{$number}',
NOW(),
'{$setup['Mgm_McuM_CompanyID']}'
)";
//echo $sql;
$rows = $this->db_onedev->query($sql);
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW(),?)";
$rows = $this->db_onedev->query($sql, [
$v['Mcu_PreregisterPatientsPatientPrefix'],
$this->_mask_name($plain_name_new),
$enc_new->encrypt($plain_name_new),
$enc_new->search_bidx($plain_name_new),
$v['Mcu_PreregisterPatientsPatientSuffix'],
$title_id,
$v['M_PatientM_SexID'],
$this->_mask_dob($dob_str_new),
$enc_new->encrypt($dob_str_new),
$enc_new->search_bidx($dob_str_new),
$typeIdentifier,
$IdentifierSystem,
$plain_ktp_new ? $this->_mask_id($plain_ktp_new) : '',
$plain_ktp_new ? $this->_mask_id($plain_ktp_new) : null,
$plain_ktp_new ? $enc_new->encrypt($plain_ktp_new) : null,
$enc_new->search_bidx($plain_ktp_new ?? ''),
$v['Mcu_PreregisterPatientsPosisi'],
$v['Mcu_PreregisterPatientsDivisi'],
$v['Mcu_PreregisterPatientsLocation'],
$v['Mcu_PreregisterPatientsJob'],
$plain_email_new ? $this->_mask_email($plain_email_new) : '',
$plain_email_new ? $enc_new->encrypt($plain_email_new) : null,
$plain_hp_new ? $this->_mask_phone($plain_hp_new) : '',
$plain_hp_new ? $enc_new->encrypt($plain_hp_new) : null,
$enc_new->search_bidx($plain_hp_new ?? ''),
$userid,
$v['Mcu_PreregisterPatientsNIK'],
$v['Mcu_PreregisterPatientsDepartment'],
$number,
$setup['Mgm_McuM_CompanyID']
]);
if (!$rows) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
@@ -1039,7 +1097,7 @@ class Preregisterapp extends MY_Controller
}
$pdob = date('Y-m-d', strtotime($v['Mcu_PreregisterPatientsDOB']));
$pdob_input = $v['Mcu_PreregisterPatientsDOB'];
$Mcu_PreregisterPatientsTests = '';
$packettests = array();
@@ -1069,9 +1127,23 @@ class Preregisterapp extends MY_Controller
}
$dataPatientBefore = $rows->row_array();
$enc_upd = $this->ibl_encryptor;
$pdob_ts = strtotime($pdob_input);
if ($pdob_ts && $pdob_ts > 0 && strpos($pdob_input, '*') === false) {
$dob_str_upd = date('d-m-Y', $pdob_ts);
$pdob = date('Y-m-d', $pdob_ts);
} else {
$dob_str_upd = $enc_upd->decrypt($dataPatientBefore['M_PatientDOB_enc'] ?? '') ?: '';
$pdob = $dob_str_upd ? date('Y-m-d', strtotime($dob_str_upd)) : '';
}
$plain_name_upd = $v['Mcu_PreregisterPatientsPatientName'];
$plain_ktp_upd = $v['Mcu_PreregisterPatientsKTP'];
$plain_email_upd = $v['Mcu_PreregisterPatientsEmail'];
$plain_hp_upd = $v['Mcu_PreregisterPatientsHp'];
$this->db_onedev->trans_begin();
$query = " UPDATE mcu_preregister_patients SET
$query = " UPDATE mcu_preregister_patients SET
Mcu_PreregisterPatientsM_PatientID = ?,
Mcu_PreregisterPatientsKTP = ?,
Mcu_PreregisterPatientsNIP = ?,
@@ -1099,14 +1171,14 @@ class Preregisterapp extends MY_Controller
//echo $query;
$rows = $this->db_onedev->query($query, [
$v['Mcu_PreregisterPatientsM_PatientID'],
$v['Mcu_PreregisterPatientsKTP'],
$plain_ktp_upd ? $this->_mask_id($plain_ktp_upd) : '',
$v['Mcu_PreregisterPatientsNIP'],
$v['Mcu_PreregisterPatientsPatientPrefix'],
$v['Mcu_PreregisterPatientsPatientName'],
$this->_mask_name($plain_name_upd),
$v['Mcu_PreregisterPatientsPatientSuffix'],
$v['Mcu_PreregisterPatientsEmail'],
$v['Mcu_PreregisterPatientsHp'],
$pdob,
$plain_email_upd ? $this->_mask_email($plain_email_upd) : '',
$plain_hp_upd ? $this->_mask_phone($plain_hp_upd) : '',
$this->_mask_dob($dob_str_upd),
$v['Mcu_PreregisterPatientsPosisi'],
$v['Mcu_PreregisterPatientsDivisi'],
$v['Mcu_PreregisterPatientsJob'],
@@ -1129,24 +1201,30 @@ class Preregisterapp extends MY_Controller
exit;
}
$sql_ktp = '';
if (isset($v['Mcu_PreregisterPatientsKTP']) && $v['Mcu_PreregisterPatientsKTP'] != '') {
$sql_ktp = "M_PatientIdentifierCode = 'NNIDN', M_PatientIdentifierSystem='http://terminology.hl7.org/CodeSystem/v2-0203', M_PatientIdentifierValue = '{$v['Mcu_PreregisterPatientsKTP']}',";
//echo $sql_ktp;
} else {
$sql_ktp = "M_PatientIdentifierCode = '', M_PatientIdentifierSystem='', M_PatientIdentifierValue = '',";
}
$ktp_mask_upd = $plain_ktp_upd ? $this->_mask_id($plain_ktp_upd) : '';
$sql = "UPDATE m_patient SET
$sql_ktp
M_PatientIdentifierCode = ?,
M_PatientIdentifierSystem = ?,
M_PatientIdentifierValue = ?,
M_PatientIDNumber = ?,
M_PatientIDNumber_enc = ?,
M_PatientNIK_bidx = ?,
M_PatientDOB = ?,
M_PatientDOB_enc = ?,
M_PatientDOB_bidx = ?,
M_PatientM_TitleID = ?,
M_PatientNIP = ?,
M_PatientM_SexID = ?,
M_PatientPrefix = ?,
M_PatientName = ?,
M_PatientName_enc = ?,
M_PatientName_bidx = ?,
M_PatientSuffix = ?,
M_PatientEmail = ?,
M_PatientEmail_enc = ?,
M_PatientHP = ?,
M_PatientHP_enc = ?,
M_PatientHP_bidx = ?,
M_PatientDivisi = ?,
M_PatientPosisi = ?,
M_PatientLocation = ?,
@@ -1159,17 +1237,29 @@ class Preregisterapp extends MY_Controller
WHERE
M_PatientID = ?
";
//echo $sql;
$qry = $this->db_onedev->query($sql, [
$pdob,
$plain_ktp_upd ? 'NNIDN' : '',
$plain_ktp_upd ? 'http://terminology.hl7.org/CodeSystem/v2-0203' : '',
$ktp_mask_upd,
$ktp_mask_upd,
$plain_ktp_upd ? $enc_upd->encrypt($plain_ktp_upd) : null,
$enc_upd->search_bidx($plain_ktp_upd ?? ''),
$this->_mask_dob($dob_str_upd),
$enc_upd->encrypt($dob_str_upd),
$enc_upd->search_bidx($dob_str_upd),
$v['Mcu_PreregisterPatientsM_TitleID'],
$v['Mcu_PreregisterPatientsNIP'],
$v['Mcu_PreregisterPatientsM_SexID'],
$v['Mcu_PreregisterPatientsPatientPrefix'],
$v['Mcu_PreregisterPatientsPatientName'],
$this->_mask_name($plain_name_upd),
$enc_upd->encrypt($plain_name_upd),
$enc_upd->search_bidx($plain_name_upd),
$v['Mcu_PreregisterPatientsPatientSuffix'],
$v['Mcu_PreregisterPatientsEmail'],
$v['Mcu_PreregisterPatientsHp'],
$plain_email_upd ? $this->_mask_email($plain_email_upd) : '',
$plain_email_upd ? $enc_upd->encrypt($plain_email_upd) : null,
$plain_hp_upd ? $this->_mask_phone($plain_hp_upd) : '',
$plain_hp_upd ? $enc_upd->encrypt($plain_hp_upd) : null,
$enc_upd->search_bidx($plain_hp_upd ?? ''),
$v['Mcu_PreregisterPatientsDivisi'],
$v['Mcu_PreregisterPatientsPosisi'],
$v['Mcu_PreregisterPatientsLocation'],
@@ -1725,16 +1815,41 @@ class Preregisterapp extends MY_Controller
$add_where .= " AND M_PatientNIP = '{$nik}'";
}
if ($ktp != '') {
$add_where .= " AND M_PatientIdentifierValue = '{$nik}' AND M_PatientIdentifierCode = 'NNIDN'";
$ktp_toks = $this->ibl_encryptor->query_tokens($ktp);
foreach ($ktp_toks as $ktok) {
$ktok_esc = $this->db_onedev->escape_str($ktok);
$add_where .= " AND JSON_CONTAINS(M_PatientNIK_bidx, '\"$ktok_esc\"')";
}
}
$setup = $prm['setup'];
$join_company = "";
if (isset($prm['company']) && intval($prm['company']) > 0) {
$join_company = "JOIN t_orderheader ON T_OrderHeaderM_PatientID = M_PatientID AND
T_OrderHeaderIsActive = 'Y' AND
$join_company = "JOIN t_orderheader ON T_OrderHeaderM_PatientID = M_PatientID AND
T_OrderHeaderIsActive = 'Y' AND
T_OrderHeaderM_CompanyID = {$prm['company']}";
}
$name_where = '1=1';
if ($name != '') {
$name_toks = $this->ibl_encryptor->query_tokens($name);
$nconds = [];
foreach ($name_toks as $ntok) {
$ntok_esc = $this->db_onedev->escape_str($ntok);
$nconds[] = "JSON_CONTAINS(M_PatientName_bidx, '\"$ntok_esc\"')";
}
if ($nconds) $name_where = implode(' AND ', $nconds);
}
$dob_where = '1=1';
if ($dob != '') {
$dob_toks = $this->ibl_encryptor->query_tokens($dob);
$dconds = [];
foreach ($dob_toks as $dtok) {
$dtok_esc = $this->db_onedev->escape_str($dtok);
$dconds[] = "JSON_CONTAINS(M_PatientDOB_bidx, '\"$dtok_esc\"')";
}
if ($dconds) $dob_where = implode(' AND ', $dconds);
}
$sql = "SELECT COUNT(*) as total
FROM (
SELECT *
@@ -1742,16 +1857,15 @@ class Preregisterapp extends MY_Controller
$join_company
LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID
WHERE
M_PatientIsActive = 'Y'
M_PatientIsActive = 'Y'
AND M_PatientRegisteredByCompanyID = {$setup['Mgm_McuM_CompanyID']}
AND M_PatientName LIKE CONCAT('%',?,'%') AND
(DATE_FORMAT(M_PatientDOB, '%d-%m-%Y') LIKE '%{$dob}%' and M_PatientDOB IS NOT NULL)
AND ({$name_where})
AND ({$dob_where})
{$add_where}
GROUP BY M_PatientID
) x
";
//echo $sql;
$qry = $this->db_onedev->query($sql, [$name]);
$qry = $this->db_onedev->query($sql);
if (!$qry) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
@@ -1759,7 +1873,7 @@ class Preregisterapp extends MY_Controller
exit;
}
$countx = $qry->row()->total;
$sql = "SELECT *, DATE_FORMAT(M_PatientDOB, '%d-%m-%Y') as dob_ina,
$sql = "SELECT *, M_PatientDOB as dob_ina,
M_PatientNoReg as Mcu_PreregisterPatientsPID,
M_PatientIdentifierValue as Mcu_PreregisterPatientsKTP,
M_PatientID as Mcu_PreregisterPatientsM_PatientID,
@@ -1781,16 +1895,15 @@ class Preregisterapp extends MY_Controller
LEFT join m_title on M_PatientM_TitleID = M_TitleID
WHERE
M_PatientRegisteredByCompanyID = {$setup['Mgm_McuM_CompanyID']}
AND M_PatientIsActive = 'Y' AND
M_PatientName LIKE CONCAT('%',?,'%') AND
(DATE_FORMAT(M_PatientDOB, '%d-%m-%Y') LIKE '%{$dob}%' and M_PatientDOB IS NOT NULL)
AND M_PatientIsActive = 'Y'
AND ({$name_where})
AND ({$dob_where})
{$add_where}
GROUP BY M_PatientID
LIMIT 10 OFFSET 0
";
//echo $sql;
$qry = $this->db_onedev->query($sql, [$name]);
$qry = $this->db_onedev->query($sql);
if (!$qry) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();