Files
2026-04-27 10:31:17 +07:00

1273 lines
47 KiB
PHP

<?php
class Mdprice extends MY_Controller
{
var $db_onedev;
var $load;
var $sspricemou;
public function index()
{
echo "CPONE MD PRICE API";
}
public function __construct()
{
parent::__construct();
$this->db_onedev = $this->load->database("onedev", true);
// $this->load->library("SsPriceMou");
}
function searchpriceheader()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$search = '%' . $prm['search'] . '%';
$page = $prm["page"];
$ROW_PER_PAGE = 20;
$start_offset = 0;
// print_r($prm);
if (isset($prm["page"])) {
if (
is_numeric($prm["page"]) && $prm["page"] > 0
) {
$start_offset = ($page - 1) * $ROW_PER_PAGE;
}
}
$sql = "SELECT
count(T_PriceHeaderID ) as total
FROM t_priceheader
WHERE T_PriceHeaderName LIKE '{$search}'
AND T_PriceHeaderIsActive = 'Y'
";
$query = $this->db_onedev->query($sql, []);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$total = $query->row_array()['total'];
$sql = "SELECT
T_PriceHeaderID AS headerID,
T_PriceHeaderName AS headerName,
T_PriceHeaderStartDate AS headerStartDate,
T_PriceHeaderEndDate AS headerEndDate,
T_PriceHeaderCode AS headerCode,
T_PriceHeaderValidasi AS headerValidate,
CASE
WHEN `fn_get_count_price_notgenerate`(T_PriceHeaderID) > 0 THEN 'Y'
ELSE 'N'
END AS readyValidate,
CASE
WHEN `fn_get_status_validate_packet`(T_PriceHeaderID) > 0 THEN 'Y'
ELSE 'N'
END AS validatePacket
FROM t_priceheader
WHERE T_PriceHeaderName LIKE '{$search}'
AND T_PriceHeaderIsActive = 'Y'
ORDER BY T_PriceHeaderID DESC
LIMIT ? OFFSET ? ";
$query = $this->db_onedev->query($sql, [$ROW_PER_PAGE, $start_offset]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$result = [
"total" => ceil($total / $ROW_PER_PAGE),
"records" => $query->result_array()
];
$this->sys_ok($result);
}
function insertpriceheader()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$userid = $this->sys_user["M_UserID"];
if (!isset($prm['name'])) {
$this->sys_error("Nama harus diisi");
exit;
}
if (trim($prm['name']) == "") {
$this->sys_error("Nama harus diisi");
exit;
}
// if (!isset($prm['sd'])) {
// $this->sys_error("Tanggal awal harus diisi");
// exit;
// }
// if (!isset($prm['ed'])) {
// $this->sys_error("Tanggal akhir harus diisi");
// exit;
// }
$name = $prm['name'];
$startDate = $prm['sd'];
$endDate = $prm['ed'];
$nw = strtotime($startDate);
$nwe = strtotime($endDate);
$sql = "SELECT fn_numbering('PH') as number";
$query = $this->db_onedev->query($sql, []);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$number = $query->row_array()['number'];
$sql = "INSERT INTO t_priceheader (
T_PriceHeaderName,
T_PriceHeaderCreated,
T_PriceHeaderCraetdUserID,
T_PriceHeaderCode)
VALUES (?,NOW(),?,?)";
$query = $this->db_onedev->query($sql, [$name, $userid, $number]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$newHeaderid = $this->db_onedev->insert_id();
$dataAfter = $this->getPrice($newHeaderid);
$log = [
'ID' => $newHeaderid,
'detailID' => '0',
'type' => 'CREATE HEADER',
'desc' => "Tambah header {$number}",
'prm' => $prm,
'dataBefore' => '',
'dataAfter' => $dataAfter,
'userID' => $this->sys_user["M_UserID"],
];
$this->insertLog($log);
// "total" => ceil($total / $ROW_PER_PAGE),
$this->sys_ok("OK");
}
function editpriceheader()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$userid = $this->sys_user["M_UserID"];
if (!isset($prm['name'])) {
$this->sys_error("Nama harus diisi");
exit;
}
if (trim($prm['name']) == "") {
$this->sys_error("Nama harus diisi");
exit;
}
// if (!isset($prm['sd'])) {
// $this->sys_error("Tanggal awal harus diisi");
// exit;
// }
// if (!isset($prm['ed'])) {
// $this->sys_error("Tanggal akhir harus diisi");
// exit;
// }
$name = $prm['name'];
$startDate = $prm['sd'];
$endDate = $prm['ed'];
$id = $prm['id'];
$nw = strtotime($startDate);
$nwe = strtotime($endDate);
$dataBefore = $this->getPrice($id);
$sql = "UPDATE t_priceheader
SET T_PriceHeaderName = '{$name}',
T_PriceHeaderLastUpdated = NOW(),
T_PriceHeaderLastUpdatedUserID = {$userid}
WHERE T_PriceHeaderID = $id";
$query = $this->db_onedev->query($sql, []);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$dataAfter = $this->getPrice($id);
$log = [
'ID' => $id,
'detailID' => '0',
'type' => 'EDIT HEADER',
'desc' => "edit header name '{$dataBefore['T_PriceHeaderName']}' menjadi '{$name}'",
'prm' => $prm,
'dataBefore' => $dataBefore,
'dataAfter' => $dataAfter,
'userID' => $this->sys_user["M_UserID"],
];
$this->insertLog($log);
// "total" => ceil($total / $ROW_PER_PAGE),
$this->sys_ok("OK");
}
function deletepriceheader()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$userid = $this->sys_user["M_UserID"];
$id = $prm['id'];
$dataBefore = $this->getPrice($id);
$sql = "UPDATE t_priceheader
SET T_PriceHeaderIsActive = 'N',
T_PriceHeaderDeleted = NOW(),
T_PriceHeaderDeletedUserID = {$userid}
WHERE T_PriceHeaderID = $id";
$query = $this->db_onedev->query($sql, []);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$sql = "UPDATE t_price
SET T_PriceIsActive = 'N',
T_PriceLastUpdated = NOW(),
T_PriceUserID = {$userid}
WHERE T_PriceT_PriceHeaderID = $id";
$query = $this->db_onedev->query($sql, []);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$dataAfter = $this->getPrice($id);
$log = [
'ID' => $id,
'detailID' => '0',
'type' => 'DELETE HEADER',
'desc' => "DELETE header",
'prm' => $prm,
'dataBefore' => $dataBefore,
'dataAfter' => $dataAfter,
'userID' => $this->sys_user["M_UserID"],
];
$this->insertLog($log);
// "total" => ceil($total / $ROW_PER_PAGE),
$this->sys_ok("OK");
}
function getfilterprice()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$sql = "SELECT Nat_SubGroupID AS id, Nat_SubGroupName AS name
FROM nat_subgroup
WHERE Nat_SubGroupIsActive= 'Y'";
$query = $this->db_onedev->query($sql, []);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$subgroup = $query->result_array();
array_push($subgroup, [
'id' => '0',
'name' => 'Semua'
]);
$status = [[
'id' => 'A',
'name' => 'Semua'
], [
'id' => 'Y',
'name' => 'Ya'
], [
'id' => 'N',
'name' => 'Tidak'
]];
// "total" => ceil($total / $ROW_PER_PAGE),
$rst = [
"subgroup" => $subgroup,
'status' => $status,
];
$this->sys_ok($rst);
}
function searchpricetest()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$search = '%' . $prm['search'] . '%';
$subgroup = $prm['subgroup'];
$headerID = $prm['headerid'];
$status = $prm['status'];
$page = $prm["page"];
$ROW_PER_PAGE = 20;
$start_offset = 0;
// print_r($prm);
$filterSubGroup = "";
if ($subgroup != '0') {
$filterSubGroup = "AND Nat_SubGroupID = $subgroup";
}
$filterStatus = "";
if ($status == 'N') {
$filterStatus = 'AND T_PriceID IS NULL ';
}
if ($status == 'Y') {
$filterStatus = 'AND T_PriceID IS NOT NULL ';
}
if (isset($prm["page"])) {
if (
is_numeric($prm["page"]) && $prm["page"] > 0
) {
$start_offset = ($page - 1) * $ROW_PER_PAGE;
}
}
$sql = "SELECT
COUNT(T_TestID) as total
FROM
t_test
JOIN nat_subgroup
ON T_TestNat_SubgroupID = Nat_SubGroupID
AND Nat_SubGroupIsActive = 'Y'
AND `T_TestIsPrice` = 'Y'
AND (T_TestName LIKE ? OR T_TestSasCode LIKE ?)
{$filterSubGroup}
LEFT JOIN t_price
ON T_TestID = T_PriceT_TestID
AND T_PriceT_PriceHeaderID = ?
AND T_PriceIsActive = 'Y'
LEFT JOIN t_priceheader
ON T_PriceT_PriceHeaderID = T_PriceHeaderID
AND T_PriceHeaderIsActive = 'Y'
WHERE
`T_TestIsActive` = 'Y'
{$filterStatus}
";
$query = $this->db_onedev->query($sql, [$search, $search, $headerID,]);
$qryTotal = $this->db_onedev->last_query();
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$total = $query->row_array()['total'];
$sql = "SELECT
T_TestID AS testID,
T_TestSasCode AS testCode,
T_TestName AS testName,
T_TestIsPrice AS testIsPrice,
T_PriceAmount AS priceAmount,
T_PriceDisc AS priceDisc,
T_PriceDiscRp AS priceDiscRp,
T_PriceSubTotal AS subTotal,
T_PriceID AS priceID,
T_PriceT_PriceHeaderID AS headerID,
T_PriceHeaderName AS headerName,
Nat_SubGroupID AS subGroupID,
Nat_SubGroupName AS subGroupName,
'N' AS isChange,
CASE
WHEN T_PriceID IS NULL THEN 'N'
WHEN T_PriceID IS NOT NULL THEN 'Y'
ELSE 'N'
END as status,
IFNULL(Nat_TestMapCode, '') as lis_code
FROM
t_test
JOIN nat_subgroup
ON T_TestNat_SubgroupID = Nat_SubGroupID
AND Nat_SubGroupIsActive = 'Y'
JOIN nat_test ON T_TestNat_TestID = Nat_TestID
AND `T_TestIsPrice` = 'Y'
AND (T_TestName LIKE ? OR T_TestSasCode LIKE ?)
{$filterSubGroup}
LEFT JOIN t_price
ON T_TestID = T_PriceT_TestID
AND T_PriceT_PriceHeaderID = ?
AND T_PriceIsActive = 'Y'
LEFT JOIN t_priceheader
ON T_PriceT_PriceHeaderID = T_PriceHeaderID
AND T_PriceHeaderIsActive = 'Y'
LEFT JOIN nat_testmap ON Nat_TestMapNat_TestID = Nat_TestID AND Nat_TestMapIsActive = 'Y'
WHERE
`T_TestIsActive` = 'Y'
{$filterStatus}
LIMIT ? OFFSET ? ";
$query = $this->db_onedev->query($sql, [$search, $search, $headerID, $ROW_PER_PAGE, $start_offset]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$result = [
"total" => ceil($total / $ROW_PER_PAGE),
"ttl" => $total,
"records" => $query->result_array(),
"qry" => $this->db_onedev->last_query(),
"qryttl" => $qryTotal,
];
$this->sys_ok($result);
}
function savetest()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$userid = $this->sys_user["M_UserID"];
// {
// "testID": "19",
// "testCode": "10110200",
// "testName": "Hematologi Rutin",
// "testIsPrice": "Y",
// "priceAmount": "10000",
// "priceDisc": null,
// "priceDiscRp": null,
// "subTotal": 10000,
// "priceID": null,
// "headerID": null,
// "headerName": null,
// "subGroupID": "1",
// "subGroupName": "Hematologi",
// "isChange": "Y",
// "status": "N"
// }
$prm = $this->sys_input;
$test = $prm['test'];
$headerid = $prm['headerid'];
$dataBefore = $this->getPrice($headerid);
$arrDesc = [];
for ($i = 0; $i < count($test); $i++) {
$data = $test[$i];
$diskon = 0;
if ($data['priceDisc'] != null) {
$diskon = $data['priceDisc'];
}
$diskonRp = 0;
if ($data['priceDiscRp'] != null) {
$diskonRp = $data['priceDiscRp'];
}
if ($data['priceID'] === null || $data['priceID'] === '0') {
$sql = "INSERT INTO t_price
(T_PriceT_PriceHeaderID,
T_PriceT_TestID,
T_PriceAmount,
T_PriceDisc,
T_PriceDiscRp,
T_PriceSubTotal,
T_PriceTotal,
T_PriceCreated,
T_PriceUserID
)
VALUES(?,?,?,?,?,?,?,NOW(),?)";
$query = $this->db_onedev->query($sql, [
$headerid,
$data['testID'],
$data['priceAmount'],
$diskon,
$diskonRp,
$data['subTotal'],
$data['subTotal'],
$userid,
]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$arrDesc[] = "- Add price {$data['testID']} {$data['testCode']} {$data['testName']}";
} else {
$sql = "UPDATE t_price
SET T_PriceAmount = ?,
T_PriceDisc = ?,
T_PriceDiscRp = ?,
T_PriceSubTotal = ?,
T_PriceTotal = ?,
T_PriceLastUpdated = NOW(),
T_PriceUserID = ?
WHERE T_PriceT_TestID = ?
AND T_PriceID = ?
AND T_PriceT_PriceHeaderID = ?";
$query = $this->db_onedev->query($sql, [
$data['priceAmount'],
$diskon,
$diskonRp,
$data['subTotal'],
$data['subTotal'],
$userid,
$data['testID'],
$data['priceID'],
$headerid,
]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$arrDesc[] = "- update price {$data['testID']} {$data['testCode']} {$data['testName']}";
}
}
$dataAfter = $this->getPrice($headerid);
$log = [
'ID' => $headerid,
'detailID' => '0',
'type' => 'ADD / UPDATE TEST',
'desc' => "Add / update test" . "\n" . implode("\n", $arrDesc),
'prm' => $prm,
'dataBefore' => $dataBefore,
'dataAfter' => $dataAfter,
'userID' => $this->sys_user["M_UserID"],
];
$this->insertLog($log);
$this->sys_ok(["last_qry" => $this->db_onedev->last_query()]);
}
function searchpriceheaderautocomplete()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$search = '%' . $prm['search'] . '%';
$sql = "SELECT
T_PriceHeaderID AS headerID,
CONCAT(T_PriceHeaderCode, ' ', T_PriceHeaderName) AS headerName,
T_PriceHeaderStartDate AS headerStartDate,
T_PriceHeaderEndDate AS headerEndDate,
T_PriceHeaderCode AS headerCode,
T_PriceHeaderValidasi AS headerValidate,
CASE
WHEN `fn_get_count_price`(T_PriceHeaderID) > 0 THEN 'Y'
ELSE 'N'
END AS readyValidate
FROM t_priceheader
WHERE CONCAT(T_PriceHeaderCode, ' ', T_PriceHeaderName) LIKE '{$search}'
AND fn_get_count_price(T_PriceHeaderID) > 0
AND T_PriceHeaderIsActive = 'Y'
";
$query = $this->db_onedev->query($sql, []);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$result = [
"records" => $query->result_array()
];
$this->sys_ok($result);
}
function copyharga()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
// $this->db_onedev->trans_begin();
// $this->db_onedev->trans_rollback();
// $this->db_onedev->trans_commit();
$this->db_onedev->trans_begin();
$prm = $this->sys_input;
$headerid = $prm['headerid'];
$name = $prm['name'];
$copypacket = $prm['copypacket'];
$userid = $this->sys_user["M_UserID"];
$sql = "SELECT fn_numbering('PH') as number";
$query = $this->db_onedev->query($sql, []);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->sys_error($message);
exit;
}
$numberHeader = $query->row_array()['number'];
//insert price header
$sql = "INSERT INTO t_priceheader (
T_PriceHeaderName,
T_PriceHeaderCreated,
T_PriceHeaderCraetdUserID,
T_PriceHeaderCode)
VALUES(?,NOW(),?,?)";
$query = $this->db_onedev->query($sql, [$name, $userid, $numberHeader]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
$newHeaderid = $this->db_onedev->insert_id();
$sql = "INSERT INTO t_price
( T_PriceT_PriceHeaderID,
T_PriceT_TestID,
T_PriceAmount,
T_PriceDisc,
T_PriceDiscRp,
T_PriceSubTotal,
T_PriceTotal,
T_PriceCreated,
T_PriceUserID)
SELECT
'{$newHeaderid}' AS headerid,
T_PriceT_TestID,
T_PriceAmount,
T_PriceDisc,
T_PriceDiscRp,
T_PriceSubTotal,
T_PriceTotal,
NOW() as created,
'{$userid}' as userID
FROM t_price
WHERE T_PriceT_PriceHeaderID = ?
AND T_PriceIsActive = 'Y'
";
$query = $this->db_onedev->query($sql, [$headerid]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
// echo $this->db_onedev->last_query();
// exit;
if ($copypacket) {
$sql = 'SELECT * FROM t_packet WHERE T_PacketT_PriceHeaderID = ? AND T_PacketIsActive = "Y"';
$query = $this->db_onedev->query($sql, [$headerid]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
$pcktlst = $query->result_array();
for ($i = 0; $i < count($pcktlst); $i++) {
$p = $pcktlst[$i];
$name = $p['T_PacketName'] . " " . $numberHeader;
$oldPHid = $p['T_PacketID'];
$type_number = "PCPR";
if ($pcktlst[$i]['T_PacketType'] == 'PN')
$type_number = "PCPN";
$sql = "SELECT fn_numbering('{$type_number}') as number";
$query = $this->db_onedev->query($sql, []);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
$number = $query->row_array()['number'];
$sql = "INSERT INTO t_packet
(T_PacketT_PriceHeaderID,
T_PacketType,
T_PacketName,
T_PacketPrice,
T_PacketOriginalPrice,
T_PacketSasCode,
T_PacketStartDate,
T_PacketEndDate,
T_PacketCreated,
T_PacketOriginalBruto)
VALUES(?,?,?,?,?,?,?,?,NOW(),?)";
$query = $this->db_onedev->query($sql, [
$newHeaderid,
$p['T_PacketType'],
$name,
$p['T_PacketPrice'],
$p['T_PacketOriginalPrice'],
$number,
$p['T_PacketStartDate'],
$p['T_PacketEndDate'],
$p['T_PacketOriginalBruto'],
]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
$newPHid = $this->db_onedev->insert_id();
$sql = "INSERT INTO t_packetdetail
(T_PacketDetailT_PacketID,
T_PacketDetailT_TestID,
T_PacketDetailOriginalPrice,
T_PacketDetailPrice,
T_PacketDetailCreated,
T_PacketDetailPriceAmount,
T_PacketDetailPriceDisc,
T_PacketDetailPriceDiscRp,
T_PacketDetailPriceSubTotal)
SELECT
'{$newPHid}' as pid,
T_PacketDetailT_TestID,
T_PacketDetailOriginalPrice,
T_PacketDetailPrice,
NOW() as created,
T_PacketDetailPriceAmount,
T_PacketDetailPriceDisc,
T_PacketDetailPriceDiscRp,
T_PacketDetailPriceSubTotal
FROM t_packetdetail
WHERE T_PacketDetailT_PacketID = ?
AND T_PacketDetailIsActive = 'Y'";
$query = $this->db_onedev->query($sql, [
$oldPHid
]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
}
$packetAfter = $this->getPacket($headerid);
foreach ($packetAfter as $key => $value) {
$logPacket = [
'ID' => $value['T_PacketID'],
'detailID' => '0',
'type' => 'COPY PACKET ',
'desc' => "copy paket dari copy price id $headerid",
'prm' => $prm,
'dataBefore' => '',
'dataAfter' => $value,
'userID' => $this->sys_user["M_UserID"],
];
$this->insertLogPacket($logPacket);
}
}
$dataAfter = $this->getPrice($headerid);
$log = [
'ID' => $headerid,
'detailID' => '0',
'type' => 'COPY ',
'desc' => "COPY",
'prm' => $prm,
'dataBefore' => '',
'dataAfter' => $dataAfter,
'userID' => $this->sys_user["M_UserID"],
];
$this->insertLog($log);
$this->db_onedev->trans_commit();
// $result = [
// "records" => $query->result_array()
// ];
$this->sys_ok('OK');
}
function create($id)
{
$this->load->library("SsPriceMou");
list($status, $message) = $this->sspricemou->create($id);
if ($status) {
return [
"status" => 'OK',
"msg" => $message
];
} else {
return [
"status" => 'OK',
"msg" => $message
];
}
}
function insertLog($data)
{
$sql = "INSERT INTO cpone_log.log_md_price
(LogMdPriceT_priceHeaderID,
LogMdPriceT_priceID,
LogMdPriceType,
LogMdPriceDesc,
LogMdPricePrm,
LogMdPriceJsonBefore,
LogMdPriceJsonAfter,
LogMdPriceUserID,
LogMdPriceCreated)
VALUES(?,?,?,?,?,?,?,?, NOW())";
$query = $this->db_onedev->query($sql, [
$data['ID'],
$data['detailID'],
$data['type'],
$data['desc'],
$data['prm'] == '' ? '' : json_encode($data['prm']),
$data['dataBefore'] == '' ? '' : json_encode($data['dataBefore']),
$data['dataAfter'] == '' ? '' : json_encode($data['dataAfter']),
$data['userID']
]);
// [
// 'ID' => $data[''],
// 'detailID' => $data[''],
// 'type' => $data[''],
// 'desc' => $data[''],
// 'prm' => $data[''],
// 'dataBefore' => $data[''],
// 'dataAfter ' => $data[''],
// 'userID ' => $data[''],
// ];
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
}
function insertLogPacket($data)
{
$sql = "INSERT INTO cpone_log.log_packet
(LogPacketT_PacketID,
LogPacketT_PacketDetailID,
LogPacketType,
LogPacketDesc,
LogPacketPrm,
LogPacketJsonBefore,
LogPacketJsonAfter,
LogPacketUserID,
LogPacketCreated)
VALUES(?,?,?,?,?,?,?,?, NOW())";
$query = $this->db_onedev->query($sql, [
$data['ID'],
$data['detailID'],
$data['type'],
$data['desc'],
$data['prm'] == '' ? '' : json_encode($data['prm']),
$data['dataBefore'] == '' ? '' : json_encode($data['dataBefore']),
$data['dataAfter'] == '' ? '' : json_encode($data['dataAfter']),
$data['userID']
]);
// [
// 'ID' => $data[''],
// 'detailID' => $data[''],
// 'type' => $data[''],
// 'desc' => $data[''],
// 'prm' => $data[''],
// 'dataBefore' => $data[''],
// 'dataAfter ' => $data[''],
// 'userID ' => $data[''],
// ];
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
}
function insertLogValidatePacket($data)
{
$sql = "INSERT INTO cpone_log.log_validate_packet
(
LogValidatePacketT_PacketID,
LogValidatePacketT_PriceHeaderID,
LogValidatePacketPrice,
LogValidatePacketOriginalPrice,
LogValidatePacketPriceUserID,
LogValidatePacketPriceCreated)
VALUES(?,?,?,?,?, NOW())";
$query = $this->db_onedev->query($sql, [
$data['packetID'],
$data['priceID'],
$data['price'],
$data['originalPrice'],
$data['userID']
]);
// [
// 'packetID' => $data[''],
// 'priceID' => $data[''],
// 'price' => $data[''],
// 'originalPrice' => $data[''],
// 'userID' => $data[''],
// ];
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
}
function getPrice($id)
{
$sql = "SELECT * FROM t_priceheader WHERE T_PriceHeaderID = ?";
$query = $this->db_onedev->query($sql, [$id]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
$header = $query->row_array();
$sql = "SELECT * FROM t_price WHERE T_PriceT_PriceHeaderID = ?";
$query = $this->db_onedev->query($sql, [$id]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
$detail = $query->result_array();
$header['detail'] = $detail;
return $header;
}
function getPacket($id)
{
$sql = "SELECT * FROM t_packet WHERE T_PacketT_PriceHeaderID = ?";
$query = $this->db_onedev->query($sql, [$id]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
$header = $query->result_array();
foreach ($header as $key => $value) {
# code...
$sql = "SELECT * FROM t_packetdetail WHERE T_PacketDetailT_PacketID = ?";
$query = $this->db_onedev->query($sql, [$value['T_PacketID']]);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
$detail = $query->result_array();
$header[$key]['detail'] = $detail;
}
return $header;
}
function validateheader()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
// $this->db_onedev->trans_begin();
// $this->db_onedev->trans_rollback();
// $this->db_onedev->trans_commit();
$prm = $this->sys_input;
$userid = $this->sys_user["M_UserID"];
$id = $prm['id'];
$sql = "SELECT * FROM t_packet WHERE T_PacketIsActive = 'Y' AND
T_PacketT_PriceHeaderID = $id";
$query = $this->db_onedev->query($sql, []);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
$arr_packets = $query->result_array();
foreach ($arr_packets as $key => $value) {
$packet_id = $value['T_PacketID'];
$result = $this->removeDuplicateTests($packet_id);
// Optional: Handle result if needed
if (!$result['success']) {
error_log("Failed to remove duplicates from packet_id $packet_id: " . $result['message']);
// You can choose to continue or handle error as needed
} else if ($result['deleted_count'] > 0) {
error_log("Successfully removed " . $result['deleted_count'] . " duplicate tests from packet_id $packet_id");
}
}
$this->db_onedev->trans_begin();
$dataBefore = $this->getPrice($id);
$sql = "UPDATE t_priceheader
SET T_PriceHeaderValidasi = 'Y',
T_PriceHeaderValidasiDate = NOW(),
T_PriceHeaderValidasiUserID = {$userid},
T_PriceHeaderIsGenerated = 'Y',
T_PriceHeaderGeneratedDate = NOW()
WHERE T_PriceHeaderID = $id";
$query = $this->db_onedev->query($sql, []);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
$sql = "UPDATE t_price
SET T_PriceValidasi = 'Y',
T_PriceValidasiDate = NOW(),
T_PriceValidasiDateUserID = {$userid},
T_PriceIsGenerated = 'Y',
T_PriceIsGeneratedDate = NOW()
WHERE T_PriceT_PriceHeaderID = $id
AND T_PriceValidasi = 'N'";
$query = $this->db_onedev->query($sql, []);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
$packetBefore = $this->getPacket($id);
$sql = "UPDATE t_packet
SET T_PacketIsGenerated = 'Y',
T_PacketGeneratedDate = NOW()
WHERE T_PacketT_PriceHeaderID = $id
AND T_PacketIsGenerated= 'N'";
$query = $this->db_onedev->query($sql, []);
if (!$query) {
$message = $this->db_onedev->error();
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
$rtn = $this->create($id);
if ($rtn['status'] !== 'OK') {
$message = $rtn['msg'];
$message['qry'] = $this->db_onedev->last_query();
$this->db_onedev->trans_rollback();
$this->sys_error($message);
exit;
}
$packetAfter = $this->getPacket($id);
$dataAfter = $this->getPrice($id);
foreach ($packetBefore as $key => $value) {
$logPacket = [
'ID' => $value['T_PacketID'],
'detailID' => '0',
'type' => 'VALIDATE',
'desc' => "Validate price and packet, price id $id",
'prm' => $prm,
'dataBefore' => $packetBefore[$key],
'dataAfter' => $packetAfter[$key],
'userID' => $this->sys_user["M_UserID"],
];
$this->insertLogPacket($logPacket);
$logValidate = [
'packetID' => $value['T_PacketID'],
'priceID' => $id,
'price' => $packetAfter[$key]['T_PacketPrice'],
'originalPrice' => $packetAfter[$key]['T_PacketOriginalPrice'],
'userID' => $this->sys_user["M_UserID"],
];
$this->insertLogValidatePacket($logValidate);
}
$log = [
'ID' => $id,
'detailID' => '0',
'type' => 'VALIDATE',
'desc' => "Validate price and packet",
'prm' => $prm,
'dataBefore' => $dataBefore,
'dataAfter' => $dataAfter,
'userID' => $this->sys_user["M_UserID"],
];
$this->insertLog($log);
// "total" => ceil($total / $ROW_PER_PAGE),
$this->db_onedev->trans_commit();
$this->sys_ok([
"msg" => "OK",
"generate" => $rtn
]);
}
/**
* Remove duplicate tests from packet using direct SQL queries
* @param int $packet_id - ID of the packet to remove duplicates from
* @return array - Result with deleted count and message
*/
private function removeDuplicateTests($packet_id) {
try {
// Validate input parameter
if (empty($packet_id) || $packet_id <= 0) {
return [
'success' => false,
'deleted_count' => 0,
'message' => 'Error: Invalid PacketID parameter'
];
}
// Check if packet exists and has active records
$check_sql = "SELECT COUNT(*) as count_records
FROM t_packetdetail
WHERE T_PacketDetailT_PacketID = ?
AND T_PacketDetailIsActive = 'Y'";
$check_query = $this->db_onedev->query($check_sql, [$packet_id]);
if (!$check_query) {
$error = $this->db_onedev->error();
error_log("Error checking packet existence for packet_id $packet_id: " . json_encode($error));
return [
'success' => false,
'deleted_count' => 0,
'message' => 'Database error: ' . $error['message']
];
}
$check_result = $check_query->row_array();
if ($check_result['count_records'] == 0) {
return [
'success' => false,
'deleted_count' => 0,
'message' => "Error: No active records found for PacketID $packet_id"
];
}
// Find duplicate TestIDs
$duplicate_sql = "SELECT T_PacketDetailT_TestID, COUNT(*) as duplicate_count
FROM t_packetdetail
WHERE T_PacketDetailT_PacketID = ?
AND T_PacketDetailIsActive = 'Y'
GROUP BY T_PacketDetailT_TestID
HAVING COUNT(*) > 1";
$duplicate_query = $this->db_onedev->query($duplicate_sql, [$packet_id]);
if (!$duplicate_query) {
$error = $this->db_onedev->error();
error_log("Error finding duplicates for packet_id $packet_id: " . json_encode($error));
return [
'success' => false,
'deleted_count' => 0,
'message' => 'Database error: ' . $error['message']
];
}
$duplicates = $duplicate_query->result_array();
if (empty($duplicates)) {
return [
'success' => true,
'deleted_count' => 0,
'message' => "Info: No duplicate records found for PacketID $packet_id"
];
}
$total_deleted = 0;
$duplicate_test_ids = count($duplicates);
// Process each duplicate TestID
foreach ($duplicates as $duplicate) {
$test_id = $duplicate['T_PacketDetailT_TestID'];
// Get all records for this TestID, ordered by creation date (keep the oldest)
$records_sql = "SELECT T_PacketDetailID
FROM t_packetdetail
WHERE T_PacketDetailT_PacketID = ?
AND T_PacketDetailT_TestID = ?
AND T_PacketDetailIsActive = 'Y'
ORDER BY T_PacketDetailCreated ASC, T_PacketDetailID ASC
LIMIT 1, 999999"; // Skip first record (oldest), get the rest
$records_query = $this->db_onedev->query($records_sql, [$packet_id, $test_id]);
if (!$records_query) {
error_log("Error getting duplicate records for packet_id $packet_id, test_id $test_id");
continue;
}
$records_to_delete = $records_query->result_array();
if (!empty($records_to_delete)) {
$ids_to_delete = array_column($records_to_delete, 'T_PacketDetailID');
$ids_string = implode(',', $ids_to_delete);
// Soft delete duplicates (set IsActive to 'N')
$delete_sql = "UPDATE t_packetdetail
SET T_PacketDetailIsActive = 'N',
T_PacketDetailLastUpdated = NOW()
WHERE T_PacketDetailID IN ($ids_string)";
$delete_query = $this->db_onedev->query($delete_sql);
if ($delete_query) {
$deleted_count = $this->db_onedev->affected_rows();
$total_deleted += $deleted_count;
error_log("Deactivated $deleted_count duplicate records for TestID $test_id in PacketID $packet_id");
} else {
error_log("Error deleting duplicates for TestID $test_id in PacketID $packet_id");
}
}
}
$message = $total_deleted > 0
? "Success: Deactivated $total_deleted duplicate records from PacketID $packet_id. Found $duplicate_test_ids TestIDs with duplicates."
: "Info: No duplicate records were deactivated for PacketID $packet_id";
return [
'success' => true,
'deleted_count' => $total_deleted,
'message' => $message
];
} catch (Exception $e) {
error_log("Exception in removeDuplicateTests for packet_id $packet_id: " . $e->getMessage());
return [
'success' => false,
'deleted_count' => 0,
'message' => 'Exception: ' . $e->getMessage()
];
}
}
}