Files
BE_CPONE/application/controllers/hs/Generate_order.php
2026-04-27 10:26:26 +07:00

2070 lines
66 KiB
PHP

<?php
ini_set("display_errors", "1");
ini_set("display_startup_errors", "1");
error_reporting(E_ALL);
/*
alter table t_transaction
add T_TransactionIsConfirmReceived varchar(1) default 'N',
add T_TransactionConfirmReceivedDate datetime default null,
add T_TransactionConfirmReceiveM_UserID int default 0,
add key(T_TransactionIsConfirmReceived),
add key(T_TransactionConfirmReceivedDate),
add key(T_TransactionConfirmReceiveM_UserID);
alter table T_Order
add T_OrderIsGenerated varchar(1) default 'N',
add T_OrderT_OrderHeaderID int,
add key (T_OrderT_OrderHeaderID),
add key (T_OrderIsGenerated);
alter table m_patient
add M_PatientIsLocal varchar(1) default 'N',
add M_PatientLocalM_PatientID int default 0,
add key (M_PatientIsLocal),
add key (M_PatientLocalM_PatientID);
*/
class Generate_order extends MY_Controller
{
var $base_url;
function __construct()
{
parent::__construct();
$this->debug = false;
$this->SENDER_DOCTOR_ID = 0;
$this->SENDER_ADDRESS_ID = 0;
$this->PJ_DOCTOR_ID = 0;
$this->KASIR_ONLINE_USER = 1500;
$this->CONFIRM_USER_ID = 0;
$this->SAMPLE_STATION_HS = 1;
$this->apdTestID = 2858;
$this->apdTestName = "Biaya APD";
$this->otherTestID = 3181;
$this->minimalTestID = 3184;
$this->otherTestName = "Biaya Lainnya (HS ke-2, APD)";
}
function get_hs_test($transactionID, $debug = "")
{
$sql = "select t_transactionHSCost, t_transactionHSCostOther, t_transactionHSCostMinOrder
from one_hs.t_transactionHS where t_TransactionHST_TransactionID=?";
$qry = $this->db->query($sql, [$transactionID]);
if (!$qry) {
$this->log("Error {$this->db->error()["message"]}");
$this->db->trans_rollback();
exit;
}
$rows = $qry->result_array();
$result = [];
$otherCost = 0;
$hsCost = 0;
$minimalCost = 0;
if (count($rows) > 0) {
$otherCost = $rows[0]["t_transactionHSCostOther"];
$hsCost = $rows[0]["t_transactionHSCost"];
$minimalCost = $rows[0]["t_transactionHSCostMinOrder"];
}
if ($otherCost > 0) {
$result[] = [
"t_id" => $this->otherTestID,
"t_cito" => "N",
"t_price" => $otherCost,
"t_disc" => 0,
"t_discrp" => 0,
"t_req" => "Y",
"t_reqnote" => "",
"t_ispacket" => "N",
"t_packettype" => "PX",
"t_packetid" => 0,
];
}
if ($minimalCost > 0) {
$result[] = [
"t_id" => $this->minimalTestID,
"t_cito" => "N",
"t_price" => $minimalCost,
"t_disc" => 0,
"t_discrp" => 0,
"t_req" => "Y",
"t_reqnote" => "",
"t_ispacket" => "N",
"t_packettype" => "PX",
"t_packetid" => 0,
];
}
if ($hsCost == 0) {
return $result;
}
//get distance
$sql = "select HS_ConfigLat,HS_ConfigLong
from one_hs.hs_config
where HS_ConfigIsActive = 'Y' limit 0,1";
$qry = $this->db->query($sql);
if (!$qry) {
$this->log("Error {$this->db->error()["message"]}");
$this->db->trans_rollback();
exit;
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->log("Error No Active HS Config");
$this->db->trans_rollback();
exit;
}
$branchLat = $rows[0]["HS_ConfigLat"];
$branchLong = $rows[0]["HS_ConfigLong"];
$sql = "select
-- one_hs.distance_v2(HS_AddressLat, HS_AddressLng, ?, ?) distance
t_transactionHSDistance distance
from one_hs.t_transactionHS
join one_hs.hs_address on t_transactionHST_TransactionID = ?
and t_transactionHSHS_AddressID = HS_AddressID
";
$qry = $this->db->query($sql, [$branchLat, $branchLong, $transactionID]);
if (!$qry) {
$this->log("Error {$this->db->error()["message"]}");
$this->db->trans_rollback();
exit;
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->log("Error No HS Address");
$this->db->trans_rollback();
exit;
}
$distance_km = round($rows[0]["distance"], 0);
// $distance_km = round($rows[0]["distance"]/1000,0);
$sql = "select HS_PriceSekaliTestID, HS_PriceDuaKaliTestID
from one_hs.hs_price where
HS_PriceIsActive = 'Y' and HS_PriceMinDistance <= ?
and HS_PriceMaxDistance >= ? ";
$this->log("distance : $distance_km km");
$qry = $this->db->query($sql, [$distance_km, $distance_km]);
if (!$qry) {
$this->log("Error {$this->db->error()["message"]}");
$this->db->trans_rollback();
exit;
}
$rows = $qry->result_array();
if (count($rows) > 0) {
$result[] = [
"t_id" => $rows[0]["HS_PriceSekaliTestID"],
"t_cito" => "N",
"t_price" => $hsCost,
"t_disc" => 0,
"t_discrp" => 0,
"t_req" => "Y",
"t_reqnote" => "",
"t_ispacket" => "N",
"t_packettype" => "PX",
"t_packetid" => 0,
];
}
if ($debug != "") {
print_r($result);
}
return $result;
}
function get_hs_test_old($transactionID)
{
$sql = "select t_transactionHSCost, t_transactionHSCostOther
from one_hs.t_transactionHS where t_TransactionHST_TransactionID=?";
$qry = $this->db->query($sql, [$transactionID]);
if (!$qry) {
$this->log("Error {$this->db->error()["message"]}");
$this->db->trans_rollback();
exit;
}
$rows = $qry->result_array();
$result = [];
$apdCost = 0;
$hsCost = 0;
if (count($rows) > 0) {
$apdCost = $rows[0]["t_transactionHSCostOther"];
$hsCost = $rows[0]["t_transactionHSCost"];
}
if ($apdCost > 0) {
$result[] = [
"t_id" => $this->apdTestID,
"t_cito" => "N",
"t_price" => $apdCost,
"t_disc" => 0,
"t_discrp" => 0,
"t_req" => "Y",
"t_reqnote" => "",
"t_ispacket" => "N",
"t_packettype" => "PX",
"t_packetid" => 0,
];
}
if ($hsCost == 0) {
return $result;
}
//get distance
$sql = "select HS_ConfigLat,HS_ConfigLong
from one_hs.hs_config
where HS_ConfigIsActive = 'Y' limit 0,1";
$qry = $this->db->query($sql);
if (!$qry) {
$this->log("Error {$this->db->error()["message"]}");
$this->db->trans_rollback();
exit;
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->log("Error No Active HS Config");
$this->db->trans_rollback();
exit;
}
$branchLat = $rows[0]["HS_ConfigLat"];
$branchLong = $rows[0]["HS_ConfigLong"];
$sql = "select
one_hs.distance_v2(HS_AddressLat, HS_AddressLng, ?, ?) distance
from one_hs.t_transactionHS
join one_hs.hs_address on t_transactionHST_TransactionID = ?
and t_transactionHSHS_AddressID = HS_AddressID
";
$qry = $this->db->query($sql, [$branchLat, $branchLong, $transactionID]);
if (!$qry) {
$this->log("Error {$this->db->error()["message"]}");
$this->db->trans_rollback();
exit;
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->log("Error No HS Address");
$this->db->trans_rollback();
exit;
}
$distance = round($rows[0]["distance"], 0);
$distance_km = round($rows[0]["distance"] / 1000, 0);
$sql = "select T_OrderDetailT_TestID
from one_hs.t_orderdetail
join one_hs.t_order on T_OrderT_TransactionID = ?
and T_OrderIsActive = 'Y'
and T_OrderDetailT_OrderID = T_OrderID
and T_OrderDetailIsActive = 'Y'
join one_hs.m_test_second_visit on T_OrderDetailT_TestID = M_TestSecondVisitT_TestID
and M_TestSecondVisitIsActive = 'Y'
";
$isSecondVisit = false;
$qry = $this->db->query($sql, [$transactionID]);
if (!$qry) {
$this->log("Error {$this->db->error()["message"]}");
$this->db->trans_rollback();
exit;
}
$rows = $qry->result_array();
if (count($rows) > 0) {
$isSecondVisit = true;
}
$sql = "select HS_PriceSekaliTestID, HS_PriceDuaKaliTestID
from one_hs.hs_price where
HS_PriceIsActive = 'Y' and HS_PriceMinDistance <= ?
and HS_PriceMaxDistance >= ? ";
$this->log("distance : $distance | $distance_km km");
$qry = $this->db->query($sql, [$distance_km, $distance_km]);
if (!$qry) {
$this->log("Error {$this->db->error()["message"]}");
$this->db->trans_rollback();
exit;
}
$rows = $qry->result_array();
if (count($rows) > 0) {
if ($isSecondVisit) {
$result[] = [
"t_id" => $rows[0]["HS_PriceDuaKaliTestID"],
"t_cito" => "N",
"t_price" => $hsCost,
"t_disc" => 0,
"t_discrp" => 0,
"t_req" => "Y",
"t_reqnote" => "",
"t_ispacket" => "N",
"t_packettype" => "PX",
"t_packetid" => 0,
];
} else {
$result[] = [
"t_id" => $rows[0]["HS_PriceSekaliTestID"],
"t_cito" => "N",
"t_price" => $hsCost,
"t_disc" => 0,
"t_discrp" => 0,
"t_req" => "Y",
"t_reqnote" => "",
"t_ispacket" => "N",
"t_packettype" => "PX",
"t_packetid" => 0,
];
}
}
return $result;
}
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];
}
function now()
{
return Date("Y-m-d H:i:s");
}
function log($msg)
{
file_put_contents("/xtmp/debug_hs_generate.log", "{$this->now()} $msg\n", FILE_APPEND);
echo "{$this->now()} $msg\n";
}
function getTestID($T_OrderHeaderID, $T_SampleTypeID)
{
$sql = "select T_OrderDetailT_TestID
from t_orderdetail
join t_test on T_OrderDetailT_OrderHeaderID = ?
and T_OrderDetailT_TestID = T_TestID
and T_TestT_SampleTypeID = ?
and T_TestIsResult = 'Y'";
$qry = $this->db->query($sql, [$T_OrderHeaderID, $T_SampleTypeID]);
if (!$qry) {
$this->log(
"Err get one_hs.t_ordersample " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$rows = $qry->result_array();
if (count($rows) > 0) {
return $rows[0]["T_OrderDetailT_TestID"];
}
return 0;
}
function generate_sample(
$orderID,
$deliveryID,
$T_OrderHeaderID,
$order = []
) {
//Sample
//join t_ordersample_receve
$sql = "select t_ordersample.*, T_OrderSampleReceiveID
from one_hs.t_ordersample
join one_hs.t_ordersample_receive
on T_OrderSampleT_OrderID=?
and T_OrderSampleReceiveHs_DeliveryOrderID = ?
and T_OrderSampleReceiveT_OrderID = T_OrderSampleT_OrderID
and T_OrderSampleReceiveT_SampleTypeID = T_OrderSampleT_SampleTypeID
and T_OrderSampleIsActive = 'Y' and T_OrderSampleReceiveIsActive = 'Y'
and T_OrderSampleReceiveIsGenerate = 'N'";
$qry = $this->db->query($sql, [$orderID, $deliveryID]);
if (!$qry) {
$this->log(
"Err get one_hs.t_ordersample " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$rows_sample = $qry->result_array();
$s_ids = "-1";
foreach ($rows_sample as $s) {
$s_ids .= "," . $s["T_OrderSampleT_SampleTypeID"];
}
$is_nonlab = [];
$arr_stationID = [];
$is_agingOnHold = [];
$arr_agingOnHoldTime = [];
if (count($rows_sample) > 0) {
$sql = "SELECT T_SampleTypeID,T_SampleStationIsNonLab, T_SampleStationID, T_SampleTypeAgingOnHold,
T_SampleTypeAgingOnHoldTime
FROM t_sampletype
JOIN t_bahan ON T_SampleTypeT_BahanID = T_BahanID
JOIN t_samplestation ON T_BahanT_SampleStationID = T_SampleStationID
WHERE
T_SampleTypeID in ($s_ids) ";
$qry = $this->db->query($sql);
if (!$qry) {
$this->log(
"Err get is none lab" .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$rows_nl = $qry->result_array();
foreach ($rows_nl as $nl) {
$is_nonlab[$nl["T_SampleTypeID"]] =
$nl["T_SampleStationIsNonLab"];
$arr_stationID[$nl["T_SampleTypeID"]] =
$nl["T_SampleStationID"];
$is_agingOnHold[$nl["T_SampleTypeID"]] =
$nl["T_SampleTypeAgingOnHold"];
$arr_agingOnHoldTime[$nl["T_SampleTypeID"]] =
$nl["T_SampleTypeAgingOnHoldTime"];
}
//echo $this->db->last_query();
}
$samplings = [];
if (count($rows_sample) > 0) {
$sampleTambahan = "";
$sr_ids = "0";
foreach ($rows_sample as $rs) {
$sr_ids .= $rs["T_OrderSampleReceiveID"];
unset($rs["T_OrderSampleReceiveID"]);
$sampleTypeID = $rs["T_OrderSampleT_SampleTypeID"];
$flagNonLab = "N";
if (isset($is_nonlab[$sampleTypeID])) {
if (trim($is_nonlab[$sampleTypeID]) != "") {
$flagNonLab = "Y";
}
}
$samplings[$sampleTypeID] = [
"userID" => $rs["T_OrderSampleUserID"],
"date" => $rs["T_OrderSampleCreated"],
"isNonLab" => $flagNonLab,
"T_TestID" => $this->getTestID(
$T_OrderHeaderID,
$sampleTypeID
),
"T_SampleStationID" => isset($arr_stationID[$sampleTypeID])
? $arr_stationID[$sampleTypeID]
: "0",
];
if ($sampleTambahan != "") {
$sampleTambahan .= ", ";
}
$sampleTambahan .= $rs["T_OrderSampleT_SampleTypeName"];
}
// echo "FO Verify : $T_OrderHeaderID <br/>";
// print_r($samplings);
$this->fo_verify($T_OrderHeaderID, $samplings, $is_agingOnHold, $arr_agingOnHoldTime);
$this->log(
$order["T_OrderQrCode"] .
" Add Sample Tambahan $sampleTambahan "
);
$sql = "update one_hs.t_ordersample_receive set T_OrderSampleReceiveIsGenerate = 'Y'
where T_OrderSampleReceiveID in ($sr_ids)";
$qry = $this->db->query($sql);
if (!$qry) {
$this->log(
"Err update isGenerate one_hs.t_ordersample " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
}
}
function process($transactionID, $deliveryID, $debug = "")
{
list($branchKelurahanID) = $this->get_branch_default();
$this->db->trans_begin();
$sql = "select distinct t_transaction.*,
t_order.*, t_orderdetail.*, t_transactionHS.*,
T_OrderHeaderLabNumber, T_OrderHeaderDate,
m_patient.*
from one_hs.t_transaction
join one_hs.t_order on
T_TransactionID = ?
and T_TransactionID = T_OrderT_TransactionID
and T_TransactionIsConfirmReceived = 'Y'
-- and T_OrderIsGenerated = 'N'
and T_TransactionIsActive = 'Y'
and T_OrderIsActive = 'Y'
join one_hs.hs_deliveryorderdetail on HS_DeliveryOrderDetailHS_DeliveryOrderID = ?
and T_TransactionID = HS_DeliveryOrderDetailT_TransactionID
and HS_DeliveryOrderDetailIsActive = 'Y'
join one_hs.m_patient on T_OrderM_PatientID = M_PatientID
join one_hs.t_transactionHS on T_TransactionID = t_transactionHST_TransactionID
and t_transactionHSIsActive = 'Y'
join one_hs.t_orderdetail on
T_OrderDetailT_OrderID = T_OrderID
and T_OrderDetailIsActive = 'Y'
left join t_orderheader on T_OrderT_OrderHeaderID = T_OrderHeaderID
-- where T_OrderT_OrderHeaderID is null
order by t_transactionHSID, T_OrderID, T_OrderDetailT_OrderID ";
$qry = $this->db->query($sql, [$transactionID, $deliveryID]);
if (!$qry) {
$this->log(
"Error : " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->log("No Pending Order for tranactionID $transactionID ");
$this->db->trans_rollback();
if ($debug != "") {
echo $this->db->last_query();
}
exit();
}
$arrTxID = [];
$arrHsID = [];
$arrOrderID = [];
$idxOrder = 0;
$transaction = [];
//Populate HS Transacion -> Order -> OrderDetail
foreach ($rows as $r) {
$transactionID = $r["T_TransactionID"];
if (!in_array($transactionID, $arrTxID)) {
$tmp_r = $r;
foreach (array_keys($r) as $k) {
if (
substr($k, 0, strlen("T_Transaction")) !=
"T_Transaction"
) {
unset($tmp_r[$k]);
}
}
$transaction = $tmp_r;
$arrTxID[] = $transactionID;
$transaction["order"] = [];
$transaction["hs"] = [];
}
$hsID = $r["t_transactionHSID"];
if (!in_array($hsID, $arrHsID)) {
$tmp_r = $r;
foreach (array_keys($r) as $k) {
if (
substr($k, 0, strlen("t_transactionHS")) !=
"t_transactionHS"
) {
unset($tmp_r[$k]);
}
}
$transaction["hs"] = $tmp_r;
$arrHsID[] = $hsID;
}
$orderID = $r["T_OrderID"];
if (!in_array($orderID, $arrOrderID)) {
$tmp_r = $r;
foreach (array_keys($r) as $k) {
if (
substr($k, 0, strlen("T_Order")) != "T_Order" &&
substr($k, 0, strlen("M_Patient")) != "M_Patient"
) {
unset($tmp_r[$k]);
}
if (
substr($k, 0, strlen("T_OrderDetail")) ==
"T_OrderDetail"
) {
unset($tmp_r[$k]);
}
}
$transaction["order"][] = $tmp_r;
$idxOrder = count($transaction["order"]) - 1;
$transaction["order"][$idxOrder]["detail"] = [];
$transaction["order"][$idxOrder]["sample"] = [];
}
$arrOrderID[] = $orderID;
// order_detail
$tmp_r = $r;
foreach (array_keys($r) as $k) {
if (substr($k, 0, strlen("T_OrderDetail")) != "T_OrderDetail") {
unset($tmp_r[$k]);
}
}
$transaction["order"][$idxOrder]["detail"][] = $tmp_r;
}
$this->CONFIRM_USER_ID =
$transaction["T_TransactionConfirmReceiveM_UserID"];
$payment_used = 0;
//Generate BizOne Order
$is_first_order = true;
$additional_hs_test = $this->get_hs_test($transactionID);
if ($debug != "") {
$this->log("Additional HS TEST : " . print_r($additional_hs_test, true));
}
foreach ($transaction["order"] as $order) {
$orderID = $order["T_OrderID"];
$T_OrderHeaderID = $order["T_OrderT_OrderHeaderID"];
if ($T_OrderHeaderID > 0) {
$this->log(
$order["T_OrderQrCode"] .
" sudah ter-generate ke " .
$order["T_OrderHeaderLabNumber"] .
" pada " .
$order["T_OrderHeaderDate"]
);
$this->generate_sample(
$orderID,
$deliveryID,
$T_OrderHeaderID,
$order
);
if ($debug != "") {
echo "Debug Rollback";
$this->db->trans_rollback();
exit();
}
$this->log("Sleep 1s\n");
sleep(1);
$this->db->trans_commit();
$this->db->trans_begin();
continue;
}
//generate order
//header
//xdelivery
//details
$this->log("Create order from " . $order["T_OrderQrCode"]);
list(
$x_status,
$msg,
$x_orderheader,
$M_PatientAddressID,
) = $this->generate_header(
$transaction["T_TransactionM_MouID"],
$order
);
if ($x_status === false) {
$this->log("Error Generate Header : " . $msg);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
//delivery
$sql =
"select * from one_hs.t_orderdeliveries where T_OrderDeliveriesT_OrderID=? and T_OrderDeliveriesIsActive ='Y'";
$qry = $this->db->query($sql, [$order["T_OrderID"]]);
if (!$qry) {
$this->log(
"Error : " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$delivery_rows = $qry->result_array();
$xdelivery = [];
foreach ($delivery_rows as $d) {
$xdel = [
"address_id" => $M_PatientAddressID,
"delivery_id" => $d["T_OrderDeliveriesM_DeliveryID"],
"delivery_type_id" =>
$d["T_OrderDeliveriesM_DeliveryTypeID"],
"senderdoctorid" => $this->SENDER_DOCTOR_ID,
"senderaddressid" => $this->SENDER_ADDRESS_ID,
"note" => str_replace("\n", "\\n", $d["T_OrderDeliveriesDestination"]),
"kelurahan" => intval($branchKelurahanID),
];
$xdelivery[] = $xdel;
}
$xdetails = $this->populate_test(
$transaction["T_TransactionM_MouID"],
$order["detail"]
);
if (count($xdetails) == 0) {
$this->log("Error Populate Test");
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$a_fix_pxr = [];
foreach ($xdetails as $idx => $d) {
if (isset($d["child_test"])) {
$a_child_test = json_decode($d["child_test"], true);
foreach ($a_child_test as $xt) {
$a_fix_pxr[] = $xt;
}
unset($xdetails[$idx]["child_test"]);
}
}
//Add Aditional HS Test
if ($is_first_order) {
$is_first_order = false;
foreach ($additional_hs_test as $add_test) {
$xdetails[] = $add_test;
}
}
$xreq = [
"status" => "Y",
"reqs" => "[]",
];
//Call SP Order
$header_json = json_encode($x_orderheader);
$delivery_json = json_encode($xdelivery);
$detail_json = json_encode($xdetails);
$req_json = json_encode($xreq);
$sql = "CALL `sp_fo_register_save_online`(
0,
'{$header_json}',
'{$delivery_json}',
'{$detail_json}',
'{$req_json}',
'{$this->CONFIRM_USER_ID}'
);";
$qry = $this->db->query($sql);
if (!$qry) {
$this->log(
"Err sp_fo_register_save_online " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$rows = $qry->result_array();
$this->clean_mysqli_connection($this->db->conn_id);
$T_OrderHeaderID = 0;
if ($debug != "") {
echo $this->db->last_query();
}
if (count($rows) > 0) {
if ($rows[0]["status"] == "ERR") {
$this->log("| Order Creation : " . $rows[0]["message"]);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
} else {
$r_data = json_decode($rows[0]["data"], true);
$T_OrderHeaderID = $r_data["id"];
$orderNo = $r_data["number"];
$this->log(
" Order {$orderNo} from {$order["T_OrderNumber"]} "
);
}
}
if ($T_OrderHeaderID == 0) {
$this->log("| Order Creation : " . $rows[0]["message"]);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
//fix pxr child price
foreach ($a_fix_pxr as $fix_t) {
$priceAmount = $fix_t["T_PriceAmount"];
$priceDisc = $fix_t["T_PriceDisc"];
$priceDiscRp = $fix_t["T_PriceDiscRp"];
$testID = $fix_t["T_TestID"];
$discTotal = ($priceDisc / 100) * $priceAmount + $priceDiscRp;
$priceTotal = $priceAmount - $discTotal;
$sql = "update t_orderdetail set
T_OrderDetailPrice = ?,
T_OrderDetailPriceForDisc =?,
T_OrderDetailDisc =?,
T_OrderDetailDiscAmount =?,
T_OrderDetailDiscTotal = ?,
T_OrderDetailTotal = ?
where T_OrderDetailT_OrderHeaderID = ?
and T_OrderDetailT_TestID = ?";
$qry = $this->db->query($sql, [
$priceAmount,
$priceAmount,
$priceDisc,
$priceDiscRp,
$discTotal,
$priceTotal,
$T_OrderHeaderID,
$testID,
]);
if (!$qry) {
$this->log(
"Err fix pxr " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
}
$this->do_order_log($T_OrderHeaderID, $delivery_json);
$sql = "select * from order_log where OrderLogT_OrderHeaderID=$T_OrderHeaderID";
//update t_order
$sql =
"update one_hs.t_order set T_OrderT_OrderHeaderID = ?, T_OrderIsGenerated='Y' where T_OrderID=?";
$qry = $this->db->query($sql, [
$T_OrderHeaderID,
$order["T_OrderID"],
]);
if (!$qry) {
$this->log(
"Err Update one_hs.t_order " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
//Update payment
$sql = "select * from one_hs.f_payment
where F_PaymentT_TransactionID=?
and F_PaymentIsActive ='Y'
order by F_PaymentID ";
$qry = $this->db->query($sql, [$transaction["T_TransactionID"]]);
if (!$qry) {
$this->log(
"Err get one_hs.f_payment " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$rows_payment = $qry->result_array();
$payments = [];
$tmp_used = $payment_used;
$tot_payment_amount = 0;
foreach ($rows_payment as $rp) {
if ($rp["F_PaymentAmount"] < $tmp_used) {
$tmp_used -= $rp["F_PaymentAmount"];
continue;
}
if ($tmp_used > 0) {
$rp["F_PaymentAmount"] -= $tmp_used;
$tmp_used = 0;
}
$payments[] = $rp;
$tot_payment_amount += $rp["F_PaymentAmount"];
}
if (count($payments) > 0) {
$OrderTotal = $this->do_pelunasan($T_OrderHeaderID, $payments);
$this->log(" Pelunasan $OrderTotal");
$payment_used = $payment_used + $OrderTotal;
}
if (count($payments) == 0) {
//get pelunasan online
$rows_payment = $this->get_duitku($transactionID);
foreach ($rows_payment as $rp) {
if ($rp["F_PaymentAmount"] < $tmp_used) {
$tmp_used -= $rp["F_PaymentAmount"];
continue;
}
if ($tmp_used > 0) {
$rp["F_PaymentAmount"] -= $tmp_used;
$tmp_used = 0;
}
$payments[] = $rp;
$tot_payment_amount += $rp["F_PaymentAmount"];
}
if ($debug != "") {
print_r($payments);
}
if (count($payments) > 0) {
$OrderTotal = $this->do_pelunasan_online($T_OrderHeaderID, $payments);
$this->log(" Pelunasan [Online] $OrderTotal");
$payment_used = $payment_used + $OrderTotal;
}
}
//Nilai Normal
$this->update_nilai_normal($T_OrderHeaderID);
$this->generate_sample(
$orderID,
$deliveryID,
$T_OrderHeaderID,
$order
);
// echo "Debug Rollback";
// $this->db->trans_rollback();
// exit();
$this->log("Sleep 1s\n");
sleep(1);
}
if ($debug != "") {
$this->db->trans_rollback();
exit;
}
$this->db->trans_commit();
//debug
}
function do_order_log($orderHeaderID, $json_delivery)
{
$sql = "SELECT *
FROM t_orderheader
JOIN m_patient ON M_PatientID = T_OrderHeaderM_PatientID
join t_orderheaderaddon on T_OrderHeaderID = T_OrderHeaderAddOnT_OrderHeaderID
WHERE
T_OrderHeaderID = {$orderHeaderID}";
//echo $sql;
$qry = $this->db->query($sql);
if (!$qry) {
$this->log(
"ERR : {$this->db->error()["message"]} | {$this->db->last_query()}\n"
);
$this->db->trans_rollback();
exit();
}
$x_header = $qry->row_array();
$sql = "SELECT *
FROM t_orderdetail
WHERE
T_OrderDetailT_OrderHeaderID = {$orderHeaderID} 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_delivery;
$sql = "SELECT *
FROM t_orderpromise
WHERE
T_OrderPromiseT_OrderHeaderID = {$orderHeaderID} AND T_OrderPromiseIsActive = 'Y'";
$qry = $this->db->query($sql);
if (!$qry) {
$this->log("ERR : {$this->db->error()["message"]}\n");
$this->db->trans_rollback();
exit();
}
$x_promises = json_encode($qry->result_array());
$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(
{$orderHeaderID},
'{$x_header["M_PatientDOB"]}',
{$x_header["T_OrderHeaderM_CompanyID"]},
{$x_header["T_OrderHeaderM_MouID"]},
{$x_header["T_OrderHeaderSenderM_DoctorID"]},
{$x_header["T_OrderHeaderSenderM_DoctorAddressID"]},
'{$x_header["T_OrderHeaderAddOnAliasDoctorName"]}',
'{$x_header["T_OrderHeaderAddOnAliasDoctorAddress"]}',
'{$x_header["T_OrderHeaderM_PatientAge"]}',
'{$x_header["T_OrderHeaderFoNote"]}',
'{$x_header["T_OrderHeaderSubTotal"]}',
'{$x_header["T_OrderHeaderTotal"]}',
{$this->CONFIRM_USER_ID},
'{$x_details}',
'{$x_deliveries}',
'{$x_promises}'
)";
$qry = $this->db->query($sql);
if (!$qry) {
$this->log("ERR : {$this->db->error()["message"]}\n");
$this->db->trans_rollback();
exit();
}
}
function fo_verify($orderID, $samplings, $is_agingOnHold, $arr_agingOnHoldTime)
{
$sql = "INSERT INTO fo_verificationsvalue (
Fo_VerificationsValueT_OrderHeaderID,
Fo_VerificationsValueFo_VerificationsLabelID,
Fo_VerificationsValueCheck,
Fo_VerificationsValueNote,
Fo_VerificationsValueUserID,
Fo_VerificationsValueCreated )
SELECT {$orderID},
Fo_VerificationsLabelID,
'Y',
'', {$this->CONFIRM_USER_ID},
NOW()
FROM fo_verificationslabel
WHERE
Fo_VerificationsLabelIsActive = 'Y' ";
$qry = $this->db->query($sql);
if (!$qry) {
$this->log(
"Err insert fo_verificationsvalue " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$sql = "call sp_fo_barcode_generate({$orderID})";
$qry = $this->db->query($sql);
if (!$qry) {
$this->log(
"Err insert call sp_fo_barcode_generate" .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$this->clean_mysqli_connection($this->db->conn_id);
$sql = "call sp_fo_barcode_generate_again_not_exist({$orderID})";
$qry = $this->db->query($sql);
if (!$qry) {
$this->log(
"Err insert call sp_fo_barcode_generate_again_not_exist " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$this->clean_mysqli_connection($this->db->conn_id);
//updata fo status
$sql = "update fo_status set Fo_StatusM_UserID = ?
where Fo_StatusT_OrderHeaderID = ? ";
$query = $this->db->query($sql, [$this->CONFIRM_USER_ID, $orderID]);
if (!$query) {
$this->log(
"Err update fo_status " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$fostatusid = 3;
$fologcode = "FO.VERIFICATION.CONFIRM";
$sql = "insert into fo_status(
Fo_StatusDate,
Fo_StatusT_OrderHeaderID,
Fo_StatusM_StatusID,
Fo_StatusM_UserID,
Fo_StatusCreated,
Fo_StatusUpdated)
values( now(), ?, ?, ?, now(),now())";
$query = $this->db->query($sql, [
$orderID,
$fostatusid,
$this->CONFIRM_USER_ID,
]);
if (!$query) {
$this->log(
"Err insert into fo_status " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$sql = "SELECT * FROM fo_verificationsvalue WHERE Fo_VerificationsValueT_OrderHeaderID = {$orderID}";
$data_log = [];
$data_log["orderid"] = $orderID;
$data_log["values"] = $this->db->query($sql)->result_array();
$data_log["note"] = "";
$json_dt_log = json_encode($data_log);
$sql = "insert into one_log.log_fo(
Log_FoDate,
Log_FoCode,
Log_FoJson,
Log_FoUserID)
values( now(), ?, ?, ?)";
$query = $this->db->query($sql, [
$fologcode,
$json_dt_log,
$this->CONFIRM_USER_ID,
]);
if (!$query) {
$this->log(
"Err insert into fo_status " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
/* T_OrderSample */
//t_ordersample
$samplingUserID = 0;
$samplingDate = "";
// $sql = "select * from t_ordersample where T_OrderSampleT_OrderHeaderID=?";
// $qry = $this->db->query($sql, [$orderID]);
// print_r($qry->result_array());
foreach ($samplings as $k => $s) {
$sampleTypeID = $k;
$userID = $s["userID"];
$sampleDate = $s["date"];
$samplingUserID = $userID;
$samplingDate = $sampleDate;
if ($s["isNonLab"] == "Y") {
$arr_so = [
"T_SamplingSoT_SampleStationID" => $s["T_SampleStationID"],
"T_SamplingSoT_TestID" => $s["T_TestID"],
"T_SamplingSoT_OrderHeaderID" => $orderID,
"T_SamplingSoProcessDate" => $samplingDate,
"T_SamplingSoProcessTime" => $samplingDate,
"T_SamplingSoProcessUserID" => $samplingUserID,
"T_SamplingSoDoneDate" => $samplingDate,
"T_SamplingSoDoneTime" => $samplingDate,
"T_SamplingSoDoneUserID" => $samplingUserID,
"T_SamplingSoFlag" => "D",
];
$qry = $this->db->insert("t_samplingso", $arr_so);
if (!$qry) {
$this->log(
"Err insert t_samplingSo $orderID | $sampleTypeID \n" .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
} else {
$set_aging_on_hold = "";
if ($is_agingOnHold[$sampleTypeID] == "Y") {
if ($arr_agingOnHoldTime[$sampleTypeID] != "") {
$set_aging_on_hold = ", T_OrderSampleReadyToProcessDateTime = now() + interval " . $arr_agingOnHoldTime[$sampleTypeID] . " minute ";
} else {
$set_aging_on_hold = ", T_OrderSampleReadyToProcessDateTime = now() ";
}
} else {
$set_aging_on_hold = ", T_OrderSampleReadyToProcessDateTime = now() ";
}
$sql = "update t_ordersample
set T_OrderSampleSampling='Y', T_OrderSampleSamplingDate = ?,
T_OrderSampleSamplingTime = ?,T_OrderSampleSamplingUserID = ?,
T_OrderSampleReceive='Y', T_OrderSampleReceiveDate = now() , T_OrderSampleReceiveTime = now(),
T_OrderSampleReceiveUserID = ?,
T_OrderSampleUserID=?
$set_aging_on_hold
where T_OrderSampleT_OrderHeaderID = ? and T_OrderSampleT_SampleTypeID =? ";
$param = [
$sampleDate,
$sampleDate,
$userID,
$this->CONFIRM_USER_ID,
$this->CONFIRM_USER_ID,
$orderID,
$sampleTypeID,
];
$qry = $this->db->query($sql, $param);
if (!$qry) {
$this->log(
"Err update t_ordersample (T_OrderHeaderID|T_SampleTypeID) $orderID | $sampleTypeID \n" .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
}
}
$sql = "INSERT INTO t_ordersamplereq(
T_OrderSampleReqT_OrderHeaderID,
T_OrderSampleReqT_SampleStationID,
T_OrderSampleReqT_OrderSampleID,
T_OrderSampleReqNat_PositionID,
T_OrderSampleReqStatus,
T_OrderSampleReqs,
T_OrderSampleReqUserID,
T_OrderSampleReqCreated
)
select {$orderID}, {$this->SAMPLE_STATION_HS},
T_OrderSampleID, 2, 'Y', '[]', T_OrderSampleReceiveUserID, now()
from t_ordersample
where T_OrderSampleT_OrderHeaderID = {$orderID}
and T_OrderSampleReceive = 'Y'
and T_OrderSampleIsActive = 'Y'
ON DUPLICATE KEY UPDATE
T_OrderSampleReqStatus = 'Y',
T_OrderSampleReqs = '[]',
T_OrderSampleReqUserID = T_OrderSampleReceiveUserID";
$qry = $this->db->query($sql);
if (!$qry) {
$this->log(
"Err insert into t_ordersamplereq " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
//t_sampling_queue_last_status
$sql = "select count(*) total from t_ordersample
where T_OrderSampleT_OrderHeaderID = ?
and T_OrderSampleIsActive = 'Y'
and T_OrderSampleReceive = 'N'";
$qry = $this->db->query($sql, [$orderID]);
if (!$qry) {
$this->log(
"Err get status t_ordersamplereq " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$rows = $qry->result_array();
$status = 2;
if (count($rows) == 0) {
$status = 5;
}
$sql = "INSERT INTO t_sampling_queue_last_status (
T_SamplingQueueLastStatusT_SampleStationID,
T_SamplingQueueLastStatusT_OrderHeaderID,
T_SamplingQueueLastStatusT_SamplingQueueStatusID,
T_SamplingQueueLastStatusUserID)
VALUES(
{$this->SAMPLE_STATION_HS},
{$orderID},
{$status},
{$samplingUserID}) ON DUPLICATE KEY UPDATE T_SamplingQueueLastStatusT_SamplingQueueStatusID = {$status}";
$qry = $this->db->query($sql);
if (!$qry) {
$this->log(
"Err insert update t_sampling_queue_last_status " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
//sample_by_step
$sql = "INSERT INTO sample_by_step(
SampleByStepM_StatusSampleCode,
SampleByStepT_OrderHeaderID,
SampleByStepT_BarcodeLabID,
SampleByStepRequirementStatus,
SampleByStepRequirements,
SampleByStepUserID,
SampleByStepDateTime
)
select 'SAMPLING.Sampling.Sampled',
T_OrderSampleT_OrderHeaderID, T_OrderSampleT_BarcodeLabID, 'Y', '[]', T_OrderSampleSamplingUserID,
concat(T_OrderSampleSamplingDate,' ', T_OrderSampleSamplingTime)
from t_ordersample
where T_OrderSampleT_OrderHeaderID = ? and T_OrderSampleIsActive = 'Y' and T_OrderSampleSampling = 'Y'";
$qry = $this->db->query($sql, [$orderID]);
if (!$qry) {
$this->log(
"Err insert sample_by_step sampling " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$sql = "INSERT INTO sample_by_step(
SampleByStepM_StatusSampleCode,
SampleByStepT_OrderHeaderID,
SampleByStepT_BarcodeLabID,
SampleByStepRequirementStatus,
SampleByStepRequirements,
SampleByStepUserID,
SampleByStepDateTime
)
select 'SAMPLING.Sampling.Received',
T_OrderSampleT_OrderHeaderID, T_OrderSampleT_BarcodeLabID, 'Y', '[]', T_OrderSampleSamplingUserID,
concat(T_OrderSampleReceiveDate,' ', T_OrderSampleReceiveTime)
from t_ordersample
where T_OrderSampleT_OrderHeaderID = ? and T_OrderSampleIsActive = 'Y' and T_OrderSampleReceive= 'Y'";
$qry = $this->db->query($sql, [$orderID]);
if (!$qry) {
$this->log(
"Err insert sample_by_step receive " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$this->log(" Update Sample [OK]");
}
function update_nilai_normal($headerID)
{
// update nilai normal
$sql = "select distinct T_OrderDetailT_OrderHeaderID id,
T_TestT_SampleTypeID sid
from t_orderdetail
join t_test on T_OrderDetailT_OrderHeaderID = ?
and T_OrderDetailIsActive = 'Y' and
T_OrderDetailT_TestID = T_TestID
and T_TestIsActive = 'Y' ";
$qry = $this->db->query($sql, [$headerID]);
if (!$qry) {
$this->log(
"Err get sampletype for update nilai normal " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
$rows = $qry->result_array();
foreach ($rows as $r) {
$sql = "call sp_sampling_set_normal(?,?)";
$qry = $this->db->query($sql, [$r["id"], $r["sid"]]);
if (!$qry) {
$this->log(
"Err update nilai normal sp_sampling_set_normal " .
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
$this->db->trans_begin();
exit();
}
}
$this->log(" Update Nilai Normal [OK]");
}
public function get_duitku($transactionID)
{
// get payment from duitku_cb
$sql = "select duitku_cb.*, pgBankM_BankAccountID,
pgBankM_PaymentTypeID
from
one_hs.duitku_cb
join one_hs.t_transaction on duitkuCbMerchantOrderID = T_TransactionNumbering
and T_TransactionID = ?
join pg_bank on duitkuCbMerchantCode = pgBankMerchantCode
and pgBankIsActive = 'Y'";
$qry = $this->db->query($sql, [$transactionID]);
if (!$qry) {
$this->log(
"ERR Get Duitku CB : {$this->db->error()["message"]} | {$this->db->last_query()}\n"
);
$this->db->trans_rollback();
exit;
}
$rows = $qry->result_array();
$payment = [];
foreach ($rows as $r) {
$payment[] = [
"F_PaymentCreated" => $r["duitkuCbCreated"],
"F_PaymentAmount" => $r["duitkuCbAmount"],
"note" => "Pg Ref # " . $r["duitkuCbReference"] . ", " . $r["pgPaymentMethodeName"],
"F_PaymentM_PaymentTypeID" => $r["pgBankM_PaymentTypeID"],
"F_PaymentM_BankAccountID" => $r["pgBankM_BankAccountID"],
"F_PaymentCardNat_BankID" => 0,
"F_PaymentEDCNat_BankID" => 0,
];
}
return $payment;
}
public function do_pelunasan_online($headerID, $payment)
{
$sql =
"select T_OrderHeaderTotal from t_orderheader where T_OrderHeaderID = ?";
$qry = $this->db->query($sql, [$headerID]);
if (!$qry) {
$this->log(
"ERR Get Total Order: {$this->db->error()["message"]} | {$this->db->last_query()}\n"
);
$this->db->trans_rollback();
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->log("ERR Get Total Order: Not Found\n");
$this->db->trans_rollback();
exit();
}
$orderTotal = $rows[0]["T_OrderHeaderTotal"];
$sumPayment = 0;
foreach ($payment as $p) {
if ($orderTotal == 0) {
break;
}
$paymentDate = $p["F_PaymentCreated"];
$paymentNote = $p["note"];
$paymentAmount = $p["F_PaymentAmount"];
$currentPayment = $orderTotal;
if ($paymentAmount < $orderTotal) {
$orderTotal = $orderTotal - $paymentAmount;
$sumPayment += $orderTotal;
$currentPayment = $paymentAmount;
} else {
$sumPayment = $orderTotal;
$orderTotal = 0;
}
if ($currentPayment == 0) {
continue;
}
$arr = [
"F_PaymentT_OrderHeaderID" => $headerID,
"F_PaymentDate" => $paymentDate,
"F_PaymentNote" => $paymentNote,
"F_PaymentTotal" => $currentPayment,
"F_PaymentM_UserID" => $this->KASIR_ONLINE_USER,
];
$qry = $this->db->insert("f_payment", $arr);
if (!$qry) {
$this->log(
"ERR Insert f_payment online : {$this->db->error()["message"]} | {$this->db->last_query()}\n"
);
$this->db->trans_rollback();
exit();
}
$paymentID = $this->db->insert_id();
$paymentTypeID = $p["F_PaymentM_PaymentTypeID"];
$edcNat_BankID = $p["F_PaymentEDCNat_BankID"];
$cardNat_BankID = $p["F_PaymentCardNat_BankID"];
$bankAccountID = $p["F_PaymentM_BankAccountID"];
$arr = [
"F_PaymentDetailF_PaymentID" => $paymentID,
"F_PaymentDetailM_PaymentTypeID" => $paymentTypeID,
"F_PaymentDetailEDCNat_BankID" => $edcNat_BankID,
"F_PaymentDetailCardNat_BankID" => $cardNat_BankID,
"F_PaymentDetailM_BankAccountID" => $bankAccountID,
"F_PaymentDetailNote" => "",
"F_PaymentDetailAmount" => $currentPayment,
"F_PaymentDetailActual" => $currentPayment,
"F_PaymentDetailUserID" => $this->CONFIRM_USER_ID,
"F_PaymentDetailChange" => 0,
];
$qry = $this->db->insert("f_paymentdetail", $arr);
if (!$qry) {
$this->log(
"ERR Insert f_payment_detail : {$this->db->error()["message"]} | {$this->db->last_query()}\n"
);
$this->db->trans_rollback();
exit();
}
}
return $sumPayment;
}
public function do_pelunasan($headerID, $payment)
{
$sql =
"select T_OrderHeaderTotal from t_orderheader where T_OrderHeaderID = ?";
$qry = $this->db->query($sql, [$headerID]);
if (!$qry) {
$this->log(
"ERR Get Total Order: {$this->db->error()["message"]} | {$this->db->last_query()}\n"
);
$this->db->trans_rollback();
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->log("ERR Get Total Order: Not Found\n");
$this->db->trans_rollback();
exit();
}
$orderTotal = $rows[0]["T_OrderHeaderTotal"];
$sumPayment = 0;
foreach ($payment as $p) {
if ($orderTotal == 0) {
break;
}
$paymentDate = $p["F_PaymentCreated"];
$paymentNote = "-";
$paymentAmount = $p["F_PaymentAmount"];
$currentPayment = $orderTotal;
if ($paymentAmount < $orderTotal) {
$orderTotal = $orderTotal - $paymentAmount;
$sumPayment += $orderTotal;
$currentPayment = $paymentAmount;
} else {
$sumPayment = $orderTotal;
$orderTotal = 0;
}
if ($currentPayment == 0) {
continue;
}
$arr = [
"F_PaymentT_OrderHeaderID" => $headerID,
"F_PaymentDate" => $paymentDate,
"F_PaymentNote" => $paymentNote,
"F_PaymentTotal" => $currentPayment,
"F_PaymentM_UserID" => $this->CONFIRM_USER_ID,
];
$qry = $this->db->insert("f_payment", $arr);
if (!$qry) {
$this->log(
"ERR Insert f_payment : {$this->db->error()["message"]} | {$this->db->last_query()}\n"
);
$this->db->trans_rollback();
exit();
}
$paymentID = $this->db->insert_id();
$paymentTypeID = $p["F_PaymentM_PaymentTypeID"];
$edcNat_BankID = $p["F_PaymentEDCNat_BankID"];
$cardNat_BankID = $p["F_PaymentCardNat_BankID"];
$bankAccountID = $p["F_PaymentM_BankAccountID"];
$arr = [
"F_PaymentDetailF_PaymentID" => $paymentID,
"F_PaymentDetailM_PaymentTypeID" => $paymentTypeID,
"F_PaymentDetailEDCNat_BankID" => $edcNat_BankID,
"F_PaymentDetailCardNat_BankID" => $cardNat_BankID,
"F_PaymentDetailM_BankAccountID" => $bankAccountID,
"F_PaymentDetailNote" => "",
"F_PaymentDetailAmount" => $currentPayment,
"F_PaymentDetailActual" => $currentPayment,
"F_PaymentDetailUserID" => $this->CONFIRM_USER_ID,
"F_PaymentDetailChange" => 0,
];
$qry = $this->db->insert("f_paymentdetail", $arr);
if (!$qry) {
$this->log(
"ERR Insert f_payment_detail : {$this->db->error()["message"]} | {$this->db->last_query()}\n"
);
$this->db->trans_rollback();
exit();
}
}
return $sumPayment;
}
public function populate_test($mouID, $details)
{
$a_test = [];
foreach ($details as $d) {
$packetID = $d["T_OrderDetailT_PacketID"];
$isCito = $d["T_OrderDetailIsCito"];
$isPacket = $packetID > 0 ? "Y" : "N";
$testID = $d["T_OrderDetailT_TestID"];
if ($isPacket == "Y") {
$sql = "select * from ss_price_mou where Ss_PriceMouM_MouID = ?
and packet_id = ? and is_packet = ? and T_PriceIsCito=?";
$qry = $this->db->query($sql, [
$mouID,
$packetID,
$isPacket,
$isCito,
]);
} else {
$sql = "select * from ss_price_mou where Ss_PriceMouM_MouID = ?
and T_TestID= ? and is_packet = ? and T_PriceIsCito=?";
$qry = $this->db->query($sql, [
$mouID,
$testID,
$isPacket,
$isCito,
]);
}
if (!$qry) {
echo "{$this->now()} ERR Populate Test : {$this->db->error()["message"]} | {$this->db->last_query()}\n";
$this->db->trans_rollback();
exit();
}
$rows = $qry->result_array();
$check_test = [];
foreach ($rows as $px) {
if ($px["px_type"] == "PR") {
$child_test = json_decode($px["child_test"], true);
foreach ($child_test as $xt) {
//check if already exists
if (in_array($xt["T_TestID"], $check_test)) continue;
$check_test[] = $xt["T_TestID"];
$a_test[] = [
"t_id" => $xt["T_TestID"],
"t_cito" => $xt["T_PriceIsCito"],
"t_price" => $xt["T_PriceAmount"],
"t_disc" => $xt["T_PriceDisc"],
"t_discrp" => $xt["T_PriceDiscRp"],
"t_req" => "Y",
"t_reqnote" => "",
"t_ispacket" => $xt["is_packet"],
"t_packettype" => "PR", //$xt["px_type"],
"t_packetid" => $xt["packet_id"],
];
}
} elseif ($px["px_type"] == "PXR") {
if (in_array($px["T_TestID"], $check_test)) continue;
$check_test[] = $px["T_TestID"];
$a_test[] = [
"t_id" => $px["T_TestID"],
"t_cito" => $px["T_PriceIsCito"],
"t_price" => $px["T_PriceAmount"],
"t_disc" => $px["T_PriceDisc"],
"t_discrp" => $px["T_PriceDiscRp"],
"t_req" => "Y",
"t_reqnote" => "",
"t_ispacket" => $px["is_packet"],
"t_packettype" => "PR",
"t_packetid" => $px["packet_id"],
"child_test" => $px["child_test"],
];
// $child_test = json_decode($px["child_test"], true);
// foreach ($child_test as $xt) {
// $a_test[] = [
// "t_id" => $xt["T_TestID"],
// "t_cito" => $xt["T_PriceIsCito"],
// "t_price" => $xt["T_PriceAmount"],
// "t_disc" => $xt["T_PriceDisc"],
// "t_discrp" => $xt["T_PriceDiscRp"],
// "t_req" => "Y",
// "t_reqnote" => "",
// "t_ispacket" => $xt["is_packet"],
// "t_packettype" => "PX", //$xt["px_type"],
// "t_packetid" => $xt["packet_id"],
// ];
// }
} else {
if (in_array($px["T_TestID"], $check_test)) continue;
$check_test[] = $px["T_TestID"];
$a_test[] = [
"t_id" => $px["T_TestID"],
"t_cito" => $px["T_PriceIsCito"],
"t_price" => $px["T_PriceAmount"],
"t_disc" => $px["T_PriceDisc"],
"t_discrp" => $px["T_PriceDiscRp"],
"t_req" => "Y",
"t_reqnote" => "",
"t_ispacket" => $px["is_packet"],
"t_packettype" => $px["px_type"],
"t_packetid" => $px["packet_id"],
];
}
}
}
return $a_test;
}
function generate_header($txMouID, $order)
{
if ($order["M_PatientM_SexID"] == "" || $order["M_PatientM_SexID"] < 1) {
$this->db->trans_rollback();
$this->log("Error M_PatientM_SexID null");
$this->log(print_r($order, true));
exit;
}
if (
$order["M_PatientIsLocal"] == "Y" &&
$order["M_PatientLocalM_PatientID"] > 0
) {
$M_PatientID = $order["M_PatientLocalM_PatientID"];
$sql = "select M_PatientAddressID from m_patientaddress
where M_PatientAddressM_PatientID = ?
and M_PatientAddressIsActive = 'Y' limit 0,1";
$qry = $this->db->query($sql, [$M_PatientID]);
if (!$qry) {
$this->log("{$this->now()} ERR get pasien address : {$this->db->error()["message"]}");
return [false, "Error Get Pasien Address M_PatientID $M_PatientID", [], 0];
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->log("{$this->now()} ERR No pasien address");
return [false, "Error M_PatientID : $M_PatientID not found", [], 0];
}
$M_PatientAddressID = $rows[0]["M_PatientAddressID"];
$this->log(
" Update Bizone M_Patient one_hs.M_PatientID {$order["M_PatientID"]}"
);
$this->update_pasien($order["M_PatientID"]);
} else {
$this->log(
" New Bizone M_Patient one_hs.M_PatientID {$order["M_PatientID"]}"
);
list($M_PatientID, $M_PatientAddressID) = $this->get_patient_by_id(
$order["M_PatientM_IdTypeID"],
$order["M_PatientIDNumber"]
);
if ($M_PatientID == 0) {
list(
$M_PatientID,
$M_PatientAddressID,
$msg,
) = $this->add_pasien($order["M_PatientID"]);
}
}
// force return false for DEBUG
// return [
// false,
// "debug generae patient " .
// $order["M_PatientIDNumber"] .
// " Not Found : " .
// $msg,
// [],
// 0,
// ];
if ($M_PatientID == 0) {
return [
false,
"Patient with ID : " .
$order["M_PatientIDNumber"] .
" Not Found : " .
$msg,
[],
0,
];
}
$fo_note = "HS : " . $order["T_OrderQrCode"];
$xheader = [
"date" => date("Y-m-d H:i:s"),
"patient_id" => $M_PatientID,
"age" => $this->get_age(
$order["M_PatientDOB"],
date("Y-m-d H:i:s")
),
"sender_doctor_id" => $this->SENDER_DOCTOR_ID,
"sender_address_id" => $this->SENDER_ADDRESS_ID,
"pj_doctor_id" => $this->PJ_DOCTOR_ID,
"company_id" => $this->get_company_id($txMouID),
"mou_id" => $txMouID,
"lang_id" => "1",
"lang_si" => "N",
"doctor_note" => "",
"fo_note" => $fo_note,
"queue" => "",
"received_sample" => "N",
"lang_id_2" => "0",
"lang_si_2" => "N",
];
return [true, "", $xheader, $M_PatientAddressID];
}
public function update_pasien($hsPatientID)
{
$sql = "select * from one_hs.m_patient where M_PatientID=?";
$qry = $this->db->query($sql, [$hsPatientID]);
if (!$qry) {
$this->log($this->db->error()["message"]);
$this->db->trans_rollback();
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->log("No one_hs M_Patient record");
$this->db->trans_rollback();
exit();
}
$pasien = $rows[0];
$arr = [
"M_PatientM_TitleID" => $pasien["M_PatientM_TitleID"],
"M_PatientName" => $pasien["M_PatientName"],
"M_PatientDOB" => $pasien["M_PatientDOB"],
"M_PatientM_SexID" => $pasien["M_PatientM_SexID"],
"M_PatientJob" => $pasien["M_PatientJob"],
"M_PatientM_IdTypeID" => $pasien["M_PatientM_IdTypeID"],
"M_PatientIDNumber" => $pasien["M_PatientIDNumber"],
"M_PatientUserID" => $this->CONFIRM_USER_ID,
];
$M_PatientID = $pasien["M_PatientLocalM_PatientID"];
$this->db->where("M_PatientID", $M_PatientID);
$qry = $this->db->update("m_patient", $arr);
if (!$qry) {
$this->log(
"Erro Update Bizone M_Patient " . $this->db->error()["message"]
);
$this->db->trans_rollback();
exit();
}
$sql = "select M_PatientAddressID
from m_patientaddress
where M_PatientAddressM_PatientID = ?
and M_PatientAddressIsActive = 'Y' order by M_PatientAddressID limit 0,1";
$qry = $this->db->query($sql, [$M_PatientID]);
if (!$qry) {
$this->log(
"Erro Get Bizone First Active M_PatientAddress " .
$this->db->error()["message"]
);
$this->db->trans_rollback();
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->log("No BizOne First M_PatientAddress record");
return;
}
$M_PatientAddressID = $rows[0]["M_PatientAddressID"];
$sql = "select * from one_hs.m_patientaddress
where M_PatientAddressM_PatientID=?
and M_PatientAddressIsActive='Y'";
$qry = $this->db->query($sql, [$hsPatientID]);
if (!$qry) {
$this->log($this->db->error()["message"]);
$this->db->trans_rollback();
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->log("No one_hs M_PatientAddress record");
return;
}
$address = $rows[0];
$arr = [
"M_PatientAddressNote" => $address["M_PatientAddressNote"],
"M_PatientAddressDescription" =>
$address["M_PatientAddressDescription"],
"M_PatientAddressM_KelurahanID" =>
$address["M_PatientAddressM_KelurahanID"],
"M_PatientAddressLastUpdated" => date("Y-m-d H:i:s"),
"M_PatientAddressUserID" => $this->CONFIRM_USER_ID,
];
$this->db->where("M_PatientAddressID", $M_PatientAddressID);
$qry = $this->db->update("m_patientaddress", $arr);
if (!$qry) {
$this->log(
"Erro Update Bizone M_PatientAddress " .
$this->db->error()["message"]
);
$this->db->trans_rollback();
exit();
}
}
public function add_pasien($hsPatientID)
{
$sql = "select * from one_hs.m_patient where M_PatientID=?";
$qry = $this->db->query($sql, [$hsPatientID]);
if (!$qry) {
$this->log($this->db->error()["message"]);
$this->db->trans_rollback();
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->log("No one_hs M_Patient record");
$this->db->trans_rollback();
exit();
}
$pasien = $rows[0];
if (
$pasien["M_PatientM_SexID"] == "" ||
$pasien["M_PatientM_SexID"] < 1
) {
$this->log("Sex ID Error one_hs M_Patient");
$this->db->trans_rollback();
exit();
}
if (
$pasien["M_PatientM_TitleID"] == "" ||
$pasien["M_PatientM_TitleID"] < 1
) {
$this->log("M_TitleID Error one_hs M_Patient");
$this->db->trans_rollback();
exit();
}
$arr = [
"M_PatientM_TitleID" => $pasien["M_PatientM_TitleID"],
"M_PatientName" => $pasien["M_PatientName"],
"M_PatientDOB" => $pasien["M_PatientDOB"],
"M_PatientM_SexID" => $pasien["M_PatientM_SexID"],
"M_PatientJob" => $pasien["M_PatientJob"],
"M_PatientM_IdTypeID" => $pasien["M_PatientM_IdTypeID"],
"M_PatientIDNumber" => $pasien["M_PatientIDNumber"],
"M_PatientUserID" => $this->CONFIRM_USER_ID,
];
$qry = $this->db->insert("m_patient", $arr);
$M_PatientID = $this->db->insert_id();
if (!$qry) {
return [
0,
0,
"Add Patient " .
$this->db->error()["message"] .
" | " .
$this->db->last_query(),
];
}
$sql =
"select * from one_hs.m_patientaddress where M_PatientAddressM_PatientID = ?
and M_PatientAddressIsActive = 'Y' order by M_PatientAddressID limit 0,1";
$qry = $this->db->query($sql, [$hsPatientID]);
if (!$qry) {
$this->log($this->db->error()["message"]);
$this->db->trans_rollback();
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->log("No one_hs M_PatientAddress record");
$this->db->trans_rollback();
exit();
}
$M_PatientAddressID = 0;
foreach ($rows as $d) {
$arr = [
"M_PatientAddressM_PatientID" => $M_PatientID,
"M_PatientAddressNote" => $d["M_PatientAddressNote"],
"M_PatientAddressDescription" =>
$d["M_PatientAddressDescription"],
"M_PatientAddressM_KelurahanID" =>
$d["M_PatientAddressM_KelurahanID"],
"M_PatientAddressUserID" => $this->CONFIRM_USER_ID,
];
$qry = $this->db->insert("m_patientaddress", $arr);
if (!$qry) {
return [$M_PatientID, 0, $this->db->error()["message"]];
}
$M_PatientAddressID = $this->db->insert_id();
}
return [$M_PatientID, $M_PatientAddressID, ""];
}
public function get_patient_by_id($idType, $idNo, $noreg = "")
{
$sql = "select * from m_patient where
(
( M_PatientM_IdTypeID=? and M_PatientIDNumber=? )
)
and M_PatientIsActive='Y'";
$qry = $this->db->query($sql, [$idType, $idNo]);
if (!$qry) {
echo "{$this->now()} ERR get pasien : {$this->db->error()["message"]}\n";
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
return [0, 0];
}
$patientID = $rows[0]["M_PatientID"];
$sql = "select M_PatientAddressID from m_patientaddress
where M_PatientAddressM_PatientID
= ? and M_PatientAddressIsActive = 'Y' limit 0,1";
$qry = $this->db->query($sql, [$patientID]);
if (!$qry) {
echo "{$this->now()} ERR get pasien address : {$this->db->error()["message"]}\n";
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
return [$patientID, 0];
}
return [$patientID, $rows[0]["M_PatientAddressID"]];
}
public function get_company_id($mouID)
{
$sql = "select * from m_mou where M_MouID=?";
$qry = $this->db->query($sql, [$mouID]);
if (!$qry) {
echo "{$this->now()} ERR get Company : {$this->db->error()["message"]}\n";
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
return 0;
}
return $rows[0]["M_MouM_CompanyID"];
}
public function get_age($dob, $order_date)
{
$sql = "select fn_global_age_count(?,?) xage";
$qry = $this->db->query($sql, [$dob, $order_date]);
if (!$qry) {
echo "{$this->now()} ERR get Age : {$this->db->error()["message"]}\n";
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
return "";
}
return $rows[0]["xage"];
}
}