Files
REG_IBL/one-api/application/controllers/one_mitra/Deliveryorder.php
2026-05-25 20:01:37 +07:00

609 lines
24 KiB
PHP

<?php
class Deliveryorder extends MY_Controller
{
var $db_regional;
var $load;
var $db;
public function __construct()
{
parent::__construct();
$this->db_regional = $this->load->database("regional", true);
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$userID = $this->sys_user['M_UserID'];
$sql_cek_token = "SELECT M_UserActiveToken
from one_mitra.m_user
WHERE M_UserID = ?
AND M_UserActiveToken IS NOT NULL";
$qry_token = $this->db->query($sql_cek_token, [$userID]);
if (!$qry_token) {
$this->sys_error('Invalid token');
exit;
}
$rows_token = $qry_token->result_array();
if (count($rows_token) == 0) {
$this->sys_error('Invalid token');
exit;
}
}
function getdeliverytype()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$sql = "SELECT
T_DeliveryTypeID AS id,
T_DeliveryTypeName AS name,
T_DeliveryTypeIsAgent AS isAgent
FROM one_mitra.t_deliverytype
WHERE T_DeliveryTypeIsActive = 'Y'";
$query = $this->db->query($sql, []);
if (!$query) {
$message = $this->db->error();
$this->sys_error($message);
exit;
}
$search = $query->result_array();
$this->sys_ok($search);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getorder()
{
try {
$prm = $this->sys_input;
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$userID = $this->sys_user['M_UserID'];
$company_id = 0;
if (isset($prm['company_id'])) {
$company_id = trim($prm["company_id"]);
$company_id = $prm['company_id'];
} else {
$this->sys_error("company_id is mandatory");
}
$regional_id = 0;
if (isset($prm['regional_id'])) {
$regional_id = trim($prm["regional_id"]);
$regional_id = $prm['regional_id'];
} else {
$this->sys_error("regional_id is mandatory");
}
$sql = "SELECT
T_OrderID AS order_id,
T_OrderNumber AS order_number,
M_PatientID AS patient_id,
M_PatientName AS patient_name,
T_OrderM_MouID AS mouID,
GROUP_CONCAT(DISTINCT T_OrderDetailTestName SEPARATOR '|') AS test,
GROUP_CONCAT(DISTINCT T_OrderDetailPacketName SEPARATOR '|') AS packet
FROM one_mitra.t_order
JOIN one_mitra.m_patient ON T_OrderM_PatientID = M_PatientID
AND M_PatientIsActive = 'Y'
LEFT JOIN one_mitra.t_orderdetail
ON T_OrderID = T_OrderDetailOrderID
AND T_OrderDetailIsActive = 'Y'
LEFT JOIN one_mitra.t_orderdetailpacket
ON T_OrderID = T_OrderDetailPacketOrderID
AND T_OrderDetailPacketIsActive = 'Y'
WHERE T_OrderM_CompanyID = ?
AND T_OrderIsActive = 'Y'
AND T_OrderS_RegionalID = ?
AND T_OrderID NOT IN (SELECT T_OrderDetailDeliveryT_OrderID FROM
one_mitra.t_orderdetaildelivery WHERE T_OrderDetailDeliveryIsActive ='Y'
AND T_OrderDetailDeliveryM_CompanyID = ?)
GROUP BY T_OrderID";
$query = $this->db->query($sql, [$company_id, $regional_id, $company_id]);
if (!$query) {
$message = $this->db->error();
$this->sys_error($message);
exit;
}
$arrOrder = $query->result_array();
$result = [];
for ($i = 0; $i < count($arrOrder); $i++) {
$test = explode('|', $arrOrder[$i]['test']);
$packet = explode('|', $arrOrder[$i]['packet']);
$sql = "SELECT
M_UserMouID as userMouID,
M_UserMouM_MouID as userMouMouID,
M_UserMouAliasName as userMouName,
M_UserMouIsDefault as userMouIsDefault
FROM one_mitra.m_user_mou
WHERE M_UserMouM_UserID = ? AND M_UserMouM_MouID = ?";
$qry = $this->db_regional->query($sql, [$userID, $arrOrder[$i]['mouID']]);
if (!$qry) {
$this->sys_error('Error get mou');
exit;
}
$mou = $qry->result_array();
$fnlMou = array();
if (count($mou) > 0) {
$fnlMou = $mou[0];
} else {
$fnlMou = array(
"userMouID" => "0",
"userMouMouID" => '0',
"userMouName" => '',
"userMouIsDefault" => ''
);
}
$result[] = [
"order_id" => $arrOrder[$i]['order_id'],
"order_number" => $arrOrder[$i]['order_number'],
"patient_id" => $arrOrder[$i]['patient_id'],
"patient_name" => $arrOrder[$i]['patient_name'],
"sample" => [],
"mou" => $fnlMou,
"bahan" => [],
"tests" => array_merge($test, $packet)
];
};
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getdestination()
{
try {
$prm = $this->sys_input;
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$sql = "SELECT
M_BranchID AS branch_id,
M_BranchCode AS branch_code,
M_BranchName branch_name
FROM m_branch
WHERE M_BranchIsActive = 'Y'";
$query = $this->db_regional->query($sql, []);
if (!$query) {
$message = $this->db_regional->error();
$this->sys_error($message);
exit;
}
$search = $query->result_array();
$this->sys_ok($search);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function addDelivery()
{
try {
$prm = $this->sys_input;
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$order = $prm['order'];
$orderDetail = $prm['order_detail'];
// T_OrderDeliveryID int(11) Auto Increment
// T_OrderDeliveryNumber varchar(25)
// T_OrderDeliveryStaffID int(11)
// T_OrderDeliveryNoRef varchar(25)
// T_OrderDeliveryDate date
// T_OrderDeliveryDestination int(11) Branch ID
// T_OrderDeliveryBoxTemperature varchar(25)
// T_OrderDeliveryT_DeliverytypeID int(11)
// T_OrderDeliveryReciptNumber varchar(40)
// T_OrderDeliveryNote tinytext
// T_OrderDeliveryIsActive char(1) [Y]
// T_OrderDeliveryCreated datetime [current_timestamp()]
// T_OrderDeliveryLastUpdated
$this->db->trans_begin();
$sql = "SELECT one_mitra.fn_numbering('SJ') as number";
$qry = $this->db->query($sql, []);
if (!$qry) {
$message = $this->db->error();
$this->db->trans_rollback();
$this->sys_error($message);
exit;
}
$number = $qry->result_array()[0]['number'];
$get2first = substr($number, 0, 2);
$getDate = strval(date("ym"));
$newNumber = $get2first . $order['branch_code'] . $getDate . substr($number, -3);
$orderDelivery = [
"T_OrderDeliveryStaffID" => $order['staff_id'],
"T_OrderDeliveryNumber" => $newNumber,
"T_OrderDeliveryNoRef" => $order['no_ref'],
"T_OrderDeliveryDate" => date('Y-m-d', strtotime($order['date'])),
"T_OrderDeliveryDestination" => $order['destination_id'],
"T_OrderDeliveryRegionalID" => $order['regional_id'],
"T_OrderDeliveryBoxTemperature" => $order['temperature'],
"T_OrderDeliveryT_DeliverytypeID" => $order['type_id'],
"T_OrderDeliveryReciptNumber" => $order['no_resi'],
"T_OrderDeliveryNote" => $order['note'],
"T_OrderDeliveryM_CompanyID" => $order['company_id'],
];
$this->db->insert('one_mitra.t_orderdelivery', $orderDelivery);
$err = $this->db->error();
if (
$err['message'] != ""
) {
$this->sys_error_db("ERROR INSERT ORDER DELIVERY", $this->db);
$this->db->trans_rollback();
exit;
}
$deliveryID = $this->db->insert_id();
for ($i = 0; $i < count($orderDetail); $i++) {
// Column Type Comment
// T_OrderDetailDeliveryID int(11) Auto Increment
// T_OrderDetailDeliveryT_OrderDeliveryID int(11)
// T_OrderDetailDeliveryT_OrderID int(11)
// T_OrderDetailDeliveryIsActive char(1) [Y]
// T_OrderDetailDeliveryCreated datetime [current_timestamp()]
// T_OrderDetailDeliveryLastUpdated
$deliveryDetail = [
"T_OrderDetailDeliveryT_OrderDeliveryID" => $deliveryID,
"T_OrderDetailDeliveryT_OrderID" => $orderDetail[$i]['order_id'],
"T_OrderDetailDeliveryM_CompanyID" => $order['company_id'],
];
$this->db->insert('one_mitra.t_orderdetaildelivery', $deliveryDetail);
$err = $this->db->error();
if (
$err['message'] != ""
) {
$this->sys_error_db("ERROR INSERT ORDER DELIVERY DETAIL", $this->db);
$this->db->trans_rollback();
exit;
}
}
$this->db->trans_commit();
$result = [
"deliveryID" => $deliveryID,
"orderNumber" => $newNumber,
];
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getdelivery()
{
try {
$prm = $this->sys_input;
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$regionalID = $this->sys_user["M_UserS_RegionalID"];
// print_r($prm);
$keyword = '%%';
if (isset($prm['keyword'])) {
$keyword = '%' . $prm['keyword'] . '%';
}
$keyword = '%%';
if (isset($prm['keyword'])) {
$keyword = '%' . $prm['keyword'] . '%';
}
$page = $prm['page'];
$rowPerPage = $prm['rpp'];
$companyID = $prm['company_id'];
$startDate = $prm['start_date'];
$endDate = $prm['end_date'];
// 1 => tanggal surat jalan
// 2 => tanggal kedatangan
$datetype = $prm['date_type'];
$datetypeSql = "T_OrderDeliveryCreated";
if (intval($datetype) == 1) {
$datetypeSql = "T_OrderDeliveryCreated";
} else if (intval($datetype) == 2) {
$datetypeSql = "T_OrderDeliveryDate";
}
$start_offset = 0;
if (isset($prm['page'])) {
if (is_numeric((int)$prm['page']) && $prm['page'] > 0) {
$start_offset = ($page - 1) * intval($rowPerPage);
}
}
$sql_total = "SELECT COUNT(T_OrderDeliveryID) AS total
FROM one_mitra.t_orderdelivery
JOIN one_mitra.m_user
ON T_OrderDeliveryStaffID = M_UserID
AND M_UserIsActive = 'Y'
JOIN m_branch
ON T_OrderDeliveryDestination = M_BranchID
AND M_BranchIsActive = 'Y'
WHERE
T_OrderDeliveryIsActive = 'Y' AND
T_OrderDeliveryM_CompanyID = ?
AND (T_OrderDeliveryNumber LIKE ?
OR M_UserUsername LIKE ? OR M_BranchName LIKE ?)
AND T_OrderDeliveryRegionalID = ?
AND $datetypeSql >= ? AND $datetypeSql <= ?";
$query_total = $this->db->query($sql_total, [$companyID, $keyword, $keyword, $keyword, $regionalID, $startDate, $endDate]);
if (!$query_total) {
$message = $this->db->error();
$this->sys_error($message);
exit;
}
$last_qry = $this->db->last_query();
$totals = $query_total->result_array()[0]['total'];
// print_r($totals);
$sql = "SELECT
T_OrderDeliveryID AS id,
DATE_FORMAT(T_OrderDeliveryDate, '%d/%m/%Y') AS date,
DATE_FORMAT(T_OrderDeliveryCreated, '%d/%m/%Y') AS date_sj,
T_OrderDeliveryNumber AS order_number,
M_UserUsername AS pic,
T_OrderDeliveryStatus AS status,
M_BranchName AS destination
FROM one_mitra.t_orderdelivery
JOIN one_mitra.m_user
ON T_OrderDeliveryStaffID = M_UserID
AND M_UserIsActive = 'Y'
JOIN m_branch
ON T_OrderDeliveryDestination = M_BranchID
AND M_BranchIsActive = 'Y'
WHERE
T_OrderDeliveryIsActive = 'Y' AND
T_OrderDeliveryM_CompanyID = ?
AND (T_OrderDeliveryNumber LIKE ?
OR M_UserUsername LIKE ? OR M_BranchName LIKE ?)
AND T_OrderDeliveryRegionalID = ?
AND DATE_FORMAT($datetypeSql, '%Y-%m-%d') >= ? AND DATE_FORMAT($datetypeSql, '%Y-%m-%d') <= ?
ORDER BY $datetypeSql DESC
LIMIT ? OFFSET ?";
$query = $this->db->query($sql, [$companyID, $keyword, $keyword, $keyword, $regionalID, $startDate, $endDate, intval($rowPerPage), intval($start_offset)]);
if (!$query) {
$message = $this->db->error();
$this->sys_error($message);
exit;
}
$search = $query->result_array();
// print_r($search);
$result = [
"data" => $search,
"total" => $totals,
"total_page" => ceil($totals / $rowPerPage),
"qry_total" => $this->db->last_query(),
];
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function detaildelivery()
{
try {
$prm = $this->sys_input;
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$sql = "SELECT
T_OrderDeliveryID AS delivery_id,
T_OrderDeliveryNumber AS delivery_number,
T_OrderNumber AS order_number,
T_OrderDetailDeliveryID AS delivery_detail_id,
T_OrderDetailDeliveryT_OrderID AS order_id,
DATE_FORMAT(T_OrderDate, '%d/%m/%Y') AS date,
M_PatientName AS patient_name,
T_OrderStatus AS status,
one_mitra.fn_get_acc_sample(T_OrderDetailDeliveryT_OrderID) AS accepted_sample,
one_mitra.fn_get_rejct_sample(T_OrderDetailDeliveryT_OrderID) AS rejected_sample
FROM
one_mitra.t_orderdelivery
JOIN one_mitra.t_orderdetaildelivery
ON T_OrderDeliveryID = T_OrderDetailDeliveryT_OrderDeliveryID
AND T_OrderDetailDeliveryIsActive = 'Y'
JOIN one_mitra.t_order
ON T_OrderDetailDeliveryT_OrderID = T_OrderID
AND T_OrderDetailDeliveryIsActive = 'Y'
AND T_OrderIsActive = 'Y'
JOIN one_mitra.m_patient
ON T_OrderM_PatientID = M_PatientID
AND M_PatientIsActive = 'Y'
WHERE T_OrderDeliveryID = ?
AND T_OrderDeliveryIsActive = 'Y'";
$query = $this->db->query($sql, [$prm['id']]);
if (!$query) {
$message = $this->db->error();
$this->sys_error($message);
exit;
}
$search = $query->result_array();
$this->sys_ok($search);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function cancel()
{
try {
$prm = $this->sys_input;
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$this->db->trans_begin();
$sql = "UPDATE one_mitra.t_orderdelivery SET T_OrderDeliveryIsActive = 'N'
WHERE T_OrderDeliveryID = ?
";
$query = $this->db->query($sql, [$prm['id']]);
if (!$query) {
$message = $this->db->error();
$this->sys_error($message);
$this->db->trans_rollback();
exit;
}
$sql = "UPDATE one_mitra.t_orderdetaildelivery SET T_OrderDetailDeliveryIsActive = 'N'
WHERE T_OrderDetailDeliveryT_OrderDeliveryID = ?;
";
$query = $this->db->query($sql, [$prm['id']]);
if (!$query) {
$message = $this->db->error();
$this->sys_error($message);
$this->db->trans_rollback();
exit;
}
$this->db->trans_commit();
$this->sys_ok("ok");
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function send()
{
try {
// $aql = "UPDATE t_orderdelivery SET T_OrderDeliveryStatus = 'S'
// WHERE T_OrderDeliveryID = 1;
// UPDATE t_order SET T_OrderStatus = 'S'
// WHERE T_OrderID IN (
// SELECT T_OrderDetailDeliveryT_OrderID
// FROM t_orderdetaildelivery
// WHERE T_OrderDetailDeliveryT_OrderDeliveryID = 1)";
$prm = $this->sys_input;
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$this->db->trans_begin();
$sql = "UPDATE one_mitra.t_orderdelivery SET T_OrderDeliveryStatus = 'S'
WHERE T_OrderDeliveryID = ?;
";
$query = $this->db->query($sql, [$prm['id']]);
if (!$query) {
$message = $this->db->error();
$this->sys_error($message);
$this->db->trans_rollback();
exit;
}
$sql = "UPDATE one_mitra.t_order SET T_OrderStatus = 'S'
WHERE T_OrderID IN (
SELECT T_OrderDetailDeliveryT_OrderID
FROM one_mitra.t_orderdetaildelivery
WHERE T_OrderDetailDeliveryT_OrderDeliveryID = ?)
";
$query = $this->db->query($sql, [$prm['id']]);
if (!$query) {
$message = $this->db->error();
$this->sys_error($message);
$this->db->trans_rollback();
exit;
}
$this->db->trans_commit();
$this->sys_ok("ok");
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getregional()
{
try {
$sql_regional = "SELECT
S_RegionalID AS regional_id,
S_RegionalName AS regional_name
FROM s_regional WHERE S_RegionalIsActive = 'Y'";
$query_regional = $this->db->query($sql_regional, []);
if (!$query_regional) {
$message = $this->db->error();
$this->sys_error($message);
exit;
}
$regionals = $query_regional->result_array();
$sql_branch = "SELECT
M_BranchID AS branch_id,
M_BranchCode AS branch_code,
M_BranchName AS branch_name,
M_BranchS_RegionalID AS regional_id
FROM m_branch Where M_BranchIsActive = 'Y'";
$query_branch = $this->db->query($sql_branch, []);
if (!$query_branch) {
$message = $this->db->error();
$this->sys_error($message);
exit;
}
$branchs = $query_branch->result_array();
for ($i = 0; $i < count($regionals); $i++) {
$regionals[$i]['branch'] = [];
}
for ($i = 0; $i < count($regionals); $i++) {
for ($j = 0; $j < count($branchs); $j++) {
if ($regionals[$i]['regional_id'] == $branchs[$j]['regional_id']) {
$regionals[$i]['branch'][] = $branchs[$j];
}
}
}
$this->sys_ok($regionals);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function sendqrcode()
{
try {
$prm = $this->sys_input;
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$arr_order_id = 0;
if (isset($prm['arr_order_id'])) {
$arr_order_id = $prm['arr_order_id'];
} else {
$this->sys_error("arr_order_id is mandatory");
}
$arr_order_id = implode(",", $arr_order_id);
$sql = "UPDATE one_mitra.t_order
SET T_OrderIsQRCode = 'Y'
WHERE T_OrderID IN ($arr_order_id)
AND T_OrderIsActive = 'Y'";
$qry = $this->db->query($sql, []);
if (!$qry) {
print_r($this->db->last_query());
$message = $this->db->error();
$this->sys_error($message);
exit;
}
$this->sys_ok($this->db->last_query());
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
}