From 3cde1b3cdb168c403b9bca82b300f4fe6f23ba98 Mon Sep 17 00:00:00 2001 From: "sas.fajri" Date: Wed, 6 May 2026 22:01:57 +0700 Subject: [PATCH] Update MCU sync, dummy generator, and kelainan trigger --- AGENTS.md | 16 ++ .../mcuoffline/Resumeindividucponev7.php | 176 ++++++++++--- claude.md | 10 + ...ate_sp_dummy_mcu_transaction_generator.sql | 232 +++++++++++++----- ..._trigger_kelainan_details_auto_summary.sql | 204 +++++++++++++++ scripts/tmp_rerun_kelainan_1583.sh | 35 +++ 6 files changed, 575 insertions(+), 98 deletions(-) create mode 100644 AGENTS.md create mode 100644 claude.md create mode 100644 scripts/sql/2026-05-06_create_trigger_kelainan_details_auto_summary.sql create mode 100755 scripts/tmp_rerun_kelainan_1583.sh diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..eac93f9 --- /dev/null +++ b/AGENTS.md @@ -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. diff --git a/application/controllers/mockup/mcuoffline/Resumeindividucponev7.php b/application/controllers/mockup/mcuoffline/Resumeindividucponev7.php index 4a5a619..795a37e 100644 --- a/application/controllers/mockup/mcuoffline/Resumeindividucponev7.php +++ b/application/controllers/mockup/mcuoffline/Resumeindividucponev7.php @@ -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; diff --git a/claude.md b/claude.md new file mode 100644 index 0000000..0a8dd8a --- /dev/null +++ b/claude.md @@ -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. diff --git a/scripts/sql/2026-05-06_create_sp_dummy_mcu_transaction_generator.sql b/scripts/sql/2026-05-06_create_sp_dummy_mcu_transaction_generator.sql index b7e2412..78e20f6 100644 --- a/scripts/sql/2026-05-06_create_sp_dummy_mcu_transaction_generator.sql +++ b/scripts/sql/2026-05-06_create_sp_dummy_mcu_transaction_generator.sql @@ -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; diff --git a/scripts/sql/2026-05-06_create_trigger_kelainan_details_auto_summary.sql b/scripts/sql/2026-05-06_create_trigger_kelainan_details_auto_summary.sql new file mode 100644 index 0000000..590dd47 --- /dev/null +++ b/scripts/sql/2026-05-06_create_trigger_kelainan_details_auto_summary.sql @@ -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 ; diff --git a/scripts/tmp_rerun_kelainan_1583.sh b/scripts/tmp_rerun_kelainan_1583.sh new file mode 100755 index 0000000..1a690d5 --- /dev/null +++ b/scripts/tmp_rerun_kelainan_1583.sh @@ -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}"