Files
BE_IBL/application/controllers/fisik/Riwayatformv2.php
2026-04-15 15:23:57 +07:00

454 lines
22 KiB
PHP

<?php
class Riwayatformv2 extends MY_Controller
{
var $db_onedev;
public function index()
{
echo "Riwayat Form API";
}
public function __construct()
{
parent::__construct();
$this->db_onedev = $this->load->database("onedev", true);
}
/** sys_input + $_GET + $_POST + JSON body. */
private function merge_request_input()
{
$prm = is_array($this->sys_input) ? $this->sys_input : array();
if (!empty($_GET) && is_array($_GET)) {
$prm = array_merge($prm, $_GET);
}
if (!empty($_POST) && is_array($_POST)) {
$prm = array_merge($prm, $_POST);
}
$ct = isset($_SERVER["CONTENT_TYPE"]) ? $_SERVER["CONTENT_TYPE"] : "";
if (stripos($ct, "application/json") === false) {
return $prm;
}
$raw = file_get_contents("php://input");
if ($raw === false || $raw === "") {
return $prm;
}
$j = json_decode($raw, true);
if (!is_array($j)) {
return $prm;
}
return array_merge($prm, $j);
}
public function get_patient()
{
try {
$prm = $this->merge_request_input();
$form_code = isset($prm['form_code']) ? $this->sanitize_form_code($prm['form_code']) : '';
$uuid_hex = isset($prm['id']) ? $this->uuid_to_hex32($prm['id']) : '';
if($form_code == '' || $uuid_hex == ''){
$this->sys_error("Form code atau ID tidak boleh kosong");
exit;
}
$sql = " SELECT FormRiwayatPasienID as xid,
COALESCE(M_PatientName, Mcu_PreregisterPatientsPatientName) as patient_name,
COALESCE(sex_pat.M_SexName, sex_pre.M_SexName) as gender,
COALESCE(DATE_FORMAT(M_PatientDOB, '%d-%m-%Y'), DATE_FORMAT(Mcu_PreregisterPatientsDOB, '%d-%m-%Y')) as dob,
Mcu_PreregisterPatientsPosisi as posisi,
Mcu_PreregisterPatientsDivisi as divisi,
Mcu_PreregisterPatientsLocation as location_mcu,
Mcu_PreregisterPatientsDepartment as department,
M_CompanyName as corporate_name,
M_CompanyAddress as corporate_address,
IFNULL(T_SamplingSoFlag, 'N') as is_sampling
FROM form_riwayat_pasien
JOIN mcu_preregister_patients ON Mcu_PreregisterPatientsID = FormRiwayatPasienPreregisterID AND
Mcu_PreregisterPatientsIsActive = 'Y' AND FormRiwayatPasienPreregisterID > 0
LEFT JOIN m_patient ON Mcu_PreregisterPatientsM_PatientID = M_PatientID AND Mcu_PreregisterPatientsM_PatientID > 0
LEFT JOIN m_sex sex_pat ON M_PatientM_SexID = sex_pat.M_SexID
LEFT JOIN m_sex sex_pre ON Mcu_PreregisterPatientsM_SexID = sex_pre.M_SexID
JOIN m_company ON Mcu_PreregisterPatientsCompanyNumber = M_CompanyNumber
LEFT JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = FormRiwayatPasienT_OrderHeaderID AND T_SamplingSoIsActive = 'Y'
LEFT JOIN t_test ON T_SamplingSoT_TestID = T_TestID AND T_TestIsActive = 'Y'
LEFT JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y'
LEFT JOIN fisik_map_test_template ON Fisik_MapTestTemplateNat_TestID = Nat_TestID AND Fisik_MapTestTemplateIsActive = 'Y'
WHERE FormRiwayatPasienCode = ? AND
REPLACE(LOWER(FormRiwayatPasienUUID),'-','') = ? AND
FormRiwayatPasienIsActive = 'Y'
UNION
SELECT FormRiwayatPasienID as xid,
M_PatientName as patient_name,
LOWER(M_SexNameLang) as gender,
DATE_FORMAT(M_PatientDOB, '%d-%m-%Y') as dob,
IFNULL(M_PatientPosisi, '-') as posisi,
IFNULL(M_PatientDivisi, '-') as divisi,
IFNULL(M_PatientLocation, '-') as location_mcu,
IFNULL(M_PatientDepartement, '-') as department,
M_CompanyName as corporate_name,
M_CompanyAddress as corporate_address,
IFNULL(T_SamplingSoFlag, 'N') as is_sampling
FROM form_riwayat_pasien
JOIN t_orderheader ON FormRiwayatPasienT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderIsActive = 'Y'
AND FormRiwayatPasienPreregisterID = 0
JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID
JOIN m_sex ON M_PatientM_SexID = M_SexID
JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID
LEFT JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = FormRiwayatPasienT_OrderHeaderID AND T_SamplingSoIsActive = 'Y'
LEFT JOIN t_test ON T_SamplingSoT_TestID = T_TestID AND T_TestIsActive = 'Y'
LEFT JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y'
LEFT JOIN fisik_map_test_template ON Fisik_MapTestTemplateNat_TestID = Nat_TestID AND Fisik_MapTestTemplateIsActive = 'Y'
WHERE FormRiwayatPasienCode = ? AND
REPLACE(LOWER(FormRiwayatPasienUUID),'-','') = ? AND
FormRiwayatPasienIsActive = 'Y'
";
$sql_param = array($form_code, $uuid_hex, $form_code, $uuid_hex);
$query = $this->db_onedev->query($sql, $sql_param);
//echo $this->db_onedev->last_query();
if(!$query){
echo $this->db_onedev->last_query();
$this->sys_error_db("form_riwayat_pasien error get exist");
exit;
}
$exist_riwayat = $query->result_array();
if(count($exist_riwayat) > 0){
$sql = "";
$result = array ("total" => 1, "total_filter"=>1,"records" => $exist_riwayat[0]);
$this->sys_ok($result);
}else{
$this->sys_error("Data tidak ditemukan");
}
} catch(Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function get_riwayat()
{
try {
$prm = $this->merge_request_input();
$xid = isset($prm['id']) ? $this->sanitize_int_id($prm['id']) : 0;
if($xid == 0 || $xid == ''){
$this->sys_error("ID tidak boleh kosong");
exit;
}
$results = array();
$return_data = array();
$sql = " SELECT FisikTemplateID as fisik_template_id,
FisikTemplateCode as template_code,
FisikTemplateTableName as template_table_name,
FisikTemplateTitle as template_title,
FormRiwayatPasienTemplateDetails as details,
FormRiwayatPasienTemplateID as xid
FROM form_riwayat_pasien
JOIN form_riwayat_pasien_template ON FormRiwayatPasienTemplateFormRiwayatPasienID = FormRiwayatPasienID AND FormRiwayatPasienTemplateIsActive = 'Y'
JOIN fisik_template ON FormRiwayatPasienTemplateFisikTemplateID = FisikTemplateID AND FisikTemplateIsActive = 'Y' AND FisikTemplateType IN ('Riwayat', 'K3')
WHERE FormRiwayatPasienID = ? AND
FormRiwayatPasienIsActive = 'Y'
GROUP BY FisikTemplateID ";
$sql_param = array($xid);
$query = $this->db_onedev->query($sql, $sql_param);
if(!$query){
//echo $this->db_onedev->last_query();
$this->sys_error_db("form_riwayat_pasien error get exist");
exit;
}
$exist_riwayat = $query->result_array();
if(count($exist_riwayat) > 0){
foreach($exist_riwayat as $key => $item){
//$results[$key]['details'] = json_decode($item['details'], true);
//$results[$key]['xid'] = $item['xid'];
$return_data[] = json_decode($item['details'], true);
}
$result = array ("records" => $return_data);
$this->sys_ok($result);
exit;
}
$sql = " SELECT * FROM (
SELECT FisikTemplateID as fisik_template_id,
FisikTemplateCode as template_code,
FisikTemplateTableName as template_table_name,
FisikTemplateTitle as template_title,
FisikTemplateJSON as details
FROM form_riwayat_pasien
JOIN t_orderheader ON FormRiwayatPasienT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderIsActive = 'Y' AND
FormRiwayatPasienPreregisterID = 0
JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID AND T_OrderDetailIsActive = 'Y'
JOIN nat_test ON Nat_TestCode = T_OrderDetailT_TestCode AND Nat_TestIsActive = 'Y'
JOIN fisik_map_test_template ON Fisik_MapTestTemplateNat_TestID = Nat_TestID AND Fisik_MapTestTemplateIsActive = 'Y'
JOIN fisik_template_mapping ON Fisik_MapTestTemplateFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingIsActive = 'Y'
JOIN fisik_template_mapping_detail ON FisikTemplateMappingDetailFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingDetailIsActive = 'Y'
JOIN fisik_template ON FisikTemplateID = FisikTemplateMappingDetailFisikTemplateID AND FisikTemplateIsActive = 'Y' AND
( FisikTemplateType = 'Riwayat' OR FisikTemplateType = 'K3' ) AND FisikTemplateCode NOT IN ('RI00', 'RI01')
WHERE FormRiwayatPasienID = ? AND
FormRiwayatPasienIsActive = 'Y'
UNION
SELECT FisikTemplateID as fisik_template_id,
FisikTemplateCode as template_code,
FisikTemplateTableName as template_table_name,
FisikTemplateTitle as template_title,
FisikTemplateJSON as details
FROM form_riwayat_pasien
JOIN mcu_preregister_patients ON Mcu_PreregisterPatientsID = FormRiwayatPasienPreregisterID AND
Mcu_PreregisterPatientsIsActive = 'Y' AND
FormRiwayatPasienPreregisterID > 0
JOIN t_test ON T_TestIsActive = 'Y'
AND IFNULL(Mcu_PreregisterPatientsOrders, '') != ''
AND (
FIND_IN_SET(TRIM(CAST(T_TestSasCode AS CHAR)), REPLACE(IFNULL(Mcu_PreregisterPatientsOrders, ''), ' ', '')) > 0
OR FIND_IN_SET(TRIM(CAST(T_TestCode AS CHAR)), REPLACE(IFNULL(Mcu_PreregisterPatientsOrders, ''), ' ', '')) > 0
OR EXISTS (
SELECT 1 FROM nat_test nt_ord
WHERE nt_ord.Nat_TestID = T_TestNat_TestID AND nt_ord.Nat_TestIsActive = 'Y'
AND FIND_IN_SET(TRIM(CAST(nt_ord.Nat_TestCode AS CHAR)), REPLACE(IFNULL(Mcu_PreregisterPatientsOrders, ''), ' ', '')) > 0
)
)
JOIN nat_test ON Nat_TestCode = T_TestCode AND Nat_TestIsActive = 'Y'
JOIN fisik_map_test_template ON Fisik_MapTestTemplateNat_TestID = Nat_TestID AND Fisik_MapTestTemplateIsActive = 'Y'
JOIN fisik_template_mapping ON Fisik_MapTestTemplateFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingIsActive = 'Y'
JOIN fisik_template_mapping_detail ON FisikTemplateMappingDetailFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingDetailIsActive = 'Y'
JOIN fisik_template ON FisikTemplateID = FisikTemplateMappingDetailFisikTemplateID AND FisikTemplateIsActive = 'Y' AND
( FisikTemplateType = 'Riwayat' OR FisikTemplateType = 'K3' ) AND FisikTemplateCode NOT IN ('RI00', 'RI01')
WHERE FormRiwayatPasienID = ? AND
FormRiwayatPasienIsActive = 'Y'
UNION
SELECT FisikTemplateID as fisik_template_id,
FisikTemplateCode as template_code,
FisikTemplateTableName as template_table_name,
FisikTemplateTitle as template_title,
FisikTemplateJSON as details
FROM form_riwayat_pasien
JOIN mcu_preregister_patients ON Mcu_PreregisterPatientsID = FormRiwayatPasienPreregisterID AND
Mcu_PreregisterPatientsIsActive = 'Y' AND
FormRiwayatPasienPreregisterID > 0
JOIN t_packet ON T_PacketIsActive = 'Y'
AND IFNULL(Mcu_PreregisterPatientsOrders, '') != ''
AND FIND_IN_SET(TRIM(CAST(T_PacketSasCode AS CHAR)), REPLACE(IFNULL(Mcu_PreregisterPatientsOrders, ''), ' ', '')) > 0
JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_PacketID AND T_PacketDetailIsActive = 'Y'
JOIN t_test ON T_PacketDetailT_TestID = T_TestID AND T_TestIsActive = 'Y'
JOIN nat_test ON Nat_TestCode = T_TestCode AND Nat_TestIsActive = 'Y'
JOIN fisik_map_test_template ON Fisik_MapTestTemplateNat_TestID = Nat_TestID AND Fisik_MapTestTemplateIsActive = 'Y'
JOIN fisik_template_mapping ON Fisik_MapTestTemplateFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingIsActive = 'Y'
JOIN fisik_template_mapping_detail ON FisikTemplateMappingDetailFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingDetailIsActive = 'Y'
JOIN fisik_template ON FisikTemplateID = FisikTemplateMappingDetailFisikTemplateID AND FisikTemplateIsActive = 'Y' AND
( FisikTemplateType = 'Riwayat' OR FisikTemplateType = 'K3' ) AND FisikTemplateCode NOT IN ('RI00', 'RI01')
WHERE FormRiwayatPasienID = ? AND
FormRiwayatPasienIsActive = 'Y'
) as x
GROUP BY fisik_template_id
";
$query = $this->db_onedev->query($sql, array($xid, $xid, $xid));
//echo $this->db_onedev->last_query();
//exit;
if(!$query){
//echo $this->db_onedev->last_query();
$this->sys_error_db("form_riwayat_pasien error get exist");
exit;
}
$riwayat_template = $query->result_array();
foreach($riwayat_template as $key => $item){
$sql = " SELECT *
FROM form_riwayat_pasien_template
WHERE
FormRiwayatPasienTemplateFisikTemplateID = ? AND
FormRiwayatPasienTemplateFormRiwayatPasienID = ? AND
FormRiwayatPasienTemplateIsActive = 'Y'";
$sql_param = array($item['fisik_template_id'], $xid);
$query = $this->db_onedev->query($sql, $sql_param);
if(!$query){
$this->sys_error_db("form_riwayat_pasien error get exist");
exit;
}
$exist_riwayat = $query->result_array();
if(count($exist_riwayat) > 0){
//$results[$key]['details'] = json_decode($exist_riwayat[0]['details'], true);
$return_data[] = json_decode($exist_riwayat[0]['details'], true);
}else{
$details = json_decode($item['details'], true);
$sql = "INSERT INTO form_riwayat_pasien_template (
FormRiwayatPasienTemplateFormRiwayatPasienID,
FormRiwayatPasienTemplateFisikTemplateID,
FormRiwayatPasienTemplateDetails,
FormRiwayatPasienTemplateIsActive,
FormRiwayatPasienTemplateCreated,
FormRiwayatPasienTemplateCreatedUserID)
VALUES (?, ?, ?, 'Y',NOW(),45312)";
$sql_param = array($xid, $item['fisik_template_id'], json_encode($details));
$query = $this->db_onedev->query($sql, $sql_param);
if(!$query){
$this->sys_error_db("form_riwayat_pasien error save");
exit;
}
//$last_id = $this->db_onedev->insert_id();
//$results[$key]['xid'] = $last_id;
$return_data[] = $details;
}
}
$result = array ("records" => $return_data);
$this->sys_ok($result);
exit;
} catch(Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function clean_json_encode($data) {
return str_replace(
['\r', '\n'],
'',
json_encode($data, JSON_UNESCAPED_SLASHES)
);
}
private function sanitize_form_code($value) {
$value = trim((string)$value);
if ($value === '' || !preg_match('/^[A-Za-z0-9_-]{1,64}$/', $value)) {
$value = '';
}
return $value;
}
private function sanitize_uuid($value) {
$value = trim((string) $value);
if ($value === '') {
return '';
}
if (preg_match('/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/', $value)) {
return $value;
}
$hex = preg_replace('/[^0-9a-fA-F]/', '', $value);
if (strlen($hex) === 32) {
return sprintf(
'%s-%s-%s-%s-%s',
substr($hex, 0, 8),
substr($hex, 8, 4),
substr($hex, 12, 4),
substr($hex, 16, 4),
substr($hex, 20, 12)
);
}
return '';
}
/** 32 hex lowercase untuk cocokkan FormRiwayatPasienUUID (termasuk baris lama format vsprintf salah). */
private function uuid_to_hex32($value) {
$hex = preg_replace('/[^0-9a-fA-F]/', '', (string) $value);
return strlen($hex) === 32 ? strtolower($hex) : '';
}
private function sanitize_int_id($value) {
if (!is_numeric($value)) {
$value = 0;
}
return (int)$value;
}
public function save_riwayat()
{
try {
$prm = $this->merge_request_input();
$xid_hex = isset($prm['id']) ? $this->uuid_to_hex32($prm['id']) : '';
$form_code = isset($prm['form_code']) ? $this->sanitize_form_code($prm['form_code']) : '';
$data_riwayat = array();
if (isset($prm['data_riwayat'])) {
if (is_array($prm['data_riwayat'])) {
$data_riwayat = $prm['data_riwayat'];
} elseif (is_string($prm['data_riwayat']) && $prm['data_riwayat'] !== '') {
$decoded = json_decode($prm['data_riwayat'], true);
$data_riwayat = is_array($decoded) ? $decoded : array();
}
}
if ($form_code == '') {
$this->sys_error(isset($prm['form_code']) && (string) $prm['form_code'] !== ''
? "Format kode form tidak valid"
: "Form code tidak boleh kosong");
exit;
}
if ($xid_hex == '') {
$raw_id = isset($prm['id']) ? trim((string) $prm['id']) : '';
$this->sys_error($raw_id === ''
? "ID (UUID) form tidak boleh kosong"
: "Format ID (UUID) tidak valid, pastikan token form utuh (32 digit hex)");
exit;
}
if(count($data_riwayat) == 0){
$this->sys_error("Data riwayat tidak boleh kosong");
exit;
}
$sql = "SELECT * FROM form_riwayat_pasien WHERE FormRiwayatPasienCode = ? AND REPLACE(LOWER(FormRiwayatPasienUUID),'-','') = ? AND FormRiwayatPasienIsActive = 'Y'";
$query = $this->db_onedev->query($sql, array($form_code, $xid_hex));
if(!$query){
$this->sys_error_db("error get exist or code form not match");
exit;
}
$exist_form_riwayat = $query->result_array();
if (count($exist_form_riwayat) == 0) {
$this->sys_error("Form tidak ditemukan, pastikan id adalah form_uuid (response start_session), bukan token MCU di URL (mgm_mcu).");
exit;
}
$parent_id = $exist_form_riwayat[0]['FormRiwayatPasienID'];
$this->db_onedev->trans_begin();
foreach($data_riwayat as $key => $item){
$riwayat = json_encode($item, JSON_UNESCAPED_SLASHES);
$sql = "UPDATE form_riwayat_pasien_template
JOIN fisik_template ON FormRiwayatPasienTemplateFisikTemplateID = FisikTemplateID AND
FisikTemplateIsActive = 'Y' AND
FisikTemplateTitle = ?
SET
FormRiwayatPasienTemplateDetails = ?,
FormRiwayatPasienTemplateLastUpdated = NOW(),
FormRiwayatPasienTemplateLastUpdatedUserID = 45312
WHERE
FormRiwayatPasienTemplateFormRiwayatPasienID = ? AND
FormRiwayatPasienTemplateIsActive = 'Y'
";
$rst = $this->db_onedev->query($sql, array(
$item['title'],
$riwayat,
$parent_id
));
if(!$rst){
echo $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error_db("form_riwayat_pasien error save");
exit;
}
}
$this->db_onedev->trans_commit();
$this->sys_ok("Data berhasil disimpan");
} catch(Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
}