PJ_DOCTOR_ID = 0; $this->SENDER_DOCTOR_ID = 0; $this->SENDER_ADDRESS_ID = 0; $this->ONLINE_USER_ID = 1500; $this->db = $this->load->database("onedev", true); $this->db_log = $this->load->database("one_lab_log", true); } public function index() { echo "Fixing snapshot ss_piutang_test"; } function get_rows($sql, $prm = false) { if ($prm) { $qry = $this->db->query($sql, $prm); } else { $qry = $this->db->query($sql); } if (!$qry) { $msg = "Error Query : {$this->db->error()["message"]} | {$this->db->last_query()}\n"; return [false, $msg]; } $rows = $qry->result_array(); return [true, $rows]; } function get_one_row($sql, $prm) { list($status, $msg) = $this->get_rows($sql, $prm); if ($status !== true) { return [$status, $msg]; } if (count($msg) == 0) { return [false, "Record not found. | " . $msg]; } return [true, $msg[0]]; } function now() { return Date("Y-m-d H:i:s"); } function genqrcode($nomorlab, $id) { $this->load->library('ciqrcode'); //pemanggilan library QR CODE $home_dir = "/home/one/project/one/"; $target_dir = $home_dir . "one-media/one-qrcontrolcard/"; $config['cacheable'] = false; //boolean, the default is true //$config['cachedir'] = './assets/'; //string, the default is application/cache/ //$config['errorlog'] = './assets/'; //string, the default is application/logs/ $config['imagedir'] = $target_dir; //direktori penyimpanan qr code $config['quality'] = true; //boolean, the default is true $config['size'] = '1024'; //interger, the default is 1024 $config['black'] = array(224, 255, 255); // array, default is array(255,255,255) $config['white'] = array(70, 130, 180); // array, default is array(0,0,0) $this->ciqrcode->initialize($config); $image_name = "qrcode_" . $nomorlab . ".png"; //buat name dari qr code sesuai dengan nim $params['data'] = $_SERVER['HTTP_HOST'] . "/one-ui-lab/test/vuex/cpone-control-card/?noreg=" . $nomorlab . "&id=" . $id; //data yang akan di jadikan QR CODE $params['level'] = 'H'; //H=High $params['size'] = 10; $params['savename'] = $config['imagedir'] . $image_name; //simpan image QR CODE ke folder assets/images/ $this->ciqrcode->generate($params); // fungsi untuk generate QR CODE return $_SERVER['HTTP_HOST'] . "/one-api-lab/assets/images/" . $image_name; } function genpatientqrcode($nomorlab) { $this->load->library('ciqrcode'); //pemanggilan library QR CODE $home_dir = "/home/one/project/one/"; $target_dir = $home_dir . "one-media/one-qrpatient/"; $config['cacheable'] = false; //boolean, the default is true //$config['cachedir'] = './assets/'; //string, the default is application/cache/ //$config['errorlog'] = './assets/'; //string, the default is application/logs/ $config['imagedir'] = $target_dir; //direktori penyimpanan qr code $config['quality'] = true; //boolean, the default is true $config['size'] = '1024'; //interger, the default is 1024 $config['black'] = array(224, 255, 255); // array, default is array(255,255,255) $config['white'] = array(70, 130, 180); // array, default is array(0,0,0) $init = $this->ciqrcode->initialize($config); //print_r($init); $image_name = "patient_qr_" . $nomorlab . ".png"; //buat name dari qr code sesuai dengan nim $params['data'] = $nomorlab; //data yang akan di jadikan QR CODE $params['level'] = 'H'; //H=High $params['size'] = 10; $params['savename'] = $config['imagedir'] . $image_name; //simpan image QR CODE ke folder assets/images/ $save = $this->ciqrcode->generate($params); // fungsi untuk generate QR CODE //print_r($save); // exit; return $_SERVER['HTTP_HOST'] . "/one-media/one-qrpatient/" . $image_name; //echo "selesai"; } function genformqrcode($uuid) { $this->load->library('ciqrcode'); //pemanggilan library QR CODE $home_dir = "/home/one/project/one/"; $target_dir = $home_dir . "one-media/one-qrpatient/"; $config['cacheable'] = false; //boolean, the default is true //$config['cachedir'] = './assets/'; //string, the default is application/cache/ //$config['errorlog'] = './assets/'; //string, the default is application/logs/ $config['imagedir'] = $target_dir; //direktori penyimpanan qr code $config['quality'] = true; //boolean, the default is true $config['size'] = '1024'; //interger, the default is 1024 $config['black'] = array(224, 255, 255); // array, default is array(255,255,255) $config['white'] = array(70, 130, 180); // array, default is array(0,0,0) $this->ciqrcode->initialize($config); $image_name = "form_qr_" . $uuid . ".png"; //buat name dari qr code sesuai dengan nim $params['data'] = $_SERVER['HTTP_HOST'] . "/one-ui-lab/test/vuex/cpone-riwayat-form-v2/?id=" . $uuid; //data yang akan di jadikan QR CODE $params['level'] = 'H'; //H=High $params['size'] = 10; $params['savename'] = $config['imagedir'] . $image_name; //simpan image QR CODE ke folder assets/images/ $this->ciqrcode->generate($params); // fungsi untuk generate QR CODE return array('image' => $_SERVER['HTTP_HOST'] . "/one-media/one-qrpatient/" . $image_name, 'url' => $params['data']); //echo "selesai"; } function generate_code_string() { $length = 5; $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $code = ''; for ($i = 0; $i < $length; $i++) { $code .= $characters[rand(0, strlen($characters) - 1)]; } return $code; } function generate_uuid() { // Generate 16 bytes (128 bits) of random data $data = random_bytes(16); // Set version to 0100 $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // Set bits 6-7 to 10 $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // Output the 36 character UUID return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); } function generate_code_form($preid, $orderid) { $userid = $this->sys_user["M_UserID"]; $sql = "SELECT COUNT(*) as total FROM form_riwayat_pasien WHERE FormRiwayatPasienT_OrderHeaderID = ? AND FormRiwayatPasienIsActive = 'Y' "; $qry = $this->db->query($sql, [$orderid]); // echo $this->db->last_query(); // exit; if ($qry) { $total = $qry->result_array()[0]['total']; if ($total == 0) { $code = $this->generate_code_string(); $uuid = $this->generate_uuid(); $sql = "INSERT INTO form_riwayat_pasien ( FormRiwayatPasienPreregisterID, FormRiwayatPasienCode, FormRiwayatPasienUUID, FormRiwayatPasienT_OrderHeaderID, FormRiwayatPasienCreated, FormRiwayatPasienCreatedUserID) VALUES (?, ?, ?, ?, NOW(), ?)"; $qry = $this->db->query($sql, [$preid, $code, $uuid, $orderid, $userid]); //echo $this->db->last_query(); //exit; if (!$qry) { return ''; } return array('uuid' => $uuid, 'code' => $code); } } else { return ''; } } function check_duplicate_nat_tests($data) { // Array untuk menyimpan nat_tests ID yang sudah ditemui beserta detail tesnya $encountered_nat_tests = []; // Array untuk menyimpan informasi duplikat $duplicate_pairs = []; // Flag untuk menandakan ada duplikat atau tidak $has_duplicates = false; // Iterasi melalui setiap item dalam data foreach ($data as $index => $item) { if (isset($item['t_id'])) { $sql = "SELECT * FROM t_test WHERE T_TestID = {$item['t_id']}"; $query = $this->db->query($sql); //echo $this->db->last_query(); if (!$query) { $this->sys_error_db(["status" => "ERR", "message" => "select t_test | " . $this->db->error()["message"], "debug" => $this->db->last_query()]); exit; } $dt_test = $query->row_array(); $nat_test_id = $dt_test['T_TestNat_TestID']; $test_name = $dt_test['T_TestName']; if (isset($encountered_nat_tests[$nat_test_id])) { $has_duplicates = true; // Buat pasangan nama tes yang berisi duplikat $existing_test = $encountered_nat_tests[$nat_test_id]; $pair_key = ($existing_test < $test_name) ? $existing_test . '|' . $test_name : $test_name . '|' . $existing_test; if (!isset($duplicate_pairs[$pair_key])) { $duplicate_pairs[$pair_key] = [ 'test1' => $existing_test, 'test2' => $test_name ]; } } else { // Jika belum ada, tambahkan ke array encountered_nat_tests $encountered_nat_tests[$nat_test_id] = $test_name; } } else { $test_name = isset($item['T_TestName']) ? $item['T_TestName'] : 'Unknown Test'; // Periksa jika nat_tests ada dan dalam bentuk string JSON if (isset($item['nat_tests']) && is_string($item['nat_tests'])) { // Decode string JSON menjadi array $nat_tests_array = json_decode($item['nat_tests'], true); // Jika decode berhasil dan hasilnya array if (is_array($nat_tests_array)) { // Iterasi melalui setiap nat_tests ID dalam item saat ini foreach ($nat_tests_array as $nat_test_id) { // Jika nat_tests ID sudah ada di array encountered_nat_tests, berarti duplikat if (isset($encountered_nat_tests[$nat_test_id])) { $has_duplicates = true; // Buat pasangan nama tes yang berisi duplikat $existing_test = $encountered_nat_tests[$nat_test_id]; $pair_key = ($existing_test < $test_name) ? $existing_test . '|' . $test_name : $test_name . '|' . $existing_test; if (!isset($duplicate_pairs[$pair_key])) { $duplicate_pairs[$pair_key] = [ 'test1' => $existing_test, 'test2' => $test_name ]; } } else { // Jika belum ada, tambahkan ke array encountered_nat_tests $encountered_nat_tests[$nat_test_id] = $test_name; } } } } } } // Mengembalikan hasil pengecekan return [ 'is_duplicate' => $has_duplicates, 'duplicate_pairs' => array_values($duplicate_pairs) // Convert to indexed array ]; } public function fix($futureNo) { $sql = "select FutureOrderID, FutureOrderNumber, FutureOrderDateBooking, FutureOrderIsActive, JSON_EXTRACT( fn_get_patient_atribute(FutureOrderM_PatientID) , '$.patient_fullname' ) PatientName, JSON_EXTRACT( fn_get_patient_atribute(FutureOrderM_PatientID) , '$.M_PatientHP' ) PatientHP, ifnull(T_OrderHeaderLabNumber,'Pending') LabNumber , if(FutureOrderDateBooking > date(now()), 'Y', 'N') inFuture, if(FutureMapT_OrderHeaderID is not null, 'Y', 'N') isMapped from future_order left join future_map on FutureOrderID = FutureMapFutureOrderID left join t_orderheader on FutureMapT_OrderHeaderID = T_OrderHeaderID where FutureOrderNumber = ? "; list($status, $row) = $this->get_one_row($sql, [$futureNo]); if ($status === false) { echo "ERR get Future Order: $row"; exit(); } $this->print_table([$row], array_keys($row)); if ($row["inFuture"] == "Y") { echo "

Booking masa depan

"; exit(); } if ($row["FutureOrderIsActive"] == "N") { echo "

Booking dihapus

"; exit(); } if ($row["isMapped"] == "Y") { echo "

Sudah Tercreate ORDER {$row["LabNumber"]}

"; exit(); } $url_fix = "/one-api-lab/fix/fix_future/do_fix/" . $row["FutureOrderID"] . "/" . md5($row["FutureOrderNumber"]); echo "
\n"; } function do_fix($futureOrderID, $md5Future, $userid) { $sql = "select FutureOrderNumber, if(FutureOrderDateBooking > date(now()) , 'Y' , 'N') inFuture, if(FutureMapID is not null,'Y','N') isMapped, FutureMapT_OrderHeaderID from future_order left join future_map on FutureOrderID = FutureMapFutureOrderID and FutureMapIsActive ='Y' where FutureOrderID = ? and FutureOrderIsActive = 'Y' "; list($status, $msg) = $this->get_one_row($sql, [$futureOrderID]); if ($status === false) { echo $msg; exit(); } $row = $msg; $futureOrderNumber = $row["FutureOrderNumber"]; if (md5($row["FutureOrderNumber"]) != $md5Future) { echo "Invalid Redirect Link"; exit(); } if ($row["inFuture"] == "Y") { echo "Booking Masa depan > hari ini"; exit(); } if ($row["inMapped"] == "Y") { echo "Booking sudah ada"; exit(); } ob_start(); echo "
Generate Order
"; $this->generate_order($futureOrderID, $userid); $result = ob_get_contents(); ob_end_clean(); echo "
$result
"; $url_fix = "/one-ui-lab/test/vuex/one-fo-cashier-new-payment-v27/"; echo "
\n"; } public function fix_debug($futureNo) { $sql = "select FutureOrderID, FutureOrderNumber, FutureOrderDateBooking, FutureOrderIsActive, JSON_EXTRACT( fn_get_patient_atribute(FutureOrderM_PatientID) , '$.patient_fullname' ) PatientName, JSON_EXTRACT( fn_get_patient_atribute(FutureOrderM_PatientID) , '$.M_PatientHP' ) PatientHP, ifnull(T_OrderHeaderLabNumber,'Pending') LabNumber , if(FutureOrderDateBooking > date(now()), 'Y', 'N') inFuture, if(FutureMapT_OrderHeaderID is not null, 'Y', 'N') isMapped from future_order left join future_map on FutureOrderID = FutureMapFutureOrderID left join t_orderheader on FutureMapT_OrderHeaderID = T_OrderHeaderID where FutureOrderNumber = ? "; list($status, $row) = $this->get_one_row($sql, [$futureNo]); if ($status === false) { echo "ERR get Future Order: $row"; exit(); } $this->print_table([$row], array_keys($row)); if ($row["inFuture"] == "Y") { echo "

Booking masa depan

"; exit(); } if ($row["FutureOrderIsActive"] == "N") { echo "

Booking dihapus

"; exit(); } if ($row["isMapped"] == "Y") { echo "

Sudah Tercreate ORDER {$row["LabNumber"]}

"; exit(); } $url_fix = "/one-api-lab/fix/fix_future/do_fix_debug/" . $row["FutureOrderID"] . "/" . md5($row["FutureOrderNumber"]); echo "
\n"; } function do_fix_debug($futureOrderID, $md5Future) { $sql = "select FutureOrderNumber, if(FutureOrderDateBooking > date(now()) , 'Y' , 'N') inFuture, if(FutureMapID is not null,'Y','N') isMapped, FutureMapT_OrderHeaderID from future_order left join future_map on FutureOrderID = FutureMapFutureOrderID and FutureMapIsActive ='Y' where FutureOrderID = ? and FutureOrderIsActive = 'Y' "; list($status, $msg) = $this->get_one_row($sql, [$futureOrderID]); if ($status === false) { echo $msg; exit(); } $row = $msg; $futureOrderNumber = $row["FutureOrderNumber"]; if (md5($row["FutureOrderNumber"]) != $md5Future) { echo "Invalid Redirect Link"; exit(); } if ($row["inFuture"] == "Y") { echo "Booking Masa depan > hari ini"; exit(); } if ($row["inMapped"] == "Y") { echo "Booking sudah ada"; exit(); } ob_start(); echo "
Generate Order
"; $this->generate_order_debug($futureOrderID); $result = ob_get_contents(); ob_end_clean(); echo "
$result
"; $url_fix = "/one-ui-lab/test/vuex/one-fo-cashier-new-payment-v27/"; echo "
\n"; } public function print_table_style() { echo " "; } public function print_table($rows, $keys) { $this->print_table_style(); echo ""; echo ""; foreach ($keys as $k) { echo ""; } echo "\n"; foreach ($rows as $r) { echo ""; foreach ($keys as $k) { echo ""; } echo ""; } echo "
$k
" . $r[$k] . "
"; } public function get_branch_default() { $sql = "select * from m_branch where M_BranchIsDefault = 'Y' and M_BranchIsActive = 'Y'"; $qry = $this->db->query($sql); if (!$qry) { echo "{$this->now()} ERR : {$this->db->error()["message"]}\n"; exit(); } $rows = $qry->result_array(); if (count($rows) == 0) { echo "{$this->now()} ERR Get Default Branch: {$this->db->error()["message"]}\n"; exit(); } $branchKelurahanID = $rows[0]["M_BranchM_KelurahanID"]; $this->SENDER_DOCTOR_ID = $rows[0]["M_BranchM_DoctorID"]; $this->SENDER_ADDRESS_ID = $rows[0]["M_BranchM_DoctorAddressID"]; $sql = "select * from m_doctorpj where M_DoctorPjIsActive = 'Y' and M_DoctorPjIsDefaultPJ='Y'"; $qry = $this->db->query($sql); if (!$qry) { echo "{$this->now()} ERR : {$this->db->error()["message"]}\n"; exit(); } $rows = $qry->result_array(); if (count($rows) == 0) { echo "{$this->now()} ERR Get Default PJ: {$this->db->error()["message"]}\n"; exit(); } $this->PJ_DOCTOR_ID = $rows[0]["M_DoctorPjM_DoctorID"]; return [$branchKelurahanID]; } public function do_pelunasan( $headerID, $bankAccountID, $paymentTypeID, $paymentNote, $amount ) { $paymentTotal = $amount; $paymentDate = date("Y-m-d H:i:s"); $arr = [ "F_PaymentT_OrderHeaderID" => $headerID, "F_PaymentDate" => $paymentDate, "F_PaymentNote" => $paymentNote, "F_PaymentTotal" => $paymentTotal, "F_PaymentM_UserID" => $this->ONLINE_USER_ID, ]; $qry = $this->db->insert("f_payment", $arr); if (!$qry) { echo "{$this->now()} ERR Get Total Order: {$this->db->error()["message"]} | {$this->db->last_query()}\n"; return false; } $paymentID = $this->db->insert_id(); $detailNote = ""; $arr = [ "F_PaymentDetailF_PaymentID" => $paymentID, "F_PaymentDetailM_PaymentTypeID" => $paymentTypeID, "F_PaymentDetailEDCNat_BankID" => 0, "F_PaymentDetailCardNat_BankID" => 0, "F_PaymentDetailM_BankAccountID" => $bankAccountID, "F_PaymentDetailNote" => $paymentNote, "F_PaymentDetailAmount" => $paymentTotal, "F_PaymentDetailActual" => $paymentTotal, "F_PaymentDetailChange" => 0, ]; $qry = $this->db->insert("f_paymentdetail", $arr); if (!$qry) { echo "{$this->now()} ERR Pelunasan: {$this->db->error()["message"]} | {$this->db->last_query()}\n"; return false; } return true; } function add_delivery_note($orderHeaderID, $delivery_note) { $rst_id = $orderHeaderID; $db_msg = ""; foreach ($delivery_note as $k => $v) { if ($v["noteplus"] != "") { if ( $v["delivery_code"] == "EMAIL" || $v["delivery_code"] == "WHATSAPP" || $v["delivery_code"] == "TELEGRAM" ) { $sql = "UPDATE t_orderdelivery SET T_OrderDeliveryDestination = '{$v["noteplus"]}' WHERE T_OrderDeliveryT_OrderHeaderID = {$rst_id} AND T_OrderDeliveryM_DeliveryID = {$v["delivery_id"]} AND T_OrderDeliveryM_DeliveryTypeID = {$v["delivery_type_id"]} AND T_OrderDeliveryAddressID = {$v["address_id"]} AND T_OrderDeliveryIsActive = 'Y'"; $qry = $this->db->query($sql); if (!$qry) { $db_msg .= "ERR : Update T_orderDelivery " . $this->db->error()["message"] . " | " . $$this->db->last_query(); $db_msg .= "\n"; } } else { $sql = "SELECT T_OrderDeliveryID as xdel_id FROM t_orderdelivery WHERE T_OrderDeliveryT_OrderHeaderID = {$rst_id} AND T_OrderDeliveryM_DeliveryID = {$v["delivery_id"]} AND T_OrderDeliveryM_DeliveryTypeID = {$v["delivery_type_id"]} AND T_OrderDeliveryAddressID = {$v["address_id"]} AND T_OrderDeliveryIsActive = 'Y'"; //echo $sql; $qry = $this->db->query($sql); if (!$qry) { $db_msg .= "ERR : Get T_orderDelivery for XDel " . $this->db->error()["message"] . " | " . $$this->db->last_query(); $db_msg .= "\n"; } $xdel_id = $qry->row()->xdel_id; $sql = "INSERT INTO t_orderdeliverynote( T_OrderDeliveryNoteT_OrderDeliveryID, T_OrderDeliveryNoteValue, T_OrderDeliveryNoteCreated, T_OrderDeliveryNoteUserID ) VALUES( {$xdel_id}, '{$v["noteplus"]}', NOW(), {$this->sys_user["M_UserID"]} )"; $qry = $this->db->query($sql); if (!$qry) { $db_msg .= "ERR : Update T_orderDelivery " . $this->db->error()["message"] . " | " . $$this->db->last_query(); $db_msg .= "\n"; } } } } return $db_msg; } public function generate_order_debug($futureOrderID) { $this->db->trans_begin(); $this->get_branch_default(); $sql = "select future_order.*, if(FutureMapIsActive is null , 'N', 'Y') isMapped from future_order left join future_map on FutureOrderID = FutureMapFutureOrderID where FutureOrderID = ? "; $qry = $this->db->query($sql, [$futureOrderID]); if (!$qry) { $this->db->trans_rollback(); echo "{$this->now()} Err GetFutureOrder {$this->db->error()["message"]} | {$this->db->last_query()}\n"; return; } $rows = $qry->result_array(); if (count($rows) == 0) { $this->db->trans_rollback(); echo "{$this->now()} Err GetFutureOrder not found | {$this->db->last_query()}\n"; return; } if ($rows[0]["isMapped"] == "Y") { $this->db->trans_rollback(); echo "{$this->now()} Err Order sudah di future_map | {$this->db->last_query()}\n"; return; } $futureOrder = $rows[0]; echo "{$this->now()} Create Order from {$futureOrder["FutureOrderNumber"]} \n"; $x_header = ($futureOrder["FutureOrderJSONHeader"]); echo "$x_header\n"; $x_header = preg_replace('/[[:^print:]]/', '', $x_header); $header = json_decode($x_header, true); echo "HEADER : " . $x_header; echo "JSON LAST ERR : " . json_last_error_msg() . "\n"; print_r($header); echo "

"; $header["date"] = date("Y-m-d H:i:s"); echo "New Header: "; print_r($header); $t_header = json_encode($header); echo "XXX Header : $t_header | " . json_last_error_msg(); echo "

"; $x_delivery = $futureOrder["FutureOrderJSONDelivery"]; $x_delivery = str_replace("\n", "", $x_delivery); $delivery = json_decode($x_delivery, true); echo "Raw Delivery :
$x_delivery
"; echo "Decode Delivery Json : " . json_last_error_msg() . "
"; $delivery_note = json_decode( $futureOrder["FutureOrderJSONDeliveryNote"], true ); $req = json_decode($futureOrder["FutureOrderJSONReq"], true); $detail = json_decode($futureOrder["FutureOrderJSONDetail"], true); $header_json = addslashes( str_replace('\n', '\\\n', json_encode($header)) ); $detail_json = str_replace('\n', '\\\n', json_encode($detail)); $delivery_json = addslashes( str_replace('\n', '\\\n', json_encode($delivery)) ); echo "
"; echo "Delivery String:
"; echo $delivery; echo "
"; $req_json = json_encode($req); echo "
"; print_r($header_json); echo "
"; print_r($detail_json); echo "
"; echo "Delivery JSON:"; print_r($delivery_json); $sql = "CALL sp_fo_register_save_online_debug(0, '{$header_json}', '{$delivery_json}', '{$detail_json}', '{$req_json}', '3');"; $query = $this->db->query($sql); if (!$query) { $this->db->trans_rollback(); echo "{$this->now()} Err Create Order : {$this->db->error()["message"]} | {$this->db->last_query()}\n"; return; } $rows = $query->result_array(); $this->db->trans_rollback(); $rst_data = json_decode($rows[0]["data"]); $rst_id = $rst_data->id; if ($rows[0]["status"] == "ERR") { echo "ERR CALL sp_fo_register_save_online_debug| "; echo "
"; print_r($rows); $this->db->trans_rollback(); return; } $this->db->trans_rollback(); echo "DEBUG ONLY"; return; $this->clean_mysqli_connection($this->db->conn_id); $orderHeaderID = $rst_id; if ($orderHeaderID == 0) { $this->db->trans_rollback(); echo "{$this->now()} Err Generate Order | {$this->db->last_query()}\n"; return; } $orderHeaderNo = $rst->data->number; $db_msg = $this->add_delivery_note($orderHeaderID, $delivery_note); if ($db_msg != "") { $this->db->trans_rollback(); echo "{$this->now()} Err Add Delivery Note $db_msg\n"; return; } //Doctor Alias $sql = "UPDATE t_orderheaderaddon SET T_OrderHeaderAddOnAliasDoctorName = '{$futureOrder["FutureOrderDoctorAlias"]}', T_OrderHeaderAddOnAliasDoctorAddress = '{$futureOrder["FutureOrderDoctorAddress"]}', T_OrderHeaderAddOnFoTimeStart = '{$futureOrder["FutureOrderFoTimeStart"]}', T_OrderHeaderAddOnFoTimeEnd = '{$futureOrder["FutureOrderFoTimeEnd"]}' WHERE T_OrderHeaderAddOnT_OrderHeaderID = '{$orderHeaderID}'"; $query = $this->db->query($sql); if (!$query) { $this->db->trans_rollback(); echo "{$this->now()} Err Create Order : {$this->db->error()["message"]} | {$this->db->last_query()}\n"; return; } // futtureMap $arr = [ "FutureMapT_OrderHeaderID" => $orderHeaderID, "FutureMapFutureOrderID" => $futureOrderID, ]; $qry = $this->db->insert("future_map", $arr); if (!$qry) { $this->db->trans_rollback(); echo "{$this->now()} Err Future Map: {$this->db->error()["message"]} | {$this->db->last_query()}\n"; return; } // // Down payment // $sql = "select group_concat(FutureDownpaymentNumber) as dpNo, sum(FutureDownpaymentTotal) dpTotal from future_downpayment where FutureDownpaymentFutureOrderID = ? and FutureDownpaymentIsActive='Y'"; $query = $this->db->query($sql, $futureOrderID); if (!$query) { $this->db->trans_rollback(); echo "{$this->now()} Err Get DownPaymentNumber : {$this->db->error()["message"]} | {$this->db->last_query()}\n"; return; } $rows = $query->result_array(); $dpTotal = 0; $dpNo = ""; if (count($rows) > 0) { $dpTotal = $rows[0]["dpTotal"]; $dpNo = $rows[0]["dpNo"]; } if ($dpTotal > 0) { $bankAccountID = 0; $paymentTypeID = 10; $paymentNote = "DP : $dpNo"; $rst_payment = $this->do_pelunasan( $orderHeaderID, $bankAccountID, $paymentTypeID, $paymentNote, $dpTotal ); } if ($this->db->trans_status === false) { $this->db->trans_rollback(); echo "{$this->now()} ERR : {$db_msg}\n"; } else { $this->db->trans_commit(); echo "{$this->now()} $orderHeaderNo [Success]\n"; } } public function generate_order($futureOrderID, $userid) { $this->db->trans_begin(); $this->get_branch_default(); $sql = "select future_order.*, if(FutureMapIsActive is null , 'N', 'Y') isMapped from future_order left join future_map on FutureOrderID = FutureMapFutureOrderID where FutureOrderID = ? "; $qry = $this->db->query($sql, [$futureOrderID]); if (!$qry) { $this->db->trans_rollback(); echo "{$this->now()} Err GetFutureOrder {$this->db->error()["message"]} | {$this->db->last_query()}\n"; return; } $rows = $qry->result_array(); if (count($rows) == 0) { $this->db->trans_rollback(); echo "{$this->now()} Err GetFutureOrder not found | {$this->db->last_query()}\n"; return; } if ($rows[0]["isMapped"] == "Y") { $this->db->trans_rollback(); echo "{$this->now()} Err Order sudah di future_map | {$this->db->last_query()}\n"; return; } $futureOrder = $rows[0]; echo "{$this->now()} Create Order from {$futureOrder["FutureOrderNumber"]} \n"; $x_header = ($futureOrder["FutureOrderJSONHeader"]); $x_header = preg_replace('/[[:^print:]]/', '', $x_header); $header = json_decode($x_header, true); $header["date"] = date("Y-m-d H:i:s"); $x_delivery = $futureOrder["FutureOrderJSONDelivery"]; $x_delivery = str_replace("\n", "", $x_delivery); $delivery = json_decode($x_delivery, true); $delivery_note = json_decode( $futureOrder["FutureOrderJSONDeliveryNote"], true ); $req = json_decode($futureOrder["FutureOrderJSONReq"], true); $detail = json_decode($futureOrder["FutureOrderJSONDetail"], true); $header_json = addslashes( str_replace('\n', '\\\n', json_encode($header)) ); $detail_json = str_replace('\n', '\\\n', json_encode($detail)); $delivery_json = addslashes( str_replace('\n', '\\\n', json_encode($delivery)) ); $req_json = json_encode($req); // echo "
"; // echo "Delivery: "; // print_r($delivery); // echo "
"; // echo "Req JSON : "; // print_r($req_json); // echo "
"; // echo "Header JSON : "; // print_r($header); // echo "
"; // echo "Detail JSON : "; // print_r($detail); // exit; // $sql = "CALL sp_fo_register_save_online(0, '{$header_json}', '{$delivery_json}', // '{$detail_json}', '{$req_json}', '{$userid}');"; // $query = $this->db->query($sql); // if (!$query) { // $this->db->trans_rollback(); // echo "{$this->now()} Err Create Order : {$this->db->error()["message"]} | {$this->db->last_query()}\n"; // return; // } // $rst = $query->row(); // $rst->data = json_decode($rst->data); // $rst_id = $rst->data->id; // $this->clean_mysqli_connection($this->db->conn_id); // GENERATE ORDER REGISTRASI $rst = $this->save($userid, $header, $detail, $delivery, $req); // $rst->data = json_decode($rst->data); // $rst_id = $rst->data->id; $rst_id = $rst['id']; $number = $rst['number']; $orderHeaderID = $rst_id; if ($orderHeaderID == 0) { $this->db->trans_rollback(); echo "{$this->now()} Err Generate Order | {$this->db->last_query()}\n"; return; } $orderHeaderNo = $number; $db_msg = $this->add_delivery_note($orderHeaderID, $delivery_note); if ($db_msg != "") { $this->db->trans_rollback(); echo "{$this->now()} Err Add Delivery Note $db_msg\n"; return; } //Doctor Alias $sql = "UPDATE t_orderheaderaddon SET T_OrderHeaderAddOnAliasDoctorName = '{$futureOrder["FutureOrderDoctorAlias"]}', T_OrderHeaderAddOnAliasDoctorAddress = '{$futureOrder["FutureOrderDoctorAddress"]}', T_OrderHeaderAddOnFoTimeStart = '{$futureOrder["FutureOrderFoTimeStart"]}', T_OrderHeaderAddOnFoTimeEnd = '{$futureOrder["FutureOrderFoTimeEnd"]}' WHERE T_OrderHeaderAddOnT_OrderHeaderID = '{$orderHeaderID}'"; $query = $this->db->query($sql); if (!$query) { $this->db->trans_rollback(); echo "{$this->now()} Err Create Order : {$this->db->error()["message"]} | {$this->db->last_query()}\n"; return; } // futtureMap $arr = [ "FutureMapT_OrderHeaderID" => $orderHeaderID, "FutureMapFutureOrderID" => $futureOrderID, ]; $qry = $this->db->insert("future_map", $arr); if (!$qry) { $this->db->trans_rollback(); echo "{$this->now()} Err Future Map: {$this->db->error()["message"]} | {$this->db->last_query()}\n"; return; } // // Down payment // $sql = "select group_concat(FutureDownpaymentNumber) as dpNo, sum(FutureDownpaymentTotal) dpTotal from future_downpayment where FutureDownpaymentFutureOrderID = ? and FutureDownpaymentIsActive='Y'"; $query = $this->db->query($sql, $futureOrderID); if (!$query) { $this->db->trans_rollback(); echo "{$this->now()} Err Get DownPaymentNumber : {$this->db->error()["message"]} | {$this->db->last_query()}\n"; return; } $rows = $query->result_array(); $dpTotal = 0; $dpNo = ""; if (count($rows) > 0) { $dpTotal = $rows[0]["dpTotal"]; $dpNo = $rows[0]["dpNo"]; } if ($dpTotal > 0) { $bankAccountID = 0; $paymentTypeID = 10; $paymentNote = "DP : $dpNo"; $rst_payment = $this->do_pelunasan( $orderHeaderID, $bankAccountID, $paymentTypeID, $paymentNote, $dpTotal ); } if ($this->db->trans_status === false) { $this->db->trans_rollback(); echo "{$this->now()} ERR : {$db_msg}\n"; } else { $this->db->trans_commit(); echo "{$this->now()} $orderHeaderNo [Success]\n"; } } // ---------------------------------------------------------------- // Generate save order function save($userid, $header, $details, $delivery, $req) { $tests = []; foreach ($details as $k => $v) { $dt_test_price = $v; if ($v['t_ispacket'] == 'Y') { $sql = "SELECT * FROM ss_price_mou WHERE packet_id = {$v['t_packetid']} AND is_packet = 'Y'"; $query = $this->db->query($sql); if (!$query) { $this->sys_error_db(["status" => "ERR", "message" => "select ss_price_mou | " . $this->db->error()["message"], "debug" => $this->db->last_query()]); exit; } $dt_test_price = $query->row_array(); } $tests[] = $dt_test_price; } $check_test = $this->check_duplicate_nat_tests($tests); if ($check_test['is_duplicate']) { $this->sys_error_db(["status" => "ERR", "message" => "duplicate test | " . json_encode($check_test['duplicate_pairs'])]); exit; } $this->db->trans_begin(); $fn_save_order_header = $this->save_order_header($header, $userid); if (!$fn_save_order_header['status']) { $this->db->trans_rollback(); $message = $fn_save_order_header['message'] ?? 'Terjadi kesalahan saat menyimpan data header'; $this->sys_error($message); exit; } $header_id = $fn_save_order_header['data']['header_id']; $number = $fn_save_order_header['data']['number']; $fn_save_order_detail = $this->save_order_detail($details, $header_id, $userid); //print_r($fn_save_order_detail); if (!$fn_save_order_detail['status']) { $this->db->trans_rollback(); $message = $fn_save_order_detail['message'] ?? 'Terjadi kesalahan saat menyimpan data detail'; $this->sys_error($message); exit; } $fn_generate_sample_lab = $this->generate_sample_lab($header_id, $userid); if (!$fn_generate_sample_lab['status']) { $this->db->trans_rollback(); $message = $fn_generate_sample_lab['message'] ?? 'Terjadi kesalahan saat membuat sample lab'; $this->sys_error($message); exit; } $fn_generate_location = $this->generate_location($header_id, $userid); if (!$fn_generate_location['status']) { $this->db->trans_rollback(); $message = $fn_generate_location['message'] ?? 'Terjadi kesalahan saat membuat lokasi'; $this->sys_error($message); exit; } $fn_generate_req = $this->generate_req($header_id, $req, $userid); if (!$fn_generate_req['status']) { $this->db->trans_rollback(); $message = $fn_generate_req['message'] ?? 'Terjadi kesalahan saat membuat req'; $this->sys_error($message); exit; } // set preregister_id dan preregister_promise karena mitra tidak ada preregister $preregister_id = 0; $preregister_promise = ''; $fn_update_preregister_promise = $this->update_preregister_promise($header_id, $preregister_promise, $preregister_id, $userid); if (!$fn_update_preregister_promise['status']) { $this->db->trans_rollback(); $message = $fn_update_preregister_promise['message'] ?? 'Terjadi kesalahan saat memperbarui promise'; $this->sys_error($message); exit; } $fn_order_delivery = $this->save_delivery($header_id, $delivery, $userid); if (!$fn_order_delivery['status']) { $this->db->trans_rollback(); $message = $fn_order_delivery['message'] ?? 'Terjadi kesalahan saat membuat delivery'; $this->sys_error($message); exit; } $sql = "SELECT t_orderheader.* FROM t_orderheader WHERE T_OrderHeaderID = ? LIMIT 1"; $query_orderheader = $this->db->query($sql, [$header_id]); //echo $this->db->last_query(); if (!$query_orderheader) { $prm_log = ['SELECT_T_ORDERHEADER', 'order/save', $header_id]; $this->db->trans_rollback(); $insert_log_error = $this->insert_log_error($this->db->last_query(), $prm_log); $message = 'Terjadi kesalahan saat mengambil data order header'; $this->sys_error($message); exit; } //echo $this->db->last_query(); $x_data_array = $query_orderheader->row_array(); $lab_number = $x_data_array['T_OrderHeaderLabNumber']; $genqrcode = $this->genqrcode($lab_number, $header_id); $genpatientqrcode = $this->genpatientqrcode($lab_number); $sql = "SELECT COUNT(DISTINCT FisikTemplateID) as jumlah_fisik_template FROM t_orderheader JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID AND T_OrderDetailIsActive = 'Y' JOIN nat_test ON Nat_TestCode = T_OrderDetailT_TestCode AND Nat_TestIsActive = 'Y' JOIN fisik_map_test_template ON Fisik_MapTestTemplateNat_TestID = Nat_TestID AND Fisik_MapTestTemplateIsActive = 'Y' JOIN fisik_template_mapping ON Fisik_MapTestTemplateFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingIsActive = 'Y' JOIN fisik_template_mapping_detail ON FisikTemplateMappingDetailFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingDetailIsActive = 'Y' JOIN fisik_template ON FisikTemplateID = FisikTemplateMappingDetailFisikTemplateID AND FisikTemplateIsActive = 'Y' AND ( FisikTemplateType = 'Riwayat' OR FisikTemplateType = 'K3' ) WHERE T_OrderHeaderID = ?"; $query_orderheader = $this->db->query($sql, [$header_id]); if (!$query_orderheader) { $this->sys_error_db(["status" => "ERR", "message" => "select t_orderheader | " . $this->db->error()["message"], "debug" => $this->db->last_query()]); exit; } $dt_jumlah_fisik_template = $query_orderheader->row_array(); $jumlah_fisik_template = $dt_jumlah_fisik_template['jumlah_fisik_template']; if ($jumlah_fisik_template > 0) { $genformqrcode = ''; $uuid = ''; $get_uuid = $this->generate_code_form($preregister_id, $header_id); if ($get_uuid && $get_uuid['uuid'] != '') { $uuid = $get_uuid['uuid']; $genformqrcode = $this->genformqrcode($uuid); } } $this->db->trans_commit(); $get_order_header = $this->get_order_header($header_id); if (!$get_order_header['status']) { $this->sys_error($get_order_header['message']); exit; } $order_header = $get_order_header['data']; $get_order_detail = $this->get_order_detail($header_id); if (!$get_order_detail['status']) { $this->sys_error($get_order_detail['message']); exit; } $order_detail = $get_order_detail['data']; $get_deliveries = $this->get_deliveries_by_order($header_id); if (!$get_deliveries['status']) { $this->sys_error($get_deliveries['message']); exit; } $order_delivery = $get_deliveries['data']; $get_order_promises = $this->get_order_promises($header_id); if (!$get_order_promises['status']) { $this->sys_error($get_order_promises['message']); exit; } $order_promise = $get_order_promises['data']; $get_details = $this->get_details($header_id); if (!$get_details['status']) { $this->sys_error($get_details['message']); exit; } $order_details = $get_details['data']; $data_log = array( 'header' => $order_header, 'detail_order' => $order_detail, 'delivery' => $order_delivery, 'promise' => $order_promise, 'details' => $order_details ); $sqllog = "INSERT INTO order_log( orderLogType, orderLogT_OrderHeaderID, orderLogJSONBefore, orderLogJSONAfter, orderLogCreated, orderLogUserID) VALUES ('REGISTER',?,'',?,now(),?)"; $querylog = $this->db_log->query($sqllog, [$header_id, json_encode($data_log), $userid]); //echo $this->db_log->last_query(); if (!$querylog) { $prm_log = ['INSERT_ORDER_LOG', 'order/save']; $insert_log_error = $this->insert_log_error($this->db_log->last_query(), $prm_log); $this->db->trans_rollback(); $message = 'Terjadi kesalahan saat menyimpan data log'; $this->sys_error($message); exit; } $insert_group_order = $this->insert_group_order($header_id); if (!$insert_group_order['status']) { $this->db->trans_rollback(); $this->sys_error($insert_group_order['message']); exit; } $group_order = $insert_group_order['data']; // SELECT "OK" as status, JSON_OBJECT("id", orderid, "number", "EDIT") as data, "" as message; return array( "id" => $header_id, "number" => $number ); } // private function function insert_log_error($log_sql, $params, $data = '') { // Membersihkan SQL dari \r\n dan whitespace berlebih //$clean_log_sql = trim(str_replace(["\r\n", "\r", "\n"], ' ', $log_sql)); $sql = "INSERT INTO error_log_order( ErrorLogOrderCode, ErrorLogOrderFnName, ErrorLogOrderDescription, ErrorLogOrderData, ErrorLogOrderCreated ) VALUES( ?,?,?,?,NOW() )"; $query = $this->db_log->query($sql, [$params[0], $params[1], $log_sql, json_encode($data)]); //echo $this->db_log->last_query(); if (!$query) { return false; } return true; } function save_order_header($header, $userid) { $return = [ "status" => true, "message" => "", "data" => [] ]; $this->db->trans_begin(); $sql = "SELECT fn_numbering('L') xnumber"; $query = $this->db->query($sql); if (!$query) { $prm_log = ['SELECT_FN_NUMBERING_CPONE_TRANSACTION', 'order/save']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); $return['status'] = false; $return['message'] = 'Terjadi kesalahan saat membuat nomor transaksi'; $this->db->trans_rollback(); return $return; } $rows_no_trans = $query->result_array(); //get no trans $no_trans = $rows_no_trans[0]['xnumber']; //insert header $sql_header = "INSERT INTO t_orderheader ( T_OrderHeaderDate, T_OrderHeaderLabNumber, T_OrderHeaderM_PatientID, T_OrderHeaderM_CompanyID, T_OrderHeaderMgm_McuID, T_OrderHeaderM_MouID, T_OrderHeaderM_PatientAge, T_OrderHeaderSenderM_DoctorID, T_OrderHeaderSenderM_DoctorAddressID, T_OrderHeaderPjM_DoctorID, T_OrderHeaderPj2M_DoctorID, T_OrderHeaderM_LangID, T_OrderHeaderLangIsSI, T_OrderHeaderIsCito, T_OrderHeaderNat_CitoID, T_OrderHeaderDiagnose, T_OrderHeaderDoctorNote, T_OrderHeaderFoNote, T_OrderHeaderFoNoteM_UserID, T_OrderHeaderReceivedSample, T_OrderHeaderQueue, T_OrderHeaderCreated, T_OrderHeaderCreatedUserID, T_OrderHeaderLastUpdated ) VALUES (NOW(),?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW(),?,NOW())"; $prm_header = [ $no_trans, $header['patient_id'], $header['company_id'], 0, $header['mou_id'], $header['age'], $header['sender_doctor_id'], $header['sender_address_id'], $header['pj_doctor_id'], 0, $header['lang_id'], $header['lang_si'], $header['is_cito'], $header['is_cito'] == 'N' ? 0 : $header['cito_id'], $header['diagnose'], $header['doctor_note'], $header['fo_note'], $header['fo_note'] != '' ? $userid : 0, $header['received_sample'], $header['queue'], $userid ]; $query_header = $this->db->query($sql_header, $prm_header); if (!$query_header) { $dt_log = ['data' => $prm_header, 'error' => $this->db->error()]; $prm_log = ['INSERT_T_ORDERHEADER', 'order/save_order_header']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log, $dt_log); $this->db->trans_rollback(); $return = [ "status" => false, "message" => "Terjadi kesalahan saat menyimpan data header", "data" => [] ]; return $return; } //get header id $header_id = $this->db->insert_id(); $sql = "SELECT CONCAT(IF(M_TitleID is null, '', concat(M_TitleName, ' ')),IFNULL(M_PatientPrefix,''),' ',M_PatientName,' ',IFNULL(M_PatientSuffix,'')) as full_patient_name FROM m_patient LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID WHERE M_PatientID = ? LIMIT 1"; $query_patient = $this->db->query($sql, [$header['patient_id']]); if (!$query_patient) { $prm_log = ['SELECT_M_PATIENT', 'order/save_order_header']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); $this->db->trans_rollback(); } $rows_patient = $query_patient->row_array(); $full_patient_name = $rows_patient['full_patient_name']; $sql = "INSERT INTO t_orderheaderaddon ( T_OrderHeaderAddOnT_OrderHeaderID, T_OrderHeaderAddOnSecondM_LangID, T_OrderHeaderAddOnSecondLangIsSI, T_OrderHeaderAddOnAliasDoctorName, T_OrderHeaderAddOnAliasDoctorAddress, T_OrderHeaderAddOnOnlySampleTime, T_OrderHeaderAddOnPatientMcu, T_OrderHeaderAddOnFullPatientName, T_OrderHeaderAddOnCreated, T_OrderHeaderAddOnCreatedUserID ) VALUES( ?,?,?,?,?,?,?,?,NOW(),? )"; $prm_addon = [ $header_id, $header['lang_id_2'], $header['lang_si_2'], $header['alias_doctor_name'], $header['alias_doctor_address'], $header['received_sample']['flag'] == 'Y' ? $header['received_sample']['time'] : null, intval($header['pre_register_id']) > 0 ? 'Y' : 'N', $full_patient_name, $userid ]; $query_addon = $this->db->query($sql, $prm_addon); if (!$query_addon) { $prm_log = ['INSERT_T_ORDERHEADERADDON', 'order/save_order_header']; $xsql = $this->db->last_query(); $dt_log = ['data' => $prm_addon, 'error' => $this->db->error()]; $log_error = $this->insert_log_error($xsql, $prm_log, $dt_log); $this->db->trans_rollback(); $return = [ "status" => false, "message" => "Terjadi kesalahan saat menyimpan data header addon", "data" => [] ]; return $return; } $sqlheaderlang = "INSERT INTO t_orderheaderlang (T_OrderHeaderLangT_OrderHeaderID, T_OrderHeaderLangM_LangID, T_OrderHeaderLangCreated, T_OrderHeaderLangCreatedUserID, T_OrderHeaderLangLastUpdated, T_OrderHeaderLangLastUpdatedUserID) VALUES(?,?,NOW(),?,NOW(),?)"; $prm_header_lang = [ $header_id, $header['lang_id_2'] != 0 ? $header['lang_id_2'] : $header['lang_id'], $userid, $userid ]; $query_header_lang = $this->db->query($sqlheaderlang, $prm_header_lang); if (!$query_header_lang) { $prm_log = ['INSERT_T_ORDERHEADER_LANG', 'order/save']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); $this->db->trans_rollback(); $return = [ "status" => false, "message" => "Terjadi kesalahan saat menyimpan data header lang", "data" => [] ]; return $return; } $sql = "UPDATE m_patient SET M_PatientNote = ?, M_PatientLastUpdatedUserID = ?, M_PatientLastUpdated = NOW() WHERE M_PatientID = ?"; $query_patient_note = $this->db->query($sql, [$header['patient_note'], $userid, $header['patient_id']]); if (!$query_patient_note) { $dt_log = ['data' => $header['patient_note'], 'patient_id' => $header['patient_id'], 'error' => $this->db->error()]; $prm_log = ['UPDATE_M_PATIENT', 'order/save_order_header']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log, $dt_log); $this->db->trans_rollback(); $return = [ "status" => false, "message" => "Terjadi kesalahan saat menyimpan data patient note", "data" => [] ]; return $return; } $this->db->trans_commit(); $return['data'] = [ "header_id" => $header_id, "number" => $no_trans ]; return $return; } function save_order_detail($details, $header_id, $userid) { $return = [ "status" => true, "message" => "", "data" => [] ]; $this->db->trans_begin(); $tests = []; foreach ($details as $k => $v) { if ($v['t_ispacket'] == 'Y') { $sql = "SELECT * FROM ss_price_mou WHERE packet_id = {$v['t_packetid']} AND is_packet = 'Y'"; $query = $this->db->query($sql); if (!$query) { $message = "Terjadi kesalahan saat memilih data test price"; $prm_log = ['SELECT_SS_PRICE_MOU', 'order/save_order_detail']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log, $v); $this->db->trans_rollback(); $return = [ "status" => false, "message" => $message, "data" => [] ]; return $return; } $dt_test_price = $query->row_array(); $dt_test_price['child_test'] = json_decode($dt_test_price['child_test'], true); //print_r($dt_test_price); $tests[] = $dt_test_price; } else { $sql = "SELECT * FROM t_test WHERE T_TestID = {$v['t_id']}"; $query = $this->db->query($sql); if (!$query) { $message = "Terjadi kesalahan saat memilih data test"; $prm_log = ['SELECT_T_TEST', 'order/save_order_detail']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log, $v); $this->db->trans_rollback(); $return = [ "status" => false, "message" => $message, "data" => [] ]; return $return; } $dt_test = $query->row_array(); $dt_test_price = $v; $dt_test_price['child_test'] = []; $dt_test_price['T_TestID'] = $dt_test['T_TestID']; $dt_test_price['T_TestName'] = $dt_test['T_TestName']; $dt_test_price['px_type'] = $v['t_packettype']; $dt_test_price['T_PriceAmount'] = $v['t_price']; $dt_test_price['T_PriceDisc'] = $v['t_disc']; $dt_test_price['T_PriceDiscRp'] = $v['t_discrp']; $dt_test_price['T_PriceSubTotal'] = $v['t_price'] - (($v['t_price'] * $v['t_disc'] / 100) + $v['t_disc_rp']); $dt_test_price['T_PriceTotal'] = $dt_test_price['T_PriceSubTotal']; $tests[] = $dt_test_price; } } // print_r($tests); // exit; foreach ($tests as $k => $detail) { $sql_orderdetailorder = "INSERT INTO t_orderdetailorder( T_OrderDetailOrderT_OrderHeaderID, T_OrderDetailOrderT_TestID, T_OrderDetailOrderT_TestName, T_OrderDetailOrderIsPacket, T_OrderDetailOrderPacketType, T_OrderDetailOrderT_PacketID, T_OrderDetailOrderT_PacketName, T_OrderDetailOrderT_PriceAmount, T_OrderDetailOrderT_PriceDisc, T_OrderDetailOrderT_PriceDiscRp, T_OrderDetailOrderT_PriceSubTotal, T_OrderDetailOrderT_PriceTotal, T_OrderDetailOrderCreated, T_OrderDetailOrderCreatedUserID, T_OrderDetailOrderJsonChildren ) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,NOW(),?,?)"; $prm_detail_order = [ $header_id, $detail['px_type'] == 'PX' ? $detail['T_TestID'] : '', $detail['px_type'] == 'PX' ? $detail['T_TestName'] : '', $detail['px_type'] != 'PX' ? 'Y' : 'N', $detail['px_type'] != 'PX' ? $detail['px_type'] : 'PX', $detail['px_type'] != 'PX' ? $detail['T_TestID'] : '0', $detail['px_type'] != 'PX' ? $detail['T_TestName'] : '', $detail['T_PriceAmount'], $detail['T_PriceDisc'], $detail['T_PriceDiscRp'], $detail['T_PriceSubTotal'], $detail['T_PriceTotal'], $userid, json_encode($detail['child_test']) ]; $query_detail_order = $this->db->query($sql_orderdetailorder, $prm_detail_order); if (!$query_detail_order) { $prm_log = ['INSERT_T_ORDERDETAILORDER', 'order/save_order_detail']; $xsql = $this->db->last_query(); $dt_log = ['data' => $detail, 'error' => $this->db->error()]; $log_error = $this->insert_log_error($xsql, $prm_log, $dt_log); $this->db->trans_rollback(); $return = [ "status" => false, "message" => "Terjadi kesalahan saat menyimpan data detail order 1", "data" => [] ]; return $return; } $detail_order_id = $this->db->insert_id(); if ($detail['px_type'] != 'PX') { if (count($detail['child_test']) == 0) { $message = "Detail packet tidak boleh kosong"; $prm_log = ['INSERT_T_ORDERDETAILORDER', 'order/save_order_detail']; $dt_log = json_encode($detail); $log_error = $this->insert_log_error($dt_log, $prm_log, $detail); $this->db->trans_rollback(); $return = [ "status" => false, "message" => $message, "data" => [] ]; return $return; } foreach ($detail['child_test'] as $k => $child_test_packet) { $child_test_packet['test_id'] = $child_test_packet['T_TestID']; $child_test_packet['test_name'] = $child_test_packet['T_TestName']; $detail_insert = $this->insert_order_detail($header_id, $detail_order_id, $child_test_packet, $userid); if ($detail_insert['status'] == 'N') { $message = $detail_insert['message']; $this->db->trans_rollback(); $return = [ "status" => false, "message" => $message, "data" => [] ]; return $return; } } } else { $detail_insert = $this->insert_order_detail($header_id, $detail_order_id, $detail, $userid); if ($detail_insert['status'] == 'N') { $message = "Terjadi kesalahan saat menyimpan data detail order 2" . $detail['test_name']; $this->db->trans_rollback(); $return = [ "status" => false, "message" => $message, "data" => [] ]; return $return; } } } $this->db->trans_commit(); return $return; } function insert_order_detail($header_id, $detail_order_id, $detail, $userid) { $this->db->trans_begin(); // Buat array untuk informasi error/success $result = [ 'status' => 'Y', 'message' => 'Success', 'test_name' => isset($detail['T_TestName']) ? $detail['T_TestName'] : '', 'test_id' => isset($detail['T_TestID']) ? $detail['T_TestID'] : '', 'test_code' => '', 'error_type' => '', 'error_detail' => [] ]; // Cek data test $sql = "SELECT * FROM t_test WHERE T_TestID = ?"; $query = $this->db->query($sql, $detail['T_TestID']); if (!$query) { $result['status'] = 'N'; $result['message'] = 'Terjadi kesalahan saat mengambil data test'; $result['error_type'] = 'DB_QUERY_ERROR'; $prm_log = ['SELECT_T_TEST', 'order/save_order_detail']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); $this->db->trans_rollback(); $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; return $result; } $rows_test = $query->result_array(); if (count($rows_test) == 0) { $result['status'] = 'N'; $result['message'] = 'Test tidak ditemukan'; $result['error_type'] = 'TEST_NOT_FOUND'; $prm_log = ['SELECT_T_TEST', 'order/save_order_detail']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); $this->db->trans_rollback(); return $result; } $dt_test = $rows_test[0]; //print_r($dt_test); //return false; // Update dengan data test yang benar dari database $result['test_name'] = $dt_test['T_TestName']; $result['test_code'] = $dt_test['T_TestCode']; $result['test_sas_code'] = $dt_test['T_TestSasCode']; $price = isset($detail['T_PriceAmount']) ? $detail['T_PriceAmount'] : $detail['price']; $disc = isset($detail['T_PriceDisc']) ? $detail['T_PriceDisc'] : $detail['disc']; $disc_rp = isset($detail['T_PriceDiscRp']) ? $detail['T_PriceDiscRp'] : $detail['disc_rp']; $subtotal = isset($detail['T_PriceSubTotal']) ? $detail['T_PriceSubTotal'] : $detail['subtotal']; $total = isset($detail['T_PriceTotal']) ? $detail['T_PriceTotal'] : $detail['total']; $sql = "SELECT Nat_UnitID, Nat_UnitName FROM t_test JOIN nat_test ON T_TestNat_TestID = Nat_TestID JOIN nat_unit ON Nat_TestNat_UnitID = Nat_UnitID WHERE T_TestID = 2 LIMIT 1"; $dt_unit = $this->db->query($sql, $detail['T_TestID'])->row_array(); // Query insert order detail $sql_orderdetail = "INSERT INTO t_orderdetail( T_OrderDetailT_OrderHeaderID, T_OrderDetailT_OrderDetailOrderID, T_OrderDetailT_TestID, T_OrderDetailT_TestCode, T_OrderDetailT_TestSasCode, T_OrderDetailT_TestName, T_OrderDetailT_TestIsResult, T_OrderDetailT_TestIsPanel, T_OrderDetailT_TestIsPanelChildren, T_OrderDetailT_TestIsPanelChildrenPrintNota, T_OrderDetailT_TestIsPrice, T_OrderDetailIsCito, T_OrderDetailPrice, T_OrderDetailPriceForDisc, T_OrderDetailDisc, T_OrderDetailDiscAmount, T_OrderDetailDiscTotal, T_OrderDetailTotal, T_OrderDetailReq, T_OrderDetailReqNote, T_OrderDetailNat_UnitID, T_OrderDetailNat_UnitName, T_OrderDetailCreatedUserID, T_OrderDetailCreated ) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,'N','',?,?,?,NOW())"; $prm_orderdetail = [ $header_id, $detail_order_id, $dt_test['T_TestID'], $dt_test['T_TestCode'], $dt_test['T_TestSasCode'], $dt_test['T_TestName'], $dt_test['T_TestIsResult'], 'N', 'N', 'N', $dt_test['T_TestIsPrice'], 'N', $dt_test['T_TestIsPrice'] == 'N' ? 0 : $price, $dt_test['T_TestIsPrice'] == 'N' ? 0 : $price, $dt_test['T_TestIsPrice'] == 'N' ? 0 : $disc, $dt_test['T_TestIsPrice'] == 'N' ? 0 : $disc_rp, $dt_test['T_TestIsPrice'] == 'N' ? 0 : $subtotal, $dt_test['T_TestIsPrice'] == 'N' ? 0 : $total, $dt_unit['Nat_UnitID'], $dt_unit['Nat_UnitName'], $userid ]; $query_orderdetail = $this->db->query($sql_orderdetail, $prm_orderdetail); //echo $this->db->last_query(); if (!$query_orderdetail) { $result['status'] = 'N'; $result['message'] = 'Terjadi kesalahan saat menyimpan data detail order 3'; $result['error_type'] = 'INSERT_DETAIL_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['INSERT_T_ORDERDETAIL', 'order/save_order_detail']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log, $dt_test); $this->db->trans_rollback(); return $result; } // Ambil child test $sql = "SELECT * FROM t_test WHERE T_TestSasCode LIKE ? AND T_TestIsActive = 'Y' AND T_TestSasCode != ?"; $query = $this->db->query($sql, [$dt_test['T_TestSasCode'] . '%', $dt_test['T_TestSasCode']]); if (!$query) { $result['status'] = 'N'; $result['message'] = 'Terjadi kesalahan saat mengambil data child test'; $result['error_type'] = 'CHILD_TEST_QUERY_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query(), 'parent_test' => [ 'id' => $dt_test['T_TestID'], 'name' => $dt_test['T_TestName'], 'code' => $dt_test['T_TestCode'], 'sas_code' => $dt_test['T_TestSasCode'] ] ]; $prm_log = ['SELECT_CHILD_TEST', 'order/save_order_detail']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log, $result['error_detail']); $this->db->trans_rollback(); return $result; } $rows_test_child = $query->result_array(); if (count($rows_test_child) > 0) { // Tambahkan informasi jumlah child test yang ditemukan $result['child_tests_count'] = count($rows_test_child); foreach ($rows_test_child as $k_child => $test_child) { $sql = "SELECT Nat_UnitID, Nat_UnitName FROM t_test JOIN nat_test ON T_TestNat_TestID = Nat_TestID JOIN nat_unit ON Nat_TestNat_UnitID = Nat_UnitID WHERE T_TestID = ? LIMIT 1"; $dt_child_unit = $this->db->query($sql, $test_child['T_TestID'])->row_array(); $sql_orderdetail = "INSERT INTO t_orderdetail( T_OrderDetailT_OrderHeaderID, T_OrderDetailT_OrderDetailOrderID, T_OrderDetailT_TestID, T_OrderDetailT_TestCode, T_OrderDetailT_TestSasCode, T_OrderDetailT_TestName, T_OrderDetailT_TestIsResult, T_OrderDetailT_TestIsPanel, T_OrderDetailT_TestIsPanelChildren, T_OrderDetailT_TestIsPanelChildrenPrintNota, T_OrderDetailT_TestIsPrice, T_OrderDetailIsCito, T_OrderDetailPrice, T_OrderDetailPriceForDisc, T_OrderDetailDisc, T_OrderDetailDiscAmount, T_OrderDetailDiscTotal, T_OrderDetailTotal, T_OrderDetailReq, T_OrderDetailReqNote, T_OrderDetailCreated, T_OrderDetailNat_UnitID, T_OrderDetailNat_UnitName, T_OrderDetailCreatedUserID ) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,'N','',NOW(),?,?,?)"; $prm_orderdetail = [ $header_id, $detail_order_id, $test_child['T_TestID'], $test_child['T_TestCode'], $test_child['T_TestSasCode'], $test_child['T_TestName'], $test_child['T_TestIsResult'], 'N', 'N', 'N', $test_child['T_TestIsPrice'], 'N', 0, 0, 0, 0, 0, 0, $dt_child_unit['Nat_UnitID'], $dt_child_unit['Nat_UnitName'], $userid ]; // echo $this->db->last_query(); $query_child = $this->db->query($sql_orderdetail, $prm_orderdetail); if (!$query_child) { $result['status'] = 'N'; $xsql = $this->db->last_query(); $result['message'] = 'Terjadi kesalahan saat menyimpan data child test ' . $test_child['T_TestName']; $result['error_type'] = 'INSERT_CHILD_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $xsql, 'child_index' => $k_child + 1, 'total_children' => count($rows_test_child), 'child_test' => [ 'id' => $test_child['T_TestID'], 'name' => $test_child['T_TestName'], 'code' => $test_child['T_TestCode'], 'sas_code' => $test_child['T_TestSasCode'] ], 'parent_test' => [ 'id' => $dt_test['T_TestID'], 'name' => $dt_test['T_TestName'], 'code' => $dt_test['T_TestCode'], 'sas_code' => $dt_test['T_TestSasCode'] ] ]; $prm_log = ['INSERT_T_ORDERDETAIL_CHILD', 'order/save_order_detail']; $log_error = $this->insert_log_error($xsql, $prm_log, $result['error_detail']); $this->db->trans_rollback(); return $result; } } } $this->db->trans_commit(); // Jika semua proses berhasil if (count($rows_test_child) > 0) { $result['message'] = 'Berhasil menyimpan data test utama dan ' . count($rows_test_child) . ' child test'; } else { $result['message'] = 'Berhasil menyimpan data test'; } return $result; } function generate_sample_lab($header_id, $userid) { $this->db->trans_begin(); $result = [ 'status' => true, 'message' => 'Success', 'error_type' => '', 'error_detail' => [] ]; $counter_barcode = 1; $sql = "SELECT T_OrderHeaderLabNumber, T_TestID, T_SampleTypeID , T_SampleTypeSuffix, T_SampleStationIsNonLab, T_SampleStationID FROM t_orderheader JOIN t_orderdetail ON t_orderheaderid = t_orderdetailt_orderheaderid AND t_orderdetailIsActive = 'Y' JOIN t_test ON t_orderdetailt_testid = t_testid AND T_TestIsResult = 'Y' JOIN t_sampletype ON T_TestT_SampleTypeID = T_SampleTypeID JOIN t_bahan ON T_SampleTypeT_BahanID = T_BahanID JOIN t_samplestation ON T_BahanT_SampleStationID = T_SampleStationID JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultID = Group_ResultDetailGroup_ResultID AND Group_ResultIsActive = 'Y' AND Group_ResultFlagNonLab = 'N' WHERE T_OrderHeaderID = ? GROUP BY T_SampleTypeID"; $qry = $this->db->query($sql, $header_id); if (!$qry) { $err = $this->db->error(); $prm_log = ['SELECT_SAMPLE', 'order/generate_sample_lab', $err]; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat mengambil data sample'; $result['error_type'] = 'SAMPLE_QUERY_ERROR'; $result['error_detail'] = [ 'sql_error' => $err, 'last_query' => $xsql ]; $prm_log = ['SELECT_SAMPLE', 'order/generate_sample_lab']; $this->db->trans_rollback(); return $result; } $data_samples = $qry->result_array(); if (count($data_samples) > 0) { foreach ($data_samples as $k => $v) { $counter_barcode = 1; $lab_no = $v['T_OrderHeaderLabNumber']; $test_id = $v['T_TestID']; $sample_id = $v['T_SampleTypeID']; $sample_code = $v['T_SampleTypeSuffix']; $barcode = $lab_no . $sample_code; $isnonlab = $v['T_SampleStationIsNonLab']; $samplestation_id = $v['T_SampleStationID']; if ($counter_barcode == 1) { $barcode = $barcode . $counter_barcode; $sql = "INSERT INTO t_barcodelab( T_BarcodeLabT_OrderHeaderID, T_BarcodeLabBarcode, T_BarcodeLabT_SampleTypeID, T_BarcodeLabCounter) VALUES (?,?,?,?)"; $prm_barcode = [ $header_id, $barcode, $sample_id, $counter_barcode ]; $qry = $this->db->query($sql, $prm_barcode); //echo $this->db->last_query(); if (!$qry) { echo $this->db->last_query(); $err = $this->db->error(); $prm_log = ['INSERT_T_BARCODELAB', 'order/generate_sample_lab', $err]; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); $this->db->trans_rollback(); $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat menyimpan data barcode lab'; $result['error_type'] = 'BARCODE_LAB_INSERT_ERROR'; $result['error_detail'] = [ 'sql_error' => $log_error, 'last_query' => $xsql ]; return $result; } $last_id_barcode = $this->db->insert_id(); /*if ($isnonlab == "") { $sql = "INSERT INTO t_ordersample( T_OrderSampleT_OrderHeaderID, T_OrderSampleT_SampleTypeID, T_OrderSampleT_BarcodeLabID, T_OrderSampleBarcode, T_OrderSampleT_SampleStationID, T_OrderSampleCreated) VALUES (?,?,?,?,?,NOW())"; $prm_ordersample = [ $header_id, $sample_id, $last_id_barcode, $barcode, $samplestation_id ]; $qry = $this->db->query($sql, $prm_ordersample); if (!$qry) { echo $this->db->last_query(); $err = $this->db->error(); $prm_log = ['INSERT_T_ORDERSAMPLE', 'order/generate_sample_lab', $err]; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat menyimpan data sample ' . $sample_code; $result['error_type'] = 'SAMPLE_INSERT_ERROR'; $result['error_detail'] = [ 'sql_error' => $log_error, 'last_query' => $xsql ]; $this->db->trans_rollback(); return $result; } }*/ } $sql = "SELECT MAX(T_BarcodeLabCounter) as ctr FROM t_barcodelab WHERE T_BarcodeLabT_OrderHeaderID = ? AND T_BarcodeLabBarcode LIKE CONCAT(?, '%') AND T_BarcodeLabIsActive = 'Y'"; $qry = $this->db->query($sql, [$header_id, $barcode]); if ($qry) { $ctr = $qry->row()->ctr; $counter_barcode = $ctr + 1; } else { $err = $this->db->error(); $prm_log = ['SELECT_COUNTER_BARCODE', 'order/generate_sample_lab', $err]; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat mengambil data counter barcode'; $result['error_type'] = 'COUNTER_BARCODE_QUERY_ERROR'; $result['error_detail'] = [ 'sql_error' => $log_error, 'last_query' => $xsql ]; $this->db->trans_rollback(); return $result; } } } $this->db->trans_commit(); return $result; } function generate_location($header_id, $userid) { $result = [ 'status' => true, 'message' => 'Success', 'error_type' => '', 'error_detail' => [] ]; $sql = "SELECT T_SampleStationID,T_SampleStationName FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' JOIN t_sampletype ON T_TestT_SampleTypeID = T_SampleTypeID JOIN t_bahan ON T_SampleTypeT_BahanID = T_BahanID JOIN t_samplestation ON T_BahanT_SampleStationID = T_SampleStationID WHERE T_OrderDetailT_OrderHeaderID = ? GROUP BY T_SampleStationID "; $qry = $this->db->query($sql, $header_id); $data_samples = $qry->result_array(); foreach ($data_samples as $k => $v) { $sample_id = $v['T_SampleStationID']; $sql = "SELECT M_LocationID as loc_id FROM m_location WHERE M_LocationT_SampleStationID = ? ORDER BY M_LocationPriority DESC, M_LocationID ASC LIMIT 1"; $qry = $this->db->query($sql, $sample_id); if (!$qry) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat mengambil data lokasi ' . $v['T_SampleStationName']; $result['error_type'] = 'LOCATION_QUERY_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['SELECT_LOCATION', 'order/generate_location']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); //$this->db->trans_rollback(); return $result; } $loc_id = $qry->row()->loc_id; $sql = "INSERT INTO t_order_location( T_OrderLocationT_OrderHeaderID, T_OrderLocationM_LocationID, T_OrderLocationT_SampleStationID, T_OrderLocationCreated, T_OrderLocationLastUpdated, T_OrderLocationUserID) VALUES (?,?,?,NOW(),NOW(),?)"; $prm_orderlocation = [ $header_id, $loc_id, $sample_id, $userid ]; $qry = $this->db->query($sql, $prm_orderlocation); if (!$qry) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat menyimpan data lokasi'; $result['error_type'] = 'ORDER_LOCATION_INSERT_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['INSERT_T_ORDERLOCATION', 'order/generate_location']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); //$this->db->trans_rollback(); return $result; } //file_get_contents("http://127.0.0.1:9088/broadcast/sm.new." . $sample_id . "." . $mcuid . "." . $branch_id); } return $result; } function generate_req($header_id, $req, $userid) { $this->db->trans_begin(); $result = [ 'status' => true, 'message' => 'Success', 'error_type' => '', 'error_detail' => [] ]; $sql = $this->db->query("SELECT Nat_PositionID as req_id FROM nat_position WHERE Nat_PositionCode = 'FO'")->row(); $req_id = $sql->req_id; $req_status = $req['status']; $req_tmp = "0"; $req['reqs'] = json_decode($req['reqs'], true); if (count($req['reqs']) > 0) { foreach ($req['reqs'] as $value) { $req_tmp .= "," . $value; } } $reqid = "[" . $req_tmp . "]"; $sql = "INSERT INTO t_orderreq( T_OrderReqT_OrderHeaderID, T_OrderReqNat_PositionID, T_OrderReqStatus, T_OrderReqT_TestID, T_OrderReqs) VALUES (?,?,?,?,?)"; $prm_orderreq = [ $header_id, $req_id, $req_status, '[]', $reqid ]; $qry = $this->db->query($sql, $prm_orderreq); if (!$qry) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat menyimpan data request'; $result['error_type'] = 'ORDER_REQ_INSERT_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['INSERT_T_ORDERREQ', 'order/generate_req']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); //$this->db->trans_rollback(); return $result; } $this->db->trans_commit(); return $result; } function update_preregister_promise($header_id, $preregister_promise, $preregister_id, $userid) { $result = [ 'status' => true, 'message' => 'Success', 'error_type' => '', 'error_detail' => [] ]; //$this->db->trans_begin(); if (intval($preregister_id) == 0) { // generate promise baru untuk yang dari order $set_order_promise = $this->generate_order_promise($header_id); if (!$set_order_promise['status']) { $result['status'] = false; $result['message'] = $set_order_promise['message']; $result['error_type'] = $set_order_promise['error_type']; $result['error_detail'] = $set_order_promise['error_detail']; //$this->db->trans_rollback(); return $result; } } else { // hapus promise yang aktif $not_active_promise = $this->not_active_promise($header_id); // generate promise baru untuk yang dari preregister $sql = "INSERT INTO t_orderpromise(T_OrderPromiseT_OrderHeaderID, T_OrderPromiseDateTime) VALUES (?, ?)"; $query = $this->db->query($sql, [$header_id, $preregister_promise]); if (!$query) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat menyimpan data promise'; $result['error_type'] = 'INSERT_PROMISE_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['INSERT_T_ORDERPROMISE', 'order/update_preregister_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); $this->db->trans_rollback(); return $result; } $order_promise_id = $this->db->insert_id(); $sql = "UPDATE t_orderdetail SET T_OrderDetailT_OrderPromiseID = ? WHERE T_OrderDetailT_OrderHeaderID = ?"; $query = $this->db->query($sql, [$order_promise_id, $header_id]); if (!$query) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat update detail order'; $result['error_type'] = 'UPDATE_ORDER_DETAIL_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['UPDATE_T_ORDERDETAIL_PROMISE', 'order/update_preregister_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); $this->db->trans_rollback(); return $result; } $log_promise = $this->insert_log_promise('active', $header_id, $order_promise_id, $userid); if (!$log_promise['status']) { $result['status'] = false; $result['message'] = $log_promise['message']; $result['error_type'] = $log_promise['error_type']; $result['error_detail'] = $log_promise['error_detail']; } } return $result; } function generate_order_promise($orderid) { $result = [ 'status' => true, 'message' => 'Success', 'error_type' => '', 'error_detail' => [] ]; /// $this->db->trans_begin(); try { // Update existing promises to inactive $not_active_promise = $this->not_active_promise($orderid); if (!$not_active_promise['status']) { $result['status'] = false; $result['message'] = $not_active_promise['message']; $result['error_type'] = $not_active_promise['error_type']; $result['error_detail'] = $not_active_promise['error_detail']; $prm_log = ['NOT_ACTIVE_PROMISE_ERROR', 'order/generate_order_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); return $result; } // Get order details with cito information $sql_details = "SELECT b.T_OrderDetailID, b.T_OrderDetailT_TestID, b.T_OrderDetailIsCito, T_OrderHeaderIsCito, IFNULL(Nat_CitoID, 0) as Nat_CitoID, IFNULL(Nat_CitoDuration, 0) as Nat_CitoDuration FROM t_orderdetail a JOIN t_orderdetail b on b.T_OrderdetailT_OrderHeaderID = ? AND b.T_OrderDetailIsActive = 'Y' AND b.T_OrderDetailT_TestSasCode LIKE CONCAT(a.T_OrderDetailT_TestSasCode, '%') JOIN t_orderheader ON b.T_OrderDetailT_OrderHeaderID = T_OrderHeaderID LEFT JOIN nat_cito ON T_OrderHeaderIsCito = 'Y' AND T_OrderHeaderNat_CitoID = Nat_CitoID WHERE a.T_OrderDetailT_OrderHeaderID = ? AND a.T_OrderDetailIsActive = 'Y' AND a.T_OrderDetailT_TestIsPrice = 'Y'"; $query_details = $this->db->query($sql_details, [$orderid, $orderid]); if (!$query_details) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat mengambil data detail order'; $result['error_type'] = 'SELECT_ORDER_DETAIL_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['SELECT_ORDER_DETAIL_ERROR', 'order/generate_order_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); //$this->db->trans_rollback(); return $result; } $details = $query_details->result_array(); // Initialize variables $c_search = []; // Array to store dates $c_dt = []; // Array to store datetime values $c_data = []; // Array to store promise IDs $cito_tmp = null; $cito_tmp_id = null; $order_promise_ids = []; foreach ($details as $detail) { $detail_id = $detail['T_OrderDetailID']; $test_id = $detail['T_OrderDetailT_TestID']; $is_cito_d = $detail['T_OrderDetailIsCito']; $is_cito_h = $detail['T_OrderHeaderIsCito']; $cito_id = $detail['Nat_CitoID']; $cito_dur = $detail['Nat_CitoDuration']; // Handle CITO logic if ($is_cito_d == 'Y' && $is_cito_h == 'Y' && $cito_id != 0) { if ($cito_tmp === null) { $dur_hour = floor($cito_dur / 60); $dur_min = $cito_dur % 60; $tmp = date('Y-m-d H:i:s', strtotime("+{$dur_hour} hours +{$dur_min} minutes")); $cito_tmp = $tmp; // Insert CITO promise $sql_insert_cito = "INSERT INTO t_orderpromise(T_OrderPromiseT_OrderHeaderID, T_OrderPromiseDateTime) VALUES (?, ?)"; $query_insert_cito = $this->db->query($sql_insert_cito, [$orderid, $cito_tmp]); if (!$query_insert_cito) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat menyimpan data promise CITO'; $result['error_type'] = 'INSERT_CITO_PROMISE_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $this->db->trans_rollback(); return $result; } $cito_tmp_id = $this->db->insert_id(); $order_promise_ids[] = $cito_tmp_id; } // Update detail with CITO promise ID $sql_update_detail = "UPDATE t_orderdetail SET T_OrderDetailT_OrderPromiseID = ? WHERE T_OrderDetailID = ?"; $query_update_detail = $this->db->query($sql_update_detail, [$cito_tmp_id, $detail_id]); if (!$query_update_detail) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat update detail dengan promise CITO'; $result['error_type'] = 'UPDATE_DETAIL_CITO_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; //$this->db->trans_rollback(); return $result; } $log_promise = $this->insert_log_promise('active', $orderid, $cito_tmp_id, $userid); if (!$log_promise['status']) { $result['status'] = false; $result['message'] = $log_promise['message']; $result['error_type'] = $log_promise['error_type']; $result['error_detail'] = $log_promise['error_detail']; } continue; // Skip to next iteration } // Get promise for non-CITO tests $sql_promise = "SELECT fn_fo_find_promise_per_px_v2(?, ?) as promise_date"; $query_promise = $this->db->query($sql_promise, [$test_id, $orderid]); if (!$query_promise) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat mengambil data promise'; $result['error_type'] = 'SELECT_PROMISE_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['SELECT_PROMISE_ERROR', 'order/generate_order_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); return $result; } $promise_row = $query_promise->row(); $tmp = $promise_row->promise_date; // Handle null or invalid date if ($tmp == '0000-00-00 00:00:00' || $tmp == null) { $tmp = null; } if ($tmp !== null) { $tmp_d = date('Y-m-d', strtotime($tmp)); $tmp_t = date('H:i:s', strtotime($tmp)); $ln = count($c_search); if ($ln < 1) { // First entry $c_search[] = $tmp_d; $c_dt[] = $tmp; // Insert promise $sql_insert = "INSERT INTO t_orderpromise(T_OrderPromiseT_OrderHeaderID, T_OrderPromiseDateTime) VALUES (?, ?)"; $query_insert = $this->db->query($sql_insert, [$orderid, $tmp]); if (!$query_insert) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat menyimpan data promise'; $result['error_type'] = 'INSERT_PROMISE_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['INSERT_PROMISE_ERROR', 'order/generate_order_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); return $result; } $lid = $this->db->insert_id(); $order_promise_ids[] = $lid; $c_data[] = $lid; // Update detail $sql_update_detail = "UPDATE t_orderdetail SET T_OrderDetailT_OrderPromiseID = ? WHERE T_OrderDetailID = ? AND T_OrderDetailIsActive = 'Y'"; $query_update_detail = $this->db->query($sql_update_detail, [$lid, $detail_id]); if (!$query_update_detail) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat update detail dengan promise'; $result['error_type'] = 'UPDATE_DETAIL_PROMISE_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['UPDATE_DETAIL_PROMISE_ERROR', 'order/generate_order_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); return $result; } } else { // Check if date already exists $c_idx = array_search($tmp_d, $c_search); if ($c_idx !== false) { // Date exists, check time $c_t = date('H:i:s', strtotime($c_dt[$c_idx])); $c_data_tmp = $c_data[$c_idx]; if ($tmp_t > $c_t) { // Update with later time $c_dt[$c_idx] = $tmp; $sql_update_promise = "UPDATE t_orderpromise SET T_OrderPromiseDateTime = ? WHERE T_OrderPromiseID = ?"; $query_update_promise = $this->db->query($sql_update_promise, [$tmp, $c_data_tmp]); if (!$query_update_promise) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat update promise datetime'; $result['error_type'] = 'UPDATE_PROMISE_DATETIME_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['UPDATE_PROMISE_DATETIME_ERROR', 'order/generate_order_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); return $result; } } // Update detail with existing promise ID $sql_update_detail = "UPDATE t_orderdetail SET T_OrderDetailT_OrderPromiseID = ? WHERE T_OrderDetailID = ? AND T_OrderDetailIsActive = 'Y'"; $query_update_detail = $this->db->query($sql_update_detail, [$c_data_tmp, $detail_id]); if (!$query_update_detail) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat update detail dengan promise existing'; $result['error_type'] = 'UPDATE_DETAIL_EXISTING_PROMISE_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['UPDATE_DETAIL_EXISTING_PROMISE_ERROR', 'order/generate_order_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); return $result; } } else { // New date, add to arrays $c_search[] = $tmp_d; $c_dt[] = $tmp; // Insert new promise $sql_insert = "INSERT INTO t_orderpromise(T_OrderPromiseT_OrderHeaderID, T_OrderPromiseDateTime) VALUES (?, ?)"; $query_insert = $this->db->query($sql_insert, [$orderid, $tmp]); if (!$query_insert) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat menyimpan data promise baru'; $result['error_type'] = 'INSERT_NEW_PROMISE_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['INSERT_NEW_PROMISE_ERROR', 'order/generate_order_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); return $result; } $lid = $this->db->insert_id(); $c_data[] = $lid; // Update detail $sql_update_detail = "UPDATE t_orderdetail SET T_OrderDetailT_OrderPromiseID = ? WHERE T_OrderDetailID = ? AND T_OrderDetailIsActive = 'Y'"; $query_update_detail = $this->db->query($sql_update_detail, [$lid, $detail_id]); if (!$query_update_detail) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat update detail dengan promise baru'; $result['error_type'] = 'UPDATE_DETAIL_NEW_PROMISE_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['UPDATE_DETAIL_NEW_PROMISE_ERROR', 'order/generate_order_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); return $result; } } } } } if (count($c_data) > 0) { foreach ($c_data as $c_data_id) { $log_promise = $this->insert_log_promise('active', $orderid, $c_data_id, $userid); if (!$log_promise['status']) { $result['status'] = false; $result['message'] = $log_promise['message']; $result['error_type'] = $log_promise['error_type']; $result['error_detail'] = $log_promise['error_detail']; $prm_log = ['INSERT_LOG_PROMISE_ERROR', 'order/generate_order_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); } } } //$this->db->trans_commit(); return $result; } catch (Exception $e) { //$this->db->trans_rollback(); $result['status'] = false; $result['message'] = 'Terjadi kesalahan: ' . $e->getMessage(); $result['error_type'] = 'EXCEPTION'; $result['error_detail'] = [ 'exception' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine() ]; return $result; } } function not_active_promise($header_id) { $result = [ 'status' => true, 'message' => 'Success', 'error_type' => '', 'error_detail' => [] ]; $sql = "SELECT T_OrderPromiseID FROM t_orderpromise WHERE T_OrderPromiseT_OrderHeaderID = ? AND T_OrderPromiseIsActive = 'Y'"; $query = $this->db->query($sql, [$header_id]); if (!$query) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat mengambil data promise'; $result['error_type'] = 'SELECT_PROMISE_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['SELECT_PROMISE_ERROR', 'order/update_preregister_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); //$this->db->trans_rollback(); return $result; } $promise_ids = $query->result_array(); if (count($promise_ids) > 0) { foreach ($promise_ids as $promise_id) { $log_promise = $this->insert_log_promise('not_active', $header_id, $promise_id['T_OrderPromiseID'], $userid); if (!$log_promise['status']) { $result['status'] = false; $result['message'] = $log_promise['message']; $result['error_type'] = $log_promise['error_type']; $result['error_detail'] = $log_promise['error_detail']; $prm_log = ['INSERT_ORDER_LOG_PROMISE', 'order/not_active_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); return $result; } $sql = "UPDATE t_orderpromise SET T_OrderPromiseIsActive = 'N' WHERE T_OrderPromiseID = ?"; $query = $this->db->query($sql, [$promise_id['T_OrderPromiseID']]); if (!$query) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat update promise'; $result['error_type'] = 'UPDATE_PROMISE_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['UPDATE_T_ORDERPROMISE', 'order/not_active_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); return $result; } } } return $result; } function insert_log_promise($type, $header_id, $promise_id, $userid) { $result = [ 'status' => true, 'message' => 'Success', 'error_type' => '', 'error_detail' => [] ]; $sql = "SELECT T_OrderDetailID as xid, T_OrderDetailT_TestID as test_id, T_OrderDetailT_TestName as test_name, T_OrderDetailT_TestSasCode as test_sas_code FROM t_orderdetail WHERE T_OrderDetailT_OrderPromiseID = ? AND T_OrderDetailIsActive = 'Y'"; $query = $this->db->query($sql, [$promise_id['T_OrderPromiseID']]); if (!$query) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat mengambil data detail order'; $result['error_type'] = 'SELECT_ORDER_DETAIL_NOT_ACTIVE_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['SELECT_ORDER_DETAIL_NOT_ACTIVE_ERROR', 'order/insert_log_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); return $result; } $detail_ids = $query->result_array(); if (count($detail_ids) > 0) { $sql = "INSERT INTO order_log_promise( Order_LogPromiseType, Order_LogPromiseT_OrderHeaderID, Order_LogPromiseT_OrderPromiseID, Order_LogPromiseDetails, Order_LogPromiseCreatedUserID, Order_LogPromiseCreated ) VALUES ( ?, ?, ?, ?, NOW() )"; $prm_orderlogpromise = [ $type, $header_id, $promise_id, json_encode($detail_ids), $userid ]; $qry = $this->db->query($sql, $prm_orderlogpromise); if (!$qry) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat menyimpan data promise log'; $result['error_type'] = 'ORDER_LOG_PROMISE_INSERT_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['INSERT_ORDER_LOG_PROMISE', 'order/insert_log_promise']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); return $result; } } return $result; } function save_delivery($header_id, $deliveries, $userid) { $result = [ 'status' => true, 'message' => 'Success', 'error_type' => '', 'error_detail' => [] ]; $this->db->trans_begin(); if (count($deliveries) > 0) { foreach ($deliveries as $key => $delivery) { $destination = $delivery['note']; if (($delivery['delivery_code'] == 'EMAIL' || $delivery['delivery_code'] == 'WHATSAPP' || $delivery['delivery_code'] == 'TELEGRAM') && $delivery['noteplus'] != '') { $destination = $delivery['noteplus']; } $sql = "INSERT INTO t_orderdelivery( T_OrderDeliveryT_OrderHeaderID, T_OrderDeliveryM_DeliveryID, T_OrderDeliveryM_DeliveryTypeID, T_OrderDeliveryDestination, T_OrderDeliveryAddressID, T_OrderDeliveryRegionalCd, T_OrderDeliveryCreated, T_OrderDeliveryCreatedUserID ) VALUES (?,?,?,?,?,?,NOW(),?)"; $prm_orderdelivery = [ $header_id, $delivery['delivery_id'], $delivery['delivery_type_id'], $destination, $delivery['address_id'], $delivery['regional_cd'], $userid ]; $qry = $this->db->query($sql, $prm_orderdelivery); if (!$qry) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat menyimpan data delivery'; $result['error_type'] = 'ORDER_DELIVERY_INSERT_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['INSERT_T_ORDERDELIVERY', 'order/save_delivery', $delivery]; $log_error = $this->insert_log_error($this->db->last_query(), $prm_log); //$this->db->trans_rollback(); return $result; } $xdel_id = $this->db->insert_id(); if ($delivery['delivery_code'] != 'EMAIL' && $delivery['delivery_code'] != 'WHATSAPP' && $delivery['delivery_code'] != 'TELEGRAM' && $delivery['noteplus'] != '') { $sql = "INSERT INTO t_orderdeliverynote( T_OrderDeliveryNoteT_OrderDeliveryID, T_OrderDeliveryNoteValue, T_OrderDeliveryNoteCreated, T_OrderDeliveryNoteCreatedUserID ) VALUES( ?, ?, NOW(), ? )"; $prm_orderdeliverynote = [ $xdel_id, $delivery['noteplus'], $userid ]; $qry = $this->db->query($sql, $prm_orderdeliverynote); if (!$qry) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat menyimpan data delivery note'; $result['error_type'] = 'ORDER_DELIVERY_NOTE_INSERT_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['INSERT_T_ORDERDELIVERYNOTE', 'order/save_delivery', $xdel_id]; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); //$this->db->trans_rollback(); return $result; } } // Jika $delivery['delivery_type_id'] == 3 // START if ($delivery['delivery_type_id'] == 3) { $sql_header_info = "SELECT CONCAT(IFNULL(M_TitleName,''),'. ', IFNULL(M_PatientPrefix,''),M_PatientName, IFNULL(M_PatientSuffix,'')) as patient_fullname, M_CompanyName as corporate_name, CONCAT(IFNULL(M_DoctorPrefix,''),IFNULL(M_DoctorPrefix2,''),' ',M_DoctorName,IFNULL(M_DoctorSufix,''),IFNULL(M_DoctorSufix2,''),IFNULL(M_DoctorSufix3,'')) as doctor_fullname FROM t_orderheader JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN m_title ON M_PatientM_TitleID = M_TitleID JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID JOIN m_doctor ON T_OrderHeaderSenderM_DoctorID = M_DoctorID WHERE T_OrderHeaderID = ?"; $q_h = $this->db->query($sql_header_info, [$header_id]); $d_h = $q_h->row_array(); $sql_del_source = "SELECT M_DeliverySource FROM m_delivery WHERE M_DeliveryID = ?"; $q_d = $this->db->query($sql_del_source, [$delivery['delivery_id']]); $d_d = $q_d->row_array(); $recepient_type = $d_d ? strtoupper($d_d['M_DeliverySource']) : ''; if ($recepient_type == 'MOU') $recepient_type = 'COMPANY'; $type_email = 'S'; if ($recepient_type != 'PATIENT') $type_email = 'M'; $email_addresses = explode(',', $destination); foreach ($email_addresses as $email) { $email = trim($email); if ($email == '') continue; $sql_insert_email = "INSERT INTO t_send_email ( T_SendEmailT_OrderHeaderID, T_SendEmailT_OrderDeliveryID, T_SendEmailRecepient, T_SendEmailRecepientType, T_SendEmailPatientName, T_SendEmailCorporateName, T_SendEmailDoctorName, T_SendEmailType, T_SendEmailReports, T_SendEmailNarratives, T_SendEmailResponse, T_SendEmailStatus, T_SendEmailCount, T_SendEmailReceived, T_SendEmailIsActive, T_SendEmailCreated, T_SendEmailCreatedUserID, T_SendEmailLastUpdated, T_SendEmailLastUpdatedUserID ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, '[]', '', '', 'D', 0, '0000-00-00 00:00:00', 'Y', NOW(), ?, '0000-00-00 00:00:00', 0)"; $qry_email = $this->db->query($sql_insert_email, [ $header_id, $xdel_id, $email, $recepient_type, $d_h['patient_fullname'], $d_h['corporate_name'], $d_h['doctor_fullname'], $type_email, $userid ]); if (!$qry_email) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat menyimpan data send email draft'; $result['error_type'] = 'INSERT_SEND_EMAIL_ERROR'; $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; $prm_log = ['INSERT_T_SEND_EMAIL', 'order/save_delivery']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); return $result; } } } // END $sql = "INSERT INTO order_log_deliveries ( Order_LogDeliveriesT_OrderHeaderID, Order_LogDeliveriesM_DeliveryID, Order_LogDeliveriesM_DeliveryTypeID, Order_LogDeliveriesDestination, Order_LogDeliveriesAddressID, Order_LogDeliveriesRegionalCd, Order_LogDeliveriesNote, Order_LogDeliveriesCreated, Order_LogDeliveriesCreatedUserID ) VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), ?)"; $prm_orderlogdeliveries = [ $header_id, $xdel_id, $delivery['delivery_type_id'], $destination, $delivery['address_id'], $delivery['regional_cd'], $delivery['noteplus'], $userid ]; $qry = $this->db->query($sql, $prm_orderlogdeliveries); if (!$qry) { $result['status'] = false; $result['message'] = 'Terjadi kesalahan saat menyimpan data delivery log'; $result['error_type'] = 'ORDER_LOG_DELIVERY_INSERT_ERROR'; $prm_log = ['INSERT_ORDER_LOG_DELIVERIES', 'order/save_delivery']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log); $result['error_detail'] = [ 'sql_error' => $this->db->error(), 'last_query' => $this->db->last_query() ]; } } } $this->db->trans_commit(); return $result; } function insert_group_order($order_id) { $return = [ "status" => true, "message" => "", "data" => [] ]; $sql = "SELECT DISTINCT Group_ResultID, Group_ResultName, Group_Concat(T_OrderDetailID) as T_OrderDetailIDs, 0 as T_TestID FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' AND T_TestIsActive = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultIsActive = 'Y' AND Group_ResultFlagPerTest = 'N' WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' GROUP BY Group_ResultID, Group_ResultName HAVING Group_ResultID IS NOT NULL AND Group_Concat(T_OrderDetailID) IS NOT NULL UNION SELECT DISTINCT Group_ResultID as Group_ResultID, T_TestName as Group_ResultName, Group_Concat(T_OrderDetailID) as T_OrderDetailIDs, T_TestID as T_TestID FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' AND T_TestIsActive = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultIsActive = 'Y' AND Group_ResultFlagPerTest = 'Y' WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' GROUP BY T_TEstID, T_TestName HAVING T_TEstID IS NOT NULL AND Group_Concat(T_OrderDetailID) IS NOT NULL"; $query = $this->db->query($sql, [$order_id, $order_id]); if (!$query) { $dt_log = ['data' => $order_id, 'error' => $this->db->error()]; $prm_log = ['SELECT_T_ORDERGROUP', 'order/insert_group_order']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log, $dt_log); $return = [ "status" => false, "message" => "Terjadi kesalahan saat mengambil data group order", "data" => [] ]; return $return; } $data_group = $query->result_array(); $debug_query_get = $this->db->last_query(); foreach ($data_group as $key => $value) { $sql = "INSERT INTO t_orderheader_group_result ( T_OrderHeaderGroupResultT_OrderHeaderID, T_OrderHeaderGroupResultGroup_ResultID, T_OrderHeaderGroupResultGroup_ResultName, T_OrderHeaderGroupResultT_TestID, T_OrderHeaderGroupResultDetails, T_OrderHeaderGroupResultCreated ) VALUES (?, ?, ?, ?, ?, NOW())"; $query = $this->db->query($sql, [ $order_id, $value['Group_ResultID'], $value['Group_ResultName'], isset($value['T_TestID']) ? $value['T_TestID'] : 0, $value['T_OrderDetailIDs'] ]); if (!$query) { $dt_log = ['data' => $order_id, 'error' => $this->db->error(), 'debug' => $debug_query_get]; $prm_log = ['INSERT_T_ORDERHEADER_GROUP_RESULT', 'order/insert_group_order']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log, $dt_log); $return = [ "status" => false, "message" => "Terjadi kesalahan saat menyimpan data group order", "data" => [] ]; return $return; } } $return['data'] = $data_group; return $return; } //---- // get data generate function get_order_header($order_id) { $return = [ "status" => true, "message" => "", "data" => [] ]; $sql = "SELECT 'N' as M_CompanyIsAgingOnHold, '' as M_CompanyIsAgingOnHoldNote, M_CompanyIsBill, M_CompanyMinDP, pj1.M_DoctorName as doctor_pj1, pj2.M_DoctorName as doctor_pj2, sender.M_DoctorName as doctor_sender, M_DoctorAddressDescription as doctor_sender_address, M_CompanyName as order_company, T_OrderHeaderDate as order_date, T_OrderHeaderID as order_id, T_OrderHeaderLabNumber as order_no, M_MouName as order_mou, T_OrderHeaderRounding as order_rounding, T_OrderHeaderSubTotal as order_subtotal, T_OrderHeaderTotal as order_total, M_PatientNoReg as patient_mr, M_PatientName as patient_name, CONCAT(M_PatientAddressDescription,'
',IF(M_PatientAddressVillage IS NULL,'',CONCAT(M_PatientAddressVillage,', ')),IF(M_PatientAddressDistrict IS NULL,'',CONCAT(M_PatientAddressDistrict,', ')),IF(M_PatientAddressCity IS NULL,'',M_PatientAddressCity)) as patient_address, M_PatientPhone as patient_phone, M_PatientEmail as patient_email, t_orderheader.*, IFNULL(Nat_CitoName,'') as cito_name, IFNULL(Mgm_McuNumber,'') as mcu_number, IFNULL(Mgm_McuLabel,'') as mcu_label, IFNULL(Patient_SignatureUrl,'') as image_signature FROM `t_orderheader` JOIN `t_orderheaderaddon` ON T_OrderHeaderAddOnT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderAddOnIsActive = 'Y' JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN m_patientaddress ON M_PatientAddressM_PatientID = M_PatientID AND M_PatientAddressIsActive = 'Y' AND M_PatientAddressNote = 'Utama' JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID JOIN m_mou ON T_OrderHeaderM_MouID = M_MouID JOIN m_doctor pj1 ON T_OrderHeaderPjM_DoctorID = pj1.M_DoctorID LEFT JOIN m_doctor pj2 ON T_OrderHeaderPj2M_DoctorID = pj2.M_DoctorID JOIN m_doctor sender ON T_OrderHeaderSenderM_DoctorID = sender.M_DoctorID LEFT JOIN m_doctoraddress sender_address ON T_OrderHeaderSenderM_DoctorAddressID = M_DoctorAddressID LEFT JOIN nat_cito ON T_OrderHeaderNat_CitoID = Nat_CitoID LEFT JOIN mgm_mcu ON T_OrderHeaderMgm_McuID = Mgm_McuID LEFT JOIN patient_signature ON Patient_SignatureM_PatientID = M_PatientID AND Patient_SignatureM_PatientID = T_OrderHeaderM_PatientID AND Patient_SignatureIsActive = 'Y' WHERE `T_OrderHeaderID` = ? GROUP BY T_OrderHeaderID"; $query = $this->db->query($sql, [$order_id]); // echo $this->db->last_query(); if (!$query) { $dt_log = ['data' => $order_id, 'error' => $this->db->error()]; $prm_log = ['SELECT_T_ORDERHEADER', 'order/get_order_header']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log, $dt_log); $return = [ "status" => false, "message" => "Terjadi kesalahan saat mengambil data header", "data" => [] ]; return $return; } $data = $query->row_array(); $return['data'] = $data; return $return; } function get_order_detail($order_id) { $return = [ "status" => true, "message" => "", "data" => [] ]; $sql = "SELECT T_OrderDetailOrderID as d_id, T_OrderDetailOrderT_TestID as t_id, IF(T_OrderDetailOrderIsPacket = 'Y',T_OrderDetailOrderT_PacketName,T_OrderDetailOrderT_TestName) as t_name, T_OrderDetailOrderT_PriceAmount as t_price, ((T_OrderDetailOrderT_PriceDisc/100) * T_OrderDetailOrderT_PriceAmount) + T_OrderDetailOrderT_PriceDiscRp as t_disctotal, T_OrderDetailOrderT_PriceTotal as t_total FROM `t_orderdetailorder` WHERE `T_OrderDetailOrderT_OrderHeaderID` = ? AND `T_OrderDetailOrderIsActive` = 'Y'"; $query = $this->db->query($sql, [$order_id]); if (!$query) { $dt_log = ['data' => $order_id, 'error' => $this->db->error()]; $prm_log = ['SELECT_T_ORDERDETAILORDER', 'order/get_order_detail']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log, $dt_log); $return = [ "status" => false, "message" => "Terjadi kesalahan saat mengambil data detail order", "data" => [] ]; return $return; } $data = $query->result_array(); $rst = []; foreach ($data as $key => $value) { $rst[] = $value; } $return['data'] = $rst; return $return; } function get_deliveries_by_order($order_id) { $return = [ "status" => true, "message" => "", "data" => [] ]; $sql = "SELECT M_DeliveryTypeCode as xtype, M_DeliverySource as source, M_DeliveryName as label, IFNULL(T_OrderDeliveryNoteValue,T_OrderDeliveryDestination) as xdesc FROM t_orderdelivery JOIN m_deliverytype ON T_OrderDeliveryM_DeliveryTypeID = M_DeliveryTypeID JOIN m_delivery ON T_OrderDeliveryM_DeliveryID = M_DeliveryID LEFT JOIN t_orderdeliverynote ON T_OrderDeliveryNoteT_OrderDeliveryID = T_OrderDeliveryID AND T_OrderDeliveryNoteIsActive = 'Y' WHERE T_OrderDeliveryT_OrderHeaderID = ? AND T_OrderDeliveryIsActive = 'Y'"; $query = $this->db->query($sql, [$order_id]); if (!$query) { $dt_log = ['data' => $order_id, 'error' => $this->db->error()]; $prm_log = ['SELECT_T_ORDERDELIVERY', 'order/get_deliveries_by_order']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log, $dt_log); $return = [ "status" => false, "message" => "Terjadi kesalahan saat mengambil data delivery", "data" => [] ]; return $return; } $data = $query->result_array(); $rst = []; foreach ($data as $key => $value) { $rst[] = array( 'type' => $value['xtype'], 'source' => $value['source'], 'label' => $value['label'], 'desc' => $value['xdesc'] ); } $return['data'] = $rst; return $return; } function get_order_promises($order_id) { $return = [ "status" => true, "message" => "", "data" => [] ]; $sql = "SELECT *, DATE_FORMAT(T_OrderPromiseDateTime,'%d-%m-%Y %H:%i') as T_OrderPromiseDateTime_ina FROM t_orderpromise WHERE T_OrderPromiseT_OrderHeaderID = ? AND T_OrderPromiseIsActive = 'Y'"; $query = $this->db->query($sql, [$order_id]); if (!$query) { $dt_log = ['data' => $order_id, 'error' => $this->db->error()]; $prm_log = ['SELECT_T_ORDERPROMISE', 'order/get_order_promises']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log, $dt_log); $return = [ "status" => false, "message" => "Terjadi kesalahan saat mengambil data promise", "data" => [] ]; return $return; } $data = $query->result_array(); $return['data'] = $data; return $return; } function get_details($order_id) { $return = [ "status" => true, "message" => "", "data" => [] ]; $sql = "SELECT * FROM `t_orderdetail` JOIN `t_orderdetailaddon` ON T_OrderDetailAddOnT_OrderDetailID = T_OrderDetailID AND T_OrderDetailAddOnIsActive = 'Y' WHERE `T_OrderDetailT_OrderHeaderID` = ? AND `T_OrderDetailIsActive` = 'Y'"; $query = $this->db->query($sql, [$order_id]); if (!$query) { $dt_log = ['data' => $order_id, 'error' => $this->db->error()]; $prm_log = ['SELECT_T_ORDERDETAIL', 'order/get_details']; $xsql = $this->db->last_query(); $log_error = $this->insert_log_error($xsql, $prm_log, $dt_log); $return = [ "status" => false, "message" => "Terjadi kesalahan saat mengambil data details", "data" => [] ]; return $return; } $data = $query->result_array(); $rst = []; foreach ($data as $key => $value) { $rst[] = $value; } $return['data'] = $rst; return $return; } function get_report_url($code_report, $params) { $this->load->library("Reporturl"); $report_url = $this->reporturl->get_report_url_by_code($code_report, $params); if ($report_url[0]) { return $report_url[1]; } else { return null; } } // End Generate save order function do_order_log($orderHeaderID, $delivery) { $rst_id = $$orderHeaderID; $sql = "SELECT * FROM t_orderheader JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID WHERE T_OrderHeaderID = {$rst_id}"; //echo $sql; $qry = $this->db->query($sql); if (!$qry) { $this->db->trans_rollback(); echo "{$this->now()} ERR : {$db_msg}\n"; return false; } $x_header = $qry->row_array(); $sql = "SELECT * FROM t_orderdetail WHERE T_OrderDetailT_OrderHeaderID = {$rst_id} AND T_OrderDetailT_TestIsPrice = 'Y' AND T_OrderDetailIsActive = 'Y'"; $x_details = $this->db->query($sql)->result_array(); $x_details = json_encode($x_details); $x_deliveries = json_encode($delivery); $sql = "SELECT * FROM t_orderpromise WHERE T_OrderPromiseT_OrderHeaderID = {$rst_id} AND T_OrderPromiseIsActive = 'Y'"; $x_promises = $this->db->query($sql)->result_array(); $x_promises = json_encode($x_promises); $sql = "INSERT INTO order_log( OrderLogT_OrderHeaderID, OrderLogM_PatientDOB, OrderLogM_CompanyID, OrderLogM_MouID, OrderLogM_DoctorSenderID, OrderLogM_DoctorSenderAddressID, orderLogT_OrderHeaderAddOnAliasDoctorName, orderLogT_OrderHeaderAddOnAliasDoctorAddress, OrderLogAge, OrderLogFoNote, OrderLogSubtotal, OrderLogTotal, OrderLogUserID, OrderLogDetails, OrderLogDeliveries, OrderLogPromises ) VALUES( {$rst_id}, '{$x_header["M_PatientDOB"]}', {$x_header["T_OrderHeaderM_CompanyID"]}, {$x_header["T_OrderHeaderM_MouID"]}, {$x_header["T_OrderHeaderSenderM_DoctorID"]}, {$x_header["T_OrderHeaderSenderM_DoctorAddressID"]}, '{$hdr["alias_doctor"]}', '{$hdr["alias_doctor_address"]}', '{$x_header["T_OrderHeaderM_PatientAge"]}', '{$x_header["T_OrderHeaderFoNote"]}', '{$x_header["T_OrderHeaderSubTotal"]}', '{$x_header["T_OrderHeaderTotal"]}', {$this->sys_user["M_UserID"]}, '{$x_details}', '{$x_deliveries}', '{$x_promises}' )"; $this->db->query($sql); } public function update_delivery($orderID, $deliveries) { $db_msg = ""; $sql = "update t_orderdelivery set T_OrderDeliveryIsActive = 'N' where T_OrderDeliveryT_OrderHeaderID = ?"; $qry = $this->db->query($sql, [$orderID]); if (!$qry) { return "ERR Update Delivery | " . $this->db->error()["message"] . "|" . $this->db->last_query(); } foreach ($deliveries as $d) { $arr = [ "T_OrderDeliveryT_OrderHeaderID" => $orderID, "T_OrderDeliveryM_DeliveryID" => $d["T_OrderDeliveriesM_DeliveryID"], "T_OrderDeliveryM_DeliveryTypeID" => $d["T_OrderDeliveriesM_DeliveryTypeID"], "T_OrderDeliveryDestination" => $d["T_OrderDeliveriesDestination"], ]; $qry = $this->db->insert("t_orderdelivery", $arr); if (!$qry) { $db_msg .= "ERR Update Delivery | " . $this->db->error()["message"] . "|" . $this->db->last_query() . "\n"; } } return $db_msg; } }