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 = []; // 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() === FALSE) { $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 { $db->transCommit(); 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; } }