Merge branch 'main' into zakaria

gas
This commit is contained in:
mikael-zakaria 2024-12-07 15:52:01 +08:00
commit 86046bdff7
15 changed files with 279 additions and 28 deletions

View File

@ -72,12 +72,15 @@ class Filters extends BaseFilters
'before' => [
'role' => [ 'except' => [
'auth/*', 'setup', 'api/*'
]]
]],
// 'honeypot',
// 'csrf',
// 'invalidchars',
],
'after' => [
'toolbar' => [
'except' => ['api/*', 'prints/*', 'prints/result_test/*'],
],
// 'honeypot',
// 'secureheaders',
],

View File

@ -23,7 +23,7 @@ $routes->get('/', 'Auth::redirects');
$routes->get('changePass/', 'Auth::changePass');
// API - Dashboard
$routes->get('/api/dashboard/index', 'API_Dashboard::index');
$routes->POST('/api/dashboard/index', 'API_Dashboard::index');
// API - Tubes
$routes->get('/tubes/collect/(:any)/(:any)', 'API_Tubes::collect/$1/$2');
@ -51,12 +51,17 @@ $routes->POST('api/dictTests/save', 'API_DictTests::save');
$routes->get('api/dictTests/index', 'API_DictTests::index');
$routes->get('api/dictTests/detail/(:any)', 'API_DictTests::detail/$1');
// API - DictTests
// API - DictMappings
$routes->get('api/dictMappings/index', 'API_DictMappings::index');
$routes->POST('api/dictMappings/saveSingle', 'API_DictMappings::saveSingle');
$routes->POST('api/dictMappings/saveProfile', 'API_DictMappings::saveProfile');
$routes->get('api/dictMappings/detail/(:any)', 'API_DictMappings::detail/$1');
// API - DictChapters
$routes->get('api/dictChapters/index', 'API_DictChapters::index');
$routes->POST('api/dictChapters/save', 'API_DictChapters::save');
$routes->get('api/dictChapters/detail/(:any)', 'API_DictChapters::detail/$1');
// admin
$routes->group('admin', ['filter' => 'role:admin'], static function ($routes) {
$routes->get('', 'AdminController::index');
@ -64,6 +69,7 @@ $routes->group('admin', ['filter' => 'role:admin'], static function ($routes) {
$routes->get('userroles/', 'AdminController::userroles_index');
$routes->get('users/', 'AdminController::users_index');
$routes->get('dictTests/', 'AdminController::dictTests_index');
$routes->get('dictChapters/', 'AdminController::dictChapters_index');
$routes->get('dictMappings/', 'AdminController::dictMappings_index');
});
@ -80,6 +86,6 @@ $routes->group('fo', ['filter' => 'role:fo'], static function ($routes) {
});
// Printers
$routes->get('/prints/single_sample/(:any)/(:any)', 'PrinterController::printSingleSampleBarcode/$1/$2');
$routes->get('/prints/all_sample', 'PrinterController::printAllSampleBarcode');
$routes->get('/prints/result_test/(:any)', 'PrinterController::printResultTest/$1');
$routes->get('prints/single_sample/(:any)/(:any)', 'PrinterController::printSingleSampleBarcode/$1/$2');
$routes->get('prints/all_sample', 'PrinterController::printAllSampleBarcode');
$routes->get('prints/result_test/(:any)', 'PrinterController::printResultTest/$1');

View File

@ -119,4 +119,5 @@ class Toolbar extends BaseConfig
public array $watchedExtensions = [
'php', 'css', 'js', 'html', 'svg', 'json', 'env',
];
}

View File

@ -8,6 +8,8 @@ class API_Dashboard extends ResourceController {
public function index() {
$db = \Config\Database::connect();
$date1 = $this->request->getPost('date1');
$date2 = $this->request->getPost('date2');
$sql = "select sr.COLLECTIONDATE, sr.SP_ACCESSNUMBER, sr.HOSTORDERNUMBER, p.PATNUMBER, p.NAME,
TESTS=stuff(( select ', '+'('+T.SP_TESTCODE+')' from
( select T.SP_TESTCODE from SP_TESTS T
@ -49,7 +51,7 @@ end STATS
from SP_REQUESTS sr
left join PATIENTS p on p.PATID=sr.PATID
left join REQUESTS r on r.ACCESSNUMBER=sr.SP_ACCESSNUMBER
where sr.COLLECTIONDATE between '2024-11-13 00:00' and '2024-11-21 23:59'
where sr.COLLECTIONDATE between '$date1 00:00' and '$date2 23:59'
order by sr.COLLECTIONDATE desc";
$query = $db->query($sql);
$results = $query->getResultArray();

View File

@ -0,0 +1,57 @@
<?php
namespace App\Controllers;
use CodeIgniter\RESTful\ResourceController;
class API_DictChapters extends ResourceController {
protected $format = 'json';
public function index() {
$db = \Config\Database::connect();
$sql = "select dc.CHAPCODE, dc.SHORTTEXT, cdc.TEXT1, cdc.TEXT2 from DICT_CHAPTERS dc
left join cmod.dbo.CM_DICT_CHAPTERS cdc on dc.CHAPCODE=cdc.CHAPCODE";
$query = $db->query($sql);
$results = $query->getResultArray();
$data['dictChapters'] = $results;
return $this->respond($data, 200);
}
public function detail($chapcode) {
$data = array();
$db = \Config\Database::connect();
$sql = "select dc.CHAPCODE, dc.SHORTTEXT, cdc.TEXT1, cdc.TEXT2 from DICT_CHAPTERS dc
left join cmod.dbo.CM_DICT_CHAPTERS cdc on dc.CHAPCODE=cdc.CHAPCODE
where dc.CHAPCODE='$chapcode'";
$query = $db->query($sql);
$results = $query->getResultArray();
if(isset($results[0])) { $data = $results[0]; }
return $this->respond($data, 200);
}
public function save() {
$chapcode = $this->request->getPost('chapcode');
$text1 = $this->request->getPost('text1');
$text2 = $this->request->getPost('text2');
$db = \Config\Database::connect();
$sql = "MERGE INTO cmod.dbo.CM_DICT_CHAPTERS AS t
USING ( VALUES ('$chapcode', '$text1', '$text2')
) AS s (CHAPCODE, TEXT1, TEXT2) on t.CHAPCODE=s.CHAPCODE
WHEN NOT MATCHED BY TARGET THEN
INSERT (CHAPCODE, TEXT1, TEXT2)
VALUES (s.CHAPCODE, s.TEXT1, s.TEXT2)
WHEN MATCHED THEN
UPDATE set TEXT1=s.TEXT1, TEXT2=s.TEXT2;";
//echo "<pre>$sql</pre>";
if( $db->query($sql) ) {
return $this->respond(['message' => 'Save Success'],201);
} else {
$response = [
'errors' => $db->errors(),
'message' => 'Invalid Inputs'
];
return $this->fail($response , 409);
}
}
}

View File

@ -61,8 +61,14 @@ class API_DictTests extends ResourceController {
$refftext = $this->request->getPost('refftext');
$db = \Config\Database::connect();
$sql = "INSERT INTO cmod.dbo.CM_DICT_TESTS (TESTCODE, TEXT1, TEXT2, REFFTEXT, LOGDATE ) VALUES ('$testcode', '$text1', '$text2', '$refftext' GETDATE())";
$sql = "UPDATE cmod.dbo.CM_DICT_TESTS set TEXT1='$text1', TEXT2='$text2', REFFTEXT='$refftext', LOGDATE=GETDATE() where TESTCODE='$testcode'";
$sql = "MERGE INTO cmod.dbo.CM_DICT_TESTS AS t
USING ( VALUES ('$testcode', '$text1', '$text2', '$unit', '$refftext')
) AS s (TESTCODE, TEXT1, TEXT2, UNIT, REFFTEXT) on t.TESTCODE=s.TESTCODE
WHEN NOT MATCHED BY TARGET THEN
INSERT (TESTCODE, TEXT1, TEXT2, UNIT, REFFTEXT, LOGDATE)
VALUES (s.TESTCODE, s.TEXT1, s.TEXT2, s.UNIT, s.REFFTEXT, GETDATE())
WHEN MATCHED THEN
UPDATE set TEXT1=s.TEXT1, TEXT2=s.TEXT2, UNIT=s.UNIT, REFFTEXT=s.REFFTEXT;";
if( $db->query($sql) ) {
return $this->respond(['message' => 'Save Success'],201);

View File

@ -59,6 +59,10 @@ class AdminController extends BaseController {
return view('admin/dictTests_index');
}
public function dictChapters_index() {
return view('admin/dictChapters_index');
}
public function dictMappings_index() {
$db = \Config\Database::connect();
$sql = "select TESTCODE from DICT_TESTS where ENDVALIDDATE is null";

View File

@ -244,7 +244,7 @@ P1
$headPage = "
<div id='page'>
<div id='pagetop' style='height:0.01cm'> </div>
<img src='http://cmod.id/assets/img/padma-header.png' class='img' />
<img src='".base_url()."assets/img/padma-header.png' class='img' />
<div id='dinfo'>
@ -415,7 +415,7 @@ P1
}
public function printResultTest($access) {
$data_mentah = [
[
"chapter_eng" => "IMUNOLOGY 4 PANEL",

View File

@ -13,6 +13,7 @@
<div class="card border-0">
<div class="card-body">
Date : <input class='date1' type='date' value=''> - <input class='date2' type='date'> <button onclick='index()'>search</button> <br/>
<div class="table-responsive">
<table id="myTable" class="table table-hover">
<thead>
@ -43,13 +44,21 @@
<?= $this->section('script') ?>
<script>
let curDate = new Date().toJSON().slice(0, 10);
console.log(curDate);
$('.date1').val(curDate);
$('.date2').val(curDate);
index();
function index() {
let url = '<?=base_url('');?>api/dashboard/index';
date1 = $('.date1').val();
date2 = $('.date2').val();
$.ajax({
url: url,
method: 'GET',
success: function(response) {
method: 'POST',
data : {date1:date1, date2:date2},
success: function(response) {
/*
// counter
*/
@ -79,6 +88,7 @@ function index() {
/*
// table
*/
$("#myTable").DataTable().destroy();
$("#table-body").html("");
var data = response['data'];
for (var i = 0; i < data.length; i++) {

View File

@ -0,0 +1,131 @@
<?= $this->extend('admin/layout/main.php') ?>
<?= $this->section('content') ?>
<div class="card border-0 m-1">
<div class="card-body">
<div class='card-title'>Dictionary Chapters</div>
<div class="table-responsive">
<table id="myTable" class="table">
<thead>
<tr>
<th>Chapter code</th>
<th>Shorttext</th>
<th>Text</th>
<th>Action</th>
</tr>
</thead>
<tbody id='table-body'>
</tbody>
</table>
</div>
</div>
</div>
<div class="modal fade" id="modal_crud" aria-hidden="true" tabindex="-1">
<div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalToggleLabel">Edit Chapter</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" ></button>
</div>
<div class="modal-body" style='background-color:#F4F6FF'>
<div class="row">
<div class="col-12">
<table class="table table-sm table-borderless">
<tr class="align-middle"> <th>Chaptercode</th> <th>:</th> <td id='chapcode'></td> </tr>
<tr class="align-middle"> <th>Shorttext</th> <th>:</th> <td id='chaptext'></td> </tr>
<tr class="align-middle"> <th>Text 1</th> <th>:</th> <td><textarea class='form-control' id='text1'/></textarea></td> </tr>
<tr class="align-middle"> <th>Text 2</th> <th>:</th> <td><textarea class='form-control' id='text2'/></textarea></td> </tr>
</table>
<button class='btn btn-sm btn-primary' onclick='save()'>Save</button>
<button class='btn btn-sm btn-secondary' data-bs-dismiss="modal">Cancel</button>
</div>
</div>
</div>
</div>
</div>
</div>
<?= $this->endSection() ?>
<?= $this->section('script') ?>
<script>
index();
function index() {
let url = '<?=base_url('');?>api/dictChapters/index';
$.ajax({
url: url,
method: 'GET',
success: function(response) {
$("#myTable").DataTable().destroy();
$("#table-body").html("");
var data = response['dictChapters'];
for (var i = 0; i < data.length; i++) {
chapcode = data[i].CHAPCODE;
shorttext = data[i].SHORTTEXT;
text1 = '';
text2 = '';
if(data[i].TEXT1 != null) { text1 = data[i].TEXT1; }
if(data[i].TEXT2 != null) { text2 = data[i].TEXT2; }
let editBtn = '<button class="btn btn-sm btn-success" ' + ' onclick="edit(\'' + chapcode + '\')">Edit' + '</button> ';
let datarow = '<tr class="align-middle">' +
'<td>' + chapcode + '</td>' + '<td>' + shorttext + '</td> <td> <pre class="m-0">' + text1 + '<hr/>' + text2 + '</pre> </td>' +
'<td>' + editBtn + '</td>' +
'</tr>';
$("#table-body").append(datarow);
}
$("#myTable").DataTable({
"pageLength" : 25,
});
},
error: function(response) { console.log(response.responseJSON); }
});
}
function edit(chapcode) {
let url = '<?=base_url('');?>api/dictChapters/detail/'+chapcode;
$("#chapcode").html('');
$("#chaptext").html('');
$.ajax({
url: url,
method: "GET",
success: function(response) {
let data = response;
$("#chapcode").html(data.CHAPCODE);
$("#chaptext").html(data.SHORTTEXT);
$("#text1").val(data.TEXT1);
$("#text2").val(data.TEXT2);
$("#modal_crud").modal('show');
},
error: function(response) {
console.log(response.responseJSON)
}
});
}
function save() {
let url = '<?=base_url('');?>api/dictChapters/save';
var chapcode = $("#chapcode").html();
var text1 = $("#text1").val();
var text2 = $("#text2").val();
let data = { chapcode: chapcode, text1:text1, text2:text2 };
$.ajax({
url: url,
method: "POST",
data: data,
success: function(response) {
$("#chapcode").val('');
$("#text1").val('');
$("#text2").val('');
$("#modal_crud").modal('hide');
index();
},
error: function(response) {
console.log(response.responseJSON)
}
});
}
</script>
<?= $this->endSection() ?>

View File

@ -7,7 +7,8 @@
<a class="nav-link" href="<?=base_url();?>changePass/"><div class="sb-nav-link-icon"><i class="bi bi-key"></i></div>Change Password</a>
<div class="sb-sidenav-menu-heading">Administration</div>
<a class="nav-link" href="<?=base_url();?>admin/dictMappings/"> <div class="sb-nav-link-icon"><i class="bi bi-diagram-2"></i></div> Dict. Mapping Order </a>
<a class="nav-link" href="<?=base_url();?>admin/dictTests/"> <div class="sb-nav-link-icon"><i class="bi bi-journal-album"></i></div> Dict. Test </a>
<a class="nav-link" href="<?=base_url();?>admin/dictChapters/"> <div class="sb-nav-link-icon"><i class="bi bi-journal-medical"></i></div> Dict. Chapter</a>
<a class="nav-link" href="<?=base_url();?>admin/dictTests/"> <div class="sb-nav-link-icon"><i class="bi bi-file-medical"></i></div> Dict. Test </a>
<a class="nav-link" href="<?=base_url();?>admin/users/"> <div class="sb-nav-link-icon"><i class="bi bi-person-circle"></i></div> Users </a>
<a class="nav-link" href="<?=base_url();?>admin/userroles/"> <div class="sb-nav-link-icon"><i class="bi bi-person-lock"></i></div> User Roles </a>
</div>

View File

@ -41,7 +41,7 @@ function index() {
let url = '<?=base_url('');?>api/dashboard/index';
$.ajax({
url: url,
method: 'GET',
method: 'POST',
success: function(response) {
/*
// counter

View File

@ -1,4 +1,4 @@
<?= $this->extend('user/layout/main.php') ?>
<?= $this->extend('admin/layout/main.php') ?>
<?= $this->section('content') ?>
@ -7,6 +7,7 @@
<div class="card border-0">
<div class="card-body">
Date : <input class='date1' type='date' value=''> - <input class='date2' type='date'> <button onclick='index()'>search</button> <br/>
<div class="table-responsive">
<table id="myTable" class="table">
<thead>
@ -17,6 +18,7 @@
<th>Hosp</th>
<th>Test</th>
<th>Status</th>
<th></th>
</thead>
<tbody id="table-body">
</tbody>
@ -36,13 +38,21 @@
<?= $this->section('script') ?>
<script>
let curDate = new Date().toJSON().slice(0, 10);
console.log(curDate);
$('.date1').val(curDate);
$('.date2').val(curDate);
index();
function index() {
let url = '<?=base_url('');?>api/dashboard/index';
date1 = $('.date1').val();
date2 = $('.date2').val();
$.ajax({
url: url,
method: 'GET',
success: function(response) {
method: 'POST',
data : {date1:date1, date2:date2},
success: function(response) {
/*
// counter
*/
@ -72,6 +82,7 @@ function index() {
/*
// table
*/
$("#myTable").DataTable().destroy();
$("#table-body").html("");
var data = response['data'];
for (var i = 0; i < data.length; i++) {
@ -117,7 +128,8 @@ function index() {
}
let datarow = '<tr class="align-middle" ' + datafilter + ' >' +
'<td>' + colldate + '</td> <td>' + patnumber + '</td> <td>' + accessnumber + '</td> <td>' + patname + '</td> <td>' + hon + '</td> <td>' + tests + '</td>' +
"<td role='button' class='"+bgcolor+" text-center align-middle' onclick='viewAccess("+accessnumber+")'>"+stattext+"</td>" + '</tr>';
"<td role='button' class='"+bgcolor+" text-center align-middle' onclick='viewAccess("+accessnumber+")'>"+stattext+"</td>" +
"<td role='button' class='text-center align-middle' onclick='resultPdfAccess("+accessnumber+")'> <i class='bi bi-filetype-pdf'></i> </td>" +'</tr>';
$("#table-body").append(datarow);
}
$('#myTable').DataTable();
@ -164,10 +176,14 @@ function index() {
}
function viewAccess(access) {
let url = '<?=base_url();?>fo/dashboard/viewAccess/'+access;
let url = '<?=base_url();?>admin/dashboard/viewAccess/'+access;
$('.modal-content').load(url, function(){
$('#modal').modal('show');
});
}
function resultPdfAccess(access) {
let url = '<?=base_url();?>prints/result_test/'+access;
window.open(url, '_blank');
}
</script>
<?= $this->endSection() ?>

View File

@ -5,10 +5,8 @@
<link rel='stylesheet' href='<?=base_url();?>assets/css/pdf.css' />
</head>
<body style='-webkit-print-color-adjust:exact;'>
<body style='-webkit-print-color-adjust:exact;'>
<?php echo $data; ?>
</body>
</html>

View File

@ -1,4 +1,4 @@
<?= $this->extend('user/layout/main.php') ?>
<?= $this->extend('admin/layout/main.php') ?>
<?= $this->section('content') ?>
@ -7,6 +7,7 @@
<div class="card border-0">
<div class="card-body">
Date : <input class='date1' type='date' value=''> - <input class='date2' type='date'> <button onclick='index()'>search</button> <br/>
<div class="table-responsive">
<table id="myTable" class="table">
<thead>
@ -17,6 +18,7 @@
<th>Hosp</th>
<th>Test</th>
<th>Status</th>
<th></th>
</thead>
<tbody id="table-body">
</tbody>
@ -36,13 +38,21 @@
<?= $this->section('script') ?>
<script>
let curDate = new Date().toJSON().slice(0, 10);
console.log(curDate);
$('.date1').val(curDate);
$('.date2').val(curDate);
index();
function index() {
let url = '<?=base_url('');?>api/dashboard/index';
date1 = $('.date1').val();
date2 = $('.date2').val();
$.ajax({
url: url,
method: 'GET',
success: function(response) {
method: 'POST',
data : {date1:date1, date2:date2},
success: function(response) {
/*
// counter
*/
@ -72,6 +82,7 @@ function index() {
/*
// table
*/
$("#myTable").DataTable().destroy();
$("#table-body").html("");
var data = response['data'];
for (var i = 0; i < data.length; i++) {
@ -117,7 +128,8 @@ function index() {
}
let datarow = '<tr class="align-middle" ' + datafilter + ' >' +
'<td>' + colldate + '</td> <td>' + patnumber + '</td> <td>' + accessnumber + '</td> <td>' + patname + '</td> <td>' + hon + '</td> <td>' + tests + '</td>' +
"<td role='button' class='"+bgcolor+" text-center align-middle' onclick='viewAccess("+accessnumber+")'>"+stattext+"</td>" + '</tr>';
"<td role='button' class='"+bgcolor+" text-center align-middle' onclick='viewAccess("+accessnumber+")'>"+stattext+"</td>" +
"<td role='button' class='text-center align-middle' onclick='resultPdfAccess("+accessnumber+")'> <i class='bi bi-filetype-pdf'></i> </td>" +'</tr>';
$("#table-body").append(datarow);
}
$('#myTable').DataTable();
@ -164,10 +176,14 @@ function index() {
}
function viewAccess(access) {
let url = '<?=base_url();?>user/dashboard/viewAccess/'+access;
let url = '<?=base_url();?>admin/dashboard/viewAccess/'+access;
$('.modal-content').load(url, function(){
$('#modal').modal('show');
});
}
function resultPdfAccess(access) {
let url = '<?=base_url();?>prints/result_test/'+access;
window.open(url, '_blank');
}
</script>
<?= $this->endSection() ?>