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() ]; } } }