diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..677fef5 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,13 @@ +{ + "permissions": { + "allow": [ + "Bash(ssh devcpone *)", + "Bash(git -C /Users/fajrihardhitamurti/REPO_CPONE/BE_CPONE ls-tree -r origin/master --name-only)", + "Bash(git *)", + "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 *)" + ] + } +} diff --git a/.githooks/pre-push b/.githooks/pre-push index 10a77a2..54e04c2 100755 --- a/.githooks/pre-push +++ b/.githooks/pre-push @@ -30,6 +30,7 @@ while read -r local_ref local_sha remote_ref remote_sha; do repo_root=$(git rev-parse --show-toplevel) if ! "$repo_root/scripts/devcpone_sync.sh" "$branch"; then - printf '%s\n' "devcpone sync skipped/failed; push kept intact" >&2 + printf '%s\n' "devcpone sync failed; blocking push" >&2 + exit 1 fi done < "$tmpdir/pushes" diff --git a/application/controllers/ais/Transactionv2.php b/application/controllers/ais/Transactionv2.php index 1fda51f..536aae8 100644 --- a/application/controllers/ais/Transactionv2.php +++ b/application/controllers/ais/Transactionv2.php @@ -578,6 +578,7 @@ class Transactionv2 extends MY_Controller when Nat_GroupID = 4 then '1303' when Nat_GroupID = 5 then '1321' when Nat_GroupID = 6 then '1600' + when Nat_GroupID = 7 then '1500' end as ProfitCostCenterCode, '' as TrxDepartemenID, T_OrderDetailCreated as TanggalBuat, @@ -1117,6 +1118,7 @@ class Transactionv2 extends MY_Controller when Nat_GroupID = 4 then '1303' when Nat_GroupID = 5 then '1321' when Nat_GroupID = 6 then '1600' + when Nat_GroupID = 7 then '1500' end as ProfitCostCenterCode, '' as TrxDepartemenID, T_OrderDetailCreated as TanggalBuat, @@ -1913,6 +1915,7 @@ class Transactionv2 extends MY_Controller when Nat_GroupID = 4 then '1303' when Nat_GroupID = 5 then '1321' when Nat_GroupID = 6 then '1600' + when Nat_GroupID = 7 then '1500' end as ProfitCostCenterCode, '' as TrxDepartemenID, T_OrderDetailCreated as TanggalBuat, @@ -2412,6 +2415,7 @@ class Transactionv2 extends MY_Controller when Nat_GroupID = 4 then '1303' when Nat_GroupID = 5 then '1321' when Nat_GroupID = 6 then '1600' + when Nat_GroupID = 7 then '1500' end as ProfitCostCenterCode, '' as TrxDepartemenID, T_OrderDetailCreated as TanggalBuat, @@ -2857,6 +2861,7 @@ class Transactionv2 extends MY_Controller when Nat_GroupID = 4 then '1303' when Nat_GroupID = 5 then '1321' when Nat_GroupID = 6 then '1600' + when Nat_GroupID = 7 then '1500' end as ProfitCostCenterCode, '' as TrxDepartemenID, T_OrderDetailCreated as TanggalBuat, @@ -2904,7 +2909,15 @@ class Transactionv2 extends MY_Controller T_OrderDetailIsActive = 'Y' UNION SELECT T_OrderDetailID as TrxLayananID, - Nat_GroupID as ProfitCostCenterCode, + case + when Nat_GroupID = 1 then '1100' + when Nat_GroupID = 2 then '1200' + when Nat_GroupID = 3 then '1200' + when Nat_GroupID = 4 then '1303' + when Nat_GroupID = 5 then '1321' + when Nat_GroupID = 6 then '1600' + when Nat_GroupID = 7 then '1500' + end as ProfitCostCenterCode, '' as TrxDepartemenID, T_OrderDetailCreated as TanggalBuat, T_OrderDetailT_TestSasCode as LayananID, diff --git a/application/controllers/ais/Transactionv2.php--150526 b/application/controllers/ais/Transactionv2.php--150526 new file mode 100644 index 0000000..1fda51f --- /dev/null +++ b/application/controllers/ais/Transactionv2.php--150526 @@ -0,0 +1,3853 @@ +db_onedev = $this->load->database("onedev", true); + $this->db_log = $this->load->database("log", true); + $this->load->helper(array('form', 'url')); + } + + public function error_log($data,$userid=999) + { + + $sql = "INSERT INTO ais_error_log ( + AisErrorLogFnName, + AisErrorLogMessage, + AisErrorLogQuery, + AisErrorLogJson, + AisErrorLogUserID, + AisErrorLogCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array($data['fn_name'],$data['message'],$data['query'],$data['json'],$userid)); + //echo $this->db_log->last_query(); + return true; + } + + /** + * Build equivalent cURL command string (untuk debug - copy-paste ke terminal) + * @param string $url API endpoint URL + * @param array $data Request payload + * @param array $headers Custom headers (optional) + * @param string $method POST atau PUT + * @return string Perintah curl yang siap dijalankan + */ + public function build_curl_command($url, $data = array(), $headers = array(), $method = 'POST') + { + $default_headers = array('Content-Type: application/json'); + $final_headers = array_merge($default_headers, $headers); + $body = json_encode($data); + $parts = array('curl', '-X', $method, escapeshellarg($url)); + foreach ($final_headers as $h) { + $parts[] = '-H'; + $parts[] = escapeshellarg($h); + } + $parts[] = '-d'; + $parts[] = escapeshellarg($body); + return implode(' ', $parts); + } + + /** + * Generic POST request function + * @param string $url API endpoint URL + * @param array $data Request payload + * @param array $headers Custom headers (optional) + * @return array Response from API + */ + public function post_request($url, $data = array(), $headers = array()) + { + // Default headers + $default_headers = array( + 'Content-Type: application/json' + ); + + // Merge custom headers with default headers + $final_headers = array_merge($default_headers, $headers); + + // Initialize cURL + $ch = curl_init(); + + // Set cURL options + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + curl_setopt($ch, CURLOPT_HTTPHEADER, $final_headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + + // Execute cURL request + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); + + // Close cURL + curl_close($ch); + + // Prepare result + $result = array( + 'success' => false, + 'http_code' => $http_code, + 'response' => null, + 'error' => null + ); + + if ($error) { + $result['error'] = $error; + } else { + $result = json_decode($response, true); + //echo json_encode($result); + $result['success'] = true; + } + + return $result; + } + + /** + * Generic PUT request function + * @param string $url API endpoint URL + * @param array $data Request payload + * @param array $headers Custom headers (optional) + * @return array Response from API + */ + public function put_request($url, $data = array(), $headers = array()) + { + // Default headers + $default_headers = array( + 'Content-Type: application/json' + ); + + // Merge custom headers with default headers + $final_headers = array_merge($default_headers, $headers); + + // Initialize cURL + $ch = curl_init(); + + // Set cURL options + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + curl_setopt($ch, CURLOPT_HTTPHEADER, $final_headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + + // Execute cURL request + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); + + // Close cURL + curl_close($ch); + + // Prepare result + $result = array( + 'success' => false, + 'http_code' => $http_code, + 'response' => null, + 'error' => null + ); + + if ($error) { + $result['error'] = $error; + } else { + $result = json_decode($response, true); + $result['success'] = true; + } + + return $result; + } + + /** + * Generic DELETE request function + * @param string $url API endpoint URL + * @param array $data Request payload (optional, some APIs support body in DELETE) + * @param array $headers Custom headers (optional) + * @return array Response from API + */ + public function delete_request($url, $data = array(), $headers = array()) + { + // Default headers + $default_headers = array( + 'Content-Type: application/json' + ); + + // Merge custom headers with default headers + $final_headers = array_merge($default_headers, $headers); + + // Initialize cURL + $ch = curl_init(); + + // Set cURL options + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); + + // Add body if data is provided (some APIs support body in DELETE requests) + if (!empty($data)) { + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + } + + curl_setopt($ch, CURLOPT_HTTPHEADER, $final_headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + + // Execute cURL request + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); + + // Close cURL + curl_close($ch); + + // Prepare result + $result = array( + 'success' => false, + 'http_code' => $http_code, + 'response' => null, + 'error' => null + ); + + if ($error) { + $result['error'] = $error; + } else { + $result = json_decode($response, true); + $result['success'] = true; + } + + return $result; + } + + public function get_request($url, $headers = array()) + { + // Retrieve configuration + $config = $this->get_config(); + $token = $config['AisConfigAuthToken'] ?? 'default-token'; + $header_token = $config['AisConfigHeaderToken']; + + // Default headers based on the curl command + $default_headers = array( + 'Header-Token: ' . $header_token, + 'Authorization: Bearer ' . $token + ); + + // Merge custom headers with default headers + $final_headers = array_merge($default_headers, $headers); + + // Initialize cURL + $ch = curl_init(); + + // Set cURL options + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_HTTPGET, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, $final_headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + + // Execute cURL request + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); + + // Close cURL + curl_close($ch); + + // Prepare result + $result = array( + 'success' => false, + 'http_code' => $http_code, + 'response' => null, + 'error' => null + ); + + if ($error) { + $result['error'] = $error; + } else { + $decoded = json_decode($response, true); + $result['response'] = $decoded; + // Check if response is successful based on http code + if ($http_code === 200) { + $result['success'] = true; + } + } + + return $result; + } + + function get_config() + { + $sql = "SELECT * FROM ais_config LIMIT 1"; + $qry = $this->db_onedev->query($sql); + $dt_config = $qry->row_array(); + return $dt_config; + } + + /** + * POST request to auth API + * @param string $username Username for authentication + * @param string $password Password for authentication + * @return array Response from API + */ + public function post_auth() + { + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl.'/api/auth/auth.php'; + $headers = array( + 'Header-Token: '.$dt_config['AisConfigHeaderToken'] + ); + + $username = $dt_config['AisConfigUsername']; + $password = $dt_config['AisConfigPassword']; + + $data = array( + 'username' => $username, + 'password' => $password + ); + + $result = $this->post_request($url, $data, $headers); + + + $sql = "INSERT INTO ais_login_log( + AisLoginLogUsername, + AisLoginLogPassword, + AisLoginLogHeaderToken, + AisLoginLogResult, + AisLoginLogCreated + ) + VALUES( + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array($username,$password,$dt_config['AisConfigHeaderToken'],json_encode($result))); + + + if(!$qry){ + $this->error_log(array('fn_name'=>'post_auth','message'=>'ais_login_log insert','query'=>$sql,'json'=>json_encode($result)),999); + exit; + } + //print_r($result); + //exit; + // Check if success + if(!$result['success']){ + $this->error_log(array('fn_name'=>'post_auth','message'=>'failed auth','query'=>'','json'=>json_encode($result)),999); + $errors = array('status' => 'error','message' => 'Gagal Login'); + return $errors; + + }else{ + // Update token + $token = $result['data']['token'];; + $sql = "UPDATE ais_config SET AisConfigAuthToken = ? WHERE AisConfigID = 1"; + $qry = $this->db_onedev->query($sql, array($token)); + //echo $this->db_onedev->last_query(); + //exit; + if(!$qry){ + $this->error_log(array('fn_name'=>'post_auth','message'=>'ais_config update','query'=>$sql,'json'=>''),999); + $errors = array('status' => 'error','message' => 'Gagal Update Token'); + return $errors; + + } + + return $result; + } + } + + function post_transaction_daily_by_date($min_date=null,$max_date=null) + { + //echo "post_transaction_daily_by_date"; + // Auth Login + $login = $this->post_auth(); + //echo json_encode($login); + //exit; + + if (!$login['success']) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 555); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaction_full/transaksi.php'; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + // Validate date range - maksimal 7 hari + if ($min_date && $max_date) { + $min_date_obj = new DateTime($min_date); + $max_date_obj = new DateTime($max_date); + $date_diff = $min_date_obj->diff($max_date_obj); + $days_diff = $date_diff->days; + + if ($days_diff > 5) { + $errors = array('status' => 'error', 'message' => 'Selisih antara min_date dan max_date maksimal 7 hari'); + echo json_encode($errors); + exit; + } + } + + + // Get data + $sql = "SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + M_UserEmail as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + M_UserEmail as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID AND `M_PatientName` NOT LIKE '%coba%' + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID + JOIN t_priceheader ON Mgm_McuT_PriceHeaderID = T_PriceHeaderID + JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + LEFT JOIN cpone_log.ais_transaction ON Ais_TransactionOrderHeaderLabNumber = T_OrderHeaderLabNumber AND + Ais_TransactionStatus = 'success' + WHERE T_OrderHeaderIsActive = 'Y' AND + ( DATE(T_OrderHeaderDate) >= ? AND DATE(T_OrderHeaderDate) <= ? ) + + + UNION + + SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + IFNULL(M_UserEmail,'Administrator') as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + IFNULL(M_UserEmail,'Administrator') as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID AND `M_PatientName` NOT LIKE '%coba%' + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN t_orderheaderaddon ON T_OrderHeaderAddOnT_OrderHeaderID = T_OrderHeaderID + AND T_OrderHeaderAddOnIsActive = 'Y' + JOIN t_priceheader ON T_OrderHeaderAddOnT_PriceHeaderID = T_PriceHeaderID + LEFT JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + LEFT JOIN cpone_log.ais_transaction ON Ais_TransactionOrderHeaderLabNumber = T_OrderHeaderLabNumber AND + Ais_TransactionStatus = 'success' + WHERE T_OrderHeaderIsActive = 'Y' AND + ( DATE(T_OrderHeaderDate) >= ? AND DATE(T_OrderHeaderDate) <= ? ) + + GROUP BY T_OrderHeaderID + ORDER BY T_OrderHeaderID ASC + + + "; + $qry = $this->db_onedev->query($sql, array($min_date,$max_date,$min_date,$max_date)); + + + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $raw_data = $qry->result_array(); + if(count($raw_data) == 0){ + $errors = array('status' => 'error', 'message' => 'Data tidak ditemukan'); + echo json_encode($errors); + exit; + } + + $data = array(); + // echo json_encode($raw_data); + //exit; + foreach ($raw_data as $key => $row) { + + $row['TrxLayanan'] = []; + $row['TrxItem'] = []; + $row['TrxItemReturn'] = []; + $row['RegpasNominal'] = []; + $row['Trxtt'] = null; + $row['TrxBayar'] = []; + $row['TrxLain'] = null; + $row['PaketDispenser'] = null; + + //$name = "Fanny Yolandina Fo'eh"; + // Escape apostrophe untuk mencegah error pada SQL atau JSON + if (isset($row['Nama']) && !empty($row['Nama'])) { + $row['Nama'] = addslashes($row['Nama']); + } + $raw_data[$key]['Nama'] = $row['Nama']; + + $layanan = []; + $sql = "SELECT * FROM ( + SELECT T_OrderDetailID as TrxLayananID, + case + when Nat_GroupID = 1 then '1100' + when Nat_GroupID = 2 then '1200' + when Nat_GroupID = 3 then '1200' + when Nat_GroupID = 4 then '1303' + when Nat_GroupID = 5 then '1321' + when Nat_GroupID = 6 then '1600' + end as ProfitCostCenterCode, + '' as TrxDepartemenID, + T_OrderDetailCreated as TanggalBuat, + T_OrderDetailT_TestSasCode as LayananID, + T_OrderDetailT_TestName as LayananName, + doctorlab.M_DoctorCode as DokterID, + 0 as ShareRS, + 0 as ShareDokter, + 0 as ShareExternal, + 0 as ShareLain2, + '' as PihakExternal, + '' as PihakLain2, + 'Percentage' as ShareTipe, + T_OrderDetailPrice as Harga, + 1 as Jumlah, + 1 as Rate, + 'N' as FOC, + T_OrderDetailDiscTotal as Diskon, + 'Absolute' as TipeDiskon, + '' as DepartemenID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',T_OrderDetailTotal,0) as DitanggungPasien, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,T_OrderDetailTotal) as DitanggungPenjamin, + 0 as MarkUpCito, + 'N' as Cito, + IFNULL(T_PacketSasCode,'') as PaketID, + 'LABKLINIK' as KelasID, + '' as TrxLayananDetail, + 'Y' as Tagihkan + FROM t_orderdetail + JOIN t_test ON T_TestID = T_OrderDetailT_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' + JOIN t_orderdetailorder ON T_OrderDetailT_OrderDetailOrderID = T_OrderDetailOrderID AND T_OrderDetailOrderIsActive = 'Y' + JOIN t_orderheader ON T_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN m_doctor doctorlab ON T_OrderHeaderPjM_DoctorID = M_DoctorID + 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' + ) AS t_orderdetailorder"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan_debug = 0; + $layanan = $qry->result_array(); + $raw_data[$key]['TrxLayanan'] = []; + if(count($layanan) > 0){ + foreach($layanan as $key_layanan => $row_layanan){ + $total_layanan_debug += $row_layanan['Harga']; + $layanan[$key_layanan]['TrxLayananDetail'] = []; + $sql = "SELECT M_DoctorCode, M_DoctorID + FROM `so_resultentry` + JOIN t_orderdetail ON ? = So_ResultEntryT_OrderDetailID AND T_OrderDetailIsActive = 'Y' + JOIN m_doctor ON M_DoctorID = So_ResultEntryM_DoctorID AND M_DoctorIsActive = 'Y' + WHERE `So_ResultEntryT_OrderHeaderID` = ? AND + `So_ResultEntryIsActive` = 'Y' AND `So_ResultEntryM_DoctorID` > '0' + LIMIT 1 + "; + $qry = $this->db_onedev->query($sql, array($row_layanan['TrxLayananID'],$row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'so_resultentry select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + $get_resultentry = $qry->result_array(); + if (count($get_resultentry) > 0) { + $row_layanan['DokterID'] = $get_resultentry[0]['M_DoctorCode']; + } + $raw_data[$key]['TrxLayanan'][] = $row_layanan; + } + } + + $regpasnominal = []; + $jumlah_layanan_lab = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lab + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 1 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + //echo $this->db_onedev->last_query(); + //exit; + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail lab select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + + $get_layanan_lab = $qry->row_array(); + $jumlah_layanan_lab = $get_layanan_lab['total_layanan_lab']; + + $jumlah_layanan_radiologi = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_radiologi + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 3 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail radiologi select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + $get_layanan_radiologi = $qry->row_array(); + $jumlah_layanan_radiologi = $get_layanan_radiologi['total_layanan_radiologi']; + + $jumlah_layanan_lain = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lain + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID NOT IN (1,3) + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail lain select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + + + $get_layanan_lain = $qry->row_array(); + $jumlah_layanan_lain = $get_layanan_lain['total_layanan_lain']; + + $total_layanan = 0; + $sql = "SELECT SUM(T_OrderDetailTotal) as total_layanan + FROM t_orderdetail + JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail total layanan select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + $total_layanan = $qry->row_array(); + $total_layanan = $total_layanan['total_layanan']; + + + $total_bayar = 0; + $sql = "SELECT F_PaymentTotal as total + FROM f_payment + WHERE F_PaymentT_OrderHeaderID = ? AND F_PaymentIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'f_payment select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + + $get_total_bayar = $qry->result_array(); + if (count($get_total_bayar) > 0) { + foreach($get_total_bayar as $key_total_bayar => $row_total_bayar){ + $total_bayar += $row_total_bayar['total']; + } + } + + + + $mgm_mcu_m_branch_id = $row['mgm_mcu_m_branch_id']; + + $corporate_code = $row['CorporateCode']; + + $total_ditanggung_pasien = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? $total_layanan : 0; + $total_ditanggung_penjamin = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? 0 : $total_layanan; + + $regpasnominal = array( + "BiayaParamedik" => "0.00", + "ParamedikDitanggungPasien" => "0.00", + "ParamedikDitanggungPenjamin" => "0.00", + "BiayaAdministrasi" => "0", + "AdmDitanggungPasien" => "0.00", + "AdmDitanggungPenjamin" => "0.00", + "BiayaMaterai" => "0.00", + "BiayaMateraiDitanggungPasien" => "0.00", + "BiayaMateraiDitanggungPenjamin" => "0.00", + "JumlahLayanan" => $jumlah_layanan_lain, + "JumlahLayananRadiologi" => $jumlah_layanan_radiologi, + "JumlahLayananLaboratorium" => $jumlah_layanan_lab, + "JumlahItem" => 0, + "JumlahItemRetur" => 0, + "JumlahTT" => "0.00", + "JumlahBiayaLain" => "0.00", + "JumlahBayar" => $total_bayar, + "TipeDiskonGlobal" => "Absolute", + "DiskonGlobal" => "0.00", + "TotalDitanggungPasien" => $total_ditanggung_pasien, + "TotalDitanggungPenjamin" => $total_ditanggung_penjamin + ); + + $raw_data[$key]['RegpasNominal'] = array( + $regpasnominal + ); + + //echo $total_bayar; + $raw_data[$key]['TrxBayar'] = null; + if($total_bayar > 0){ + $sql = "SELECT M_PatientNoReg as MEDRECID, + F_PaymentDetailID as BayarID, + IFNULL(F_PaymentDetailAmount,0) as Jumlah, + F_PaymentDetailCreated as Tanggal, + 'Pelunasan' as JenisBayarID, + CONCAT(F_PaymentNumber,'.',F_PaymentDetailID) as KwitansiID, + IF(F_PaymentDetailM_PaymentTypeID = 21,CONCAT(F_PaymentDetailM_PaymentTypeID,'0',F_PaymentDetailM_BankAccountID),CONCAT(F_PaymentDetailM_PaymentTypeID,F_PaymentDetailM_BankAccountID)) as TipeBayarID, + 'N' as Dibatalkan + FROM f_paymentdetail + JOIN f_payment ON F_PaymentDetailF_PaymentID = F_PaymentID AND F_PaymentIsActive = 'Y' + JOIN t_orderheader ON F_PaymentT_OrderHeaderID = T_OrderHeaderID + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' + WHERE + F_PaymentT_OrderHeaderID = ? AND F_PaymentDetailIsActive = 'Y' + GROUP BY F_PaymentDetailID"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'f_payment select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + //echo $this->db_onedev->last_query(); + //exit; + $bayar = $qry->result_array(); + + $raw_data[$key]['TrxBayar'] = $bayar; + } + + $raw_data[$key]['Trxtt'] = null; + $raw_data[$key]['TrxLain'] = null; + $raw_data[$key]['PaketDispenser'] = null; + $errors = []; + //exit; + $get_transaction = $this->get_transaction_by_labnumber($row['RegID']); + // echo json_encode($get_transaction); + + if($get_transaction && count($get_transaction) > 0){ + $result = $this->put_request($url, $raw_data[$key], $headers); + + }else{ + // Debug: cURL untuk post_request ini (copy-paste ke terminal) + $curl_cmd = $this->build_curl_command($url, $raw_data[$key], $headers, 'POST'); + + // echo $curl_cmd . "\n"; + $result = $this->post_request($url, $raw_data[$key], $headers); + //echo json_encode($result); + } + + + + if ($result['error'] != null) { + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'error', + json_encode($result), + $url, + 555 + )); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'ais_transaction insert : '.$row['RegID'], 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'transaction insert : '.$row['RegID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($result)), 999); + + $errors[] = array('RegID' => $row['RegID'], 'error' => $result['error'] ?? ($result['message'] ?? 'Unknown error from external API')); + + + }else{ + //echo 'insert ais_transaction'; + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'success', + json_encode($result), + $url, + 555 + )); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'ais_transaction insert : '.$row['RegID'], 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + continue; + } + + $check_exist_medrec = $this->get_medrec_by_noreg($row['MEDRECID']); + if($check_exist_medrec['status'] == 'error'){ + $this->error_log(array('fn_name' => 'post_transaction_daily/get_medrec_by_noreg', 'message' => 'get medrec failed for no reg: '.$row['MEDRECID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($check_exist_medrec)), 999); + continue; + } + + if($check_exist_medrec['data'] == null){ + $post_medrec = $this->post_medrec_by_noreg($row['MEDRECID']); + if($post_medrec['status'] == 'error'){ + $this->error_log(array('fn_name' => 'post_transaction_daily/post_medrec_by_noreg', 'message' => 'post medrec failed for no reg: '.$row['MEDRECID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($post_medrec)), 999); + continue; + } + }else{ + $re_post_medrec = $this->re_post_medrec_by_noreg($row['MEDRECID']); + if($re_post_medrec['status'] == 'error'){ + $this->error_log(array('fn_name' => 'post_transaction_daily/re_post_medrec_by_noreg', 'message' => 're post medrec failed for no reg: '.$row['MEDRECID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($re_post_medrec)), 999); + continue; + } + } + } + } + + echo 'Selesai'; + } + + function post_transaction_daily() + { + $prm = $this->sys_input; + $trx_date = isset($prm['xdate']) ? $prm['xdate'] : date('Y-m-d', strtotime('-1 day')); + //$trx_date = '2026-01-12'; + // Auth Login + $login = $this->post_auth(); + + if (!$login['success']) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 555); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . 'api/transaction_full/transaksi.php'; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + + + // Get data + $sql = "SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + M_UserEmail as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + M_UserEmail as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID AND `M_PatientName` NOT LIKE '%coba%' + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID + JOIN t_priceheader ON Mgm_McuT_PriceHeaderID = T_PriceHeaderID + JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + LEFT JOIN cpone_log.ais_transaction ON Ais_TransactionOrderHeaderLabNumber = T_OrderHeaderLabNumber AND + Ais_TransactionStatus = 'success' + WHERE T_OrderHeaderIsActive = 'Y' AND DATE(T_OrderHeaderDate) = ? AND + Ais_TransactionID IS NULL + + UNION + + SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + IFNULL(M_UserEmail,'Administrator') as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + IFNULL(M_UserEmail,'Administrator') as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID AND `M_PatientName` NOT LIKE '%coba%' + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN t_orderheaderaddon ON T_OrderHeaderAddOnT_OrderHeaderID = T_OrderHeaderID + AND T_OrderHeaderAddOnIsActive = 'Y' + JOIN t_priceheader ON T_OrderHeaderAddOnT_PriceHeaderID = T_PriceHeaderID + LEFT JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + LEFT JOIN cpone_log.ais_transaction ON Ais_TransactionOrderHeaderLabNumber = T_OrderHeaderLabNumber AND + Ais_TransactionStatus = 'success' + WHERE T_OrderHeaderIsActive = 'Y' AND DATE(T_OrderHeaderDate) = ? AND + Ais_TransactionID IS NULL + + GROUP BY T_OrderHeaderID + ORDER BY T_OrderHeaderID DESC + LIMIT 50 + + + "; + $qry = $this->db_onedev->query($sql, array($trx_date,$trx_date)); + + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $raw_data = $qry->result_array(); + if(count($raw_data) == 0){ + $errors = array('status' => 'error', 'message' => 'Data tidak ditemukan'); + echo json_encode($errors); + exit; + } + + $data = array(); + // echo json_encode($raw_data); + //exit; + foreach ($raw_data as $key => $row) { + + $row['TrxLayanan'] = []; + $row['TrxItem'] = []; + $row['TrxItemReturn'] = []; + $row['RegpasNominal'] = []; + $row['Trxtt'] = null; + $row['TrxBayar'] = []; + $row['TrxLain'] = null; + $row['PaketDispenser'] = null; + + //$name = "Fanny Yolandina Fo'eh"; + // Escape apostrophe untuk mencegah error pada SQL atau JSON + if (isset($row['Nama']) && !empty($row['Nama'])) { + $row['Nama'] = addslashes($row['Nama']); + } + $raw_data[$key]['Nama'] = $row['Nama']; + + $layanan = []; + $sql = "SELECT * FROM ( + SELECT T_OrderDetailID as TrxLayananID, + case + when Nat_GroupID = 1 then '1100' + when Nat_GroupID = 2 then '1200' + when Nat_GroupID = 3 then '1200' + when Nat_GroupID = 4 then '1303' + when Nat_GroupID = 5 then '1321' + when Nat_GroupID = 6 then '1600' + end as ProfitCostCenterCode, + '' as TrxDepartemenID, + T_OrderDetailCreated as TanggalBuat, + T_OrderDetailT_TestSasCode as LayananID, + T_OrderDetailT_TestName as LayananName, + doctorlab.M_DoctorCode as DokterID, + 0 as ShareRS, + 0 as ShareDokter, + 0 as ShareExternal, + 0 as ShareLain2, + '' as PihakExternal, + '' as PihakLain2, + 'Percentage' as ShareTipe, + T_OrderDetailPrice as Harga, + 1 as Jumlah, + 1 as Rate, + 'N' as FOC, + T_OrderDetailDiscTotal as Diskon, + 'Absolute' as TipeDiskon, + '' as DepartemenID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',T_OrderDetailTotal,0) as DitanggungPasien, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,T_OrderDetailTotal) as DitanggungPenjamin, + 0 as MarkUpCito, + 'N' as Cito, + IFNULL(T_PacketSasCode,'') as PaketID, + 'LABKLINIK' as KelasID, + '' as TrxLayananDetail, + 'Y' as Tagihkan + FROM t_orderdetail + JOIN t_test ON T_TestID = T_OrderDetailT_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' + JOIN t_orderdetailorder ON T_OrderDetailT_OrderDetailOrderID = T_OrderDetailOrderID AND T_OrderDetailOrderIsActive = 'Y' + JOIN t_orderheader ON T_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN m_doctor doctorlab ON T_OrderHeaderPjM_DoctorID = M_DoctorID + 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' + ) AS t_orderdetailorder"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan_debug = 0; + $layanan = $qry->result_array(); + $raw_data[$key]['TrxLayanan'] = []; + if(count($layanan) > 0){ + foreach($layanan as $key_layanan => $row_layanan){ + $total_layanan_debug += $row_layanan['Harga']; + $layanan[$key_layanan]['TrxLayananDetail'] = []; + $sql = "SELECT M_DoctorCode, M_DoctorID + FROM `so_resultentry` + JOIN t_orderdetail ON ? = So_ResultEntryT_OrderDetailID AND T_OrderDetailIsActive = 'Y' + JOIN m_doctor ON M_DoctorID = So_ResultEntryM_DoctorID AND M_DoctorIsActive = 'Y' + WHERE `So_ResultEntryT_OrderHeaderID` = ? AND + `So_ResultEntryIsActive` = 'Y' AND `So_ResultEntryM_DoctorID` > '0' + LIMIT 1 + "; + $qry = $this->db_onedev->query($sql, array($row_layanan['TrxLayananID'],$row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'so_resultentry select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + $get_resultentry = $qry->result_array(); + if (count($get_resultentry) > 0) { + $row_layanan['DokterID'] = $get_resultentry[0]['M_DoctorCode']; + } + $raw_data[$key]['TrxLayanan'][] = $row_layanan; + } + } + + $regpasnominal = []; + $jumlah_layanan_lab = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lab + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 1 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + //echo $this->db_onedev->last_query(); + //exit; + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail lab select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + + $get_layanan_lab = $qry->row_array(); + $jumlah_layanan_lab = $get_layanan_lab['total_layanan_lab']; + + $jumlah_layanan_radiologi = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_radiologi + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 3 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail radiologi select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + $get_layanan_radiologi = $qry->row_array(); + $jumlah_layanan_radiologi = $get_layanan_radiologi['total_layanan_radiologi']; + + $jumlah_layanan_lain = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lain + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID NOT IN (1,3) + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail lain select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + + + $get_layanan_lain = $qry->row_array(); + $jumlah_layanan_lain = $get_layanan_lain['total_layanan_lain']; + + $total_layanan = 0; + $sql = "SELECT SUM(T_OrderDetailTotal) as total_layanan + FROM t_orderdetail + JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail total layanan select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + $total_layanan = $qry->row_array(); + $total_layanan = $total_layanan['total_layanan']; + + + $total_bayar = 0; + $sql = "SELECT F_PaymentTotal as total + FROM f_payment + WHERE F_PaymentT_OrderHeaderID = ? AND F_PaymentIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'f_payment select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + + $get_total_bayar = $qry->result_array(); + if (count($get_total_bayar) > 0) { + foreach($get_total_bayar as $key_total_bayar => $row_total_bayar){ + $total_bayar += $row_total_bayar['total']; + } + } + + + + $mgm_mcu_m_branch_id = $row['mgm_mcu_m_branch_id']; + + $corporate_code = $row['CorporateCode']; + + $total_ditanggung_pasien = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? $total_layanan : 0; + $total_ditanggung_penjamin = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? 0 : $total_layanan; + + $regpasnominal = array( + "BiayaParamedik" => "0.00", + "ParamedikDitanggungPasien" => "0.00", + "ParamedikDitanggungPenjamin" => "0.00", + "BiayaAdministrasi" => "0", + "AdmDitanggungPasien" => "0.00", + "AdmDitanggungPenjamin" => "0.00", + "BiayaMaterai" => "0.00", + "BiayaMateraiDitanggungPasien" => "0.00", + "BiayaMateraiDitanggungPenjamin" => "0.00", + "JumlahLayanan" => $jumlah_layanan_lain, + "JumlahLayananRadiologi" => $jumlah_layanan_radiologi, + "JumlahLayananLaboratorium" => $jumlah_layanan_lab, + "JumlahItem" => 0, + "JumlahItemRetur" => 0, + "JumlahTT" => "0.00", + "JumlahBiayaLain" => "0.00", + "JumlahBayar" => $total_bayar, + "TipeDiskonGlobal" => "Absolute", + "DiskonGlobal" => "0.00", + "TotalDitanggungPasien" => $total_ditanggung_pasien, + "TotalDitanggungPenjamin" => $total_ditanggung_penjamin + ); + + $raw_data[$key]['RegpasNominal'] = array( + $regpasnominal + ); + + //echo $total_bayar; + $raw_data[$key]['TrxBayar'] = null; + if($total_bayar > 0){ + $sql = "SELECT M_PatientNoReg as MEDRECID, + F_PaymentDetailID as BayarID, + IFNULL(F_PaymentDetailAmount,0) as Jumlah, + F_PaymentDetailCreated as Tanggal, + 'Pelunasan' as JenisBayarID, + CONCAT(F_PaymentNumber,'.',F_PaymentDetailID) as KwitansiID, + IF(F_PaymentDetailM_PaymentTypeID = 21,CONCAT(F_PaymentDetailM_PaymentTypeID,'0',F_PaymentDetailM_BankAccountID),CONCAT(F_PaymentDetailM_PaymentTypeID,F_PaymentDetailM_BankAccountID)) as TipeBayarID, + 'N' as Dibatalkan + FROM f_paymentdetail + JOIN f_payment ON F_PaymentDetailF_PaymentID = F_PaymentID AND F_PaymentIsActive = 'Y' + JOIN t_orderheader ON F_PaymentT_OrderHeaderID = T_OrderHeaderID + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' + WHERE + F_PaymentT_OrderHeaderID = ? AND F_PaymentDetailIsActive = 'Y' + GROUP BY F_PaymentDetailID"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'f_payment select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + //echo $this->db_onedev->last_query(); + //exit; + $bayar = $qry->result_array(); + + $raw_data[$key]['TrxBayar'] = $bayar; + } + + $raw_data[$key]['Trxtt'] = null; + $raw_data[$key]['TrxLain'] = null; + $raw_data[$key]['PaketDispenser'] = null; + $errors = []; + //exit; + $get_transaction = $this->get_transaction_by_labnumber($row['RegID']); + if($get_transaction && count($get_transaction) > 0){ + $result = $this->put_request($url, $raw_data[$key], $headers); + }else{ + $result = $this->post_request($url, $raw_data[$key], $headers); + } + + + + if ($result['error'] != null) { + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'error', + json_encode($result), + $url, + 555 + )); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'ais_transaction insert : '.$row['RegID'], 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'transaction insert : '.$row['RegID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($result)), 999); + + $errors[] = array('RegID' => $row['RegID'], 'error' => $result['error'] ?? ($result['message'] ?? 'Unknown error from external API')); + + + }else{ + //echo 'insert ais_transaction'; + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'success', + json_encode($result), + $url, + 555 + )); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'ais_transaction insert : '.$row['RegID'], 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + continue; + } + + $check_exist_medrec = $this->get_medrec_by_noreg($row['MEDRECID']); + if($check_exist_medrec['status'] == 'error'){ + $this->error_log(array('fn_name' => 'post_transaction_daily/get_medrec_by_noreg', 'message' => 'get medrec failed for no reg: '.$row['MEDRECID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($check_exist_medrec)), 999); + continue; + } + + if($check_exist_medrec['data'] == null){ + $post_medrec = $this->post_medrec_by_noreg($row['MEDRECID']); + if($post_medrec['status'] == 'error'){ + $this->error_log(array('fn_name' => 'post_transaction_daily/post_medrec_by_noreg', 'message' => 'post medrec failed for no reg: '.$row['MEDRECID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($post_medrec)), 999); + continue; + } + }else{ + $re_post_medrec = $this->re_post_medrec_by_noreg($row['MEDRECID']); + if($re_post_medrec['status'] == 'error'){ + $this->error_log(array('fn_name' => 'post_transaction_daily/re_post_medrec_by_noreg', 'message' => 're post medrec failed for no reg: '.$row['MEDRECID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($re_post_medrec)), 999); + continue; + } + } + } + } + + echo 'Selesai'; + } + + + function get_medrec_by_noreg($noreg) + { + $userid = 999; + // Get id from query parameter + + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'get_medrec_auth', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), $userid); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + return $errors; + } + + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . 'api/medrec?id='.$noreg; + + + $result = $this->get_request($url); + if (!$result['success']) { + $this->error_log(array('fn_name' => 'get_medrec', 'message' => 'failed get medrec', 'query' => '', 'json' => json_encode($result)), $userid); + $errors = array('status' => 'error', 'message' => 'Gagal Get Layanan'); + return $errors; + } + + $data = $result['response']['data'] ?? null; + // $data = json_encode($data); + $success = array('status' => 'success', 'message' => 'Berhasil Get Medrec', 'data' => $data); + return $success; + + } + + // Post Medrec + private function post_medrec_by_noreg($noreg) + { + $userid = 999; + + // Auth Login + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log([ + 'fn_name' => 'post_medrec_auth', + 'message' => 'failed auth', + 'query' => '', + 'json' => json_encode($login) + ], $userid); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + return $errors; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/medrec'; + + $headers = [ + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ]; + + // Ambil data layanan dari tabel t_test yang belum dikirim + $sql = "SELECT * + FROM m_patient n + LEFT JOIN cpone_log.ais_medrec a + ON n.M_PatientNoReg = a.Ais_MedrecPatientNoReg + WHERE n.M_PatientIsActive = 'Y' + AND a.Ais_MedrecPatientNoReg IS NULL AND n.M_PatientNoReg = ? + LIMIT 1"; + $qry = $this->db_onedev->query($sql, [$noreg]); + + if (!$qry) { + $this->error_log([ + 'fn_name' => 'post_medrec', + 'message' => 'medrec select failed', + 'query' => $this->db_onedev->last_query(), + 'json' => '' + ], $userid); + $errors = array('status' => 'error', 'message' => 'medrec select failed'); + return $errors; + } + + $raw_data = $qry->result_array(); + if(empty($raw_data)){ + $errors = array('status' => 'error', 'message' => 'Tidak ada data medrec yang belum dikirim untuk no reg: ' . $noreg); + return $errors; + } + $result_data = []; + $errors = []; + + foreach ($raw_data as $row) { + + if ($row['M_PatientGender'] == 'MALE') + 'L'; + if ($row['M_PatientGender'] == 'FEMALE') + 'P'; + + + $data = [ + "Nama" => $row['M_PatientName'], + "MEDRECID" => $row['M_PatientNoReg'], + "KodeRS" => "", + "PerusahaanID" => $row['M_PatientRegisteredByCorporateID'], + "NIK" => $row['M_PatientNIP'], + "Kelamin" => $row['M_PatientGender'], + "TanggalLahir" => $row['M_PatientDOB'], + "TempatLahir" => $row['M_PatientLocation'], + "Alamat" => $row['M_PatientAddress'], + "Couple" => 'N', + "CoupleID" => 0, + "LoginBuat" => 'system' + ]; + + + $result = $this->post_request($url, $data, $headers); + + + + if ($result['error'] == null) { + $sql = "INSERT INTO ais_medrec ( + Ais_MedrecPatientNoReg, + Ais_MedrecStatus, + Ais_MedrecJson, + Ais_MedrecResponse, + Ais_MedrecUserID, + Ais_MedrecCreated + ) + VALUES (?, ?, ?, ?, ?, NOW())"; + $this->db_log->query($sql, [ + $row['M_PatientNoReg'], + $result['errror'] == null?'success':'error', + json_encode($data), + json_encode($result), + $userid + ]); + + $success = [ + 'status' => 'success', + 'message' => 'Berhasil Post Medrec', + ]; + return $success; + }else{ + $success = [ + 'status' => 'error', + 'message' => 'Gagal Post Medrec: '.implode(', ', $result['error']), + 'errors' => $result['error'] + ]; + return $success; + } + + + + } + } + + + private function re_post_medrec_by_noreg($noreg) + { + $userid = 999; + + // Auth Login + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log([ + 'fn_name' => 're_post_medrec_auth', + 'message' => 'failed auth', + 'query' => '', + 'json' => json_encode($login) + ], $userid); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + return $errors; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/medrec'; + + $headers = [ + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ]; + + // Ambil data layanan dari tabel t_test yang belum dikirim + $sql = "SELECT * + FROM m_patient n + LEFT JOIN cpone_log.ais_medrec a + ON n.M_PatientNoReg = a.Ais_MedrecPatientNoReg + WHERE n.M_PatientIsActive = 'Y' + AND n.M_PatientNoReg = ? + LIMIT 1"; + $qry = $this->db_onedev->query($sql, [$noreg]); + + if (!$qry) { + $this->error_log([ + 'fn_name' => 'post_medrec', + 'message' => 'medrec select failed', + 'query' => $this->db_onedev->last_query(), + 'json' => '' + ], $userid); + $errors = array('status' => 'error', 'message' => 'medrec select failed'); + return $errors; + } + + $raw_data = $qry->result_array(); + if(empty($raw_data)){ + $errors = array('status' => 'error', 'message' => 'Tidak ada data medrec yang belum dikirim untuk no reg: ' . $noreg); + return $errors; + } + $result_data = []; + $errors = []; + + foreach ($raw_data as $row) { + + if ($row['M_PatientGender'] == 'MALE') + 'L'; + if ($row['M_PatientGender'] == 'FEMALE') + 'P'; + + + $data = [ + "Nama" => $row['M_PatientName'], + "MEDRECID" => $row['M_PatientNoReg'], + "KodeRS" => "", + "PerusahaanID" => $row['M_PatientRegisteredByCorporateID'], + "NIK" => $row['M_PatientNIP'], + "Kelamin" => $row['M_PatientGender'], + "TanggalLahir" => $row['M_PatientDOB'], + "TempatLahir" => $row['M_PatientLocation'], + "Alamat" => $row['M_PatientAddress'], + "Couple" => 'N', + "CoupleID" => 0, + "LoginBuat" => 'system' + ]; + + + $result = $this->put_request($url, $data, $headers); + + + + if ($result['error'] == null) { + $sql = "INSERT INTO ais_medrec ( + Ais_MedrecPatientNoReg, + Ais_MedrecStatus, + Ais_MedrecJson, + Ais_MedrecResponse, + Ais_MedrecUserID, + Ais_MedrecCreated + ) + VALUES (?, ?, ?, ?, ?, NOW())"; + $this->db_log->query($sql, [ + $row['M_PatientNoReg'], + $result['errror'] == null?'success':'error', + json_encode($data), + json_encode($result), + $userid + ]); + + $success = [ + 'status' => 'success', + 'message' => 'Berhasil Re-Post Medrec', + ]; + return $success; + }else{ + $success = [ + 'status' => 'error', + 'message' => 'Gagal Re-Post Medrec: '.implode(', ', $result['error']), + 'errors' => $result['error'] + ]; + return $success; + } + + + + } + } + + + + function post_transaction_by_labnumber() + { + $prm = $this->sys_input; + $labnum = $prm['labnumber']; + + // Auth Login + $login = $this->post_auth(); + + if (!$login['success']) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 555); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaction_full/transaksi.php'; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + + + // Get data + $sql = "SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + M_UserEmail as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + M_UserEmail as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID + JOIN t_priceheader ON Mgm_McuT_PriceHeaderID = T_PriceHeaderID + JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + WHERE T_OrderHeaderIsActive = 'Y' + AND T_OrderHeaderLabNumber = ? + AND ( T_OrderHeaderMgm_McuID != 0 AND T_OrderHeaderMgm_McuID IS NOT NULL) + + + UNION + + SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + IFNULL(M_UserEmail,'Administrator') as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + IFNULL(M_UserEmail,'Administrator') as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN t_orderheaderaddon ON T_OrderHeaderAddOnT_OrderHeaderID = T_OrderHeaderID + AND T_OrderHeaderAddOnIsActive = 'Y' + JOIN t_priceheader ON T_OrderHeaderAddOnT_PriceHeaderID = T_PriceHeaderID + LEFT JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + WHERE T_OrderHeaderIsActive = 'Y' + AND T_OrderHeaderLabNumber = ? + AND ( T_OrderHeaderMgm_McuID = 0 OR T_OrderHeaderMgm_McuID IS NULL) + + LIMIT 1; + "; + $qry = $this->db_onedev->query($sql, array($labnum,$labnum)); + + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $raw_data = $qry->result_array(); + if(count($raw_data) == 0){ + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + $errors = array('status' => 'error', 'message' => 'Data tidak ditemukan'); + echo json_encode($errors); + exit; + } + + $data = array(); + //echo json_encode($raw_data); + //exit; + foreach ($raw_data as $key => $row) { + + $row['TrxLayanan'] = []; + $row['TrxItem'] = []; + $row['TrxItemReturn'] = []; + $row['RegpasNominal'] = []; + $row['Trxtt'] = null; + $row['TrxBayar'] = []; + $row['TrxLain'] = null; + $row['PaketDispenser'] = null; + + $layanan = []; + $sql = "SELECT * FROM ( + SELECT T_OrderDetailID as TrxLayananID, + case + when Nat_GroupID = 1 then '1100' + when Nat_GroupID = 2 then '1200' + when Nat_GroupID = 3 then '1200' + when Nat_GroupID = 4 then '1303' + when Nat_GroupID = 5 then '1321' + when Nat_GroupID = 6 then '1600' + end as ProfitCostCenterCode, + '' as TrxDepartemenID, + T_OrderDetailCreated as TanggalBuat, + T_OrderDetailT_TestSasCode as LayananID, + T_OrderDetailT_TestName as LayananName, + doctorlab.M_DoctorCode as DokterID, + 0 as ShareRS, + 0 as ShareDokter, + 0 as ShareExternal, + 0 as ShareLain2, + '' as PihakExternal, + '' as PihakLain2, + 'Percentage' as ShareTipe, + T_OrderDetailPrice as Harga, + 1 as Jumlah, + 1 as Rate, + 'N' as FOC, + T_OrderDetailDiscTotal as Diskon, + 'Absolute' as TipeDiskon, + '' as DepartemenID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',T_OrderDetailTotal,0) as DitanggungPasien, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,T_OrderDetailTotal) as DitanggungPenjamin, + 0 as MarkUpCito, + 'N' as Cito, + IFNULL(T_PacketSasCode,'') as PaketID, + 'LABKLINIK' as KelasID, + '' as TrxLayananDetail, + 'Y' as Tagihkan + FROM t_orderdetail + JOIN t_test ON T_TestID = T_OrderDetailT_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' + JOIN t_orderdetailorder ON T_OrderDetailT_OrderDetailOrderID = T_OrderDetailOrderID AND T_OrderDetailOrderIsActive = 'Y' + JOIN t_orderheader ON T_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN m_doctor doctorlab ON T_OrderHeaderPjM_DoctorID = M_DoctorID + 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' + ) AS t_orderdetailorder"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan_debug = 0; + $layanan = $qry->result_array(); + $raw_data[$key]['TrxLayanan'] = []; + if(count($layanan) > 0){ + foreach($layanan as $key_layanan => $row_layanan){ + $total_layanan_debug += $row_layanan['Harga']; + $layanan[$key_layanan]['TrxLayananDetail'] = []; + $sql = "SELECT M_DoctorCode, M_DoctorID + FROM `so_resultentry` + JOIN t_orderdetail ON ? = So_ResultEntryT_OrderDetailID AND T_OrderDetailIsActive = 'Y' + JOIN m_doctor ON M_DoctorID = So_ResultEntryM_DoctorID AND M_DoctorIsActive = 'Y' + WHERE `So_ResultEntryT_OrderHeaderID` = ? AND + `So_ResultEntryIsActive` = 'Y' AND `So_ResultEntryM_DoctorID` > '0' + LIMIT 1 + "; + $qry = $this->db_onedev->query($sql, array($row_layanan['TrxLayananID'],$row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'so_resultentry select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $get_resultentry = $qry->result_array(); + if (count($get_resultentry) > 0) { + $row_layanan['DokterID'] = $get_resultentry[0]['M_DoctorCode']; + } + $raw_data[$key]['TrxLayanan'][] = $row_layanan; + } + } + + $regpasnominal = []; + $jumlah_layanan_lab = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lab + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 1 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + //echo $this->db_onedev->last_query(); + //exit; + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail lab select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + $get_layanan_lab = $qry->row_array(); + $jumlah_layanan_lab = $get_layanan_lab['total_layanan_lab']; + + $jumlah_layanan_radiologi = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_radiologi + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 3 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail radiologi select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $get_layanan_radiologi = $qry->row_array(); + $jumlah_layanan_radiologi = $get_layanan_radiologi['total_layanan_radiologi']; + + $jumlah_layanan_lain = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lain + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID NOT IN (1,3) + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail lain select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + + $get_layanan_lain = $qry->row_array(); + $jumlah_layanan_lain = $get_layanan_lain['total_layanan_lain']; + + $total_layanan = 0; + $sql = "SELECT SUM(T_OrderDetailTotal) as total_layanan + FROM t_orderdetail + JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail total layanan select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan = $qry->row_array(); + $total_layanan = $total_layanan['total_layanan']; + + + $total_bayar = 0; + $sql = "SELECT F_PaymentTotal as total + FROM f_payment + WHERE F_PaymentT_OrderHeaderID = ? AND F_PaymentIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'f_payment select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + $get_total_bayar = $qry->result_array(); + if (count($get_total_bayar) > 0) { + foreach($get_total_bayar as $key_total_bayar => $row_total_bayar){ + $total_bayar += $row_total_bayar['total']; + } + } + + + + $mgm_mcu_m_branch_id = $row['mgm_mcu_m_branch_id']; + $corporate_code = $row['CorporateCode']; + + $total_ditanggung_pasien = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? $total_layanan : 0; + $total_ditanggung_penjamin = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? 0 : $total_layanan; + + $regpasnominal = array( + "BiayaParamedik" => "0.00", + "ParamedikDitanggungPasien" => "0.00", + "ParamedikDitanggungPenjamin" => "0.00", + "BiayaAdministrasi" => "0", + "AdmDitanggungPasien" => "0.00", + "AdmDitanggungPenjamin" => "0.00", + "BiayaMaterai" => "0.00", + "BiayaMateraiDitanggungPasien" => "0.00", + "BiayaMateraiDitanggungPenjamin" => "0.00", + "JumlahLayanan" => $jumlah_layanan_lain, + "JumlahLayananRadiologi" => $jumlah_layanan_radiologi, + "JumlahLayananLaboratorium" => $jumlah_layanan_lab, + "JumlahItem" => 0, + "JumlahItemRetur" => 0, + "JumlahTT" => "0.00", + "JumlahBiayaLain" => "0.00", + "JumlahBayar" => $total_bayar, + "TipeDiskonGlobal" => "Absolute", + "DiskonGlobal" => "0.00", + "TotalDitanggungPasien" => $total_ditanggung_pasien, + "TotalDitanggungPenjamin" => $total_ditanggung_penjamin + ); + + $raw_data[$key]['RegpasNominal'] = array( + $regpasnominal + ); + + //echo $total_bayar; + $raw_data[$key]['TrxBayar'] = null; + if($total_bayar > 0){ + $sql = "SELECT M_PatientNoReg as MEDRECID, + F_PaymentDetailID as BayarID, + IFNULL(F_PaymentDetailAmount,0) as Jumlah, + F_PaymentDetailCreated as Tanggal, + 'Pelunasan' as JenisBayarID, + CONCAT(F_PaymentNumber,'.',F_PaymentDetailID) as KwitansiID, + IF(F_PaymentDetailM_PaymentTypeID = 21,CONCAT(F_PaymentDetailM_PaymentTypeID,'0',F_PaymentDetailM_BankAccountID),CONCAT(F_PaymentDetailM_PaymentTypeID,F_PaymentDetailM_BankAccountID)) as TipeBayarID, + 'N' as Dibatalkan + FROM f_paymentdetail + JOIN f_payment ON F_PaymentDetailF_PaymentID = F_PaymentID AND F_PaymentIsActive = 'Y' + JOIN t_orderheader ON F_PaymentT_OrderHeaderID = T_OrderHeaderID + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' + WHERE + F_PaymentT_OrderHeaderID = ? AND F_PaymentDetailIsActive = 'Y' + GROUP BY F_PaymentDetailID"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'f_payment select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + //echo $this->db_onedev->last_query(); + //exit; + $bayar = $qry->result_array(); + + $raw_data[$key]['TrxBayar'] = $bayar; + } + + $raw_data[$key]['Trxtt'] = null; + $raw_data[$key]['TrxLain'] = null; + $raw_data[$key]['PaketDispenser'] = null; + $errors = []; + //exit; + $result = $this->post_request($url, $raw_data[$key], $headers); + + + + if ($result['error'] != null) { + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'error', + json_encode($result), + $url, + 555 + )); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'transaction insert', 'query' => $this->db_onedev->last_query(), 'json' => json_encode($result)), 999); + + $errors[] = array('RegID' => $row['RegID'], 'error' => $result['error'] ?? ($result['message'] ?? 'Unknown error from external API')); + + + }else{ + //echo 'insert ais_transaction'; + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'success', + json_encode($result), + $url, + 555 + )); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + } + + + + } + + if(count($errors) > 0){ + $success = array('status' => 'error', 'message' => 'Gagal Post Transaction', 'errors' => $errors); + echo json_encode($success); + exit; + }else{ + $success = array('status' => 'success', 'message' => 'Berhasil Post Transaction'); + echo json_encode($success); + exit; + } + + } + + function re_post_transaction_by_labnumber() + { + $prm = $this->sys_input; + $labnum = $prm['labnumber']; + // Auth Login + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 555); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaction_full/transaksi.php'; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + + // Get data + $sql = "SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + IFNULL(M_UserEmail,'Administrator') as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + IFNULL(M_UserEmail,'Administrator') as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID + JOIN t_priceheader ON Mgm_McuT_PriceHeaderID = T_PriceHeaderID + LEFT JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + WHERE T_OrderHeaderIsActive = 'Y' + AND T_OrderHeaderLabNumber = ? + AND ( T_OrderHeaderMgm_McuID != 0 AND T_OrderHeaderMgm_McuID IS NOT NULL)-- TAMBAHAN: Exclude cases where Mgm_McuID = 0 + + UNION + + SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + IFNULL(M_UserEmail,'Administrator') as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + IFNULL(M_UserEmail,'Administrator') as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN t_orderheaderaddon ON T_OrderHeaderAddOnT_OrderHeaderID = T_OrderHeaderID + AND T_OrderHeaderAddOnIsActive = 'Y' + JOIN t_priceheader ON T_OrderHeaderAddOnT_PriceHeaderID = T_PriceHeaderID + LEFT JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + WHERE T_OrderHeaderIsActive = 'Y' + AND T_OrderHeaderLabNumber = ? + AND ( T_OrderHeaderMgm_McuID = 0 OR T_OrderHeaderMgm_McuID IS NULL) + + LIMIT 1 + "; + $qry = $this->db_onedev->query($sql, array($labnum,$labnum)); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $raw_data = $qry->result_array(); + if(count($raw_data) == 0){ + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + $errors = array('status' => 'error', 'message' => 'Data tidak ditemukan'); + echo json_encode($errors); + exit; + } + + $data = array(); + foreach ($raw_data as $key => $row) { + + $row['TrxLayanan'] = []; + $row['TrxItem'] = []; + $row['TrxItemReturn'] = []; + $row['RegpasNominal'] = []; + $row['Trxtt'] = null; + $row['TrxBayar'] = []; + $row['TrxLain'] = null; + $row['PaketDispenser'] = null; + + $layanan = []; + $sql = "SELECT * FROM ( + SELECT T_OrderDetailID as TrxLayananID, + case + when Nat_GroupID = 1 then '1100' + when Nat_GroupID = 2 then '1200' + when Nat_GroupID = 3 then '1200' + when Nat_GroupID = 4 then '1303' + when Nat_GroupID = 5 then '1321' + when Nat_GroupID = 6 then '1600' + end as ProfitCostCenterCode, + '' as TrxDepartemenID, + T_OrderDetailCreated as TanggalBuat, + T_OrderDetailT_TestSasCode as LayananID, + T_OrderDetailT_TestName as LayananName, + doctorlab.M_DoctorCode as DokterID, + 0 as ShareRS, + 0 as ShareDokter, + 0 as ShareExternal, + 0 as ShareLain2, + '' as PihakExternal, + '' as PihakLain2, + 'Percentage' as ShareTipe, + T_OrderDetailPrice as Harga, + 1 as Jumlah, + 1 as Rate, + 'N' as FOC, + T_OrderDetailDiscTotal as Diskon, + 'Absolute' as TipeDiskon, + '' as DepartemenID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',T_OrderDetailTotal,0) as DitanggungPasien, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,T_OrderDetailTotal) as DitanggungPenjamin, + 0 as MarkUpCito, + 'N' as Cito, + IFNULL(T_PacketSasCode,'') as PaketID, + 'LABKLINIK' as KelasID, + '' as TrxLayananDetail, + 'Y' as Tagihkan + FROM t_orderdetail + JOIN t_test ON T_TestID = T_OrderDetailT_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' + JOIN t_orderdetailorder ON T_OrderDetailT_OrderDetailOrderID = T_OrderDetailOrderID AND T_OrderDetailOrderIsActive = 'Y' + JOIN t_orderheader ON T_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN m_doctor doctorlab ON T_OrderHeaderPjM_DoctorID = M_DoctorID + 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' + ) AS t_orderdetailorder"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan_debug = 0; + $layanan = $qry->result_array(); + $raw_data[$key]['TrxLayanan'] = []; + if(count($layanan) > 0){ + foreach($layanan as $key_layanan => $row_layanan){ + $total_layanan_debug += $row_layanan['Harga']; + $layanan[$key_layanan]['TrxLayananDetail'] = []; + $sql = "SELECT M_DoctorCode, M_DoctorID + FROM `so_resultentry` + JOIN t_orderdetail ON ? = So_ResultEntryT_OrderDetailID AND T_OrderDetailIsActive = 'Y' + JOIN m_doctor ON M_DoctorID = So_ResultEntryM_DoctorID AND M_DoctorIsActive = 'Y' + WHERE `So_ResultEntryT_OrderHeaderID` = ? AND + `So_ResultEntryIsActive` = 'Y' AND `So_ResultEntryM_DoctorID` > '0' + LIMIT 1 + "; + $qry = $this->db_onedev->query($sql, array($row_layanan['TrxLayananID'],$row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'so_resultentry select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $get_resultentry = $qry->result_array(); + if (count($get_resultentry) > 0) { + $row_layanan['DokterID'] = $get_resultentry[0]['M_DoctorCode']; + } + $raw_data[$key]['TrxLayanan'][] = $row_layanan; + } + } + + $regpasnominal = []; + $jumlah_layanan_lab = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lab + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 1 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + //echo $this->db_onedev->last_query(); + //exit; + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail lab select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + $get_layanan_lab = $qry->row_array(); + $jumlah_layanan_lab = $get_layanan_lab['total_layanan_lab']; + + $jumlah_layanan_radiologi = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_radiologi + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 3 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail radiologi select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $get_layanan_radiologi = $qry->row_array(); + $jumlah_layanan_radiologi = $get_layanan_radiologi['total_layanan_radiologi']; + + $jumlah_layanan_lain = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lain + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID NOT IN (1,3) + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail lain select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + + $get_layanan_lain = $qry->row_array(); + $jumlah_layanan_lain = $get_layanan_lain['total_layanan_lain']; + + $total_layanan = 0; + $sql = "SELECT SUM(T_OrderDetailTotal) as total_layanan + FROM t_orderdetail + JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail total layanan select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan = $qry->row_array(); + $total_layanan = $total_layanan['total_layanan']; + + + $total_bayar = 0; + $sql = "SELECT F_PaymentTotal as total + FROM f_payment + WHERE F_PaymentT_OrderHeaderID = ? AND F_PaymentIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'f_payment select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + $get_total_bayar = $qry->result_array(); + if (count($get_total_bayar) > 0) { + foreach($get_total_bayar as $key_total_bayar => $row_total_bayar){ + $total_bayar += $row_total_bayar['total']; + } + } + + + + $mgm_mcu_m_branch_id = $row['mgm_mcu_m_branch_id']; + $corporate_code = $row['CorporateCode']; + + $total_ditanggung_pasien = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? $total_layanan : 0; + $total_ditanggung_penjamin = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? 0 : $total_layanan; + + $regpasnominal = array( + "BiayaParamedik" => "0.00", + "ParamedikDitanggungPasien" => "0.00", + "ParamedikDitanggungPenjamin" => "0.00", + "BiayaAdministrasi" => "0", + "AdmDitanggungPasien" => "0.00", + "AdmDitanggungPenjamin" => "0.00", + "BiayaMaterai" => "0.00", + "BiayaMateraiDitanggungPasien" => "0.00", + "BiayaMateraiDitanggungPenjamin" => "0.00", + "JumlahLayanan" => $jumlah_layanan_lain, + "JumlahLayananRadiologi" => $jumlah_layanan_radiologi, + "JumlahLayananLaboratorium" => $jumlah_layanan_lab, + "JumlahItem" => 0, + "JumlahItemRetur" => 0, + "JumlahTT" => "0.00", + "JumlahBiayaLain" => "0.00", + "JumlahBayar" => $total_bayar, + "TipeDiskonGlobal" => "Absolute", + "DiskonGlobal" => "0.00", + "TotalDitanggungPasien" => $total_ditanggung_pasien, + "TotalDitanggungPenjamin" => $total_ditanggung_penjamin + ); + + + + $raw_data[$key]['RegpasNominal'] = array( + $regpasnominal + ); + + //echo $total_bayar; + $raw_data[$key]['TrxBayar'] = null; + if($total_bayar > 0){ + $sql = "SELECT M_PatientNoReg as MEDRECID, + F_PaymentDetailID as BayarID, + IFNULL(F_PaymentDetailAmount,0) as Jumlah, + F_PaymentDetailCreated as Tanggal, + 'Pelunasan' as JenisBayarID, + CONCAT(F_PaymentNumber,'.',F_PaymentDetailID) as KwitansiID, + IF(F_PaymentDetailM_PaymentTypeID = 21,CONCAT(F_PaymentDetailM_PaymentTypeID,'0',F_PaymentDetailM_BankAccountID),CONCAT(F_PaymentDetailM_PaymentTypeID,F_PaymentDetailM_BankAccountID)) as TipeBayarID, + 'N' as Dibatalkan + FROM f_paymentdetail + JOIN f_payment ON F_PaymentDetailF_PaymentID = F_PaymentID AND F_PaymentIsActive = 'Y' + JOIN t_orderheader ON F_PaymentT_OrderHeaderID = T_OrderHeaderID + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' + WHERE + F_PaymentT_OrderHeaderID = ? AND F_PaymentDetailIsActive = 'Y' + GROUP BY F_PaymentDetailID"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'f_payment select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + //echo $this->db_onedev->last_query(); + //exit; + $bayar = $qry->result_array(); + + $raw_data[$key]['TrxBayar'] = $bayar; + } + + $raw_data[$key]['Trxtt'] = null; + $raw_data[$key]['TrxLain'] = null; + $raw_data[$key]['PaketDispenser'] = null; + $errors = []; + + //echo json_encode($raw_data[$key]); + //exit; + $result = $this->put_request($url, $raw_data[$key], $headers); + + + if ($result['error'] != null) { + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'error', + json_encode($result), + $url, + 555 + )); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'transaction insert', 'query' => $this->db_onedev->last_query(), 'json' => json_encode($result)), 999); + + $errors[] = array('RegID' => $row['RegID'], 'error' => $result['message']); + + + }else{ + //echo 'insert ais_transaction'; + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'success', + json_encode($result), + $url, + 555 + )); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + } + + + + } + + if(count($errors) > 0){ + $success = array('status' => 'error', 'message' => 'Gagal Post Transaction', 'errors' => $errors); + echo json_encode($success); + exit; + }else{ + $success = array('status' => 'success', 'message' => 'Berhasil Post Transaction'); + echo json_encode($success); + exit; + } + + } + + function post_transaction($labnum='',$xdate=null) + { + // Auth Login + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 555); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaction_full/transaksi.php'; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + + + if($labnum == ''){ + $xdate = $xdate == null ? date('Y-m-d') : $xdate; + } + // Get data + $sql = "SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + Mgm_McuM_BranchID as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + M_UserEmail as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + M_UserEmail as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID -- AND Mgm_McuID = 1566 + JOIN t_priceheader ON Mgm_McuT_PriceHeaderID = T_PriceHeaderID + JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + LEFT JOIN cpone_log.ais_transaction ON Ais_TransactionOrderHeaderLabNumber = T_OrderHeaderLabNumber AND + Ais_TransactionStatus = 'success' + WHERE T_OrderHeaderIsActive = 'Y' AND + T_OrderHeaderLabNumber = ? AND + Ais_TransactionID IS NULL + GROUP BY T_OrderHeaderID + LIMIT 100"; + $qry = $this->db_onedev->query($sql, array($labnum)); + //echo $this->db_onedev->last_query(); + //exit; + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $raw_data = $qry->result_array(); + + $data = array(); + foreach ($raw_data as $key => $row) { + + $row['TrxLayanan'] = []; + $row['TrxItem'] = []; + $row['TrxItemReturn'] = []; + $row['RegpasNominal'] = []; + $row['Trxtt'] = null; + $row['TrxBayar'] = []; + $row['TrxLain'] = null; + $row['PaketDispenser'] = null; + + $layanan = []; + $sql = "SELECT * FROM ( + SELECT T_OrderDetailID as TrxLayananID, + case + when Nat_GroupID = 1 then '1100' + when Nat_GroupID = 2 then '1200' + when Nat_GroupID = 3 then '1200' + when Nat_GroupID = 4 then '1303' + when Nat_GroupID = 5 then '1321' + when Nat_GroupID = 6 then '1600' + end as ProfitCostCenterCode, + '' as TrxDepartemenID, + T_OrderDetailCreated as TanggalBuat, + T_OrderDetailT_TestSasCode as LayananID, + T_OrderDetailT_TestName as LayananName, + doctorlab.M_DoctorCode as DokterID, + 0 as ShareRS, + 0 as ShareDokter, + 0 as ShareExternal, + 0 as ShareLain2, + '' as PihakExternal, + '' as PihakLain2, + 'Percentage' as ShareTipe, + T_OrderDetailPrice as Harga, + 1 as Jumlah, + 1 as Rate, + 'N' as FOC, + T_OrderDetailDiscTotal as Diskon, + 'Absolute' as TipeDiskon, + '' as DepartemenID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',T_OrderDetailTotal,0) as DitanggungPasien, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,T_OrderDetailTotal) as DitanggungPenjamin, + 0 as MarkUpCito, + 'N' as Cito, + T_PacketSasCode as PaketID, + 'LABKLINIK' as KelasID, + '' as TrxLayananDetail, + 'Y' as Tagihkan + FROM t_orderdetail + JOIN t_test ON T_TestID = T_OrderDetailT_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' + JOIN t_orderdetailorder ON T_OrderDetailT_OrderDetailOrderID = T_OrderDetailOrderID AND + T_OrderDetailOrderIsPacket = 'Y' AND T_OrderDetailOrderIsActive = 'Y' + JOIN t_packet ON T_OrderDetailOrderT_PacketID = T_PacketID + JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_PacketID AND T_PacketDetailT_TestID = T_OrderDetailT_TestID AND + T_PacketDetailIsActive = 'Y' + JOIN t_orderheader ON T_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID + 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' + UNION + SELECT T_OrderDetailID as TrxLayananID, + Nat_GroupID as ProfitCostCenterCode, + '' as TrxDepartemenID, + T_OrderDetailCreated as TanggalBuat, + T_OrderDetailT_TestSasCode as LayananID, + T_OrderDetailT_TestName as LayananName, + doctorlab.M_DoctorCode as DokterID, + 0 as ShareRS, + 0 as ShareDokter, + 0 as ShareExternal, + 0 as ShareLain2, + '' as PihakExternal, + '' as PihakLain2, + 'Percentage' as ShareTipe, + T_OrderDetailPrice as Harga, + 1 as Jumlah, + 1 as Rate, + 'N' as FOC, + T_OrderDetailDiscTotal as Diskon, + 'Absolute' as TipeDiskon, + '' as DepartemenID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',T_OrderDetailTotal,0) as DitanggungPasien, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,T_OrderDetailTotal) as DitanggungPenjamin, + 0 as MarkUpCito, + 'N' as Cito, + '' as PaketID, + 'LABKLINIK' as KelasID, + NULL as TrxLayananDetail, + 'Y' as Tagihkan + FROM `t_orderdetailorder` + JOIN t_orderdetail ON T_OrderdetailT_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID AND + T_OrderDetailIsActive = 'Y' AND T_OrderDetailT_OrderDetailOrderID = T_OrderDetailOrderID + JOIN t_test ON T_TestID = T_OrderDetailT_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' + JOIN t_orderheader ON T_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID + 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"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'],$row['T_OrderHeaderID'])); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan_debug = 0; + $layanan = $qry->result_array(); + $raw_data[$key]['TrxLayanan'] = []; + if(count($layanan) > 0){ + foreach($layanan as $key_layanan => $row_layanan){ + $total_layanan_debug += $row_layanan['Harga']; + $layanan[$key_layanan]['TrxLayananDetail'] = []; + $sql = "SELECT M_DoctorCode, M_DoctorID + FROM `so_resultentry` + JOIN t_orderdetail ON ? = So_ResultEntryT_OrderDetailID AND T_OrderDetailIsActive = 'Y' + JOIN m_doctor ON M_DoctorID = So_ResultEntryM_DoctorID AND M_DoctorIsActive = 'Y' + WHERE `So_ResultEntryT_OrderHeaderID` = ? AND + `So_ResultEntryIsActive` = 'Y' AND `So_ResultEntryM_DoctorID` > '0' + LIMIT 1 + "; + $qry = $this->db_onedev->query($sql, array($row_layanan['TrxLayananID'],$row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'so_resultentry select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $get_resultentry = $qry->result_array(); + if (count($get_resultentry) > 0) { + $row_layanan['DokterID'] = $get_resultentry[0]['M_DoctorCode']; + } + $raw_data[$key]['TrxLayanan'][] = $row_layanan; + } + } + + $regpasnominal = []; + $jumlah_layanan_lab = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lab + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 1 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + //echo $this->db_onedev->last_query(); + //exit; + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail lab select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + $get_layanan_lab = $qry->row_array(); + $jumlah_layanan_lab = $get_layanan_lab['total_layanan_lab']; + + $jumlah_layanan_radiologi = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_radiologi + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 3 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail radiologi select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $get_layanan_radiologi = $qry->row_array(); + $jumlah_layanan_radiologi = $get_layanan_radiologi['total_layanan_radiologi']; + + $jumlah_layanan_lain = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lain + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID NOT IN (1,3) + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail lain select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + + $get_layanan_lain = $qry->row_array(); + $jumlah_layanan_lain = $get_layanan_lain['total_layanan_lain']; + + $total_layanan = 0; + $sql = "SELECT SUM(T_OrderDetailTotal) as total_layanan + FROM t_orderdetail + JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail total layanan select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan = $qry->row_array(); + $total_layanan = $total_layanan['total_layanan']; + + + $total_bayar = 0; + $sql = "SELECT F_PaymentTotal as total + FROM f_payment + WHERE F_PaymentT_OrderHeaderID = ? AND F_PaymentIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'f_payment select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + $get_total_bayar = $qry->result_array(); + if (count($get_total_bayar) > 0) { + foreach($get_total_bayar as $key_total_bayar => $row_total_bayar){ + $total_bayar += $row_total_bayar['total']; + } + } + + + + $mgm_mcu_m_branch_id = $row['mgm_mcu_m_branch_id']; + $corporate_code = $row['CorporateCode']; + + $total_ditanggung_pasien = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? $total_layanan : 0; + $total_ditanggung_penjamin = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? 0 : $total_layanan; + + $regpasnominal = array( + "BiayaParamedik" => "0.00", + "ParamedikDitanggungPasien" => "0.00", + "ParamedikDitanggungPenjamin" => "0.00", + "BiayaAdministrasi" => "0", + "AdmDitanggungPasien" => "0.00", + "AdmDitanggungPenjamin" => "0.00", + "BiayaMaterai" => "0.00", + "BiayaMateraiDitanggungPasien" => "0.00", + "BiayaMateraiDitanggungPenjamin" => "0.00", + "JumlahLayanan" => $jumlah_layanan_lain, + "JumlahLayananRadiologi" => $jumlah_layanan_radiologi, + "JumlahLayananLaboratorium" => $jumlah_layanan_lab, + "JumlahItem" => 0, + "JumlahItemRetur" => 0, + "JumlahTT" => "0.00", + "JumlahBiayaLain" => "0.00", + "JumlahBayar" => $total_bayar, + "TipeDiskonGlobal" => "Absolute", + "DiskonGlobal" => "0.00", + "TotalDitanggungPasien" => $total_ditanggung_pasien, + "TotalDitanggungPenjamin" => $total_ditanggung_penjamin + ); + + $raw_data[$key]['RegpasNominal'] = array( + $regpasnominal + ); + + //echo $total_bayar; + $raw_data[$key]['TrxBayar'] = null; + if($total_bayar > 0){ + $sql = "SELECT M_PatientNoReg as MEDRECID, + F_PaymentDetailID as BayarID, + IFNULL(F_PaymentDetailAmount,0) as Jumlah, + F_PaymentDetailCreated as Tanggal, + 'Pelunasan' as JenisBayarID, + CONCAT(F_PaymentNumber,'.',F_PaymentDetailID) as KwitansiID, + IF(F_PaymentDetailM_PaymentTypeID = 21,CONCAT(F_PaymentDetailM_PaymentTypeID,'0',F_PaymentDetailM_BankAccountID),CONCAT(F_PaymentDetailM_PaymentTypeID,F_PaymentDetailM_BankAccountID)) as TipeBayarID, + 'N' as Dibatalkan + FROM f_paymentdetail + JOIN f_payment ON F_PaymentDetailF_PaymentID = F_PaymentID AND F_PaymentIsActive = 'Y' + JOIN t_orderheader ON F_PaymentT_OrderHeaderID = T_OrderHeaderID + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' + WHERE + F_PaymentT_OrderHeaderID = ? AND F_PaymentDetailIsActive = 'Y' + GROUP BY F_PaymentDetailID"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'f_payment select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + //echo $this->db_onedev->last_query(); + //exit; + $bayar = $qry->result_array(); + + $raw_data[$key]['TrxBayar'] = $bayar; + } + + $raw_data[$key]['Trxtt'] = null; + $raw_data[$key]['TrxLain'] = null; + $raw_data[$key]['PaketDispenser'] = null; + $errors = []; + + //echo json_encode($raw_data[$key]); + //exit; + $result = $this->post_request($url, $raw_data[$key], $headers); + + + if ($result['error'] != null) { + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'error', + json_encode($result), + $url, + 555 + )); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'transaction insert', 'query' => $this->db_onedev->last_query(), 'json' => json_encode($result)), 999); + + $errors[] = array('RegID' => $row['RegID'], 'error' => $result['message']); + + + }else{ + //echo 'insert ais_transaction'; + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'success', + json_encode($result), + $url, + 555 + )); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + } + + + + } + + if(count($errors) > 0){ + $success = array('status' => 'error', 'message' => 'Gagal Post Transaction', 'errors' => $errors); + echo json_encode($success); + exit; + }else{ + $success = array('status' => 'success', 'message' => 'Berhasil Post Transaction'); + echo json_encode($success); + exit; + } + + } + + function get_transaction() + { + // Get id from query parameter + $id = $this->input->get('id'); + + if (empty($id)) { + $errors = array('status' => 'error', 'message' => 'ID parameter is required'); + echo json_encode($errors); + exit; + } + + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'get_transaction_auth', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 999); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaksi?id=' . $id; + + + $result = $this->get_request($url); + if (!$result['success']) { + $this->error_log(array('fn_name' => 'get_transaction', 'message' => 'failed get transaction', 'query' => '', 'json' => json_encode($result)), 999); + $errors = array('status' => 'error', 'message' => 'Gagal Get Transaction'); + echo json_encode($errors); + exit; + } + + $data = $result['response']['data'] ?? null; + // $data = json_encode($data); + $success = array('status' => 'success', 'message' => 'Berhasil Get Transaction', 'data' => $data); + echo json_encode($success); + exit; + + } + + function check_exist_transaction(){ + $prm = $this->sys_input; + $labnumber = $prm['labnumber'] ?? null; + if(empty($labnumber)){ + $errors = array('status' => 'error', 'message' => 'Labnumber parameter is required'); + echo json_encode($errors); + exit; + } + + $transaction = $this->get_transaction_by_labnumber($labnumber); + if($transaction){ + $success = array('status' => 'success', 'message' => 'Transaksi sudah ada', 'data' => $transaction); + echo json_encode($success); + exit; + }else{ + $success = array('status' => 'error', 'message' => 'Transaksi tidak ditemukan', 'data' => null); + echo json_encode($success); + exit; + } + } + + function get_transaction_by_labnumber_debug($labnumber) + { + // Get id from query parameter + if (empty($labnumber)) { + $errors = array('status' => 'error', 'message' => 'Labnumber parameter is required'); + echo json_encode($errors); + exit; + } + + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'get_transaction_auth', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 999); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaksi?id=' . $labnumber; + + + $result = $this->get_request($url); + + + $data = $result['response']['data'] ?? null; + + if($data && count($data) > 0){ + echo json_encode($data); + exit; + }else{ + return null; + } + } + + + function get_transaction_by_labnumber($labnumber) + { + // Get id from query parameter + if (empty($labnumber)) { + $errors = array('status' => 'error', 'message' => 'Labnumber parameter is required'); + echo json_encode($errors); + exit; + } + + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'get_transaction_auth', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 999); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaksi?id=' . $labnumber; + + + $result = $this->get_request($url); + + + $data = $result['response']['data'] ?? null; + //echo json_encode($result); + + if($data && count($data) > 0){ + return $data; + }else{ + return null; + } + } + + function delete_transaction_by_date(){ + $failed_delete = array(); + $already_deleted = array(); + $transaksi_tidak_ditemukan = array(); + $prm = $this->sys_input; + $min_date = $prm['min_date'] ?? null; + $max_date = $prm['max_date'] ?? null; + if(empty($min_date) || empty($max_date)){ + $errors = array('status' => 'error', 'message' => 'Min date and max date parameter is required'); + echo json_encode($errors); + exit; + } + + if ($min_date && $max_date) { + $min_date_obj = new DateTime($min_date); + $max_date_obj = new DateTime($max_date); + $date_diff = $min_date_obj->diff($max_date_obj); + $days_diff = $date_diff->days; + + if ($days_diff > 5) { + $errors = array('status' => 'error', 'message' => 'Selisih antara min_date dan max_date maksimal 7 hari'); + echo json_encode($errors); + exit; + } + } + + $params = array($min_date, $max_date); + $sql = "SELECT T_OrderHeaderLabNumber as RegID + FROM t_orderheader + WHERE ( DATE(T_OrderHeaderDate) >= ? AND DATE(T_OrderHeaderDate) <= ? ) AND T_OrderHeaderIsActive = 'N' + + + "; + $qry = $this->db_onedev->query($sql, $params); + //echo $this->db_onedev->last_query(); + //exit; + if(!$qry){ + $this->error_log(array('fn_name' => 'delete_transaction_by_date', 'message' => 'Gagal select t_orderheader delete by date', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + $errors = array('status' => 'error', 'message' => 'Gagal select t_orderheader delete by date', 'query' => $this->db_onedev->last_query(), 'json' => ''); + echo json_encode($errors); + exit; + } + $raw_data = $qry->result_array(); + + if(count($raw_data) == 0){ + $success = array('status' => 'success', 'message' => 'Tidak ada data yang perlu dihapus'); + echo json_encode($success); + exit; + } + + foreach($raw_data as $row){ + $get_transaction = $this->get_transaction_by_labnumber($row['RegID']); + //echo json_encode($get_transaction); + //exit; + if($get_transaction && count($get_transaction) > 0){ + $result = $this->delete_transaction_by_labnumber_private($row['RegID']); + if(!$result){ + $failed_delete[] = $row['RegID']; + } + }else{ + $transaksi_tidak_ditemukan[] = $row['RegID']; + } + } + + $msg = ""; + if(count($failed_delete) > 0){ + $msg .= "Gagal Delete Transaction Some Data: " . implode(', ', $failed_delete); + } + if(count($transaksi_tidak_ditemukan) > 0){ + $msg .= "Beberapa transaksi tidak ditemukan: " . implode(', ', $transaksi_tidak_ditemukan); + } + if(count($failed_delete) == 0 && count($transaksi_tidak_ditemukan) == 0){ + $msg .= "Berhasil Delete Transaction"; + } + + $arr_res = array( + 'status' => 'selesai', + 'message' => $msg, + 'data' => $raw_data, + 'failed_delete' => $failed_delete, + 'transaksi_tidak_ditemukan' => $transaksi_tidak_ditemukan + ); + echo json_encode($arr_res); + exit; + } + + function delete_transaction_by_labnumber_range(){ + + $sql = "SELECT T_OrderHeaderLabNumber as RegID + FROM t_orderheader + JOIN delete_cpone_order_walk_in_inject ON + delete_cpone_order_walk_in_inject.reg_id = t_orderheader.T_OrderHeaderLabNumber + WHERE t_orderheader.T_OrderHeaderIsActive = 'N' + LIMIT 100 + "; + $qry = $this->db_onedev->query($sql, $params); + //echo $this->db_onedev->last_query(); + //exit; + if(!$qry){ + $this->error_log(array('fn_name' => 'delete_transaction_by_labnumber_range', 'message' => 'Gagal select t_orderheader delete by labnumber range', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + $errors = array('status' => 'error', 'message' => 'Gagal select t_orderheader delete by labnumber range', 'query' => $this->db_onedev->last_query(), 'json' => ''); + echo json_encode($errors); + exit; + } + $raw_data = $qry->result_array(); + + if(count($raw_data) == 0){ + $success = array('status' => 'success', 'message' => 'Tidak ada data yang perlu dihapus'); + echo json_encode($success); + exit; + } + + foreach($raw_data as $row){ + $get_transaction = $this->get_transaction_by_labnumber($row['RegID']); + //echo json_encode($get_transaction); + //exit; + if($get_transaction && count($get_transaction) > 0){ + $result = $this->delete_transaction_by_labnumber_private($row['RegID']); + if(!$result){ + $failed_delete[] = $row['RegID']; + } + }else{ + $transaksi_tidak_ditemukan[] = $row['RegID']; + } + } + + $msg = ""; + if(count($failed_delete) > 0){ + $msg .= "Gagal Delete Transaction Some Data: " . implode(', ', $failed_delete); + } + if(count($transaksi_tidak_ditemukan) > 0){ + $msg .= "Beberapa transaksi tidak ditemukan: " . implode(', ', $transaksi_tidak_ditemukan); + } + if(count($failed_delete) == 0 && count($transaksi_tidak_ditemukan) == 0){ + $msg .= "Berhasil Delete Transaction"; + } + + $arr_res = array( + 'status' => 'selesai', + 'message' => $msg, + 'data' => $raw_data, + 'failed_delete' => $failed_delete, + 'transaksi_tidak_ditemukan' => $transaksi_tidak_ditemukan + ); + echo json_encode($arr_res); + exit; + } + + function delete_transaction_by_labnumber_private($labnumber) + { + $userid = 999777; + //echo $labnumber; + // Get id from query parameter + if (empty($labnumber)) { + $errors = array('status' => 'error', 'message' => 'Labnumber parameter is required'); + echo json_encode($errors); + exit; + } + + // Get config first before using it + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'get_transaction_auth', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 999); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + return false; + } + + $url = $baseUrl . '/api/transaction_full/transaksi.php'; + + + $result = $this->delete_request($url, ['RegID' => $labnumber], $headers); + + //echo json_encode($result); + + + //response {"success":true} + + + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) VALUES (?, ?, ?, ?, ?, ?, NOW())"; + $qry = $this->db_log->query($sql, array( + $labnumber, + json_encode(['RegID' => $labnumber]), + $result['success'] ? 'success' : 'error', + json_encode($result), + $url, + $userid + )); + //echo $this->db_log->last_query(); + //exit; + if(!$qry){ + echo $this->db_log->last_query(); + exit; + $errors = array('status' => 'error', 'message' => 'Gagal Insert Ais Transaction Log','query' => $this->db_log->last_query(), 'json' => json_encode($result)); + $this->error_log(array('fn_name' => 'delete_transaction_by_labnumber', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + $this->sys_error($errors); + exit; + } + + if($result['success']){ + return true; + }else{ + //$this->error_log(array('fn_name' => 'delete_transaction_by_labnumber', 'message' => 'Gagal Delete Transaction', 'query' => '', 'json' => json_encode($result)), 999); + return false; + } + + + } + + function delete_transaction_by_labnumber() + { + if (! $this->isLogin) { + $this->sys_error("Invalid Token"); + exit; + } + $prm = $this->sys_input; + $userid = $this->sys_user['M_UserID'] ?? 555; + $labnumber = $prm['labnumber'] ?? null; + // Get id from query parameter + if (empty($labnumber)) { + $errors = array('status' => 'error', 'message' => 'Labnumber parameter is required'); + echo json_encode($errors); + exit; + } + + // Get config first before using it + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'get_transaction_auth', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 999); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + + $url = $baseUrl . '/api/transaction_full/transaksi.php'; + + + $result = $this->delete_request($url, ['RegID' => $labnumber], $headers); + + //response {"success":true} + + + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) VALUES (?, ?, ?, ?, ?, ?, NOW())"; + $qry = $this->db_log->query($sql, array( + $labnumber, + json_encode(['RegID' => $labnumber]), + $result['success'] ? 'success' : 'error', + json_encode($result), + $url, + $userid + )); + if(!$qry){ + + $errors = array('status' => 'error', 'message' => 'Gagal Insert Ais Transaction Log','query' => $this->db_log->last_query(), 'json' => json_encode($result)); + $this->error_log(array('fn_name' => 'delete_transaction_by_labnumber', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + $this->sys_error($errors); + exit; + } + + if($result['success']){ + $success = array('status' => 'success', 'message' => 'Berhasil Delete Transaction'); + $this->sys_ok($success); + exit; + }else{ + $errors = array('status' => 'error', 'message' => 'Gagal Delete Transaction'); + $this->sys_error($errors); + exit; + } + + + } + + + function monitoring_transaction() + { + if (! $this->isLogin) { + $this->sys_error("Invalid Token"); + exit; + } + + $sql_base = "SELECT + oh.T_OrderHeaderID, + oh.T_OrderHeaderM_PatientID AS patient_id, + p.M_PatientName AS patient_name, + oh.T_OrderHeaderLabNumber AS lab_number, + b.M_BranchCode AS branch_code, + b.M_BranchName AS branch_name, + b.M_BranchCodeLab AS branch_code_lab, + oh.T_OrderHeaderTotal AS total, + at.Ais_TransactionStatus AS Ais_TransactionStatus, + c.CorporateID AS corporate_id, + c.CorporateName AS corporate_name, + ais_pillar_name, + IFNULL(mgm_mcu.Mgm_McuLabel, '') AS mgm_mcu_name, + p.M_PatientNoReg AS noreg, + IF(MAX(at.Ais_TransactionID) IS NULL, 'N', 'Y') AS ais_status, + oh.T_OrderHeaderTotal AS total_amount + FROM t_orderheader oh + JOIN m_patient p ON p.M_PatientID = oh.T_OrderHeaderM_PatientID + JOIN m_branch b ON b.M_BranchID = oh.T_OrderHeaderM_BranchID + LEFT JOIN corporate c ON c.CorporateID = oh.T_OrderHeaderCorporateID + LEFT JOIN mgm_mcu ON mgm_mcu.Mgm_McuID = oh.T_OrderHeaderMgm_McuID + LEFT JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + LEFT JOIN ais_pillar ON CorporateTypeais_pillar_code = ais_pillar_code + LEFT JOIN ".$this->db_log->database.".ais_transaction at + ON at.Ais_TransactionOrderHeaderLabNumber = oh.T_OrderHeaderLabNumber "; + + // Ambil parameter + $start_date = $this->input->get('start_date'); + $end_date = $this->input->get('end_date'); + $ais_status = $this->input->get('ais_status'); + $corporate_id = $this->input->get('corporate_id'); + $lab_number = $this->input->get('lab_number'); + $patient_name = $this->input->get('patient_name'); + + // Pagination + $page = $this->input->get('page') ? intval($this->input->get('page')) : 1; + $limit = 10; + $offset = ($page - 1) * $limit; + + $params = []; + $where_clauses = []; + + if ($start_date && $end_date) { + $where_clauses[] = "( DATE(oh.T_OrderHeaderDate) BETWEEN ? AND ? )"; + $params[] = $start_date; + $params[] = $end_date; + } + + if ($ais_status === 'Y') { + $where_clauses[] = "at.Ais_TransactionID IS NOT NULL"; + } elseif ($ais_status === 'N') { + $where_clauses[] = "at.Ais_TransactionID IS NULL"; + } + + if ($corporate_id) { + $where_clauses[] = "oh.T_OrderHeaderCorporateID = ?"; + $params[] = $corporate_id; + } + + if ($lab_number) { + $where_clauses[] = "oh.T_OrderHeaderLabNumber LIKE ?"; + $params[] = "%$lab_number%"; + } + + if ($patient_name) { + $where_clauses[] = "p.M_PatientName LIKE ?"; + $params[] = "%$patient_name%"; + } + + // Build WHERE + $where_sql = ""; + if (!empty($where_clauses)) { + $where_sql = " WHERE " . implode(" AND ", $where_clauses); + } + + // Count total records for pagination + $count_sql = "SELECT COUNT(DISTINCT oh.T_OrderHeaderID) as total + FROM t_orderheader oh + JOIN m_patient p ON p.M_PatientID = oh.T_OrderHeaderM_PatientID + LEFT JOIN ".$this->db_log->database.".ais_transaction at + ON at.Ais_TransactionOrderHeaderLabNumber = oh.T_OrderHeaderLabNumber + LEFT JOIN corporate c ON c.CorporateID = oh.T_OrderHeaderCorporateID + $where_sql"; + + $qry_count = $this->db_onedev->query($count_sql, $params); + $total = $qry_count->row()->total ?? 0; + + $sql = $sql_base . $where_sql . " + GROUP BY oh.T_OrderHeaderID + LIMIT $limit OFFSET $offset"; + + $qry = $this->db_onedev->query($sql, $params); + //echo $this->db_onedev->last_query(); + + if (!$qry) { + echo json_encode(['status' => 'error', 'message' => 'Gagal mengambil data monitoring.']); + exit; + } + + $data = $qry->result_array(); + + echo json_encode([ + 'status' => 'success', + 'message' => 'Berhasil mengambil data monitoring.', + 'data' => $data, + 'total' => $total, + 'page' => $page, + 'limit' => $limit, + 'total_page' => ceil($total / $limit) + ]); + exit; + } + + function get_corporate() + { + $sql = "SELECT CorporateID, CorporateName, CorporateCode FROM corporate"; + $qry = $this->db_onedev->query($sql); + + if (!$qry) { + $this->error_log(array('fn_name' => 'get_corporate', 'message' => 'select corporate data failed', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + $this->output + ->set_status_header(500) + ->set_content_type('application/json') + ->set_output(json_encode(['status' => 'error', 'message' => 'Failed to retrieve corporate data.'])); + return; + } + + $data = $qry->result_array(); + echo json_encode(['status' => 'success', 'message' => 'Successfully retrieved corporate data.', 'data' => $data]); + exit; + } + + function get_json_response() + { + // Get lab_number from the query parameter + $lab_number = $this->input->get('lab_number'); + + if (empty($lab_number)) { + $this->output + ->set_status_header(400) + ->set_content_type('application/json') + ->set_output(json_encode(['status' => 'error', 'message' => 'lab_number parameter is required'])); + return; + } + + $sql = "SELECT + Ais_TransactionOrderHeaderLabNumber AS lab_number, + Ais_TransactionCreated AS transaction_created, + Ais_TransactionJson AS transaction_json, + Ais_TransactionResponse AS transaction_response, + 'N' as show_log + FROM ais_transaction + WHERE Ais_TransactionOrderHeaderLabNumber = ?"; + + $qry = $this->db_log->query($sql, array($lab_number)); + + $results = $qry->row_array(); + $results = $qry->result_array(); + + if ($results) { + // Loop through each result to decode JSON + foreach ($results as &$result) { + $result['transaction_json'] = json_decode($result['transaction_json']); + $result['transaction_response'] = json_decode($result['transaction_response']); + } + unset($result); // Unset reference to avoid side effects + + echo json_encode(['status' => 'success', 'data' => $results]); + } else { + echo json_encode(['status' => 'error', 'message' => 'Data not found for the given lab number.']); + } + exit; + } +} diff --git a/application/controllers/ais/Transactionv3.php b/application/controllers/ais/Transactionv3.php index 510ca8f..0c91590 100644 --- a/application/controllers/ais/Transactionv3.php +++ b/application/controllers/ais/Transactionv3.php @@ -578,6 +578,7 @@ class Transactionv3 extends MY_Controller when Nat_GroupID = 4 then '1303' when Nat_GroupID = 5 then '1321' when Nat_GroupID = 6 then '1600' + when Nat_GroupID = 7 then '1500' end as ProfitCostCenterCode, '' as TrxDepartemenID, T_OrderDetailCreated as TanggalBuat, @@ -1122,6 +1123,7 @@ class Transactionv3 extends MY_Controller when Nat_GroupID = 4 then '1303' when Nat_GroupID = 5 then '1321' when Nat_GroupID = 6 then '1600' + when Nat_GroupID = 7 then '1500' end as ProfitCostCenterCode, '' as TrxDepartemenID, T_OrderDetailCreated as TanggalBuat, @@ -1918,6 +1920,7 @@ class Transactionv3 extends MY_Controller when Nat_GroupID = 4 then '1303' when Nat_GroupID = 5 then '1321' when Nat_GroupID = 6 then '1600' + when Nat_GroupID = 7 then '1500' end as ProfitCostCenterCode, '' as TrxDepartemenID, T_OrderDetailCreated as TanggalBuat, @@ -2417,6 +2420,7 @@ class Transactionv3 extends MY_Controller when Nat_GroupID = 4 then '1303' when Nat_GroupID = 5 then '1321' when Nat_GroupID = 6 then '1600' + when Nat_GroupID = 7 then '1500' end as ProfitCostCenterCode, '' as TrxDepartemenID, T_OrderDetailCreated as TanggalBuat, @@ -2862,6 +2866,7 @@ class Transactionv3 extends MY_Controller when Nat_GroupID = 4 then '1303' when Nat_GroupID = 5 then '1321' when Nat_GroupID = 6 then '1600' + when Nat_GroupID = 7 then '1500' end as ProfitCostCenterCode, '' as TrxDepartemenID, T_OrderDetailCreated as TanggalBuat, @@ -2909,7 +2914,15 @@ class Transactionv3 extends MY_Controller T_OrderDetailIsActive = 'Y' UNION SELECT T_OrderDetailID as TrxLayananID, - Nat_GroupID as ProfitCostCenterCode, + case + when Nat_GroupID = 1 then '1100' + when Nat_GroupID = 2 then '1200' + when Nat_GroupID = 3 then '1200' + when Nat_GroupID = 4 then '1303' + when Nat_GroupID = 5 then '1321' + when Nat_GroupID = 6 then '1600' + when Nat_GroupID = 7 then '1500' + end as ProfitCostCenterCode, '' as TrxDepartemenID, T_OrderDetailCreated as TanggalBuat, T_OrderDetailT_TestSasCode as LayananID, diff --git a/application/controllers/ais/Transactionv3.php--150526 b/application/controllers/ais/Transactionv3.php--150526 new file mode 100644 index 0000000..510ca8f --- /dev/null +++ b/application/controllers/ais/Transactionv3.php--150526 @@ -0,0 +1,3858 @@ +db_onedev = $this->load->database("onedev", true); + $this->db_log = $this->load->database("log", true); + $this->load->helper(array('form', 'url')); + } + + public function error_log($data,$userid=999) + { + + $sql = "INSERT INTO ais_error_log ( + AisErrorLogFnName, + AisErrorLogMessage, + AisErrorLogQuery, + AisErrorLogJson, + AisErrorLogUserID, + AisErrorLogCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array($data['fn_name'],$data['message'],$data['query'],$data['json'],$userid)); + //echo $this->db_log->last_query(); + return true; + } + + /** + * Build equivalent cURL command string (untuk debug - copy-paste ke terminal) + * @param string $url API endpoint URL + * @param array $data Request payload + * @param array $headers Custom headers (optional) + * @param string $method POST atau PUT + * @return string Perintah curl yang siap dijalankan + */ + public function build_curl_command($url, $data = array(), $headers = array(), $method = 'POST') + { + $default_headers = array('Content-Type: application/json'); + $final_headers = array_merge($default_headers, $headers); + $body = json_encode($data); + $parts = array('curl', '-X', $method, escapeshellarg($url)); + foreach ($final_headers as $h) { + $parts[] = '-H'; + $parts[] = escapeshellarg($h); + } + $parts[] = '-d'; + $parts[] = escapeshellarg($body); + return implode(' ', $parts); + } + + /** + * Generic POST request function + * @param string $url API endpoint URL + * @param array $data Request payload + * @param array $headers Custom headers (optional) + * @return array Response from API + */ + public function post_request($url, $data = array(), $headers = array()) + { + // Default headers + $default_headers = array( + 'Content-Type: application/json' + ); + + // Merge custom headers with default headers + $final_headers = array_merge($default_headers, $headers); + + // Initialize cURL + $ch = curl_init(); + + // Set cURL options + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + curl_setopt($ch, CURLOPT_HTTPHEADER, $final_headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + + // Execute cURL request + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); + + // Close cURL + curl_close($ch); + + // Prepare result + $result = array( + 'success' => false, + 'http_code' => $http_code, + 'response' => null, + 'error' => null + ); + + if ($error) { + $result['error'] = $error; + } else { + $result = json_decode($response, true); + //echo json_encode($result); + $result['success'] = true; + } + + return $result; + } + + /** + * Generic PUT request function + * @param string $url API endpoint URL + * @param array $data Request payload + * @param array $headers Custom headers (optional) + * @return array Response from API + */ + public function put_request($url, $data = array(), $headers = array()) + { + // Default headers + $default_headers = array( + 'Content-Type: application/json' + ); + + // Merge custom headers with default headers + $final_headers = array_merge($default_headers, $headers); + + // Initialize cURL + $ch = curl_init(); + + // Set cURL options + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + curl_setopt($ch, CURLOPT_HTTPHEADER, $final_headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + + // Execute cURL request + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); + + // Close cURL + curl_close($ch); + + // Prepare result + $result = array( + 'success' => false, + 'http_code' => $http_code, + 'response' => null, + 'error' => null + ); + + if ($error) { + $result['error'] = $error; + } else { + $result = json_decode($response, true); + $result['success'] = true; + } + + return $result; + } + + /** + * Generic DELETE request function + * @param string $url API endpoint URL + * @param array $data Request payload (optional, some APIs support body in DELETE) + * @param array $headers Custom headers (optional) + * @return array Response from API + */ + public function delete_request($url, $data = array(), $headers = array()) + { + // Default headers + $default_headers = array( + 'Content-Type: application/json' + ); + + // Merge custom headers with default headers + $final_headers = array_merge($default_headers, $headers); + + // Initialize cURL + $ch = curl_init(); + + // Set cURL options + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); + + // Add body if data is provided (some APIs support body in DELETE requests) + if (!empty($data)) { + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + } + + curl_setopt($ch, CURLOPT_HTTPHEADER, $final_headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + + // Execute cURL request + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); + + // Close cURL + curl_close($ch); + + // Prepare result + $result = array( + 'success' => false, + 'http_code' => $http_code, + 'response' => null, + 'error' => null + ); + + if ($error) { + $result['error'] = $error; + } else { + $result = json_decode($response, true); + $result['success'] = true; + } + + return $result; + } + + public function get_request($url, $headers = array()) + { + // Retrieve configuration + $config = $this->get_config(); + $token = $config['AisConfigAuthToken'] ?? 'default-token'; + $header_token = $config['AisConfigHeaderToken']; + + // Default headers based on the curl command + $default_headers = array( + 'Header-Token: ' . $header_token, + 'Authorization: Bearer ' . $token + ); + + // Merge custom headers with default headers + $final_headers = array_merge($default_headers, $headers); + + // Initialize cURL + $ch = curl_init(); + + // Set cURL options + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_HTTPGET, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, $final_headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + + // Execute cURL request + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); + + // Close cURL + curl_close($ch); + + // Prepare result + $result = array( + 'success' => false, + 'http_code' => $http_code, + 'response' => null, + 'error' => null + ); + + if ($error) { + $result['error'] = $error; + } else { + $decoded = json_decode($response, true); + $result['response'] = $decoded; + // Check if response is successful based on http code + if ($http_code === 200) { + $result['success'] = true; + } + } + + return $result; + } + + function get_config() + { + $sql = "SELECT * FROM ais_config LIMIT 1"; + $qry = $this->db_onedev->query($sql); + $dt_config = $qry->row_array(); + return $dt_config; + } + + /** + * POST request to auth API + * @param string $username Username for authentication + * @param string $password Password for authentication + * @return array Response from API + */ + public function post_auth() + { + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl.'/api/auth/auth.php'; + $headers = array( + 'Header-Token: '.$dt_config['AisConfigHeaderToken'] + ); + + $username = $dt_config['AisConfigUsername']; + $password = $dt_config['AisConfigPassword']; + + $data = array( + 'username' => $username, + 'password' => $password + ); + + $result = $this->post_request($url, $data, $headers); + + + $sql = "INSERT INTO ais_login_log( + AisLoginLogUsername, + AisLoginLogPassword, + AisLoginLogHeaderToken, + AisLoginLogResult, + AisLoginLogCreated + ) + VALUES( + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array($username,$password,$dt_config['AisConfigHeaderToken'],json_encode($result))); + + + if(!$qry){ + $this->error_log(array('fn_name'=>'post_auth','message'=>'ais_login_log insert','query'=>$sql,'json'=>json_encode($result)),999); + exit; + } + //print_r($result); + //exit; + // Check if success + if(!$result['success']){ + $this->error_log(array('fn_name'=>'post_auth','message'=>'failed auth','query'=>'','json'=>json_encode($result)),999); + $errors = array('status' => 'error','message' => 'Gagal Login'); + return $errors; + + }else{ + // Update token + $token = $result['data']['token'];; + $sql = "UPDATE ais_config SET AisConfigAuthToken = ? WHERE AisConfigID = 1"; + $qry = $this->db_onedev->query($sql, array($token)); + //echo $this->db_onedev->last_query(); + //exit; + if(!$qry){ + $this->error_log(array('fn_name'=>'post_auth','message'=>'ais_config update','query'=>$sql,'json'=>''),999); + $errors = array('status' => 'error','message' => 'Gagal Update Token'); + return $errors; + + } + + return $result; + } + } + + function post_transaction_daily_by_date($min_date=null,$max_date=null) + { + //echo "post_transaction_daily_by_date"; + // Auth Login + $login = $this->post_auth(); + //echo json_encode($login); + //exit; + + + if (!$login['success']) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 555); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaction_full/transaksi.php'; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + // Validate date range - maksimal 7 hari + if ($min_date && $max_date) { + $min_date_obj = new DateTime($min_date); + $max_date_obj = new DateTime($max_date); + $date_diff = $min_date_obj->diff($max_date_obj); + $days_diff = $date_diff->days; + + if ($days_diff > 5) { + $errors = array('status' => 'error', 'message' => 'Selisih antara min_date dan max_date maksimal 7 hari'); + echo json_encode($errors); + exit; + } + } + + + // Get data + $sql = "SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + M_UserEmail as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + M_UserEmail as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID AND `M_PatientName` NOT LIKE '%coba%' + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID + JOIN t_priceheader ON Mgm_McuT_PriceHeaderID = T_PriceHeaderID + JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + LEFT JOIN cpone_log.ais_transaction ON Ais_TransactionOrderHeaderLabNumber = T_OrderHeaderLabNumber AND + Ais_TransactionStatus = 'success' + WHERE T_OrderHeaderIsActive = 'Y' AND + ( DATE(T_OrderHeaderDate) >= ? AND DATE(T_OrderHeaderDate) <= ? ) + + + UNION + + SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + IFNULL(M_UserEmail,'Administrator') as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + IFNULL(M_UserEmail,'Administrator') as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID AND `M_PatientName` NOT LIKE '%coba%' + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN t_orderheaderaddon ON T_OrderHeaderAddOnT_OrderHeaderID = T_OrderHeaderID + AND T_OrderHeaderAddOnIsActive = 'Y' + JOIN t_priceheader ON T_OrderHeaderAddOnT_PriceHeaderID = T_PriceHeaderID + LEFT JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + LEFT JOIN cpone_log.ais_transaction ON Ais_TransactionOrderHeaderLabNumber = T_OrderHeaderLabNumber AND + Ais_TransactionStatus = 'success' + WHERE T_OrderHeaderIsActive = 'Y' AND + ( DATE(T_OrderHeaderDate) >= ? AND DATE(T_OrderHeaderDate) <= ? ) + + GROUP BY T_OrderHeaderID + ORDER BY T_OrderHeaderID ASC + + "; + $qry = $this->db_onedev->query($sql, array($min_date,$max_date,$min_date,$max_date)); + + + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $raw_data = $qry->result_array(); + if(count($raw_data) == 0){ + $errors = array('status' => 'error', 'message' => 'Data tidak ditemukan','query' => $this->db_onedev->last_query()); + echo json_encode($errors); + exit; + } + + $data = array(); + // echo json_encode($raw_data); + //exit; + foreach ($raw_data as $key => $row) { + + $row['TrxLayanan'] = []; + $row['TrxItem'] = []; + $row['TrxItemReturn'] = []; + $row['RegpasNominal'] = []; + $row['Trxtt'] = null; + $row['TrxBayar'] = []; + $row['TrxLain'] = null; + $row['PaketDispenser'] = null; + + //$name = "Fanny Yolandina Fo'eh"; + // Escape apostrophe untuk mencegah error pada SQL atau JSON + if (isset($row['Nama']) && !empty($row['Nama'])) { + $row['Nama'] = addslashes($row['Nama']); + } + $raw_data[$key]['Nama'] = $row['Nama']; + + $layanan = []; + $sql = "SELECT * FROM ( + SELECT T_OrderDetailID as TrxLayananID, + case + when Nat_GroupID = 1 then '1100' + when Nat_GroupID = 2 then '1200' + when Nat_GroupID = 3 then '1200' + when Nat_GroupID = 4 then '1303' + when Nat_GroupID = 5 then '1321' + when Nat_GroupID = 6 then '1600' + end as ProfitCostCenterCode, + '' as TrxDepartemenID, + T_OrderDetailCreated as TanggalBuat, + T_OrderDetailT_TestSasCode as LayananID, + T_OrderDetailT_TestName as LayananName, + doctorlab.M_DoctorCode as DokterID, + 0 as ShareRS, + 0 as ShareDokter, + 0 as ShareExternal, + 0 as ShareLain2, + '' as PihakExternal, + '' as PihakLain2, + 'Percentage' as ShareTipe, + T_OrderDetailPrice as Harga, + 1 as Jumlah, + 1 as Rate, + 'N' as FOC, + T_OrderDetailDiscTotal as Diskon, + 'Absolute' as TipeDiskon, + '' as DepartemenID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',T_OrderDetailTotal,0) as DitanggungPasien, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,T_OrderDetailTotal) as DitanggungPenjamin, + 0 as MarkUpCito, + 'N' as Cito, + IFNULL(T_PacketSasCode,'') as PaketID, + 'LABKLINIK' as KelasID, + '' as TrxLayananDetail, + 'Y' as Tagihkan + FROM t_orderdetail + JOIN t_test ON T_TestID = T_OrderDetailT_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' + JOIN t_orderdetailorder ON T_OrderDetailT_OrderDetailOrderID = T_OrderDetailOrderID AND T_OrderDetailOrderIsActive = 'Y' + JOIN t_orderheader ON T_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN m_doctor doctorlab ON T_OrderHeaderPjM_DoctorID = M_DoctorID + 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' + ) AS t_orderdetailorder"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan_debug = 0; + $layanan = $qry->result_array(); + $raw_data[$key]['TrxLayanan'] = []; + if(count($layanan) > 0){ + foreach($layanan as $key_layanan => $row_layanan){ + $total_layanan_debug += $row_layanan['Harga']; + $layanan[$key_layanan]['TrxLayananDetail'] = []; + $sql = "SELECT M_DoctorCode, M_DoctorID + FROM `so_resultentry` + JOIN t_orderdetail ON ? = So_ResultEntryT_OrderDetailID AND T_OrderDetailIsActive = 'Y' + JOIN m_doctor ON M_DoctorID = So_ResultEntryM_DoctorID AND M_DoctorIsActive = 'Y' + WHERE `So_ResultEntryT_OrderHeaderID` = ? AND + `So_ResultEntryIsActive` = 'Y' AND `So_ResultEntryM_DoctorID` > '0' + LIMIT 1 + "; + $qry = $this->db_onedev->query($sql, array($row_layanan['TrxLayananID'],$row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'so_resultentry select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + $get_resultentry = $qry->result_array(); + if (count($get_resultentry) > 0) { + $row_layanan['DokterID'] = $get_resultentry[0]['M_DoctorCode']; + } + $raw_data[$key]['TrxLayanan'][] = $row_layanan; + } + } + + $regpasnominal = []; + $jumlah_layanan_lab = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lab + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 1 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + //echo $this->db_onedev->last_query(); + //exit; + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail lab select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + + $get_layanan_lab = $qry->row_array(); + $jumlah_layanan_lab = $get_layanan_lab['total_layanan_lab']; + + $jumlah_layanan_radiologi = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_radiologi + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 3 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail radiologi select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + $get_layanan_radiologi = $qry->row_array(); + $jumlah_layanan_radiologi = $get_layanan_radiologi['total_layanan_radiologi']; + + $jumlah_layanan_lain = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lain + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID NOT IN (1,3) + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail lain select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + + + $get_layanan_lain = $qry->row_array(); + $jumlah_layanan_lain = $get_layanan_lain['total_layanan_lain']; + + $total_layanan = 0; + $sql = "SELECT SUM(T_OrderDetailTotal) as total_layanan + FROM t_orderdetail + JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail total layanan select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + $total_layanan = $qry->row_array(); + $total_layanan = $total_layanan['total_layanan']; + + + $total_bayar = 0; + $sql = "SELECT F_PaymentTotal as total + FROM f_payment + WHERE F_PaymentT_OrderHeaderID = ? AND F_PaymentIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'f_payment select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + + $get_total_bayar = $qry->result_array(); + if (count($get_total_bayar) > 0) { + foreach($get_total_bayar as $key_total_bayar => $row_total_bayar){ + $total_bayar += $row_total_bayar['total']; + } + } + + + + $mgm_mcu_m_branch_id = $row['mgm_mcu_m_branch_id']; + + $corporate_code = $row['CorporateCode']; + + $total_ditanggung_pasien = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? $total_layanan : 0; + $total_ditanggung_penjamin = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? 0 : $total_layanan; + + $regpasnominal = array( + "BiayaParamedik" => "0.00", + "ParamedikDitanggungPasien" => "0.00", + "ParamedikDitanggungPenjamin" => "0.00", + "BiayaAdministrasi" => "0", + "AdmDitanggungPasien" => "0.00", + "AdmDitanggungPenjamin" => "0.00", + "BiayaMaterai" => "0.00", + "BiayaMateraiDitanggungPasien" => "0.00", + "BiayaMateraiDitanggungPenjamin" => "0.00", + "JumlahLayanan" => $jumlah_layanan_lain, + "JumlahLayananRadiologi" => $jumlah_layanan_radiologi, + "JumlahLayananLaboratorium" => $jumlah_layanan_lab, + "JumlahItem" => 0, + "JumlahItemRetur" => 0, + "JumlahTT" => "0.00", + "JumlahBiayaLain" => "0.00", + "JumlahBayar" => $total_bayar, + "TipeDiskonGlobal" => "Absolute", + "DiskonGlobal" => "0.00", + "TotalDitanggungPasien" => $total_ditanggung_pasien, + "TotalDitanggungPenjamin" => $total_ditanggung_penjamin + ); + + $raw_data[$key]['RegpasNominal'] = array( + $regpasnominal + ); + + //echo $total_bayar; + $raw_data[$key]['TrxBayar'] = null; + if($total_bayar > 0){ + $sql = "SELECT M_PatientNoReg as MEDRECID, + F_PaymentDetailID as BayarID, + IFNULL(F_PaymentDetailAmount,0) as Jumlah, + F_PaymentDetailCreated as Tanggal, + 'Pelunasan' as JenisBayarID, + CONCAT(F_PaymentNumber,'.',F_PaymentDetailID) as KwitansiID, + IF(F_PaymentDetailM_PaymentTypeID = 21,CONCAT(F_PaymentDetailM_PaymentTypeID,'0',F_PaymentDetailM_BankAccountID),CONCAT(F_PaymentDetailM_PaymentTypeID,F_PaymentDetailM_BankAccountID)) as TipeBayarID, + 'N' as Dibatalkan + FROM f_paymentdetail + JOIN f_payment ON F_PaymentDetailF_PaymentID = F_PaymentID AND F_PaymentIsActive = 'Y' + JOIN t_orderheader ON F_PaymentT_OrderHeaderID = T_OrderHeaderID + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' + WHERE + F_PaymentT_OrderHeaderID = ? AND F_PaymentDetailIsActive = 'Y' + GROUP BY F_PaymentDetailID"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'f_payment select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + //echo $this->db_onedev->last_query(); + //exit; + $bayar = $qry->result_array(); + + $raw_data[$key]['TrxBayar'] = $bayar; + } + + $raw_data[$key]['Trxtt'] = null; + $raw_data[$key]['TrxLain'] = null; + $raw_data[$key]['PaketDispenser'] = null; + $errors = []; + //exit; + $get_transaction = $this->get_transaction_by_labnumber($row['RegID']); + // echo json_encode($get_transaction); + + if($get_transaction && count($get_transaction) > 0){ + $result = $this->put_request($url, $raw_data[$key], $headers); + + }else{ + // Debug: cURL untuk post_request ini (copy-paste ke terminal) + $curl_cmd = $this->build_curl_command($url, $raw_data[$key], $headers, 'POST'); + + // echo $curl_cmd . "\n"; + $result = $this->post_request($url, $raw_data[$key], $headers); + //echo json_encode($result); + } + + + + if ($result['error'] != null) { + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'error', + json_encode($result), + $url, + 555 + )); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'ais_transaction insert : '.$row['RegID'], 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'transaction insert : '.$row['RegID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($result)), 999); + + $errors[] = array('RegID' => $row['RegID'], 'error' => $result['error'] ?? ($result['message'] ?? 'Unknown error from external API')); + + + }else{ + //echo 'insert ais_transaction'; + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'success', + json_encode($result), + $url, + 555 + )); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'ais_transaction insert : '.$row['RegID'], 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + continue; + } + + $check_exist_medrec = $this->get_medrec_by_noreg($row['MEDRECID']); + if($check_exist_medrec['status'] == 'error'){ + $this->error_log(array('fn_name' => 'post_transaction_daily/get_medrec_by_noreg', 'message' => 'get medrec failed for no reg: '.$row['MEDRECID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($check_exist_medrec)), 999); + continue; + } + + if($check_exist_medrec['data'] == null){ + $post_medrec = $this->post_medrec_by_noreg($row['MEDRECID']); + if($post_medrec['status'] == 'error'){ + $this->error_log(array('fn_name' => 'post_transaction_daily/post_medrec_by_noreg', 'message' => 'post medrec failed for no reg: '.$row['MEDRECID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($post_medrec)), 999); + continue; + } + }else{ + $re_post_medrec = $this->re_post_medrec_by_noreg($row['MEDRECID']); + if($re_post_medrec['status'] == 'error'){ + $this->error_log(array('fn_name' => 'post_transaction_daily/re_post_medrec_by_noreg', 'message' => 're post medrec failed for no reg: '.$row['MEDRECID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($re_post_medrec)), 999); + continue; + } + } + } + } + + $message = 'Berhasil Post Transaction'; + if(count($errors) > 0){ + $message = 'Gagal Beberapa Transaksi'; + } + echo json_encode(array('status' => 'OK', 'message' => $message, 'errors' => $errors, 'data' => [])); + exit; + } + + function post_transaction_daily() + { + $prm = $this->sys_input; + $trx_date = isset($prm['xdate']) ? $prm['xdate'] : date('Y-m-d', strtotime('-1 day')); + //$trx_date = '2026-01-12'; + // Auth Login + $login = $this->post_auth(); + + if (!$login['success']) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 555); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . 'api/transaction_full/transaksi.php'; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + + + // Get data + $sql = "SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + M_UserEmail as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + M_UserEmail as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID AND `M_PatientName` NOT LIKE '%coba%' + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID + JOIN t_priceheader ON Mgm_McuT_PriceHeaderID = T_PriceHeaderID + JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + LEFT JOIN cpone_log.ais_transaction ON Ais_TransactionOrderHeaderLabNumber = T_OrderHeaderLabNumber AND + Ais_TransactionStatus = 'success' + WHERE T_OrderHeaderIsActive = 'Y' AND DATE(T_OrderHeaderDate) = ? AND + Ais_TransactionID IS NULL + + UNION + + SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + IFNULL(M_UserEmail,'Administrator') as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + IFNULL(M_UserEmail,'Administrator') as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID AND `M_PatientName` NOT LIKE '%coba%' + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN t_orderheaderaddon ON T_OrderHeaderAddOnT_OrderHeaderID = T_OrderHeaderID + AND T_OrderHeaderAddOnIsActive = 'Y' + JOIN t_priceheader ON T_OrderHeaderAddOnT_PriceHeaderID = T_PriceHeaderID + LEFT JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + LEFT JOIN cpone_log.ais_transaction ON Ais_TransactionOrderHeaderLabNumber = T_OrderHeaderLabNumber AND + Ais_TransactionStatus = 'success' + WHERE T_OrderHeaderIsActive = 'Y' AND DATE(T_OrderHeaderDate) = ? AND + Ais_TransactionID IS NULL + + GROUP BY T_OrderHeaderID + ORDER BY T_OrderHeaderID DESC + LIMIT 50 + + + "; + $qry = $this->db_onedev->query($sql, array($trx_date,$trx_date)); + + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $raw_data = $qry->result_array(); + if(count($raw_data) == 0){ + $errors = array('status' => 'error', 'message' => 'Data tidak ditemukan'); + echo json_encode($errors); + exit; + } + + $data = array(); + // echo json_encode($raw_data); + //exit; + foreach ($raw_data as $key => $row) { + + $row['TrxLayanan'] = []; + $row['TrxItem'] = []; + $row['TrxItemReturn'] = []; + $row['RegpasNominal'] = []; + $row['Trxtt'] = null; + $row['TrxBayar'] = []; + $row['TrxLain'] = null; + $row['PaketDispenser'] = null; + + //$name = "Fanny Yolandina Fo'eh"; + // Escape apostrophe untuk mencegah error pada SQL atau JSON + if (isset($row['Nama']) && !empty($row['Nama'])) { + $row['Nama'] = addslashes($row['Nama']); + } + $raw_data[$key]['Nama'] = $row['Nama']; + + $layanan = []; + $sql = "SELECT * FROM ( + SELECT T_OrderDetailID as TrxLayananID, + case + when Nat_GroupID = 1 then '1100' + when Nat_GroupID = 2 then '1200' + when Nat_GroupID = 3 then '1200' + when Nat_GroupID = 4 then '1303' + when Nat_GroupID = 5 then '1321' + when Nat_GroupID = 6 then '1600' + end as ProfitCostCenterCode, + '' as TrxDepartemenID, + T_OrderDetailCreated as TanggalBuat, + T_OrderDetailT_TestSasCode as LayananID, + T_OrderDetailT_TestName as LayananName, + doctorlab.M_DoctorCode as DokterID, + 0 as ShareRS, + 0 as ShareDokter, + 0 as ShareExternal, + 0 as ShareLain2, + '' as PihakExternal, + '' as PihakLain2, + 'Percentage' as ShareTipe, + T_OrderDetailPrice as Harga, + 1 as Jumlah, + 1 as Rate, + 'N' as FOC, + T_OrderDetailDiscTotal as Diskon, + 'Absolute' as TipeDiskon, + '' as DepartemenID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',T_OrderDetailTotal,0) as DitanggungPasien, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,T_OrderDetailTotal) as DitanggungPenjamin, + 0 as MarkUpCito, + 'N' as Cito, + IFNULL(T_PacketSasCode,'') as PaketID, + 'LABKLINIK' as KelasID, + '' as TrxLayananDetail, + 'Y' as Tagihkan + FROM t_orderdetail + JOIN t_test ON T_TestID = T_OrderDetailT_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' + JOIN t_orderdetailorder ON T_OrderDetailT_OrderDetailOrderID = T_OrderDetailOrderID AND T_OrderDetailOrderIsActive = 'Y' + JOIN t_orderheader ON T_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN m_doctor doctorlab ON T_OrderHeaderPjM_DoctorID = M_DoctorID + 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' + ) AS t_orderdetailorder"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan_debug = 0; + $layanan = $qry->result_array(); + $raw_data[$key]['TrxLayanan'] = []; + if(count($layanan) > 0){ + foreach($layanan as $key_layanan => $row_layanan){ + $total_layanan_debug += $row_layanan['Harga']; + $layanan[$key_layanan]['TrxLayananDetail'] = []; + $sql = "SELECT M_DoctorCode, M_DoctorID + FROM `so_resultentry` + JOIN t_orderdetail ON ? = So_ResultEntryT_OrderDetailID AND T_OrderDetailIsActive = 'Y' + JOIN m_doctor ON M_DoctorID = So_ResultEntryM_DoctorID AND M_DoctorIsActive = 'Y' + WHERE `So_ResultEntryT_OrderHeaderID` = ? AND + `So_ResultEntryIsActive` = 'Y' AND `So_ResultEntryM_DoctorID` > '0' + LIMIT 1 + "; + $qry = $this->db_onedev->query($sql, array($row_layanan['TrxLayananID'],$row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'so_resultentry select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + $get_resultentry = $qry->result_array(); + if (count($get_resultentry) > 0) { + $row_layanan['DokterID'] = $get_resultentry[0]['M_DoctorCode']; + } + $raw_data[$key]['TrxLayanan'][] = $row_layanan; + } + } + + $regpasnominal = []; + $jumlah_layanan_lab = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lab + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 1 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + //echo $this->db_onedev->last_query(); + //exit; + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail lab select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + + $get_layanan_lab = $qry->row_array(); + $jumlah_layanan_lab = $get_layanan_lab['total_layanan_lab']; + + $jumlah_layanan_radiologi = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_radiologi + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 3 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail radiologi select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + $get_layanan_radiologi = $qry->row_array(); + $jumlah_layanan_radiologi = $get_layanan_radiologi['total_layanan_radiologi']; + + $jumlah_layanan_lain = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lain + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID NOT IN (1,3) + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail lain select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + + + $get_layanan_lain = $qry->row_array(); + $jumlah_layanan_lain = $get_layanan_lain['total_layanan_lain']; + + $total_layanan = 0; + $sql = "SELECT SUM(T_OrderDetailTotal) as total_layanan + FROM t_orderdetail + JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 't_orderdetail total layanan select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + $total_layanan = $qry->row_array(); + $total_layanan = $total_layanan['total_layanan']; + + + $total_bayar = 0; + $sql = "SELECT F_PaymentTotal as total + FROM f_payment + WHERE F_PaymentT_OrderHeaderID = ? AND F_PaymentIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'f_payment select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + + $get_total_bayar = $qry->result_array(); + if (count($get_total_bayar) > 0) { + foreach($get_total_bayar as $key_total_bayar => $row_total_bayar){ + $total_bayar += $row_total_bayar['total']; + } + } + + + + $mgm_mcu_m_branch_id = $row['mgm_mcu_m_branch_id']; + + $corporate_code = $row['CorporateCode']; + + $total_ditanggung_pasien = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? $total_layanan : 0; + $total_ditanggung_penjamin = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? 0 : $total_layanan; + + $regpasnominal = array( + "BiayaParamedik" => "0.00", + "ParamedikDitanggungPasien" => "0.00", + "ParamedikDitanggungPenjamin" => "0.00", + "BiayaAdministrasi" => "0", + "AdmDitanggungPasien" => "0.00", + "AdmDitanggungPenjamin" => "0.00", + "BiayaMaterai" => "0.00", + "BiayaMateraiDitanggungPasien" => "0.00", + "BiayaMateraiDitanggungPenjamin" => "0.00", + "JumlahLayanan" => $jumlah_layanan_lain, + "JumlahLayananRadiologi" => $jumlah_layanan_radiologi, + "JumlahLayananLaboratorium" => $jumlah_layanan_lab, + "JumlahItem" => 0, + "JumlahItemRetur" => 0, + "JumlahTT" => "0.00", + "JumlahBiayaLain" => "0.00", + "JumlahBayar" => $total_bayar, + "TipeDiskonGlobal" => "Absolute", + "DiskonGlobal" => "0.00", + "TotalDitanggungPasien" => $total_ditanggung_pasien, + "TotalDitanggungPenjamin" => $total_ditanggung_penjamin + ); + + $raw_data[$key]['RegpasNominal'] = array( + $regpasnominal + ); + + //echo $total_bayar; + $raw_data[$key]['TrxBayar'] = null; + if($total_bayar > 0){ + $sql = "SELECT M_PatientNoReg as MEDRECID, + F_PaymentDetailID as BayarID, + IFNULL(F_PaymentDetailAmount,0) as Jumlah, + F_PaymentDetailCreated as Tanggal, + 'Pelunasan' as JenisBayarID, + CONCAT(F_PaymentNumber,'.',F_PaymentDetailID) as KwitansiID, + IF(F_PaymentDetailM_PaymentTypeID = 21,CONCAT(F_PaymentDetailM_PaymentTypeID,'0',F_PaymentDetailM_BankAccountID),CONCAT(F_PaymentDetailM_PaymentTypeID,F_PaymentDetailM_BankAccountID)) as TipeBayarID, + 'N' as Dibatalkan + FROM f_paymentdetail + JOIN f_payment ON F_PaymentDetailF_PaymentID = F_PaymentID AND F_PaymentIsActive = 'Y' + JOIN t_orderheader ON F_PaymentT_OrderHeaderID = T_OrderHeaderID + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' + WHERE + F_PaymentT_OrderHeaderID = ? AND F_PaymentDetailIsActive = 'Y' + GROUP BY F_PaymentDetailID"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'f_payment select : '.$row['T_OrderHeaderID'], 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + continue; + } + //echo $this->db_onedev->last_query(); + //exit; + $bayar = $qry->result_array(); + + $raw_data[$key]['TrxBayar'] = $bayar; + } + + $raw_data[$key]['Trxtt'] = null; + $raw_data[$key]['TrxLain'] = null; + $raw_data[$key]['PaketDispenser'] = null; + $errors = []; + //exit; + $get_transaction = $this->get_transaction_by_labnumber($row['RegID']); + if($get_transaction && count($get_transaction) > 0){ + $result = $this->put_request($url, $raw_data[$key], $headers); + }else{ + $result = $this->post_request($url, $raw_data[$key], $headers); + } + + + + if ($result['error'] != null) { + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'error', + json_encode($result), + $url, + 555 + )); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'ais_transaction insert : '.$row['RegID'], 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'transaction insert : '.$row['RegID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($result)), 999); + + $errors[] = array('RegID' => $row['RegID'], 'error' => $result['error'] ?? ($result['message'] ?? 'Unknown error from external API')); + + + }else{ + //echo 'insert ais_transaction'; + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'success', + json_encode($result), + $url, + 555 + )); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction_daily', 'message' => 'ais_transaction insert : '.$row['RegID'], 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + continue; + } + + $check_exist_medrec = $this->get_medrec_by_noreg($row['MEDRECID']); + if($check_exist_medrec['status'] == 'error'){ + $this->error_log(array('fn_name' => 'post_transaction_daily/get_medrec_by_noreg', 'message' => 'get medrec failed for no reg: '.$row['MEDRECID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($check_exist_medrec)), 999); + continue; + } + + if($check_exist_medrec['data'] == null){ + $post_medrec = $this->post_medrec_by_noreg($row['MEDRECID']); + if($post_medrec['status'] == 'error'){ + $this->error_log(array('fn_name' => 'post_transaction_daily/post_medrec_by_noreg', 'message' => 'post medrec failed for no reg: '.$row['MEDRECID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($post_medrec)), 999); + continue; + } + }else{ + $re_post_medrec = $this->re_post_medrec_by_noreg($row['MEDRECID']); + if($re_post_medrec['status'] == 'error'){ + $this->error_log(array('fn_name' => 'post_transaction_daily/re_post_medrec_by_noreg', 'message' => 're post medrec failed for no reg: '.$row['MEDRECID'], 'query' => $this->db_onedev->last_query(), 'json' => json_encode($re_post_medrec)), 999); + continue; + } + } + } + } + + echo 'Selesai'; + } + + + function get_medrec_by_noreg($noreg) + { + $userid = 999; + // Get id from query parameter + + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'get_medrec_auth', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), $userid); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + return $errors; + } + + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . 'api/medrec?id='.$noreg; + + + $result = $this->get_request($url); + if (!$result['success']) { + $this->error_log(array('fn_name' => 'get_medrec', 'message' => 'failed get medrec', 'query' => '', 'json' => json_encode($result)), $userid); + $errors = array('status' => 'error', 'message' => 'Gagal Get Layanan'); + return $errors; + } + + $data = $result['response']['data'] ?? null; + // $data = json_encode($data); + $success = array('status' => 'success', 'message' => 'Berhasil Get Medrec', 'data' => $data); + return $success; + + } + + // Post Medrec + private function post_medrec_by_noreg($noreg) + { + $userid = 999; + + // Auth Login + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log([ + 'fn_name' => 'post_medrec_auth', + 'message' => 'failed auth', + 'query' => '', + 'json' => json_encode($login) + ], $userid); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + return $errors; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/medrec'; + + $headers = [ + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ]; + + // Ambil data layanan dari tabel t_test yang belum dikirim + $sql = "SELECT * + FROM m_patient n + LEFT JOIN cpone_log.ais_medrec a + ON n.M_PatientNoReg = a.Ais_MedrecPatientNoReg + WHERE n.M_PatientIsActive = 'Y' + AND a.Ais_MedrecPatientNoReg IS NULL AND n.M_PatientNoReg = ? + LIMIT 1"; + $qry = $this->db_onedev->query($sql, [$noreg]); + + if (!$qry) { + $this->error_log([ + 'fn_name' => 'post_medrec', + 'message' => 'medrec select failed', + 'query' => $this->db_onedev->last_query(), + 'json' => '' + ], $userid); + $errors = array('status' => 'error', 'message' => 'medrec select failed'); + return $errors; + } + + $raw_data = $qry->result_array(); + if(empty($raw_data)){ + $errors = array('status' => 'error', 'message' => 'Tidak ada data medrec yang belum dikirim untuk no reg: ' . $noreg); + return $errors; + } + $result_data = []; + $errors = []; + + foreach ($raw_data as $row) { + + if ($row['M_PatientGender'] == 'MALE') + 'L'; + if ($row['M_PatientGender'] == 'FEMALE') + 'P'; + + + $data = [ + "Nama" => $row['M_PatientName'], + "MEDRECID" => $row['M_PatientNoReg'], + "KodeRS" => "", + "PerusahaanID" => $row['M_PatientRegisteredByCorporateID'], + "NIK" => $row['M_PatientNIP'], + "Kelamin" => $row['M_PatientGender'], + "TanggalLahir" => $row['M_PatientDOB'], + "TempatLahir" => $row['M_PatientLocation'], + "Alamat" => $row['M_PatientAddress'], + "Couple" => 'N', + "CoupleID" => 0, + "LoginBuat" => 'system' + ]; + + + $result = $this->post_request($url, $data, $headers); + + + + if ($result['error'] == null) { + $sql = "INSERT INTO ais_medrec ( + Ais_MedrecPatientNoReg, + Ais_MedrecStatus, + Ais_MedrecJson, + Ais_MedrecResponse, + Ais_MedrecUserID, + Ais_MedrecCreated + ) + VALUES (?, ?, ?, ?, ?, NOW())"; + $this->db_log->query($sql, [ + $row['M_PatientNoReg'], + $result['errror'] == null?'success':'error', + json_encode($data), + json_encode($result), + $userid + ]); + + $success = [ + 'status' => 'success', + 'message' => 'Berhasil Post Medrec', + ]; + return $success; + }else{ + $success = [ + 'status' => 'error', + 'message' => 'Gagal Post Medrec: '.implode(', ', $result['error']), + 'errors' => $result['error'] + ]; + return $success; + } + + + + } + } + + + private function re_post_medrec_by_noreg($noreg) + { + $userid = 999; + + // Auth Login + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log([ + 'fn_name' => 're_post_medrec_auth', + 'message' => 'failed auth', + 'query' => '', + 'json' => json_encode($login) + ], $userid); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + return $errors; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/medrec'; + + $headers = [ + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ]; + + // Ambil data layanan dari tabel t_test yang belum dikirim + $sql = "SELECT * + FROM m_patient n + LEFT JOIN cpone_log.ais_medrec a + ON n.M_PatientNoReg = a.Ais_MedrecPatientNoReg + WHERE n.M_PatientIsActive = 'Y' + AND n.M_PatientNoReg = ? + LIMIT 1"; + $qry = $this->db_onedev->query($sql, [$noreg]); + + if (!$qry) { + $this->error_log([ + 'fn_name' => 'post_medrec', + 'message' => 'medrec select failed', + 'query' => $this->db_onedev->last_query(), + 'json' => '' + ], $userid); + $errors = array('status' => 'error', 'message' => 'medrec select failed'); + return $errors; + } + + $raw_data = $qry->result_array(); + if(empty($raw_data)){ + $errors = array('status' => 'error', 'message' => 'Tidak ada data medrec yang belum dikirim untuk no reg: ' . $noreg); + return $errors; + } + $result_data = []; + $errors = []; + + foreach ($raw_data as $row) { + + if ($row['M_PatientGender'] == 'MALE') + 'L'; + if ($row['M_PatientGender'] == 'FEMALE') + 'P'; + + + $data = [ + "Nama" => $row['M_PatientName'], + "MEDRECID" => $row['M_PatientNoReg'], + "KodeRS" => "", + "PerusahaanID" => $row['M_PatientRegisteredByCorporateID'], + "NIK" => $row['M_PatientNIP'], + "Kelamin" => $row['M_PatientGender'], + "TanggalLahir" => $row['M_PatientDOB'], + "TempatLahir" => $row['M_PatientLocation'], + "Alamat" => $row['M_PatientAddress'], + "Couple" => 'N', + "CoupleID" => 0, + "LoginBuat" => 'system' + ]; + + + $result = $this->put_request($url, $data, $headers); + + + + if ($result['error'] == null) { + $sql = "INSERT INTO ais_medrec ( + Ais_MedrecPatientNoReg, + Ais_MedrecStatus, + Ais_MedrecJson, + Ais_MedrecResponse, + Ais_MedrecUserID, + Ais_MedrecCreated + ) + VALUES (?, ?, ?, ?, ?, NOW())"; + $this->db_log->query($sql, [ + $row['M_PatientNoReg'], + $result['errror'] == null?'success':'error', + json_encode($data), + json_encode($result), + $userid + ]); + + $success = [ + 'status' => 'success', + 'message' => 'Berhasil Re-Post Medrec', + ]; + return $success; + }else{ + $success = [ + 'status' => 'error', + 'message' => 'Gagal Re-Post Medrec: '.implode(', ', $result['error']), + 'errors' => $result['error'] + ]; + return $success; + } + + + + } + } + + + + function post_transaction_by_labnumber() + { + $prm = $this->sys_input; + $labnum = $prm['labnumber']; + + // Auth Login + $login = $this->post_auth(); + + if (!$login['success']) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 555); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaction_full/transaksi.php'; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + + + // Get data + $sql = "SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + M_UserEmail as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + M_UserEmail as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID + JOIN t_priceheader ON Mgm_McuT_PriceHeaderID = T_PriceHeaderID + JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + WHERE T_OrderHeaderIsActive = 'Y' + AND T_OrderHeaderLabNumber = ? + AND ( T_OrderHeaderMgm_McuID != 0 AND T_OrderHeaderMgm_McuID IS NOT NULL) + + + UNION + + SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + IFNULL(M_UserEmail,'Administrator') as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + IFNULL(M_UserEmail,'Administrator') as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN t_orderheaderaddon ON T_OrderHeaderAddOnT_OrderHeaderID = T_OrderHeaderID + AND T_OrderHeaderAddOnIsActive = 'Y' + JOIN t_priceheader ON T_OrderHeaderAddOnT_PriceHeaderID = T_PriceHeaderID + LEFT JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + WHERE T_OrderHeaderIsActive = 'Y' + AND T_OrderHeaderLabNumber = ? + AND ( T_OrderHeaderMgm_McuID = 0 OR T_OrderHeaderMgm_McuID IS NULL) + + LIMIT 1; + "; + $qry = $this->db_onedev->query($sql, array($labnum,$labnum)); + + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $raw_data = $qry->result_array(); + if(count($raw_data) == 0){ + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + $errors = array('status' => 'error', 'message' => 'Data tidak ditemukan'); + echo json_encode($errors); + exit; + } + + $data = array(); + //echo json_encode($raw_data); + //exit; + foreach ($raw_data as $key => $row) { + + $row['TrxLayanan'] = []; + $row['TrxItem'] = []; + $row['TrxItemReturn'] = []; + $row['RegpasNominal'] = []; + $row['Trxtt'] = null; + $row['TrxBayar'] = []; + $row['TrxLain'] = null; + $row['PaketDispenser'] = null; + + $layanan = []; + $sql = "SELECT * FROM ( + SELECT T_OrderDetailID as TrxLayananID, + case + when Nat_GroupID = 1 then '1100' + when Nat_GroupID = 2 then '1200' + when Nat_GroupID = 3 then '1200' + when Nat_GroupID = 4 then '1303' + when Nat_GroupID = 5 then '1321' + when Nat_GroupID = 6 then '1600' + end as ProfitCostCenterCode, + '' as TrxDepartemenID, + T_OrderDetailCreated as TanggalBuat, + T_OrderDetailT_TestSasCode as LayananID, + T_OrderDetailT_TestName as LayananName, + doctorlab.M_DoctorCode as DokterID, + 0 as ShareRS, + 0 as ShareDokter, + 0 as ShareExternal, + 0 as ShareLain2, + '' as PihakExternal, + '' as PihakLain2, + 'Percentage' as ShareTipe, + T_OrderDetailPrice as Harga, + 1 as Jumlah, + 1 as Rate, + 'N' as FOC, + T_OrderDetailDiscTotal as Diskon, + 'Absolute' as TipeDiskon, + '' as DepartemenID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',T_OrderDetailTotal,0) as DitanggungPasien, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,T_OrderDetailTotal) as DitanggungPenjamin, + 0 as MarkUpCito, + 'N' as Cito, + IFNULL(T_PacketSasCode,'') as PaketID, + 'LABKLINIK' as KelasID, + '' as TrxLayananDetail, + 'Y' as Tagihkan + FROM t_orderdetail + JOIN t_test ON T_TestID = T_OrderDetailT_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' + JOIN t_orderdetailorder ON T_OrderDetailT_OrderDetailOrderID = T_OrderDetailOrderID AND T_OrderDetailOrderIsActive = 'Y' + JOIN t_orderheader ON T_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN m_doctor doctorlab ON T_OrderHeaderPjM_DoctorID = M_DoctorID + 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' + ) AS t_orderdetailorder"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan_debug = 0; + $layanan = $qry->result_array(); + $raw_data[$key]['TrxLayanan'] = []; + if(count($layanan) > 0){ + foreach($layanan as $key_layanan => $row_layanan){ + $total_layanan_debug += $row_layanan['Harga']; + $layanan[$key_layanan]['TrxLayananDetail'] = []; + $sql = "SELECT M_DoctorCode, M_DoctorID + FROM `so_resultentry` + JOIN t_orderdetail ON ? = So_ResultEntryT_OrderDetailID AND T_OrderDetailIsActive = 'Y' + JOIN m_doctor ON M_DoctorID = So_ResultEntryM_DoctorID AND M_DoctorIsActive = 'Y' + WHERE `So_ResultEntryT_OrderHeaderID` = ? AND + `So_ResultEntryIsActive` = 'Y' AND `So_ResultEntryM_DoctorID` > '0' + LIMIT 1 + "; + $qry = $this->db_onedev->query($sql, array($row_layanan['TrxLayananID'],$row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'so_resultentry select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $get_resultentry = $qry->result_array(); + if (count($get_resultentry) > 0) { + $row_layanan['DokterID'] = $get_resultentry[0]['M_DoctorCode']; + } + $raw_data[$key]['TrxLayanan'][] = $row_layanan; + } + } + + $regpasnominal = []; + $jumlah_layanan_lab = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lab + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 1 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + //echo $this->db_onedev->last_query(); + //exit; + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail lab select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + $get_layanan_lab = $qry->row_array(); + $jumlah_layanan_lab = $get_layanan_lab['total_layanan_lab']; + + $jumlah_layanan_radiologi = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_radiologi + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 3 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail radiologi select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $get_layanan_radiologi = $qry->row_array(); + $jumlah_layanan_radiologi = $get_layanan_radiologi['total_layanan_radiologi']; + + $jumlah_layanan_lain = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lain + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID NOT IN (1,3) + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail lain select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + + $get_layanan_lain = $qry->row_array(); + $jumlah_layanan_lain = $get_layanan_lain['total_layanan_lain']; + + $total_layanan = 0; + $sql = "SELECT SUM(T_OrderDetailTotal) as total_layanan + FROM t_orderdetail + JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail total layanan select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan = $qry->row_array(); + $total_layanan = $total_layanan['total_layanan']; + + + $total_bayar = 0; + $sql = "SELECT F_PaymentTotal as total + FROM f_payment + WHERE F_PaymentT_OrderHeaderID = ? AND F_PaymentIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'f_payment select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + $get_total_bayar = $qry->result_array(); + if (count($get_total_bayar) > 0) { + foreach($get_total_bayar as $key_total_bayar => $row_total_bayar){ + $total_bayar += $row_total_bayar['total']; + } + } + + + + $mgm_mcu_m_branch_id = $row['mgm_mcu_m_branch_id']; + $corporate_code = $row['CorporateCode']; + + $total_ditanggung_pasien = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? $total_layanan : 0; + $total_ditanggung_penjamin = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? 0 : $total_layanan; + + $regpasnominal = array( + "BiayaParamedik" => "0.00", + "ParamedikDitanggungPasien" => "0.00", + "ParamedikDitanggungPenjamin" => "0.00", + "BiayaAdministrasi" => "0", + "AdmDitanggungPasien" => "0.00", + "AdmDitanggungPenjamin" => "0.00", + "BiayaMaterai" => "0.00", + "BiayaMateraiDitanggungPasien" => "0.00", + "BiayaMateraiDitanggungPenjamin" => "0.00", + "JumlahLayanan" => $jumlah_layanan_lain, + "JumlahLayananRadiologi" => $jumlah_layanan_radiologi, + "JumlahLayananLaboratorium" => $jumlah_layanan_lab, + "JumlahItem" => 0, + "JumlahItemRetur" => 0, + "JumlahTT" => "0.00", + "JumlahBiayaLain" => "0.00", + "JumlahBayar" => $total_bayar, + "TipeDiskonGlobal" => "Absolute", + "DiskonGlobal" => "0.00", + "TotalDitanggungPasien" => $total_ditanggung_pasien, + "TotalDitanggungPenjamin" => $total_ditanggung_penjamin + ); + + $raw_data[$key]['RegpasNominal'] = array( + $regpasnominal + ); + + //echo $total_bayar; + $raw_data[$key]['TrxBayar'] = null; + if($total_bayar > 0){ + $sql = "SELECT M_PatientNoReg as MEDRECID, + F_PaymentDetailID as BayarID, + IFNULL(F_PaymentDetailAmount,0) as Jumlah, + F_PaymentDetailCreated as Tanggal, + 'Pelunasan' as JenisBayarID, + CONCAT(F_PaymentNumber,'.',F_PaymentDetailID) as KwitansiID, + IF(F_PaymentDetailM_PaymentTypeID = 21,CONCAT(F_PaymentDetailM_PaymentTypeID,'0',F_PaymentDetailM_BankAccountID),CONCAT(F_PaymentDetailM_PaymentTypeID,F_PaymentDetailM_BankAccountID)) as TipeBayarID, + 'N' as Dibatalkan + FROM f_paymentdetail + JOIN f_payment ON F_PaymentDetailF_PaymentID = F_PaymentID AND F_PaymentIsActive = 'Y' + JOIN t_orderheader ON F_PaymentT_OrderHeaderID = T_OrderHeaderID + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' + WHERE + F_PaymentT_OrderHeaderID = ? AND F_PaymentDetailIsActive = 'Y' + GROUP BY F_PaymentDetailID"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'f_payment select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + //echo $this->db_onedev->last_query(); + //exit; + $bayar = $qry->result_array(); + + $raw_data[$key]['TrxBayar'] = $bayar; + } + + $raw_data[$key]['Trxtt'] = null; + $raw_data[$key]['TrxLain'] = null; + $raw_data[$key]['PaketDispenser'] = null; + $errors = []; + //exit; + $result = $this->post_request($url, $raw_data[$key], $headers); + + + + if ($result['error'] != null) { + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'error', + json_encode($result), + $url, + 555 + )); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'transaction insert', 'query' => $this->db_onedev->last_query(), 'json' => json_encode($result)), 999); + + $errors[] = array('RegID' => $row['RegID'], 'error' => $result['error'] ?? ($result['message'] ?? 'Unknown error from external API')); + + + }else{ + //echo 'insert ais_transaction'; + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'success', + json_encode($result), + $url, + 555 + )); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + } + + + + } + + if(count($errors) > 0){ + $success = array('status' => 'error', 'message' => 'Gagal Post Transaction', 'errors' => $errors); + echo json_encode($success); + exit; + }else{ + $success = array('status' => 'success', 'message' => 'Berhasil Post Transaction'); + echo json_encode($success); + exit; + } + + } + + function re_post_transaction_by_labnumber() + { + $prm = $this->sys_input; + $labnum = $prm['labnumber']; + // Auth Login + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 555); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaction_full/transaksi.php'; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + + // Get data + $sql = "SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + IFNULL(M_UserEmail,'Administrator') as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + IFNULL(M_UserEmail,'Administrator') as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID + JOIN t_priceheader ON Mgm_McuT_PriceHeaderID = T_PriceHeaderID + LEFT JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + WHERE T_OrderHeaderIsActive = 'Y' + AND T_OrderHeaderLabNumber = ? + AND ( T_OrderHeaderMgm_McuID != 0 AND T_OrderHeaderMgm_McuID IS NOT NULL)-- TAMBAHAN: Exclude cases where Mgm_McuID = 0 + + UNION + + SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + '' as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + IFNULL(M_UserEmail,'Administrator') as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + IFNULL(M_UserEmail,'Administrator') as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN t_orderheaderaddon ON T_OrderHeaderAddOnT_OrderHeaderID = T_OrderHeaderID + AND T_OrderHeaderAddOnIsActive = 'Y' + JOIN t_priceheader ON T_OrderHeaderAddOnT_PriceHeaderID = T_PriceHeaderID + LEFT JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + WHERE T_OrderHeaderIsActive = 'Y' + AND T_OrderHeaderLabNumber = ? + AND ( T_OrderHeaderMgm_McuID = 0 OR T_OrderHeaderMgm_McuID IS NULL) + + LIMIT 1 + "; + $qry = $this->db_onedev->query($sql, array($labnum,$labnum)); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $raw_data = $qry->result_array(); + if(count($raw_data) == 0){ + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + $errors = array('status' => 'error', 'message' => 'Data tidak ditemukan'); + echo json_encode($errors); + exit; + } + + $data = array(); + foreach ($raw_data as $key => $row) { + + $row['TrxLayanan'] = []; + $row['TrxItem'] = []; + $row['TrxItemReturn'] = []; + $row['RegpasNominal'] = []; + $row['Trxtt'] = null; + $row['TrxBayar'] = []; + $row['TrxLain'] = null; + $row['PaketDispenser'] = null; + + $layanan = []; + $sql = "SELECT * FROM ( + SELECT T_OrderDetailID as TrxLayananID, + case + when Nat_GroupID = 1 then '1100' + when Nat_GroupID = 2 then '1200' + when Nat_GroupID = 3 then '1200' + when Nat_GroupID = 4 then '1303' + when Nat_GroupID = 5 then '1321' + when Nat_GroupID = 6 then '1600' + end as ProfitCostCenterCode, + '' as TrxDepartemenID, + T_OrderDetailCreated as TanggalBuat, + T_OrderDetailT_TestSasCode as LayananID, + T_OrderDetailT_TestName as LayananName, + doctorlab.M_DoctorCode as DokterID, + 0 as ShareRS, + 0 as ShareDokter, + 0 as ShareExternal, + 0 as ShareLain2, + '' as PihakExternal, + '' as PihakLain2, + 'Percentage' as ShareTipe, + T_OrderDetailPrice as Harga, + 1 as Jumlah, + 1 as Rate, + 'N' as FOC, + T_OrderDetailDiscTotal as Diskon, + 'Absolute' as TipeDiskon, + '' as DepartemenID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',T_OrderDetailTotal,0) as DitanggungPasien, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,T_OrderDetailTotal) as DitanggungPenjamin, + 0 as MarkUpCito, + 'N' as Cito, + IFNULL(T_PacketSasCode,'') as PaketID, + 'LABKLINIK' as KelasID, + '' as TrxLayananDetail, + 'Y' as Tagihkan + FROM t_orderdetail + JOIN t_test ON T_TestID = T_OrderDetailT_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' + JOIN t_orderdetailorder ON T_OrderDetailT_OrderDetailOrderID = T_OrderDetailOrderID AND T_OrderDetailOrderIsActive = 'Y' + JOIN t_orderheader ON T_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN m_doctor doctorlab ON T_OrderHeaderPjM_DoctorID = M_DoctorID + 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' + ) AS t_orderdetailorder"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan_debug = 0; + $layanan = $qry->result_array(); + $raw_data[$key]['TrxLayanan'] = []; + if(count($layanan) > 0){ + foreach($layanan as $key_layanan => $row_layanan){ + $total_layanan_debug += $row_layanan['Harga']; + $layanan[$key_layanan]['TrxLayananDetail'] = []; + $sql = "SELECT M_DoctorCode, M_DoctorID + FROM `so_resultentry` + JOIN t_orderdetail ON ? = So_ResultEntryT_OrderDetailID AND T_OrderDetailIsActive = 'Y' + JOIN m_doctor ON M_DoctorID = So_ResultEntryM_DoctorID AND M_DoctorIsActive = 'Y' + WHERE `So_ResultEntryT_OrderHeaderID` = ? AND + `So_ResultEntryIsActive` = 'Y' AND `So_ResultEntryM_DoctorID` > '0' + LIMIT 1 + "; + $qry = $this->db_onedev->query($sql, array($row_layanan['TrxLayananID'],$row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'so_resultentry select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $get_resultentry = $qry->result_array(); + if (count($get_resultentry) > 0) { + $row_layanan['DokterID'] = $get_resultentry[0]['M_DoctorCode']; + } + $raw_data[$key]['TrxLayanan'][] = $row_layanan; + } + } + + $regpasnominal = []; + $jumlah_layanan_lab = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lab + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 1 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + //echo $this->db_onedev->last_query(); + //exit; + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail lab select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + $get_layanan_lab = $qry->row_array(); + $jumlah_layanan_lab = $get_layanan_lab['total_layanan_lab']; + + $jumlah_layanan_radiologi = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_radiologi + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 3 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail radiologi select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $get_layanan_radiologi = $qry->row_array(); + $jumlah_layanan_radiologi = $get_layanan_radiologi['total_layanan_radiologi']; + + $jumlah_layanan_lain = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lain + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID NOT IN (1,3) + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail lain select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + + $get_layanan_lain = $qry->row_array(); + $jumlah_layanan_lain = $get_layanan_lain['total_layanan_lain']; + + $total_layanan = 0; + $sql = "SELECT SUM(T_OrderDetailTotal) as total_layanan + FROM t_orderdetail + JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail total layanan select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan = $qry->row_array(); + $total_layanan = $total_layanan['total_layanan']; + + + $total_bayar = 0; + $sql = "SELECT F_PaymentTotal as total + FROM f_payment + WHERE F_PaymentT_OrderHeaderID = ? AND F_PaymentIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'f_payment select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + $get_total_bayar = $qry->result_array(); + if (count($get_total_bayar) > 0) { + foreach($get_total_bayar as $key_total_bayar => $row_total_bayar){ + $total_bayar += $row_total_bayar['total']; + } + } + + + + $mgm_mcu_m_branch_id = $row['mgm_mcu_m_branch_id']; + $corporate_code = $row['CorporateCode']; + + $total_ditanggung_pasien = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? $total_layanan : 0; + $total_ditanggung_penjamin = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? 0 : $total_layanan; + + $regpasnominal = array( + "BiayaParamedik" => "0.00", + "ParamedikDitanggungPasien" => "0.00", + "ParamedikDitanggungPenjamin" => "0.00", + "BiayaAdministrasi" => "0", + "AdmDitanggungPasien" => "0.00", + "AdmDitanggungPenjamin" => "0.00", + "BiayaMaterai" => "0.00", + "BiayaMateraiDitanggungPasien" => "0.00", + "BiayaMateraiDitanggungPenjamin" => "0.00", + "JumlahLayanan" => $jumlah_layanan_lain, + "JumlahLayananRadiologi" => $jumlah_layanan_radiologi, + "JumlahLayananLaboratorium" => $jumlah_layanan_lab, + "JumlahItem" => 0, + "JumlahItemRetur" => 0, + "JumlahTT" => "0.00", + "JumlahBiayaLain" => "0.00", + "JumlahBayar" => $total_bayar, + "TipeDiskonGlobal" => "Absolute", + "DiskonGlobal" => "0.00", + "TotalDitanggungPasien" => $total_ditanggung_pasien, + "TotalDitanggungPenjamin" => $total_ditanggung_penjamin + ); + + + + $raw_data[$key]['RegpasNominal'] = array( + $regpasnominal + ); + + //echo $total_bayar; + $raw_data[$key]['TrxBayar'] = null; + if($total_bayar > 0){ + $sql = "SELECT M_PatientNoReg as MEDRECID, + F_PaymentDetailID as BayarID, + IFNULL(F_PaymentDetailAmount,0) as Jumlah, + F_PaymentDetailCreated as Tanggal, + 'Pelunasan' as JenisBayarID, + CONCAT(F_PaymentNumber,'.',F_PaymentDetailID) as KwitansiID, + IF(F_PaymentDetailM_PaymentTypeID = 21,CONCAT(F_PaymentDetailM_PaymentTypeID,'0',F_PaymentDetailM_BankAccountID),CONCAT(F_PaymentDetailM_PaymentTypeID,F_PaymentDetailM_BankAccountID)) as TipeBayarID, + 'N' as Dibatalkan + FROM f_paymentdetail + JOIN f_payment ON F_PaymentDetailF_PaymentID = F_PaymentID AND F_PaymentIsActive = 'Y' + JOIN t_orderheader ON F_PaymentT_OrderHeaderID = T_OrderHeaderID + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' + WHERE + F_PaymentT_OrderHeaderID = ? AND F_PaymentDetailIsActive = 'Y' + GROUP BY F_PaymentDetailID"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'f_payment select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + //echo $this->db_onedev->last_query(); + //exit; + $bayar = $qry->result_array(); + + $raw_data[$key]['TrxBayar'] = $bayar; + } + + $raw_data[$key]['Trxtt'] = null; + $raw_data[$key]['TrxLain'] = null; + $raw_data[$key]['PaketDispenser'] = null; + $errors = []; + + //echo json_encode($raw_data[$key]); + //exit; + $result = $this->put_request($url, $raw_data[$key], $headers); + + + if ($result['error'] != null) { + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'error', + json_encode($result), + $url, + 555 + )); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'transaction insert', 'query' => $this->db_onedev->last_query(), 'json' => json_encode($result)), 999); + + $errors[] = array('RegID' => $row['RegID'], 'error' => $result['message']); + + + }else{ + //echo 'insert ais_transaction'; + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'success', + json_encode($result), + $url, + 555 + )); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + } + + + + } + + if(count($errors) > 0){ + $success = array('status' => 'error', 'message' => 'Gagal Post Transaction', 'errors' => $errors); + echo json_encode($success); + exit; + }else{ + $success = array('status' => 'success', 'message' => 'Berhasil Post Transaction'); + echo json_encode($success); + exit; + } + + } + + function post_transaction($labnum='',$xdate=null) + { + // Auth Login + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 555); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + // Get config + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaction_full/transaksi.php'; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + + + if($labnum == ''){ + $xdate = $xdate == null ? date('Y-m-d') : $xdate; + } + // Get data + $sql = "SELECT T_OrderHeaderID, + T_OrderHeaderTotal as Total, + T_OrderHeaderLabNumber as RegID, + Mgm_McuM_BranchID as mgm_mcu_m_branch_id, + M_PatientNoReg as MEDRECID, + T_OrderHeaderDate as Tanggal, + T_OrderHeaderDate as PulangTanggal, + CorporateCode, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as PerusahaanID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181','',CorporateCode) as AsuransiID, + T_PriceHeaderCode as GroupTarifID, + M_PatientName as Nama, + M_PatientIdentifierValue as NIK, + DATE_FORMAT(M_PatientDOB, '%Y-%m-%d %H:%i:%s') as TglLahir, + IF(M_PatientGender = 'male','L','P') as JnsKelamin, + '' as NomorPolis, + '' as NomerJaminan, + '2' as JenisRegID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,1) as JenisPasienID, + 'LAB-WESTERINDO-01' as DepartemenID, + 'Y' as Pulang, + 'Y' as BolehPulang, + '' as Catatan, + 'Y' as Verified, + 'LABKLINIK' as KelasID, + M_UserEmail as LoginBuat, + T_OrderHeaderCreated as TanggalBuat, + branch_order.M_BranchAis_branch_code as BranchCode, + CorporateTypeais_pillar_code as PillarCode, + '0000' as SiteCenterCode, + M_UserEmail as VerifiedBy, + T_OrderHeaderCreated as VerifiedDate, + '' as TrxLayanan, + '' as TrxItem, + '' as TrxItemReturn, + '' as RegpasNominal, + '' as Trxtt, + '' as TrxBayar, + '' as TrxLain, + '' as PaketDispenser + FROM t_orderheader + JOIN m_branch branch_order ON branch_order.M_BranchID = T_OrderHeaderM_BranchID + JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID + JOIN corporate ON CorporateID = T_OrderHeaderCorporateID + JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID -- AND Mgm_McuID = 1566 + JOIN t_priceheader ON Mgm_McuT_PriceHeaderID = T_PriceHeaderID + JOIN m_user ON T_OrderHeaderCreatedUserID = M_UserID + LEFT JOIN cpone_log.ais_transaction ON Ais_TransactionOrderHeaderLabNumber = T_OrderHeaderLabNumber AND + Ais_TransactionStatus = 'success' + WHERE T_OrderHeaderIsActive = 'Y' AND + T_OrderHeaderLabNumber = ? AND + Ais_TransactionID IS NULL + GROUP BY T_OrderHeaderID + LIMIT 100"; + $qry = $this->db_onedev->query($sql, array($labnum)); + //echo $this->db_onedev->last_query(); + //exit; + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderheader select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $raw_data = $qry->result_array(); + + $data = array(); + foreach ($raw_data as $key => $row) { + + $row['TrxLayanan'] = []; + $row['TrxItem'] = []; + $row['TrxItemReturn'] = []; + $row['RegpasNominal'] = []; + $row['Trxtt'] = null; + $row['TrxBayar'] = []; + $row['TrxLain'] = null; + $row['PaketDispenser'] = null; + + $layanan = []; + $sql = "SELECT * FROM ( + SELECT T_OrderDetailID as TrxLayananID, + case + when Nat_GroupID = 1 then '1100' + when Nat_GroupID = 2 then '1200' + when Nat_GroupID = 3 then '1200' + when Nat_GroupID = 4 then '1303' + when Nat_GroupID = 5 then '1321' + when Nat_GroupID = 6 then '1600' + end as ProfitCostCenterCode, + '' as TrxDepartemenID, + T_OrderDetailCreated as TanggalBuat, + T_OrderDetailT_TestSasCode as LayananID, + T_OrderDetailT_TestName as LayananName, + doctorlab.M_DoctorCode as DokterID, + 0 as ShareRS, + 0 as ShareDokter, + 0 as ShareExternal, + 0 as ShareLain2, + '' as PihakExternal, + '' as PihakLain2, + 'Percentage' as ShareTipe, + T_OrderDetailPrice as Harga, + 1 as Jumlah, + 1 as Rate, + 'N' as FOC, + T_OrderDetailDiscTotal as Diskon, + 'Absolute' as TipeDiskon, + '' as DepartemenID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',T_OrderDetailTotal,0) as DitanggungPasien, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,T_OrderDetailTotal) as DitanggungPenjamin, + 0 as MarkUpCito, + 'N' as Cito, + T_PacketSasCode as PaketID, + 'LABKLINIK' as KelasID, + '' as TrxLayananDetail, + 'Y' as Tagihkan + FROM t_orderdetail + JOIN t_test ON T_TestID = T_OrderDetailT_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' + JOIN t_orderdetailorder ON T_OrderDetailT_OrderDetailOrderID = T_OrderDetailOrderID AND + T_OrderDetailOrderIsPacket = 'Y' AND T_OrderDetailOrderIsActive = 'Y' + JOIN t_packet ON T_OrderDetailOrderT_PacketID = T_PacketID + JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_PacketID AND T_PacketDetailT_TestID = T_OrderDetailT_TestID AND + T_PacketDetailIsActive = 'Y' + JOIN t_orderheader ON T_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID + 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' + UNION + SELECT T_OrderDetailID as TrxLayananID, + Nat_GroupID as ProfitCostCenterCode, + '' as TrxDepartemenID, + T_OrderDetailCreated as TanggalBuat, + T_OrderDetailT_TestSasCode as LayananID, + T_OrderDetailT_TestName as LayananName, + doctorlab.M_DoctorCode as DokterID, + 0 as ShareRS, + 0 as ShareDokter, + 0 as ShareExternal, + 0 as ShareLain2, + '' as PihakExternal, + '' as PihakLain2, + 'Percentage' as ShareTipe, + T_OrderDetailPrice as Harga, + 1 as Jumlah, + 1 as Rate, + 'N' as FOC, + T_OrderDetailDiscTotal as Diskon, + 'Absolute' as TipeDiskon, + '' as DepartemenID, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',T_OrderDetailTotal,0) as DitanggungPasien, + IF(CorporateCode = 'C25040059' OR CorporateCode = 'C25060181',0,T_OrderDetailTotal) as DitanggungPenjamin, + 0 as MarkUpCito, + 'N' as Cito, + '' as PaketID, + 'LABKLINIK' as KelasID, + NULL as TrxLayananDetail, + 'Y' as Tagihkan + FROM `t_orderdetailorder` + JOIN t_orderdetail ON T_OrderdetailT_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID AND + T_OrderDetailIsActive = 'Y' AND T_OrderDetailT_OrderDetailOrderID = T_OrderDetailOrderID + JOIN t_test ON T_TestID = T_OrderDetailT_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' + JOIN t_orderheader ON T_OrderHeaderID = T_OrderDetailOrderT_OrderHeaderID + 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"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'],$row['T_OrderHeaderID'])); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan_debug = 0; + $layanan = $qry->result_array(); + $raw_data[$key]['TrxLayanan'] = []; + if(count($layanan) > 0){ + foreach($layanan as $key_layanan => $row_layanan){ + $total_layanan_debug += $row_layanan['Harga']; + $layanan[$key_layanan]['TrxLayananDetail'] = []; + $sql = "SELECT M_DoctorCode, M_DoctorID + FROM `so_resultentry` + JOIN t_orderdetail ON ? = So_ResultEntryT_OrderDetailID AND T_OrderDetailIsActive = 'Y' + JOIN m_doctor ON M_DoctorID = So_ResultEntryM_DoctorID AND M_DoctorIsActive = 'Y' + WHERE `So_ResultEntryT_OrderHeaderID` = ? AND + `So_ResultEntryIsActive` = 'Y' AND `So_ResultEntryM_DoctorID` > '0' + LIMIT 1 + "; + $qry = $this->db_onedev->query($sql, array($row_layanan['TrxLayananID'],$row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'so_resultentry select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $get_resultentry = $qry->result_array(); + if (count($get_resultentry) > 0) { + $row_layanan['DokterID'] = $get_resultentry[0]['M_DoctorCode']; + } + $raw_data[$key]['TrxLayanan'][] = $row_layanan; + } + } + + $regpasnominal = []; + $jumlah_layanan_lab = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lab + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 1 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + //echo $this->db_onedev->last_query(); + //exit; + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail lab select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + $get_layanan_lab = $qry->row_array(); + $jumlah_layanan_lab = $get_layanan_lab['total_layanan_lab']; + + $jumlah_layanan_radiologi = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_radiologi + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID = 3 + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail radiologi select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $get_layanan_radiologi = $qry->row_array(); + $jumlah_layanan_radiologi = $get_layanan_radiologi['total_layanan_radiologi']; + + $jumlah_layanan_lain = 0; + $sql = "SELECT IFNULL(SUM(T_OrderDetailTotal),0) as total_layanan_lain + FROM t_orderdetail + JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' + JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' + JOIN nat_group ON Nat_GroupID = Nat_TestNat_GroupID AND Nat_GroupIsActive = 'Y' AND + Nat_GroupID NOT IN (1,3) + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail lain select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + + $get_layanan_lain = $qry->row_array(); + $jumlah_layanan_lain = $get_layanan_lain['total_layanan_lain']; + + $total_layanan = 0; + $sql = "SELECT SUM(T_OrderDetailTotal) as total_layanan + FROM t_orderdetail + JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID + WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 't_orderdetail total layanan select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + $total_layanan = $qry->row_array(); + $total_layanan = $total_layanan['total_layanan']; + + + $total_bayar = 0; + $sql = "SELECT F_PaymentTotal as total + FROM f_payment + WHERE F_PaymentT_OrderHeaderID = ? AND F_PaymentIsActive = 'Y' + "; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'f_payment select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + + $get_total_bayar = $qry->result_array(); + if (count($get_total_bayar) > 0) { + foreach($get_total_bayar as $key_total_bayar => $row_total_bayar){ + $total_bayar += $row_total_bayar['total']; + } + } + + + + $mgm_mcu_m_branch_id = $row['mgm_mcu_m_branch_id']; + $corporate_code = $row['CorporateCode']; + + $total_ditanggung_pasien = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? $total_layanan : 0; + $total_ditanggung_penjamin = $corporate_code == 'C25040059' || $corporate_code == 'C25060181' ? 0 : $total_layanan; + + $regpasnominal = array( + "BiayaParamedik" => "0.00", + "ParamedikDitanggungPasien" => "0.00", + "ParamedikDitanggungPenjamin" => "0.00", + "BiayaAdministrasi" => "0", + "AdmDitanggungPasien" => "0.00", + "AdmDitanggungPenjamin" => "0.00", + "BiayaMaterai" => "0.00", + "BiayaMateraiDitanggungPasien" => "0.00", + "BiayaMateraiDitanggungPenjamin" => "0.00", + "JumlahLayanan" => $jumlah_layanan_lain, + "JumlahLayananRadiologi" => $jumlah_layanan_radiologi, + "JumlahLayananLaboratorium" => $jumlah_layanan_lab, + "JumlahItem" => 0, + "JumlahItemRetur" => 0, + "JumlahTT" => "0.00", + "JumlahBiayaLain" => "0.00", + "JumlahBayar" => $total_bayar, + "TipeDiskonGlobal" => "Absolute", + "DiskonGlobal" => "0.00", + "TotalDitanggungPasien" => $total_ditanggung_pasien, + "TotalDitanggungPenjamin" => $total_ditanggung_penjamin + ); + + $raw_data[$key]['RegpasNominal'] = array( + $regpasnominal + ); + + //echo $total_bayar; + $raw_data[$key]['TrxBayar'] = null; + if($total_bayar > 0){ + $sql = "SELECT M_PatientNoReg as MEDRECID, + F_PaymentDetailID as BayarID, + IFNULL(F_PaymentDetailAmount,0) as Jumlah, + F_PaymentDetailCreated as Tanggal, + 'Pelunasan' as JenisBayarID, + CONCAT(F_PaymentNumber,'.',F_PaymentDetailID) as KwitansiID, + IF(F_PaymentDetailM_PaymentTypeID = 21,CONCAT(F_PaymentDetailM_PaymentTypeID,'0',F_PaymentDetailM_BankAccountID),CONCAT(F_PaymentDetailM_PaymentTypeID,F_PaymentDetailM_BankAccountID)) as TipeBayarID, + 'N' as Dibatalkan + FROM f_paymentdetail + JOIN f_payment ON F_PaymentDetailF_PaymentID = F_PaymentID AND F_PaymentIsActive = 'Y' + JOIN t_orderheader ON F_PaymentT_OrderHeaderID = T_OrderHeaderID + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' + WHERE + F_PaymentT_OrderHeaderID = ? AND F_PaymentDetailIsActive = 'Y' + GROUP BY F_PaymentDetailID"; + $qry = $this->db_onedev->query($sql, array($row['T_OrderHeaderID'])); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'f_payment select', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + exit; + } + //echo $this->db_onedev->last_query(); + //exit; + $bayar = $qry->result_array(); + + $raw_data[$key]['TrxBayar'] = $bayar; + } + + $raw_data[$key]['Trxtt'] = null; + $raw_data[$key]['TrxLain'] = null; + $raw_data[$key]['PaketDispenser'] = null; + $errors = []; + + //echo json_encode($raw_data[$key]); + //exit; + $result = $this->post_request($url, $raw_data[$key], $headers); + + + if ($result['error'] != null) { + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'error', + json_encode($result), + $url, + 555 + )); + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'transaction insert', 'query' => $this->db_onedev->last_query(), 'json' => json_encode($result)), 999); + + $errors[] = array('RegID' => $row['RegID'], 'error' => $result['message']); + + + }else{ + //echo 'insert ais_transaction'; + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) + VALUES( + ?, + ?, + ?, + ?, + ?, + ?, + NOW() + )"; + $qry = $this->db_log->query($sql, array( + $row['RegID'], + json_encode($raw_data[$key]), + 'success', + json_encode($result), + $url, + 555 + )); + + if (!$qry) { + $this->error_log(array('fn_name' => 'post_transaction', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + exit; + } + } + + + + } + + if(count($errors) > 0){ + $success = array('status' => 'error', 'message' => 'Gagal Post Transaction', 'errors' => $errors); + echo json_encode($success); + exit; + }else{ + $success = array('status' => 'success', 'message' => 'Berhasil Post Transaction'); + echo json_encode($success); + exit; + } + + } + + function get_transaction() + { + // Get id from query parameter + $id = $this->input->get('id'); + + if (empty($id)) { + $errors = array('status' => 'error', 'message' => 'ID parameter is required'); + echo json_encode($errors); + exit; + } + + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'get_transaction_auth', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 999); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaksi?id=' . $id; + + + $result = $this->get_request($url); + if (!$result['success']) { + $this->error_log(array('fn_name' => 'get_transaction', 'message' => 'failed get transaction', 'query' => '', 'json' => json_encode($result)), 999); + $errors = array('status' => 'error', 'message' => 'Gagal Get Transaction'); + echo json_encode($errors); + exit; + } + + $data = $result['response']['data'] ?? null; + // $data = json_encode($data); + $success = array('status' => 'success', 'message' => 'Berhasil Get Transaction', 'data' => $data); + echo json_encode($success); + exit; + + } + + function check_exist_transaction(){ + $prm = $this->sys_input; + $labnumber = $prm['labnumber'] ?? null; + if(empty($labnumber)){ + $errors = array('status' => 'error', 'message' => 'Labnumber parameter is required'); + echo json_encode($errors); + exit; + } + + $transaction = $this->get_transaction_by_labnumber($labnumber); + if($transaction){ + $success = array('status' => 'success', 'message' => 'Transaksi sudah ada', 'data' => $transaction); + echo json_encode($success); + exit; + }else{ + $success = array('status' => 'error', 'message' => 'Transaksi tidak ditemukan', 'data' => null); + echo json_encode($success); + exit; + } + } + + function get_transaction_by_labnumber_debug($labnumber) + { + // Get id from query parameter + if (empty($labnumber)) { + $errors = array('status' => 'error', 'message' => 'Labnumber parameter is required'); + echo json_encode($errors); + exit; + } + + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'get_transaction_auth', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 999); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaksi?id=' . $labnumber; + + + $result = $this->get_request($url); + + + $data = $result['response']['data'] ?? null; + + if($data && count($data) > 0){ + echo json_encode($data); + exit; + }else{ + return null; + } + } + + + function get_transaction_by_labnumber($labnumber) + { + // Get id from query parameter + if (empty($labnumber)) { + $errors = array('status' => 'error', 'message' => 'Labnumber parameter is required'); + echo json_encode($errors); + exit; + } + + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'get_transaction_auth', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 999); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + $url = $baseUrl . '/api/transaksi?id=' . $labnumber; + + + $result = $this->get_request($url); + + + $data = $result['response']['data'] ?? null; + //echo json_encode($result); + + if($data && count($data) > 0){ + return $data; + }else{ + return null; + } + } + + function delete_transaction_by_date(){ + $failed_delete = array(); + $already_deleted = array(); + $transaksi_tidak_ditemukan = array(); + $prm = $this->sys_input; + $min_date = $prm['min_date'] ?? null; + $max_date = $prm['max_date'] ?? null; + if(empty($min_date) || empty($max_date)){ + $errors = array('status' => 'error', 'message' => 'Min date and max date parameter is required'); + echo json_encode($errors); + exit; + } + + if ($min_date && $max_date) { + $min_date_obj = new DateTime($min_date); + $max_date_obj = new DateTime($max_date); + $date_diff = $min_date_obj->diff($max_date_obj); + $days_diff = $date_diff->days; + + if ($days_diff > 5) { + $errors = array('status' => 'error', 'message' => 'Selisih antara min_date dan max_date maksimal 7 hari'); + echo json_encode($errors); + exit; + } + } + + $params = array($min_date, $max_date); + $sql = "SELECT T_OrderHeaderLabNumber as RegID + FROM t_orderheader + WHERE ( DATE(T_OrderHeaderDate) >= ? AND DATE(T_OrderHeaderDate) <= ? ) AND T_OrderHeaderIsActive = 'N' + + + "; + $qry = $this->db_onedev->query($sql, $params); + //echo $this->db_onedev->last_query(); + //exit; + if(!$qry){ + $this->error_log(array('fn_name' => 'delete_transaction_by_date', 'message' => 'Gagal select t_orderheader delete by date', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + $errors = array('status' => 'error', 'message' => 'Gagal select t_orderheader delete by date', 'query' => $this->db_onedev->last_query(), 'json' => ''); + echo json_encode($errors); + exit; + } + $raw_data = $qry->result_array(); + + if(count($raw_data) == 0){ + $success = array('status' => 'success', 'message' => 'Tidak ada data yang perlu dihapus'); + echo json_encode($success); + exit; + } + + foreach($raw_data as $row){ + $get_transaction = $this->get_transaction_by_labnumber($row['RegID']); + //echo json_encode($get_transaction); + //exit; + if($get_transaction && count($get_transaction) > 0){ + $result = $this->delete_transaction_by_labnumber_private($row['RegID']); + if(!$result){ + $failed_delete[] = $row['RegID']; + } + }else{ + $transaksi_tidak_ditemukan[] = $row['RegID']; + } + } + + $msg = ""; + if(count($failed_delete) > 0){ + $msg .= "Gagal Delete Transaction Some Data: " . implode(', ', $failed_delete); + } + if(count($transaksi_tidak_ditemukan) > 0){ + $msg .= "Beberapa transaksi tidak ditemukan: " . implode(', ', $transaksi_tidak_ditemukan); + } + if(count($failed_delete) == 0 && count($transaksi_tidak_ditemukan) == 0){ + $msg .= "Berhasil Delete Transaction"; + } + + $arr_res = array( + 'status' => 'selesai', + 'message' => $msg, + 'data' => $raw_data, + 'failed_delete' => $failed_delete, + 'transaksi_tidak_ditemukan' => $transaksi_tidak_ditemukan + ); + echo json_encode($arr_res); + exit; + } + + function delete_transaction_by_labnumber_range(){ + + $sql = "SELECT T_OrderHeaderLabNumber as RegID + FROM t_orderheader + JOIN delete_cpone_order_walk_in_inject ON + delete_cpone_order_walk_in_inject.reg_id = t_orderheader.T_OrderHeaderLabNumber + WHERE t_orderheader.T_OrderHeaderIsActive = 'N' + LIMIT 100 + "; + $qry = $this->db_onedev->query($sql, $params); + //echo $this->db_onedev->last_query(); + //exit; + if(!$qry){ + $this->error_log(array('fn_name' => 'delete_transaction_by_labnumber_range', 'message' => 'Gagal select t_orderheader delete by labnumber range', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + $errors = array('status' => 'error', 'message' => 'Gagal select t_orderheader delete by labnumber range', 'query' => $this->db_onedev->last_query(), 'json' => ''); + echo json_encode($errors); + exit; + } + $raw_data = $qry->result_array(); + + if(count($raw_data) == 0){ + $success = array('status' => 'success', 'message' => 'Tidak ada data yang perlu dihapus'); + echo json_encode($success); + exit; + } + + foreach($raw_data as $row){ + $get_transaction = $this->get_transaction_by_labnumber($row['RegID']); + //echo json_encode($get_transaction); + //exit; + if($get_transaction && count($get_transaction) > 0){ + $result = $this->delete_transaction_by_labnumber_private($row['RegID']); + if(!$result){ + $failed_delete[] = $row['RegID']; + } + }else{ + $transaksi_tidak_ditemukan[] = $row['RegID']; + } + } + + $msg = ""; + if(count($failed_delete) > 0){ + $msg .= "Gagal Delete Transaction Some Data: " . implode(', ', $failed_delete); + } + if(count($transaksi_tidak_ditemukan) > 0){ + $msg .= "Beberapa transaksi tidak ditemukan: " . implode(', ', $transaksi_tidak_ditemukan); + } + if(count($failed_delete) == 0 && count($transaksi_tidak_ditemukan) == 0){ + $msg .= "Berhasil Delete Transaction"; + } + + $arr_res = array( + 'status' => 'selesai', + 'message' => $msg, + 'data' => $raw_data, + 'failed_delete' => $failed_delete, + 'transaksi_tidak_ditemukan' => $transaksi_tidak_ditemukan + ); + echo json_encode($arr_res); + exit; + } + + function delete_transaction_by_labnumber_private($labnumber) + { + $userid = 999777; + //echo $labnumber; + // Get id from query parameter + if (empty($labnumber)) { + $errors = array('status' => 'error', 'message' => 'Labnumber parameter is required'); + echo json_encode($errors); + exit; + } + + // Get config first before using it + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'get_transaction_auth', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 999); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + return false; + } + + $url = $baseUrl . '/api/transaction_full/transaksi.php'; + + + $result = $this->delete_request($url, ['RegID' => $labnumber], $headers); + + //echo json_encode($result); + + + //response {"success":true} + + + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) VALUES (?, ?, ?, ?, ?, ?, NOW())"; + $qry = $this->db_log->query($sql, array( + $labnumber, + json_encode(['RegID' => $labnumber]), + $result['success'] ? 'success' : 'error', + json_encode($result), + $url, + $userid + )); + //echo $this->db_log->last_query(); + //exit; + if(!$qry){ + echo $this->db_log->last_query(); + exit; + $errors = array('status' => 'error', 'message' => 'Gagal Insert Ais Transaction Log','query' => $this->db_log->last_query(), 'json' => json_encode($result)); + $this->error_log(array('fn_name' => 'delete_transaction_by_labnumber', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + $this->sys_error($errors); + exit; + } + + if($result['success']){ + return true; + }else{ + //$this->error_log(array('fn_name' => 'delete_transaction_by_labnumber', 'message' => 'Gagal Delete Transaction', 'query' => '', 'json' => json_encode($result)), 999); + return false; + } + + + } + + function delete_transaction_by_labnumber() + { + if (! $this->isLogin) { + $this->sys_error("Invalid Token"); + exit; + } + $prm = $this->sys_input; + $userid = $this->sys_user['M_UserID'] ?? 555; + $labnumber = $prm['labnumber'] ?? null; + // Get id from query parameter + if (empty($labnumber)) { + $errors = array('status' => 'error', 'message' => 'Labnumber parameter is required'); + echo json_encode($errors); + exit; + } + + // Get config first before using it + $dt_config = $this->get_config(); + $baseUrl = $dt_config['AisConfigBaseUrl']; + + $headers = array( + 'Header-Token: ' . $dt_config['AisConfigHeaderToken'], + 'Authorization: Bearer ' . $dt_config['AisConfigAuthToken'] + ); + + $login = $this->post_auth(); + if (!$login['success']) { + $this->error_log(array('fn_name' => 'get_transaction_auth', 'message' => 'failed auth', 'query' => '', 'json' => json_encode($login)), 999); + $errors = array('status' => 'error', 'message' => 'Gagal Login'); + echo json_encode($errors); + exit; + } + + $url = $baseUrl . '/api/transaction_full/transaksi.php'; + + + $result = $this->delete_request($url, ['RegID' => $labnumber], $headers); + + //response {"success":true} + + + $sql = "INSERT INTO ais_transaction( + Ais_TransactionOrderHeaderLabNumber, + Ais_TransactionJson, + Ais_TransactionStatus, + Ais_TransactionResponse, + Ais_TransactionUrl, + Ais_TransactionUserID, + Ais_TransactionCreated + ) VALUES (?, ?, ?, ?, ?, ?, NOW())"; + $qry = $this->db_log->query($sql, array( + $labnumber, + json_encode(['RegID' => $labnumber]), + $result['success'] ? 'success' : 'error', + json_encode($result), + $url, + $userid + )); + if(!$qry){ + + $errors = array('status' => 'error', 'message' => 'Gagal Insert Ais Transaction Log','query' => $this->db_log->last_query(), 'json' => json_encode($result)); + $this->error_log(array('fn_name' => 'delete_transaction_by_labnumber', 'message' => 'ais_transaction insert', 'query' => $this->db_log->last_query(), 'json' => json_encode($result)), 999); + $this->sys_error($errors); + exit; + } + + if($result['success']){ + $success = array('status' => 'success', 'message' => 'Berhasil Delete Transaction'); + $this->sys_ok($success); + exit; + }else{ + $errors = array('status' => 'error', 'message' => 'Gagal Delete Transaction'); + $this->sys_error($errors); + exit; + } + + + } + + + function monitoring_transaction() + { + if (! $this->isLogin) { + $this->sys_error("Invalid Token"); + exit; + } + + $sql_base = "SELECT + oh.T_OrderHeaderID, + oh.T_OrderHeaderM_PatientID AS patient_id, + p.M_PatientName AS patient_name, + oh.T_OrderHeaderLabNumber AS lab_number, + b.M_BranchCode AS branch_code, + b.M_BranchName AS branch_name, + b.M_BranchCodeLab AS branch_code_lab, + oh.T_OrderHeaderTotal AS total, + at.Ais_TransactionStatus AS Ais_TransactionStatus, + c.CorporateID AS corporate_id, + c.CorporateName AS corporate_name, + ais_pillar_name, + IFNULL(mgm_mcu.Mgm_McuLabel, '') AS mgm_mcu_name, + p.M_PatientNoReg AS noreg, + IF(MAX(at.Ais_TransactionID) IS NULL, 'N', 'Y') AS ais_status, + oh.T_OrderHeaderTotal AS total_amount + FROM t_orderheader oh + JOIN m_patient p ON p.M_PatientID = oh.T_OrderHeaderM_PatientID + JOIN m_branch b ON b.M_BranchID = oh.T_OrderHeaderM_BranchID + LEFT JOIN corporate c ON c.CorporateID = oh.T_OrderHeaderCorporateID + LEFT JOIN mgm_mcu ON mgm_mcu.Mgm_McuID = oh.T_OrderHeaderMgm_McuID + LEFT JOIN corporate_type ON CorporateCorporateTypeID = CorporateTypeID + LEFT JOIN ais_pillar ON CorporateTypeais_pillar_code = ais_pillar_code + LEFT JOIN ".$this->db_log->database.".ais_transaction at + ON at.Ais_TransactionOrderHeaderLabNumber = oh.T_OrderHeaderLabNumber "; + + // Ambil parameter + $start_date = $this->input->get('start_date'); + $end_date = $this->input->get('end_date'); + $ais_status = $this->input->get('ais_status'); + $corporate_id = $this->input->get('corporate_id'); + $lab_number = $this->input->get('lab_number'); + $patient_name = $this->input->get('patient_name'); + + // Pagination + $page = $this->input->get('page') ? intval($this->input->get('page')) : 1; + $limit = 10; + $offset = ($page - 1) * $limit; + + $params = []; + $where_clauses = []; + + if ($start_date && $end_date) { + $where_clauses[] = "( DATE(oh.T_OrderHeaderDate) BETWEEN ? AND ? )"; + $params[] = $start_date; + $params[] = $end_date; + } + + if ($ais_status === 'Y') { + $where_clauses[] = "at.Ais_TransactionID IS NOT NULL"; + } elseif ($ais_status === 'N') { + $where_clauses[] = "at.Ais_TransactionID IS NULL"; + } + + if ($corporate_id) { + $where_clauses[] = "oh.T_OrderHeaderCorporateID = ?"; + $params[] = $corporate_id; + } + + if ($lab_number) { + $where_clauses[] = "oh.T_OrderHeaderLabNumber LIKE ?"; + $params[] = "%$lab_number%"; + } + + if ($patient_name) { + $where_clauses[] = "p.M_PatientName LIKE ?"; + $params[] = "%$patient_name%"; + } + + // Build WHERE + $where_sql = ""; + if (!empty($where_clauses)) { + $where_sql = " WHERE " . implode(" AND ", $where_clauses); + } + + // Count total records for pagination + $count_sql = "SELECT COUNT(DISTINCT oh.T_OrderHeaderID) as total + FROM t_orderheader oh + JOIN m_patient p ON p.M_PatientID = oh.T_OrderHeaderM_PatientID + LEFT JOIN ".$this->db_log->database.".ais_transaction at + ON at.Ais_TransactionOrderHeaderLabNumber = oh.T_OrderHeaderLabNumber + LEFT JOIN corporate c ON c.CorporateID = oh.T_OrderHeaderCorporateID + $where_sql"; + + $qry_count = $this->db_onedev->query($count_sql, $params); + $total = $qry_count->row()->total ?? 0; + + $sql = $sql_base . $where_sql . " + GROUP BY oh.T_OrderHeaderID + LIMIT $limit OFFSET $offset"; + + $qry = $this->db_onedev->query($sql, $params); + //echo $this->db_onedev->last_query(); + + if (!$qry) { + echo json_encode(['status' => 'error', 'message' => 'Gagal mengambil data monitoring.']); + exit; + } + + $data = $qry->result_array(); + + echo json_encode([ + 'status' => 'success', + 'message' => 'Berhasil mengambil data monitoring.', + 'data' => $data, + 'total' => $total, + 'page' => $page, + 'limit' => $limit, + 'total_page' => ceil($total / $limit) + ]); + exit; + } + + function get_corporate() + { + $sql = "SELECT CorporateID, CorporateName, CorporateCode FROM corporate"; + $qry = $this->db_onedev->query($sql); + + if (!$qry) { + $this->error_log(array('fn_name' => 'get_corporate', 'message' => 'select corporate data failed', 'query' => $this->db_onedev->last_query(), 'json' => ''), 999); + $this->output + ->set_status_header(500) + ->set_content_type('application/json') + ->set_output(json_encode(['status' => 'error', 'message' => 'Failed to retrieve corporate data.'])); + return; + } + + $data = $qry->result_array(); + echo json_encode(['status' => 'success', 'message' => 'Successfully retrieved corporate data.', 'data' => $data]); + exit; + } + + function get_json_response() + { + // Get lab_number from the query parameter + $lab_number = $this->input->get('lab_number'); + + if (empty($lab_number)) { + $this->output + ->set_status_header(400) + ->set_content_type('application/json') + ->set_output(json_encode(['status' => 'error', 'message' => 'lab_number parameter is required'])); + return; + } + + $sql = "SELECT + Ais_TransactionOrderHeaderLabNumber AS lab_number, + Ais_TransactionCreated AS transaction_created, + Ais_TransactionJson AS transaction_json, + Ais_TransactionResponse AS transaction_response, + 'N' as show_log + FROM ais_transaction + WHERE Ais_TransactionOrderHeaderLabNumber = ?"; + + $qry = $this->db_log->query($sql, array($lab_number)); + + $results = $qry->row_array(); + $results = $qry->result_array(); + + if ($results) { + // Loop through each result to decode JSON + foreach ($results as &$result) { + $result['transaction_json'] = json_decode($result['transaction_json']); + $result['transaction_response'] = json_decode($result['transaction_response']); + } + unset($result); // Unset reference to avoid side effects + + echo json_encode(['status' => 'success', 'data' => $results]); + } else { + echo json_encode(['status' => 'error', 'message' => 'Data not found for the given lab number.']); + } + exit; + } +} diff --git a/application/controllers/mockup/fo/cashiernewpayment-cpone-v3/Patient.php b/application/controllers/mockup/fo/cashiernewpayment-cpone-v3/Patient.php index 1b1053f..c7e203a 100644 --- a/application/controllers/mockup/fo/cashiernewpayment-cpone-v3/Patient.php +++ b/application/controllers/mockup/fo/cashiernewpayment-cpone-v3/Patient.php @@ -1,21 +1,22 @@ db_onedev = $this->load->database("onedev", true); - } - - public function add_notes($orderid){ - $sql = " SELECT F_PaymentT_OrderHeaderID as note_order_id, + var $db_onedev; + public function index() + { + echo "Patient API"; + } + public function __construct() + { + parent::__construct(); + $this->db_onedev = $this->load->database("onedev", true); + } + + public function add_notes($orderid) + { + $sql = " SELECT F_PaymentT_OrderHeaderID as note_order_id, F_PaymentID as note_id, - F_PaymentDate as note_date, + DATE_FORMAT(F_PaymentDate,'%d-%m-%Y') as note_date, F_PaymentNumber as note_number, GROUP_CONCAT(M_PaymentTypeName separator ' , ') as paymenttypes_name, MAX(F_PaymentTotal) as note_amount, @@ -33,19 +34,18 @@ class Patient extends MY_Controller if ($query) { $rows = $query->result_array(); return $rows; - } else { $this->sys_error_db("get notes", $this->db_onedev); exit; - } - } + } + } - public function search() - { - if (! $this->isLogin) { + public function search() + { + if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; - } + } $prm = $this->sys_input; $startdate = $prm['startdate']; @@ -53,26 +53,28 @@ class Patient extends MY_Controller $search = $prm["search"]; $status = $prm["status"]; $company = $prm["company"]; + $userid = $this->sys_user["M_UserID"]; $filter_company = ''; - if($company != '0' || $company != 0) + if ($company != '0' || $company != 0) $filter_company = " AND CorporateID = {$company}"; - + $number_limit = 10; - $number_offset = ($prm['current_page'] - 1) * $number_limit ; + $number_offset = ($prm['current_page'] - 1) * $number_limit; $where = " ( DATE(T_OrderHeaderDate) = '{$startdate}' ) AND "; - if($search != ''){ + if ($search != '') { $where = "( M_PatientName LIKE '%{$search}%' OR T_OrderHeaderLabNumber LIKE '%{$search}%' ) AND "; - if(strlen($search) == 10){ + if (strlen($search) == 10) { $where = "T_OrderHeaderLabNumber = '{$search}' AND "; } } - $sql = "SELECT count(*) as total + $sql = "SELECT count(*) as total FROM t_orderheader - left join f_bill_detail on F_BillDetailT_OrderHeaderID = T_OrderHeaderID and F_BillDetailIsActive = 'Y' + JOIN m_user ON M_UserID = {$userid} AND T_OrderHeaderM_BranchID = M_UserLoginM_BranchID AND M_UserIsActive = 'Y' JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN m_title ON M_PatientM_TitleID = M_TitleID JOIN corporate ON T_OrderHeaderCorporateID = CorporateID $filter_company + left join f_bill_detail on F_BillDetailT_OrderHeaderID = T_OrderHeaderID and F_BillDetailIsActive = 'Y' LEFT JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID LEFT JOIN last_statuspayment ON Last_StatusPaymentT_OrderHeaderID = T_OrderHeaderID AND Last_StatusPaymentIsActive = 'Y' LEFT JOIN x_wa_outbox @@ -83,18 +85,18 @@ class Patient extends MY_Controller ( ('{$status}' = 'N' AND (Last_StatusPaymentIsLunas = 'N' OR Last_StatusPaymentID IS NULL)) OR ('{$status}' = 'Y' AND Last_StatusPaymentIsLunas = 'Y') ) and F_BillDetailID is null"; $query = $this->db_onedev->query($sql); - + $tot_count = 0; $tot_page = 0; if ($query) { $tot_count = $query->result_array()[0]["total"]; - $tot_page = ceil($tot_count/$number_limit); + $tot_page = ceil($tot_count / $number_limit); } else { $this->sys_error_db("t_samplestorage count", $this->db_onedev); exit; - } - - + } + + $sql = "SELECT t_orderheader.*, M_PatientNoReg, DATE_FORMAT(T_OrderHeaderDate,'%d-%m-%Y %H:%i') as order_date, @@ -118,10 +120,11 @@ class Patient extends MY_Controller IFNULL(XWaOutboxIsSent,'') as XWaOutboxIsSent, IFNULL(XWaOutboxRetry,0) as XWaOutboxRetry FROM t_orderheader - left join f_bill_detail on F_BillDetailT_OrderHeaderID = T_OrderHeaderID and F_BillDetailIsActive = 'Y' + JOIN m_user ON M_UserID = {$userid} AND T_OrderHeaderM_BranchID = M_UserLoginM_BranchID AND M_UserIsActive = 'Y' JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN m_title ON M_PatientM_TitleID = M_TitleID JOIN corporate ON T_OrderHeaderCorporateID = CorporateID $filter_company + left join f_bill_detail on F_BillDetailT_OrderHeaderID = T_OrderHeaderID and F_BillDetailIsActive = 'Y' LEFT JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID LEFT JOIN last_statuspayment ON Last_StatusPaymentT_OrderHeaderID = T_OrderHeaderID AND Last_StatusPaymentIsActive = 'Y' LEFT JOIN x_wa_outbox @@ -135,9 +138,10 @@ class Patient extends MY_Controller limit $number_limit offset $number_offset"; //echo $sql; $query = $this->db_onedev->query($sql, $sql_param); + //echo $this->db_onedev->last_query(); $rows = $query->result_array(); - if($rows){ - foreach($rows as $k => $v){ + if ($rows) { + foreach ($rows as $k => $v) { $rows[$k]['notes'] = $this->add_notes($v['T_OrderHeaderID']); } } @@ -145,59 +149,58 @@ class Patient extends MY_Controller $sql = "SELECT * FROM `s_menu` WHERE `S_MenuName` = 'Registration (Walk In)' AND `S_MenuIsActive` = 'Y' ORDER BY `S_MenuID` DESC LIMIT 1"; $query = $this->db_onedev->query($sql); $menu = $query->row_array(); - if($menu){ + if ($menu) { $menu_url = $menu['S_MenuUrl']; } - - $result = array("total" => $tot_page, "records" => $rows, "sql"=> $this->db_onedev->last_query(), "menu_url" => $menu_url); + + $result = array("total" => $tot_page, "records" => $rows, "sql" => $this->db_onedev->last_query(), "menu_url" => $menu_url); $this->sys_ok($result); exit; - } + } - - - function searchcompany(){ + + + function searchcompany() + { if (! $this->isLogin) { - $this->sys_error("Invalid Token"); - exit; - } + $this->sys_error("Invalid Token"); + exit; + } $prm = $this->sys_input; $max_rst = 12; - $tot_count =0; + $tot_count = 0; $filter_date = ''; - if(isset($prm['xdate'])) - $filter_date = " JOIN t_orderheader ON T_OrderHeaderCorporateID = CorporateID AND DATE(T_OrderHeaderDate) = '{$prm['xdate']}' AND T_OrderHeaderIsActive = 'Y' "; + if (isset($prm['xdate'])) + $filter_date = " JOIN t_orderheader ON T_OrderHeaderCorporateID = CorporateID AND DATE(T_OrderHeaderDate) = '{$prm['xdate']}' AND T_OrderHeaderIsActive = 'Y' "; $q = [ 'search' => '%' ]; - if ($prm['search'] != '' ) - { - if($prm['search'] == 'Semua') - $prm['search'] = ""; + if ($prm['search'] != '') { + if ($prm['search'] == 'Semua') + $prm['search'] = ""; - $q['search'] = "%{$prm['search']}%"; + $q['search'] = "%{$prm['search']}%"; } - // QUERY TOTAL + // QUERY TOTAL $sql = "SELECT count(*) as total FROM corporate WHERE CorporateName like ? AND CorporateIsActive = 'Y'"; - $query = $this->db_onedev->query($sql,$q['search']); + $query = $this->db_onedev->query($sql, $q['search']); //echo $query; - if ($query) { - $tot_count = $query->result_array()[0]["total"]; - } - else { - $this->sys_error_db("m_city count",$this->db_onedev); + if ($query) { + $tot_count = $query->result_array()[0]["total"]; + } else { + $this->sys_error_db("m_city count", $this->db_onedev); exit; } - $rows = array('id'=>0,'name'=>'Semua'); + $rows = array('id' => 0, 'name' => 'Semua'); $sql = " SELECT CorporateID as id, CorporateName as name FROM corporate @@ -207,19 +210,17 @@ class Patient extends MY_Controller AND CorporateIsActive = 'Y' ORDER BY CorporateName DESC "; - $query = $this->db_onedev->query($sql, array($q['search'])); + $query = $this->db_onedev->query($sql, array($q['search'])); // echo $this->db_onedev->last_query(); - if ($query) { - $rows = $query->result_array(); - array_push($rows,array('id'=>0,'name'=>'Semua')); - //echo $this->db_onedev->last_query(); - $result = array("total" => $tot_count, "records" => $rows, "total_display" => sizeof($rows)); - $this->sys_ok($result); - } - else { - $this->sys_error_db("corporate rows",$this->db_onedev); - exit; - } + if ($query) { + $rows = $query->result_array(); + array_push($rows, array('id' => 0, 'name' => 'Semua')); + //echo $this->db_onedev->last_query(); + $result = array("total" => $tot_count, "records" => $rows, "total_display" => sizeof($rows)); + $this->sys_ok($result); + } else { + $this->sys_error_db("corporate rows", $this->db_onedev); + exit; + } } - } diff --git a/application/controllers/mockup/fo/cashiernewpayment-cpone-v3/Patient.php--150526 b/application/controllers/mockup/fo/cashiernewpayment-cpone-v3/Patient.php--150526 new file mode 100644 index 0000000..1b1053f --- /dev/null +++ b/application/controllers/mockup/fo/cashiernewpayment-cpone-v3/Patient.php--150526 @@ -0,0 +1,225 @@ +db_onedev = $this->load->database("onedev", true); + } + + public function add_notes($orderid){ + $sql = " SELECT F_PaymentT_OrderHeaderID as note_order_id, + F_PaymentID as note_id, + F_PaymentDate as note_date, + F_PaymentNumber as note_number, + GROUP_CONCAT(M_PaymentTypeName separator ' , ') as paymenttypes_name, + MAX(F_PaymentTotal) as note_amount, + M_StaffName as note_user, + F_PaymentDetailIsActive as note_active + FROM f_payment + JOIN f_paymentdetail ON F_PaymentDetailF_PaymentID = F_PaymentID + JOIN m_paymenttype ON F_PaymentDetailM_PaymentTypeID = M_PaymentTypeID + LEFT JOIN m_user ON F_PaymentDetailUserID = M_UserID + LEFT JOIN m_staff ON M_UserM_StaffID = M_StaffID + WHERE + F_PaymentT_OrderHeaderID = {$orderid} + GROUP BY F_PaymentID"; + $query = $this->db_onedev->query($sql); + if ($query) { + $rows = $query->result_array(); + return $rows; + + } else { + $this->sys_error_db("get notes", $this->db_onedev); + exit; + } + } + + public function search() + { + if (! $this->isLogin) { + $this->sys_error("Invalid Token"); + exit; + } + + $prm = $this->sys_input; + $startdate = $prm['startdate']; + $enddate = $prm['enddate'] . " 23:59:59"; + $search = $prm["search"]; + $status = $prm["status"]; + $company = $prm["company"]; + $filter_company = ''; + if($company != '0' || $company != 0) + $filter_company = " AND CorporateID = {$company}"; + + $number_limit = 10; + $number_offset = ($prm['current_page'] - 1) * $number_limit ; + $where = " ( DATE(T_OrderHeaderDate) = '{$startdate}' ) AND "; + if($search != ''){ + $where = "( M_PatientName LIKE '%{$search}%' OR T_OrderHeaderLabNumber LIKE '%{$search}%' ) AND "; + if(strlen($search) == 10){ + $where = "T_OrderHeaderLabNumber = '{$search}' AND "; + } + } + + $sql = "SELECT count(*) as total + FROM t_orderheader + left join f_bill_detail on F_BillDetailT_OrderHeaderID = T_OrderHeaderID and F_BillDetailIsActive = 'Y' + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID + JOIN m_title ON M_PatientM_TitleID = M_TitleID + JOIN corporate ON T_OrderHeaderCorporateID = CorporateID $filter_company + LEFT JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID + LEFT JOIN last_statuspayment ON Last_StatusPaymentT_OrderHeaderID = T_OrderHeaderID AND Last_StatusPaymentIsActive = 'Y' + LEFT JOIN x_wa_outbox + ON T_OrderHeaderID = XWaOutboxRefID + AND XWaOutboxIsActive = 'Y' + WHERE T_OrderHeaderIsActive = 'Y' AND + $where + ( ('{$status}' = 'N' AND (Last_StatusPaymentIsLunas = 'N' OR Last_StatusPaymentID IS NULL)) OR ('{$status}' = 'Y' AND Last_StatusPaymentIsLunas = 'Y') ) and F_BillDetailID is null"; + + $query = $this->db_onedev->query($sql); + + $tot_count = 0; + $tot_page = 0; + if ($query) { + $tot_count = $query->result_array()[0]["total"]; + $tot_page = ceil($tot_count/$number_limit); + } else { + $this->sys_error_db("t_samplestorage count", $this->db_onedev); + exit; + } + + + $sql = "SELECT t_orderheader.*, + M_PatientNoReg, + DATE_FORMAT(T_OrderHeaderDate,'%d-%m-%Y %H:%i') as order_date, + CONCAT(M_TitleName,'. ',M_PatientName) as M_PatientName, + M_PatientName as M_PatientName_eng, + M_TitleName, + CorporateName as M_CompanyName, + CorporateName as CorporateName, + Mgm_McuLabel as M_MouName, + Mgm_McuLabel, + IFNULL(Last_StatusPaymentBillTotal, T_OrderHeaderTotal) as totalbill, + IFNULL(Last_StatusPaymentPaid,0) as paid, + (IFNULL(Last_StatusPaymentBillTotal, T_OrderHeaderTotal) - IFNULL(Last_StatusPaymentPaid,0)) as unpaid, + Last_StatusPaymentIsLunas as flaglunas, + '' as notes, + 0 as mindp_percent, + 0 as mindp_amount, + F_BillDetailID, + IFNULL(M_PatientHp,'') as M_PatientHp, + IFNULL(M_PatientID,0) as M_PatientID, + IFNULL(XWaOutboxIsSent,'') as XWaOutboxIsSent, + IFNULL(XWaOutboxRetry,0) as XWaOutboxRetry + FROM t_orderheader + left join f_bill_detail on F_BillDetailT_OrderHeaderID = T_OrderHeaderID and F_BillDetailIsActive = 'Y' + JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID + JOIN m_title ON M_PatientM_TitleID = M_TitleID + JOIN corporate ON T_OrderHeaderCorporateID = CorporateID $filter_company + LEFT JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID + LEFT JOIN last_statuspayment ON Last_StatusPaymentT_OrderHeaderID = T_OrderHeaderID AND Last_StatusPaymentIsActive = 'Y' + LEFT JOIN x_wa_outbox + ON T_OrderHeaderID = XWaOutboxRefID + AND XWaOutboxIsActive = 'Y' + AND XWaOutboxType = 'KWITANSI' + WHERE T_OrderHeaderIsActive = 'Y' AND + $where + ( ('{$status}' = 'N' AND (Last_StatusPaymentIsLunas = 'N' OR Last_StatusPaymentID IS NULL)) OR ('{$status}' = 'Y' AND Last_StatusPaymentIsLunas = 'Y') ) and F_BillDetailID is null + ORDER BY T_OrderHeaderID ASC + limit $number_limit offset $number_offset"; + //echo $sql; + $query = $this->db_onedev->query($sql, $sql_param); + $rows = $query->result_array(); + if($rows){ + foreach($rows as $k => $v){ + $rows[$k]['notes'] = $this->add_notes($v['T_OrderHeaderID']); + } + } + + $sql = "SELECT * FROM `s_menu` WHERE `S_MenuName` = 'Registration (Walk In)' AND `S_MenuIsActive` = 'Y' ORDER BY `S_MenuID` DESC LIMIT 1"; + $query = $this->db_onedev->query($sql); + $menu = $query->row_array(); + if($menu){ + $menu_url = $menu['S_MenuUrl']; + } + + + $result = array("total" => $tot_page, "records" => $rows, "sql"=> $this->db_onedev->last_query(), "menu_url" => $menu_url); + $this->sys_ok($result); + exit; + } + + + + function searchcompany(){ + if (! $this->isLogin) { + $this->sys_error("Invalid Token"); + exit; + } + $prm = $this->sys_input; + + $max_rst = 12; + $tot_count =0; + $filter_date = ''; + if(isset($prm['xdate'])) + $filter_date = " JOIN t_orderheader ON T_OrderHeaderCorporateID = CorporateID AND DATE(T_OrderHeaderDate) = '{$prm['xdate']}' AND T_OrderHeaderIsActive = 'Y' "; + + $q = [ + 'search' => '%' + ]; + + if ($prm['search'] != '' ) + { + if($prm['search'] == 'Semua') + $prm['search'] = ""; + + $q['search'] = "%{$prm['search']}%"; + } + + // QUERY TOTAL + $sql = "SELECT count(*) as total + FROM corporate + WHERE + CorporateName like ? + AND CorporateIsActive = 'Y'"; + $query = $this->db_onedev->query($sql,$q['search']); + //echo $query; + if ($query) { + $tot_count = $query->result_array()[0]["total"]; + } + else { + $this->sys_error_db("m_city count",$this->db_onedev); + exit; + } + $rows = array('id'=>0,'name'=>'Semua'); + $sql = " + SELECT CorporateID as id, CorporateName as name + FROM corporate + $filter_date + WHERE + CorporateName like ? + AND CorporateIsActive = 'Y' + ORDER BY CorporateName DESC + "; + $query = $this->db_onedev->query($sql, array($q['search'])); + // echo $this->db_onedev->last_query(); + if ($query) { + $rows = $query->result_array(); + array_push($rows,array('id'=>0,'name'=>'Semua')); + //echo $this->db_onedev->last_query(); + $result = array("total" => $tot_count, "records" => $rows, "total_display" => sizeof($rows)); + $this->sys_ok($result); + } + else { + $this->sys_error_db("corporate rows",$this->db_onedev); + exit; + } + } + +} diff --git a/application/controllers/mockup/fo/cashiernewpayment-cpone-v3/Payment.php b/application/controllers/mockup/fo/cashiernewpayment-cpone-v3/Payment.php index 678244d..215a31f 100644 --- a/application/controllers/mockup/fo/cashiernewpayment-cpone-v3/Payment.php +++ b/application/controllers/mockup/fo/cashiernewpayment-cpone-v3/Payment.php @@ -2,12 +2,12 @@ class Payment extends MY_Controller { - var $db_onedev; + var $db_onedev; public function index() { echo "API"; } - + public function __construct() { parent::__construct(); @@ -16,22 +16,22 @@ class Payment extends MY_Controller /** ** FUNCTIONS FITUR KIRIM WA KWITANSI START HERE - */ + */ public function kirim_bukti_tx_via_wa() { try { - + if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $this->db_onedev->trans_begin(); - $prm = $this->sys_input; + $prm = $this->sys_input; $url = isset($prm['urlX']) ? $prm['urlX'] : ""; - $concat_PID = "&PID="; + $concat_PID = "&PID="; $T_OrderHeaderID = isset($prm['T_OrderHeaderID']) ? $prm['T_OrderHeaderID'] : 0; $M_PatientHp = isset($prm['M_PatientHp']) ? $prm['M_PatientHp'] : ""; @@ -47,10 +47,10 @@ class Payment extends MY_Controller LIMIT 1"; $qpid = $this->db_onedev->query($sql_pid, [$T_OrderHeaderID]); - if(!$qpid || !$qpid->row_array()){ + if (!$qpid || !$qpid->row_array()) { $this->db_onedev->trans_rollback(); $this->sys_error_db("error select f_payment", $this->db_onedev); - exit; + exit; } $PID = $qpid->row_array()['F_PaymentID']; @@ -63,12 +63,12 @@ class Payment extends MY_Controller $XWaOutboxSubject = "Kwitansi WA"; $XWaOutboxRecipientsNumber = $M_PatientHp; $XWaOutboxRecipientsM_PatientID = $M_PatientID; - $XWaOutboxResultFileName = "kwitansi_".$T_OrderHeaderLabNumber.".pdf"; + $XWaOutboxResultFileName = "kwitansi_" . $T_OrderHeaderLabNumber . ".pdf"; $XWaOutboxRefID = $T_OrderHeaderID; $XWaOutboxBody = ""; - $XWaOutboxLocalUrl= $urlPrint; + $XWaOutboxLocalUrl = $urlPrint; $XWaOutboxType = "KWITANSI"; // Kalau sudah pernah di kirim jangan di INSERT lagi @@ -100,7 +100,7 @@ class Payment extends MY_Controller XWaOutboxLastUpdated = NOW(), XWaOutboxIsSent = ? WHERE XWaOutboxID = ?"; - + $qinsert = $this->db_onedev->query($s_update, array( $XWaOutboxSubject, $XWaOutboxRecipientsNumber, @@ -114,7 +114,7 @@ class Payment extends MY_Controller 'N', // XWaOutboxIsSent $existing_record->XWaOutboxID )); - if(!$qinsert){ + if (!$qinsert) { $this->db_onedev->trans_rollback(); $this->sys_error_db("error update wa outbox", $this->db_onedev); exit; @@ -144,7 +144,7 @@ class Payment extends MY_Controller $XWaOutboxType, $XWaOutboxRefID ]); - if(!$qinsert){ + if (!$qinsert) { $this->db_onedev->trans_rollback(); $this->sys_error_db("error insert wa outbox", $this->db_onedev); exit; @@ -152,21 +152,21 @@ class Payment extends MY_Controller } $this->db_onedev->trans_commit(); - - $result = array( + + $result = array( "message" => "Sukses Proses Insert Data", "sql" => $this->db_onedev->last_query() - ); - - $this->sys_ok($result); + ); + $this->sys_ok($result); } catch (Exception $exc) { - $this->sys_error($exc->getMessage()); - } + $this->sys_error($exc->getMessage()); + } } - + // * List Outbox yang mau dikirim - public function listOutbox(){ + public function listOutbox() + { try { $prm = $this->sys_input; $status = $prm["statusOutbox"]; @@ -221,7 +221,6 @@ class Payment extends MY_Controller $result = $query->result_array(); $this->sys_ok($result); - } catch (Exception $e) { $msg = $e->getMessage(); $this->sys_error($msg); @@ -230,141 +229,142 @@ class Payment extends MY_Controller } // ** Upload File Kwitansi dari Birt ke CDN Qontak - public function uploadFile(){ + public function uploadFile() + { try { - $url = "https://service-chat.qontak.com/api/open/v1/file_uploader"; - $fileName = $this->sys_input["fileName"]; - $rpt_url_raw = $this->sys_input["rptUrl"]; - $mimeType = $this->sys_input["mime"]; //application/pdf + $url = "https://service-chat.qontak.com/api/open/v1/file_uploader"; + $fileName = $this->sys_input["fileName"]; + $rpt_url_raw = $this->sys_input["rptUrl"]; + $mimeType = $this->sys_input["mime"]; //application/pdf + - // Breakdown rpt_url_raw ke scheme:https, host:devcpone, path:/birt/run, query:__report=...dst $url_parts = parse_url($rpt_url_raw); - + // Base url $base_url = $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path']; - + // Parse query ke array $query_params = []; if (isset($url_parts['query'])) { parse_str($url_parts['query'], $query_params); } - + // Encode setiap query url dari array agar jadi url valid. Misal ada spasi atau escape character $encoded_url = $base_url . '?' . http_build_query($query_params); $fileContents = file_get_contents($encoded_url); - + $this->db_onedev->trans_start(); // Jika file tidak ditemukan atau kosong - if ($fileContents === false || strlen($fileContents) === 0) { - // Return an error or handle it as needed - $resp = "Error: Gagal upload file ke CDN karena file local kosong atau tidak bisa diakses. Cek file di URL File Local: " . $rpt_url; - + if ($fileContents === false || strlen($fileContents) === 0) { + // Return an error or handle it as needed + $resp = "Error: Gagal upload file ke CDN karena file local kosong atau tidak bisa diakses. Cek file di URL File Local: " . $rpt_url; + $sql = "UPDATE x_wa_outbox SET XWaOutboxLastUpdated = NOW(), XWaOutboxJsonQontak = ? WHERE XWaOutboxLocalUrl = ? "; - $query = $this->db_onedev->query($sql, [$resp, $rpt_url]); - if (!$query) { - $message = $this->db_onedev->error(); - $message['qry'] = $this->db_onedev->last_query(); - $this->sys_error([ - "msg" => "Error change JSONQontak when upload file", - "error" => $message - ]); + $query = $this->db_onedev->query($sql, [$resp, $rpt_url]); + if (!$query) { + $message = $this->db_onedev->error(); + $message['qry'] = $this->db_onedev->last_query(); + $this->sys_error([ + "msg" => "Error change JSONQontak when upload file", + "error" => $message + ]); $this->db_onedev->trans_rollback(); - exit; - } + exit; + } $this->db_onedev->trans_complete(); - $this->sys_error($resp); - exit; - } + $this->sys_error($resp); + exit; + } - $boundary = uniqid(); + $boundary = uniqid(); - $body = "--$boundary\r\n" . - "Content-Disposition: form-data; name=\"file\"; filename=\"$fileName\"\r\n" . - "Content-Type: $mimeType\r\n\r\n" . - $fileContents . "\r\n" . - "--$boundary--\r\n"; + $body = "--$boundary\r\n" . + "Content-Disposition: form-data; name=\"file\"; filename=\"$fileName\"\r\n" . + "Content-Type: $mimeType\r\n\r\n" . + $fileContents . "\r\n" . + "--$boundary--\r\n"; // TODO: Need to be refactor to differentiate between Kwitansi dan Result WA - $query = "SELECT * FROM x_qontak_api + $query = "SELECT * FROM x_qontak_api WHERE XQontakApiType = 'KWITANSI' ORDER BY XQontakApiLastUpdated DESC LIMIT 1"; - $configwa = $this->db_onedev->query($query)->result_array(); - $token = $configwa[0]["XQontakApiToken"]; + $configwa = $this->db_onedev->query($query)->result_array(); + $token = $configwa[0]["XQontakApiToken"]; - // Set cURL options - $curl = curl_init(); - curl_setopt_array($curl, [ - CURLOPT_URL => $url, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_POST => true, - CURLOPT_HTTPHEADER => [ - "Authorization: Bearer {$token}", - "Content-Type: multipart/form-data; boundary=$boundary" - ], - CURLOPT_POSTFIELDS => $body - ]); + // Set cURL options + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POST => true, + CURLOPT_HTTPHEADER => [ + "Authorization: Bearer {$token}", + "Content-Type: multipart/form-data; boundary=$boundary" + ], + CURLOPT_POSTFIELDS => $body + ]); - $response = curl_exec($curl); - $error = curl_error($curl); + $response = curl_exec($curl); + $error = curl_error($curl); - curl_close($curl); - $respArray = json_decode($response, true); + curl_close($curl); + $respArray = json_decode($response, true); - if ($respArray['status'] == "success") { - // Check if decoding was successful and access the "url" - if (isset($respArray['data']['url'])) { - $url = $respArray['data']['url']; + if ($respArray['status'] == "success") { + // Check if decoding was successful and access the "url" + if (isset($respArray['data']['url'])) { + $url = $respArray['data']['url']; - $sql = "UPDATE x_wa_outbox SET + $sql = "UPDATE x_wa_outbox SET XWaOutboxCdnUrl = ?, XWaOutboxLastUpdated = NOW() WHERE XWaOutboxID = ? "; - $query = $this->db_onedev->query($sql, [$url, $this->sys_input["XWaOutboxID"]]); - if (!$query) { - $message = json_encode($this->db_onedev->error()); - throw new Exception("Error updating CDN URL: " . $message); - } - $this->sys_ok([ - "msg" => "Berhasil upload file dan update CDN", - "url" => $url - ]); - } else { + $query = $this->db_onedev->query($sql, [$url, $this->sys_input["XWaOutboxID"]]); + if (!$query) { + $message = json_encode($this->db_onedev->error()); + throw new Exception("Error updating CDN URL: " . $message); + } + $this->sys_ok([ + "msg" => "Berhasil upload file dan update CDN", + "url" => $url + ]); + } else { throw new Exception("URL not found in response."); - } - } - if ($error) { - $err = json_encode(["status" => "ERR", "message" => $error]); - throw new Exception("cURL Error: " . $err); - } + } + } + if ($error) { + $err = json_encode(["status" => "ERR", "message" => $error]); + throw new Exception("cURL Error: " . $err); + } $this->db_onedev->trans_complete(); - - } catch (Exception $e) { - $msg = $e->getMessage(); + } catch (Exception $e) { + $msg = $e->getMessage(); $this->db_onedev->trans_rollback(); $this->sys_error($msg); exit; - } + } } // * Send WA Msg Using Qontak - public function qontakSendMsg(){ + public function qontakSendMsg() + { try { $url = "https://service-chat.qontak.com/api/open/v1/broadcasts/whatsapp/direct"; $query = "SELECT * FROM x_qontak_api WHERE XQontakApiType = 'KWITANSI' ORDER BY XQontakApiLastUpdated DESC LIMIT 1"; - + $configwa = $this->db_onedev->query($query)->result_array(); if (!$configwa) { $err = json_encode($this->db_onedev->error()); @@ -451,7 +451,7 @@ class Payment extends MY_Controller ]; $json_param = json_encode($param); - + $curl = curl_init(); curl_setopt_array($curl, array( @@ -473,7 +473,7 @@ class Payment extends MY_Controller $response = curl_exec($curl); $error = curl_error($curl); curl_close($curl); - + $respArray = json_decode($response, true); if ($respArray['status'] == "success") { @@ -521,18 +521,19 @@ class Payment extends MY_Controller } $this->sys_error($respArray); } - }catch (Exception $e) { + } catch (Exception $e) { $msg = $e->getMessage(); // $this->db_onedev->trans_rollback(); // tidak perlu transaction karena hanya 1 update $this->sys_error($msg); exit; - } + } } - public function changeStatusOutbox(){ + public function changeStatusOutbox() + { try { $this->db_onedev->trans_start(); - + $prm = $this->sys_input; $sql = "UPDATE x_wa_outbox @@ -542,7 +543,7 @@ class Payment extends MY_Controller WHERE XWaOutboxID = ? "; $query = $this->db_onedev->query($sql, [$prm["toStatus"], $prm["retry"], $prm["XWaOutboxID"]]); - + if (!$query) { $msg = $this->db_onedev->error(); throw new Exception($msg); @@ -560,14 +561,14 @@ class Payment extends MY_Controller /** ** FUNCTIONS FITUR KIRIM WA KWITANSI END HERE - */ + */ function getlanguages() { - //# cek token valid - if (! $this->isLogin) { + //# cek token valid + if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; - } + } $query = "SELECT Nat_LangID as id, Nat_LangCode as code, Nat_LangName as name @@ -576,7 +577,7 @@ class Payment extends MY_Controller $this->sys_ok($rows); exit; } - + function lookup_type() { //# cek token valid @@ -592,6 +593,7 @@ class Payment extends MY_Controller '' as selected_card, '' as selected_edc, '' as selected_account, + '' as selected_promo, CASE WHEN M_PaymentTypeCode = 'CASH' THEN 'Kembali' WHEN M_PaymentTypeCode = 'DEBIT' THEN 'Nomor Kartu' @@ -607,51 +609,52 @@ class Payment extends MY_Controller FROM m_paymenttype WHERE M_PaymentTypeIsActive = 'Y'"; $rows = $this->db_onedev->query($query)->result_array(); - foreach($rows as $k => $v){ - $rows[$k]['selected_card'] = array('id'=>0,'name'=>''); - $rows[$k]['selected_edc'] = array('id'=>0,'name'=>''); - if($v['chex'] == 'N') + foreach ($rows as $k => $v) { + $rows[$k]['selected_card'] = array('id' => 0, 'name' => ''); + $rows[$k]['selected_edc'] = array('id' => 0, 'name' => ''); + $rows[$k]['selected_promo'] = array('id' => 0, 'name' => '', 'type' => '', 'value' => 0); + if ($v['chex'] == 'N') $rows[$k]['chex'] = false; else $rows[$k]['chex'] = true; } $result = array( - "total" => count($rows) , - "records" => $rows, - ); + "total" => count($rows), + "records" => $rows, + ); $this->sys_ok($result); exit; } - + function lookup_banks() { - //# cek token valid - if (! $this->isLogin) { + //# cek token valid + if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; - } + } $query = "SELECT Nat_BankID as id, Nat_BankCode as name FROM nat_bank WHERE Nat_BankIsActive = 'Y' ORDER BY Nat_BankCode DESC"; $rows = $this->db_onedev->query($query)->result_array(); - + $result = array( - "total" => count($rows) , - "records" => $rows, - ); + "total" => count($rows), + "records" => $rows, + ); $this->sys_ok($result); exit; } - + function lookup_accounts() { - //# cek token valid - if (! $this->isLogin) { + //# cek token valid + if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; - } + } $query = "SELECT M_BankAccountID as id, CONCAT(Nat_BankCode,' (',M_BankAccountNo,')') as name FROM m_bank_account JOIN nat_bank ON M_BankAccountNat_BankID = Nat_BankID @@ -659,16 +662,56 @@ class Payment extends MY_Controller M_BankAccountIsActive = 'Y' ORDER BY Nat_BankCode DESC"; $rows = $this->db_onedev->query($query)->result_array(); - + $result = array( - "total" => count($rows) , - "records" => $rows, - ); + "total" => count($rows), + "records" => $rows, + ); $this->sys_ok($result); exit; } - function searchcard(){ + function lookup_promos() + { + //# cek token valid + if (! $this->isLogin) { + $this->sys_error("Invalid Token"); + exit; + } + $prm = $this->sys_input; + $bank_id = $prm['bank_id']; + $query = "SELECT DISTINCT + M_PromoID as id, + M_PromoName as name, + M_PromoDiscountType as type, + M_PromoValue as value + FROM m_promo + JOIN m_promo_bank ON M_PromoBankM_PromoID = M_PromoID + WHERE + M_PromoIsActive = 'Y' + AND M_PromoBankIsActive = 'Y' + AND M_PromoBankNat_BankID = ? + AND CURDATE() BETWEEN M_PromoStartDate AND M_PromoEndDate + ORDER BY M_PromoName DESC"; + $qry = $this->db_onedev->query($query, array($bank_id)); + if (!$qry) { + $this->sys_error_db("List Promo", $this->db_onedev); + exit; + } + $rows = $qry->result_array(); + + + + $result = array( + "total" => count($rows), + "records" => $rows, + ); + $this->sys_ok($result); + exit; + } + + function searchcard() + { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; @@ -676,19 +719,18 @@ class Payment extends MY_Controller $prm = $this->sys_input; $max_rst = 12; - $tot_count =0; + $tot_count = 0; $q = [ 'search' => '%' ]; - if ($prm['search'] != '') - { + if ($prm['search'] != '') { $q['search'] = "%{$prm['search']}%"; } // QUERY TOTAL - if($prm['search'] != ''){ + if ($prm['search'] != '') { $sql = " SELECT count(*) as total FROM nat_bank @@ -697,8 +739,7 @@ class Payment extends MY_Controller AND Nat_BankIsActive = 'Y' ORDER BY Nat_BankName DESC "; - } - else{ + } else { $sql = " SELECT count(*) as total FROM nat_bank @@ -707,16 +748,15 @@ class Payment extends MY_Controller ORDER BY Nat_BankName DESC "; } - $query = $this->db_onedev->query($sql,$q['search']); + $query = $this->db_onedev->query($sql, $q['search']); //echo $query; if ($query) { $tot_count = $query->result_array()[0]["total"]; - } - else { - $this->sys_error_db("m_city count",$this->db_onedev); + } else { + $this->sys_error_db("m_city count", $this->db_onedev); exit; } - if($prm['search'] != ''){ + if ($prm['search'] != '') { $sql = " SELECT Nat_BankID as id, Nat_BankName as name FROM nat_bank @@ -725,8 +765,7 @@ class Payment extends MY_Controller AND Nat_BankIsActive = 'Y' ORDER BY Nat_BankName DESC "; - } - else{ + } else { $sql = " SELECT Nat_BankID as id, Nat_BankName as name FROM nat_bank @@ -735,7 +774,7 @@ class Payment extends MY_Controller ORDER BY Nat_BankName DESC "; } - + $query = $this->db_onedev->query($sql, array($q['search'])); if ($query) { @@ -743,9 +782,8 @@ class Payment extends MY_Controller //echo $this->db_onedev->last_query(); $result = array("total" => $tot_count, "records" => $rows, "total_display" => sizeof($rows)); $this->sys_ok($result); - } - else { - $this->sys_error_db("m_city rows",$this->db_onedev); + } else { + $this->sys_error_db("m_city rows", $this->db_onedev); exit; } } @@ -832,14 +870,8 @@ class Payment extends MY_Controller $paid_before = (int)($rowPaidBefore['total_paid'] ?? 0); - $remaining_before_tx = $bill_total - $paid_before; - if ($remaining_before_tx < 0) $remaining_before_tx = 0; - - if ($remaining_before_tx === 0) { - throw new Exception("Tagihan sudah lunas / 0. Tidak bisa bayar lagi."); - } - $requested_paid = 0; + $promo_bill_total = null; foreach ($payments as $v) { if (empty($v['chex'])) continue; @@ -860,17 +892,21 @@ class Payment extends MY_Controller } else { $requested_paid += $left; } + + if ($code === 'PROMO') { + $promo_bill_total = $left; + } } - if ($requested_paid <= 0) { - throw new Exception("Nominal pembayaran 0 / tidak valid."); + if ($promo_bill_total !== null) { + $bill_total = (int)$promo_bill_total; } + $remaining_before_tx = $bill_total - $paid_before; + if ($remaining_before_tx < 0) $remaining_before_tx = 0; + $paid_to_record = min($requested_paid, $remaining_before_tx); - if ($paid_to_record <= 0) { - throw new Exception("Nominal pembayaran 0 / tidak valid."); - } $qHeader = $this->db_onedev->query( "INSERT INTO f_payment( @@ -897,7 +933,7 @@ class Payment extends MY_Controller foreach ($payments as $v) { if (empty($v['chex'])) continue; - if ($remaining_alloc <= 0) break; + //if ($remaining_alloc <= 0) break; $code = (string)($v['code'] ?? ''); $typeId = (int)($v['id'] ?? 0); @@ -907,19 +943,12 @@ class Payment extends MY_Controller $actual = (int)($v['leftvalue'] ?? 0); $change = (int)($v['rightvalue'] ?? 0); - if ($actual < 0) $actual = 0; - if ($change < 0) $change = 0; - - $net = $actual; - if ($actual > 0) { - $net = $actual - max(0, $change); + if($actual > 0){ + $amount = intval($v['leftvalue']) - intval($v['rightvalue']); + } + else{ + $amount = $actual; } - if ($net < 0) $net = 0; - - $amount = min($net, $remaining_alloc); - - $change_new = $actual - $amount; - if ($change_new < 0) $change_new = 0; $q = $this->db_onedev->query( "INSERT INTO f_paymentdetail( @@ -932,7 +961,7 @@ class Payment extends MY_Controller F_PaymentDetailLastUpdated, F_PaymentDetailUserID ) VALUES (?,?,?,?,?,NOW(),NOW(),?)", - [$headerid, $typeId, $amount, $actual, $change_new, $xuserid] + [$headerid, $typeId, $amount, $actual, $change, $xuserid] ); if (! $q) { @@ -952,6 +981,7 @@ class Payment extends MY_Controller $selected_card = (int)($v['selected_card']['id'] ?? 0); $selected_edc = (int)($v['selected_edc']['id'] ?? 0); $selected_account = (int)($v['selected_account']['id'] ?? 0); + $selected_promo = (int)($v['selected_promo']['id'] ?? 0); $bankAccountId = 0; if ($code === 'TRANSFER' || $code === 'QRIS') { @@ -975,27 +1005,51 @@ class Payment extends MY_Controller F_PaymentDetailUserID ) VALUES (?,?,?,?,?,?,?,?,NOW(),NOW(),?)", [$headerid, $typeId, $amount, 0, 0, $selected_card, 0, $bankAccountId, $xuserid] - ); + ); - if (! $q) { + if (! $q) { $this->sys_error_db("f_paymentdetail non cash insert", $this->db_onedev); exit; + } + + $paymentDetailId = (int)$this->db_onedev->insert_id(); + + if ($code === 'PROMO') { + if ($selected_promo <= 0) { + throw new Exception("Promo tidak valid."); } - $paymentDetailId = (int)$this->db_onedev->insert_id(); + $qPromo = $this->db_onedev->query( + "INSERT INTO t_promo( + T_PromoT_OrderHeaderID, + T_PromoF_PaymentDetailID, + T_PromoF_PaymentID, + T_PromoM_PromoID, + T_PromoIsActive, + T_PromoCreated, + T_PromoCreatedUserID + ) VALUES (?,?,?,?, 'Y', NOW(), ?)", + [$orderid, $paymentDetailId, $headerid, $selected_promo, $xuserid] + ); - if ($code === 'VOUCHER') { + if (! $qPromo) { + $this->sys_error_db("t_promo insert", $this->db_onedev); + exit; + } + } + + if ($code === 'VOUCHER') { $vn = trim((string)($v['rightvalue'] ?? '')); if ($vn !== '' && $amount > 0) { $voucherUsedNumbers[] = $vn; $rest = $amount_req - $amount; if ($rest > 0) { - $voucherRestRows[] = [ - 'voucher_number' => $vn, - 'rest_value' => $rest, - 'payment_detail_id' => $paymentDetailId, - ]; + $voucherRestRows[] = [ + 'voucher_number' => $vn, + 'rest_value' => $rest, + 'payment_detail_id' => $paymentDetailId, + ]; } } } @@ -1003,13 +1057,19 @@ class Payment extends MY_Controller $remaining_alloc -= $amount; } - $paid_after = $paid_before + $paid_to_record; - if ($paid_after > $bill_total) $paid_after = $bill_total; + $paid_all = 0; + $unpaid = 0; + $sql = "SELECT SUM(F_PaymentTotal) AS total_paid, T_OrderHeaderTotal AS total_bill + FROM + f_payment + JOIN t_orderheader ON T_OrderHeaderID = F_PaymentT_OrderHeaderID AND T_OrderHeaderIsActive = 'Y' + WHERE F_PaymentT_OrderHeaderID = ? AND F_PaymentIsActive = 'Y' + GROUP BY F_PaymentT_OrderHeaderID"; + $row = $this->db_onedev->query($sql, [$orderid])->row_array(); + $paid_all = (int)($row['total_paid'] ?? 0); + $unpaid = (int)($row['total_bill'] ?? 0) - $paid_all; - $unpaid = $bill_total - $paid_after; - if ($unpaid < 0) $unpaid = 0; - - $lunas = ($paid_after >= $bill_total) ? 'Y' : 'N'; + $lunas = ($unpaid <= 0) ? 'Y' : 'N'; $last = $this->db_onedev->query( "SELECT Last_StatusPaymentID @@ -1029,7 +1089,7 @@ class Payment extends MY_Controller Last_StatusPaymentIsLunas = ?, Last_StatusPaymentLastUpdated = NOW() WHERE Last_StatusPaymentID = ?", - [$bill_total, $paid_after, $unpaid, $lunas, (int)$last['Last_StatusPaymentID']] + [$row['total_bill'], $paid_all, $unpaid, $lunas, (int)$last['Last_StatusPaymentID']] ); if (! $q) { $this->sys_error_db("last_statuspayment update", $this->db_onedev); @@ -1046,7 +1106,7 @@ class Payment extends MY_Controller Last_StatusPaymentCreated, Last_StatusPaymentUserID ) VALUES (?,?,?,?,?,NOW(),?)", - [$orderid, $bill_total, $paid_after, $unpaid, $lunas, $xuserid] + [$orderid, $row['total_bill'], $paid_all, $unpaid, $lunas, $xuserid] ); if (! $q) { $this->sys_error_db("last_statuspayment insert", $this->db_onedev); @@ -1090,15 +1150,15 @@ class Payment extends MY_Controller if ($restValue <= 0) continue; $rowVd = $this->db_onedev->query( - "SELECT VoucherDetailID + "SELECT VoucherDetailID FROM voucher_detail WHERE VoucherDetailNumber = ? LIMIT 1", - [$vn] + [$vn] )->row_array(); if (!$rowVd) { - throw new Exception("Voucher detail tidak ditemukan untuk nomor {$vn}"); + throw new Exception("Voucher detail tidak ditemukan untuk nomor {$vn}"); } $voucherDetailId = (int)$rowVd['VoucherDetailID']; @@ -1122,9 +1182,9 @@ class Payment extends MY_Controller $restValue, $xuserid ] - ); + ); - if (!$qRest) { + if (!$qRest) { $this->sys_error_db("gagal insert t_voucher_rest", $this->db_onedev); exit; } @@ -1182,57 +1242,56 @@ class Payment extends MY_Controller "menu_walk_in" => $row_menu ? $row_menu['S_MenuUrl'] : '' ]); exit; - } catch (Exception $e) { $this->db_onedev->trans_rollback(); $this->sys_error($e->getMessage()); exit; } } - + function delete_note() { - //# cek token valid - if (! $this->isLogin) { + //# cek token valid + if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; - } + } - //# ambil parameter input - $xuserid = $this->sys_user['M_UserID']; - $prm = $this->sys_input; - $prmnota = $prm['nota']; - $catatan = $prm['catatan']; - $sql = "UPDATE f_payment SET F_PaymentIsActive = 'N', F_PaymentNote = '{$catatan}' WHERE F_PaymentID = {$prmnota['note_id']}"; - //echo $sql; - $query = $this->db_onedev->query($sql); - if (!$query) { - $this->sys_error_db("f_payment delete"); - exit; - } - - $sql = "UPDATE f_paymentdetail SET F_PaymentDetailIsActive = 'N' WHERE F_PaymentDetailF_PaymentID = {$prmnota['note_id']}"; - //echo $sql; - $query = $this->db_onedev->query($sql); - if (!$query) { - $this->sys_error_db("f_paymentdetail delete"); - exit; - } - - $result = array( - "total" => 1 , - "records" => array('prm'=>$prm) - ); - $this->sys_ok($result); + //# ambil parameter input + $xuserid = $this->sys_user['M_UserID']; + $prm = $this->sys_input; + $prmnota = $prm['nota']; + $catatan = $prm['catatan']; + $sql = "UPDATE f_payment SET F_PaymentIsActive = 'N', F_PaymentNote = '{$catatan}' WHERE F_PaymentID = {$prmnota['note_id']}"; + //echo $sql; + $query = $this->db_onedev->query($sql); + if (!$query) { + $this->sys_error_db("f_payment delete"); exit; + } + + $sql = "UPDATE f_paymentdetail SET F_PaymentDetailIsActive = 'N' WHERE F_PaymentDetailF_PaymentID = {$prmnota['note_id']}"; + //echo $sql; + $query = $this->db_onedev->query($sql); + if (!$query) { + $this->sys_error_db("f_paymentdetail delete"); + exit; + } + + $result = array( + "total" => 1, + "records" => array('prm' => $prm) + ); + $this->sys_ok($result); + exit; } function getLocations() { - $prm = $this->sys_input; - $station_location = []; - $locations = []; - $sql = "SELECT T_OrderDetailT_OrderHeaderID as order_id, T_SampleStationID as station_id, T_SampleStationName as station_name, + $prm = $this->sys_input; + $station_location = []; + $locations = []; + $sql = "SELECT T_OrderDetailT_OrderHeaderID as order_id, T_SampleStationID as station_id, T_SampleStationName as station_name, fn_get_location(T_SampleStationID,T_OrderDetailT_OrderHeaderID) as location_id, '' locations FROM ( SELECT distinct T_OrderDetailT_OrderHeaderID,T_SampleStationID, T_SampleStationName @@ -1245,34 +1304,26 @@ class Payment extends MY_Controller WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' - ) x"; - $query = $this->db_onedev->query($sql,array($prm['order_id'])); - //echo $this->db_onedev->last_query(); - if ($query) - { - $datas = $query->result_array(); - foreach ($datas as $key => $value) { - $sql = "SELECT M_LocationID as location_id, M_LocationName as location_name FROM m_location WHERE M_LocationT_SampleStationID = ? AND M_LocationIsActive = 'Y' "; - $query = $this->db_onedev->query($sql,array($value['station_id'])); - if ($query) - { - $datas[$key]['locations'] = $query->result_array(); - } - else - { - $datas[$key]['locations'] = []; - } + ) x"; + $query = $this->db_onedev->query($sql, array($prm['order_id'])); + //echo $this->db_onedev->last_query(); + if ($query) { + $datas = $query->result_array(); + foreach ($datas as $key => $value) { + $sql = "SELECT M_LocationID as location_id, M_LocationName as location_name FROM m_location WHERE M_LocationT_SampleStationID = ? AND M_LocationIsActive = 'Y' "; + $query = $this->db_onedev->query($sql, array($value['station_id'])); + if ($query) { + $datas[$key]['locations'] = $query->result_array(); + } else { + $datas[$key]['locations'] = []; } - $this->sys_ok(["datas"=> $datas]); - } - else{ - echo $this->db_onedev->last_query(); - $this->sys_error_db("gagal ambil data", $this->db_onedev); - exit; - } - - + $this->sys_ok(["datas" => $datas]); + } else { + echo $this->db_onedev->last_query(); + $this->sys_error_db("gagal ambil data", $this->db_onedev); + exit; + } } function save_control() @@ -1281,11 +1332,11 @@ class Payment extends MY_Controller $this->sys_error("Invalid Token"); exit; } - $prm = $this->sys_input; - $userid = $this->sys_user['M_UserID']; - if($prm['data'] && count($prm['data']) > 0){ - foreach ($prm['data'] as $key => $value) { - $sql="INSERT INTO t_order_location ( + $prm = $this->sys_input; + $userid = $this->sys_user['M_UserID']; + if ($prm['data'] && count($prm['data']) > 0) { + foreach ($prm['data'] as $key => $value) { + $sql = "INSERT INTO t_order_location ( T_OrderLocationT_OrderHeaderID, T_OrderLocationM_LocationID, T_OrderLocationT_SampleStationID, @@ -1300,14 +1351,13 @@ class Payment extends MY_Controller T_OrderLocationT_SampleStationID = ?, T_OrderLocationLastUpdated = NOW(), T_OrderLocationUserID = ?"; - $query = $this->db_onedev->query($sql,array($value['order_id'],$value['location_id'],$value['station_id'],$userid,$value['order_id'],$value['location_id'],$value['station_id'],$userid)); - } - $this->sys_ok(["datas"=> '']); - } - else{ - $this->sys_error_db("data not valid", $this->db_onedev); - exit; + $query = $this->db_onedev->query($sql, array($value['order_id'], $value['location_id'], $value['station_id'], $userid, $value['order_id'], $value['location_id'], $value['station_id'], $userid)); } + $this->sys_ok(["datas" => '']); + } else { + $this->sys_error_db("data not valid", $this->db_onedev); + exit; + } //echo $sql; } @@ -1365,7 +1415,7 @@ class Payment extends MY_Controller "; $qDetail = $this->db_onedev->query($sqlDetail, [$voucherNumber]); - if(!$qDetail || !$qDetail->row_array()){ + if (!$qDetail || !$qDetail->row_array()) { $this->sys_ok([ "code" => "N", "message" => "Voucher tidak ditemukan", @@ -1407,7 +1457,7 @@ class Payment extends MY_Controller "; $qHeader = $this->db_onedev->query($sqlHeader, [$detail['VoucherDetailVoucherHeaderID']]); - if(!$qHeader || !$qHeader->row_array()){ + if (!$qHeader || !$qHeader->row_array()) { $this->sys_ok([ "code" => "N", "message" => "Voucher header tidak ditemukan", @@ -1449,7 +1499,6 @@ class Payment extends MY_Controller "headerId" => (int)$header['VoucherHeaderID'] ]); exit; - } catch (Exception $e) { $this->sys_error($e->getMessage()); exit; diff --git a/scripts/devcpone_sync.sh b/scripts/devcpone_sync.sh index 02f1b53..f2848c6 100755 --- a/scripts/devcpone_sync.sh +++ b/scripts/devcpone_sync.sh @@ -20,6 +20,7 @@ tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/devcpone-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" @@ -31,12 +32,20 @@ if [ ! -s "$manifest" ]; then exit 0 fi -ssh_cmd="ssh" +ssh_args="-o BatchMode=yes" if [ -f "$ssh_key" ]; then - ssh_cmd="$ssh_cmd -i $ssh_key" + ssh_args="-i $ssh_key $ssh_args" fi -ssh_cmd="$ssh_cmd -o BatchMode=yes" +ssh $ssh_args "$remote_host" "mkdir -p '$remote_root'" >/dev/null +rsync -a --relative --from0 --files-from="$manifest" -e "ssh $ssh_args" "$repo_root"/ "$remote_host:$remote_root"/ -ssh "$remote_host" "mkdir -p '$remote_root'" >/dev/null -rsync -a --relative --from0 --files-from="$manifest" -e "$ssh_cmd" "$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' "devcpone verify failed: missing $remote_root/$relpath" >&2 + exit 1 + } +done < "$verify_list"