Update summarydashboard and file url sql
This commit is contained in:
577
application/controllers/summarydashboard/Sqlgenerator.php
Normal file
577
application/controllers/summarydashboard/Sqlgenerator.php
Normal file
@@ -0,0 +1,577 @@
|
||||
<?php
|
||||
class Sqlgenerator extends MY_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
|
||||
parent::__construct();
|
||||
$this->db_onedev = $this->load->database("onedev", true);
|
||||
$this->db_corporate = $this->load->database("cpone_corporate", true);
|
||||
$this->db_log = $this->load->database("log", true);
|
||||
}
|
||||
|
||||
// private $passphrase = 'my-key-123';
|
||||
private $passphrase = null;
|
||||
|
||||
private $MAGIC = "SQDUMP1\0";
|
||||
private $ALG = "AES256GCMHKDFv1";
|
||||
private $INFO = "generic_sql_dump/sql";
|
||||
|
||||
|
||||
public function list_mcu_corporate()
|
||||
{
|
||||
// Ambil input POST
|
||||
$db_name = $this->sys_input['db_name'] ?? '';
|
||||
|
||||
// Validasi
|
||||
if ($db_name == '') {
|
||||
echo json_encode([
|
||||
"status" => false,
|
||||
"error" => "db_name is required"
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
// Tentukan koneksi database
|
||||
switch ($db_name) {
|
||||
case 'cpone_corporate':
|
||||
$db = $this->db_corporate;
|
||||
break;
|
||||
|
||||
case 'onedev':
|
||||
$db = $this->db_onedev;
|
||||
break;
|
||||
|
||||
case 'log':
|
||||
$db = $this->db_log;
|
||||
break;
|
||||
|
||||
default:
|
||||
echo json_encode([
|
||||
"status" => false,
|
||||
"error" => "Invalid db_name: $db_name"
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
// Eksekusi Query
|
||||
$query = $db->select('Mcu_NumberID, Mcu_NumberMgm_McuID ,Mcu_NumberCorporateName, Mcu_NumberStartDate, Mcu_NumberEndDate')
|
||||
->from('mcu_number')
|
||||
->order_by('Mcu_NumberID', 'DESC')
|
||||
->get();
|
||||
|
||||
// Cek error DB
|
||||
$dbError = $db->error();
|
||||
if ($dbError['code'] !== 0) {
|
||||
echo json_encode([
|
||||
"status" => false,
|
||||
"error_code" => $dbError['code'],
|
||||
"error_message" => $dbError['message']
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
// Response OK
|
||||
echo json_encode([
|
||||
"status" => true,
|
||||
"data" => $query->result()
|
||||
]);
|
||||
}
|
||||
|
||||
public function get_count_kelainan()
|
||||
{
|
||||
$prm = $this->sys_input;
|
||||
$mgm_mcuid = $prm['Mgm_McuID'] ?? null;
|
||||
|
||||
if (!$mgm_mcuid) {
|
||||
$this->sys_error("Mgm_McuID required");
|
||||
exit;
|
||||
}
|
||||
|
||||
// Query untuk mengambil semua kelainan yang mungkin DAN menandai yang sudah dipilih
|
||||
$sql = "
|
||||
SELECT
|
||||
all_kelainan.Mcu_KelainanID,
|
||||
all_kelainan.Mcu_KelainanName,
|
||||
all_kelainan.total_patient,
|
||||
CASE
|
||||
WHEN ks.Mcu_KelainanID IS NOT NULL THEN 1
|
||||
ELSE 0
|
||||
END AS is_selected
|
||||
FROM (
|
||||
-- Subquery untuk menghitung total pasien per kelainan
|
||||
SELECT
|
||||
kd.Mcu_KelainanID,
|
||||
kd.Mcu_KelainanName,
|
||||
COUNT(DISTINCT oh.T_OrderHeaderM_PatientID) AS total_patient
|
||||
FROM cpone_corporate.kelainan_details kd
|
||||
JOIN cpone.t_orderheader oh
|
||||
ON kd.T_OrderHeaderID = oh.T_OrderHeaderID
|
||||
WHERE oh.T_OrderHeaderMgm_McuID = ?
|
||||
AND oh.T_OrderHeaderIsActive = 'Y'
|
||||
GROUP BY kd.Mcu_KelainanID, kd.Mcu_KelainanName
|
||||
) AS all_kelainan
|
||||
LEFT JOIN cpone_corporate.kelainan_summary ks
|
||||
ON all_kelainan.Mcu_KelainanID = ks.Mcu_KelainanID
|
||||
AND ks.Mcu_KelainanMgm_McuID = ?
|
||||
ORDER BY all_kelainan.total_patient DESC
|
||||
";
|
||||
|
||||
// Parameter untuk query (digunakan dua kali)
|
||||
$params = [$mgm_mcuid, $mgm_mcuid];
|
||||
$query = $this->db->query($sql, $params);
|
||||
|
||||
if (!$query) {
|
||||
$this->sys_error_db("get count kelainan", $this->db);
|
||||
exit;
|
||||
}
|
||||
|
||||
$result = $query->result_array();
|
||||
|
||||
$this->sys_ok([
|
||||
"mgm_mcuid" => $mgm_mcuid,
|
||||
"data" => $result
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
function save_kelainan_selection()
|
||||
{
|
||||
$prm = $this->sys_input;
|
||||
|
||||
$mgm_mcu_id = isset($prm['mgm_mcu_id']) ? intval($prm['mgm_mcu_id']) : 0;
|
||||
$selected_kelainan = isset($prm['selected_kelainan']) ? $prm['selected_kelainan'] : [];
|
||||
|
||||
if ($mgm_mcu_id <= 0) {
|
||||
$this->sys_error("mgm_mcu_id tidak valid");
|
||||
exit;
|
||||
}
|
||||
|
||||
// Validasi frontend sudah cukup ketat, namun validasi backend tetap penting sebagai pengaman.
|
||||
// Logika validasi di sini memastikan jumlah yang dipilih tidak kurang dari yang seharusnya.
|
||||
$sql_total = "
|
||||
SELECT COUNT(DISTINCT kd.Mcu_KelainanID) AS total_available
|
||||
FROM cpone_corporate.kelainan_details kd
|
||||
JOIN cpone.t_orderheader oh ON kd.T_OrderHeaderID = oh.T_OrderHeaderID
|
||||
WHERE oh.T_OrderHeaderMgm_McuID = ? AND oh.T_OrderHeaderIsActive = 'Y'
|
||||
";
|
||||
$query_total = $this->db->query($sql_total, [$mgm_mcu_id]);
|
||||
$total_available = $query_total->row()->total_available;
|
||||
|
||||
$total_selected = count($selected_kelainan);
|
||||
|
||||
if ($total_available >= 10) {
|
||||
if ($total_selected != 10) {
|
||||
$this->sys_error("Harap pilih tepat 10 kelainan.");
|
||||
exit;
|
||||
}
|
||||
} else {
|
||||
if ($total_selected != $total_available) {
|
||||
$this->sys_error("Harap pilih semua {$total_available} kelainan yang tersedia.");
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Wajib gunakan DB corporate karena tabel kelainan_summary ada di cpone_corporate
|
||||
$db = $this->db_corporate;
|
||||
|
||||
// Mulai transaksi
|
||||
$db->trans_begin();
|
||||
|
||||
// Hapus data sebelumnya untuk MCU ini
|
||||
$sql_delete = "DELETE FROM kelainan_summary WHERE Mcu_KelainanMgm_McuID = ?";
|
||||
$db->query($sql_delete, [$mgm_mcu_id]);
|
||||
|
||||
// Query insert
|
||||
$sql_insert = "
|
||||
INSERT INTO kelainan_summary
|
||||
(Mcu_KelainanID, Mcu_KelainanMgm_McuID, Mcu_KelainanName)
|
||||
VALUES (?, ?, ?)
|
||||
";
|
||||
|
||||
foreach ($selected_kelainan as $item) {
|
||||
|
||||
if (!isset($item["id"]) || !isset($item["name"])) {
|
||||
$db->trans_rollback();
|
||||
$this->sys_error("Format data kelainan tidak valid");
|
||||
exit;
|
||||
}
|
||||
|
||||
$db->query($sql_insert, [
|
||||
$item["id"],
|
||||
$mgm_mcu_id,
|
||||
$item["name"]
|
||||
]);
|
||||
}
|
||||
|
||||
if ($db->trans_status() === FALSE) {
|
||||
$err = $db->error();
|
||||
$db->trans_rollback();
|
||||
$this->sys_error("Gagal menyimpan data. DB Error: " . $err['message']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$db->trans_commit();
|
||||
|
||||
$this->sys_ok([
|
||||
"message" => "Kelainan berhasil disimpan",
|
||||
"total_saved" => count($selected_kelainan),
|
||||
"saved_data" => $selected_kelainan
|
||||
]);
|
||||
}
|
||||
|
||||
public function get_kelainan_selected()
|
||||
{
|
||||
$prm = $this->sys_input;
|
||||
|
||||
$mgm_mcu_id = isset($prm['mgm_mcu_id']) ? intval($prm['mgm_mcu_id']) : 0;
|
||||
|
||||
if ($mgm_mcu_id <= 0) {
|
||||
$this->sys_error("mgm_mcu_id tidak valid");
|
||||
return;
|
||||
}
|
||||
|
||||
// Ambil kelainan yang sudah dipilih user sebelumnya
|
||||
$sql = "
|
||||
SELECT
|
||||
Mcu_KelainanID AS id,
|
||||
Mcu_KelainanName AS name
|
||||
FROM kelainan_summary
|
||||
WHERE Mcu_KelainanMgm_McuID = ?
|
||||
ORDER BY Mcu_KelainanID
|
||||
";
|
||||
|
||||
$query = $this->db_corporate->query($sql, [$mgm_mcu_id]);
|
||||
|
||||
if (!$query) {
|
||||
$this->sys_error_db("get kelainan selected", $this->db_corporate);
|
||||
return;
|
||||
}
|
||||
|
||||
$this->sys_ok([
|
||||
"mgm_mcu_id" => $mgm_mcu_id,
|
||||
"selected" => $query->result_array()
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
private function generate_sql_dump($db_name)
|
||||
{
|
||||
// Pilih koneksi
|
||||
switch ($db_name) {
|
||||
case 'onedev': $db = $this->db_onedev; break;
|
||||
case 'cpone_corporate': $db = $this->db_corporate; break;
|
||||
case 'log': $db = $this->db_log; break;
|
||||
default:
|
||||
throw new Exception("Invalid db_name: {$db_name}");
|
||||
}
|
||||
|
||||
$sql_dump = "";
|
||||
$tables = $db->query("SHOW TABLES")->result_array();
|
||||
$table_key = "Tables_in_" . $db_name;
|
||||
|
||||
foreach ($tables as $tbl) {
|
||||
$table_name = $tbl[$table_key];
|
||||
|
||||
// Struktur tabel
|
||||
$create_row = $db->query("SHOW CREATE TABLE `{$table_name}`")->row_array();
|
||||
$sql_dump .= $create_row['Create Table'] . ";\n\n";
|
||||
|
||||
// Data tabel
|
||||
$rows = $db->query("SELECT * FROM `{$table_name}`")->result_array();
|
||||
foreach ($rows as $row) {
|
||||
$columns = array_keys($row);
|
||||
$values = array_map(function ($val) use ($db) {
|
||||
return is_null($val) ? "NULL" : "'" . $db->escape_str($val) . "'";
|
||||
}, array_values($row));
|
||||
|
||||
$sql_dump .= "INSERT INTO `{$table_name}` (`" . implode('`,`', $columns) .
|
||||
"`) VALUES(" . implode(",", $values) . ");\n";
|
||||
}
|
||||
|
||||
$sql_dump .= "\n";
|
||||
}
|
||||
|
||||
return $sql_dump . "COMMIT;\n";
|
||||
}
|
||||
|
||||
public function encrypt_and_download(string $sql, string $filename = "dump.dat")
|
||||
{
|
||||
// --- generate material ---
|
||||
$salt = random_bytes(16);
|
||||
$nonce = random_bytes(12);
|
||||
$key = hash_hkdf('sha256', $this->passphrase, 32, $this->INFO, $salt);
|
||||
|
||||
$tag = null;
|
||||
$ciphertext = openssl_encrypt(
|
||||
$sql,
|
||||
'aes-256-gcm',
|
||||
$key,
|
||||
OPENSSL_RAW_DATA,
|
||||
$nonce,
|
||||
$tag
|
||||
);
|
||||
|
||||
if ($ciphertext === false) {
|
||||
show_error('Encryption failed', 500);
|
||||
return;
|
||||
}
|
||||
|
||||
// --- format blob seperti modul Dl_sqlite ---
|
||||
$blob =
|
||||
$this->MAGIC .
|
||||
chr(strlen($this->ALG)) . $this->ALG .
|
||||
chr(strlen($salt)) . $salt .
|
||||
chr(strlen($nonce)) . $nonce .
|
||||
chr(strlen($tag)) . $tag .
|
||||
$ciphertext;
|
||||
|
||||
// --- stream download .dat ---
|
||||
header('Content-Type: application/octet-stream');
|
||||
header('Content-Disposition: attachment; filename="' . $filename . '"');
|
||||
header('Content-Length: ' . strlen($blob));
|
||||
header('Cache-Control: no-cache, no-store, must-revalidate');
|
||||
header('Pragma: no-cache');
|
||||
header('Expires: 0');
|
||||
|
||||
echo $blob;
|
||||
exit;
|
||||
}
|
||||
|
||||
public function download()
|
||||
{
|
||||
// --- Ambil parameter dari GET ---
|
||||
$db_name = $this->input->get('db_name');
|
||||
$mcu_id = intval($this->input->get('Mgm_McuID'));
|
||||
|
||||
if (!$db_name) {
|
||||
show_error("db_name is required", 400);
|
||||
return;
|
||||
}
|
||||
|
||||
if ($mcu_id <= 0) {
|
||||
show_error("Mgm_McuID is required", 400);
|
||||
return;
|
||||
}
|
||||
|
||||
// --- Ambil passphrase dari DB corporate ---
|
||||
try {
|
||||
$this->passphrase = $this->get_passphrase_from_mcu($mcu_id);
|
||||
} catch (Exception $e) {
|
||||
show_error($e->getMessage(), 500);
|
||||
return;
|
||||
}
|
||||
|
||||
// --- Generate SQL dump ---
|
||||
$sql = $this->generate_sql_dump($db_name);
|
||||
|
||||
// --- Encrypt dan kirim file download ---
|
||||
$this->encrypt_and_download(
|
||||
$sql,
|
||||
"dump_{$db_name}_{$mcu_id}.dat"
|
||||
);
|
||||
}
|
||||
|
||||
function show_key(): void
|
||||
{
|
||||
$this->sys_ok([
|
||||
"passphrase" => $this->passphrase,
|
||||
"info" => $this->INFO,
|
||||
"algorithm" => $this->ALG,
|
||||
"note" => "The final key is derived using HKDF-SHA256 with the passphrase, info, and a random salt generated for each download."
|
||||
]);
|
||||
}
|
||||
|
||||
function truncate_corporate_tables()
|
||||
{
|
||||
// Untuk keamanan, endpoint ini memerlukan parameter konfirmasi.
|
||||
$prm = $this->sys_input;
|
||||
if (!isset($prm['confirm_truncate']) || $prm['confirm_truncate'] !== true) {
|
||||
$this->sys_error("Operasi TRUNCATE memerlukan konfirmasi. Kirim { \"confirm_truncate\": true } untuk melanjutkan.");
|
||||
return;
|
||||
}
|
||||
|
||||
$tables_to_truncate = [
|
||||
'kelainan_details',
|
||||
'kelainan_summary',
|
||||
'mcu_result_all',
|
||||
'mcu_number'
|
||||
];
|
||||
|
||||
$truncated_tables = [];
|
||||
$errors = [];
|
||||
|
||||
foreach ($tables_to_truncate as $table) {
|
||||
if ($this->db_corporate->table_exists($table)) {
|
||||
if ($this->db_corporate->truncate($table)) {
|
||||
$truncated_tables[] = $table;
|
||||
} else {
|
||||
$errors[] = "Gagal melakukan TRUNCATE pada tabel: {$table}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($errors)) {
|
||||
$this->sys_error("Terjadi kesalahan saat TRUNCATE tabel.", $errors);
|
||||
return;
|
||||
}
|
||||
|
||||
$this->sys_ok([
|
||||
"message" => "Semua tabel yang relevan berhasil di-TRUNCATE.",
|
||||
"truncated_tables" => $truncated_tables
|
||||
]);
|
||||
}
|
||||
|
||||
private function generateRandomCode($length = 6)
|
||||
{
|
||||
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
||||
$code = '';
|
||||
|
||||
for ($i = 0; $i < $length; $i++) {
|
||||
$code .= $chars[random_int(0, strlen($chars) - 1)];
|
||||
}
|
||||
|
||||
return $code;
|
||||
}
|
||||
|
||||
public function create_encrypt_key()
|
||||
{
|
||||
// --- Ambil input JSON ---
|
||||
$prm = json_decode($this->input->raw_input_stream, true);
|
||||
$mcu_id = intval($prm['Mgm_McuID'] ?? 0);
|
||||
|
||||
if ($mcu_id <= 0) {
|
||||
$this->sys_error("Mgm_McuID wajib diisi");
|
||||
return;
|
||||
}
|
||||
|
||||
// Jika tidak ada session user, gunakan default 0
|
||||
$user_id = 0;
|
||||
|
||||
// --- 1. Nonaktifkan key lama ---
|
||||
$this->db
|
||||
->where('Mgm_McuEncryptMgm_McuID', $mcu_id)
|
||||
->update('mgm_mcuencrypt', [
|
||||
'Mgm_McuEncryptIsActive' => 'N'
|
||||
]);
|
||||
|
||||
// Reset builder biar query berikutnya bersih
|
||||
$this->db->reset_query();
|
||||
|
||||
// --- 2. Generate kode unik ---
|
||||
do {
|
||||
$code = $this->generateRandomCode(6);
|
||||
|
||||
$query = $this->db
|
||||
->select('Mgm_McuEncryptID')
|
||||
->where('Mgm_McuEncryptCode', $code)
|
||||
->get('mgm_mcuencrypt');
|
||||
|
||||
if (!$query) {
|
||||
$err = $this->db->error();
|
||||
$this->sys_error("DB Error: " . $err['message']);
|
||||
return;
|
||||
}
|
||||
|
||||
$exists = $query->num_rows();
|
||||
} while ($exists > 0);
|
||||
|
||||
// --- 3. Insert key baru ---
|
||||
$insert = [
|
||||
'Mgm_McuEncryptMgm_McuID' => $mcu_id,
|
||||
'Mgm_McuEncryptCode' => $code,
|
||||
'Mgm_McuEncryptIsActive' => 'Y',
|
||||
'Mgm_McuEncryptCreated' => date('Y-m-d H:i:s'),
|
||||
'Mgm_McuEncryptUserID' => $user_id // FIX: tidak pakai session
|
||||
];
|
||||
|
||||
$this->db->insert('mgm_mcuencrypt', $insert);
|
||||
|
||||
if ($this->db->affected_rows() <= 0) {
|
||||
$err = $this->db->error();
|
||||
$this->sys_error("Gagal insert key baru: " . $err['message']);
|
||||
return;
|
||||
}
|
||||
|
||||
// --- 4. Return response ---
|
||||
$this->sys_ok([
|
||||
"message" => "Key baru berhasil dibuat",
|
||||
"Mgm_McuID" => $mcu_id,
|
||||
"new_key" => $code
|
||||
]);
|
||||
}
|
||||
|
||||
public function get_active_encrypt_key()
|
||||
{
|
||||
// --- Ambil input JSON ---
|
||||
$prm = json_decode($this->input->raw_input_stream, true);
|
||||
$mcu_id = intval($prm['Mgm_McuID'] ?? 0);
|
||||
|
||||
if ($mcu_id <= 0) {
|
||||
$this->sys_error("Mgm_McuID wajib diisi");
|
||||
return;
|
||||
}
|
||||
|
||||
// --- Query untuk mendapatkan key aktif ---
|
||||
$query = $this->db
|
||||
->select('Mgm_McuEncryptCode')
|
||||
->from('mgm_mcuencrypt')
|
||||
->where('Mgm_McuEncryptMgm_McuID', $mcu_id)
|
||||
->where('Mgm_McuEncryptIsActive', 'Y')
|
||||
->order_by('Mgm_McuEncryptID', 'DESC')
|
||||
->limit(1)
|
||||
->get();
|
||||
|
||||
if (!$query) {
|
||||
$err = $this->db->error();
|
||||
$this->sys_error("DB Error: " . $err['message']);
|
||||
return;
|
||||
}
|
||||
|
||||
$result = $query->row_array();
|
||||
|
||||
if (!$result) {
|
||||
$this->sys_error("Tidak ada key enkripsi aktif yang ditemukan untuk MCU ID: " . $mcu_id);
|
||||
return;
|
||||
}
|
||||
|
||||
// --- Return response ---
|
||||
$this->sys_ok([
|
||||
"message" => "Key aktif berhasil ditemukan",
|
||||
"Mgm_McuID" => $mcu_id,
|
||||
"active_key" => $result['Mgm_McuEncryptCode']
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
private function get_passphrase_from_mcu($mcu_id)
|
||||
{
|
||||
$query = $this->db
|
||||
->select('Mgm_McuEncryptCode')
|
||||
->from('mgm_mcuencrypt')
|
||||
->where('Mgm_McuEncryptMgm_McuID', $mcu_id)
|
||||
->where('Mgm_McuEncryptIsActive', 'Y')
|
||||
->order_by('Mgm_McuEncryptID', 'DESC')
|
||||
->limit(1)
|
||||
->get();
|
||||
|
||||
if (!$query) {
|
||||
$err = $this->db->error();
|
||||
throw new Exception("DB error: " . $err['message']);
|
||||
}
|
||||
|
||||
$row = $query->row_array();
|
||||
if (!$row) {
|
||||
throw new Exception("Active encryption key not found for Mgm_McuID: {$mcu_id}");
|
||||
}
|
||||
|
||||
return $row['Mgm_McuEncryptCode'];
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
115
application/controllers/summarydashboard/sql_requests.http
Normal file
115
application/controllers/summarydashboard/sql_requests.http
Normal file
@@ -0,0 +1,115 @@
|
||||
@baseUrl = https://devcpone.aplikasi.web.id/one-api/summarymcu
|
||||
@contentType = application/json
|
||||
|
||||
### ============================================================
|
||||
### LIST CORPORATE
|
||||
### ============================================================
|
||||
|
||||
POST {{baseUrl}}/sqlgenerator/list_mcu_corporate
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"db_name": "cpone_corporate"
|
||||
}
|
||||
|
||||
|
||||
### ============================================================
|
||||
### LIST PASIEN
|
||||
### ============================================================
|
||||
|
||||
### List Pasien MCU by Kelainan
|
||||
# Mengelompokkan pasien berdasarkan kelainan dari tabel kelainan_details
|
||||
# dan menghitung total pasien untuk setiap kelainan.
|
||||
### LIST PASIEN MCU
|
||||
POST {{baseUrl}}/sqlgenerator/list_pasien_mcu
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
###
|
||||
POST {{baseUrl}}/sqlgenerator/get_count_kelainan
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"Mgm_McuID": 151
|
||||
}
|
||||
|
||||
|
||||
|
||||
###
|
||||
POST {{baseUrl}}/sqlgenerator/total_pasien_mcu
|
||||
Content-Type: application/json
|
||||
|
||||
{}
|
||||
|
||||
###
|
||||
{{baseUrl}}/sqlgenerator/save_kelainan_selection
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"mgm_mcu_id": 151,
|
||||
"selected_kelainan": [
|
||||
{ "id": 80, "name": "Peningkatan profil lemak" },
|
||||
{ "id": 133, "name": "Peningkatan fungsi hati" },
|
||||
{ "id": 33, "name": "Karang Gigi" },
|
||||
{ "id": 214, "name": "Miopia O" },
|
||||
{ "id": 180, "name": "Presbiopia ODS" },
|
||||
{ "id": 60, "name": "Leukositosis" },
|
||||
{ "id": 4, "name": "Obesitas tipe 2" },
|
||||
{ "id": 2, "name": "Overweight" },
|
||||
{ "id": 134, "name": "Gangguan fungsi hati" },
|
||||
{ "id": 227, "name": "Hipertensi stage 1" }
|
||||
]
|
||||
}
|
||||
|
||||
### ============================================================
|
||||
### DATABASE DUMP
|
||||
### ============================================================
|
||||
|
||||
### ============================================================
|
||||
### DATABASE TRUNCATE
|
||||
### ============================================================
|
||||
|
||||
### Truncate tabel-tabel corporate
|
||||
POST {{baseUrl}}/sqlgenerator/truncate_corporate_tables
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"confirm_truncate": true
|
||||
}
|
||||
|
||||
### Enkripsi dan unduh database sebagai file .dat
|
||||
GET {{baseUrl}}/sqlgenerator/download
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"db_name": "cpone_corporate",
|
||||
"Mgm_McuID": 151
|
||||
}
|
||||
|
||||
##
|
||||
### Tampilkan komponen kunci enkripsi
|
||||
POST {{baseUrl}}/sqlgenerator/show_key
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"Mgm_McuID": 151
|
||||
}
|
||||
|
||||
####
|
||||
POST {{baseUrl}}/sqlgenerator/create_encrypt_key
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"Mgm_McuID": 151
|
||||
}
|
||||
|
||||
####
|
||||
POST {{baseUrl}}/sqlgenerator/get_active_encrypt_key
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"Mgm_McuID": 151
|
||||
}
|
||||
389
application/controllers/summarydashboard/try_out.http
Normal file
389
application/controllers/summarydashboard/try_out.http
Normal file
@@ -0,0 +1,389 @@
|
||||
### Variables
|
||||
@baseUrl = https://devcpone.aplikasi.web.id/one-api/summarymcu/
|
||||
@contentType = application/json
|
||||
|
||||
### ============================================================
|
||||
### SETUP & TABLE GENERATION
|
||||
### ============================================================
|
||||
|
||||
### 1. Generate Table Setup
|
||||
# Creates mcu_number record and generates table name
|
||||
POST {{baseUrl}}/generatedata/generate_table_setup
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1403
|
||||
}
|
||||
|
||||
### ============================================================
|
||||
### KELAINAN DATA GENERATION
|
||||
### ============================================================
|
||||
|
||||
### 2. Generate Kelainan Lab
|
||||
# Generates lab anomaly details data
|
||||
POST {{baseUrl}}/generatedata/generate_kelainan_lab
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 2
|
||||
}
|
||||
|
||||
### 3. Generate Kelainan Non-Lab
|
||||
# Generates non-lab anomaly details data
|
||||
POST {{baseUrl}}/generatedata/generate_kelainan_nonlab
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 2
|
||||
}
|
||||
|
||||
### 4. Generate Kelainan Fisik
|
||||
# Generates physical anomaly details data
|
||||
POST {{baseUrl}}/generatedata/generate_kelainan_fisik
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
### 5. Summary Kelainan Sepuluh
|
||||
# Generates summary of top 10 anomalies
|
||||
POST {{baseUrl}}/generatedata/summary_kelainan_sepuluh
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
### ============================================================
|
||||
### MCU RESULTS GENERATION
|
||||
### ============================================================
|
||||
|
||||
### 6. Generate All Results
|
||||
# Generates mcu_result_all table data
|
||||
POST {{baseUrl}}/generatedata/generate_all_results
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
### 7. Generate Result MCU Lab
|
||||
# Generates lab results for all orders in MCU
|
||||
POST {{baseUrl}}/generatedata/generate_result_mcu_lab
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
### 8. Generate Result MCU Non-Lab
|
||||
# Generates non-lab results
|
||||
POST {{baseUrl}}/generatedata/generate_result_mcu_nonlab
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
### 9. Generate Result MCU Kenal Warna
|
||||
# Generates color recognition test results
|
||||
POST {{baseUrl}}/generatedata/generate_result_mcu_kenal_warna
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
### 10. Generate Result MCU Visus
|
||||
# Generates visual acuity test results
|
||||
POST {{baseUrl}}/generatedata/generate_result_mcu_visus
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
### 11. Generate Result MCU Status Gizi
|
||||
# Generates nutritional status results
|
||||
POST {{baseUrl}}/generatedata/generate_result_mcu_status_gizi
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
### 12. Generate Result MCU Body Fat Monitoring
|
||||
# Generates body fat monitoring results
|
||||
POST {{baseUrl}}/generatedata/generate_result_mcu_bodyfatmonitoring
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
### 13. Generate Result MCU Fisik
|
||||
# Generates physical examination results
|
||||
POST {{baseUrl}}/generatedata/generate_result_mcu_fisik
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
### 14. Generate Result Lab (Specific Order)
|
||||
# Generates lab results for specific order
|
||||
##POST {{baseUrl}}/generatedata/generate_result_lab
|
||||
#Content-Type: {{contentType}}
|
||||
|
||||
#{
|
||||
# "T_OrderHeaderID": 12345,
|
||||
# "T_OrderHeaderLabNumber": "LAB001"
|
||||
#}
|
||||
|
||||
|
||||
|
||||
### ============================================================
|
||||
### COMPLETE WORKFLOW EXAMPLE
|
||||
### ============================================================
|
||||
|
||||
### SCENARIO 1: Setup New MCU Project (Complete Flow)
|
||||
# Step 1: Generate table setup
|
||||
POST {{baseUrl}}/generatedata/generate_table_setup
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
###
|
||||
# Step 2: Generate lab anomalies
|
||||
POST {{baseUrl}}/generatedata/generate_kelainan_lab
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
###
|
||||
# Step 3: Generate non-lab anomalies
|
||||
POST {{baseUrl}}/generatedata/generate_kelainan_nonlab
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
###
|
||||
# Step 4: Generate physical anomalies
|
||||
POST {{baseUrl}}/generatedata/generate_kelainan_fisik
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
###
|
||||
# Step 5: Generate summary
|
||||
POST {{baseUrl}}/generatedata/summary_kelainan_sepuluh
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
###
|
||||
# Step 6: Export to SQLite
|
||||
POST {{baseUrl}}/generatedata/generate_sqlite_by_mgm_mcuid
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
|
||||
### ============================================================
|
||||
### FISIK TEMPLATE MAP FUNCTIONS
|
||||
### Step-by-step workflow for template mapping
|
||||
### ============================================================
|
||||
|
||||
### STEP 1: List Active Fisik Templates (Optional)
|
||||
# View all active templates
|
||||
POST {{baseUrl}}/generatedata/list_active_fisik_templates
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{}
|
||||
|
||||
### STEP 2: Get Fisik Template Detail (Optional)
|
||||
# View detail of specific template with parsed JSON
|
||||
POST {{baseUrl}}/generatedata/get_fisik_template_detail
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"FisikTemplateCode": "RI00"
|
||||
}
|
||||
|
||||
### STEP 3: Create Fisik Template Map Table (Once Only)
|
||||
# Creates the fisik_template_map table
|
||||
POST {{baseUrl}}/generatedata/create_fisik_template_map_table
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{}
|
||||
|
||||
### STEP 4a: Generate Fisik Template Map (Full Generate)
|
||||
# Extract & save mapping for ALL active templates
|
||||
# Note: Truncates all old data, inserts all new data
|
||||
POST {{baseUrl}}/generatedata/generate_fisik_template_map
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{}
|
||||
|
||||
### STEP 4b: Generate Fisik Template Map By Code (Partial Update)
|
||||
# Extract & update mapping for ONE template only
|
||||
# Use when only one template changed
|
||||
POST {{baseUrl}}/generatedata/generate_fisik_template_map_by_code
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"FisikTemplateCode": "RI00"
|
||||
}
|
||||
|
||||
### STEP 5a: Get Fisik Template Map
|
||||
# Query mapping data with optional filters
|
||||
POST {{baseUrl}}/generatedata/get_fisik_template_map
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"FisikTemplateCode": "RI00",
|
||||
"level": 2
|
||||
}
|
||||
|
||||
### STEP 5a-1: Get All Fisik Template Map Data
|
||||
POST {{baseUrl}}/generatedata/get_fisik_template_map
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{}
|
||||
|
||||
### STEP 5a-2: Get By Template Code Only
|
||||
POST {{baseUrl}}/generatedata/get_fisik_template_map
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"FisikTemplateCode": "RI00"
|
||||
}
|
||||
|
||||
### STEP 5a-3: Get By Level Only
|
||||
POST {{baseUrl}}/generatedata/get_fisik_template_map
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"level": 2
|
||||
}
|
||||
|
||||
### STEP 5b: Search Fisik Template Map
|
||||
# Search by id_code or label (LIKE search)
|
||||
POST {{baseUrl}}/generatedata/search_fisik_template_map
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"keyword": "perut"
|
||||
}
|
||||
|
||||
### ============================================================
|
||||
### SQLITE EXPORT
|
||||
### ============================================================
|
||||
|
||||
### 15. Generate SQLite by Mgm_McuID
|
||||
# Exports kelainan_details, kelainan_summary, and mcu_number to SQLite file
|
||||
POST {{baseUrl}}/generatedata/generate_sqlite_by_mgm_mcuid
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"Mgm_McuID": 1
|
||||
}
|
||||
|
||||
### ============================================================
|
||||
### SCENARIO 2: Fisik Template Setup (First Time)
|
||||
### ============================================================
|
||||
|
||||
###
|
||||
# Step 1: Create the mapping table (once)
|
||||
POST {{baseUrl}}/generatedata/create_fisik_template_map_table
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{}
|
||||
|
||||
###
|
||||
# Step 2: Generate all template mappings
|
||||
POST {{baseUrl}}/generatedata/generate_fisik_template_map
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{}
|
||||
|
||||
###
|
||||
# Step 3: Query the generated mappings
|
||||
POST {{baseUrl}}/generatedata/get_fisik_template_map
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{}
|
||||
|
||||
### ============================================================
|
||||
### SCENARIO 3: Update Single Template (Maintenance)
|
||||
### ============================================================
|
||||
|
||||
###
|
||||
# Update mapping for specific template only
|
||||
POST {{baseUrl}}/generatedata/generate_fisik_template_map_by_code
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"FisikTemplateCode": "RI00"
|
||||
}
|
||||
|
||||
###
|
||||
# Verify the updated mapping
|
||||
POST {{baseUrl}}/generatedata/get_fisik_template_map
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"FisikTemplateCode": "RI00"
|
||||
}
|
||||
|
||||
### ============================================================
|
||||
### NOTES & TIPS
|
||||
### ============================================================
|
||||
|
||||
# 1. Update @baseUrl variable at the top with your actual server URL
|
||||
# 2. Replace Mgm_McuID with actual MCU ID from your database
|
||||
# 3. Use ### to separate requests
|
||||
# 4. Click "Send Request" above each request to execute
|
||||
# 5. For CodeIgniter, ensure index.php is in URL if not using URL rewriting
|
||||
# Example: http://localhost/project/index.php/generatedata/function_name
|
||||
# 6. Check commented documentation in controller for detailed workflow
|
||||
# 7. Some functions depend on previous steps (e.g., generate_kelainan_* requires generate_table_setup first)
|
||||
# 8. SQLite export creates file in root directory: mcu_{TableName}.sqlite
|
||||
|
||||
### ============================================================
|
||||
### ERROR TESTING
|
||||
### ============================================================
|
||||
|
||||
### Test Missing Parameter
|
||||
POST {{baseUrl}}/generatedata/generate_table_setup
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{}
|
||||
|
||||
### Test Invalid Template Code
|
||||
POST {{baseUrl}}/generatedata/get_fisik_template_detail
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{
|
||||
"FisikTemplateCode": "INVALID_CODE"
|
||||
}
|
||||
|
||||
### Test Missing Keyword
|
||||
POST {{baseUrl}}/generatedata/search_fisik_template_map
|
||||
Content-Type: {{contentType}}
|
||||
|
||||
{}
|
||||
|
||||
@@ -8,15 +8,35 @@ class Test extends MY_Controller
|
||||
echo "Transaction API";
|
||||
}
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->db_onedev = $this->load->database("onedev", true);
|
||||
$this->db_log = $this->load->database("log", true);
|
||||
$this->load->helper(array('form', 'url'));
|
||||
}
|
||||
/**
|
||||
* Generic POST request function
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->db_onedev = $this->load->database("onedev", true);
|
||||
$this->db_log = $this->load->database("log", true);
|
||||
$this->load->helper(array('form', 'url'));
|
||||
}
|
||||
|
||||
public function test_generate_dashboard_file()
|
||||
{
|
||||
$prm = $this->sys_input;
|
||||
$mgmMcuID = isset($prm['Mgm_McuID']) ? intval($prm['Mgm_McuID']) : 0;
|
||||
$publishedID = isset($prm['Published_McuDasboardID']) ? intval($prm['Published_McuDasboardID']) : 0;
|
||||
|
||||
$this->load->library('Mcudashboard');
|
||||
$rtn = $this->mcudashboard->generate_dashboard_files($mgmMcuID, $publishedID);
|
||||
if (!$rtn[0]) {
|
||||
$this->sys_error($rtn[1]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$this->sys_ok(array(
|
||||
"total" => count($rtn[1]),
|
||||
"records" => $rtn[1]
|
||||
));
|
||||
exit;
|
||||
}
|
||||
/**
|
||||
* Generic POST request function
|
||||
* @param string $url API endpoint URL
|
||||
* @param array $data Request payload
|
||||
* @param array $headers Custom headers (optional)
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE published_mcu_dashboard
|
||||
ADD COLUMN IF NOT EXISTS Published_McuDasboardFileUrl VARCHAR(255) NULL AFTER Published_McuDasboardStatus;
|
||||
Reference in New Issue
Block a user