db_oneklinik = $this->load->database("onedev", true); } public function index() { echo "SCREENING TEMPLATE API"; } public function search() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $search = isset($prm['search']) ? trim($prm['search']) : ''; $like = '%' . $search . '%'; $row_per_page = isset($prm['row_per_page']) && intval($prm['row_per_page']) > 0 ? intval($prm['row_per_page']) : 10; $page = isset($prm['page']) && intval($prm['page']) > 0 ? intval($prm['page']) : 1; $offset = ($page - 1) * $row_per_page; $allowed_order_by = array( 'id' => 't.M_ScreeningTemplateID', 'code' => 't.M_ScreeningTemplateCode', 'name' => 't.M_ScreeningTemplateName', 'description' => 't.M_ScreeningTemplateDescription' ); $order_by = 't.M_ScreeningTemplateID'; if (isset($prm['order_by']) && isset($allowed_order_by[$prm['order_by']])) { $order_by = $allowed_order_by[$prm['order_by']]; } $order = isset($prm['order']) && strtolower($prm['order']) === 'desc' ? 'DESC' : 'ASC'; $sql_count = "SELECT COUNT(*) AS total FROM one_klinik.m_screening_template t WHERE t.M_ScreeningTemplateIsActive = 'Y' AND ( t.M_ScreeningTemplateCode LIKE ? OR t.M_ScreeningTemplateName LIKE ? OR IFNULL(t.M_ScreeningTemplateDescription, '') LIKE ? )"; $query_count = $this->db_oneklinik->query($sql_count, array($like, $like, $like)); if (!$query_count) { $this->sys_error_db("m_screening_template count", $this->db_oneklinik); exit; } $total_filter = intval($query_count->row()->total); $total_page = ceil($total_filter / $row_per_page); $sql = "SELECT t.M_ScreeningTemplateID AS id, t.M_ScreeningTemplateCode AS code, t.M_ScreeningTemplateName AS name, t.M_ScreeningTemplateDescription AS description, t.M_ScreeningTemplateIsActive AS is_active, t.M_ScreeningTemplateCreated AS created, t.M_ScreeningTemplateLastUpdated AS last_updated, COUNT(f.M_ScreeningFormID) AS form_count FROM one_klinik.m_screening_template t LEFT JOIN one_klinik.m_screening_form f ON f.M_ScreeningFormM_ScreeningTemplateID = t.M_ScreeningTemplateID AND f.M_ScreeningFormIsActive = 'Y' WHERE t.M_ScreeningTemplateIsActive = 'Y' AND ( t.M_ScreeningTemplateCode LIKE ? OR t.M_ScreeningTemplateName LIKE ? OR IFNULL(t.M_ScreeningTemplateDescription, '') LIKE ? ) GROUP BY t.M_ScreeningTemplateID ORDER BY {$order_by} {$order} LIMIT ? OFFSET ?"; $query = $this->db_oneklinik->query($sql, array($like, $like, $like, $row_per_page, $offset)); if (!$query) { $this->sys_error_db("m_screening_template select", $this->db_oneklinik); exit; } $this->sys_ok(array( "total" => $total_page, "total_filter" => $total_filter, "records" => $query->result_array() )); } catch (Exception $exc) { $this->sys_error($exc->getMessage()); } } public function getdetail() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $id = isset($prm['id']) ? intval($prm['id']) : 0; if (!$id) { $this->sys_error("id is mandatory"); exit; } $query = $this->db_oneklinik->query( "SELECT M_ScreeningTemplateID AS id, M_ScreeningTemplateCode AS code, M_ScreeningTemplateName AS name, M_ScreeningTemplateDescription AS description, M_ScreeningTemplateIsActive AS is_active, M_ScreeningTemplateCreated AS created, M_ScreeningTemplateLastUpdated AS last_updated FROM one_klinik.m_screening_template WHERE M_ScreeningTemplateID = ? AND M_ScreeningTemplateIsActive = 'Y'", array($id) ); if (!$query) { $this->sys_error_db("m_screening_template select detail", $this->db_oneklinik); exit; } $row = $query->row_array(); if (!$row) { $this->sys_ok(array("total" => 0, "records" => null)); exit; } $row['forms'] = $this->get_form_rows($id); $this->sys_ok(array("total" => 1, "records" => $row)); } catch (Exception $exc) { $this->sys_error($exc->getMessage()); } } public function getforms() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $template_id = isset($prm['template_id']) ? intval($prm['template_id']) : (isset($prm['id']) ? intval($prm['id']) : 0); if (!$template_id) { $this->sys_error("template_id is mandatory"); exit; } $rows = $this->get_form_rows($template_id); $this->sys_ok(array("total" => count($rows), "records" => $rows)); } catch (Exception $exc) { $this->sys_error($exc->getMessage()); } } public function add() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $code = isset($prm['code']) ? trim($prm['code']) : ''; $name = isset($prm['name']) ? trim($prm['name']) : ''; $description = isset($prm['description']) ? trim($prm['description']) : null; $userid = $this->sys_user["M_UserID"]; if ($code === '' || $name === '') { $this->sys_error("code and name are mandatory"); exit; } $duplicate = $this->db_oneklinik->query( "SELECT COUNT(*) AS total FROM one_klinik.m_screening_template WHERE M_ScreeningTemplateCode = ? OR (M_ScreeningTemplateIsActive = 'Y' AND M_ScreeningTemplateName = ?)", array($code, $name) ); if (!$duplicate) { $this->sys_error_db("m_screening_template duplicate check", $this->db_oneklinik); exit; } if (intval($duplicate->row()->total) > 0) { $this->sys_ok(array( "total" => -1, "errors" => array(array("field" => "code", "msg" => "Kode atau nama sudah ada")), "records" => 0 )); exit; } $sql = "INSERT INTO one_klinik.m_screening_template ( M_ScreeningTemplateCode, M_ScreeningTemplateName, M_ScreeningTemplateDescription, M_ScreeningTemplateUserID, M_ScreeningTemplateCreated, M_ScreeningTemplateLastUpdated ) VALUES (?, ?, ?, ?, NOW(), NOW())"; $query = $this->db_oneklinik->query($sql, array($code, $name, $description, $userid)); if (!$query) { $this->sys_error_db("m_screening_template insert", $this->db_oneklinik); exit; } $this->sys_ok(array( "total" => 1, "records" => array("xid" => $this->db_oneklinik->insert_id()) )); } catch (Exception $exc) { $this->sys_error($exc->getMessage()); } } public function update() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $id = isset($prm['id']) ? intval($prm['id']) : 0; $code = isset($prm['code']) ? trim($prm['code']) : ''; $name = isset($prm['name']) ? trim($prm['name']) : ''; $description = isset($prm['description']) ? trim($prm['description']) : null; $userid = $this->sys_user["M_UserID"]; if (!$id || $code === '' || $name === '') { $this->sys_error("id, code and name are mandatory"); exit; } $duplicate = $this->db_oneklinik->query( "SELECT COUNT(*) AS total FROM one_klinik.m_screening_template WHERE M_ScreeningTemplateID <> ? AND (M_ScreeningTemplateCode = ? OR (M_ScreeningTemplateIsActive = 'Y' AND M_ScreeningTemplateName = ?))", array($id, $code, $name) ); if (!$duplicate) { $this->sys_error_db("m_screening_template duplicate check", $this->db_oneklinik); exit; } if (intval($duplicate->row()->total) > 0) { $this->sys_ok(array( "total" => -1, "errors" => array(array("field" => "code", "msg" => "Kode atau nama sudah ada")), "records" => 0 )); exit; } $sql = "UPDATE one_klinik.m_screening_template SET M_ScreeningTemplateCode = ?, M_ScreeningTemplateName = ?, M_ScreeningTemplateDescription = ?, M_ScreeningTemplateUserID = ?, M_ScreeningTemplateLastUpdated = NOW() WHERE M_ScreeningTemplateID = ? AND M_ScreeningTemplateIsActive = 'Y'"; $query = $this->db_oneklinik->query($sql, array($code, $name, $description, $userid, $id)); if (!$query) { $this->sys_error_db("m_screening_template update", $this->db_oneklinik); exit; } $this->sys_ok(array("total" => 1, "records" => array("xid" => $id))); } catch (Exception $exc) { $this->sys_error($exc->getMessage()); } } public function delete() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $id = isset($prm['id']) ? intval($prm['id']) : 0; if (!$id) { $this->sys_error("id is mandatory"); exit; } $userid = $this->sys_user["M_UserID"]; $this->db_oneklinik->trans_begin(); $query = $this->db_oneklinik->query( "UPDATE one_klinik.m_screening_form SET M_ScreeningFormIsActive = 'N', M_ScreeningFormUserID = ?, M_ScreeningFormLastUpdated = NOW() WHERE M_ScreeningFormM_ScreeningTemplateID = ?", array($userid, $id) ); if (!$query) { $this->db_oneklinik->trans_rollback(); $this->sys_error_db("m_screening_form delete by template", $this->db_oneklinik); exit; } $query = $this->db_oneklinik->query( "UPDATE one_klinik.m_screening_template SET M_ScreeningTemplateIsActive = 'N', M_ScreeningTemplateUserID = ?, M_ScreeningTemplateLastUpdated = NOW() WHERE M_ScreeningTemplateID = ?", array($userid, $id) ); if (!$query) { $this->db_oneklinik->trans_rollback(); $this->sys_error_db("m_screening_template delete", $this->db_oneklinik); exit; } $this->db_oneklinik->trans_complete(); $this->sys_ok(array("total" => 1, "records" => array("xid" => $id))); } catch (Exception $exc) { $this->sys_error($exc->getMessage()); } } public function addform() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $template_id = isset($prm['template_id']) ? intval($prm['template_id']) : 0; $question = isset($prm['question']) ? trim($prm['question']) : ''; $answer_type = isset($prm['answer_type']) ? trim($prm['answer_type']) : 'single'; $options = isset($prm['options']) ? $this->normalize_options($prm['options'], $answer_type) : null; $sort_order = isset($prm['sort_order']) ? intval($prm['sort_order']) : 0; $is_required = isset($prm['is_required']) && $prm['is_required'] === 'N' ? 'N' : 'Y'; $userid = $this->sys_user["M_UserID"]; if (!$template_id || $question === '') { $this->sys_error("template_id and question are mandatory"); exit; } if (!$this->is_valid_answer_type($answer_type)) { $this->sys_error("answer_type must be single, multi, or text"); exit; } $sql = "INSERT INTO one_klinik.m_screening_form ( M_ScreeningFormM_ScreeningTemplateID, M_ScreeningFormQuestion, M_ScreeningFormAnswerType, M_ScreeningFormOptions, M_ScreeningFormSortOrder, M_ScreeningFormIsRequired, M_ScreeningFormUserID, M_ScreeningFormCreated, M_ScreeningFormLastUpdated ) VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), NOW())"; $query = $this->db_oneklinik->query($sql, array( $template_id, $question, $answer_type, $options, $sort_order, $is_required, $userid )); if (!$query) { $this->sys_error_db("m_screening_form insert", $this->db_oneklinik); exit; } $this->sys_ok(array( "total" => 1, "records" => array("xid" => $this->db_oneklinik->insert_id()) )); } catch (Exception $exc) { $this->sys_error($exc->getMessage()); } } public function updateform() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $id = isset($prm['id']) ? intval($prm['id']) : 0; $template_id = isset($prm['template_id']) ? intval($prm['template_id']) : 0; $question = isset($prm['question']) ? trim($prm['question']) : ''; $answer_type = isset($prm['answer_type']) ? trim($prm['answer_type']) : 'single'; $options = isset($prm['options']) ? $this->normalize_options($prm['options'], $answer_type) : null; $sort_order = isset($prm['sort_order']) ? intval($prm['sort_order']) : 0; $is_required = isset($prm['is_required']) && $prm['is_required'] === 'N' ? 'N' : 'Y'; $userid = $this->sys_user["M_UserID"]; if (!$id || !$template_id || $question === '') { $this->sys_error("id, template_id and question are mandatory"); exit; } if (!$this->is_valid_answer_type($answer_type)) { $this->sys_error("answer_type must be single, multi, or text"); exit; } $sql = "UPDATE one_klinik.m_screening_form SET M_ScreeningFormM_ScreeningTemplateID = ?, M_ScreeningFormQuestion = ?, M_ScreeningFormAnswerType = ?, M_ScreeningFormOptions = ?, M_ScreeningFormSortOrder = ?, M_ScreeningFormIsRequired = ?, M_ScreeningFormUserID = ?, M_ScreeningFormLastUpdated = NOW() WHERE M_ScreeningFormID = ? AND M_ScreeningFormIsActive = 'Y'"; $query = $this->db_oneklinik->query($sql, array( $template_id, $question, $answer_type, $options, $sort_order, $is_required, $userid, $id )); if (!$query) { $this->sys_error_db("m_screening_form update", $this->db_oneklinik); exit; } $this->sys_ok(array("total" => 1, "records" => array("xid" => $id))); } catch (Exception $exc) { $this->sys_error($exc->getMessage()); } } public function deleteform() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $id = isset($prm['id']) ? intval($prm['id']) : 0; if (!$id) { $this->sys_error("id is mandatory"); exit; } $userid = $this->sys_user["M_UserID"]; $sql = "UPDATE one_klinik.m_screening_form SET M_ScreeningFormIsActive = 'N', M_ScreeningFormUserID = ?, M_ScreeningFormLastUpdated = NOW() WHERE M_ScreeningFormID = ?"; $query = $this->db_oneklinik->query($sql, array($userid, $id)); if (!$query) { $this->sys_error_db("m_screening_form delete", $this->db_oneklinik); exit; } $this->sys_ok(array("total" => 1, "records" => array("xid" => $id))); } catch (Exception $exc) { $this->sys_error($exc->getMessage()); } } private function get_form_rows($template_id) { $query = $this->db_oneklinik->query( "SELECT M_ScreeningFormID AS id, M_ScreeningFormM_ScreeningTemplateID AS template_id, M_ScreeningFormQuestion AS question, M_ScreeningFormAnswerType AS answer_type, M_ScreeningFormOptions AS options, M_ScreeningFormSortOrder AS sort_order, M_ScreeningFormIsRequired AS is_required, M_ScreeningFormIsActive AS is_active, M_ScreeningFormCreated AS created, M_ScreeningFormLastUpdated AS last_updated FROM one_klinik.m_screening_form WHERE M_ScreeningFormM_ScreeningTemplateID = ? AND M_ScreeningFormIsActive = 'Y' ORDER BY M_ScreeningFormSortOrder ASC, M_ScreeningFormID ASC", array($template_id) ); if (!$query) { $this->sys_error_db("m_screening_form select", $this->db_oneklinik); exit; } $rows = $query->result_array(); foreach ($rows as $k => $row) { $rows[$k]['options_json'] = $row['options'] ? json_decode($row['options'], true) : null; } return $rows; } private function is_valid_answer_type($answer_type) { return in_array($answer_type, array('single', 'multi', 'text')); } private function normalize_options($options, $answer_type) { if ($answer_type === 'text') { return null; } if ($options === null) { return null; } if (is_array($options)) { return json_encode($options); } $options = trim($options); return $options === '' ? null : $options; } }