312 lines
15 KiB
PHP
312 lines
15 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers;
|
|
|
|
use CodeIgniter\API\ResponseTrait;
|
|
use App\Controllers\SecurityController;
|
|
|
|
class ApiController extends BaseController {
|
|
|
|
use ResponseTrait;
|
|
|
|
public function index() {
|
|
return "Tampilan TMS30i";
|
|
}
|
|
|
|
public function create () {
|
|
|
|
// ------------------------------------------------------------------------------------------
|
|
// Get Login Access untuk API
|
|
// ------------------------------------------------------------------------------------------
|
|
$username = $this->request->getServer('PHP_AUTH_USER');
|
|
$password = $this->request->getServer('PHP_AUTH_PW');
|
|
|
|
// ------------------------------------------------------------------------------------------
|
|
// Buat Objek untuk Auth Controller
|
|
// ------------------------------------------------------------------------------------------
|
|
$securityController = new SecurityController();
|
|
$auth = $securityController->auth_check($username, $password);
|
|
// $auth = True;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// 1 - Untuk Autentikasi dan Lain"
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// ------------------------------------------------------------------------------------------
|
|
// Kredensial tidak valid, kembalikan pesan kesalahan dan Berhenti
|
|
// ------------------------------------------------------------------------------------------
|
|
if ( $auth == False) {
|
|
return $this->respond(["message" => "Maaf Akses Anda Ditolak"], 401);
|
|
}
|
|
// ------------------------------------------------------------------------------------------
|
|
// Terima data JSON dan Masukkan ke Variabel
|
|
// ------------------------------------------------------------------------------------------
|
|
$instrument_data_with_checksum = $this->request->getJSON();
|
|
$encrypted_instrument_data = $instrument_data_with_checksum->instrument_data;
|
|
$checksum_data = $instrument_data_with_checksum->checksum;
|
|
// ------------------------------------------------------------------------------------------
|
|
// Dekripsi Data JSON, Jika Tidak cocok kembalikan pesan kesalahan dan Berhenti
|
|
// ------------------------------------------------------------------------------------------
|
|
$decrypted_data = $securityController->decryptData($encrypted_instrument_data);
|
|
if ($decrypted_data == False) {
|
|
return $this->respond(["message" => "Enkripsi Tidak Cocok "], 400);
|
|
}
|
|
// ------------------------------------------------------------------------------------------
|
|
// Checksum Cek, Jika Tidak cocok kembalikan pesan kesalahan dan Berhenti
|
|
// ------------------------------------------------------------------------------------------
|
|
if ( $securityController->checksum_check($decrypted_data, $checksum_data) == False) {
|
|
return $this->respond(["message" => "Checksum Tidak Cocok "], 400);
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// 2 - Olah Data Untuk Disimpan ke Database
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// ------------------------------------------------------------------------------------------
|
|
// Decode Untuk Merubah Format Data Menjadi Array Asosiatif
|
|
// ------------------------------------------------------------------------------------------
|
|
$db = \Config\Database::connect();
|
|
$decrypted_data = json_decode($decrypted_data, true);
|
|
|
|
$total_simpan_non = count($decrypted_data['result_data']);
|
|
$total_simpan_non = strval($total_simpan_non);
|
|
|
|
// Digunakna untuk memfilter data
|
|
$decrypted_data = $this->filterData($decrypted_data);
|
|
$sn_number = $decrypted_data['sn_number'];
|
|
|
|
$total_simpan_filter = count($decrypted_data['result_data']);
|
|
$total_simpan_filter = strval($total_simpan_filter);
|
|
|
|
// Mulai transaksi
|
|
$db->transStart();
|
|
|
|
// Menyiapkan array untuk menyimpan data batch
|
|
$patresTechValues = [];
|
|
$patresFlagValues = [];
|
|
$flagdefCache = [];
|
|
|
|
$now = date('Y-m-d H:i:s');
|
|
|
|
// Proses setiap item dalam data yang diterima
|
|
foreach ($decrypted_data['result_data'] as $key => $value) {
|
|
$SAMP_ID = $value['SAMP_ID'];
|
|
$ITEM_NAME = $value['ITEM_NAME'];
|
|
$ASP_CNT = $value['ASP_CNT'];
|
|
|
|
// $CONC_DATA = isset($value['CONC_DATA']) ? $value['CONC_DATA'] : null;
|
|
// $OD_DATA = isset($value['OD_DATA']) ? $value['OD_DATA'] : null;
|
|
|
|
// Jika tidak ada nilai, set sebagai NULL
|
|
$CONC_DATA = isset($value['CONC_DATA']) ? "'".$value['CONC_DATA']."'" : 'NULL';
|
|
$OD_DATA = isset($value['OD_DATA']) ? "'".$value['OD_DATA']."'" : 'NULL';
|
|
|
|
$RST_DATE = $value['RST_DATE'];
|
|
$FLAG = $value['Flag'];
|
|
$REACTION_NO = $value['ReactionNo'];
|
|
$DIL_ORD = $value['DIL_ORD'];
|
|
|
|
// Input ke Tabel PATRES - Input Satu Persatu
|
|
$sql = "INSERT INTO patres (EquipmentID, SampleID, TestTechCode, Aspcnt, Result, ResultDateTime, createdate)
|
|
VALUES ('$sn_number', '$SAMP_ID', '$ITEM_NAME', $ASP_CNT, $CONC_DATA, '$RST_DATE', '$now')";
|
|
$db->query($sql);
|
|
|
|
$patres_lastid = $db->insertID();
|
|
|
|
// Untuk Inputan ke Tabel PATRESTECH - Batch Input
|
|
$patresTechValues[] = " ($patres_lastid, 'OD_DATA', $OD_DATA, '$RST_DATE'),
|
|
($patres_lastid, 'REACTION_NO', '$REACTION_NO', '$RST_DATE'),
|
|
($patres_lastid, 'DIL_ORD', '$DIL_ORD', '$RST_DATE')";
|
|
|
|
// Cek apakah FLAG sudah ada di cache
|
|
if ($FLAG !== null) {
|
|
if (!isset($flagdefCache[$FLAG])) {
|
|
// Cek tabel flagdef untuk FLAG
|
|
$sql = "SELECT FlagDefID as flagdef_id FROM flagdef WHERE flag='$FLAG'";
|
|
$query = $db->query($sql);
|
|
$row = $query->getRow();
|
|
|
|
if ($row !== null) {
|
|
$FlagDefID = (int) $row->flagdef_id;
|
|
} else {
|
|
// Insert Data ke Tabel Flagdef
|
|
$sql = "INSERT INTO flagdef (Instrumentid, Flag, flagtext, FlagDesc, onscreen, onresult, createdate)
|
|
VALUES (1, '$FLAG', '$FLAG', '', 1, 1, '$now')";
|
|
$db->query($sql);
|
|
|
|
// Ambil FlagDefID baru
|
|
$sql = "SELECT FlagDefID as flagdef_id FROM flagdef WHERE flag='$FLAG'";
|
|
$query = $db->query($sql);
|
|
$row = $query->getRow();
|
|
$FlagDefID = (int) $row->flagdef_id;
|
|
}
|
|
|
|
// Simpan FlagDefID di cache
|
|
$flagdefCache[$FLAG] = $FlagDefID;
|
|
|
|
} else {
|
|
$FlagDefID = $flagdefCache[$FLAG];
|
|
}
|
|
|
|
// Siapkan query untuk INSERT INTO patresflag
|
|
$patresFlagValues[] = "($patres_lastid, $FlagDefID, '$RST_DATE')";
|
|
}
|
|
}
|
|
|
|
// Menyisipkan data ke tabel patresflag dalam satu batch
|
|
if (!empty($patresFlagValues)) {
|
|
$sql = "INSERT INTO patresflag (resultid, flagid, createdate)
|
|
VALUES " . implode(", ", $patresFlagValues);
|
|
$db->query($sql);
|
|
}
|
|
|
|
// Menyisipkan data ke tabel patrestech dalam satu batch
|
|
if (!empty($patresTechValues)) {
|
|
$sql = "INSERT INTO patrestech (resultid, DBField, DBValue, createdate)
|
|
VALUES " . implode(", ", $patresTechValues);
|
|
$db->query($sql);
|
|
}
|
|
|
|
$db->transComplete();
|
|
|
|
// Cek status transaksi
|
|
if (! $db->transStatus()) {
|
|
$db->transRollback();
|
|
// return $this->respond(['message' => 'Server tidak menyimpan data anda, dikarenakan terjadi kesalahan saat memproses data.'], 500);
|
|
return $this->respond(['message' => $db->error()], 500);
|
|
} else {
|
|
return $this->respond(['message' => "Menyimpan ". $total_simpan_filter . " dari " . $total_simpan_non ." data, Data berhasil diproses."], 201);
|
|
}
|
|
|
|
}
|
|
|
|
// Digunakan Untuk Memfilter Data Valid dan Tidak Valid
|
|
// Misal ada 2 Data :
|
|
// dengan Sampid dan semuanya sama namun beda flag maka cukup pilih/simpan data yang punya flag
|
|
public function filterData($decrypted_data) {
|
|
|
|
$filtered_data = array();
|
|
|
|
$filtered_data['sn_number'] = $decrypted_data['sn_number'];
|
|
$filtered_data['result_data'] = [];
|
|
|
|
$i = 0;
|
|
$status = false;
|
|
$length_array = count($decrypted_data['result_data']);
|
|
|
|
foreach ($decrypted_data['result_data'] as $key => $value) {
|
|
|
|
$SAMP_ID = $value['SAMP_ID'];
|
|
$ITEM_NAME = $value['ITEM_NAME'];
|
|
$ASP_CNT = $value['ASP_CNT'];
|
|
$CONC_DATA = $value['CONC_DATA'];
|
|
$OD_DATA = $value['OD_DATA'];
|
|
$RST_DATE = $value['RST_DATE'];
|
|
$FLAG = $value['Flag'];
|
|
$REACTION_NO = $value['ReactionNo'];
|
|
$DIL_ORD = $value['DIL_ORD'];
|
|
|
|
// Kondisi saat array bernilai 1
|
|
if ($i != 0) {
|
|
|
|
// Kondisi jika ada data array yang sama antara array 0 dan 1, 1 dan 2, dan seterusnya
|
|
if ( $SAMP_ID == $decrypted_data['result_data'][($i-1)]['SAMP_ID'] AND
|
|
$ITEM_NAME == $decrypted_data['result_data'][($i-1)]['ITEM_NAME'] AND
|
|
$ASP_CNT == $decrypted_data['result_data'][($i-1)]['ASP_CNT'] AND
|
|
$CONC_DATA == $decrypted_data['result_data'][($i-1)]['CONC_DATA'] AND
|
|
$OD_DATA == $decrypted_data['result_data'][($i-1)]['OD_DATA'] AND
|
|
$RST_DATE == $decrypted_data['result_data'][($i-1)]['RST_DATE'] AND
|
|
$REACTION_NO == $decrypted_data['result_data'][($i-1)]['ReactionNo']
|
|
) {
|
|
|
|
// Record Sebelumnya
|
|
$prev = [
|
|
"SAMP_ID" => $decrypted_data['result_data'][($i-1)]['SAMP_ID'],
|
|
"ITEM_NAME" => $decrypted_data['result_data'][($i-1)]['ITEM_NAME'],
|
|
"ASP_CNT" => $decrypted_data['result_data'][($i-1)]['ASP_CNT'],
|
|
"CONC_DATA" => $decrypted_data['result_data'][($i-1)]['CONC_DATA'],
|
|
"OD_DATA" => $decrypted_data['result_data'][($i-1)]['OD_DATA'],
|
|
"RST_DATE" => $decrypted_data['result_data'][($i-1)]['RST_DATE'],
|
|
"Flag" => $decrypted_data['result_data'][($i-1)]['Flag'],
|
|
"ReactionNo" => $decrypted_data['result_data'][($i-1)]['ReactionNo'],
|
|
"DIL_ORD" => $decrypted_data['result_data'][($i-1)]['DIL_ORD'],
|
|
];
|
|
|
|
// Record Saat ini
|
|
$current = [
|
|
"SAMP_ID" => $decrypted_data['result_data'][($i)]['SAMP_ID'],
|
|
"ITEM_NAME" => $decrypted_data['result_data'][($i)]['ITEM_NAME'],
|
|
"ASP_CNT" => $decrypted_data['result_data'][($i)]['ASP_CNT'],
|
|
"CONC_DATA" => $decrypted_data['result_data'][($i)]['CONC_DATA'],
|
|
"OD_DATA" => $decrypted_data['result_data'][($i)]['OD_DATA'],
|
|
"RST_DATE" => $decrypted_data['result_data'][($i)]['RST_DATE'],
|
|
"Flag" => $decrypted_data['result_data'][($i)]['Flag'],
|
|
"ReactionNo" => $decrypted_data['result_data'][($i)]['ReactionNo'],
|
|
"DIL_ORD" => $decrypted_data['result_data'][($i)]['DIL_ORD'],
|
|
];
|
|
|
|
// Simpan yang memiliki nilai flag ke temp data
|
|
if ($current['Flag'] == null) {
|
|
array_push($filtered_data['result_data'], $prev);
|
|
} else if ($prev['Flag'] == null) {
|
|
array_push($filtered_data['result_data'], $current);
|
|
}
|
|
|
|
// Status untuk melewati/skip index array saat ini
|
|
$status = true;
|
|
|
|
// Kondisi saat record tidak sama
|
|
} else {
|
|
|
|
// Jika sudah menyimpan record ganda diatas maka jangan jalankan ini
|
|
if ($status == false) {
|
|
|
|
$current = [
|
|
"SAMP_ID" => $decrypted_data['result_data'][($i-1)]['SAMP_ID'],
|
|
"ITEM_NAME" => $decrypted_data['result_data'][($i-1)]['ITEM_NAME'],
|
|
"ASP_CNT" => $decrypted_data['result_data'][($i-1)]['ASP_CNT'],
|
|
"CONC_DATA" => $decrypted_data['result_data'][($i-1)]['CONC_DATA'],
|
|
"OD_DATA" => $decrypted_data['result_data'][($i-1)]['OD_DATA'],
|
|
"RST_DATE" => $decrypted_data['result_data'][($i-1)]['RST_DATE'],
|
|
"Flag" => $decrypted_data['result_data'][($i-1)]['Flag'],
|
|
"ReactionNo" => $decrypted_data['result_data'][($i-1)]['ReactionNo'],
|
|
"DIL_ORD" => $decrypted_data['result_data'][($i-1)]['DIL_ORD'],
|
|
];
|
|
|
|
array_push($filtered_data['result_data'], $current);
|
|
|
|
// Ubah status
|
|
} else {
|
|
$status = false;
|
|
}
|
|
|
|
// Digunakan untuk menyimpan record terakhir
|
|
if ($i == ($length_array-1)) {
|
|
|
|
$current = [
|
|
"SAMP_ID" => $decrypted_data['result_data'][($i)]['SAMP_ID'],
|
|
"ITEM_NAME" => $decrypted_data['result_data'][($i)]['ITEM_NAME'],
|
|
"ASP_CNT" => $decrypted_data['result_data'][($i)]['ASP_CNT'],
|
|
"CONC_DATA" => $decrypted_data['result_data'][($i)]['CONC_DATA'],
|
|
"OD_DATA" => $decrypted_data['result_data'][($i)]['OD_DATA'],
|
|
"RST_DATE" => $decrypted_data['result_data'][($i)]['RST_DATE'],
|
|
"Flag" => $decrypted_data['result_data'][($i)]['Flag'],
|
|
"ReactionNo" => $decrypted_data['result_data'][($i)]['ReactionNo'],
|
|
"DIL_ORD" => $decrypted_data['result_data'][($i)]['DIL_ORD'],
|
|
];
|
|
|
|
array_push($filtered_data['result_data'], $current);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$i++;
|
|
}
|
|
|
|
return $filtered_data;
|
|
}
|
|
|
|
}
|