db = $this->load->database("onedev", true); $this->db_corporate = $this->load->database("cpone_corporate", true); $this->db_dashboard = $this->load->database("cpone_dashboard", true); $this->db_log = $this->load->database("log", true); } function generate_code_string(){ $length = 10; $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; do { $code = ''; for ($i = 0; $i < $length; $i++) { $code .= $characters[rand(0, strlen($characters) - 1)]; } // Check if code already exists in mcu_number table $sql = "SELECT COUNT(*) as count FROM mcu_number WHERE Mcu_NumberTableName = ?"; $query = $this->db_corporate->query($sql, [$code]); $result = $query->row_array(); $exists = $result['count'] > 0; } while ($exists); return $code; } private function dashboard_table_exists($table_name) { return $this->db_dashboard->table_exists($table_name); } private function dashboard_column_exists($table_name, $column_name) { $query = $this->db_dashboard->query("SHOW COLUMNS FROM `{$table_name}` LIKE ?", [$column_name]); return $query && $query->num_rows() > 0; } private function ensure_dashboard_table_structures() { if (!$this->dashboard_table_exists('mcu_generate')) { $sql = "CREATE TABLE IF NOT EXISTS `mcu_generate` ( `Mcu_GenerateID` BIGINT NOT NULL AUTO_INCREMENT, `Mgm_McuID` INT NOT NULL, `Mcu_ProjectID` INT DEFAULT NULL, `GenerateDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`Mcu_GenerateID`), KEY `idx_mgm_mcuid` (`Mgm_McuID`), KEY `idx_project_id` (`Mcu_ProjectID`), KEY `idx_generate_date` (`GenerateDate`) ) ENGINE=InnoDB"; $query = $this->db_dashboard->query($sql); if (!$query) { $this->sys_error_db("create table mcu_generate", $this->db_dashboard); exit; } } $targetTables = ['kelainan_details', 'kelainan_summary', 'mcu_result_all']; foreach ($targetTables as $tableName) { if (!$this->dashboard_table_exists($tableName)) { $query = $this->db_dashboard->query("CREATE TABLE IF NOT EXISTS `{$tableName}` LIKE `cpone_corporate`.`{$tableName}`"); if (!$query) { $this->sys_error_db("create dashboard table {$tableName}", $this->db_dashboard); exit; } } if (!$this->dashboard_column_exists($tableName, 'Mgm_McuID')) { $query = $this->db_dashboard->query("ALTER TABLE `{$tableName}` ADD COLUMN `Mgm_McuID` INT NULL"); if (!$query) { $this->sys_error_db("add column Mgm_McuID on {$tableName}", $this->db_dashboard); exit; } } if (!$this->dashboard_column_exists($tableName, 'Mcu_GenerateID')) { $query = $this->db_dashboard->query("ALTER TABLE `{$tableName}` ADD COLUMN `Mcu_GenerateID` BIGINT NULL"); if (!$query) { $this->sys_error_db("add column Mcu_GenerateID on {$tableName}", $this->db_dashboard); exit; } } if (!$this->dashboard_column_exists($tableName, 'Mcu_ProjectID')) { $query = $this->db_dashboard->query("ALTER TABLE `{$tableName}` ADD COLUMN `Mcu_ProjectID` INT NULL"); if (!$query) { $this->sys_error_db("add column Mcu_ProjectID on {$tableName}", $this->db_dashboard); exit; } } } } private function resolve_dashboard_project_id($mgm_mcuid) { if (!$this->dashboard_table_exists('mcu_project')) { return null; } $columns = $this->db_dashboard->query("SHOW COLUMNS FROM `mcu_project`")->result_array(); if (count($columns) === 0) { return null; } $colNames = array_map(function($col) { return $col['Field']; }, $columns); $projectIdCol = null; foreach (['Mcu_ProjectID', 'mcu_project_id', 'ProjectID', 'id'] as $candidate) { if (in_array($candidate, $colNames, true)) { $projectIdCol = $candidate; break; } } if ($projectIdCol === null) { return null; } $mgmCol = null; foreach (['Mgm_McuID', 'Mcu_ProjectMcuID', 'Mcu_ProjectMgm_McuID', 'McuProjectMgmMcuID', 'mgm_mcuid', 'mgm_mcu_id'] as $candidate) { if (in_array($candidate, $colNames, true)) { $mgmCol = $candidate; break; } } if ($mgmCol === null) { return null; } $sql = "SELECT `{$projectIdCol}` AS project_id FROM `mcu_project` WHERE `{$mgmCol}` = ? ORDER BY `{$projectIdCol}` DESC LIMIT 1"; $query = $this->db_dashboard->query($sql, [$mgm_mcuid]); if (!$query || $query->num_rows() === 0) { return null; } return $query->row_array()['project_id']; } private function sync_to_dashboard($mgm_mcuid) { $mgm_mcuid = (int)$mgm_mcuid; if ($mgm_mcuid <= 0) { $this->sys_error("Mgm_McuID is required for dashboard sync"); exit; } $this->ensure_dashboard_table_structures(); $setupQuery = $this->db_corporate->query( "SELECT * FROM mcu_number WHERE Mcu_NumberMgm_McuID = ? AND Mcu_NumberIsActive = 'Y' ORDER BY Mcu_NumberID DESC LIMIT 1", [$mgm_mcuid] ); if (!$setupQuery || $setupQuery->num_rows() === 0) { $this->sys_error("MGM MCU not found for dashboard sync"); exit; } $setup = $setupQuery->row_array(); $numbering = $setup['Mcu_NumberTableName']; $mcu_project_id = $this->resolve_dashboard_project_id($mgm_mcuid); $this->db_dashboard->trans_begin(); $insertGenerate = $this->db_dashboard->query( "INSERT INTO mcu_generate (Mgm_McuID, Mcu_ProjectID, GenerateDate) VALUES (?, ?, NOW())", [$mgm_mcuid, $mcu_project_id] ); if (!$insertGenerate) { $this->db_dashboard->trans_rollback(); $this->sys_error_db("insert mcu_generate", $this->db_dashboard); exit; } $generate_id = $this->db_dashboard->insert_id(); $query = $this->db_dashboard->query("DELETE FROM kelainan_details WHERE Mgm_McuID = ?", [$mgm_mcuid]); if (!$query) { $this->db_dashboard->trans_rollback(); $this->sys_error_db("delete dashboard kelainan_details", $this->db_dashboard); exit; } $query = $this->db_dashboard->query("DELETE FROM kelainan_summary WHERE Mcu_KelainanMgm_McuID = ? OR Mgm_McuID = ?", [$mgm_mcuid, $mgm_mcuid]); if (!$query) { $this->db_dashboard->trans_rollback(); $this->sys_error_db("delete dashboard kelainan_summary", $this->db_dashboard); exit; } $query = $this->db_dashboard->query("DELETE FROM mcu_result_all WHERE Mcu_ResultAllMgm_McuID = ? OR Mgm_McuID = ?", [$mgm_mcuid, $mgm_mcuid]); if (!$query) { $this->db_dashboard->trans_rollback(); $this->sys_error_db("delete dashboard mcu_result_all", $this->db_dashboard); exit; } $query = $this->db_dashboard->query( "INSERT INTO kelainan_details SELECT kd.*, ?, ?, ? FROM cpone_corporate.kelainan_details kd WHERE kd.Numbering = ?", [$mgm_mcuid, $generate_id, $mcu_project_id, $numbering] ); if (!$query) { $this->db_dashboard->trans_rollback(); $this->sys_error_db("insert dashboard kelainan_details", $this->db_dashboard); exit; } $query = $this->db_dashboard->query( "INSERT INTO kelainan_summary SELECT ks.*, ?, ?, ? FROM cpone_corporate.kelainan_summary ks WHERE ks.Mcu_KelainanMgm_McuID = ?", [$mgm_mcuid, $generate_id, $mcu_project_id, $mgm_mcuid] ); if (!$query) { $this->db_dashboard->trans_rollback(); $this->sys_error_db("insert dashboard kelainan_summary", $this->db_dashboard); exit; } $query = $this->db_dashboard->query( "INSERT INTO mcu_result_all SELECT mra.*, ?, ?, ? FROM cpone_corporate.mcu_result_all mra WHERE mra.Mcu_ResultAllMgm_McuID = ?", [$mgm_mcuid, $generate_id, $mcu_project_id, $mgm_mcuid] ); if (!$query) { $this->db_dashboard->trans_rollback(); $this->sys_error_db("insert dashboard mcu_result_all", $this->db_dashboard); exit; } $this->db_dashboard->trans_commit(); return array( "Mcu_GenerateID" => $generate_id, "Mcu_ProjectID" => $mcu_project_id, "Mgm_McuID" => $mgm_mcuid ); } function generate_table_setup(){ /*if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; }*/ $prm = $this->sys_input; $mgm_mcuid = $prm['Mgm_McuID']; $userid = 0; $sql = "SELECT * FROM mgm_mcu JOIN corporate ON CorporateID = Mgm_McuCorporateID WHERE Mgm_McuID = ? AND Mgm_McuIsActive = 'Y' LIMIT 1"; $query = $this->db->query($sql, [$mgm_mcuid]); $data = $query->result_array(); if(count($data) > 0){ $sql = "SELECT COUNT(*) as total FROM t_orderheader WHERE T_OrderHeaderMgm_McuID = ? AND T_OrderHeaderIsActive = 'Y'"; $query = $this->db->query($sql, [$mgm_mcuid]); $result = $query->row_array(); $total_participants = $result['total']; $code = $this->generate_code_string(); $sql = "SELECT COUNT(*) as total FROM `mcu_number` WHERE Mcu_NumberMgm_McuID = ? AND Mcu_NumberIsActive = 'Y'"; $query = $this->db_corporate->query($sql, [$mgm_mcuid]); $result = $query->row_array(); $total_mcu_number = $result['total']; if($total_mcu_number > 0){ $this->sys_error("MGM MCU already has a table setup"); exit; } $sql = "INSERT INTO `mcu_number` ( `Mcu_NumberMgm_McuID`, `Mcu_NumberMgm_McuNumber`, `Mcu_NumberTableName`, `Mcu_NumberStartDate`, `Mcu_NumberEndDate`, `Mcu_NumberTotalParticipants`, `Mcu_NumberCorporateCode`, `Mcu_NumberCorporateName`, `Mcu_NumberCorporateAddress`, `Mcu_NumberCreated`, `Mcu_NumberCreatedUserID` ) VALUES(?,?,?,?,?,?,?,?,?,NOW(),?)"; $query = $this->db_corporate->query($sql, [ $data[0]['Mgm_McuID'], $data[0]['Mgm_McuNumber'], $code, $data[0]['Mgm_McuStartDate'], $data[0]['Mgm_McuEndDate'], $total_participants, $data[0]['CorporateCode'], $data[0]['CorporateName'], $data[0]['CorporateAddress'], $userid ]); if(!$query){ $this->sys_error_db("save table setup", $this->db_corporate); exit; }else{ $result = array("code" => $code, "sql"=> '', 'message' => 'Table setup generated successfully'); $this->sys_ok($result); exit; } }else{ $this->sys_error("MGM MCU not found"); exit; } } function generate_kelainan_lab() { /*if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; }*/ $prm = $this->sys_input; $mgm_mcuid = $prm['Mgm_McuID']; $sql = "SELECT * FROM mcu_number WHERE Mcu_NumberMgm_McuID = ? AND Mcu_NumberIsActive = 'Y' ORDER BY Mcu_NumberID DESC LIMIT 1"; $query = $this->db_corporate->query($sql, [$mgm_mcuid]); if(!$query){ $this->sys_error_db("select data mcu_number", $this->db_corporate); //echo $this->db_corporate->error_message(); echo $this->db_corporate->last_query(); exit; } $data_setup = $query->result_array(); if(count($data_setup) == 0){ $this->sys_error("MGM MCU not found"); exit; } //print_r($data_setup); exit; $numbering_column = $data_setup[0]['Mcu_NumberTableName']; $table_name = "kelainan_details"; $exist_table = $this->db_corporate->table_exists($table_name); $this->db_corporate->trans_begin(); if(!$exist_table){ $sql = "CREATE TABLE IF NOT EXISTS `{$table_name}` ( Tx_KelainanID INT, Tx_Type VARCHAR(10), T_OrderHeaderID INT, T_OrderHeaderDate DATETIME, T_OrderHeaderLabNumber VARCHAR(100), AgePatient INT, M_PatientID INT, M_PatientNoReg VARCHAR(50), M_PatientDOB DATE, M_PatientGender VARCHAR(10), M_PatientIdentifierValue VARCHAR(100), M_PatientNIP VARCHAR(50), M_PatientJob VARCHAR(100), M_PatientPosisi VARCHAR(100), M_PatientDivisi VARCHAR(100), M_PatientLocation VARCHAR(100), M_PatientDepartement VARCHAR(100), PatientName VARCHAR(255), M_PatientName VARCHAR(255), GroupResult VARCHAR(100), Nat_TestID INT, Nat_TestCode VARCHAR(50), Nat_TestName VARCHAR(255), T_TestName VARCHAR(255), Result VARCHAR(255), Mcu_KelainanID INT, Mcu_KelainanName VARCHAR(255), Mcu_KelainanGroupSummaryID INT, Mcu_KelainanGroupSummaryName VARCHAR(255), Mcu_FitnessCategoryID INT, Mcu_FitnessCategoryName VARCHAR(100), Mcu_FitnessCategoryEng VARCHAR(100), Mcu_FitnessCategoryLevel INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_kelainan_lab (Tx_KelainanID), INDEX idx_order_header (T_OrderHeaderID), INDEX idx_order_lab_number (T_OrderHeaderLabNumber), INDEX idx_patient_id (M_PatientID), INDEX idx_patient_noreg (M_PatientNoReg), INDEX idx_patient_location (M_PatientLocation), INDEX idx_patient_posisi (M_PatientPosisi), INDEX idx_patient_divisi (M_PatientDivisi), INDEX idx_patient_departement (M_PatientDepartement), INDEX idx_test (Nat_TestID), INDEX idx_kelainan (Mcu_KelainanID), INDEX idx_group_result (GroupResult), INDEX idx_numbering (Numbering) ) ENGINE=InnoDB"; $query = $this->db_corporate->query($sql); if(!$query){ $this->db_corporate->trans_rollback(); $this->sys_error_db("create table kelainan_details", $this->db_corporate); exit; } } $sql = "INSERT INTO `cpone_corporate`.`{$table_name}` ( Numbering, Tx_KelainanID, Tx_Type, T_OrderHeaderID, T_OrderHeaderDate, T_OrderHeaderLabNumber, AgePatient, M_PatientID, M_PatientNoReg, M_PatientDOB, M_PatientGender, M_PatientIdentifierValue, M_PatientNIP, M_PatientJob, M_PatientPosisi, M_PatientDivisi, M_PatientLocation, M_PatientDepartement, PatientName, M_PatientName, GroupResult, Nat_TestID, Nat_TestCode, Nat_TestName, T_TestName, Result, Mcu_KelainanID, Mcu_KelainanName, Mcu_KelainanGroupSummaryID, Mcu_KelainanGroupSummaryName, Mcu_FitnessCategoryID, Mcu_FitnessCategoryName, Mcu_FitnessCategoryEng, Mcu_FitnessCategoryLevel ) SELECT '{$numbering_column}', T_KelainanLabID as Tx_KelainanID, 'LAB' as Tx_Type, T_OrderHeaderID, T_OrderHeaderDate, T_OrderHeaderLabNumber, T_OrderHeaderM_PatientAge as AgePatient, M_PatientID, M_PatientNoReg, M_PatientDOB, M_PatientGender, M_PatientIdentifierValue, M_PatientNIP, M_PatientJob, M_PatientPosisi, M_PatientDivisi, M_PatientLocation, M_PatientDepartement, CONCAT( IF(M_TitleName IS NULL, '', CONCAT(M_TitleName, '. ')), IF(M_PatientPrefix IS NULL, '', CONCAT(M_PatientPrefix, ' ')), M_PatientName, IF(M_PatientSuffix IS NULL, '', CONCAT(M_PatientSuffix, ' ')) ) as PatientName, M_PatientName, IF(Group_ResultName = 'LAB', 'LAB', Nat_TestName) as GroupResult, Nat_TestID, Nat_TestCode, Nat_TestName, T_TestName, IFNULL(T_OrderDetailResult, '') as Result, Mcu_KelainanID, Mcu_KelainanName, Mcu_KelainanGroupSummaryID, Mcu_KelainanGroupSummaryName, Mcu_FitnessCategoryID, Mcu_FitnessCategoryName, Mcu_FitnessCategoryEng, Mcu_FitnessCategoryLevel FROM t_kelainan_lab JOIN t_orderdetail ON T_KelainanLabT_OrderDetailID = T_OrderDetailID AND T_OrderDetailIsActive = 'Y' JOIN t_orderheader ON T_KelainanLabT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderIsActive = 'Y' JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID AND Mgm_McuID = ? JOIN mcu_summarylab ON T_KelainanLabMcu_SummaryLabID = Mcu_SummaryLabID AND Mcu_SummaryLabIsActive = 'Y' JOIN nat_test ON Mcu_SummaryLabNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' JOIN t_test ON T_TestNat_TestID = Nat_TestID AND T_TestIsActive = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultIsActive = 'Y' JOIN mcu_kelainan ON Mcu_summaryLabMcu_KelainanID = Mcu_KelainanID AND Mcu_KelainanIsActive = 'Y' JOIN mcu_kelainangroupsummarydetail ON Mcu_KelainanGroupSummaryDetailMcu_KelainanID = Mcu_KelainanID AND Mcu_KelainanGroupSummaryDetailIsActive = 'Y' JOIN mcu_kelainangroupsummary ON Mcu_KelainanGroupSummaryDetailMcu_KelainanGroupSummaryID = Mcu_KelainanGroupSummaryID AND Mcu_KelainanGroupSummaryIsActive = 'Y' JOIN mcu_fitness_category ON Mcu_SummaryLabMcu_FitnessCategoryID = Mcu_FitnessCategoryID AND Mcu_FitnessCategoryIsActive = 'Y' LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID AND M_TitleIsActive = 'Y' WHERE T_KelainanLabIsActive = 'Y' GROUP BY T_KelainanLabID"; $query = $this->db->query($sql,[$mgm_mcuid]); if(!$query){ $this->db->trans_rollback(); $this->sys_error_db("insert data lab kelainan_details", $this->db); exit; } $this->db_corporate->trans_commit(); $dashboard_sync = $this->sync_to_dashboard($mgm_mcuid); $result = array("message" => "Data lab kelainan_details generated successfully", "dashboard_sync" => $dashboard_sync); $this->sys_ok($result); exit; } function generate_kelainan_nonlab() { /*if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; }*/ $prm = $this->sys_input; $mgm_mcuid = $prm['Mgm_McuID']; $sql = "SELECT * FROM mcu_number WHERE Mcu_NumberMgm_McuID = ? AND Mcu_NumberIsActive = 'Y' ORDER BY Mcu_NumberID DESC LIMIT 1"; $query = $this->db_corporate->query($sql, [$mgm_mcuid]); $data_setup = $query->result_array(); if(count($data_setup) == 0){ $this->sys_error("MGM MCU not found"); exit; } $numbering_column = $data_setup[0]['Mcu_NumberTableName']; $table_name = "kelainan_details"; $exist_table = $this->db_corporate->table_exists($table_name); $this->db_corporate->trans_begin(); if(!$exist_table){ $sql = "CREATE TABLE IF NOT EXISTS `{$table_name}` ( Numbering VARCHAR(150), Tx_KelainanID INT, Tx_Type VARCHAR(10), T_OrderHeaderID INT, T_OrderHeaderDate DATETIME, T_OrderHeaderLabNumber VARCHAR(100), AgePatient INT, M_PatientID INT, M_PatientNoReg VARCHAR(50), M_PatientDOB DATE, M_PatientGender VARCHAR(10), M_PatientIdentifierValue VARCHAR(100), M_PatientNIP VARCHAR(50), M_PatientJob VARCHAR(100), M_PatientPosisi VARCHAR(100), M_PatientDivisi VARCHAR(100), M_PatientLocation VARCHAR(100), M_PatientDepartement VARCHAR(100), PatientName VARCHAR(255), M_PatientName VARCHAR(255), GroupResult VARCHAR(100), Nat_TestID INT, Nat_TestCode VARCHAR(50), Nat_TestName VARCHAR(255), T_TestName VARCHAR(255), Result VARCHAR(255), Mcu_KelainanID INT, Mcu_KelainanName VARCHAR(255), Mcu_KelainanGroupSummaryID INT, Mcu_KelainanGroupSummaryName VARCHAR(255), Mcu_FitnessCategoryID INT, Mcu_FitnessCategoryName VARCHAR(100), Mcu_FitnessCategoryEng VARCHAR(100), Mcu_FitnessCategoryLevel INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_kelainan_lab (Tx_KelainanID), INDEX idx_order_header (T_OrderHeaderID), INDEX idx_order_lab_number (T_OrderHeaderLabNumber), INDEX idx_patient_id (M_PatientID), INDEX idx_patient_noreg (M_PatientNoReg), INDEX idx_patient_location (M_PatientLocation), INDEX idx_patient_posisi (M_PatientPosisi), INDEX idx_patient_divisi (M_PatientDivisi), INDEX idx_patient_departement (M_PatientDepartement), INDEX idx_test (Nat_TestID), INDEX idx_kelainan (Mcu_KelainanID), INDEX idx_group_result (GroupResult), INDEX idx_numbering (Numbering) ) ENGINE=InnoDB"; $query = $this->db_corporate->query($sql); if(!$query){ $this->db_corporate->trans_rollback(); $this->sys_error_db("create table kelainan_details", $this->db_corporate); exit; } } $sql = "INSERT INTO `cpone_corporate`.`{$table_name}` ( Numbering, Tx_KelainanID, Tx_Type, T_OrderHeaderID, T_OrderHeaderDate, T_OrderHeaderLabNumber, AgePatient, M_PatientID, M_PatientNoReg, M_PatientDOB, M_PatientGender, M_PatientIdentifierValue, M_PatientNIP, M_PatientJob, M_PatientPosisi, M_PatientDivisi, M_PatientLocation, M_PatientDepartement, PatientName, M_PatientName, GroupResult, Nat_TestID, Nat_TestCode, Nat_TestName, T_TestName, Result, Mcu_KelainanID, Mcu_KelainanName, Mcu_KelainanGroupSummaryID, Mcu_KelainanGroupSummaryName, Mcu_FitnessCategoryID, Mcu_FitnessCategoryName, Mcu_FitnessCategoryEng, Mcu_FitnessCategoryLevel ) SELECT '{$numbering_column}', T_KelainanNonLabID as Tx_KelainanID, 'NONLAB' as Tx_Type, T_OrderHeaderID, T_OrderHeaderDate, T_OrderHeaderLabNumber, T_OrderHeaderM_PatientAge as AgePatient, M_PatientID, M_PatientNoReg, M_PatientDOB, M_PatientGender, M_PatientIdentifierValue, M_PatientNIP, M_PatientJob, M_PatientPosisi, M_PatientDivisi, M_PatientLocation, M_PatientDepartement, CONCAT(IF(M_TitleName IS NULL,'',CONCAT(M_TitleName,'. ')), IF(M_PatientPrefix IS NULL,'',CONCAT(M_PatientPrefix,' ')), M_PatientName, IF(M_PatientSuffix IS NULL,'',CONCAT(M_PatientPrefix,' '))) as PatientName, M_PatientName, IF(Group_ResultName = 'LAB', 'LAB', Nat_TestName) as GroupResult, Nat_TestID, Nat_TestCode, Nat_TestName, T_TestName, '', Mcu_KelainanID, Mcu_KelainanName, Mcu_KelainanGroupSummaryID, Mcu_KelainanGroupSummaryName, Mcu_FitnessCategoryID, Mcu_FitnessCategoryName, Mcu_FitnessCategoryEng, Mcu_FitnessCategoryLevel FROM t_kelainan_nonlab JOIN t_orderheader ON T_KelainanNonLabT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderIsActive = 'Y' JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID AND Mgm_McuID = ? JOIN mcu_summarynonlab ON T_KelainanNonLabMcu_SummaryNonlabID = Mcu_SummaryNonlabID AND Mcu_SummaryNonlabIsActive = 'Y' JOIN nat_test ON Mcu_SummaryNonlabNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' JOIN t_test ON T_TestNat_TestID = Nat_TestID AND T_TestIsActive = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultIsActive = 'Y' JOIN mcu_kelainan ON Mcu_SummaryNonlabMcu_KelainanID = Mcu_KelainanID AND Mcu_KelainanIsActive = 'Y' JOIN mcu_kelainangroupsummarydetail ON Mcu_KelainanGroupSummaryDetailMcu_KelainanID = Mcu_KelainanID AND Mcu_KelainanGroupSummaryDetailIsActive = 'Y' JOIN mcu_kelainangroupsummary ON Mcu_KelainanGroupSummaryDetailMcu_KelainanGroupSummaryID = Mcu_KelainanGroupSummaryID AND Mcu_KelainanGroupSummaryIsActive = 'Y' JOIN mcu_fitness_category ON Mcu_SummaryNonlabMcu_FitnessCategoryID = Mcu_FitnessCategoryID AND Mcu_FitnessCategoryIsActive = 'Y' LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID AND M_TitleIsActive = 'Y' WHERE T_KelainanNonLabIsActive = 'Y'"; $query = $this->db->query($sql,[$mgm_mcuid]); //echo $this->db->last_query(); //exit; if(!$query){ $this->db->trans_rollback(); $this->sys_error_db("insert data nonlab kelainan_details", $this->db); exit; } $this->db_corporate->trans_commit(); $dashboard_sync = $this->sync_to_dashboard($mgm_mcuid); $result = array("message" => "Data nonlab kelainan_details generated successfully", "dashboard_sync" => $dashboard_sync); $this->sys_ok($result); exit; } function generate_kelainan_fisik() { /*if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; }*/ $prm = $this->sys_input; $mgm_mcuid = $prm['Mgm_McuID']; $sql = "SELECT * FROM mcu_number WHERE Mcu_NumberMgm_McuID = ? AND Mcu_NumberIsActive = 'Y' ORDER BY Mcu_NumberID DESC LIMIT 1"; $query = $this->db_corporate->query($sql, [$mgm_mcuid]); $data_setup = $query->result_array(); if(count($data_setup) == 0){ $this->sys_error("MGM MCU not found"); exit; } $numbering_column = $data_setup[0]['Mcu_NumberTableName']; $table_name = "kelainan_details"; $exist_table = $this->db_corporate->table_exists($table_name); $this->db_corporate->trans_begin(); if(!$exist_table){ $sql = "CREATE TABLE IF NOT EXISTS `{$table_name}` ( Numbering VARCHAR(150), Tx_KelainanID INT, Tx_Type VARCHAR(10), T_OrderHeaderID INT, T_OrderHeaderDate DATETIME, T_OrderHeaderLabNumber VARCHAR(100), AgePatient INT, M_PatientID INT, M_PatientNoReg VARCHAR(50), M_PatientDOB DATE, M_PatientGender VARCHAR(10), M_PatientIdentifierValue VARCHAR(100), M_PatientNIP VARCHAR(50), M_PatientJob VARCHAR(100), M_PatientPosisi VARCHAR(100), M_PatientDivisi VARCHAR(100), M_PatientLocation VARCHAR(100), M_PatientDepartement VARCHAR(100), PatientName VARCHAR(255), M_PatientName VARCHAR(255), GroupResult VARCHAR(100), Nat_TestID INT, Nat_TestCode VARCHAR(50), Nat_TestName VARCHAR(255), T_TestName VARCHAR(255), Result VARCHAR(255), Mcu_KelainanID INT, Mcu_KelainanName VARCHAR(255), Mcu_KelainanGroupSummaryID INT, Mcu_KelainanGroupSummaryName VARCHAR(255), Mcu_FitnessCategoryID INT, Mcu_FitnessCategoryName VARCHAR(100), Mcu_FitnessCategoryEng VARCHAR(100), Mcu_FitnessCategoryLevel INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_numbering (Numbering), INDEX idx_kelainan_lab (Tx_KelainanID), INDEX idx_order_header (T_OrderHeaderID), INDEX idx_order_lab_number (T_OrderHeaderLabNumber), INDEX idx_patient_id (M_PatientID), INDEX idx_patient_noreg (M_PatientNoReg), INDEX idx_patient_location (M_PatientLocation), INDEX idx_patient_posisi (M_PatientPosisi), INDEX idx_patient_divisi (M_PatientDivisi), INDEX idx_patient_departement (M_PatientDepartement), INDEX idx_test (Nat_TestID), INDEX idx_kelainan (Mcu_KelainanID), INDEX idx_group_result (GroupResult) ) ENGINE=InnoDB"; $query = $this->db_corporate->query($sql); if(!$query){ $this->db_corporate->trans_rollback(); $this->sys_error_db("create table kelainan_details", $this->db_corporate); exit; } } $sql = "INSERT INTO `cpone_corporate`.`{$table_name}` ( Numbering, Tx_KelainanID, Tx_Type, T_OrderHeaderID, T_OrderHeaderDate, T_OrderHeaderLabNumber, AgePatient, M_PatientID, M_PatientNoReg, M_PatientDOB, M_PatientGender, M_PatientIdentifierValue, M_PatientNIP, M_PatientJob, M_PatientPosisi, M_PatientDivisi, M_PatientLocation, M_PatientDepartement, PatientName, M_PatientName, GroupResult, Nat_TestID, Nat_TestCode, Nat_TestName, T_TestName, Result, Mcu_KelainanID, Mcu_KelainanName, Mcu_KelainanGroupSummaryID, Mcu_KelainanGroupSummaryName, Mcu_FitnessCategoryID, Mcu_FitnessCategoryName, Mcu_FitnessCategoryEng, Mcu_FitnessCategoryLevel ) SELECT '{$numbering_column}', T_KelainanFiskID as Tx_KelainanID, 'FISIK' as Tx_Type, T_OrderHeaderID, T_OrderHeaderDate, T_OrderHeaderLabNumber, T_OrderHeaderM_PatientAge as AgePatient, M_PatientID, M_PatientNoReg, M_PatientDOB, M_PatientGender, M_PatientIdentifierValue, M_PatientNIP, M_PatientJob, M_PatientPosisi, M_PatientDivisi, M_PatientLocation, M_PatientDepartement, CONCAT(IF(M_TitleName IS NULL,'',CONCAT(M_TitleName,'. ')), IF(M_PatientPrefix IS NULL,'',CONCAT(M_PatientPrefix,' ')), M_PatientName, IF(M_PatientSuffix IS NULL,'',CONCAT(M_PatientPrefix,' '))) as PatientName, M_PatientName, IF(Group_ResultName = 'LAB', 'LAB', Nat_TestName) as GroupResult, Nat_TestID, Nat_TestCode, Nat_TestName, CONCAT(IF(label IS NULL, Mcu_KelainanGroupName, CONCAT(label, ' - ',IF(level = 1, parent_level_1,IF(level = 2, parent_level_2, IF(level = 3,parent_level_3,parent_level_4)))))) as T_TestName, IF(Mcu_FisikValueNote = '',Mcu_FisikValueLabel,Mcu_FisikValueNote) as Result, Mcu_KelainanID, Mcu_KelainanName, Mcu_KelainanGroupSummaryID, Mcu_KelainanGroupSummaryName, Mcu_FitnessCategoryID, Mcu_FitnessCategoryName, Mcu_FitnessCategoryEng, Mcu_FitnessCategoryLevel FROM t_kelainan_fisik JOIN t_orderheader ON T_KelainanFiskT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderIsActive = 'Y' JOIN so_resultentry ON T_KelainanFiskSo_ResultEntryID = So_ResultEntryID AND So_ResultEntryIsActive = 'Y' JOIN t_orderdetail ON So_ResultEntryT_OrderDetailID = T_OrderDetailID AND T_OrderDetailIsActive = 'Y' JOIN nat_test ON Nat_TestCode = T_OrderDetailT_TestCode AND Nat_TestIsActive = 'Y' JOIN t_test ON T_TestNat_TestID = Nat_TestID AND T_TestIsActive = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultIsActive = 'Y' JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID AND Mgm_McuID = ? JOIN mcu_fisiksummary ON T_KelainanFiskMcu_FisikSummaryID = Mcu_FisikSummaryID AND Mcu_FisikSummaryIsActive = 'Y' JOIN mcu_fisiksummarydetail ON Mcu_FisikSummaryDetailMcu_FisikSummaryID = Mcu_FisikSummaryID AND Mcu_FisikSummaryDetailIsActive = 'Y' JOIN mcu_kelainan ON Mcu_FisikSummaryMcu_KelainanID = Mcu_KelainanID AND Mcu_KelainanIsActive = 'Y' JOIN mcu_kelainangroup ON Mcu_KelainanMcu_KelainanGroupID = Mcu_KelainanGroupID AND Mcu_KelainanGroupIsActive = 'Y' JOIN mcu_kelainangroupsummarydetail ON Mcu_KelainanGroupSummaryDetailMcu_KelainanID = Mcu_KelainanID AND Mcu_KelainanGroupSummaryDetailIsActive = 'Y' JOIN mcu_kelainangroupsummary ON Mcu_KelainanGroupSummaryDetailMcu_KelainanGroupSummaryID = Mcu_KelainanGroupSummaryID AND Mcu_KelainanGroupSummaryIsActive = 'Y' JOIN mcu_fitness_category ON Mcu_FisikSummaryMcu_FitnessCategoryID = Mcu_FitnessCategoryID AND Mcu_FitnessCategoryIsActive = 'Y' JOIN mcu_fisikvalue ON Mcu_FisikValueT_OrderHeaderID = T_OrderHeaderID AND Mcu_FisikValueIsActive = 'Y' AND Mcu_FisikValueCode = Mcu_FisikSummaryDetailCode LEFT JOIN fisik_template_map ON id_code = Mcu_FisikSummaryDetailCode LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID AND M_TitleIsActive = 'Y' WHERE T_KelainanFiskIsActive = 'Y'"; $query = $this->db->query($sql,[$mgm_mcuid]); if(!$query){ $this->db->trans_rollback(); $this->sys_error_db("insert data fisik kelainan_details", $this->db); exit; } $this->db_corporate->trans_commit(); $dashboard_sync = $this->sync_to_dashboard($mgm_mcuid); $result = array("message" => "Data fisik kelainan_details generated successfully", "dashboard_sync" => $dashboard_sync); $this->sys_ok($result); exit; } function generate_all_results() { /*if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; }*/ $prm = $this->sys_input; $mgm_mcuid = $prm['Mgm_McuID']; $sql = "SELECT * FROM mcu_number WHERE Mcu_NumberMgm_McuID = ? AND Mcu_NumberIsActive = 'Y' ORDER BY Mcu_NumberID DESC LIMIT 1"; $query = $this->db_corporate->query($sql, [$mgm_mcuid]); if(!$query){ $this->sys_error_db("select data mcu_number", $this->db_corporate); //echo $this->db_corporate->error_message(); echo $this->db_corporate->last_query(); exit; } $data_setup = $query->result_array(); if(count($data_setup) == 0){ $this->sys_error("MGM MCU not found"); exit; } $numbering_column = $data_setup[0]['Mcu_NumberTableName']; $table_name = "mcu_result_all"; $exist_table = $this->db_corporate->table_exists($table_name); $this->db_corporate->trans_begin(); if(!$exist_table){ $sql = "CREATE TABLE IF NOT EXISTS `{$table_name}` ( `Mcu_ResultAllID` int NOT NULL AUTO_INCREMENT, `Numbering` varchar(150) DEFAULT NULL, `Mcu_ResultAllM_LangID` int NOT NULL DEFAULT '1', `Mcu_ResultAllMgm_McuID` int DEFAULT NULL, `Mcu_ResultAllT_OrderHeaderID` int DEFAULT NULL, `Mcu_ResultAllT_OrderHeaderLabNumber` varchar(50) DEFAULT NULL, `Mcu_ResultAllReffID` int DEFAULT NULL, `Mcu_ResultAllT_TestCode` varchar(50) DEFAULT NULL, `Mcu_ResultAllT_TestName` varchar(255) DEFAULT NULL, `Mcu_ResultAllResult` text, `Mcu_ResultAllUnit` varchar(255) DEFAULT NULL, `Mcu_ResultAllRefference` text, `Mcu_ResultAllCreated` datetime DEFAULT NULL, PRIMARY KEY (`Mcu_ResultAllID`), KEY `Mcu_ResultAllMgm_McuID` (`Mcu_ResultAllMgm_McuID`), KEY `Mcu_ResultAllT_OrderHeaderID` (`Mcu_ResultAllT_OrderHeaderID`), KEY `Mcu_ResultAllT_OrderHeaderLabNumber` (`Mcu_ResultAllT_OrderHeaderLabNumber`), KEY `Mcu_ResultAllReffID` (`Mcu_ResultAllReffID`), KEY `Mcu_ResultAllT_TestCode` (`Mcu_ResultAllT_TestCode`), KEY `Numbering` (`Numbering`) ) ENGINE=InnoDB"; $query = $this->db_corporate->query($sql); if(!$query){ $this->db_corporate->trans_rollback(); $this->sys_error_db("create table group_summary", $this->db_corporate); exit; } } $sql = "INSERT INTO `cpone_corporate`.`{$table_name}` ( Numbering, Mcu_ResultAllM_LangID, Mcu_ResultAllMgm_McuID, Mcu_ResultAllT_OrderHeaderID, Mcu_ResultAllT_OrderHeaderLabNumber, Mcu_ResultAllReffID, Mcu_ResultAllT_TestCode, Mcu_ResultAllT_TestName, Mcu_ResultAllResult, Mcu_ResultAllUnit, Mcu_ResultAllRefference, Mcu_ResultAllCreated ) SELECT '{$numbering_column}', Mcu_ResultAllM_LangID, Mcu_ResultAllMgm_McuID, Mcu_ResultAllT_OrderHeaderID, Mcu_ResultAllT_OrderHeaderLabNumber, Mcu_ResultAllReffID, Mcu_ResultAllT_TestCode, Mcu_ResultAllT_TestName, Mcu_ResultAllResult, Mcu_ResultAllUnit, Mcu_ResultAllRefference, Mcu_ResultAllCreated FROM `cpone_log`.`mcu_result_all` WHERE Mcu_ResultAllMgm_McuID = ?"; $query = $this->db->query($sql,[$mgm_mcuid]); if(!$query){ $this->db->trans_rollback(); $this->sys_error_db("insert data mcu_result_all", $this->db); exit; } $this->db_corporate->trans_commit(); $dashboard_sync = $this->sync_to_dashboard($mgm_mcuid); $result = array("message" => "Data mcu_result_all generated successfully", "dashboard_sync" => $dashboard_sync); $this->sys_ok($result); exit; } function summary_kelainan_sepuluh() { /*if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; }*/ $prm = $this->sys_input; $mgm_mcuid = $prm['Mgm_McuID']; $sql = "SELECT * FROM mcu_number WHERE Mcu_NumberMgm_McuID = ? AND Mcu_NumberIsActive = 'Y' ORDER BY Mcu_NumberID DESC LIMIT 1"; $query = $this->db_corporate->query($sql, [$mgm_mcuid]); if(!$query){ $this->sys_error_db("select data mcu_number", $this->db_corporate); //echo $this->db_corporate->error_message(); echo $this->db_corporate->last_query(); exit; } $data_setup = $query->result_array(); if(count($data_setup) == 0){ $this->sys_error("MGM MCU not found"); exit; } $table_name = "kelainan_summary"; $exist_table = $this->db_corporate->table_exists($table_name); $this->db_corporate->trans_begin(); if(!$exist_table){ $sql = "CREATE TABLE IF NOT EXISTS `{$table_name}` ( Mcu_KelainanID INT, Mcu_KelainanMgm_McuID INT, Mcu_KelainanName VARCHAR(250), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_kelainan_summary (Mcu_KelainanID) ) ENGINE=InnoDB"; $query = $this->db_corporate->query($sql); if(!$query){ $this->db_corporate->trans_rollback(); $this->sys_error_db("create table group_summary", $this->db_corporate); exit; } } $sql = "INSERT INTO `cpone_corporate`.`{$table_name}` ( Mcu_KelainanID, Mcu_KelainanMgm_McuID, Mcu_KelainanName ) SELECT Mcu_KelainanID, Kelainan_SummariesProjectMgm_McuID, Mcu_KelainanName FROM mcu_kelainan JOIN kelainan_summaries_project ON Kelainan_SummariesProjectKelainanID = Mcu_KelainanID WHERE Kelainan_SummariesProjectMgm_McuID = ? AND Kelainan_SummariesProjectIsActive = 'Y'"; $query = $this->db->query($sql,[$mgm_mcuid]); if(!$query){ $this->db->trans_rollback(); $this->sys_error_db("insert data group_summary", $this->db); exit; } $this->db_corporate->trans_commit(); $dashboard_sync = $this->sync_to_dashboard($mgm_mcuid); $result = array("message" => "Data kelainan_summary generated successfully", "dashboard_sync" => $dashboard_sync); $this->sys_ok($result); exit; } /* UPDATE kelainan_details_JYMXG02AQ5 SET M_PatientDepartement = CASE WHEN MOD(T_OrderHeaderID, 5) = 0 THEN 'IT Department' WHEN MOD(T_OrderHeaderID, 5) = 1 THEN 'HR Department' WHEN MOD(T_OrderHeaderID, 5) = 2 THEN 'Finance Department' WHEN MOD(T_OrderHeaderID, 5) = 3 THEN 'Operations Department' WHEN MOD(T_OrderHeaderID, 5) = 4 THEN 'Marketing Department' END; */ // ==================== FISIK TEMPLATE MAP FUNCTIONS ==================== /* * FISIK TEMPLATE MAP - Dokumentasi & Urutan Penggunaan * ======================================================== * * TUJUAN: * Mengekstrak dan menyimpan semua id_code, label, dan parent hierarchy dari * JSON template (FisikTemplateJSON) ke dalam satu tabel terstruktur (fisik_template_map) * untuk memudahkan query dan mapping data. * * URUTAN PENGGUNAAN: * ------------------ * * STEP 1: Lihat Template yang Aktif (Opsional) * Endpoint: /generatedata/list_active_fisik_templates * Fungsi : list_active_fisik_templates() * Tujuan : Melihat list semua template dengan FisikTemplateIsActive = 'Y' * Request : Tidak ada parameter * Response: { total: 9, data: [template_list...] } * * STEP 2: Lihat Detail Template (Opsional) * Endpoint: /generatedata/get_fisik_template_detail * Fungsi : get_fisik_template_detail() * Tujuan : Melihat detail template tertentu dengan JSON parsed * Request : { FisikTemplateCode: "RI00" } * Response: { FisikTemplateJSON_Parsed: {...} } * * STEP 3: Buat Tabel Mapping (Hanya Sekali) * Endpoint: /generatedata/create_fisik_template_map_table * Fungsi : create_fisik_template_map_table() * Tujuan : Membuat tabel fisik_template_map jika belum ada * Request : Tidak ada parameter * Response: { message: "Table created successfully" } * * STEP 4a: Generate Semua Template (Full Generate) * Endpoint: /generatedata/generate_fisik_template_map * Fungsi : generate_fisik_template_map() * Tujuan : Extract & simpan mapping SEMUA template aktif * Request : Tidak ada parameter * Response: { total_records: 250, total_templates: 9 } * Note : Truncate semua data lama, insert semua data baru * * STEP 4b: Generate Template Tertentu (Partial Update) * Endpoint: /generatedata/generate_fisik_template_map_by_code * Fungsi : generate_fisik_template_map_by_code() * Tujuan : Extract & update mapping untuk satu template saja * Request : { FisikTemplateCode: "RI00" } * Response: { template_code: "RI00", total_records: 9 } * Note : Hapus data lama template ini saja, insert data baru * Use Case: Ketika ada perubahan di satu template, tidak perlu regenerate semua * * STEP 5a: Query Data Mapping * Endpoint: /generatedata/get_fisik_template_map * Fungsi : get_fisik_template_map() * Tujuan : Ambil data mapping dengan filter opsional * Request : { FisikTemplateCode: "RI00", level: 2 } (opsional) * Response: Array of mapping data * * STEP 5b: Search Data Mapping * Endpoint: /generatedata/search_fisik_template_map * Fungsi : search_fisik_template_map() * Tujuan : Cari mapping berdasarkan id_code atau label * Request : { keyword: "perut" } * Response: Array of matching records * * FUNGSI HELPER (Internal): * ------------------------- * - get_active_fisik_templates() : Helper untuk query template aktif * - extract_data_from_json() : Extract data dari JSON recursively * - extract_flat_details() : Extract untuk structure flat * - extract_nested_with_name() : Extract untuk structure dengan grouping * - extract_sub_details() : Extract sub-details recursively * * STRUKTUR TABEL MAPPING: * ---------------------- * - MapID : Primary key auto increment * - FisikTemplateID : ID template source * - FisikTemplateCode : Code template (RI00, RI01, FI00, dst) * - FisikTemplateType : Type template (Riwayat, Fisik, K3) * - id_code : ID unik dari JSON (perut_1, perut_14_1, dst) * - label : Label dari item * - parent_level_1 : Title utama (PERUT / ABDOMEN) * - parent_level_2 : Section/Group name (Hernia, Abdomen, dst) * - parent_level_3 : Sub-item parent * - parent_level_4 : Sub-sub-item parent * - level : Kedalaman level (1-5) * - table_name : Nama tabel target (perut, fisik_etnis, dst) * - segment_name : Segment name dari item * - type_form : Type form (XVS, XVS-LXX, XV, dst) * * CONTOH QUERY DATA: * ------------------ * 1. Ambil semua item dari template RI00: * SELECT * FROM fisik_template_map WHERE FisikTemplateCode = 'RI00' * * 2. Ambil semua item level 2 (biasanya item utama): * SELECT * FROM fisik_template_map WHERE level = 2 * * 3. Cari berdasarkan id_code: * SELECT * FROM fisik_template_map WHERE id_code = 'perut_14_1' * * 4. Cari item dengan parent tertentu: * SELECT * FROM fisik_template_map * WHERE parent_level_1 = 'PERUT / ABDOMEN' * AND parent_level_2 = 'Hernia' * * UPDATE WORKFLOW: * ---------------- * Jika ada perubahan di fisik_template: * 1. Update JSON di tabel fisik_template * 2. Jalankan generate_fisik_template_map_by_code() untuk template yg berubah * (Tidak perlu regenerate semua template) * 3. Mapping otomatis terupdate untuk template tersebut */ /** * STEP 3: Create table fisik_template_map * ---------------------------------------- * Endpoint: POST /generatedata/create_fisik_template_map_table * Request : No parameters * Response: { message: "Table created successfully" } */ function create_fisik_template_map_table() { $sql = "CREATE TABLE IF NOT EXISTS `fisik_template_map` ( `MapID` int NOT NULL AUTO_INCREMENT, `FisikTemplateID` int NOT NULL, `FisikTemplateCode` varchar(50) NOT NULL, `FisikTemplateType` varchar(25) NOT NULL, `id_code` varchar(100) NOT NULL, `label` varchar(255) NOT NULL, `parent_level_1` varchar(255) NOT NULL DEFAULT '' COMMENT 'Title utama', `parent_level_2` varchar(255) NOT NULL DEFAULT '' COMMENT 'Section/Group name', `parent_level_3` varchar(255) NOT NULL DEFAULT '' COMMENT 'Sub-item parent', `parent_level_4` varchar(255) NOT NULL DEFAULT '' COMMENT 'Sub-sub-item parent', `level` int NOT NULL DEFAULT '1' COMMENT 'Kedalaman level', `table_name` varchar(100) NOT NULL DEFAULT '', `segment_name` varchar(255) NOT NULL DEFAULT '', `type_form` varchar(50) NOT NULL DEFAULT '', `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`MapID`), KEY `idx_template_id` (`FisikTemplateID`), KEY `idx_id_code` (`id_code`), KEY `idx_template_code` (`FisikTemplateCode`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"; $query = $this->db->query($sql); if(!$query){ $this->sys_error_db("create table fisik_template_map", $this->db); exit; } $result = array("message" => "Table fisik_template_map created successfully"); $this->sys_ok($result); exit; } /** * HELPER FUNCTION (Internal) * --------------------------- * Get active fisik templates from database * Mengambil data template yang aktif (FisikTemplateIsActive = 'Y') * * @param int|null $template_id Filter berdasarkan ID tertentu * @param string|null $template_code Filter berdasarkan code tertentu * @return array|false Array of templates atau false jika error * * Usage: * - $this->get_active_fisik_templates() // Semua template aktif * - $this->get_active_fisik_templates(1, null) // Template dengan ID = 1 * - $this->get_active_fisik_templates(null, 'RI00') // Template dengan code = RI00 */ function get_active_fisik_templates($template_id = null, $template_code = null) { $sql = "SELECT FisikTemplateID, FisikTemplateType, FisikTemplateCode, FisikTemplateTitle, FisikTemplateJSON, FisikTemplateTableName FROM fisik_template WHERE FisikTemplateIsActive = 'Y'"; $params = array(); if ($template_id !== null) { $sql .= " AND FisikTemplateID = ?"; $params[] = $template_id; } if ($template_code !== null) { $sql .= " AND FisikTemplateCode = ?"; $params[] = $template_code; } $sql .= " ORDER BY FisikTemplateID"; $query = $this->db->query($sql, $params); if (!$query) { return false; } return $query->result_array(); } /** * Extract data from JSON recursively */ function extract_data_from_json($data, $templateInfo, &$results) { $mainTitle = isset($data['title']) ? $data['title'] : ''; $typeForm = isset($data['type_form']) ? $data['type_form'] : ''; if (isset($data['details']) && is_array($data['details'])) { $firstDetail = reset($data['details']); if (isset($firstDetail['name'])) { // Structure dengan grouping name $this->extract_nested_with_name($data['details'], $mainTitle, $typeForm, $templateInfo, $results); } else { // Structure flat $this->extract_flat_details($data['details'], $mainTitle, $typeForm, $templateInfo, $results); } } } /** * Extract flat details (tanpa grouping name) */ function extract_flat_details($details, $mainTitle, $typeForm, $templateInfo, &$results) { foreach ($details as $item) { $result = array( 'FisikTemplateID' => $templateInfo['FisikTemplateID'], 'FisikTemplateCode' => $templateInfo['FisikTemplateCode'], 'FisikTemplateType' => $templateInfo['FisikTemplateType'], 'id_code' => isset($item['id_code']) ? $item['id_code'] : '', 'label' => isset($item['label']) ? $item['label'] : '', 'parent_level_1' => $mainTitle, 'parent_level_2' => '', 'parent_level_3' => '', 'parent_level_4' => '', 'level' => 1, 'table_name' => isset($item['table_name']) ? $item['table_name'] : '', 'segment_name' => isset($item['segment_name']) ? $item['segment_name'] : '', 'type_form' => isset($item['type_form']) ? $item['type_form'] : $typeForm ); $results[] = $result; // Cek sub-details if (isset($item['details']) && is_array($item['details'])) { $this->extract_sub_details( $item['details'], $mainTitle, '', isset($item['label']) ? $item['label'] : '', '', $templateInfo, $results, isset($item['table_name']) ? $item['table_name'] : '', isset($item['segment_name']) ? $item['segment_name'] : '', $typeForm ); } } } /** * Extract nested with name grouping */ function extract_nested_with_name($details, $mainTitle, $typeForm, $templateInfo, &$results) { foreach ($details as $section) { $sectionName = isset($section['name']) ? $section['name'] : ''; if (isset($section['details']) && is_array($section['details'])) { foreach ($section['details'] as $item) { $result = array( 'FisikTemplateID' => $templateInfo['FisikTemplateID'], 'FisikTemplateCode' => $templateInfo['FisikTemplateCode'], 'FisikTemplateType' => $templateInfo['FisikTemplateType'], 'id_code' => isset($item['id_code']) ? $item['id_code'] : '', 'label' => isset($item['label']) ? $item['label'] : '', 'parent_level_1' => $mainTitle, 'parent_level_2' => $sectionName, 'parent_level_3' => '', 'parent_level_4' => '', 'level' => 2, 'table_name' => isset($item['table_name']) ? $item['table_name'] : '', 'segment_name' => isset($item['segment_name']) ? $item['segment_name'] : '', 'type_form' => isset($item['type_form']) ? $item['type_form'] : $typeForm ); $results[] = $result; // Cek sub-details if (isset($item['details']) && is_array($item['details'])) { $this->extract_sub_details( $item['details'], $mainTitle, $sectionName, isset($item['label']) ? $item['label'] : '', '', $templateInfo, $results, isset($item['table_name']) ? $item['table_name'] : '', isset($item['segment_name']) ? $item['segment_name'] : '', $typeForm ); } } } } } /** * Extract sub-details recursively */ function extract_sub_details($subDetails, $parentL1, $parentL2, $parentL3, $parentL4, $templateInfo, &$results, $tableName, $segmentName, $typeForm) { foreach ($subDetails as $subItem) { // Tentukan level berdasarkan parent yang terisi $level = 3; if ($parentL4 != '') $level = 5; elseif ($parentL3 != '') $level = 4; elseif ($parentL2 != '') $level = 3; else $level = 2; $result = array( 'FisikTemplateID' => $templateInfo['FisikTemplateID'], 'FisikTemplateCode' => $templateInfo['FisikTemplateCode'], 'FisikTemplateType' => $templateInfo['FisikTemplateType'], 'id_code' => isset($subItem['id_code']) ? $subItem['id_code'] : '', 'label' => isset($subItem['label']) ? $subItem['label'] : '', 'parent_level_1' => $parentL1, 'parent_level_2' => $parentL2, 'parent_level_3' => $parentL3, 'parent_level_4' => $parentL4, 'level' => $level, 'table_name' => isset($subItem['table_name']) ? $subItem['table_name'] : $tableName, 'segment_name' => isset($subItem['segment_name']) ? $subItem['segment_name'] : $segmentName, 'type_form' => isset($subItem['type_form']) ? $subItem['type_form'] : $typeForm ); $results[] = $result; // Cek sub-details lagi (rekursif) if (isset($subItem['details']) && is_array($subItem['details'])) { if ($level == 3) { $this->extract_sub_details( $subItem['details'], $parentL1, $parentL2, $parentL3, isset($subItem['label']) ? $subItem['label'] : '', $templateInfo, $results, $tableName, $segmentName, $typeForm ); } elseif ($level == 4) { $this->extract_sub_details( $subItem['details'], $parentL1, $parentL2, $parentL3, isset($subItem['label']) ? $subItem['label'] : '', $templateInfo, $results, $tableName, $segmentName, $typeForm ); } } } } /** * STEP 4a: Generate fisik template map data (semua template aktif) * ------------------------------------------------------------------ * Endpoint: POST /generatedata/generate_fisik_template_map * Request : No parameters * Response: { message: "...", total_records: 250, total_templates: 9 } * * Proses: * 1. Ambil SEMUA template aktif (FisikTemplateIsActive = 'Y') * 2. Extract semua id_code, label, dan hierarchy dari JSON * 3. TRUNCATE tabel fisik_template_map (hapus semua data lama) * 4. Insert semua data baru secara batch * * Kapan digunakan: * - Setup awal (pertama kali) * - Regenerate semua data mapping * - Sinkronisasi ulang semua template * * Note: Akan hapus SEMUA data lama dan insert ulang semua */ function generate_fisik_template_map() { // Cek apakah tabel sudah ada if (!$this->db->table_exists('fisik_template_map')) { $this->sys_error("Table fisik_template_map does not exist. Please create it first."); exit; } $this->db->trans_begin(); try { // Ambil data dari fisik_template menggunakan helper function $templates = $this->get_active_fisik_templates(); if ($templates === false) { $this->db->trans_rollback(); $this->sys_error_db("select fisik_template", $this->db); exit; } if (count($templates) == 0) { $this->db->trans_rollback(); $this->sys_error("No active templates found"); exit; } $allResults = array(); $totalProcessed = 0; foreach ($templates as $row) { $templateInfo = array( 'FisikTemplateID' => $row['FisikTemplateID'], 'FisikTemplateCode' => $row['FisikTemplateCode'], 'FisikTemplateType' => $row['FisikTemplateType'] ); // Parse JSON $jsonData = json_decode($row['FisikTemplateJSON'], true); if ($jsonData === null) { continue; } $results = array(); $this->extract_data_from_json($jsonData, $templateInfo, $results); $allResults = array_merge($allResults, $results); $totalProcessed += count($results); } // Truncate tabel sebelum insert $this->db->truncate('fisik_template_map'); // Insert data if (count($allResults) > 0) { // Insert batch untuk performa lebih baik $batchSize = 100; $batches = array_chunk($allResults, $batchSize); foreach ($batches as $batch) { $this->db->insert_batch('fisik_template_map', $batch); } } $this->db->trans_commit(); $result = array( "message" => "Fisik template map generated successfully", "total_records" => $totalProcessed, "total_templates" => count($templates) ); $this->sys_ok($result); exit; } catch (Exception $e) { $this->db->trans_rollback(); $this->sys_error("Error: " . $e->getMessage()); exit; } } /** * STEP 4b: Generate fisik template map untuk template tertentu saja * ------------------------------------------------------------------- * Endpoint: POST /generatedata/generate_fisik_template_map_by_code * Request : { "FisikTemplateCode": "RI00" } * Response: { message: "...", template_code: "RI00", total_records: 9 } * * Proses: * 1. Ambil satu template berdasarkan code (harus aktif) * 2. Extract semua id_code, label, dan hierarchy dari JSON * 3. DELETE hanya data template ini saja dari tabel * 4. Insert data baru untuk template ini * * Kapan digunakan: * - Update satu template saja (tidak perlu regenerate semua) * - Ada perubahan di JSON satu template tertentu * - Testing/debugging untuk satu template * * Keuntungan: * - Lebih cepat (hanya proses satu template) * - Tidak affect data template lain * - Ideal untuk maintenance/update parsial * * Note: Hanya hapus & update data template yang dipilih saja */ function generate_fisik_template_map_by_code() { $prm = $this->sys_input; $template_code = isset($prm['FisikTemplateCode']) ? $prm['FisikTemplateCode'] : ''; if ($template_code == '') { $this->sys_error("FisikTemplateCode is required"); exit; } // Cek apakah tabel sudah ada if (!$this->db->table_exists('fisik_template_map')) { $this->sys_error("Table fisik_template_map does not exist. Please create it first."); exit; } $this->db->trans_begin(); try { // Ambil data template berdasarkan code $templates = $this->get_active_fisik_templates(null, $template_code); if ($templates === false) { $this->db->trans_rollback(); $this->sys_error_db("select fisik_template", $this->db); exit; } if (count($templates) == 0) { $this->db->trans_rollback(); $this->sys_error("Template with code '{$template_code}' not found or inactive"); exit; } $allResults = array(); $totalProcessed = 0; foreach ($templates as $row) { $templateInfo = array( 'FisikTemplateID' => $row['FisikTemplateID'], 'FisikTemplateCode' => $row['FisikTemplateCode'], 'FisikTemplateType' => $row['FisikTemplateType'] ); // Parse JSON $jsonData = json_decode($row['FisikTemplateJSON'], true); if ($jsonData === null) { $this->db->trans_rollback(); $this->sys_error("Failed to parse JSON for template {$template_code}"); exit; } $results = array(); $this->extract_data_from_json($jsonData, $templateInfo, $results); $allResults = array_merge($allResults, $results); $totalProcessed += count($results); } // Hapus data lama untuk template ini $this->db->where('FisikTemplateCode', $template_code); $this->db->delete('fisik_template_map'); // Insert data baru if (count($allResults) > 0) { // Insert batch untuk performa lebih baik $batchSize = 100; $batches = array_chunk($allResults, $batchSize); foreach ($batches as $batch) { $this->db->insert_batch('fisik_template_map', $batch); } } $this->db->trans_commit(); $result = array( "message" => "Fisik template map generated successfully for {$template_code}", "template_code" => $template_code, "total_records" => $totalProcessed ); $this->sys_ok($result); exit; } catch (Exception $e) { $this->db->trans_rollback(); $this->sys_error("Error: " . $e->getMessage()); exit; } } /** * STEP 1: List semua fisik template yang aktif * ---------------------------------------------- * Endpoint: POST /generatedata/list_active_fisik_templates * Request : No parameters * Response: { message: "...", total: 9, data: [...] } * * Fungsi: * - Menampilkan list semua template dengan FisikTemplateIsActive = 'Y' * - Tidak termasuk FisikTemplateJSON (terlalu besar) * - Info: ID, Code, Type, Title, TableName * * Kapan digunakan: * - Lihat template apa saja yang aktif * - Get list template code untuk parameter fungsi lain * - Monitoring template yang available */ function list_active_fisik_templates() { $templates = $this->get_active_fisik_templates(); if ($templates === false) { $this->sys_error_db("select fisik_template", $this->db); exit; } // Hapus FisikTemplateJSON dari response (terlalu besar) foreach ($templates as &$template) { unset($template['FisikTemplateJSON']); } $result = array( "message" => "Active templates retrieved successfully", "total" => count($templates), "data" => $templates ); $this->sys_ok($result); exit; } /** * STEP 2: Get detail satu fisik template berdasarkan code * --------------------------------------------------------- * Endpoint: POST /generatedata/get_fisik_template_detail * Request : { "FisikTemplateCode": "RI00" } * Response: { FisikTemplateJSON_Parsed: {...}, ... } * * Fungsi: * - Menampilkan detail lengkap satu template * - Termasuk FisikTemplateJSON yang sudah di-parse * - Untuk melihat struktur JSON sebelum generate mapping * * Kapan digunakan: * - Debug/inspect struktur JSON template * - Validasi JSON sebelum generate * - Melihat detail template tertentu */ function get_fisik_template_detail() { $prm = $this->sys_input; $template_code = isset($prm['FisikTemplateCode']) ? $prm['FisikTemplateCode'] : ''; if ($template_code == '') { $this->sys_error("FisikTemplateCode is required"); exit; } $templates = $this->get_active_fisik_templates(null, $template_code); if ($templates === false) { $this->sys_error_db("select fisik_template", $this->db); exit; } if (count($templates) == 0) { $this->sys_error("Template with code '{$template_code}' not found or inactive"); exit; } $template = $templates[0]; // Parse JSON untuk ditampilkan $template['FisikTemplateJSON_Parsed'] = json_decode($template['FisikTemplateJSON'], true); $result = $template; $this->sys_ok($result); exit; } /** * STEP 5a: Get fisik template map data * ------------------------------------- * Endpoint: POST /generatedata/get_fisik_template_map * Request : { "FisikTemplateCode": "RI00", "level": 2 } (opsional) * Response: Array of mapping data * * Filter opsional: * - FisikTemplateCode : Filter berdasarkan template tertentu * - level : Filter berdasarkan level (1, 2, 3, 4, 5) * * Contoh request: * 1. Semua data : {} * 2. Template RI00 : { "FisikTemplateCode": "RI00" } * 3. Level 2 saja : { "level": 2 } * 4. RI00 level 2 : { "FisikTemplateCode": "RI00", "level": 2 } * * Kapan digunakan: * - Query data mapping untuk ditampilkan * - Get list items untuk satu template * - Filter berdasarkan level hierarchy */ function get_fisik_template_map() { $prm = $this->sys_input; $template_code = isset($prm['FisikTemplateCode']) ? $prm['FisikTemplateCode'] : ''; $level = isset($prm['level']) ? $prm['level'] : ''; $sql = "SELECT * FROM fisik_template_map WHERE 1=1"; $params = array(); if ($template_code != '') { $sql .= " AND FisikTemplateCode = ?"; $params[] = $template_code; } if ($level != '') { $sql .= " AND level = ?"; $params[] = $level; } $sql .= " ORDER BY MapID"; $query = $this->db->query($sql, $params); if(!$query){ $this->sys_error_db("select fisik_template_map", $this->db); exit; } $result = $query->result_array(); $this->sys_ok($result); exit; } /** * STEP 5b: Search fisik template map by id_code or label * -------------------------------------------------------- * Endpoint: POST /generatedata/search_fisik_template_map * Request : { "keyword": "perut" } * Response: Array of matching records * * Fungsi: * - Search berdasarkan id_code atau label (LIKE %keyword%) * - Case insensitive search * - Return semua matching records dengan full info * * Contoh penggunaan: * 1. Cari "perut" : Find semua item dengan id_code/label mengandung "perut" * 2. Cari "perut_14" : Find item dengan id_code perut_14* * 3. Cari "Hernia" : Find item dengan label mengandung "Hernia" * * Kapan digunakan: * - Cari item tertentu berdasarkan keyword * - Lookup id_code untuk mapping * - Cari label untuk matching data * * Note: Keyword wajib diisi */ function search_fisik_template_map() { $prm = $this->sys_input; $keyword = isset($prm['keyword']) ? $prm['keyword'] : ''; if ($keyword == '') { $this->sys_error("Keyword is required"); exit; } $sql = "SELECT * FROM fisik_template_map WHERE id_code LIKE ? OR label LIKE ? ORDER BY FisikTemplateCode, level, MapID"; $query = $this->db->query($sql, ["%{$keyword}%", "%{$keyword}%"]); if(!$query){ $this->sys_error_db("search fisik_template_map", $this->db); exit; } $result = $query->result_array(); $this->sys_ok($result); exit; } function generate_result_mcu_lab(){ $prm = $this->sys_input; $mgm_mcuid = $prm['Mgm_McuID']; $sql = "SELECT * FROM t_orderheader WHERE T_OrderheaderMgm_McuID = ? AND T_OrderHeaderIsActive = 'Y'"; $query = $this->db->query($sql, [$mgm_mcuid]); if(!$query){ $this->sys_error_db("select t_orderheader", $this->db); exit; } $result = $query->result_array(); if(count($result) == 0){ $this->sys_error("No data found"); exit; } foreach ($result as $row) { $this->generate_result_lab($row['T_OrderHeaderID'], $row['T_OrderHeaderLabNumber']); } $this->sys_ok($result); exit; } function generate_result_mcu_nonlab(){ $prm = $this->sys_input; $mgm_mcuid = $prm['Mgm_McuID']; $this->load->library('mcuresult'); $sql = "SELECT So_ResultEntryID, So_ResultEntryT_OrderHeaderID, So_ResultEntryT_OrderDetailID FROM so_resultentry JOIN t_orderheader ON So_ResultEntryT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderIsActive = 'Y' AND T_OrderHeaderMgm_McuID = ? AND So_ResultEntryT_OrderHeaderID = T_OrderHeaderID JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID AND T_OrderDetailIsActive = 'Y' AND So_ResultEntryT_OrderDetailID = T_OrderDetailID AND T_OrderDetailIsActive = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID NOT IN (35,27) WHERE So_ResultEntryIsActive = 'Y' AND So_ResultEntryStatus <> 'NEW' GROUP BY So_ResultEntryT_OrderHeaderID, So_ResultEntryT_OrderDetailID "; $query = $this->db->query($sql, [$mgm_mcuid]); if(!$query){ $this->sys_error_db("select t_orderheader", $this->db); exit; } $result = $query->result_array(); if(count($result) == 0){ $this->sys_error("No data found"); exit; } foreach ($result as $row) { //$this->generate_result_lab($row['T_OrderHeaderID'], $row['T_OrderHeaderLabNumber']); $this->mcuresult->generate_result_nonlab($row['So_ResultEntryID']); } $this->sys_ok($result); exit; } function generate_result_mcu_kenal_warna(){ $prm = $this->sys_input; $mgm_mcuid = $prm['Mgm_McuID']; $this->load->library('mcuresult'); $sql = "SELECT T_OrderHeaderID, T_OrderHeaderLabNumber, T_OrderHeaderMgm_McuID as Mgm_McuID FROM t_orderheader WHERE T_OrderHeaderMgm_McuID = ? AND T_OrderHeaderIsActive = 'Y' "; $query = $this->db->query($sql, [$mgm_mcuid]); if(!$query){ $this->sys_error_db("select t_orderheader", $this->db); exit; } $result = $query->result_array(); if(count($result) == 0){ $this->sys_error("No data found"); exit; } foreach ($result as $row) { //$this->generate_result_lab($row['T_OrderHeaderID'], $row['T_OrderHeaderLabNumber']); $this->mcuresult->generate_kenal_warna($row); } $this->sys_ok($result); exit; } function generate_result_mcu_visus(){ $prm = $this->sys_input; $mgm_mcuid = $prm['Mgm_McuID']; $this->load->library('mcuresult'); $sql = "SELECT T_OrderHeaderID, T_OrderHeaderLabNumber, T_OrderHeaderMgm_McuID as Mgm_McuID FROM t_orderheader WHERE T_OrderHeaderMgm_McuID = ? AND T_OrderHeaderIsActive = 'Y' "; $query = $this->db->query($sql, [$mgm_mcuid]); if(!$query){ $this->sys_error_db("select t_orderheader", $this->db); exit; } $result = $query->result_array(); if(count($result) == 0){ $this->sys_error("No data found"); exit; } foreach ($result as $row) { //$this->generate_result_lab($row['T_OrderHeaderID'], $row['T_OrderHeaderLabNumber']); $this->mcuresult->generate_visus($row); } $this->sys_ok($result); exit; } function generate_result_mcu_status_gizi(){ $prm = $this->sys_input; $mgm_mcuid = $prm['Mgm_McuID']; $this->load->library('mcuresult'); $sql = "SELECT T_OrderHeaderID, T_OrderHeaderLabNumber, T_OrderHeaderMgm_McuID as Mgm_McuID FROM t_orderheader JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID AND T_OrderDetailIsActive = 'Y' AND T_OrderDetailT_TestCode = '40110901' WHERE T_OrderHeaderMgm_McuID = ? AND T_OrderHeaderIsActive = 'Y' GROUP BY T_OrderHeaderID LIMIT 1"; $query = $this->db->query($sql, [$mgm_mcuid]); if(!$query){ $this->sys_error_db("select t_orderheader", $this->db); exit; } $result = $query->result_array(); if(count($result) == 0){ $this->sys_error("No data found"); exit; } foreach ($result as $row) { //$this->generate_result_lab($row['T_OrderHeaderID'], $row['T_OrderHeaderLabNumber']); $this->mcuresult->generate_status_gizi($row); } $this->sys_ok($result); exit; } function generate_result_mcu_bodyfatmonitoring(){ $prm = $this->sys_input; $mgm_mcuid = $prm['Mgm_McuID']; $this->load->library('mcuresult'); $sql = "SELECT T_OrderHeaderID, T_OrderHeaderLabNumber, T_OrderHeaderMgm_McuID as Mgm_McuID FROM t_orderheader JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID AND T_OrderDetailIsActive = 'Y' AND T_OrderDetailT_TestCode = '40110902' WHERE T_OrderHeaderMgm_McuID = ? AND T_OrderHeaderIsActive = 'Y' GROUP BY T_OrderHeaderID LIMIT 1 "; $query = $this->db->query($sql, [$mgm_mcuid]); if(!$query){ $this->sys_error_db("select t_orderheader", $this->db); exit; } $result = $query->result_array(); if(count($result) == 0){ $this->sys_error("No data found"); exit; } foreach ($result as $row) { //$this->generate_result_lab($row['T_OrderHeaderID'], $row['T_OrderHeaderLabNumber']); $this->mcuresult->generate_bodyfatmonitoring($row); } $this->sys_ok($result); exit; } function generate_result_mcu_fisik(){ $prm = $this->sys_input; $mgm_mcuid = $prm['Mgm_McuID']; $this->load->library('mcuresult'); $sql = "SELECT So_ResultEntryID, So_ResultEntryT_OrderHeaderID, So_ResultEntryT_OrderDetailID FROM so_resultentry JOIN t_orderheader ON So_ResultEntryT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderIsActive = 'Y' AND T_OrderHeaderMgm_McuID = ? AND So_ResultEntryT_OrderHeaderID = T_OrderHeaderID JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID AND T_OrderDetailIsActive = 'Y' AND So_ResultEntryT_OrderDetailID = T_OrderDetailID AND T_OrderDetailIsActive = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID WHERE So_ResultEntryIsActive = 'Y' AND So_ResultEntryStatus <> 'NEW' AND So_ResultEntryNonlab_TemplateID = 27 GROUP BY So_ResultEntryT_OrderHeaderID, So_ResultEntryT_OrderDetailID "; $query = $this->db->query($sql, [$mgm_mcuid]); if(!$query){ $this->sys_error_db("select t_orderheader", $this->db); exit; } $result = $query->result_array(); if(count($result) == 0){ $this->sys_error("No data found"); exit; } foreach ($result as $row) { //$this->generate_result_lab($row['T_OrderHeaderID'], $row['T_OrderHeaderLabNumber']); $this->mcuresult->get_data_fisik_resultentry($row['So_ResultEntryID']); } $this->sys_ok($result); exit; } function generate_result_lab($T_OrderHeaderID = 0,$T_OrderHeaderLabNumber = '') { $this->db_log->trans_begin(); $sql = "SELECT T_OrderHeaderMgm_McuID as Mgm_McuID, T_OrderHeaderID, T_OrderHeaderLabNumber, T_OrderDetailID as ReffID, Group_ResultID, Group_ResultName, T_TestCode, T_TestName, IFNULL(T_OrderDetailResult,'') as Result, IFNULL(T_OrderDetailNat_UnitName,'') as UnitName, IFNULL(T_OrderDetailNormalValueNote,'') as refference FROM t_orderdetail JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID AND ( T_OrderHeaderID = ? OR T_OrderHeaderLabNumber = ?) JOIN t_test ON T_OrderDetailT_TestID = T_TestID JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_TestID AND Group_ResultDetailIsactive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultIsActive = 'Y' AND Group_ResultResumeMcu = 'LAB' WHERE T_OrderDetailIsActive = 'Y' ORDER BY T_OrderDetailT_TestSasCode ASC"; $query = $this->db->query($sql, [$T_OrderHeaderID, $T_OrderHeaderLabNumber]); $result = $query->result_array(); if(count($result) == 0){ $results = array("message" => "No data found", "data" => array()); $this->sys_ok($results); exit; } foreach ($result as $row) { $sql = "SELECT * FROM mcu_result_all WHERE Mcu_ResultAllMgm_McuID = ? AND Mcu_ResultAllT_OrderHeaderID = ? AND Mcu_ResultAllT_OrderHeaderLabNumber = ? AND Mcu_ResultAllReffID = ? AND Mcu_ResultAllT_TestCode = ? AND Mcu_ResultAllT_TestName = ?"; $query = $this->db_log->query($sql, [ $row['Mgm_McuID'], $row['T_OrderHeaderID'], $row['T_OrderHeaderLabNumber'], $row['ReffID'], $row['T_TestCode'], $row['T_TestName'] ]); $exist_result = $query->result_array(); if(count($exist_result) > 0){ foreach ($exist_result as $key => $row_exist) { $sql = "DELETE FROM mcu_result_all WHERE Mcu_ResultAllID = ?"; $query = $this->db_log->query($sql, [$row_exist['Mcu_ResultAllID']]); if(!$query){ $this->db_log->trans_rollback(); $this->sys_error_db("delete mcu_result_".$row_exist['Mcu_ResultAllT_TestCode'], $this->db_log); exit; } } } $sql = "INSERT INTO mcu_result_all ( Mcu_ResultAllMgm_McuID, Mcu_ResultAllT_OrderHeaderID, Mcu_ResultAllT_OrderHeaderLabNumber, Mcu_ResultAllReffID, Mcu_ResultAllT_TestCode, Mcu_ResultAllT_TestName, Mcu_ResultAllResult, Mcu_ResultAllUnit, Mcu_ResultAllRefference, Mcu_ResultAllCreated ) VALUES(?,?,?,?,?,?,?,?,?,NOW())"; $query = $this->db_log->query($sql, [ $row['Mgm_McuID'], $row['T_OrderHeaderID'], $row['T_OrderHeaderLabNumber'], $row['ReffID'], $row['T_TestCode'], $row['T_TestName'], $row['Result'], $row['UnitName'], $row['refference'] ]); if(!$query){ $this->db_log->trans_rollback(); $this->sys_error_db("insert mcu_result_".$row['T_TestCode'], $this->db_log); exit; } } $this->db_log->trans_commit(); $results = array("message" => "Data generated successfully", "data" => $result); return $results; } function generate_sqlite_by_mgm_mcuid() { // Get MGM_MCUID from input $prm = $this->sys_input; $mgm_mcuid = isset($prm['Mgm_McuID']) ? $prm['Mgm_McuID'] : 0; if (empty($mgm_mcuid)) { $this->sys_error("Mgm_McuID is required"); exit; } // Get table name from mcu_number $sql = "SELECT * FROM mcu_number WHERE Mcu_NumberMgm_McuID = ? AND Mcu_NumberIsActive = 'Y' LIMIT 1"; $query = $this->db_corporate->query($sql, [$mgm_mcuid]); if ($query->num_rows() == 0) { $this->sys_error("MCU Number not found for Mgm_McuID: " . $mgm_mcuid); exit; } $mcu_data = $query->row_array(); $table_suffix = $mcu_data['Mcu_NumberTableName']; $mcu_number = $mcu_data['Mcu_NumberMgm_McuNumber']; // Define output file path $output_dir = FCPATH; // Root directory $output_file = $output_dir . 'mcu_' . $table_suffix . '.sqlite'; // Remove existing file if exists if (file_exists($output_file)) { unlink($output_file); } try { // Create SQLite database $sqlite = new SQLite3($output_file); $sqlite->exec('PRAGMA foreign_keys = OFF;'); $sqlite->exec('BEGIN TRANSACTION;'); // Table names to export $tables_to_export = [ 'kelainan_details', 'kelainan_summary', 'mcu_result_all' ]; foreach ($tables_to_export as $table_name) { // Check if table exists $check_sql = "SHOW TABLES LIKE ?"; $check_query = $this->db_corporate->query($check_sql, [$table_name]); if ($check_query->num_rows() == 0) { continue; // Skip if table doesn't exist } // Get table structure $structure_sql = "SHOW CREATE TABLE `{$table_name}`"; $structure_query = $this->db_corporate->query($structure_sql); $structure_row = $structure_query->row_array(); $create_table_sql = $structure_row['Create Table']; // Convert MySQL to SQLite syntax $create_table_sql = $this->convert_mysql_to_sqlite($create_table_sql, $table_name); // Create table in SQLite $sqlite->exec($create_table_sql); // Get data from MySQL $data_sql = "SELECT * FROM `{$table_name}`"; $data_query = $this->db_corporate->query($data_sql); $rows = $data_query->result_array(); if (count($rows) > 0) { // Prepare insert statement $columns = array_keys($rows[0]); $placeholders = implode(',', array_fill(0, count($columns), '?')); $insert_sql = "INSERT INTO {$table_name} (" . implode(',', $columns) . ") VALUES ({$placeholders})"; $stmt = $sqlite->prepare($insert_sql); foreach ($rows as $row) { $i = 1; foreach ($row as $value) { $stmt->bindValue($i++, $value); } $stmt->execute(); $stmt->reset(); } $stmt->close(); } } // Also include mcu_number table with current record only // Get mcu_number table structure from MySQL $mcu_structure_sql = "SHOW CREATE TABLE mcu_number"; $mcu_structure_query = $this->db_corporate->query($mcu_structure_sql); $mcu_structure_row = $mcu_structure_query->row_array(); $mcu_create_table_sql = $mcu_structure_row['Create Table']; // Convert MySQL to SQLite syntax $mcu_create_table_sql = $this->convert_mysql_to_sqlite($mcu_create_table_sql, 'mcu_number'); $sqlite->exec($mcu_create_table_sql); // Insert current mcu_number record (only the one matching Mgm_McuID) $columns = array_keys($mcu_data); $placeholders = implode(',', array_fill(0, count($columns), '?')); $mcu_insert_sql = "INSERT INTO mcu_number (" . implode(',', $columns) . ") VALUES ({$placeholders})"; $stmt = $sqlite->prepare($mcu_insert_sql); $i = 1; foreach ($mcu_data as $value) { $stmt->bindValue($i++, $value); } $stmt->execute(); $stmt->close(); $sqlite->exec('COMMIT;'); $sqlite->close(); // Return success with file path $all_tables_exported = array_merge($tables_to_export, ['mcu_number']); $results = [ "message" => "SQLite file generated successfully", "file" => basename($output_file), "path" => $output_file, "table_suffix" => $table_suffix, "mcu_number" => $mcu_number, "mgm_mcuid" => $mgm_mcuid, "tables_exported" => $all_tables_exported, "note" => "Table mcu_number only contains the record for Mgm_McuID: " . $mgm_mcuid ]; $this->sys_ok($results); exit; } catch (Exception $e) { $this->sys_error("Error generating SQLite: " . $e->getMessage()); exit; } } function convert_mysql_to_sqlite($create_sql, $table_name) { // Remove MySQL specific syntax $create_sql = preg_replace('/ENGINE=\w+/', '', $create_sql); $create_sql = preg_replace('/DEFAULT CHARSET=\w+/', '', $create_sql); $create_sql = preg_replace('/AUTO_INCREMENT=\d+/', '', $create_sql); $create_sql = preg_replace('/COLLATE=\w+/', '', $create_sql); // Convert data types $create_sql = preg_replace('/INT\(\d+\)/', 'INTEGER', $create_sql); $create_sql = preg_replace('/TINYINT\(\d+\)/', 'INTEGER', $create_sql); $create_sql = preg_replace('/SMALLINT\(\d+\)/', 'INTEGER', $create_sql); $create_sql = preg_replace('/MEDIUMINT\(\d+\)/', 'INTEGER', $create_sql); $create_sql = preg_replace('/BIGINT\(\d+\)/', 'INTEGER', $create_sql); $create_sql = preg_replace('/VARCHAR\(\d+\)/', 'TEXT', $create_sql); $create_sql = preg_replace('/DATETIME/', 'DATETIME', $create_sql); $create_sql = preg_replace('/TIMESTAMP/', 'DATETIME', $create_sql); $create_sql = preg_replace('/DATE/', 'DATE', $create_sql); $create_sql = preg_replace('/TEXT/', 'TEXT', $create_sql); $create_sql = preg_replace('/LONGTEXT/', 'TEXT', $create_sql); $create_sql = preg_replace('/MEDIUMTEXT/', 'TEXT', $create_sql); // Remove backticks $create_sql = str_replace('`', '', $create_sql); // Handle AUTO_INCREMENT $create_sql = preg_replace('/\s+AUTO_INCREMENT\s*/i', ' AUTOINCREMENT ', $create_sql); // Clean up $create_sql = preg_replace('/,\s*\)/', ')', $create_sql); $create_sql = preg_replace('/\s+/', ' ', $create_sql); return $create_sql; } }