From 3d50bcf7f10e225f5098cea4582e3dc01110a6c8 Mon Sep 17 00:00:00 2001 From: "sas.fajri" Date: Wed, 6 May 2026 16:51:53 +0700 Subject: [PATCH] Fix MCU dummy generation and participant dedup --- .../cpone/SendEmailPreregister.php | 13 +- .../mcuoffline/Resumeindividucponev7.php | 28 +- scripts/run_generate_kelainan_and_sync.sh | 162 +++ ...reate_sp_refresh_mcu_participant_daily.sql | 2 +- ...ate_sp_dummy_mcu_transaction_generator.sql | 1037 +++++++++++++++++ 5 files changed, 1224 insertions(+), 18 deletions(-) create mode 100755 scripts/run_generate_kelainan_and_sync.sh create mode 100644 scripts/sql/2026-05-06_create_sp_dummy_mcu_transaction_generator.sql diff --git a/application/controllers/cpone/SendEmailPreregister.php b/application/controllers/cpone/SendEmailPreregister.php index b5fa335..747633a 100644 --- a/application/controllers/cpone/SendEmailPreregister.php +++ b/application/controllers/cpone/SendEmailPreregister.php @@ -326,7 +326,8 @@ class SendEmailPreregister extends MY_Controller $data_send_patients = $que_patients->result_array(); $sql_notif_config = "SELECT - Email_ConfigNofificationTemplate + Email_ConfigNofificationTemplate, + Email_ConfigNofificationSender FROM email_config_nofification WHERE Email_ConfigNofificationIsActive = 'Y' ORDER BY Email_ConfigNofificationID DESC @@ -571,6 +572,12 @@ class SendEmailPreregister extends MY_Controller $recipient = json_encode([ ["name" => $patient['nama_pasien'], "email" => $targetEmail] ]); + $senderEmail = isset($notifConfig['Email_ConfigNofificationSender']) + ? trim((string)$notifConfig['Email_ConfigNofificationSender']) + : ''; + $sendCC = $senderEmail !== '' + ? json_encode([["name" => $senderEmail, "email" => $senderEmail]]) + : NULL; $sql_cek_outbox = "SELECT PreregisterEmailOutboxID FROM preregister_email_outbox @@ -598,7 +605,7 @@ class SendEmailPreregister extends MY_Controller $que_insert_outbox = $this->db->query($sql_insert_outbox, [ $subject, $recipient, - NULL, + $sendCC, $body, 'PREREGIST', $patient['preregister_id'] @@ -620,7 +627,7 @@ class SendEmailPreregister extends MY_Controller $que_update_outbox = $this->db->query($sql_update_outbox, [ $subject, $recipient, - NULL, + $sendCC, $body, $cek_outbox[0]['PreregisterEmailOutboxID'] ]); diff --git a/application/controllers/mockup/mcuoffline/Resumeindividucponev7.php b/application/controllers/mockup/mcuoffline/Resumeindividucponev7.php index 9971c57..4a5a619 100644 --- a/application/controllers/mockup/mcuoffline/Resumeindividucponev7.php +++ b/application/controllers/mockup/mcuoffline/Resumeindividucponev7.php @@ -1131,10 +1131,10 @@ class Resumeindividucponev7 extends MY_Controller T_OrderDetailT_TestSasCode AS testSasCode, T_OrderDetailT_TestName AS testName, T_OrderDetailResult AS result, - Nat_SubSubGroupID AS subGroupID, + IFNULL(Nat_SubSubGroupID, 0) AS subGroupID, T_OrderDetailMinValue AS minValues, T_OrderDetailMaxValue AS maxValues, - Nat_SubSubGroupName AS groupName, + IFNULL(Nat_SubSubGroupName, T_OrderDetailT_TestName) AS groupName, T_TestNat_TestID AS natTestID, T_TestIsQuantitative as isKuantitatif, CASE @@ -1167,8 +1167,8 @@ class Resumeindividucponev7 extends MY_Controller JOIN t_test ON T_OrderDetailT_TestID = T_TestID JOIN nat_test ON T_TestNat_TestID = Nat_TestID - JOIN nat_subsubgroup - ON T_TestNat_SubSubGroupID = Nat_SubSubGroupID + LEFT JOIN nat_subsubgroup + ON T_TestNat_SubSubGroupID = Nat_SubSubGroupID LEFT JOIN mcu_resume ON T_OrderDetailT_OrderHeaderID = Mcu_ResumeT_OrderHeaderID AND Mcu_ResumeIsActive = 'Y' @@ -1375,10 +1375,10 @@ class Resumeindividucponev7 extends MY_Controller T_OrderDetailT_TestSasCode AS testSasCode, T_OrderDetailT_TestName AS testName, T_OrderDetailResult AS result, - Nat_SubSubGroupID AS subGroupID, + IFNULL(Nat_SubSubGroupID, 0) AS subGroupID, T_OrderDetailMinValue AS minValues, T_OrderDetailMaxValue AS maxValues, - Nat_SubSubGroupName AS groupName, + IFNULL(Nat_SubSubGroupName, T_OrderDetailT_TestName) AS groupName, T_TestNat_TestID AS natTestID, T_TestIsQuantitative as isKuantitatif, CASE @@ -1411,8 +1411,8 @@ class Resumeindividucponev7 extends MY_Controller JOIN t_test ON T_OrderDetailT_TestID = T_TestID JOIN nat_test ON T_TestNat_TestID = Nat_TestID - JOIN nat_subsubgroup - ON T_TestNat_SubSubGroupID=Nat_SubSubGroupID + LEFT JOIN nat_subsubgroup + ON T_TestNat_SubSubGroupID=Nat_SubSubGroupID LEFT JOIN mcu_resume ON T_OrderDetailT_OrderHeaderID = Mcu_ResumeT_OrderHeaderID AND Mcu_ResumeIsActive = 'Y' @@ -2300,12 +2300,12 @@ class Resumeindividucponev7 extends MY_Controller Mcu_ResumeStatus, Mcu_ResumeMcu_FitnessCategoryID, Mcu_ResumeCreated, - Mcu_ResumeUserID, - Mcu_ResumeKesimpulan, - Mcu_ResumeRekomendasi, - Mcu_ResumeSaran, - ) - VALUES(?,'NEW',?,NOW(),?,?,?,?)"; + Mcu_ResumeUserID, + Mcu_ResumeKesimpulan, + Mcu_ResumeRekomendasi, + Mcu_ResumeSaran + ) + VALUES(?,'NEW',?,NOW(),?,?,?,?)"; $query = $this->db_onedev->query($sql, [ $id, $fitnessID, diff --git a/scripts/run_generate_kelainan_and_sync.sh b/scripts/run_generate_kelainan_and_sync.sh new file mode 100755 index 0000000..342050a --- /dev/null +++ b/scripts/run_generate_kelainan_and_sync.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Usage examples: +# 1) Single preregister: +# ./scripts/run_generate_kelainan_and_sync.sh \ +# --preregister-id 77502 \ +# --token 'JWT_TOKEN' \ +# --cookie 'cpone_session=...; token=...' +# +# 2) Multi by MCU + date: +# ./scripts/run_generate_kelainan_and_sync.sh \ +# --mcu-id 1583 --date 2026-05-05 \ +# --token 'JWT_TOKEN' \ +# --cookie 'cpone_session=...; token=...' +# +# Optional: +# --base-url https://devcpone.aplikasi.web.id +# --ssh-host one@devcpone.aplikasi.web.id + +BASE_URL="https://devcpone.aplikasi.web.id" +SSH_HOST="one@devcpone.aplikasi.web.id" +PREREGISTER_ID="" +MCU_ID="" +SCHEDULE_DATE="" +TOKEN="" +COOKIE="" + +KESIMPULAN=$'- Anemia\n- Peningkatan LED\n- Penurunan HDL Kolesterol\n- Presbiopia ODS\n' +REKOMENDASI="Sedang" +SARAN=$'1. Konsul ke dokter gigi untuk membersihkan karang gigi dan kemungkinan\n membuat gigi palsu\n2. Intake vitamin yang mengandung zat besi untuk memperbaiki kadar\n Hemoglobin dalam darah\n3. Ulang pemeriksaan LED, bila tidak ada perbaikan konsul ke dokter untuk\n mencari kemungkinan adanya fokus infeksi\n4. Lakukan olah raga secara teratur\n5. Sebaiknya hentikan kebiasaan merokok' +CONCLUSION=$'- Anemia\n- Elevated of ESR\n- Decreased HDL Cholesterol level\n- Presbiopia ODS\n' +RECOMENDATION="Fit with note" +ADVICE="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --preregister-id) PREREGISTER_ID="${2:-}"; shift 2 ;; + --mcu-id) MCU_ID="${2:-}"; shift 2 ;; + --date) SCHEDULE_DATE="${2:-}"; shift 2 ;; + --token) TOKEN="${2:-}"; shift 2 ;; + --cookie) COOKIE="${2:-}"; shift 2 ;; + --base-url) BASE_URL="${2:-}"; shift 2 ;; + --ssh-host) SSH_HOST="${2:-}"; shift 2 ;; + --kesimpulan) KESIMPULAN="${2:-}"; shift 2 ;; + --rekomendasi) REKOMENDASI="${2:-}"; shift 2 ;; + --saran) SARAN="${2:-}"; shift 2 ;; + --conclusion) CONCLUSION="${2:-}"; shift 2 ;; + --recomendation) RECOMENDATION="${2:-}"; shift 2 ;; + --advice) ADVICE="${2:-}"; shift 2 ;; + *) echo "Unknown arg: $1" >&2; exit 1 ;; + esac +done + +if [[ -z "$TOKEN" || -z "$COOKIE" ]]; then + echo "token dan cookie wajib diisi" >&2 + exit 1 +fi + +if [[ -n "$PREREGISTER_ID" ]]; then + MODE="single" +elif [[ -n "$MCU_ID" && -n "$SCHEDULE_DATE" ]]; then + MODE="multi" +else + echo "Gunakan --preregister-id ATAU --mcu-id + --date" >&2 + exit 1 +fi + +get_order_ids_sql_single=" +SELECT DISTINCT pp.Mcu_PreregisterPatientsT_OrderHeaderID +FROM cpone.mcu_preregister_patients pp +WHERE pp.Mcu_PreregisterPatientsID = ${PREREGISTER_ID} + AND pp.Mcu_PreregisterPatientsIsActive = 'Y' + AND IFNULL(pp.Mcu_PreregisterPatientsT_OrderHeaderID,0) > 0; +" + +get_order_ids_sql_multi=" +SELECT DISTINCT pp.Mcu_PreregisterPatientsT_OrderHeaderID +FROM cpone.mcu_preregister_patients pp +JOIN cpone.mcu_preregister_date pd + ON pd.Mcu_PreregisterDateMcu_PreregisterPatientsID = pp.Mcu_PreregisterPatientsID + AND pd.Mcu_PreregisterDateIsActive = 'Y' +JOIN cpone.t_orderheader oh + ON oh.T_OrderHeaderID = pp.Mcu_PreregisterPatientsT_OrderHeaderID + AND oh.T_OrderHeaderIsActive = 'Y' +WHERE pp.Mcu_PreregisterPatientsMgm_McuID = ${MCU_ID} + AND pd.Mcu_PreregisterDateCheckinSchedule = '${SCHEDULE_DATE}' + AND pp.Mcu_PreregisterPatientsIsActive = 'Y' + AND IFNULL(pp.Mcu_PreregisterPatientsT_OrderHeaderID,0) > 0; +" + +if [[ "$MODE" == "single" ]]; then + SQL="$get_order_ids_sql_single" +else + SQL="$get_order_ids_sql_multi" +fi + +echo "Ambil orderid target..." +ORDER_IDS="$(ssh -o BatchMode=yes "$SSH_HOST" "mysql -N -e \"$SQL\"")" + +if [[ -z "$ORDER_IDS" ]]; then + echo "Tidak ada orderid target yang ditemukan." >&2 + exit 1 +fi + +echo "Order target:" +echo "$ORDER_IDS" | sed 's/^/- /' + +API_URL="${BASE_URL}/one-api/mockup/mcuoffline/Resumeindividucponev7/generateFitnessCategory" + +SUCCESS=0 +FAILED=0 + +while IFS= read -r ORDER_ID; do + [[ -z "$ORDER_ID" ]] && continue + echo "" + echo "Processing orderid=${ORDER_ID} ..." + + PAYLOAD="$(cat < 0 AND pp.Mcu_PreregisterPatientsID = p_preregister_id) + OR + (p_preregister_id = 0 + AND p_mcu_id > 0 + AND pp.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id + AND pd.Mcu_PreregisterDateCheckinSchedule = p_schedule_date) + ); + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1; + + IF p_preregister_id = 0 AND (p_mcu_id <= 0 OR p_schedule_date IS NULL) THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Gunakan preregister_id, atau mcu_id + date'; + END IF; + + 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; + IF v_done = 1 THEN + LEAVE read_loop; + END IF; + + SET v_source_order_id = 0; + SET v_effective_date = p_schedule_date; + + IF v_effective_date IS NULL OR v_effective_date = '0000-00-00' THEN + SELECT pd.Mcu_PreregisterDateCheckinSchedule + INTO v_effective_date + FROM cpone.mcu_preregister_date pd + WHERE pd.Mcu_PreregisterDateMcu_PreregisterPatientsID = v_preregister_id + AND pd.Mcu_PreregisterDateIsActive = 'Y' + ORDER BY pd.Mcu_PreregisterDateCheckinSchedule ASC + LIMIT 1; + END IF; + + IF v_effective_date IS NULL OR v_effective_date = '0000-00-00' THEN + 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 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; + + 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') + ); + + INSERT INTO cpone.t_orderheader ( + T_OrderHeaderM_BranchID, + T_OrderHeaderM_StatusCode, + T_OrderHeaderDate, + T_OrderHeaderLabNumber, + T_OrderHeaderM_PatientID, + T_OrderHeaderCorporateID, + T_OrderHeaderMgm_McuID, + T_OrderHeaderM_PatientAge, + T_OrderHeaderPjM_DoctorID, + T_OrderHeaderSubTotal, + T_OrderHeaderRounding, + T_OrderHeaderTotal, + T_OrderHeaderCreated, + T_OrderHeaderCreatedUserID, + T_OrderHeaderLastUpdated, + T_OrderHeaderLastUpdatedUserID, + T_OrderHeaderIsActive + ) + SELECT + oh.T_OrderHeaderM_BranchID, + 'RG', + CONCAT(v_effective_date, ' 07:30:00'), + v_lab_number, + v_patient_id, + v_corporate_id, + v_mcu_id, + oh.T_OrderHeaderM_PatientAge, + oh.T_OrderHeaderPjM_DoctorID, + oh.T_OrderHeaderSubTotal, + oh.T_OrderHeaderRounding, + oh.T_OrderHeaderTotal, + NOW(), + p_user_id, + NOW(), + p_user_id, + 'Y' + FROM cpone.t_orderheader oh + WHERE oh.T_OrderHeaderID = v_source_order_id + LIMIT 1; + + SET v_new_order_id = LAST_INSERT_ID(); + + CALL cpone.sp_clone_order_transaction_dummy( + v_source_order_id, + v_new_order_id, + p_user_id, + v_effective_date + ); + + UPDATE cpone.mcu_preregister_patients + SET Mcu_PreregisterPatientsT_OrderHeaderID = v_new_order_id, + Mcu_PreregisterPatientsIsRegistered = 'Y', + Mcu_PreregisterPatientsLastUpdated = NOW() + WHERE Mcu_PreregisterPatientsID = v_preregister_id; + + CALL cpone.sp_upsert_mcu_patient_by_preregister_id(v_preregister_id); + CALL cpone.sp_refresh_mcu_participant_daily_by_mcu_date(v_mcu_id, v_effective_date); + + INSERT INTO cpone_dashboard.mcu_station_progress ( + Mcu_StationProgressOrderID, + Mcu_StationProgressPreregisterID, + Mcu_StationProgressMcuID, + Mcu_StationProgressStationID, + Mcu_StationProgressStationName, + Mcu_StationProgressSource, + Mcu_StationProgressCheckinDate, + Mcu_StationProgressSamplingAt, + Mcu_StationProgressReceiveAt, + Mcu_StationProgressProcessAt, + Mcu_StationProgressDoneAt, + Mcu_StationProgressSyncedAt + ) + SELECT + os.T_OrderSampleT_OrderHeaderID, + v_preregister_id, + v_mcu_id, + os.T_OrderSampleT_SampleStationID, + ss.T_SampleStationName, + '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')), + CONCAT(os.T_OrderSampleProcessingDate, ' ', IFNULL(os.T_OrderSampleProcessingTime, '00:00:00')), + CONCAT(sso.T_SamplingSoDoneDate, ' ', IFNULL(sso.T_SamplingSoDoneTime, '00:00:00')), + NOW() + FROM cpone.t_ordersample os + LEFT 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' + LEFT JOIN cpone.t_samplestation ss + ON ss.T_SampleStationID = os.T_OrderSampleT_SampleStationID + WHERE os.T_OrderSampleT_OrderHeaderID = v_new_order_id + AND os.T_OrderSampleIsActive = 'Y' + ON DUPLICATE KEY UPDATE + Mcu_StationProgressPreregisterID = VALUES(Mcu_StationProgressPreregisterID), + Mcu_StationProgressMcuID = VALUES(Mcu_StationProgressMcuID), + Mcu_StationProgressStationName = VALUES(Mcu_StationProgressStationName), + Mcu_StationProgressCheckinDate = VALUES(Mcu_StationProgressCheckinDate), + Mcu_StationProgressSamplingAt = VALUES(Mcu_StationProgressSamplingAt), + Mcu_StationProgressReceiveAt = VALUES(Mcu_StationProgressReceiveAt), + Mcu_StationProgressProcessAt = VALUES(Mcu_StationProgressProcessAt), + Mcu_StationProgressDoneAt = VALUES(Mcu_StationProgressDoneAt), + Mcu_StationProgressSyncedAt = VALUES(Mcu_StationProgressSyncedAt); + END LOOP; + CLOSE cur_target; + + SELECT 'OK' AS status, 'dummy transaksi selesai dibuat' AS message; +END$$ +DELIMITER ; + +/* +Cara pakai: +1) Single patient: + CALL cpone.sp_generate_dummy_mcu_transactions(77502, 0, NULL, 1); + +2) Multi by MCU + date: + CALL cpone.sp_generate_dummy_mcu_transactions(0, 1583, '2026-05-05', 1); +*/