diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 677fef5..79fd661 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -7,7 +7,10 @@ "Bash(ssh *)", "Bash(curl -s https://devcpone.aplikasi.web.id/one-api/mockup/resultentrysoelectromedis-v9-cpone/resultentry/search -H 'Accept: application/json, text/plain, */*' -H 'Content-Type: application/json;charset=UTF-8' -b 'cpone_project_mcu_id=1583; token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJNX1VzZXJJRCI6IjIiLCJNX1VzZXJFbWFpbCI6Impva29AZ21haWwuY29tIiwiTV9Vc2VyVXNlcm5hbWUiOiJqb2tvQGdtYWlsLmNvbSIsIk1fVXNlckdyb3VwRGFzaGJvYXJkIjoib25lLXVpXC90ZXN0XC92dWV4XC9vbmUtbWN1LW9mZmxpbmUtcHJlcmVnaXN0ZXItYXBwLWNwb25ldjhcLyIsIk1fVXNlckRlZmF1bHRUX1NhbXBsZVN0YXRpb25JRCI6IjEiLCJNX1N0YWZmTmFtZSI6IkFkbWluIENQT05FIiwiaXNfY291cmllciI6Ik4iLCJNX0JyYW5jaElEIjoiMTAiLCJNX0JyYW5jaE5hbWUiOiJMYWJvcmF0b3JpdW0gTWFrYXNzYXIiLCJ0aW1lX2F1dG9sb2dvdXQiOiIxNSIsImlwIjoiMTI4LjE5OS44Ni43IiwiYWdlbnQiOiJHby1odHRwLWNsaWVudFwvMS4xIiwidmVyc2lvbiI6InYyIiwibGFzdC1sb2dpbiI6IjIwMjYtMDUtMTEgMTM6NTg6MjIifQ.HL_TvRA5GaaL2X5NnJHDMQkRqWlbHE-fssgarBYWZSY' --data-raw '{\"startdate\":\"2026-05-11\",\"companyid\":0,\"switch_exclude\":false,\"search\":\"\",\"stationid\":\"1675\",\"groupid\":2,\"subgroupid\":0,\"current_page\":1,\"lastid\":-1,\"token\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJNX1VzZXJJRCI6IjIiLCJNX1VzZXJFbWFpbCI6Impva29AZ21haWwuY29tIiwiTV9Vc2VyVXNlcm5hbWUiOiJqb2tvQGdtYWlsLmNvbSIsIk1fVXNlckdyb3VwRGFzaGJvYXJkIjoib25lLXVpXC90ZXN0XC92dWV4XC9vbmUtbWN1LW9mZmxpbmUtcHJlcmVnaXN0ZXItYXBwLWNwb25ldjhcLyIsIk1fVXNlckRlZmF1bHRUX1NhbXBsZVN0YXRpb25JRCI6IjEiLCJNX1N0YWZmTmFtZSI6IkFkbWluIENQT05FIiwiaXNfY291cmllciI6Ik4iLCJNX0JyYW5jaElEIjoiMTAiLCJNX0JyYW5jaE5hbWUiOiJMYWJvcmF0b3JpdW0gTWFrYXNzYXIiLCJ0aW1lX2F1dG9sb2dvdXQiOiIxNSIsImlwIjoiMTI4LjE5OS44Ni43IiwiYWdlbnQiOiJHby1odHRwLWNsaWVudFwvMS4xIiwidmVyc2lvbiI6InYyIiwibGFzdC1sb2dpbiI6IjIwMjYtMDUtMTEgMTM6NTg6MjIifQ.HL_TvRA5GaaL2X5NnJHDMQkRqWlbHE-fssgarBYWZSY\"}')", "Bash(python3 -m json.tool)", - "Bash(scp *)" + "Bash(scp *)", + "Bash(mysql *)", + "Bash(MYSQL_PWD='Sasone!102938' mysql *)", + "Bash(chmod +x *)" ] } } diff --git a/AGENTS.md b/AGENTS.md index b75f8f0..6272d60 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -21,6 +21,9 @@ - Contoh: `6D9QD6 - buat api baru` - Jangan buat commit tanpa kode task dari user. - Kode task digunakan untuk sinkronisasi timesheet Odoo. +- Sebelum push branch kerja, jalankan `git fetch origin` lalu `git rebase origin/main` agar branch memakai basis `main` terbaru. +- Push branch kerja ke remote lalu buat merge request ke `main`; proses merge ikuti permission dan alur review repo, jangan direct push ke `main` kecuali diminta eksplisit. +- Jangan pernah melakukan `git push --force` atau varian force-push lain. ## Devcpone Sync Hook - Repo ini memakai `core.hooksPath=.githooks`. @@ -28,3 +31,12 @@ - Hook memanggil `scripts/devcpone_sync.sh` untuk upload diff commit terakhir ke `/home/one/project/one/one-api`. - Jika sync atau verifikasi file remote gagal, `push` harus ikut gagal; jangan anggap `git push` sukses lokal sebagai bukti file sudah masuk ke `devcpone`. - Saat user minta cek sinkronisasi, verifikasi langsung file di `devcpone`, bukan hanya status git lokal. + +## Cpone Upload (Manual) +- Upload ke `cpone` **hanya dilakukan saat user secara eksplisit meminta** ("upload ke cpone", "sync ke cpone", dll). +- Jalankan script: `scripts/cpone_sync.sh` +- Script menggunakan SSH key `~/.ssh/id_rsa` ke `one@cpone.aplikasi.web.id`. +- Target remote: `/home/one/project/one/one-api`. +- **Tidak ada hook otomatis** untuk cpone — upload selalu manual atas permintaan user. +- Sebelum upload, script otomatis backup file lama di folder yang sama dengan suffix timestamp, contoh: `Transactionv3.php.20260529_195950`. +- Setelah upload, verifikasi file di server remote, bukan hanya lokal. diff --git a/application/controllers/ais/Transactionv2.php b/application/controllers/ais/Transactionv2.php index 536aae8..5e3bbb1 100644 --- a/application/controllers/ais/Transactionv2.php +++ b/application/controllers/ais/Transactionv2.php @@ -618,7 +618,6 @@ class Transactionv2 extends MY_Controller LEFT JOIN t_packet ON T_OrderDetailOrderT_PacketID = T_PacketID AND T_PacketIsActive = 'Y' LEFT JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_PacketID AND T_PacketDetailT_TestID = T_OrderDetailT_TestID AND T_PacketIsActive = 'Y' AND T_PacketDetailIsActive = 'Y' - LEFT JOIN f_payment ON T_OrderHeaderID = F_PaymentT_OrderHeaderID AND F_PaymentIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' @@ -1158,7 +1157,6 @@ class Transactionv2 extends MY_Controller LEFT JOIN t_packet ON T_OrderDetailOrderT_PacketID = T_PacketID AND T_PacketIsActive = 'Y' LEFT JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_PacketID AND T_PacketDetailT_TestID = T_OrderDetailT_TestID AND T_PacketIsActive = 'Y' AND T_PacketDetailIsActive = 'Y' - LEFT JOIN f_payment ON T_OrderHeaderID = F_PaymentT_OrderHeaderID AND F_PaymentIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' @@ -1955,7 +1953,6 @@ class Transactionv2 extends MY_Controller LEFT JOIN t_packet ON T_OrderDetailOrderT_PacketID = T_PacketID AND T_PacketIsActive = 'Y' LEFT JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_PacketID AND T_PacketDetailT_TestID = T_OrderDetailT_TestID AND T_PacketIsActive = 'Y' AND T_PacketDetailIsActive = 'Y' - LEFT JOIN f_payment ON T_OrderHeaderID = F_PaymentT_OrderHeaderID AND F_PaymentIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' @@ -2455,7 +2452,6 @@ class Transactionv2 extends MY_Controller LEFT JOIN t_packet ON T_OrderDetailOrderT_PacketID = T_PacketID AND T_PacketIsActive = 'Y' LEFT JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_PacketID AND T_PacketDetailT_TestID = T_OrderDetailT_TestID AND T_PacketIsActive = 'Y' AND T_PacketDetailIsActive = 'Y' - LEFT JOIN f_payment ON T_OrderHeaderID = F_PaymentT_OrderHeaderID AND F_PaymentIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' @@ -2903,7 +2899,6 @@ class Transactionv2 extends MY_Controller JOIN corporate ON CorporateID = T_OrderHeaderCorporateID JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID JOIN m_doctor doctorlab ON T_OrderHeaderPjM_DoctorID = M_DoctorID - LEFT JOIN f_payment ON T_OrderHeaderID = F_PaymentT_OrderHeaderID AND F_PaymentIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' @@ -2955,7 +2950,6 @@ class Transactionv2 extends MY_Controller JOIN corporate ON CorporateID = T_OrderHeaderCorporateID JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID JOIN m_doctor doctorlab ON T_OrderHeaderPjM_DoctorID = M_DoctorID - LEFT JOIN f_payment ON T_OrderHeaderID = F_PaymentT_OrderHeaderID AND F_PaymentIsActive = 'Y' WHERE `T_OrderDetailOrderT_OrderHeaderID` = ? AND `T_OrderDetailOrderIsPacket` = 'N' AND T_OrderDetailOrderIsActive = 'Y' ) AS t_orderdetailorder"; diff --git a/application/controllers/ais/Transactionv3.php b/application/controllers/ais/Transactionv3.php index 0c91590..0f04b1d 100644 --- a/application/controllers/ais/Transactionv3.php +++ b/application/controllers/ais/Transactionv3.php @@ -618,7 +618,6 @@ class Transactionv3 extends MY_Controller LEFT JOIN t_packet ON T_OrderDetailOrderT_PacketID = T_PacketID AND T_PacketIsActive = 'Y' LEFT JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_PacketID AND T_PacketDetailT_TestID = T_OrderDetailT_TestID AND T_PacketIsActive = 'Y' AND T_PacketDetailIsActive = 'Y' - LEFT JOIN f_payment ON T_OrderHeaderID = F_PaymentT_OrderHeaderID AND F_PaymentIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' @@ -1163,7 +1162,6 @@ class Transactionv3 extends MY_Controller LEFT JOIN t_packet ON T_OrderDetailOrderT_PacketID = T_PacketID AND T_PacketIsActive = 'Y' LEFT JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_PacketID AND T_PacketDetailT_TestID = T_OrderDetailT_TestID AND T_PacketIsActive = 'Y' AND T_PacketDetailIsActive = 'Y' - LEFT JOIN f_payment ON T_OrderHeaderID = F_PaymentT_OrderHeaderID AND F_PaymentIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' @@ -1960,7 +1958,6 @@ class Transactionv3 extends MY_Controller LEFT JOIN t_packet ON T_OrderDetailOrderT_PacketID = T_PacketID AND T_PacketIsActive = 'Y' LEFT JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_PacketID AND T_PacketDetailT_TestID = T_OrderDetailT_TestID AND T_PacketIsActive = 'Y' AND T_PacketDetailIsActive = 'Y' - LEFT JOIN f_payment ON T_OrderHeaderID = F_PaymentT_OrderHeaderID AND F_PaymentIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' @@ -2460,7 +2457,6 @@ class Transactionv3 extends MY_Controller LEFT JOIN t_packet ON T_OrderDetailOrderT_PacketID = T_PacketID AND T_PacketIsActive = 'Y' LEFT JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_PacketID AND T_PacketDetailT_TestID = T_OrderDetailT_TestID AND T_PacketIsActive = 'Y' AND T_PacketDetailIsActive = 'Y' - LEFT JOIN f_payment ON T_OrderHeaderID = F_PaymentT_OrderHeaderID AND F_PaymentIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' @@ -2908,7 +2904,6 @@ class Transactionv3 extends MY_Controller JOIN corporate ON CorporateID = T_OrderHeaderCorporateID JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID JOIN m_doctor doctorlab ON T_OrderHeaderPjM_DoctorID = M_DoctorID - LEFT JOIN f_payment ON T_OrderHeaderID = F_PaymentT_OrderHeaderID AND F_PaymentIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' @@ -2960,7 +2955,6 @@ class Transactionv3 extends MY_Controller JOIN corporate ON CorporateID = T_OrderHeaderCorporateID JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID JOIN m_doctor doctorlab ON T_OrderHeaderPjM_DoctorID = M_DoctorID - LEFT JOIN f_payment ON T_OrderHeaderID = F_PaymentT_OrderHeaderID AND F_PaymentIsActive = 'Y' WHERE `T_OrderDetailOrderT_OrderHeaderID` = ? AND `T_OrderDetailOrderIsPacket` = 'N' AND T_OrderDetailOrderIsActive = 'Y' ) AS t_orderdetailorder"; diff --git a/application/controllers/mockup/fo/cpone_registration_v17/Order.php b/application/controllers/mockup/fo/cpone_registration_v17/Order.php index 54183bc..26bc16d 100644 --- a/application/controllers/mockup/fo/cpone_registration_v17/Order.php +++ b/application/controllers/mockup/fo/cpone_registration_v17/Order.php @@ -632,7 +632,7 @@ foreach ($tests as $k => $v) { exit; } $xcount = $query->row()->xcount; - if($xcount > 1){ + if($xcount > 1){ continue; } @@ -795,7 +795,7 @@ foreach ($tests as $k => $v) { exit; } $xcount = $query->row()->xcount; - if($xcount > 1){ + if($xcount > 1){ continue; } $sqlt_orderdetail = "INSERT INTO t_orderdetail( diff --git a/application/controllers/mockup/mcuoffline/Trx_order.php b/application/controllers/mockup/mcuoffline/Trx_order.php new file mode 100644 index 0000000..51821e3 --- /dev/null +++ b/application/controllers/mockup/mcuoffline/Trx_order.php @@ -0,0 +1,419 @@ +load->helper(array('form', 'url')); + $this->db_onedev = $this->load->database("onedev", true); + $this->db_oneklinik = $this->load->database("onedev", true); + //$token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3lhbmtlcy5pdGIuYWMuaWQvZGV2LXNlcnZpY2VzL2FwaS9hdXRoL2xvZ2luIiwiaWF0IjoxNzU3NDY0NzY1LCJleHAiOjE3ODkwMDA3NjUsIm5iZiI6MTc1NzQ2NDc2NSwianRpIjoiM1ZVYXhKdHVMTFdNOGhjUiIsInN1YiI6Ijc3IiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.CO2LwPxt_KqYyLJXDY3UWtWBjmHosFBcd2UtVUpW9GM'; + + } + + + function get_order() { + $baseurl = 'https://yankes.itb.ac.id/data-services'; + $baseurl = 'https://yankes.itb.ac.id/dev-services'; + $url = $baseurl.'/api/pemeriksaan_mcu'; + $sql = "SELECT * FROM itb_yankes.sys_config WHERE SysConfigIsActive = 'Y' ORDER BY SysConfigID DESC LIMIT 1 "; + $qry = $this->db_onedev->query($sql); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + $dt_config = $qry->row_array(); + $token = $dt_config['SysConfigToken']; + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, array( + 'Authorization: Bearer ' . $token, + 'Content-Type: application/json' + )); + + // Eksekusi request cURL + $response = curl_exec($ch); + + // Debug: Cek error cURL + if (curl_errno($ch)) { + echo 'cURL Error: ' . curl_error($ch); + } + + curl_close($ch); + + // Kembalikan hasil response (jika perlu, decode JSON) + //echo $response; + + + /*$sql = "INSERT INTO itb_yankes.tmp_response( + response + ) + VALUES(?)"; + $qry = $this->db_onedev->query($sql,array($response)); + if(!$qry){ + $this->sys_error_db("save response", $this->db_onedev); + exit; + }*/ + $rspn = json_decode($response, true); + if($rspn['success'] == 1){ + $datas = $rspn['response_1']; + + if(count($datas) > 0){ + //print_r($datas); + foreach ($datas as $key => $value) { + if($value['nik']){ + $sql = "SELECT * FROM itb_yankes.download_order WHERE DownloadOrderNumber = ?"; + $qry = $this->db_onedev->query($sql,array($value['no_order'])); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + //echo $this->db_onedev->last_query(); + $exist_dt = $qry->result_array(); + if(count($exist_dt) == 0){ + $sql = "INSERT INTO itb_yankes.download_order ( + DownloadOrderNumber, + DownloadOrderDate, + DownloadOrderNIK, + DownloadOrderName, + DownloadOrderGender, + DownloadOrderDOB, + DownloadOrderJSON, + DownloadOrderCreated + ) VALUES(?,?,?,?,?,?,?,NOW()) "; + $qry = $this->db_onedev->query($sql,array( + $value['no_order'], + $value['tanggal_pemeriksaan'], + $value['nik'], + $value['nama_lengkap'], + $value['jenis_kelamin'], + $value['tanggal_lahir'], + json_encode($rspn) + )); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + //echo $this->db_onedev->last_query(); + $lastID = $this->db_onedev->insert_id(); + }else{ + $lastID = $exist_dt[0]['DownloadOrderID']; + $sql = "UPDATE itb_yankes.download_order SET + DownloadOrderNIK = ?, + DownloadOrderDOB = ?, + DownloadOrderJSON = ? + WHERE + DownloadOrderID = ? + "; + $qry = $this->db_onedev->query($sql,array( + $value['nik'], + $value['tanggal_lahir'], + json_encode($rspn), + $lastID)); + if(!$qry){ + $this->sys_error_db("update download_order error", $this->db_onedev); + exit; + } + + } + + $sql = "SELECT T_OrderHeaderID, M_PatientID,M_PatientIDNumber,DownloadOrderNIK,M_PatientDOB,DownloadOrderDOB + FROM t_orderheader + JOIN itb_yankes.sys_config ON T_OrderHeaderM_MouID IN (SysConfigM_MouID) + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID + JOIN itb_yankes.download_order + ON REPLACE(m_patient.M_PatientIDNumber, UNHEX('E2808C'), '') = TRIM(download_order.DownloadOrderNIK) + AND M_PatientDOB = DownloadOrderDOB + WHERE DownloadOrderID = ? AND T_OrderHeaderIsActive = 'Y'; + "; + $qry = $this->db_onedev->query($sql,array($lastID)); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + + $rows_order_lab = $qry->result_array(); + if(count($rows_order_lab)> 0){ + $data_map = $rows_order_lab[0]; + $sql = "UPDATE m_patient + SET M_PatientIDNumber = REPLACE(M_PatientIDNumber, UNHEX('E2808C'), '') + WHERE M_PatientID = ?"; + $qry = $this->db_onedev->query($sql,array($data_map['M_PatientID'])); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + + + $this->mapping_order($lastID,$data_map['T_OrderHeaderID'],$value['no_order'],555); + } + } + + + //echo json_encode($rspn); + + + } + $result = array( + + "records" => json_encode($rspn['response_1']) + ); + $this->sys_ok($result); + exit; + } + } + +} + +function mapping_order($orderID,$orderLabID,$noOrder,$userID){ + $sql = "INSERT INTO itb_yankes.order_map ( + orderMapDownloadOrderID, + orderMapT_OrderHeaderID, + orderMapCreated, + orderMapCreatedUserID + ) VALUES(?,?,NOW(),?)"; + $qry = $this->db_onedev->query($sql,array($orderID,$orderLabID,$userID)); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + + $this->update_status($orderID,'mapped'); + + $sql = "UPDATE t_orderheaderaddon SET T_OrderHeaderAddOnLabNumberOrigin = ? + WHERE T_OrderHeaderAddOnT_OrderHeaderID = ?"; + $qry = $this->db_onedev->query($sql,array($noOrder,$orderLabID)); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } +} + +function update_status($orderID,$status){ + $sql = "UPDATE itb_yankes.download_order SET DownloadOrderStatus = ? + WHERE DownloadOrderID = ?"; + $qry = $this->db_onedev->query($sql,array($status,$orderID)); + if(!$qry){ + $this->sys_error_db("update order error", $this->db_onedev); + exit; + } +} + +function send_result_all(){ + $sql="SELECT DownloadOrderID as order_id, + T_OrderDetailT_OrderHeaderID as order_lab_id, + DownloadOrderNIK as nik, + DownloadOrderName as patient_name, + DownloadOrderNumber as order_number, + T_OrderDetailT_TestCode as bisone_test_code, + test_yankes_code as yenkes_test_code, + test_name as yankes_test, + T_OrderDetailT_TestName as bisone_test, + T_OrderDetailResult as result + FROM t_orderdetail + JOIN itb_yankes.map_test ON T_OrderDetailT_TestCode = test_bisone_code + JOIN itb_yankes.order_map ON orderMapT_OrderHeaderID = T_OrderDetailT_OrderHeaderID + JOIN itb_yankes.download_order ON orderMapDownloadOrderID = DownloadOrderID AND + DownloadOrderStatus = 'mapped' + WHERE + T_OrderDetailT_TestIsResult = 'Y' AND + T_OrderDetailValidation = 'Y' AND + T_OrderDetailIsActive = 'Y' + GROUP BY T_OrderDetailT_OrderHeaderID"; + $qry = $this->db_onedev->query($sql); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + + $data_send = $qry->result_array(); + +} + +function send_result($orderLabID,$userID){ + $sql="SELECT DownloadOrderID as order_id, + T_OrderDetailT_OrderHeaderID as order_lab_id, + DownloadOrderNIK as nik, + DownloadOrderName as patient_name, + DownloadOrderNumber as order_number, + T_OrderDetailT_TestCode as bisone_test_code, + test_yankes_code as yenkes_test_code, + test_name as yankes_test, + T_OrderDetailT_TestName as bisone_test, + T_OrderDetailResult as result + FROM t_orderdetail + JOIN itb_yankes.map_test ON T_OrderDetailT_TestCode = test_bisone_code + JOIN itb_yankes.order_map ON orderMapT_OrderHeaderID = T_OrderDetailT_OrderHeaderID + JOIN itb_yankes.download_order ON orderMapDownloadOrderID = DownloadOrderID + WHERE + T_OrderDetailT_OrderHeaderID = ? AND + T_OrderDetailT_TestIsResult = 'Y' AND + T_OrderDetailValidation = 'Y' AND + T_OrderDetailIsActive = 'Y' + GROUP BY T_OrderDetailID + "; + $qry = $this->db_onedev->query($sql,[$orderLabID]); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + $details = $qry->result_array(); + if(count($details) > 0){ + $orderID = ''; + $no_order = ''; + $results = []; + foreach ($details as $key => $value) { + $orderID = $value['order_id']; + $no_order = $value['order_number']; + $results[] = ['test_id' => $value['yenkes_test_code'],'result' => $value['result'] ]; + } + + $json_dt = array( + array('no_order' => $no_order,'order_test' => $results) + ); + $this->do_send_results($orderID,$no_order,$json_dt,$userID); + } + +} + +function send_lab_results($json_data, $bearer_token) { + // Base URL + $baseUrl = 'https://yankes.itb.ac.id/data-services';// Ganti dengan base URL Anda + $baseUrl = 'https://yankes.itb.ac.id/dev-services'; + $url = $baseUrl . "/api/update_hasil_lab"; + + // Initialize cURL + $ch = curl_init($url); + + // Set cURL options + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Content-Type: application/json', + 'Authorization: Bearer ' . $bearer_token + ]); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($json_data)); + + // Execute cURL request + $response = curl_exec($ch); + + // Check for errors + if (curl_errno($ch)) { + echo 'cURL Error: ' . curl_error($ch); + } else { + // Decode the response if needed + $response_data = json_decode($response, true); + return $response_data; + //echo json_encode($response_data); + //print_r($response_data); + } + + // Close cURL session + curl_close($ch); +} + +function do_send_results($orderID,$no_order,$datas,$userID){ + // Contoh penggunaan fungsi + /*$json_data = [ + "params" => [ + [ + "no_order" => "B2B-ITB-a2q002687", + "order_test" => [ + ["test_id" => "A001HE", "result" => "15.2"], + ["test_id" => "A002HE", "result" => "44"], + ["test_id" => "A003HE", "result" => "3.9"], + // ... masukkan seluruh data lainnya sesuai kebutuhan + ] + ] + ] + ];*/ + + $json_data = [ + "params" => $datas + ]; + // Bearer token + //$bearer_token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wveWFua2VzLml0Yi5hYy5pZFwvZGV2LXNlcnZpY2VzXC9hcGlcL2F1dGhcL2xvZ2luIiwiaWF0IjoxNzI3MDg0NTcyLCJleHAiOjE3NTg2MjA1NzIsIm5iZiI6MTcyNzA4NDU3MiwianRpIjoiOWpGc3A0TmFIbnZWQkdrVyIsInN1YiI6NzcsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjcifQ.eduGs9bz64uD8paGYxJ1zxJ0du6lQ9yTFT7BzYTFg4A'; +// Ganti dengan token yang sesuai + //$bearer_token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3lhbmtlcy5pdGIuYWMuaWQvZGV2LXNlcnZpY2VzL2FwaS9hdXRoL2xvZ2luIiwiaWF0IjoxNzU3NDY0NzY1LCJleHAiOjE3ODkwMDA3NjUsIm5iZiI6MTc1NzQ2NDc2NSwianRpIjoiM1ZVYXhKdHVMTFdNOGhjUiIsInN1YiI6Ijc3IiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.CO2LwPxt_KqYyLJXDY3UWtWBjmHosFBcd2UtVUpW9GM"; + // Panggil fungsi untuk mengirim data + $sql = "SELECT * FROM itb_yankes.sys_config WHERE SysConfigIsActive = 'Y' ORDER BY SysConfigID DESC LIMIT 1 "; + $qry = $this->db_onedev->query($sql); + $dt_config = $qry->row_array(); + $bearer_token = $dt_config['SysConfigToken']; + + $rspn = $this->send_lab_results($json_data, $bearer_token); + if($rspn){ + $status = 'success'; + if(!$rspn['success']) + $status = 'failed'; + + $sql = "INSERT INTO itb_yankes.send_results ( + Send_ResultsOrderNumber, + SendResultsJsonBefore, + SendResultsJsonAfter, + SendResultsStatus, + SendResultsCreated, + SendResultsCreatedUserID + ) VALUES(?,?,?,?,NOW(),?)"; + $qry = $this->db_onedev->query($sql,[$no_order,json_encode($json_data),json_encode($rspn),$status,$userID]); + if(!$qry){ + $this->sys_error_db("insert send result error", $this->db_onedev); + exit; + } + + + $this->update_status($orderID,'send_result'); + + return $rspn; + } + + + +} + +function sendresultorder(){ + if (! $this->isLogin) { + $this->sys_error("Invalid Token"); + exit; + } + $prm = $this->sys_input; + $xuserid = $this->sys_user['M_UserID']; + $rspn = $this->send_result($prm['T_OrderHeaderID'],$xuserid); + $result = array( + + "records" => $rspn + ); + $this->sys_ok($result); + exit; +} + +function getlogs(){ + if (! $this->isLogin) { + $this->sys_error("Invalid Token"); + exit; + } + $prm = $this->sys_input; + $sql="SELECT * + FROM itb_yankes.send_results + WHERE + Send_ResultsOrderNumber = ?"; + $qry = $this->db_onedev->query($sql,$prm['order_number_yankes']); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + + $data_send = $qry->result_array(); + $result = array( + "records" => $data_send + ); + $this->sys_ok($result); + exit; + +} + +} diff --git a/application/controllers/mockup/mcuoffline/modules/Trx_order.php b/application/controllers/mockup/mcuoffline/modules/Trx_order.php new file mode 100644 index 0000000..d828d73 --- /dev/null +++ b/application/controllers/mockup/mcuoffline/modules/Trx_order.php @@ -0,0 +1,420 @@ +load->helper(array('form', 'url')); + $this->db_onedev = $this->load->database("onedev", true); + $this->db_oneklinik = $this->load->database("onedev", true); + //$token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3lhbmtlcy5pdGIuYWMuaWQvZGV2LXNlcnZpY2VzL2FwaS9hdXRoL2xvZ2luIiwiaWF0IjoxNzU3NDY0NzY1LCJleHAiOjE3ODkwMDA3NjUsIm5iZiI6MTc1NzQ2NDc2NSwianRpIjoiM1ZVYXhKdHVMTFdNOGhjUiIsInN1YiI6Ijc3IiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.CO2LwPxt_KqYyLJXDY3UWtWBjmHosFBcd2UtVUpW9GM'; + + } + + + function get_order() { + $baseurl = 'https://yankes.itb.ac.id/data-services'; + $baseurl = 'https://yankes.itb.ac.id/dev-services'; + $url = $baseurl.'/api/pemeriksaan_mcu'; + $sql = "SELECT * FROM itb_yankes.sys_config WHERE SysConfigIsActive = 'Y' ORDER BY SysConfigID DESC LIMIT 1 "; + $qry = $this->db_onedev->query($sql); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + $dt_config = $qry->row_array(); + $token = $dt_config['SysConfigToken']; + $token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3lhbmtlcy5pdGIuYWMuaWQvZGV2LXNlcnZpY2VzL2FwaS9hdXRoL2xvZ2luIiwiaWF0IjoxNzczMDUxMTgyLCJleHAiOjE4MDQ1ODcxODIsIm5iZiI6MTc3MzA1MTE4MiwianRpIjoiTnlPMk5reDJsYm1OeEZnbSIsInN1YiI6Ijc3IiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.nAp90vKj2fLgs0SQcJFmoKkin4_JKwM8XdwsiIZpiEo"; + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, array( + 'Authorization: Bearer ' . $token, + 'Content-Type: application/json' + )); + + // Eksekusi request cURL + $response = curl_exec($ch); + + // Debug: Cek error cURL + if (curl_errno($ch)) { + echo 'cURL Error: ' . curl_error($ch); + } + + curl_close($ch); + + // Kembalikan hasil response (jika perlu, decode JSON) + // echo $response; + + + /*$sql = "INSERT INTO itb_yankes.tmp_response( + response + ) + VALUES(?)"; + $qry = $this->db_onedev->query($sql,array($response)); + if(!$qry){ + $this->sys_error_db("save response", $this->db_onedev); + exit; + }*/ + $rspn = json_decode($response, true); + if($rspn['success'] == 1){ + $datas = $rspn['response_1']; + + if(count($datas) > 0){ + //print_r($datas); + foreach ($datas as $key => $value) { + if($value['nik']){ + $sql = "SELECT * FROM itb_yankes.download_order WHERE DownloadOrderNumber = ?"; + $qry = $this->db_onedev->query($sql,array($value['no_order'])); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + //echo $this->db_onedev->last_query(); + $exist_dt = $qry->result_array(); + if(count($exist_dt) == 0){ + $sql = "INSERT INTO itb_yankes.download_order ( + DownloadOrderNumber, + DownloadOrderDate, + DownloadOrderNIK, + DownloadOrderName, + DownloadOrderGender, + DownloadOrderDOB, + DownloadOrderJSON, + DownloadOrderCreated + ) VALUES(?,?,?,?,?,?,?,NOW()) "; + $qry = $this->db_onedev->query($sql,array( + $value['no_order'], + $value['tanggal_pemeriksaan'], + $value['nik'], + $value['nama_lengkap'], + $value['jenis_kelamin'], + $value['tanggal_lahir'], + json_encode($rspn) + )); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + //echo $this->db_onedev->last_query(); + $lastID = $this->db_onedev->insert_id(); + }else{ + $lastID = $exist_dt[0]['DownloadOrderID']; + $sql = "UPDATE itb_yankes.download_order SET + DownloadOrderNIK = ?, + DownloadOrderDOB = ?, + DownloadOrderJSON = ? + WHERE + DownloadOrderID = ? + "; + $qry = $this->db_onedev->query($sql,array( + $value['nik'], + $value['tanggal_lahir'], + json_encode($rspn), + $lastID)); + if(!$qry){ + $this->sys_error_db("update download_order error", $this->db_onedev); + exit; + } + + } + + $sql = "SELECT T_OrderHeaderID, M_PatientID,M_PatientIDNumber,DownloadOrderNIK,M_PatientDOB,DownloadOrderDOB + FROM t_orderheader + JOIN itb_yankes.sys_config ON T_OrderHeaderM_MouID IN (SysConfigM_MouID) + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID + JOIN itb_yankes.download_order + ON REPLACE(m_patient.M_PatientIDNumber, UNHEX('E2808C'), '') = TRIM(download_order.DownloadOrderNIK) + AND M_PatientDOB = DownloadOrderDOB + WHERE DownloadOrderID = ? AND T_OrderHeaderIsActive = 'Y'; + "; + $qry = $this->db_onedev->query($sql,array($lastID)); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + + $rows_order_lab = $qry->result_array(); + if(count($rows_order_lab)> 0){ + $data_map = $rows_order_lab[0]; + $sql = "UPDATE m_patient + SET M_PatientIDNumber = REPLACE(M_PatientIDNumber, UNHEX('E2808C'), '') + WHERE M_PatientID = ?"; + $qry = $this->db_onedev->query($sql,array($data_map['M_PatientID'])); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + + + $this->mapping_order($lastID,$data_map['T_OrderHeaderID'],$value['no_order'],555); + } + } + + + //echo json_encode($rspn); + + + } + $result = array( + + "records" => json_encode($rspn['response_1']) + ); + $this->sys_ok($result); + exit; + } + } + +} + +function mapping_order($orderID,$orderLabID,$noOrder,$userID){ + $sql = "INSERT INTO itb_yankes.order_map ( + orderMapDownloadOrderID, + orderMapT_OrderHeaderID, + orderMapCreated, + orderMapCreatedUserID + ) VALUES(?,?,NOW(),?)"; + $qry = $this->db_onedev->query($sql,array($orderID,$orderLabID,$userID)); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + + $this->update_status($orderID,'mapped'); + + $sql = "UPDATE t_orderheaderaddon SET T_OrderHeaderAddOnLabNumberOrigin = ? + WHERE T_OrderHeaderAddOnT_OrderHeaderID = ?"; + $qry = $this->db_onedev->query($sql,array($noOrder,$orderLabID)); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } +} + +function update_status($orderID,$status){ + $sql = "UPDATE itb_yankes.download_order SET DownloadOrderStatus = ? + WHERE DownloadOrderID = ?"; + $qry = $this->db_onedev->query($sql,array($status,$orderID)); + if(!$qry){ + $this->sys_error_db("update order error", $this->db_onedev); + exit; + } +} + +function send_result_all(){ + $sql="SELECT DownloadOrderID as order_id, + T_OrderDetailT_OrderHeaderID as order_lab_id, + DownloadOrderNIK as nik, + DownloadOrderName as patient_name, + DownloadOrderNumber as order_number, + T_OrderDetailT_TestCode as bisone_test_code, + test_yankes_code as yenkes_test_code, + test_name as yankes_test, + T_OrderDetailT_TestName as bisone_test, + T_OrderDetailResult as result + FROM t_orderdetail + JOIN itb_yankes.map_test ON T_OrderDetailT_TestCode = test_bisone_code + JOIN itb_yankes.order_map ON orderMapT_OrderHeaderID = T_OrderDetailT_OrderHeaderID + JOIN itb_yankes.download_order ON orderMapDownloadOrderID = DownloadOrderID AND + DownloadOrderStatus = 'mapped' + WHERE + T_OrderDetailT_TestIsResult = 'Y' AND + T_OrderDetailValidation = 'Y' AND + T_OrderDetailIsActive = 'Y' + GROUP BY T_OrderDetailT_OrderHeaderID"; + $qry = $this->db_onedev->query($sql); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + + $data_send = $qry->result_array(); + +} + +function send_result($orderLabID,$userID){ + $sql="SELECT DownloadOrderID as order_id, + T_OrderDetailT_OrderHeaderID as order_lab_id, + DownloadOrderNIK as nik, + DownloadOrderName as patient_name, + DownloadOrderNumber as order_number, + T_OrderDetailT_TestCode as bisone_test_code, + test_yankes_code as yenkes_test_code, + test_name as yankes_test, + T_OrderDetailT_TestName as bisone_test, + T_OrderDetailResult as result + FROM t_orderdetail + JOIN itb_yankes.map_test ON T_OrderDetailT_TestCode = test_bisone_code + JOIN itb_yankes.order_map ON orderMapT_OrderHeaderID = T_OrderDetailT_OrderHeaderID + JOIN itb_yankes.download_order ON orderMapDownloadOrderID = DownloadOrderID + WHERE + T_OrderDetailT_OrderHeaderID = ? AND + T_OrderDetailT_TestIsResult = 'Y' AND + T_OrderDetailValidation = 'Y' AND + T_OrderDetailIsActive = 'Y' + GROUP BY T_OrderDetailID + "; + $qry = $this->db_onedev->query($sql,[$orderLabID]); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + $details = $qry->result_array(); + if(count($details) > 0){ + $orderID = ''; + $no_order = ''; + $results = []; + foreach ($details as $key => $value) { + $orderID = $value['order_id']; + $no_order = $value['order_number']; + $results[] = ['test_id' => $value['yenkes_test_code'],'result' => $value['result'] ]; + } + + $json_dt = array( + array('no_order' => $no_order,'order_test' => $results) + ); + $this->do_send_results($orderID,$no_order,$json_dt,$userID); + } + +} + +function send_lab_results($json_data, $bearer_token) { + // Base URL + $baseUrl = 'https://yankes.itb.ac.id/data-services';// Ganti dengan base URL Anda + $baseUrl = 'https://yankes.itb.ac.id/dev-services'; + $url = $baseUrl . "/api/update_hasil_lab"; + + // Initialize cURL + $ch = curl_init($url); + + // Set cURL options + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Content-Type: application/json', + 'Authorization: Bearer ' . $bearer_token + ]); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($json_data)); + + // Execute cURL request + $response = curl_exec($ch); + + // Check for errors + if (curl_errno($ch)) { + echo 'cURL Error: ' . curl_error($ch); + } else { + // Decode the response if needed + $response_data = json_decode($response, true); + return $response_data; + // echo json_encode($response_data); + //print_r($response_data); + } + + // Close cURL session + curl_close($ch); +} + +function do_send_results($orderID,$no_order,$datas,$userID){ + // Contoh penggunaan fungsi + /*$json_data = [ + "params" => [ + [ + "no_order" => "B2B-ITB-a2q002687", + "order_test" => [ + ["test_id" => "A001HE", "result" => "15.2"], + ["test_id" => "A002HE", "result" => "44"], + ["test_id" => "A003HE", "result" => "3.9"], + // ... masukkan seluruh data lainnya sesuai kebutuhan + ] + ] + ] + ];*/ + + $json_data = [ + "params" => $datas + ]; + // Bearer token + //$bearer_token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wveWFua2VzLml0Yi5hYy5pZFwvZGV2LXNlcnZpY2VzXC9hcGlcL2F1dGhcL2xvZ2luIiwiaWF0IjoxNzI3MDg0NTcyLCJleHAiOjE3NTg2MjA1NzIsIm5iZiI6MTcyNzA4NDU3MiwianRpIjoiOWpGc3A0TmFIbnZWQkdrVyIsInN1YiI6NzcsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjcifQ.eduGs9bz64uD8paGYxJ1zxJ0du6lQ9yTFT7BzYTFg4A'; +// Ganti dengan token yang sesuai + //$bearer_token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3lhbmtlcy5pdGIuYWMuaWQvZGV2LXNlcnZpY2VzL2FwaS9hdXRoL2xvZ2luIiwiaWF0IjoxNzU3NDY0NzY1LCJleHAiOjE3ODkwMDA3NjUsIm5iZiI6MTc1NzQ2NDc2NSwianRpIjoiM1ZVYXhKdHVMTFdNOGhjUiIsInN1YiI6Ijc3IiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.CO2LwPxt_KqYyLJXDY3UWtWBjmHosFBcd2UtVUpW9GM"; + // Panggil fungsi untuk mengirim data + $sql = "SELECT * FROM itb_yankes.sys_config WHERE SysConfigIsActive = 'Y' ORDER BY SysConfigID DESC LIMIT 1 "; + $qry = $this->db_onedev->query($sql); + $dt_config = $qry->row_array(); + $bearer_token = $dt_config['SysConfigToken']; + + $rspn = $this->send_lab_results($json_data, $bearer_token); + if($rspn){ + $status = 'success'; + if(!$rspn['success']) + $status = 'failed'; + + $sql = "INSERT INTO itb_yankes.send_results ( + Send_ResultsOrderNumber, + SendResultsJsonBefore, + SendResultsJsonAfter, + SendResultsStatus, + SendResultsCreated, + SendResultsCreatedUserID + ) VALUES(?,?,?,?,NOW(),?)"; + $qry = $this->db_onedev->query($sql,[$no_order,json_encode($json_data),json_encode($rspn),$status,$userID]); + if(!$qry){ + $this->sys_error_db("insert send result error", $this->db_onedev); + exit; + } + + + $this->update_status($orderID,'send_result'); + + return $rspn; + } + + + +} + +function sendresultorder(){ + if (! $this->isLogin) { + $this->sys_error("Invalid Token"); + exit; + } + $prm = $this->sys_input; + $xuserid = $this->sys_user['M_UserID']; + $rspn = $this->send_result($prm['T_OrderHeaderID'],$xuserid); + $result = array( + + "records" => $rspn + ); + $this->sys_ok($result); + exit; +} + +function getlogs(){ + if (! $this->isLogin) { + $this->sys_error("Invalid Token"); + exit; + } + $prm = $this->sys_input; + $sql="SELECT * + FROM itb_yankes.send_results + WHERE + Send_ResultsOrderNumber = ?"; + $qry = $this->db_onedev->query($sql,$prm['order_number_yankes']); + if(!$qry){ + $this->sys_error_db("select order error", $this->db_onedev); + exit; + } + + $data_send = $qry->result_array(); + $result = array( + "records" => $data_send + ); + $this->sys_ok($result); + exit; + +} + +} diff --git a/claude.md b/claude.md index f53c6f0..f8b09d9 100644 --- a/claude.md +++ b/claude.md @@ -22,3 +22,12 @@ - Hook memanggil `scripts/devcpone_sync.sh` untuk upload diff commit terakhir ke `/home/one/project/one/one-api`. - Jika sync atau verifikasi file remote gagal, `push` harus ikut gagal; jangan anggap `git push` sukses lokal sebagai bukti file sudah masuk ke `devcpone`. - Saat user minta cek sinkronisasi, verifikasi langsung file di `devcpone`, bukan hanya status git lokal. + +## Cpone Upload (Manual) +- Upload ke `cpone` **hanya dilakukan saat user secara eksplisit meminta** ("upload ke cpone", "sync ke cpone", dll). +- Jalankan script: `scripts/cpone_sync.sh` +- Script menggunakan SSH key `~/.ssh/id_rsa` ke `one@cpone.aplikasi.web.id`. +- Target remote: `/home/one/project/one/one-api`. +- **Tidak ada hook otomatis** untuk cpone — upload selalu manual atas permintaan user. +- Sebelum upload, script otomatis backup file lama di folder yang sama dengan suffix timestamp, contoh: `Transactionv3.php.20260529_195950`. +- Setelah upload, verifikasi file di server remote, bukan hanya lokal. diff --git a/scripts/cpone_sync.sh b/scripts/cpone_sync.sh new file mode 100755 index 0000000..873775c --- /dev/null +++ b/scripts/cpone_sync.sh @@ -0,0 +1,64 @@ +#!/bin/sh +set -eu + +repo_root=$(git rev-parse --show-toplevel) +branch=${1:-$(git symbolic-ref --quiet --short HEAD 2>/dev/null || true)} + +case "$branch" in + master) + ;; + *) + exit 0 + ;; +esac + +remote_host=${CPONE_REMOTE_HOST:-one@cpone.aplikasi.web.id} +remote_root=${CPONE_REMOTE_ROOT:-/home/one/project/one/one-api} +ssh_key=${CPONE_SSH_KEY:-/Users/fajrihardhitamurti/.ssh/id_rsa} + +tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/cpone-sync.XXXXXX") +trap 'rm -rf "$tmpdir"' EXIT HUP INT TERM + +manifest="$tmpdir/files.list" +verify_list="$tmpdir/files.verify" + +if git rev-parse --verify HEAD^ >/dev/null 2>&1; then + git diff -M --name-only -z --diff-filter=ACMR HEAD^ HEAD > "$manifest" +else + git ls-files -z > "$manifest" +fi + +if [ ! -s "$manifest" ]; then + exit 0 +fi + +ssh_args="-o BatchMode=yes" +if [ -f "$ssh_key" ]; then + ssh_args="-i $ssh_key $ssh_args" +fi + +ssh $ssh_args "$remote_host" "mkdir -p '$remote_root'" >/dev/null + +# backup file lama sebelum upload (disimpan di folder yang sama dengan suffix timestamp) +ts=$(date +%Y%m%d_%H%M%S) +tr '\0' '\n' < "$manifest" | while IFS= read -r relpath; do + [ -n "$relpath" ] || continue + ssh $ssh_args "$remote_host" " + src='$remote_root/$relpath' + if [ -f \"\$src\" ]; then + cp \"\$src\" \"\$src.$ts\" + fi + " +done + +rsync -a --relative --from0 --files-from="$manifest" -e "ssh $ssh_args" "$repo_root"/ "$remote_host:$remote_root"/ + +tr '\0' '\n' < "$manifest" > "$verify_list" + +while IFS= read -r relpath; do + [ -n "$relpath" ] || continue + ssh $ssh_args "$remote_host" "test -e '$remote_root/$relpath'" || { + printf '%s\n' "cpone verify failed: missing $remote_root/$relpath" >&2 + exit 1 + } +done < "$verify_list"