Update MCU sync, dummy generator, and kelainan trigger

This commit is contained in:
sas.fajri
2026-05-06 22:01:57 +07:00
parent 3d50bcf7f1
commit 3cde1b3cdb
6 changed files with 575 additions and 98 deletions

16
AGENTS.md Normal file
View File

@@ -0,0 +1,16 @@
# Agent Safety Rules
## Destructive Actions
- Never run destructive actions directly when the request is ambiguous.
- Destructive actions include (not limited to): `DELETE`, `TRUNCATE`, `DROP`, mass `UPDATE`, file deletion, force-reset, and similar irreversible operations.
- Before executing destructive actions, the agent must:
1. Confirm exact target scope (table/file/column/ID/filter).
2. Show a short preview of affected scope when possible.
3. Ask for explicit user confirmation.
## Ambiguous Instructions
- If instruction can be interpreted in more than one way, do not execute immediately.
- Ask a concise clarification first, then proceed after confirmation.
## Priority
- Safety confirmation is mandatory and overrides speed.

View File

@@ -54,6 +54,80 @@ class Resumeindividucponev7 extends MY_Controller
Published_McuDasboardLastUpdatedUserID = VALUES(Published_McuDasboardLastUpdatedUserID)";
$this->db_onedev->query($sql, array($orderID, $userID, $userID));
}
private function ensure_publish_dashboard_file($orderID, $userID)
{
$orderID = intval($orderID);
$userID = intval($userID);
if ($orderID <= 0) {
return;
}
// Ensure published row exists for this order.
$sql = "INSERT INTO published_mcu_dashboard (
Published_McuDasboardT_OrderHeaderID,
Published_McuDasboardStatus,
Published_McuDasboardIsActive,
Published_McuDasboardCreated,
Published_McuDasboardCreatedUserID,
Published_McuDasboardLastUpdated,
Published_McuDasboardLastUpdatedUserID
)
VALUES (?, 'N', 'Y', NOW(), ?, NOW(), ?)
ON DUPLICATE KEY UPDATE
Published_McuDasboardIsActive = 'Y',
Published_McuDasboardLastUpdated = NOW(),
Published_McuDasboardLastUpdatedUserID = VALUES(Published_McuDasboardLastUpdatedUserID)";
$this->db_onedev->query($sql, array($orderID, $userID, $userID));
$sql = "SELECT Published_McuDasboardID
FROM published_mcu_dashboard
WHERE Published_McuDasboardT_OrderHeaderID = ?
AND Published_McuDasboardIsActive = 'Y'
ORDER BY Published_McuDasboardID DESC
LIMIT 1";
$qry = $this->db_onedev->query($sql, array($orderID));
if (!$qry || $qry->num_rows() === 0) {
return;
}
$publishedID = intval($qry->row()->Published_McuDasboardID);
if ($publishedID <= 0) {
return;
}
// Mark as processing before file generation.
$this->db_onedev->query(
"UPDATE published_mcu_dashboard
SET Published_McuDasboardStatus = 'P',
Published_McuDasboardLastUpdated = NOW(),
Published_McuDasboardLastUpdatedUserID = ?
WHERE Published_McuDasboardID = ?",
array($userID, $publishedID)
);
$rtn = $this->mcudashboard->generate_dashboard_files(0, $publishedID);
$isOk = false;
if (is_array($rtn) && isset($rtn[0]) && $rtn[0] === true && isset($rtn[1]) && is_array($rtn[1])) {
foreach ($rtn[1] as $item) {
if (isset($item['status']) && strtoupper($item['status']) === 'OK') {
$isOk = true;
break;
}
}
}
$this->db_onedev->query(
"UPDATE published_mcu_dashboard
SET Published_McuDasboardStatus = ?,
Published_McuDasboardLastUpdated = NOW(),
Published_McuDasboardLastUpdatedUserID = ?
WHERE Published_McuDasboardID = ?",
array($isOk ? 'Y' : 'N', $userID, $publishedID)
);
// Keep cpone_dashboard mirror in sync if SP is available.
$this->db_onedev->query("CALL cpone.sp_sync_published_mcu_dashboard_by_orderheaderid(?)", array($orderID));
}
public function getsetup()
{
try {
@@ -744,20 +818,29 @@ class Resumeindividucponev7 extends MY_Controller
}
}
$status = 'NEW';
$status = 'NEW';
$statusLog = $act;
$val = 'N';
$dt = '0000-00-00 00:00:00';
$verification = 'N';
$verificationUserID = 0;
$verificationDateTime = null;
$statusBefore = 'NEW';
if ($act == 'VAL') {
$status = 'VAL';
$val = 'Y';
$dt = date("Y-m-d h:i:s");
} else if ($act == 'UNVAL') {
$val = 'N';
$status = 'NEW';
$dt = date("Y-m-d h:i:s");
}
$dt = date("Y-m-d H:i:s");
$verification = 'Y';
$verificationUserID = $userid;
$verificationDateTime = $dt;
} else if ($act == 'UNVAL') {
$val = 'N';
$status = 'NEW';
$dt = date("Y-m-d H:i:s");
$verification = 'N';
$verificationUserID = 0;
$verificationDateTime = null;
}
$jsonBefore = "";
$jsonAfter = "";
//insert mcu_resume
@@ -782,23 +865,29 @@ class Resumeindividucponev7 extends MY_Controller
$sql = "INSERT INTO mcu_resume
(Mcu_ResumeT_OrderHeaderID,
Mcu_ResumeStatus,
Mcu_ResumeValidation,
Mcu_ResumeValidationDateTime,
Mcu_ResumeValidationUserID,
Mcu_ResumeKesimpulan,
Mcu_ResumeRekomendasi,
Mcu_ResumeSaran,
Mcu_ResumeMcu_FitnessCategoryID)
VALUES(?,?,?,?,?,?,?,?,?)";
$query = $this->db_onedev->query($sql, [
$data['orderID'],
$status,
$val,
$dt,
$userid,
$data['header']['kesimpulan'],
$data['header']['rekomendasi'],
$data['header']['saran'],
Mcu_ResumeValidation,
Mcu_ResumeValidationDateTime,
Mcu_ResumeValidationUserID,
Mcu_ResumeVerification,
Mcu_ResumeVerificationDateTime,
Mcu_ResumeVerificationUserID,
Mcu_ResumeKesimpulan,
Mcu_ResumeRekomendasi,
Mcu_ResumeSaran,
Mcu_ResumeMcu_FitnessCategoryID)
VALUES(?,?,?,?,?,?,?,?,?,?,?,?)";
$query = $this->db_onedev->query($sql, [
$data['orderID'],
$status,
$val,
$dt,
$userid,
$verification,
$verificationDateTime,
$verificationUserID,
$data['header']['kesimpulan'],
$data['header']['rekomendasi'],
$data['header']['saran'],
$data['fitnessCategory'],
]);
if (!$query) {
@@ -853,23 +942,29 @@ class Resumeindividucponev7 extends MY_Controller
$detail = $query->result_array();
$jsonBefore['detail'] = $detail;
$sql = "UPDATE mcu_resume
SET Mcu_ResumeStatus = ?,
Mcu_ResumeValidation = ?,
Mcu_ResumeValidationDateTime = ?,
Mcu_ResumeValidationUserID = ?,
Mcu_ResumeKesimpulan = ?,
Mcu_ResumeRekomendasi = ?,
Mcu_ResumeSaran = ?,
SET Mcu_ResumeStatus = ?,
Mcu_ResumeValidation = ?,
Mcu_ResumeValidationDateTime = ?,
Mcu_ResumeValidationUserID = ?,
Mcu_ResumeVerification = ?,
Mcu_ResumeVerificationDateTime = ?,
Mcu_ResumeVerificationUserID = ?,
Mcu_ResumeKesimpulan = ?,
Mcu_ResumeRekomendasi = ?,
Mcu_ResumeSaran = ?,
Mcu_ResumeMcu_FitnessCategoryID = ?
WHERE Mcu_ResumeID = ?";
$query = $this->db_onedev->query($sql, [
$status,
$val,
$dt,
$userid,
$data['header']['kesimpulan'],
$data['header']['rekomendasi'],
$data['header']['saran'],
$status,
$val,
$dt,
$userid,
$verification,
$verificationDateTime,
$verificationUserID,
$data['header']['kesimpulan'],
$data['header']['rekomendasi'],
$data['header']['saran'],
$data['fitnessCategory'],
$resumeID,
]);
@@ -1091,9 +1186,12 @@ class Resumeindividucponev7 extends MY_Controller
exit;
}
$this->upsert_published_dashboard_on_new_to_val($data['orderID'], $statusBefore, $status, $userid);
if ($status === 'VAL' && $val === 'Y') {
$this->ensure_publish_dashboard_file($data['orderID'], $userid);
}
$this->sync_resume_status_dashboard($resumeID);
$this->sys_ok('ok');
}
}
function getlab($id, $isApi)
{
$prm = $this->sys_input;

10
claude.md Normal file
View File

@@ -0,0 +1,10 @@
# Collaboration Guardrails
- For any destructive operation, confirm first. Do not assume.
- If request is ambiguous, ask clarification before execution.
- For database deletes/updates with broad impact, verify exact filter and IDs with the user.
- Preferred safe flow:
1. Re-state interpreted target.
2. Show short impact preview if possible.
3. Wait for explicit approval.
4. Execute.

View File

@@ -790,6 +790,11 @@ BEGIN
DECLARE v_lab_number VARCHAR(25);
DECLARE v_seq INT;
DECLARE v_effective_date DATE;
DECLARE v_lab_exists INT DEFAULT 0;
DECLARE v_checkin_time TIME;
DECLARE v_checkout_time TIME;
DECLARE v_total_station INT DEFAULT 0;
DECLARE v_done_station INT DEFAULT 0;
DECLARE cur_target CURSOR FOR
SELECT
@@ -821,6 +826,11 @@ BEGIN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Gunakan preregister_id, atau mcu_id + date';
END IF;
SELECT IFNULL(MAX(CAST(RIGHT(T_OrderHeaderLabNumber, 4) AS UNSIGNED)), 0) + 1
INTO v_seq
FROM cpone.t_orderheader
WHERE T_OrderHeaderLabNumber LIKE CONCAT('X', DATE_FORMAT(NOW(), '%y%m%d'), '%');
OPEN cur_target;
read_loop: LOOP
FETCH cur_target INTO v_preregister_id, v_patient_id, v_gender, v_corporate_id, v_mcu_id, v_orders;
@@ -845,75 +855,102 @@ BEGIN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Tanggal MCU tidak ditemukan di mcu_preregister_date aktif';
END IF;
SELECT oh.T_OrderHeaderID
INTO v_source_order_id
FROM cpone.t_orderheader oh
JOIN cpone.mcu_preregister_patients p2
ON p2.Mcu_PreregisterPatientsT_OrderHeaderID = oh.T_OrderHeaderID
AND p2.Mcu_PreregisterPatientsIsActive = 'Y'
WHERE oh.T_OrderHeaderIsActive = 'Y'
AND p2.Mcu_PreregisterPatientsGender = v_gender
AND EXISTS (
SELECT 1
FROM cpone.so_resultentry r
JOIN cpone.so_resultentrydetail rd
ON rd.So_ResultEntryDetailSo_ResultEntryID = r.So_ResultEntryID
AND rd.So_ResultEntryDetailIsActive = 'Y'
WHERE r.So_ResultEntryT_OrderHeaderID = oh.T_OrderHeaderID
AND r.So_ResultEntryIsActive = 'Y'
AND r.So_ResultEntryValidation1 = 'Y'
AND r.So_ResultEntryStatus = 'VAL'
)
AND EXISTS (
SELECT 1
FROM cpone.t_orderdetail odr
WHERE odr.T_OrderDetailT_OrderHeaderID = oh.T_OrderHeaderID
AND odr.T_OrderDetailIsActive = 'Y'
AND IFNULL(TRIM(odr.T_OrderDetailResult), '') <> ''
)
AND EXISTS (
SELECT 1
FROM cpone.t_orderdetail odf
JOIN cpone.so_resultentry rf
ON rf.So_ResultEntryT_OrderHeaderID = odf.T_OrderDetailT_OrderHeaderID
AND rf.So_ResultEntryT_OrderDetailID = odf.T_OrderDetailID
AND rf.So_ResultEntryIsActive = 'Y'
AND rf.So_ResultEntryValidation1 = 'Y'
AND rf.So_ResultEntryStatus = 'VAL'
JOIN cpone.so_resultentry_fisik_umum rfu
ON rfu.So_ResultEntryFisikUmumSo_ResultEntryID = rf.So_ResultEntryID
AND rfu.So_ResultEntryFisikUmumIsActive = 'Y'
WHERE odf.T_OrderDetailT_OrderHeaderID = oh.T_OrderHeaderID
AND odf.T_OrderDetailIsActive = 'Y'
AND odf.T_OrderDetailT_TestID = 2562
)
AND (
(v_orders LIKE '%PN%' AND EXISTS (
SELECT IFNULL((
SELECT oh.T_OrderHeaderID
FROM cpone.t_orderheader oh
JOIN cpone.mcu_preregister_patients p2
ON p2.Mcu_PreregisterPatientsT_OrderHeaderID = oh.T_OrderHeaderID
AND p2.Mcu_PreregisterPatientsIsActive = 'Y'
WHERE oh.T_OrderHeaderIsActive = 'Y'
AND p2.Mcu_PreregisterPatientsGender = v_gender
AND EXISTS (
SELECT 1
FROM cpone.t_orderdetailorder odo
WHERE odo.T_OrderDetailOrderT_OrderHeaderID = oh.T_OrderHeaderID
AND odo.T_OrderDetailOrderIsPacket = 'Y'
AND odo.T_OrderDetailOrderIsActive = 'Y'
))
OR v_orders NOT LIKE '%PN%'
)
ORDER BY oh.T_OrderHeaderDate DESC
LIMIT 1;
FROM cpone.so_resultentry r
JOIN cpone.so_resultentrydetail rd
ON rd.So_ResultEntryDetailSo_ResultEntryID = r.So_ResultEntryID
AND rd.So_ResultEntryDetailIsActive = 'Y'
WHERE r.So_ResultEntryT_OrderHeaderID = oh.T_OrderHeaderID
AND r.So_ResultEntryIsActive = 'Y'
AND r.So_ResultEntryValidation1 = 'Y'
AND r.So_ResultEntryStatus = 'VAL'
)
AND EXISTS (
SELECT 1
FROM cpone.t_orderdetail odr
WHERE odr.T_OrderDetailT_OrderHeaderID = oh.T_OrderHeaderID
AND odr.T_OrderDetailIsActive = 'Y'
AND IFNULL(TRIM(odr.T_OrderDetailResult), '') <> ''
)
AND (
(v_orders LIKE '%PN%' AND EXISTS (
SELECT 1
FROM cpone.t_orderdetailorder odo
WHERE odo.T_OrderDetailOrderT_OrderHeaderID = oh.T_OrderHeaderID
AND odo.T_OrderDetailOrderIsPacket = 'Y'
AND odo.T_OrderDetailOrderIsActive = 'Y'
))
OR EXISTS (
SELECT 1
FROM cpone.t_orderdetail odx
WHERE odx.T_OrderDetailT_OrderHeaderID = oh.T_OrderHeaderID
AND odx.T_OrderDetailIsActive = 'Y'
AND FIND_IN_SET(TRIM(odx.T_OrderDetailT_TestCode), REPLACE(v_orders, ' ', '')) > 0
)
OR IFNULL(TRIM(v_orders), '') = ''
)
ORDER BY oh.T_OrderHeaderDate DESC
LIMIT 1
), 0)
INTO v_source_order_id;
IF IFNULL(v_source_order_id, 0) = 0 THEN
SELECT IFNULL((
SELECT oh.T_OrderHeaderID
FROM cpone.t_orderheader oh
JOIN cpone.mcu_preregister_patients p2
ON p2.Mcu_PreregisterPatientsT_OrderHeaderID = oh.T_OrderHeaderID
AND p2.Mcu_PreregisterPatientsIsActive = 'Y'
WHERE oh.T_OrderHeaderIsActive = 'Y'
AND p2.Mcu_PreregisterPatientsGender = v_gender
AND EXISTS (
SELECT 1
FROM cpone.t_orderdetail odr
WHERE odr.T_OrderDetailT_OrderHeaderID = oh.T_OrderHeaderID
AND odr.T_OrderDetailIsActive = 'Y'
AND IFNULL(TRIM(odr.T_OrderDetailResult), '') <> ''
)
ORDER BY oh.T_OrderHeaderDate DESC
LIMIT 1
), 0)
INTO v_source_order_id;
END IF;
IF IFNULL(v_source_order_id, 0) = 0 THEN
ITERATE read_loop;
END IF;
SELECT IFNULL(MAX(CAST(RIGHT(T_OrderHeaderLabNumber, 4) AS UNSIGNED)), 0) + 1
INTO v_seq
FROM cpone.t_orderheader
WHERE T_OrderHeaderLabNumber LIKE CONCAT('X', DATE_FORMAT(NOW(), '%y%m%d'), '%');
SET v_lab_number = CONCAT(
'X',
DATE_FORMAT(NOW(), '%y%m%d'),
LPAD(v_seq, 4, '0')
);
SELECT COUNT(1)
INTO v_lab_exists
FROM cpone.t_orderheader
WHERE T_OrderHeaderLabNumber = v_lab_number;
WHILE v_lab_exists > 0 DO
SET v_seq = v_seq + 1;
SET v_lab_number = CONCAT(
'X',
DATE_FORMAT(NOW(), '%y%m%d'),
LPAD(v_seq, 4, '0')
);
SELECT COUNT(1)
INTO v_lab_exists
FROM cpone.t_orderheader
WHERE T_OrderHeaderLabNumber = v_lab_number;
END WHILE;
SET v_seq = v_seq + 1;
INSERT INTO cpone.t_orderheader (
T_OrderHeaderM_BranchID,
@@ -994,7 +1031,7 @@ BEGIN
v_mcu_id,
os.T_OrderSampleT_SampleStationID,
ss.T_SampleStationName,
'LAB',
'lab',
os.T_OrderSampleSamplingDate,
CONCAT(os.T_OrderSampleSamplingDate, ' ', IFNULL(os.T_OrderSampleSamplingTime, '00:00:00')),
CONCAT(os.T_OrderSampleReceiveDate, ' ', IFNULL(os.T_OrderSampleReceiveTime, '00:00:00')),
@@ -1020,6 +1057,83 @@ BEGIN
Mcu_StationProgressProcessAt = VALUES(Mcu_StationProgressProcessAt),
Mcu_StationProgressDoneAt = VALUES(Mcu_StationProgressDoneAt),
Mcu_StationProgressSyncedAt = VALUES(Mcu_StationProgressSyncedAt);
SELECT TIME(oh.T_OrderHeaderDate)
INTO v_checkin_time
FROM cpone.t_orderheader oh
WHERE oh.T_OrderHeaderID = v_new_order_id
LIMIT 1;
IF v_checkin_time IS NULL THEN
SET v_checkin_time = '07:30:00';
END IF;
SELECT COUNT(*)
INTO v_total_station
FROM cpone.t_ordersample os
WHERE os.T_OrderSampleT_OrderHeaderID = v_new_order_id
AND os.T_OrderSampleIsActive = 'Y';
SELECT COUNT(*)
INTO v_done_station
FROM cpone.t_ordersample os
JOIN cpone.t_samplingso sso
ON sso.T_SamplingSoT_OrderHeaderID = os.T_OrderSampleT_OrderHeaderID
AND sso.T_SamplingSoT_SampleStationID = os.T_OrderSampleT_SampleStationID
AND sso.T_SamplingSoIsActive = 'Y'
WHERE os.T_OrderSampleT_OrderHeaderID = v_new_order_id
AND os.T_OrderSampleIsActive = 'Y'
AND sso.T_SamplingSoDoneDate IS NOT NULL
AND sso.T_SamplingSoDoneDate <> '0000-00-00'
AND IFNULL(sso.T_SamplingSoDoneTime, '') <> '';
IF v_total_station > 0 AND v_done_station = v_total_station THEN
SELECT MAX(sso.T_SamplingSoDoneTime)
INTO v_checkout_time
FROM cpone.t_samplingso sso
WHERE sso.T_SamplingSoT_OrderHeaderID = v_new_order_id
AND sso.T_SamplingSoIsActive = 'Y'
AND sso.T_SamplingSoDoneDate IS NOT NULL
AND sso.T_SamplingSoDoneDate <> '0000-00-00'
AND IFNULL(sso.T_SamplingSoDoneTime, '') <> '';
ELSE
SET v_checkout_time = NULL;
END IF;
INSERT INTO cpone_dashboard.mcu_checkinout (
Mcu_CheckinoutMcuID,
Mcu_CheckinoutPreregisterID,
Mcu_CheckinoutOrderID,
Mcu_CheckinoutDate,
Mcu_CheckinoutInTime,
Mcu_CheckinoutOutTime,
Mcu_CheckinoutOutUserID,
Mcu_CheckinoutIsActive,
Mcu_CheckinoutSyncedAt
)
VALUES (
v_mcu_id,
v_preregister_id,
v_new_order_id,
v_effective_date,
v_checkin_time,
v_checkout_time,
CASE WHEN v_checkout_time IS NULL THEN 0 ELSE p_user_id END,
'Y',
NOW()
)
ON DUPLICATE KEY UPDATE
Mcu_CheckinoutMcuID = VALUES(Mcu_CheckinoutMcuID),
Mcu_CheckinoutOrderID = VALUES(Mcu_CheckinoutOrderID),
Mcu_CheckinoutOutTime = CASE
WHEN VALUES(Mcu_CheckinoutOutTime) IS NULL THEN Mcu_CheckinoutOutTime
ELSE VALUES(Mcu_CheckinoutOutTime)
END,
Mcu_CheckinoutOutUserID = CASE
WHEN VALUES(Mcu_CheckinoutOutTime) IS NULL THEN Mcu_CheckinoutOutUserID
ELSE VALUES(Mcu_CheckinoutOutUserID)
END,
Mcu_CheckinoutSyncedAt = NOW();
END LOOP;
CLOSE cur_target;

View File

@@ -0,0 +1,204 @@
-- Auto-maintain cpone_corporate.kelainan_summary from cpone_corporate.kelainan_details
-- 1) deduplicate existing rows before adding unique key
DELETE ks1
FROM cpone_corporate.kelainan_summary ks1
JOIN cpone_corporate.kelainan_summary ks2
ON ks1.Mcu_KelainanMgm_McuID = ks2.Mcu_KelainanMgm_McuID
AND ks1.Mcu_KelainanID = ks2.Mcu_KelainanID
AND ks1.created_at > ks2.created_at;
DELETE dks1
FROM cpone_dashboard.kelainan_summary dks1
JOIN cpone_dashboard.kelainan_summary dks2
ON dks1.Mgm_McuID = dks2.Mgm_McuID
AND dks1.Mcu_KelainanID = dks2.Mcu_KelainanID
AND dks1.created_at > dks2.created_at;
DROP TRIGGER IF EXISTS cpone_corporate.trg_kelainan_details_ai_sync_summary;
DROP TRIGGER IF EXISTS cpone_corporate.trg_kelainan_details_au_sync_summary;
DROP TRIGGER IF EXISTS cpone_corporate.trg_kelainan_details_ad_sync_summary;
DELIMITER $$
CREATE TRIGGER cpone_corporate.trg_kelainan_details_ai_sync_summary
AFTER INSERT ON cpone_corporate.kelainan_details
FOR EACH ROW
BEGIN
DECLARE v_mgm_mcuid INT;
SELECT oh.T_OrderHeaderMgm_McuID
INTO v_mgm_mcuid
FROM cpone.t_orderheader oh
WHERE oh.T_OrderHeaderID = NEW.T_OrderHeaderID
AND oh.T_OrderHeaderIsActive = 'Y'
LIMIT 1;
IF v_mgm_mcuid IS NOT NULL
AND NEW.Mcu_KelainanID IS NOT NULL
AND NEW.Mcu_KelainanName IS NOT NULL
AND NEW.Mcu_KelainanName <> '' THEN
INSERT INTO cpone_corporate.kelainan_summary (
Mcu_KelainanID,
Mcu_KelainanMgm_McuID,
Mcu_KelainanName,
created_at
)
SELECT NEW.Mcu_KelainanID, v_mgm_mcuid, NEW.Mcu_KelainanName, NOW()
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM cpone_corporate.kelainan_summary ks
WHERE ks.Mcu_KelainanMgm_McuID = v_mgm_mcuid
AND ks.Mcu_KelainanID = NEW.Mcu_KelainanID
);
UPDATE cpone_corporate.kelainan_summary
SET Mcu_KelainanName = NEW.Mcu_KelainanName
WHERE Mcu_KelainanMgm_McuID = v_mgm_mcuid
AND Mcu_KelainanID = NEW.Mcu_KelainanID;
INSERT INTO cpone_dashboard.kelainan_summary (
Mcu_KelainanID,
Mcu_KelainanMgm_McuID,
Mcu_KelainanName,
created_at,
Mgm_McuID
)
SELECT NEW.Mcu_KelainanID, v_mgm_mcuid, NEW.Mcu_KelainanName, NOW(), v_mgm_mcuid
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM cpone_dashboard.kelainan_summary dks
WHERE dks.Mgm_McuID = v_mgm_mcuid
AND dks.Mcu_KelainanID = NEW.Mcu_KelainanID
);
UPDATE cpone_dashboard.kelainan_summary
SET Mcu_KelainanName = NEW.Mcu_KelainanName,
Mcu_KelainanMgm_McuID = v_mgm_mcuid
WHERE Mgm_McuID = v_mgm_mcuid
AND Mcu_KelainanID = NEW.Mcu_KelainanID;
END IF;
END$$
CREATE TRIGGER cpone_corporate.trg_kelainan_details_au_sync_summary
AFTER UPDATE ON cpone_corporate.kelainan_details
FOR EACH ROW
BEGIN
DECLARE v_mgm_old INT;
DECLARE v_mgm_new INT;
SELECT oh.T_OrderHeaderMgm_McuID
INTO v_mgm_old
FROM cpone.t_orderheader oh
WHERE oh.T_OrderHeaderID = OLD.T_OrderHeaderID
AND oh.T_OrderHeaderIsActive = 'Y'
LIMIT 1;
SELECT oh.T_OrderHeaderMgm_McuID
INTO v_mgm_new
FROM cpone.t_orderheader oh
WHERE oh.T_OrderHeaderID = NEW.T_OrderHeaderID
AND oh.T_OrderHeaderIsActive = 'Y'
LIMIT 1;
IF v_mgm_old IS NOT NULL AND OLD.Mcu_KelainanID IS NOT NULL THEN
IF NOT EXISTS (
SELECT 1
FROM cpone_corporate.kelainan_details kd
JOIN cpone.t_orderheader oh ON oh.T_OrderHeaderID = kd.T_OrderHeaderID
WHERE oh.T_OrderHeaderMgm_McuID = v_mgm_old
AND oh.T_OrderHeaderIsActive = 'Y'
AND kd.Mcu_KelainanID = OLD.Mcu_KelainanID
) THEN
DELETE FROM cpone_corporate.kelainan_summary
WHERE Mcu_KelainanMgm_McuID = v_mgm_old
AND Mcu_KelainanID = OLD.Mcu_KelainanID;
DELETE FROM cpone_dashboard.kelainan_summary
WHERE Mgm_McuID = v_mgm_old
AND Mcu_KelainanID = OLD.Mcu_KelainanID;
END IF;
END IF;
IF v_mgm_new IS NOT NULL
AND NEW.Mcu_KelainanID IS NOT NULL
AND NEW.Mcu_KelainanName IS NOT NULL
AND NEW.Mcu_KelainanName <> '' THEN
INSERT INTO cpone_corporate.kelainan_summary (
Mcu_KelainanID,
Mcu_KelainanMgm_McuID,
Mcu_KelainanName,
created_at
)
SELECT NEW.Mcu_KelainanID, v_mgm_new, NEW.Mcu_KelainanName, NOW()
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM cpone_corporate.kelainan_summary ks
WHERE ks.Mcu_KelainanMgm_McuID = v_mgm_new
AND ks.Mcu_KelainanID = NEW.Mcu_KelainanID
);
UPDATE cpone_corporate.kelainan_summary
SET Mcu_KelainanName = NEW.Mcu_KelainanName
WHERE Mcu_KelainanMgm_McuID = v_mgm_new
AND Mcu_KelainanID = NEW.Mcu_KelainanID;
INSERT INTO cpone_dashboard.kelainan_summary (
Mcu_KelainanID,
Mcu_KelainanMgm_McuID,
Mcu_KelainanName,
created_at,
Mgm_McuID
)
SELECT NEW.Mcu_KelainanID, v_mgm_new, NEW.Mcu_KelainanName, NOW(), v_mgm_new
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM cpone_dashboard.kelainan_summary dks
WHERE dks.Mgm_McuID = v_mgm_new
AND dks.Mcu_KelainanID = NEW.Mcu_KelainanID
);
UPDATE cpone_dashboard.kelainan_summary
SET Mcu_KelainanName = NEW.Mcu_KelainanName,
Mcu_KelainanMgm_McuID = v_mgm_new
WHERE Mgm_McuID = v_mgm_new
AND Mcu_KelainanID = NEW.Mcu_KelainanID;
END IF;
END$$
CREATE TRIGGER cpone_corporate.trg_kelainan_details_ad_sync_summary
AFTER DELETE ON cpone_corporate.kelainan_details
FOR EACH ROW
BEGIN
DECLARE v_mgm_mcuid INT;
SELECT oh.T_OrderHeaderMgm_McuID
INTO v_mgm_mcuid
FROM cpone.t_orderheader oh
WHERE oh.T_OrderHeaderID = OLD.T_OrderHeaderID
AND oh.T_OrderHeaderIsActive = 'Y'
LIMIT 1;
IF v_mgm_mcuid IS NOT NULL AND OLD.Mcu_KelainanID IS NOT NULL THEN
IF NOT EXISTS (
SELECT 1
FROM cpone_corporate.kelainan_details kd
JOIN cpone.t_orderheader oh ON oh.T_OrderHeaderID = kd.T_OrderHeaderID
WHERE oh.T_OrderHeaderMgm_McuID = v_mgm_mcuid
AND oh.T_OrderHeaderIsActive = 'Y'
AND kd.Mcu_KelainanID = OLD.Mcu_KelainanID
) THEN
DELETE FROM cpone_corporate.kelainan_summary
WHERE Mcu_KelainanMgm_McuID = v_mgm_mcuid
AND Mcu_KelainanID = OLD.Mcu_KelainanID;
DELETE FROM cpone_dashboard.kelainan_summary
WHERE Mgm_McuID = v_mgm_mcuid
AND Mcu_KelainanID = OLD.Mcu_KelainanID;
END IF;
END IF;
END$$
DELIMITER ;

View File

@@ -0,0 +1,35 @@
#!/usr/bin/env bash
set -euo pipefail
TOKEN="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJNX1VzZXJJRCI6IjIiLCJNX1VzZXJFbWFpbCI6Impva29AZ21haWwuY29tIiwiTV9Vc2VyVXNlcm5hbWUiOiJqb2tvQGdtYWlsLmNvbSIsIk1fVXNlckdyb3VwRGFzaGJvYXJkIjoib25lLXVpXC90ZXN0XC92dWV4XC9vbmUtbWQtdXNlcmdyb3VwLXVzZXItdjVcLyIsIk1fVXNlckRlZmF1bHRUX1NhbXBsZVN0YXRpb25JRCI6IjEiLCJNX1N0YWZmTmFtZSI6IkFkbWluIENQT05FIiwiaXNfY291cmllciI6Ik4iLCJNX0JyYW5jaElEIjoiMTAiLCJNX0JyYW5jaE5hbWUiOiJMYWJvcmF0b3JpdW0gTWFrYXNzYXIiLCJ0aW1lX2F1dG9sb2dvdXQiOiIxNSIsImlwIjoiMTI4LjE5OS44Ni43IiwiYWdlbnQiOiJHby1odHRwLWNsaWVudFwvMS4xIiwidmVyc2lvbiI6InYyIiwibGFzdC1sb2dpbiI6IjIwMjYtMDUtMDYgMTY6MDA6MzYifQ.YoDFYB-uayRtGSqGeapbo9EbvtHx_RcvNLlXDNwVk4s"
COOKIE="cpone_session=ZmFqcmk.4VydTLnAE5nMiudJXBPrlz1MqzQbA38R6JGiawYu5zI; cpone_project_mcu_id=1583; token=${TOKEN}"
ORDER_IDS=$(ssh -o BatchMode=yes one@devcpone.aplikasi.web.id "mysql -N -D cpone -e \"SELECT DISTINCT pp.Mcu_PreregisterPatientsT_OrderHeaderID FROM mcu_preregister_patients pp JOIN mcu_preregister_date pd ON pd.Mcu_PreregisterDateMcu_PreregisterPatientsID=pp.Mcu_PreregisterPatientsID AND pd.Mcu_PreregisterDateIsActive='Y' JOIN t_orderheader oh ON oh.T_OrderHeaderID=pp.Mcu_PreregisterPatientsT_OrderHeaderID AND oh.T_OrderHeaderIsActive='Y' WHERE pp.Mcu_PreregisterPatientsMgm_McuID=1583 AND pd.Mcu_PreregisterDateCheckinSchedule='2026-05-05' AND pp.Mcu_PreregisterPatientsIsActive='Y' ORDER BY pp.Mcu_PreregisterPatientsT_OrderHeaderID;\"")
ok=0
val_fail=0
gen_fail=0
sync_fail=0
total=0
for OID in $ORDER_IDS; do
total=$((total+1))
RESP=$(curl -sS "https://devcpone.aplikasi.web.id/one-api/mockup/mcuoffline/Resumeindividucponev7/generateFitnessCategory" \
-H "Accept: application/json, text/plain, */*" \
-H "Content-Type: application/json;charset=UTF-8" \
-H "Cookie: ${COOKIE}" \
--data-raw "{\"token\":\"${TOKEN}\",\"orderid\":\"${OID}\",\"kesimpulan\":\"\",\"rekomendasi\":\"\",\"saran\":\"\",\"conclusion\":\"\",\"recomendation\":\"\",\"advice\":\"\"}")
if echo "$RESP" | grep -q '"status":"OK"'; then
if ssh -o BatchMode=yes one@devcpone.aplikasi.web.id "mysql -N -D cpone -e \"CALL cpone.sp_sync_kelainan_details_by_orderheader(${OID});\"" >/dev/null 2>&1; then
ok=$((ok+1))
else
sync_fail=$((sync_fail+1))
fi
elif echo "$RESP" | grep -q 'belum di validasi'; then
val_fail=$((val_fail+1))
else
gen_fail=$((gen_fail+1))
fi
done
echo "RESULT total=${total} ok=${ok} val_fail=${val_fail} gen_fail=${gen_fail} sync_fail=${sync_fail}"