This commit is contained in:
mahdahar 2025-11-19 13:57:23 +07:00
parent 11111aeed3
commit bb24ef6d49
8 changed files with 173 additions and 30 deletions

View File

@ -16,10 +16,11 @@ $routes->get('/', 'Home::index');
$routes->match(['get','post'],'/login', 'Auth::login', ['filter' => 'guest']); $routes->match(['get','post'],'/login', 'Auth::login', ['filter' => 'guest']);
$routes->get('/logout', 'Auth::logout'); $routes->get('/logout', 'Auth::logout');
$routes->get('result/(:any)', 'Result::show/$1');
$routes->get('label/coll/(:any)', 'Label::coll/$1'); $routes->get('label/coll/(:any)', 'Label::coll/$1');
$routes->get('label/dispatch/(:any)/(:any)', 'Label::dispatch/$1/$2'); $routes->get('label/dispatch/(:any)/(:any)', 'Label::dispatch/$1/$2');
$routes->get('label/all/(:any)', 'Label::print_all/$1'); $routes->get('label/all/(:any)', 'Label::print_all/$1');
$routes->get('result/(:any)', 'Result::show/$1');
// ------------------------------------------------------Page Based on Role------------------------------------------------------ // // ------------------------------------------------------Page Based on Role------------------------------------------------------ //
$routes->group('admin', ['filter' => 'role:1'], function($routes) { $routes->group('admin', ['filter' => 'role:1'], function($routes) {
$routes->get('/', 'Admin::index'); $routes->get('/', 'Admin::index');
@ -28,6 +29,7 @@ $routes->group('admin', ['filter' => 'role:1'], function($routes) {
$routes->post('user/create', 'User::create'); $routes->post('user/create', 'User::create');
$routes->post('user/update', 'User::update'); $routes->post('user/update', 'User::update');
$routes->post('user/delete', 'User::delete'); $routes->post('user/delete', 'User::delete');
$routes->get('result/invalidate/(:any)', 'Result::invalidate/$1');
}); });
$routes->group('doctor', ['filter' => 'role:2'], function($routes) { $routes->group('doctor', ['filter' => 'role:2'], function($routes) {
@ -44,4 +46,6 @@ $routes->group('cs', ['filter' => 'role:4'], function($routes) {
// ------------------------------------------------------For API------------------------------------------------------ // // ------------------------------------------------------For API------------------------------------------------------ //
// $routes->get('/api/dashboard', 'ApiDashboard::index'); // $routes->get('/api/dashboard', 'ApiDashboard::index');
$routes->get('api/specimen/(:any)', 'Specimen::show/$1'); $routes->get('api/specimen/(:any)', 'Specimen::show/$1');
$routes->post('api/specimen/collect/(:any)', 'Specimen::collect/$1');
$routes->post('api/specimen/unreceive/(:any)', 'Specimen::unreceive/$1');

View File

@ -110,4 +110,8 @@ class Admin extends BaseController
public function modal_specimen() { public function modal_specimen() {
return view('admin/modal_specimen'); return view('admin/modal_specimen');
} }
public function result_show() {
return view('result/result_show');
}
} }

View File

@ -1,8 +1,10 @@
<?php <?php
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait;
class Result extends BaseController { class Result extends BaseController {
use ResponseTrait;
public function show($accessnumber) { public function show($accessnumber) {
$db = db_connect(); $db = db_connect();
$data['accessnumber'] = $accessnumber; $data['accessnumber'] = $accessnumber;
@ -10,7 +12,16 @@ class Result extends BaseController {
->query("SELECT STATS FROM GDC_CMOD.dbo.V_DASHBOARD_DEV WHERE SP_ACCESSNUMBER='$accessnumber'") ->query("SELECT STATS FROM GDC_CMOD.dbo.V_DASHBOARD_DEV WHERE SP_ACCESSNUMBER='$accessnumber'")
->getResultArray(); ->getResultArray();
$data['status'] = $result[0]['STATS']; $data['status'] = $result[0]['STATS'];
return view('result/show',$data); return view('result/result_show',$data);
} }
public function invalidate($accessnumber) {
$db = db_connect();
$sql = "update GDC_CMOD.dbo.CM_REQUESTS set ISVAL=null, VALUSER=null, VALDATE=null,
ISVAL2=null, VAL2USER=null, VAL2DATE=null where ACCESSNUMBER='$accessnumber'";
$result = $db->query($sql);
$data = ['status' => 'success', 'message' => 'Data updated successfully', 'data' => "$accessnumber" ];
return $this->response->setJSON($data);
}
} }

View File

@ -1,7 +1,10 @@
<?php <?php
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait;
class Specimen extends BaseController { class Specimen extends BaseController {
use ResponseTrait;
public function show($access) { public function show($access) {
$db = \Config\Database::connect(); $db = \Config\Database::connect();
@ -53,5 +56,57 @@ class Specimen extends BaseController {
return $this->response->setJSON($data); return $this->response->setJSON($data);
} }
public function collect($accessnumber) {
$db = \Config\Database::connect();
$input = $this->request->getJSON(true);
$samplenumber = $input['samplenumber'];
$status = $input['status'];
$userid = $input['userid'];
$sql = "if not exists (select * from GDC_CMOD.dbo.TUBES where ACCESSNUMBER='$accessnumber' and TUBENUMBER='$samplenumber' and STATUS='$status')
begin
update GDC_CMOD.dbo.TUBES set USERID='$userid',STATUS='$status', COLLECTIONDATE=getdate() where ACCESSNUMBER='$accessnumber' and TUBENUMBER='$samplenumber'
end";
$db->query($sql);
$sql = "INSERT INTO GDC_CMOD.dbo.AUDIT_TUBES(ACCESSNUMBER, TUBENUMBER, USERID, STATUS, LOGDATE)
VALUES ('$accessnumber', '$samplenumber', '$userid', '$status', getdate())";
$db->query($sql);
return $this->respondCreated([ 'status' => 'success', 'message' => 'Data updated successfully', 'data' => "$accessnumber-$samplenumber" ], 201);
}
public function unreceive($accessnumber) {
$db = \Config\Database::connect();
$input = $this->request->getJSON(true);
$samplenumber = $input['samplenumber'];
// update firebird
$sql = "select r.EXTERNALORDERNUMBER, dt.TESTCODE, do.HISCODE from glendb.dbo.TESTS t
left join glendb.dbo.DICT_TESTS dt on dt.TESTID=t.TESTID
left join glendb.dbo.REQUESTS r on r.REQUESTID=t.REQUESTID
left join glendb.dbo.DICT_TEST_SAMPLES dts on dts.TESTID=t.TESTID
left join glendb.dbo.DICT_SAMPLES_TYPES ds on ds.SAMPTYPEID=dts.SAMPTYPEID
left join GDC_CMOD.dbo.DICT_TESTS_ORDER do on do.TESTCODE=dt.TESTCODE
where t.DEPTH=0
and r.ACCESSNUMBER='$req' and ds.SAMPCODE='$samplenumber'";
$rows = $db->query($sql)->getResultArray();
$his_test = '';
foreach( $rows as $row ) {
$hon = $row['EXTERNALORDERNUMBER'];
$testcode = $row['TESTCODE'];
$hiscode = $row['HISCODE'];
$his_test .= "'$hiscode',";
$lis_test .= "'$testcode',";
}
$his_test = rtrim($his_test,',');
$lis_test = rtrim($lis_test,',');
$conn = odbc_connect('GLENEAGLES','','');
$sql = "UPDATE TDL_ORDERDT SET ODD_NRECEIVED=NULL , ODD_DTRECEIVE=NULL WHERE ODR_CNOLAB='$hon' and ODD_CPRODUCTCODE IN ($his_test)";
$rs = odbc_exec($conn,$sql);
if (!$rs) {exit("Error in Update FB");}
$sql = "update SP_TUBES set TUBESTATUS=0 where SP_ACCESSNUMBER='$accessnumber' and SAMPLETYPE='$samplenumber' ";
$db->query($sql);
$sql = "update SP_TESTS set SP_TESTSTATUS=NULL where SP_ACCESSNUMBER='$req' and SP_TESTCODE in ($lis_test)";
$db->query($sql);
return $this->respondCreated([ 'status' => 'success', 'message' => 'Data updated successfully', 'data' => "$accessnumber-$samplenumber" ], 201);
}
} }

View File

@ -127,14 +127,22 @@
.Suspend { .Suspend {
background-color: purple; background-color: purple;
} }
.btn-xs {
font-size : 0.7rem;
}
</style> </style>
<?= $this->renderSection('css'); ?> <?= $this->renderSection('css'); ?>
</head> </head>
<body> <body class="d-flex flex-column min-vh-100">
<?= $this->renderSection('content'); ?> <?= $this->renderSection('content'); ?>
<footer class="bg-dark text-white mt-auto py-1 px-3 fs-6">
<small>© 2025 - 5Panda</small>
</footer>
<script> <script>
console.log("salam 5panda" ); console.log("salam 5panda" );
</script> </script>

View File

@ -68,16 +68,15 @@
<th>S</th> <th>S</th>
<th style='width:7%;'>Order Datetime</th> <th style='width:7%;'>Order Datetime</th>
<th>Patient Name</th> <th>Patient Name</th>
<th>No Lab</th> <th style='width:7%;'>No Lab</th>
<th>No Register</th> <th style='width:7%;'>No Register</th>
<th style='width:10%;'>Reff</th> <th style='width:8%;'>Reff</th>
<th>Doctor</th> <th style='width:8%;'>Doctor</th>
<th style='width:10%;'>Tests</th> <th style='width:15%;'>Tests</th>
<th style='width:5%;'>Result To</th> <th style='width:5%;'>Result To</th>
<th style='width:8%;'>Validation</th> <th style='width:8%;'>Validation</th>
<th style='width:5%;'>Status</th> <th style='width:5%;'>Status</th>
<th style='width:8%;'></th> <th style='width:8%;'></th>
<th style='width:6%;'></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -95,6 +94,8 @@
case 9: $class = 'PenVerification'; break; case 9: $class = 'PenVerification'; break;
default: $class = ''; break; default: $class = ''; break;
} }
$tests = esc($row['tests']);
$tests = str_replace(",", ", ", $tests);
?> ?>
<tr> <tr>
<!-- <!--
@ -110,17 +111,23 @@
--> -->
<td> <?= esc($row['statscode']) ?> </td> <td> <?= esc($row['reqdate']) ?> </td> <td> <?= esc($row['patname']) ?> </td> <td> <?= esc($row['statscode']) ?> </td> <td> <?= esc($row['reqdate']) ?> </td> <td> <?= esc($row['patname']) ?> </td>
<td> <?= esc($row['sp_accessnumber']) ?> </td> <td> <?= esc($row['hostordernumber']) ?> </td> <td> <?= esc($row['reff']) ?> </td> <td> <?= esc($row['sp_accessnumber']) ?> </td> <td> <?= esc($row['hostordernumber']) ?> </td> <td> <?= esc($row['reff']) ?> </td>
<td> <?= esc($row['doc']) ?> </td> <td> <?= esc($row['tests']) ?> </td> <td> <?= esc($row['odr_cresult_to']) ?> </td> <td> <?= esc($row['doc']) ?> </td> <td> <?= $tests; ?> </td> <td> <?= esc($row['odr_cresult_to']) ?> </td>
<td> <h6> <span class="px-3 py-2 badge text-success border border-success bg-success-subtle"> <?=$row['val'];?> </span> </h6> <td data-acc="<?=$row['sp_accessnumber'];?>">
<a href="#" class="text-primary">Result</a><br> <a href="#" class="text-primary" disabled>Invalidation</a><br> <h6> <span class="px-3 py-2 badge bg-success"> <?=$row['val'];?> </span> </h6>
<?php if ($row['val'] != 0) {?>
<a href="#" class="btn btn-xs btn-secondary py-0 px-2 invalidate-btn" onclick="invalidate('<?=$row['sp_accessnumber'];?>'); return false;">Invalidate</a><br>
<?php }?>
</td> </td>
<td class="pointercol <?= esc($class) ?>" data-access="<?= $row['sp_accessnumber'] ?>" data-bs-toggle="modal" data-bs-target="#detailModal"> <?= esc($row['stats']) ?> </td> <td class="pointercol <?= esc($class) ?>" data-access="<?= $row['sp_accessnumber'] ?>" data-bs-toggle="modal" data-bs-target="#detailModal"> <?= esc($row['stats']) ?> </td>
<td> <td>
<a href="<?=base_url('result/'.$row['sp_accessnumber']);?>" target="_blank" class="text-primary">Preview</a> <br/> <a href="<?=base_url('result/'.$row['sp_accessnumber']);?>" target="_blank" class="btn btn-xs btn-primary py-0 px-2">Preview</a> <br/>
<a href="#" class="text-danger">Print</a> | <a href="#" class="text-danger">Eng</a> <br/> <?php if($row['val'] != 0) { ?>
<a href="#" class="text-primary">Pdf</a> <a href="http://glenlis/spooler_db/main_dev.php?acc=<?=$row['sp_accessnumber'];?>" target="_blank" class="btn btn-xs btn-primary py-0 px-1">Print</a> |
<a href="http://glenlis/spooler_db/main_dev.php?acc=<?=$row['sp_accessnumber'];?>&eng=1" target="_blank" class="btn btn-xs btn-primary py-0 px-1">Eng</a> |
<a href="#" class="btn btn-xs btn-secondary py-0 px-1">Pdf</a> <br />
<input type="checkbox" name="printed"> Printed
<?php } ?>
</td> </td>
<td> <input type="checkbox" name="printed"> Printed<br> <input type="checkbox" name="hardcopy"> Hardcopy </td>
</tr> </tr>
<?php endforeach; ?> <?php endforeach; ?>
</tbody> </tbody>
@ -158,14 +165,14 @@
order: [[0, 'asc'], [3, 'asc']], order: [[0, 'asc'], [3, 'asc']],
paging: false, paging: false,
scrollCollapse: true, scrollCollapse: true,
scrollY: '75vh', scrollY: '70vh',
columnDefs: [{ columnDefs: [{
className: 'text-center', className: 'text-center',
targets: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] targets: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
}, // semua kolom di tengah }, // semua kolom di tengah
{ {
className: 'text-start', className: 'text-start',
targets: [12] targets: [11]
} }
], ],
responsive: true, responsive: true,
@ -191,7 +198,61 @@
}); });
}); });
function invalidate(accessnumber) {
if(confirm("Are you sure?")) {
$.get(`<?=base_url('admin/result/invalidate/');?>/${accessnumber}`);
const cell = document.querySelector(`[data-acc="${accessnumber}"]`);
if(cell){
cell.querySelector(".badge").textContent = "0";
const btn = cell.querySelector(".invalidate-btn");
if (btn) btn.remove();
}
}
}
function collect(accessnumber, samplenumber, status) {
// toggle checkbox
const row = document.getElementById(`row-${accessnumber}-${samplenumber}`);
const checkbox = row.querySelector('.coll-checkbox');
checkbox.checked = status;
$.ajax({
url: `<?=base_url('api/specimen/collect');?>/${accessnumber}`,
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify({ samplenumber:samplenumber, status:status, userid:"<?=session('userid');?>" }),
success: function(response) {
console.log("Success:", response);
},
error: function(xhr, status, error) {
console.error("Error:", status, error);
}
});
}
function unreceive(accessnumber, samplenumber) {
// toggle checkbox
const row = document.getElementById(`row-${accessnumber}-${samplenumber}`);
const checkbox = row.querySelector('.recv-checkbox');
checkbox.checked = status;
$.ajax({
url: `<?=base_url('api/specimen/unreceive');?>/${accessnumber}`,
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify({ samplenumber:samplenumber }),
success: function(response) {
console.log("Success:", response);
},
error: function(xhr, status, error) {
console.error("Error:", status, error);
}
});
}
// Untuk Koment Value // Untuk Koment Value
function commentValue() { function commentValue() {

View File

@ -65,26 +65,26 @@
</td> </td>
</tr> </tr>
{{#samples}} {{#samples}}
<tr> <tr id='row-{{accessnumber}}-{{sampcode}}'>
<td>{{sampcode}}</td> <td>{{sampcode}}</td>
<td>{{name}}</td> <td>{{name}}</td>
<td class='text-center'> <td class='text-center'>
<input type="checkbox" class="form-check-input" <input type="checkbox" class="form-check-input coll-checkbox"
{{#is_coll}}checked{{/is_coll}} {{#is_coll}}checked{{/is_coll}}
disabled disabled
> >
</td> </td>
<td class='text-center'> <td class='text-center'>
<input type="checkbox" class="form-check-input" <input type="checkbox" class="form-check-input recv-checkbox"
{{#is_recv}}checked{{/is_recv}} {{#is_recv}}checked{{/is_recv}}
disabled disabled
> >
</td> </td>
<td> <td>
<button class="btn btn-sm btn-secondary px-2 py-1"><i class="bi bi-printer"></i></button> <button class="btn btn-sm btn-secondary px-2 py-1"><i class="bi bi-printer"></i></button>
<button class="btn btn-success px-2 py-1" onclick=""><h6 class="p-0 m-0">Coll.</h6></button> <button class="btn btn-success px-2 py-1" onclick="collect({{accessnumber}}, {{sampcode}}, 1)"><h6 class="p-0 m-0">Coll.</h6></button>
<button class="btn btn-warning px-2 py-1" onclick=""><h6 class="p-0 m-0">Un-Coll.</h6></button> <button class="btn btn-warning px-2 py-1" onclick="collect({{accessnumber}}, {{sampcode}}, 0)"><h6 class="p-0 m-0">Un-Coll.</h6></button>
<button class="btn btn-warning px-2 py-1" onclick=""><h6 class="p-0 m-0">Un-Recv.</h6></button> <button class="btn btn-warning px-2 py-1" onclick="unreceive({{accessnumber}}, {{sampcode}})"><h6 class="p-0 m-0">Un-Recv.</h6></button>
</td> </td>
<td> <td>

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Responsive HTML Iframe Demo</title> <title>Result Preview</title>
<script src="https://cdn.tailwindcss.com"></script> <script src="https://cdn.tailwindcss.com"></script>
<script> <script>
tailwind.config = { tailwind.config = {
@ -45,7 +45,7 @@ if(strpos(strtolower($status), "verif") !== false) { $verif = 1; }
<?php if($verif == 0) { ?> <?php if($verif == 0) { ?>
<div class="absolute inset-0 flex items-center justify-center pointer-events-none z-20"> <div class="absolute inset-0 flex items-center justify-center pointer-events-none z-20">
<span class="text-7xl font-black text-gray-600 opacity-20 transform rotate-[-30deg] select-none"> <span class="text-7xl font-black text-gray-600 opacity-20 transform rotate-[-30deg] select-none">
Trial - please contact 5panda Unverified
</span> </span>
</div> </div>
<?php } ?> <?php } ?>