Compare commits

..
33 Commits
Author SHA1 Message Date
servdal 4b915caad7 update 2025-08-27 15:33:56 +07:00
servdal ab494fddf8 update 2025-08-27 15:33:53 +07:00
servdal fef0acb867 Update 2025-08-27 15:29:56 +07:00
servdal c7ecb66ba1 Update Rating Fitur 2025-08-24 20:50:04 +07:00
servdal 2af18f0f68 Update Metode Pengiriman 2025-08-24 16:53:12 +07:00
servdal 0cecf8760c Update send order ke Python MiniPCs 2025-08-23 19:59:36 +07:00
servdal 094ceb0b9f Update open cancel button dan tambah buttun ulang 2025-08-12 17:32:54 +07:00
servdal 92e7cad787 Update pembacaan API 2025-08-07 16:40:10 +07:00
servdal d9e70fc1e9 Stop tracking .env file 2025-08-06 17:30:11 +07:00
servdal d77047db52 Stop tracking .env file 2025-08-06 17:29:26 +07:00
servdal 2d4c608bc9 Update Git Ignore 2025-08-06 17:27:29 +07:00
servdal 77ae72b154 Update Git Ignore 2025-08-06 17:13:41 +07:00
servdal 0c47dc4166 Update Penamaan Variable 2025-08-05 10:16:40 +07:00
servdal 62c2e6bf8e Update ke Laravel 12 struktur modular 2025-08-03 18:09:58 +07:00
servdal 79da34a3e3 Update Port 2025-07-31 11:36:52 +07:00
servdal 0f7bdcefc5 Edit Gitingore 2025-07-17 08:54:38 +07:00
servdal 132d0a0d5f remove force to ssl 2025-07-17 08:32:59 +07:00
servdal 1bbf9c00f1 disable ssl 2025-07-17 08:30:55 +07:00
servdal 9437483030 Update bug waiting laravel 2025-07-17 08:13:00 +07:00
servdal 8289968849 Update Compiler 2025-07-17 07:41:21 +07:00
servdal cd3f9f1628 Update gitignore 2025-07-17 06:32:11 +07:00
servdal 3237dbf10c Update Dockerfile 2025-07-17 06:31:35 +07:00
servdal cedb72d57f Update Add Python 2025-07-16 18:21:10 +07:00
servdal 87255f9965 Update Git Ignore 2025-07-16 07:40:40 +07:00
servdal 9471bf22f5 ubah ke docker mode 2025-07-16 07:36:13 +07:00
servdal 6871d14f94 Add Random Value on NIK and BPJS value if null 2025-07-09 09:52:05 +07:00
servdal 8b4404e8fe Update 2025-07-07 07:52:25 +07:00
servdal 79cfca44c4 bug 2025-07-01 10:27:55 +07:00
servdal bd1e35c511 update git ignore 2025-06-23 14:30:25 +07:00
servdal 027610b61b force to https 2025-06-23 14:04:00 +07:00
servdal c6e3e37ca1 Ignore .env and cache files 2025-06-21 10:53:52 +07:00
servdal 7f9daeeef3 Update status 2025-06-21 10:14:05 +07:00
servdal 0771b98790 Update README.md 2025-06-21 08:29:07 +07:00
15171 changed files with 1606 additions and 673 deletions

No files matched your search

-68
View File
@@ -1,68 +0,0 @@
APP_NAME=Laravel
APP_ENV=production
APP_KEY=base64:pIyfhWd8ewTeJqFNn6RYYIEOtGeprZ8cPzczyrMItNk=
APP_DEBUG=false
APP_URL=http://localhost
LOG_CHANNEL=daily
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=lismikro
DB_USERNAME=lismikro
DB_PASSWORD=lismikro
DB_CONNECTIONLTR=mysql
DB_HOST_SQLLTR=10.10.120.14
DB_PORT_SQLLTR=3306
DB_DATABASE_SQLLTR=lis_mikro
DB_USERNAME_SQLLTR=lis_listener
DB_PASSWORD_SQLLTR=1234567890
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=database
SESSION_LIFETIME=2400
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=[email protected]
MAIL_PASSWORD=ysnraxskgxfkeszm
MAIL_ENCRYPTION=tls
QUEUE_DRIVER=sync
MAIL_FROM_ADDRESS="[email protected]"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=878723
PUSHER_APP_KEY=461fe095afe037987c11
PUSHER_APP_SECRET=c03b22f3d6c148426f67
PUSHER_APP_CLUSTER=ap1
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
VITE_APP_NAME="${APP_NAME}"
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+14
View File
@@ -0,0 +1,14 @@
# Ignore environment files
mergekemain.sh
# Ignore Laravel cache, logs, and storage
/htdocs/storage/*
/database
!/htdocs/storage/.gitignore
/htdocs/.env
# Ignore bootstrap cache
/htdocs/bootstrap/cache/*
/htdocs/listenerlis/listener.log
/htdocs/listenerlis/tcp_raw_data.bin
.env
!/htdocs/bootstrap/cache/.gitignore
-72
View File
@@ -1,72 +0,0 @@
<<<<<<< HEAD
# lis
Laboratory Information System
=======
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
<p align="center">
<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
</p>
## About Laravel
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
- [Simple, fast routing engine](https://laravel.com/docs/routing).
- [Powerful dependency injection container](https://laravel.com/docs/container).
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
- [Robust background job processing](https://laravel.com/docs/queues).
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
Laravel is accessible, powerful, and provides tools required for large, robust applications.
## Learning Laravel
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch.
If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains over 2000 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
## Laravel Sponsors
We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com).
### Premium Partners
- **[Vehikl](https://vehikl.com/)**
- **[Tighten Co.](https://tighten.co)**
- **[WebReinvent](https://webreinvent.com/)**
- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
- **[64 Robots](https://64robots.com)**
- **[Curotec](https://www.curotec.com/services/technologies/laravel/)**
- **[Cyber-Duck](https://cyber-duck.co.uk)**
- **[DevSquad](https://devsquad.com/hire-laravel-developers)**
- **[Jump24](https://jump24.co.uk)**
- **[Redberry](https://redberry.international/laravel/)**
- **[Active Logic](https://activelogic.com)**
- **[byte5](https://byte5.de)**
- **[OP.GG](https://op.gg)**
## Contributing
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
## Code of Conduct
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
## Security Vulnerabilities
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [[email protected]](mailto:[email protected]). All security vulnerabilities will be promptly addressed.
## License
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
>>>>>>> afc9cdf (Unggahan Awal)
@@ -1,30 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('samples', function (Blueprint $table) {
$table->id();
$table->string('patient_name', 250)->nullable();
$table->string('test_details', 255)->nullable();
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('samples');
}
};
@@ -1,33 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('test_results', function (Blueprint $table) {
$table->id(); // ID primary key
$table->unsignedBigInteger('sample_id'); // Kolom referensi
$table->text('result'); // Kolom result
$table->string('status', 50); // Kolom status
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
// Foreign key
$table->foreign('sample_id')->references('id')->on('samples')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('test_results');
}
};
+62
View File
@@ -0,0 +1,62 @@
services:
# NginxProxyManager
#---------------------------------------------------------------#
# Authentik Database
postgresql:
image: docker.io/library/postgres:12-alpine
mem_limit: 1g
cpus: 1.0
container_name: laravel-db
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
start_period: 20s
interval: 30s
retries: 5
timeout: 5s
volumes:
- ./database:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${PG_PASS:?database password required}
POSTGRES_USER: ${PG_USER:-authentik}
POSTGRES_DB: ${PG_DB:-authentik}
env_file:
- .env
networks:
- proxy
laravel:
build:
context: ./htdocs
dockerfile: Dockerfile
container_name: laravel
restart: unless-stopped
volumes:
- ./htdocs:/var/www/html
ports:
- "8088:8080"
depends_on:
postgresql:
condition: service_healthy
command: php artisan serve --host=0.0.0.0 --port=8080
networks:
- proxy
python-listener:
build:
context: ./htdocs/listenerlis
dockerfile: Dockerfile
container_name: python-listener
restart: unless-stopped
volumes:
- ./htdocs/listenerlis:/app
ports:
- "5000:5000"
- "6001:6001"
depends_on:
postgresql:
condition: service_healthy
networks:
- proxy
networks:
proxy:
external: true
+72
View File
@@ -0,0 +1,72 @@
FROM php:8.3-fpm
# Install system dependencies
RUN apt-get update && apt-get install -y \
pkg-config \
libzip-dev \
libpng-dev \
libjpeg-dev \
libonig-dev \
libxml2-dev \
libxslt-dev \
libmagickwand-dev \
libreadline-dev \
libsodium-dev \
libc-client-dev \
libkrb5-dev \
unzip \
git \
curl \
zip \
build-essential \
autoconf \
libtool \
libsqlite3-dev \
mariadb-client \
libpq-dev \
&& docker-php-ext-configure imap --with-kerberos --with-imap-ssl \
&& docker-php-ext-install \
dom \
xml \
xsl \
bcmath \
calendar \
exif \
ftp \
gd \
gettext \
mbstring \
pcntl \
pdo_mysql \
pdo_sqlite \
pdo_pgsql \
pgsql \
posix \
shmop \
simplexml \
sockets \
sodium \
zip \
imap \
xmlwriter \
&& pecl install imagick \
&& docker-php-ext-enable imagick \
&& apt-get purge -y --auto-remove \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
# Install Laravel 10.10 secara langsung (opsional jika project belum ada)
# RUN composer create-project laravel/laravel:^10 /var/www/html
# Set permission
#RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache
EXPOSE 9000
#CMD ["php-fpm"]
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
View File
+55
View File
@@ -0,0 +1,55 @@
# LIS (Laboratory Information System)
**Laboratory Information System (LIS)** adalah sistem yang digunakan untuk mengelola informasi terkait dengan laboratorium, mulai dari manajemen data sampel, hasil tes, hingga laporan dan pengolahan data terkait laboratorium.
## Developer
Aplikasi ini dikembangkan oleh tim pengembang dari **CV. Swandhana**.
**Alamat:**
Jl. Lamandau 18A, Bunulrejo, Blimbing, Malang
**Nomor Telepon (WA):**
081359108565
## Manual Book
Untuk panduan pengguna atau manual book dari LIS, dapat diunduh melalui link berikut:
[Download Manual Book](http://10.10.123.218/manual.pdf)
## Fitur
- Pengelolaan data sampel laboratorium
- Pengolahan dan analisis hasil tes
- Pembuatan laporan otomatis
- Integrasi dengan perangkat laboratorium (optional)
## Instalasi
1. Clone repository ini ke sistem lokal Anda:
```bash
git clone https://git.rssa.top/dwi_vendor/lis/repository.git
```
2. Masuk ke dalam folder proyek:
```bash
cd repository
```
3. Instal dependensi yang diperlukan:
```bash
composer install
```
4. Konfigurasi `.env` sesuai dengan kebutuhan aplikasi Anda.
5. Jalankan server aplikasi:
```bash
php artisan serve
```
## Teknologi yang Digunakan
- **Laravel** (PHP Framework)
- **MySQL** (Database)
- **Bootstrap** (Frontend)
- **jQuery** (Frontend)
## Kontribusi
Jika Anda ingin berkontribusi pada proyek ini, silakan buat **pull request** atau **issue** terkait.
## Lisensi
Proyek ini dilisensikan di bawah lisensi MIT. Lihat file **LICENSE** untuk informasi lebih lanjut.
@@ -22,7 +22,7 @@ class ProcessAstmMessages extends Command
public function handle() public function handle()
{ {
// Ambil data dari DataListener // Ambil data dari DataListener
$dataListener = DataListiner::whereNull('processed')->get(); $dataListener = DataListiner::where('processed', '0')->orderBy('created_at', 'DESC')->get();
if ($dataListener) { if ($dataListener) {
$jumlah = count($dataListener); $jumlah = count($dataListener);
$pesan = $this->astmMessageService->processAstmMessages($dataListener); $pesan = $this->astmMessageService->processAstmMessages($dataListener);
@@ -51,6 +51,11 @@ define( 'API_ACCESS_KEY', 'AAAA6YBXh1k:APA91bFL0q7QAXQGohXMpTwHco79f13C8PFk1Oo8k
class DokterController extends Controller class DokterController extends Controller
{ {
protected $lisServiceUrl;
public function __construct()
{
$this->lisServiceUrl = env('LIS_SERVICE_URL', 'http://localhost:5000');
}
protected static function genSurat($id, $tabel){ protected static function genSurat($id, $tabel){
if ($tabel == 'dengan kop'){ if ($tabel == 'dengan kop'){
$kopsurat = url('/templateimage/kopsurat.png'); $kopsurat = url('/templateimage/kopsurat.png');
@@ -490,7 +495,7 @@ class DokterController extends Controller
'nmppdssenior' => $cekppds3->nama ?? null, 'nmppdssenior' => $cekppds3->nama ?? null,
'nmexcutor' => Session('nama'), 'nmexcutor' => Session('nama'),
'excutor' => Session('id'), 'excutor' => Session('id'),
'status' => 'Draft Saved' 'status' => 'Proses Analisis Sampel'
]); ]);
return response()->json(['icon' => 'success', 'status' => 'Success', 'message' => 'Expertise Saved']); return response()->json(['icon' => 'success', 'status' => 'Success', 'message' => 'Expertise Saved']);
} }
@@ -1075,6 +1080,7 @@ class DokterController extends Controller
]); ]);
} }
} }
$jsondata = json_decode($jsondata, true);
if(is_array($jsondata) && count($jsondata) > 0){ if(is_array($jsondata) && count($jsondata) > 0){
foreach ($jsondata as $item){ foreach ($jsondata as $item){
RekapAntibiotik::updateOrCreate( RekapAntibiotik::updateOrCreate(
@@ -1097,9 +1103,9 @@ class DokterController extends Controller
$gentabel = RekapAntibiotik::where('orderid', $orderid)->get(); $gentabel = RekapAntibiotik::where('orderid', $orderid)->get();
if (!empty($gentabel)){ if (!empty($gentabel)){
$nomor = 1; $nomor = 1;
$isidata = '<table border="1" cellpadding="0" cellspacing="0" width="100%"><tr><td width="5%"><strong>No</strong></td><td width="65%"><strong>Antibiotik</strong></td><td width="15%"><strong>Value</strong></td><td width="15%"><strong>S/I/R</strong></td></tr>'; $isidata = $isidata.'<br /><table border="1" cellpadding="0" cellspacing="0" width="100%"><tr><td width="5%"><strong>No</strong></td><td width="65%"><strong>Antibiotik</strong></td><td width="15%"><strong>Value</strong></td><td width="15%"><strong>S/I/R</strong></td></tr>';
foreach($gentabel as $rtabel){ foreach($gentabel as $rtabel){
$isidata = $isidata.'<tr><td>'.$nomor.'</td><td>'.$rtabel->antibiotic.'</td<td>'.$rtabel->value.'</td><td>'.$rtabel->interpretation.'</td></tr>'; $isidata = $isidata.'<tr><td>'.$nomor.'</td><td>'.$rtabel->resistance.'</td><td>'.$rtabel->value.'</td><td>'.$rtabel->interpretation.'</td></tr>';
$nomor++; $nomor++;
} }
$isidata = $isidata.'</table>'; $isidata = $isidata.'</table>';
@@ -1127,7 +1133,7 @@ class DokterController extends Controller
} }
return response()->json(['pesan' => $pesan, 'organism' => $organism]); return response()->json(['pesan' => $pesan, 'organism' => $organism]);
return back(); return back();
} else if ($worklist == 'getbbachtect' OR $worklist == 'getmgit' OR $worklist == 'getgenexpert' OR $worklist == 'getabbot'){ } else if ($worklist == 'getbbachtect' OR $worklist == 'getmgit' OR $worklist == 'getabbot'){
$isidata = $request->input('isi'); $isidata = $request->input('isi');
try { try {
$ketemu = ''; $ketemu = '';
@@ -1166,6 +1172,67 @@ class DokterController extends Controller
$pesan = $isidata.'<br />'.$e->getMessage(); $pesan = $isidata.'<br />'.$e->getMessage();
} }
return $pesan; return $pesan;
} else if ($worklist == 'getgenexpert'){
$isidata = $request->input('isi');
try {
$ketemu = '';
$cekada = ResultSample::where('accession_number', 'LIKE', $nofoto.'%')->get();
if ($cekada->isNotEmpty()){
foreach($cekada as $rows){
$ketemu .= ($ketemu ? '<br />' : '') . $rows->test_status;
}
} else {
$payload = [
'command' => 'request_result',
'data' => [
'sample_id' => $nofoto
],
];
$response = Http::timeout(30)->post($this->lisServiceUrl . '/command', $payload);
if ($response->successful()) {
Log::info('Permintaan hasil berhasil dikirim ke LIS service.', [
'sample_id' => $nofoto,
'response' => $response->json()
]);
} else {
Log::error('Gagal terhubung ke LIS service saat meminta hasil.', [
'sample_id' => $nofoto,
'status' => $response->status(),
'body' => $response->body()
]);
}
}
if ($ketemu != ''){
if (is_null($isidata) || $isidata == ''){
$isidata = $ketemu;
} else {
$isidata = $isidata.'<br />'.$ketemu;
}
}
if (!is_null($isidata) && $isidata != ''){
KomponenJawaban::updateOrCreate(
[
'accnumber' => $nofoto,
'template' => $request->input('jenis'),
'komponen' => $request->input('komponen'),
],
[
'isidata' => $isidata,
'created_by' => Session('nama')
]
);
}
$pesan = $isidata;
} catch (Exception $e) {
$pesan = (is_null($isidata) ? '' : $isidata . '<br />') . 'Error: ' . $e->getMessage();
Log::error('Exception dalam fungsi requestResult.', [
'sample_id' => $nofoto,
'exception' => $e->getMessage()
]);
}
return response($pesan, 200);
} else if ($worklist == 'addviralload'){ } else if ($worklist == 'addviralload'){
$tabelawal = $request->input('tabelawal'); $tabelawal = $request->input('tabelawal');
$idtabel = $request->input('idtabel'); $idtabel = $request->input('idtabel');
@@ -1262,10 +1329,10 @@ class DokterController extends Controller
$setval = $batasbawah; $setval = $batasbawah;
} }
if ($nomor == 1){ if ($nomor == 1){
$tabel = '<table border="1" cellpadding="0" cellspacing="0" width="100%"><tr><td width="5%"><strong>No</strong></td><td width="20%"><strong>Antibiotik</strong></td><td width="20%"><strong>Sub</strong></td><td width="10%"><strong>Disc Content</strong></td><td width="5%"><strong>S/I/R</strong></td></tr><tr><td>'.$nomor.'</td><td>'.$getdata->antibiotik.'</td><td>'.$getdata->subantibiotik.'</td><td>'.$getdata->diskcontent.'</td><td>'.$setnilai.'</td></tr></table>'; $tabel = '<table border="1" cellpadding="0" cellspacing="0" width="100%"><tr><td width="5%"><strong>No</strong></td><td width="20%"><strong>Antibiotik</strong></td><td width="20%"><strong>Sub</strong></td><td width="10%"><strong>Disc Content</strong></td><td width="5%"><strong>S/I/R</strong></td></tr><tr><td>'.$nomor.'</td><td>'.$getdata->antibiotik.' '.$getdata->subantibiotik.'</td><td>'.$getdata->diskcontent.'</td><td>'.$setnilai.'</td></tr></table>';
} else { } else {
$baris = '<tr><td>'.$nomor.'</td><td>'.$getdata->antibiotik.'</td><td>'.$getdata->subantibiotik.'</td><td>'.$getdata->diskcontent.'</td><td>'.$setnilai.'</td></tr>'; $baris = '<tr><td>'.$nomor.'</td><td>'.$getdata->antibiotik.' '.$getdata->subantibiotik.'</td><td>'.$getdata->diskcontent.'</td><td>'.$setnilai.'</td></tr>';
$tabel = str_replace('</table>', $baris, $tabelawal); $tabel = str_replace('</table>', $baris, $tabelawal);
$tabel = $tabel.'</table>'; $tabel = $tabel.'</table>';
} }
@@ -1458,7 +1525,7 @@ class DokterController extends Controller
} }
} }
} else { } else {
$tlsstatus = 'Draft Saved'; $tlsstatus = 'Proses Analisis Sampel';
Riwayat::create([ Riwayat::create([
'nofoto' => $nofoto, 'nofoto' => $nofoto,
'jawaban' => $surat, 'jawaban' => $surat,
@@ -1664,6 +1731,35 @@ class DokterController extends Controller
'antibiotikall' => $antibiotikall, 'antibiotikall' => $antibiotikall,
); );
} }
$getsirab = SiraB::orderBy('family', 'ASC')->orderBy('spesies', 'ASC')->where('cek', '0')->get();
foreach($getsirab as $row){
$family = $row->family;
$spesies= $row->spesies;
$getallantibiotik = SiraB::where('family', $family)->get();
foreach ($getallantibiotik as $row2){
SiraB::updateOrCreate(
[
'family' => $row->family,
'spesies' => $row->spesies,
'antibiotik' => $row2->antibiotik,
'subantibiotik' => $row2->subantibiotik,
],
[
'diskcontent' => $row2->diskcontent,
'batasatas' => $row2->batasatas,
'midrange' => $row2->midrange,
'batasbawah' => $row2->batasbawah,
'sumber' => $row2->sumber,
'kodedok' => $row2->kodedok,
'atu' => $row2->atu,
'kelompok' => $row2->kelompok,
'glassreportname' => trim($row2->glassreportname),
'cek' => '1',
]
);
}
}
echo json_encode($arrayfiles); echo json_encode($arrayfiles);
} else if ($idpasien == 'Bakteri'){ } else if ($idpasien == 'Bakteri'){
$getsirab = Organisms::where('kelompok', 'biakankultur')->orderBy('category', 'ASC')->orderBy('name', 'ASC')->get(); $getsirab = Organisms::where('kelompok', 'biakankultur')->orderBy('category', 'ASC')->orderBy('name', 'ASC')->get();
@@ -1765,20 +1861,10 @@ class DokterController extends Controller
$arrnofoto = explode('-', $nofoto); $arrnofoto = explode('-', $nofoto);
$nofoto = $arrnofoto[0]; $nofoto = $arrnofoto[0];
if ($statuse != 'Selesai'){ if ($statuse != 'Selesai'){
Periksa::where('noregister', $noregister) Periksa::where('id', $id)->update([
->where('daftar', $daftar) 'status' => 'Pemeriksaan Sampel',
->where('status', 'Telah di kirim ke worklist/modalitas') 'excutor' => $idpemeriksa,
->update([ ]);
'status' => 'Diperiksa',
'excutor' => $idpemeriksa,
]);
Periksa::where('noregister', $noregister)
->where('daftar', $daftar)
->where('status', null)
->update([
'status' => 'Diperiksa',
'excutor' => $idpemeriksa,
]);
} }
} }
public function getFoto(Request $request) { public function getFoto(Request $request) {
@@ -2718,6 +2804,9 @@ class DokterController extends Controller
foreach($idcetak as $rid){ foreach($idcetak as $rid){
$periksa = Periksa::where('id', $rid)->first(); $periksa = Periksa::where('id', $rid)->first();
if (isset($periksa->id)){ if (isset($periksa->id)){
Periksa::where('id', $periksa->id)->update([
'status' => 'Penerimaan Sampel',
]);
if ($kanan == ''){ if ($kanan == ''){
$kolomttd = '<td><font color="grey">'.$nomor.'</font></td><td>&nbsp;</td>'; $kolomttd = '<td><font color="grey">'.$nomor.'</font></td><td>&nbsp;</td>';
$kanan = '1'; $kanan = '1';
@@ -2725,7 +2814,7 @@ class DokterController extends Controller
$kolomttd = '<td>&nbsp;</td><td><font color="grey">'.$nomor.'</font></td>'; $kolomttd = '<td>&nbsp;</td><td><font color="grey">'.$nomor.'</font></td>';
$kanan = ''; $kanan = '';
} }
$cetak = $cetak.'<tr><td align="center">'.$nomor.'</td><td>'.$periksa->nofoto.'</td><td>'.$periksa->noregister.'</td><td>'.$periksa->nmpasien.'</td><td>'.$periksa->jkpasien.'</td><td>'.$periksa->mulai.'</td><td>'.$periksa->asalpasien.'</td><td>'.$periksa->kd_spesimen.'</td><td>'.$periksa->nm_spesimen.'</td>'.$kolomttd.'</tr>'; $cetak = $cetak.'<tr><td align="center">'.$nomor.'</td><td>'.$periksa->nofoto.'</td><td>'.$periksa->noregister.'</td><td>'.$periksa->nmpasien.'</td><td>'.$periksa->jkpasien.'</td><td>'.$periksa->mulai.'</td><td>'.$periksa->asalpasien.'</td><td>'.$periksa->kd_spesimen.'</td><td>'.$periksa->nm_spesimen.'</td>'.$kolomttd.'</tr>';
$nomor++; $nomor++;
} }
} }
@@ -4,6 +4,8 @@ namespace App\Http\Controllers;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Http;
use App\Services\AstmMessageService; use App\Services\AstmMessageService;
use App\Services\SerialCommunicationService; use App\Services\SerialCommunicationService;
use App\Http\Controllers\SendMail; use App\Http\Controllers\SendMail;
@@ -29,21 +31,57 @@ use Validator;
use Session; use Session;
use DateTime; use DateTime;
use QrCode; use QrCode;
use Exception;
use Carbon\Carbon; use Carbon\Carbon;
use Aranyasen\HL7\Message;
use Aranyasen\HL7\Connection;
use Aranyasen\HL7\Segment;
use Aranyasen\HL7\Segments\MSH;
use Aranyasen\HL7\Segments\PV1;
use Aranyasen\HL7\Segments\OBR;
use Aranyasen\HL7\Segments\ORC;
use Aranyasen\HL7\Segments\PID;
use Aranyasen\HL7\Segments\OBX;
use Aranyasen\HL7\Segments\NTE;
use Aranyasen\HL7\Segments\EVN;
class FrontpageController extends Controller class FrontpageController extends Controller
{ {
protected $lisServiceUrl;
public function __construct()
{
// Mengambil URL service dari file .env, dengan fallback default
$this->lisServiceUrl = env('LIS_SERVICE_URL', 'http://10.10.120.14:5000');
}
private function sendRegistrationToLis(array $data)
{
// Memetakan data dari fungsi register Anda ke format yang dibutuhkan LIS service
// PENTING: Pastikan pemetaan ini benar, terutama 'test_code'.
$payload = [
'command' => 'register_patient',
'data' => [
'patient_name' => $data['nama'],
'patient_id' => $data['noregister'], // Menggunakan no register sebagai ID Pasien
'sample_id' => $data['nofoto'], // Menggunakan nofoto sebagai ID Sampel unik
'test_code' => $data['kd_spesimen'],// Kode tes spesifik untuk GeneXpert (e.g., MTBRIF)
'test_name' => $data['nm_spesimen'],
'dob' => $data['tgllahir'] ? \Carbon\Carbon::parse($data['tgllahir'])->format('Ymd') : '',
'gender' => $data['jk'],
],
];
try {
$response = Http::timeout(30)->post($this->lisServiceUrl . '/command', $payload);
if ($response->failed()) {
Log::error('Gagal mengirim data pendaftaran ke LIS service.', [
'sample_id' => $data['nofoto'],
'status' => $response->status(),
'response' => $response->body()
]);
} else {
Log::info('Data pendaftaran berhasil dikirim ke LIS service.', [
'sample_id' => $data['nofoto'],
'response' => $response->json()
]);
}
} catch (Exception $e) {
Log::error('Koneksi ke LIS service gagal saat pendaftaran.', [
'sample_id' => $data['nofoto'],
'exception' => $e->getMessage()
]);
}
}
public function index() { public function index() {
$data = []; $data = [];
$data['antrkrmsitu']= PeriksaSYNC::where('created_by', Session('username'))->where('status', '')->count(); $data['antrkrmsitu']= PeriksaSYNC::where('created_by', Session('username'))->where('status', '')->count();
@@ -588,8 +626,8 @@ class FrontpageController extends Controller
$insurance = $request->input('asuransi') ?? 'UMM'; $insurance = $request->input('asuransi') ?? 'UMM';
$rekues = $request->input('layanan'); $rekues = $request->input('layanan');
$urgensi = $request->input('urgensi') ?? 'Elective'; $urgensi = $request->input('urgensi') ?? 'Elective';
$kd_spesimen = $request->input('kd_spesimen') ?? ''; $kd_spesimen = $request->input('kode') ?? '';
$nm_spesimen = $request->input('nm_spesimen') ?? ''; $nm_spesimen = $request->input('spesimen') ?? '';
$klinis = $request->input('klinis'); $klinis = $request->input('klinis');
$notransaksi = $request->input('notransaksi'); $notransaksi = $request->input('notransaksi');
$telpon = str_replace('_', '', $telpon); $telpon = str_replace('_', '', $telpon);
@@ -724,6 +762,27 @@ class FrontpageController extends Controller
'orderid' => $notransaksi, 'orderid' => $notransaksi,
]); ]);
$pesan = $nofoto; $pesan = $nofoto;
DB::table('paslab')->insert([
'rnoreg' => $nofoto,
'nama' => $nama,
'norm' => $noregister,
'rtglast' => $mulai,
'alamat' => $alamat,
'rjenis' => $jk,
'umur' => $usia,
'namadok' => $klinisi,
'ruangan' => 'Mikrobiologi',
'tes' => $rekues,
'alat' => 'ALL',
'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen,
'tgllahir' => $tgllahir,
'flg_vitek1' => false,
'flg_vitek2' => false,
'flg_bd1' => false,
'flg_bd2' => false,
'flg_gxp' => false,
]);
if ($kd_spesimen != '' AND $nm_spesimen != ''){ if ($kd_spesimen != '' AND $nm_spesimen != ''){
PendaftaranOnListiner::updateOrCreate( PendaftaranOnListiner::updateOrCreate(
[ [
@@ -748,6 +807,7 @@ class FrontpageController extends Controller
'nm_spesimen' => $nm_spesimen, 'nm_spesimen' => $nm_spesimen,
] ]
); );
} }
if ($pesan != ''){ if ($pesan != ''){
return response()->json(['status' => 'Sukses', 'message' => $pesan], 201); return response()->json(['status' => 'Sukses', 'message' => $pesan], 201);
@@ -756,21 +816,8 @@ class FrontpageController extends Controller
} }
} }
public function registerApi(Request $request) { public function registerApi(Request $request) {
//$dataJson = json_encode($request->input());
//$decodedFirst = json_decode($dataJson, true);
Log::info(' Incomming '.json_encode($request->input())); Log::info(' Incomming '.json_encode($request->input()));
$decodedData = $request->json()->all(); $decodedData = $request->json()->all();
//$decodedData = $request->input();
//if (json_last_error() !== JSON_ERROR_NONE) {
// Log::error('JSON Decode Error (First): ' . json_last_error_msg());
// return response()->json(['error' => 'Invalid first-level JSON data'], 400);
//}
//$innerJson = key($decodedFirst);
//$decodedData = json_decode($innerJson, true);
//if (json_last_error() !== JSON_ERROR_NONE) {
// Log::error('JSON Decode Error (Second): ' . json_last_error_msg());
// return response()->json(['error' => 'Invalid second-level JSON data'], 400);
//}
$norm = $decodedData['norm'] ?? null; $norm = $decodedData['norm'] ?? null;
$nama = $decodedData['nama'] ?? null; $nama = $decodedData['nama'] ?? null;
$alamat = $decodedData['alamat'] ?? config('global.addressapps'); $alamat = $decodedData['alamat'] ?? config('global.addressapps');
@@ -784,23 +831,42 @@ class FrontpageController extends Controller
$bpjs = $decodedData['nobpjs'] ?? '0'; $bpjs = $decodedData['nobpjs'] ?? '0';
$drpeminta = $decodedData['drpeminta'] ?? null; $drpeminta = $decodedData['drpeminta'] ?? null;
$tlsasal = $decodedData['asalpasien'] ?? null; $tlsasal = $decodedData['asalpasien'] ?? null;
$rekues = $decodedData['layanan'] ?? null; //$rekues = $decodedData['layanan'] ?? null;
$statusbayar = $decodedData['statusbayar'] ?? null; $statusbayar = $decodedData['statusbayar'] ?? null;
$notransaksi = $decodedData['notransaksi'] ?? null; $notransaksi = $decodedData['notransaksi'] ?? null;
$insurance = $decodedData['asuransi'] ?? 'UMM'; $insurance = $decodedData['asuransi'] ?? 'UMM';
$klinis = $decodedData['klinis'] ?? null; $klinis = $decodedData['klinis'] ?? null;
$klinisi = $decodedData['klinisi'] ?? $drpeminta; $klinisi = $decodedData['klinisi'] ?? $drpeminta;
$kd_spesimen = $decodedData['kd_spesimen'] ?? null; $rekues = $decodedData['kode'] ?? null;
$nm_spesimen = $decodedData['nm_spesimen'] ?? null; $nm_spesimen = $decodedData['spesimen'] ?? null;
$pengambilan = $decodedData['pengambilan'] ?? null; $pengambilan = $decodedData['pengambilan'] ?? null;
$nmrs = $decodedData['namarspengirim'] ?? 'RSSA Malang'; $nmrs = $decodedData['namarspengirim'] ?? 'RSSA Malang';
$telpon = str_replace('_', '', $nohap); $telpon = str_replace('_', '', $nohap);
$rekues = str_replace('_', ' ', $rekues); //$rekues = str_replace('_', ' ', $rekues);
$tlsasal = str_replace('_', ' ', $tlsasal); $tlsasal = str_replace('_', ' ', $tlsasal);
$klinisi = str_replace('_', ' ', $klinisi); $klinisi = str_replace('_', ' ', $klinisi);
$nama = str_replace('_', ' ', $nama); $nama = str_replace('_', ' ', $nama);
$alamat = str_replace('_', ' ', $alamat); $alamat = str_replace('_', ' ', $alamat);
$kd_spesimen = '';
$getkodespesimen= Organisms::where('name', $nm_spesimen)->where('kelompok', 'listkodespesimen')->first();
if (isset($getkodespesimen->category)){
$kd_spesimen= $getkodespesimen->category;
} else {
$cekdulu = explode(' ', $nm_spesimen);
if (isset($cekdulu[1])){
$kd_spesimen = str_replace('.', '', $cekdulu[0]);
} else {
foreach ($cekdulu as $kata) {
$kd_spesimen .= substr($kata, 0, 1);
}
}
Organisms::create([
'name' => $nm_spesimen,
'category' => $kd_spesimen,
'kelompok' => 'listkodespesimen'
]);
}
$iddokter = ''; $iddokter = '';
$ruangan = 1; $ruangan = 1;
$kelompok = 'admin'; $kelompok = 'admin';
@@ -926,6 +992,27 @@ class FrontpageController extends Controller
]); ]);
$pesan = $nofoto; $pesan = $nofoto;
try { try {
DB::table('paslab')->insert([
'rnoreg' => $nofoto,
'nama' => $nama,
'norm' => $noregister,
'rtglast' => $mulai,
'alamat' => $alamat,
'rjenis' => $jk,
'umur' => $usia,
'namadok' => $dokter,
'ruangan' => 'Mikrobiologi',
'tes' => $rekues,
'alat' => 'ALL',
'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen,
'tgllahir' => $tgllahir,
'flg_vitek1' => false,
'flg_vitek2' => false,
'flg_bd1' => false,
'flg_bd2' => false,
'flg_gxp' => false,
]);
if ($kd_spesimen != '' AND $nm_spesimen != ''){ if ($kd_spesimen != '' AND $nm_spesimen != ''){
PendaftaranOnListiner::updateOrCreate( PendaftaranOnListiner::updateOrCreate(
[ [
@@ -950,6 +1037,18 @@ class FrontpageController extends Controller
'nm_spesimen' => $nm_spesimen, 'nm_spesimen' => $nm_spesimen,
] ]
); );
/*
$dataForLis = [
'nama' => $nama,
'noregister' => $noregister,
'nofoto' => $nofoto,
'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen,
'tgllahir' => $tgllahir,
'jk' => $jk,
];
$this->sendRegistrationToLis($dataForLis);
*/
} }
return response()->json(['status' => 'Sukses', 'message' => $pesan], 201); return response()->json(['status' => 'Sukses', 'message' => $pesan], 201);
} catch (Exception $e) { } catch (Exception $e) {
@@ -969,8 +1068,8 @@ class FrontpageController extends Controller
return back(); return back();
} else { } else {
$jk = $request->input('jk'); $jk = $request->input('jk');
$nik = $request->input('nik'); $nik = $request->input('nik') ?? time();
$bpjs = $request->input('bpjs'); $bpjs = $request->input('bpjs') ?? time();
$alamat = $request->input('alamat') ?? config('global.addressapps'); $alamat = $request->input('alamat') ?? config('global.addressapps');
$kota = $request->input('kota') ?? config('global.subdomainapps'); $kota = $request->input('kota') ?? config('global.subdomainapps');
$noregister = $request->input('noregister'); $noregister = $request->input('noregister');
@@ -997,8 +1096,15 @@ class FrontpageController extends Controller
$jenisgambar = $request->input('jenisgambar'); $jenisgambar = $request->input('jenisgambar');
$file = $request->input('file'); $file = $request->input('file');
$poli_id = $request->input('poli_id') ?? 1; $poli_id = $request->input('poli_id') ?? 1;
$kd_spesimen = $request->input('kd_spesimen') ?? ''; $cekkodespes = Organisms::where('id', $ruangan)->first();
$nm_spesimen = $request->input('nm_spesimen') ?? ''; if (isset($cekkodespes->name)){
$nm_spesimen = $cekkodespes->name;
$kd_spesimen = $cekkodespes->category;
} else {
$kd_spesimen = $request->input('kd_spesimen') ?? '';
$nm_spesimen = $request->input('nm_spesimen') ?? '';
}
$reques = 'Specimen'; $reques = 'Specimen';
$kelompok = Session('previlage'); $kelompok = Session('previlage');
$daftar = date('Y-m-d H:i:s'); $daftar = date('Y-m-d H:i:s');
@@ -1110,7 +1216,7 @@ class FrontpageController extends Controller
$modality = $check->modaliti ?? 'OT'; $modality = $check->modaliti ?? 'OT';
$modaliti2 = $check->modaliti2 ?? ''; $modaliti2 = $check->modaliti2 ?? '';
if (isset($check->subsubpoli)){ if (isset($check->subsubpoli)){
$rekues = $subpoli.' - '.$subsubpoli; $rekues = $subpoli.' - '.$check->subsubpoli;
} else { } else {
$rekues = $subpoli; $rekues = $subpoli;
} }
@@ -1158,6 +1264,26 @@ class FrontpageController extends Controller
'pendaftar' => Session('previlage'), 'pendaftar' => Session('previlage'),
'nmpendaftar' => Session('nama'), 'nmpendaftar' => Session('nama'),
]); ]);
DB::table('paslab')->insert([
'rnoreg' => $nofoto,
'nama' => $nama,
'norm' => $noregister,
'rtglast' => $mulai,
'alamat' => $alamat,
'rjenis' => $jk,
'umur' => $usia,
'namadok' => $dokter,
'ruangan' => 'Mikrobiologi',
'tes' => $rekues,
'alat' => 'ALL',
'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen,
'tgllahir' => $tgllahir,
'flg_vitek1' => false,
'flg_vitek2' => false,
'flg_bd1' => false,
'flg_bd2' => false,
]);
if ($kd_spesimen != '' AND $nm_spesimen != ''){ if ($kd_spesimen != '' AND $nm_spesimen != ''){
PendaftaranOnListiner::updateOrCreate( PendaftaranOnListiner::updateOrCreate(
[ [
@@ -1182,6 +1308,18 @@ class FrontpageController extends Controller
'nm_spesimen' => $nm_spesimen, 'nm_spesimen' => $nm_spesimen,
] ]
); );
/*
$dataForLis = [
'nama' => $nama,
'noregister' => $noregister,
'nofoto' => $nofoto,
'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen,
'tgllahir' => $tgllahir,
'jk' => $jk,
];
$this->sendRegistrationToLis($dataForLis);
*/
} }
$pesan = $pesan.' Nomor Lokal '.$nofoto.' dengan No. Urut '.$noloket.' Berhasil di Simpan'; $pesan = $pesan.' Nomor Lokal '.$nofoto.' dengan No. Urut '.$noloket.' Berhasil di Simpan';
if ($pesan != ''){ if ($pesan != ''){
@@ -1245,7 +1383,7 @@ class FrontpageController extends Controller
$modality = $check->modaliti ?? 'OT'; $modality = $check->modaliti ?? 'OT';
$modaliti2 = $check->modaliti2 ?? ''; $modaliti2 = $check->modaliti2 ?? '';
if (isset($check->subsubpoli)){ if (isset($check->subsubpoli)){
$rekues = $subpoli.' - '.$subsubpoli; $rekues = $subpoli.' - '.$check->subsubpoli;
} else { } else {
$rekues = $subpoli; $rekues = $subpoli;
} }
@@ -1273,6 +1411,30 @@ class FrontpageController extends Controller
'kd_spesimen' => $kd_spesimen, 'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen, 'nm_spesimen' => $nm_spesimen,
]); ]);
$ceksudah = DB::table('paslab')->where('rnoreg', $nofoto)->count();
if ($ceksudah == 0){
DB::table('paslab')->insert([
'rnoreg' => $nofoto,
'nama' => $nama,
'norm' => $noregister,
'rtglast' => $mulai,
'alamat' => $alamat,
'rjenis' => $jk,
'umur' => $usia,
'namadok' => $getdata->dokter ?? 'Unkown',
'ruangan' => 'Mikrobiologi',
'tes' => $rekues,
'alat' => 'ALL',
'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen,
'tgllahir' => $tgllahir,
'flg_vitek1' => false,
'flg_vitek2' => false,
'flg_bd1' => false,
'flg_bd2' => false,
]);
}
$pesan = $pesan.' Data Berhasil di Update'; $pesan = $pesan.' Data Berhasil di Update';
if ($kd_spesimen != '' AND $nm_spesimen != ''){ if ($kd_spesimen != '' AND $nm_spesimen != ''){
PendaftaranOnListiner::updateOrCreate( PendaftaranOnListiner::updateOrCreate(
@@ -1291,13 +1453,25 @@ class FrontpageController extends Controller
'rjenis' => $jk, 'rjenis' => $jk,
'kodedok' => Session('id'), 'kodedok' => Session('id'),
'namadok' => Session('nama'), 'namadok' => Session('nama'),
'ruangan' => $kamar, 'ruangan' => 'Mikrobiologi',
'tes' => $rekues, 'tes' => $rekues,
'alat' => 'All', 'alat' => 'All',
'kd_spesimen' => $kd_spesimen, 'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen, 'nm_spesimen' => $nm_spesimen,
] ]
); );
/*
$dataForLis = [
'nama' => $nama,
'noregister' => $noregister,
'nofoto' => $nofoto,
'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen,
'tgllahir' => $tgllahir,
'jk' => $jk,
];
$this->sendRegistrationToLis($dataForLis);
*/
} }
if ($pesan != ''){ if ($pesan != ''){
if ($file != '' AND $jenisgambar != ''){ if ($file != '' AND $jenisgambar != ''){
@@ -1334,81 +1508,38 @@ class FrontpageController extends Controller
$modality = $request->input('reques'); $modality = $request->input('reques');
$cekdata = Periksa::where('nofoto', $nofoto)->first(); $cekdata = Periksa::where('nofoto', $nofoto)->first();
if (isset($cekdata->id)){ if (isset($cekdata->id)){
$senderName = 'LIS_System';
$versionNumber = 'V1.0';
$nama = $cekdata->nmpasien; $nama = $cekdata->nmpasien;
$jk = $cekdata->jkpasien; $jk = $cekdata->jkpasien;
$urgensi = $cekdata->urgensi ?? 'Elective'; $urgensi = $cekdata->urgensi ?? 'Elective';
$alamat = $cekdata->alamatpasien ?? 'Malang'; $alamat = $cekdata->alamatpasien ?? 'Malang';
$arrayttl = explode(" ", $nama);
$fname = iconv("UTF-8", "tis-620", $arrayttl[0]);
if (isset($arrayttl[1])){
$tengah = iconv("UTF-8", "tis-620", $arrayttl[1]);
}
if (isset($arrayttl[2])){
$blakang = iconv("UTF-8", "tis-620", $arrayttl[2]);
} else {
$blakang = $tengah;
$tengah = '';
}
if ($jk == 'L'){ $panggilan = 'TN'; $jk = 'M'; }
else if ($jk == 'P') { $panggilan = 'NY'; $jk = 'F'; }
else { $panggilan = 'UNK'; $jk = 'O'; }
$panggilan = '';
if ($blakang == ''){ $blakang = $fname; }
if ($urgensi == 'Elective'){ $urgensi = 'INPATIENT'; $prioritas = 'R'; }
else if ($urgensi == 'CITO'){ $urgensi = 'EMERGENCY'; $prioritas = 'A'; }
else { $urgensi = 'OUTPATIENT'; $prioritas = 'A'; }
$patient = [
'id' => $cekdata->id,
'last_name' => $fname,
'first_name' => $blakang,
'middle_name' => $tengah,
'suffix' => $panggilan,
'dob' => $cekdata->noregister,
'sex' => $jk,
'address' => $alamat.'^^MALANG^^ID^65123',
'phone' => $cekdata->tlppasien,
'admitting_physician' => $cekdata->klinisi ?? 'Dokter Pengirim'
];
$order = [
'accession_number' => $cekdata->nofoto,
'isolate_number' => 'MGIT^TestName',
'organism' => $cekdata->reques ?? 'Mycobacterium tuberculosis',
'exclude_isolate' => 'No',
'priority' => $prioritas,
'collection_date_time' => date("YmdHi"),
'collected_by' => $cekdata->nmradiografer ?? Session('nama'),
'received_by' => Session('nama'),
'specimen_action_code' => '',
'isolate_source_test' => 'Blood',
'isolate_source_test_start_time'=> date("YmdHi"),
'receipt_date_time' => date("YmdHi"),
'specimen_type' => 'Blood Culture',
'body_site' => 'Lung',
'ordering_physician' => $cekdata->klinisi ?? 'Dokter Pengirim',
'ordering_physician_phone' => '',
'ordering_physician_fax' => '',
'ordering_physician_pager' => '',
'specimen_user_field_1' => '',
'specimen_user_field_2' => '',
'specimen_user_field_3' => '',
'specimen_user_field_4' => '',
'specimen_user_field_5' => '',
'finalized_date_time' => date("YmdHi"),
'specimen_reimbursement_value' => '100',
'test_reimbursement_value' => '50',
'isolate_classification' => 'Nosocomial'
];
Periksa::where('nofoto', $nofoto)->update([ Periksa::where('nofoto', $nofoto)->update([
'excutor' => Session('id'), 'excutor' => Session('id'),
'nmexcutor' => Session('nama'), 'nmexcutor' => Session('nama'),
]); ]);
try { try {
if ($modality == 'genexpert01' OR $modality == 'genexpert02' OR $modality == 'genexpert03'){ $ceksudah = DB::table('paslab')->where('rnoreg', $nofoto)->count();
$pesan = $this->Hl7Register($cekdata->id, $modality); if ($ceksudah == 0){
} else { DB::table('paslab')->insert([
$pesan = 'Cannot send on Serial Port From Server'; 'rnoreg' => $nofoto,
'nama' => $nama,
'norm' => $cekdata->noregister,
'rtglast' => $cekdata->mulai,
'alamat' => $alamat,
'rjenis' => $jk,
'umur' => $cekdata->usia,
'namadok' => $getdata->dokter ?? 'Unkown',
'ruangan' => 'Mikrobiologi',
'tes' => $cekdata->reques,
'alat' => 'ALL',
'kd_spesimen' => $cekdata->kd_spesimen,
'nm_spesimen' => $cekdata->nm_spesimen,
'tgllahir' => $cekdata->tgllahirpasien,
'flg_vitek1' => false,
'flg_vitek2' => false,
'flg_bd1' => false,
'flg_bd2' => false,
]);
} }
}catch (Exception $e) { }catch (Exception $e) {
$pesan = $e->getMessage(); $pesan = $e->getMessage();
@@ -1427,23 +1558,56 @@ class FrontpageController extends Controller
if ($nofoto == 'noregister'){ if ($nofoto == 'noregister'){
$noregister = $request->input('noregister'); $noregister = $request->input('noregister');
$tabel = ''; $tabel = '';
$periksa = Periksa::where('noregister', $noregister)->where('tgllahirpasien', $tgllahir)->get(); $lists = DB::table('periksa')
if (!empty($periksa)){ ->select('periksa.*', 'organisms.satuan as satuanperspesimen', 'organisms.nilai as nilaiperspesimen')
->leftJoin('periksa', 'organisms.category', 'periksa.kd_spesimen')
->where('periksa.noregister', $noregister)
->where('periksa.tgllahirpasien', $tgllahir)
->get();
if (!empty($lists)){
$tabel = '<div class="timeline">'; $tabel = '<div class="timeline">';
$kanan = ''; $kanan = '';
foreach($periksa as $rows){ foreach($lists as $rows){
$status = $rows->status; $status = $rows->status;
$id_periksa = $rows->id;
if ( !empty($rows->rating) ) {
$saved_rating = $rows->rating;
$bintang_html = '';
for ($i = 1; $i <= 5; $i++) {
if ( $i <= $saved_rating ) {
$bintang_html .= '<i class="fa fa-star" style="font-size:18px; color:orange;"></i>';
} else {
$bintang_html .= '<i class="fa fa-star-o" style="font-size:18px; color:orange;"></i>';
}
}
$ratingBintang = '
<div class="rating-stars" data-id="'.$id_periksa.'">
<small class="text-muted">Terimka kasih atas rating yang diberikan:</small><br>
'.$bintang_html.'
</div>';
} else {
$ratingBintang = '
<div class="rating-stars" data-id="'.$id_periksa.'">
<small class="text-muted">Beri Rating:</small><br>
<i class="fa fa-star-o" style="cursor:pointer; font-size:18px; color:orange;" onclick="btnisiRating('.$id_periksa.', 1)"></i>
<i class="fa fa-star-o" style="cursor:pointer; font-size:18px; color:orange;" onclick="btnisiRating('.$id_periksa.', 2)"></i>
<i class="fa fa-star-o" style="cursor:pointer; font-size:18px; color:orange;" onclick="btnisiRating('.$id_periksa.', 3)"></i>
<i class="fa fa-star-o" style="cursor:pointer; font-size:18px; color:orange;" onclick="btnisiRating('.$id_periksa.', 4)"></i>
<i class="fa fa-star-o" style="cursor:pointer; font-size:18px; color:orange;" onclick="btnisiRating('.$id_periksa.', 5)"></i>
</div>';
}
if ($status == 'Selesai'){ if ($status == 'Selesai'){
$tombolcetak = url('/').'/hasil/'.$rows->nofoto; $tombolcetak = url('/').'/hasil/'.$rows->nofoto;
$tombolcetak = '<a href="'.$tombolcetak.'"><button type="button" class="btn btn-icon waves-effect waves-light btn-success"> <i class="fa fa-print"></i> </button></a>'; $tombolcetak = '<a href="'.$tombolcetak.'"><button type="button" class="btn btn-icon waves-effect waves-light btn-success"> <i class="fa fa-print"></i> </button></a>';
} else { } else {
$tombolcetak = ''; $tombolcetak = 'Masih dalam proses dan perkiraan selesai adalah '.$rows->nilaiperspesimen.' '.$rows->satuanperspesimen.' dari sample diterima';
} }
if ($kanan == ''){ if ($kanan == ''){
$tabel = $tabel.'<article class="timeline-item"><div class="timeline-desk"><div class="panel"><div class="timeline-box"><span class="arrow"></span><span class="timeline-icon bg-custom"><i class="mdi mdi-adjust"></i></span><h4 class="text-custom">'.$rows->daftar.'</h4><p class="timeline-date text-muted"><small>'.$rows->reques.'</small></p><p>'.$rows->status.'</p><div class="btn btn-group">'.$tombolcetak.'</div></div></div></div></article>'; $tabel = $tabel.'<article class="timeline-item"><div class="timeline-desk"><div class="panel"><div class="timeline-box"><span class="arrow"></span><span class="timeline-icon bg-custom"><i class="mdi mdi-adjust"></i></span><h4 class="text-custom">'.$rows->daftar.'</h4><p class="timeline-date text-muted"><small>'.$rows->reques.'</small></p><p>'.$rows->status.'</p>'.$ratingBintang.'<div class="btn btn-group">'.$tombolcetak.'</div></div></div></div></article>';
$kanan = 'kanan'; $kanan = 'kanan';
} else { } else {
$tabel = $tabel.'<article class="timeline-item alt"><div class="timeline-desk"><div class="panel"><div class="timeline-box"><span class="arrow-alt"></span><span class="timeline-icon bg-custom"><i class="mdi mdi-adjust"></i></span><h4 class="text-custom">'.$rows->daftar.'</h4><p class="timeline-date text-muted"><small>'.$rows->reques.'</small></p><p>'.$rows->status.'</p><div class="btn btn-group">'.$tombolcetak.'</div></div></div></div></article>'; $tabel = $tabel.'<article class="timeline-item alt"><div class="timeline-desk"><div class="panel"><div class="timeline-box"><span class="arrow-alt"></span><span class="timeline-icon bg-custom"><i class="mdi mdi-adjust"></i></span><h4 class="text-custom">'.$rows->daftar.'</h4><p class="timeline-date text-muted"><small>'.$rows->reques.'</small></p><p>'.$rows->status.'</p>'.$ratingBintang.'<div class="btn btn-group">'.$tombolcetak.'</div></div></div></div></article>';
$kanan = ''; $kanan = '';
} }
} }
@@ -1452,6 +1616,10 @@ class FrontpageController extends Controller
$tabel = 'Data Tidak ditemukan, Pastikan Kembali Apakah No. RM ('.$noregister.') dan tanggal lahir ('.$tgllahir.') sudah benar'; $tabel = 'Data Tidak ditemukan, Pastikan Kembali Apakah No. RM ('.$noregister.') dan tanggal lahir ('.$tgllahir.') sudah benar';
} }
echo $tabel; echo $tabel;
} else if ($nofoto == 'isirating'){
Periksa::where('id', $request->input('id'))->update([
'rating' => $request->input('rating')
]);
} else { } else {
$periksa = Periksa::where('nofoto', $nofoto)->where('tgllahirpasien', $tgllahir)->first(); $periksa = Periksa::where('nofoto', $nofoto)->where('tgllahirpasien', $tgllahir)->first();
if (isset($periksa->id)){ if (isset($periksa->id)){
@@ -0,0 +1,116 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class LisController extends Controller
{
/**
* Alamat IP dan port dari service Python/Flask.
* Sebaiknya diletakkan di file .env
* LIS_SERVICE_URL=http://127.0.0.1:5000
*/
protected $lisServiceUrl;
public function __construct()
{
// Mengambil URL service dari file .env, dengan fallback default
$this->lisServiceUrl = env('LIS_SERVICE_URL', 'http://localhost:5000');
}
/**
* Mengirim perintah untuk mendaftarkan tes pasien baru ke GeneXpert.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function registerPatient(Request $request)
{
// Validasi input dari request (sangat direkomendasikan)
$validatedData = $request->validate([
'patient_name' => 'required|string|max:100',
'patient_id' => 'required|string|max:50',
'sample_id' => 'required|string|max:50',
'test_code' => 'required|string|max:20',
'test_name' => 'sometimes|string|max:50',
'dob' => 'sometimes|date_format:Ymd',
'gender' => 'sometimes|string|in:M,F,O,U',
]);
// Membangun payload sesuai format yang diharapkan oleh app.py
$payload = [
'command' => 'register_patient',
'data' => $validatedData,
];
try {
// Mengirim request POST ke service Python
$response = Http::timeout(30) // Set timeout 30 detik
->post($this->lisServiceUrl . '/command', $payload);
// Cek jika request gagal di level HTTP
if ($response->failed()) {
Log::error('Gagal terhubung ke LIS service saat registrasi.', [
'status' => $response->status(),
'body' => $response->body()
]);
return response()->json([
'error' => 'Tidak dapat terhubung ke LIS service.',
'details' => $response->body()
], 503); // Service Unavailable
}
// Mengembalikan response dari service Python ke client
return response()->json($response->json(), $response->status());
} catch (\Illuminate\Http\Client\ConnectionException $e) {
Log::error('Koneksi ke LIS service gagal.', ['exception' => $e->getMessage()]);
return response()->json(['error' => 'Koneksi ke LIS service gagal.'], 504); // Gateway Timeout
}
}
/**
* Mengirim perintah untuk meminta ulang hasil tes berdasarkan Sample ID.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function requestResult(Request $request)
{
// Validasi input
$validatedData = $request->validate([
'sample_id' => 'required|string|max:50',
]);
// Membangun payload
$payload = [
'command' => 'request_result',
'data' => $validatedData,
];
try {
// Mengirim request POST ke service Python
$response = Http::timeout(30)->post($this->lisServiceUrl . '/command', $payload);
if ($response->failed()) {
Log::error('Gagal terhubung ke LIS service saat meminta hasil.', [
'status' => $response->status(),
'body' => $response->body()
]);
return response()->json([
'error' => 'Tidak dapat terhubung ke LIS service.',
'details' => $response->body()
], 503);
}
return response()->json($response->json(), $response->status());
} catch (\Illuminate\Http\Client\ConnectionException $e) {
Log::error('Koneksi ke LIS service gagal.', ['exception' => $e->getMessage()]);
return response()->json(['error' => 'Koneksi ke LIS service gagal.'], 504);
}
}
}
@@ -224,41 +224,118 @@ class ListController extends Controller
$id = $request->input('val01'); $id = $request->input('val01');
$alasan = $request->input('val02'); $alasan = $request->input('val02');
$tabel = $request->input('val03'); $tabel = $request->input('val03');
if ($alasan == ''){ if ($id == 'buatulang'){
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Mohon isi semua form']); $getdata= Periksa::where('id', $request->input('val02'))->first();
return back(); if (isset($getdata->nofoto)){
} else { $ceksudah = Periksa::where('nofoto', 'LIKE', $getdata->nofoto.'_%')->count();
if ($tabel == 'aktif'){ $nomorbaru = $ceksudah++;
$alasan = 'Dibatalkan dengan alasan '.$alasan; $periksaid = Periksa::insertGetId([
$input = Periksa::where('id', $id)->update([ 'mulai' => $getdata->mulai,
'noloket' => null, 'akhir' => $getdata->akhir,
'status' => $alasan 'noloket' => $getdata->noloket,
'nofoto' => $getdata->nofoto.'_'.$nomorbaru,
'noregister' => $getdata->noregister,
'asalpasien' => $getdata->asalpasien,
'nmrs' => $getdata->nmrs,
'pasien_id' => $getdata->pasien_id,
'nmpasien' => $getdata->nmpasien,
'jkpasien' => $getdata->jkpasien,
'ktp' => $getdata->ktp,
'bpjs' => $getdata->bpjs,
'tgllahirpasien'=> $getdata->tgllahirpasien,
'tlppasien' => $getdata->tlppasien,
'alamatpasien' => $getdata->alamatpasien,
'reques' => $getdata->reques,
'usia' => $getdata->usia,
'berat' => $getdata->berat,
'ruangan_id' => $getdata->ruangan_id,
'ruangan' => $getdata->ruangan,
'klinisi' => $getdata->klinisi,
'klinis' => $getdata->klinis,
'poli_id' => $getdata->poli_id,
'kd_spesimen' => $getdata->kd_spesimen,
'nm_spesimen' => $getdata->nm_spesimen,
'keterangan' => '',
'kesimpulan' => '',
'asuransi' => $getdata->asuransi,
'urgensi' => $getdata->urgensi,
'daftar' => $getdata->daftar,
'pendaftar' => Session('id'),
'nmpendaftar' => Session('nama'),
'orderid' => $getdata->orderid,
]); ]);
$pesan = 'Order Expertise Canceled'; try {
} else if ($tabel == 'arsip'){ if ($getdata->kd_spesimen != '' AND $getdata->nm_spesimen != ''){
$total = 0; PendaftaranOnListiner::updateOrCreate(
$input = Periksa::whereIn('id', $id)->update([ [
'status'=> 'Arsip' 'rnoreg' => $getdata->nofoto,
]); ],
if ($input){ [
$total++; 'rtglast' => date('Y-m-d'),
} 'norm' => $getdata->noregister,
$pesan = 'Expertise Archieved '.$total; 'nama' => $getdata->nmpasien,
'alamat' => $getdata->alamatpasien,
'telp' => $getdata->tlppasien,
'hp' => $getdata->tlppasien,
'tgllahir' => $getdata->tgllahirpasien,
'umur' => $getdata->usia,
'rjenis' => $getdata->jkpasien,
'kodedok' => Session('id'),
'namadok' => Session('nama'),
'ruangan' => $getdata->ruangan,
'tes' => '',
'alat' => 'All',
'kd_spesimen' => $getdata->kd_spesimen,
'nm_spesimen' => $getdata->nm_spesimen,
]
);
}
return response()->json(['status' => 'Sukses', 'message' => 'Data Order Berhasil di Gandakan'], 201);
} catch (Exception $e) {
return response()->json(['status' => 'Sukses', 'message' => 'Data Order Berhasil di Gandakan'], 201);
}
} else { } else {
$alasan = 'Dibatalkan dengan alasan '.$alasan; return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Data Tidak Valid']);
$input = Jadwalperiksa::where('id', $id)->update([ return back();
'noloket' => null,
'status' => $alasan
]);
$pesan = 'Schedulling Canceled';
} }
if ($input){ } else {
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Sukses', 'message' => $pesan]); if ($alasan == ''){
return back(); return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Mohon isi semua form']);
}else {
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'System Down, please try again in a few years...']);
return back(); return back();
} else {
if ($tabel == 'aktif'){
$alasan = 'Dibatalkan dengan alasan '.$alasan;
$input = Periksa::where('id', $id)->update([
'noloket' => null,
'status' => $alasan
]);
$pesan = 'Order Expertise Canceled';
} else if ($tabel == 'arsip'){
$total = 0;
$input = Periksa::whereIn('id', $id)->update([
'status'=> 'Arsip'
]);
if ($input){
$total++;
}
$pesan = 'Expertise Archieved '.$total;
} else {
$alasan = 'Dibatalkan dengan alasan '.$alasan;
$input = Jadwalperiksa::where('id', $id)->update([
'noloket' => null,
'status' => $alasan
]);
$pesan = 'Schedulling Canceled';
}
if ($input){
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Sukses', 'message' => $pesan]);
return back();
}else {
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'System Down, please try again in a few years...']);
return back();
}
} }
} }
} }
} }
@@ -105,48 +105,39 @@ class PasienController extends Controller
]); ]);
} else { } else {
try { try {
$client = new Client(); $client = new Client();
$res = $client->request('GET', 'http://10.10.123.51:8000/mr/'.$norm); $res = $client->request('GET', env('GETPASIEN_API'), ['query' => ['limit' => 10, 'nomedis' => $norm]]);
$response_data = json_decode($res->getBody()->getContents()); $response_data = json_decode($res->getBody()->getContents());
if (isset($response_data[0])) { if (isset($response_data->response[0])) {
$hasil = $response_data[0]; $hasil = $response_data->response[0];
$nama = $hasil->Nama; $nama = $hasil->Nama;
$alamat = $hasil->Alamat; $alamat = $hasil->Alamat;
$telpon = $hasil->Telp; $telpon = $hasil->Telp;
$kota = $hasil->Kota; $kota = $hasil->Kota;
$kelamin = $hasil->JenisKelamin; $kelamin = $hasil->JenisKelamin;
$tgllahir = $hasil->tanggal_lahir; $tgllahir = $hasil->tanggal_lahir;
$nik = $hasil->nik; return response()->json([
$bpjs = $hasil->bpjs; 'id' => 'new',
if ($kelamin == 'WANITA'){ 'norm' => $norm,
$kelamin = 'P'; 'telpon' => $telpon,
} else { $kelamin = 'L'; } 'nama' => $nama,
return response()->json([ 'tgl_lahir' => date('d-m-Y', strtotime($tgllahir)),
'id' => 'new', 'jk' => $kelamin,
'norm' => $norm, 'alamat' => $alamat,
'telpon' => $telpon, 'kota' => $kota,
'nama' => $nama, ]);
'tgl_lahir' => $tgllahir, } else {
'jk' => $kelamin, return response()->json([
'alamat' => $alamat, 'id' => '',
'kota' => $kota, 'telpon' => '000000000',
'nik' => $nik, 'norm' => $norm,
'bpjs' => $bpjs, 'nama' => '',
]); 'tgl_lahir' => date("d-m-Y"),
} else { 'jk' => 'L',
return response()->json([ 'alamat' => 'Malang',
'id' => '', 'kota' => 'Malang',
'telpon' => '000000000', ]);
'norm' => $norm, }
'nama' => '',
'tgl_lahir' => date("d-m-Y"),
'jk' => 'L',
'alamat' => 'Malang',
'kota' => 'Malang',
'nik' => '',
'bpjs' => '',
]);
}
}catch (Exception $e) { }catch (Exception $e) {
return response()->json([ return response()->json([
'id' => '', 'id' => '',
@@ -308,25 +308,34 @@ class ReportController extends Controller
} }
} }
public function genRekapAntibiotik(Request $request) { public function genRekapAntibiotik(Request $request) {
$data = []; $data = [];
$bulan = $request->input('bulan'); $bulan = $request->input('bulan');
$tahun = $request->input('tahun'); $tahun = $request->input('tahun');
if ($tahun == '' OR is_null($tahun)){ if ($tahun == '' OR is_null($tahun)){
$getarray = explode('?', $bulan); $getarray = explode('?', $bulan);
$bulan = $getarray[0] ?? date('m'); $bulan = $getarray[0] ?? date('m');
$tahun = $getarray[1] ?? date('Y'); $tahun = $getarray[1] ?? date('Y');
$bulan = str_replace('bulan=', '', $bulan); $bulan = str_replace('bulan=', '', $bulan);
$tahun = str_replace('tahun=', '', $tahun); $tahun = str_replace('tahun=', '', $tahun);
} }
if ($bulan == '' OR $bulan == 'ALL' OR $bulan == 'Pick Month') { if ($bulan == '' OR $bulan == 'ALL' OR $bulan == 'Pick Month') {
$orderbydate = Periksa::whereYear('daftar', $tahun)->get(); $orderbydate = Periksa::whereYear('daftar', $tahun)->orderBy('daftar', 'asc')->get();
$jsonantibiotik = RekapAntibiotik::whereIn('orderid', $orderbydate->pluck('id'))->get()->groupBy('orderid');
} else { } else {
$orderbydate = Periksa::whereMonth('daftar', $bulan)->whereYear('daftar', $tahun)->get(); $orderbydate = Periksa::whereMonth('daftar', $bulan)->whereYear('daftar', $tahun)->orderBy('daftar', 'asc')->get();
$jsonantibiotik = RekapAntibiotik::whereIn('orderid', $orderbydate->pluck('id'))->get()->groupBy('orderid');
} }
return view('admin.rekapantibiotik', compact('orderbydate', 'jsonantibiotik', 'bulan', 'tahun'));
} $orderIds = $orderbydate->pluck('id');
$allAntibiotics = RekapAntibiotik::whereIn('orderid', $orderIds)->get();
$masterAntibioticList = $allAntibiotics->pluck('resistance')->unique()->sort()->values();
$jsonantibiotik = $allAntibiotics->groupBy('orderid')->map(function ($items) {
return $items->pluck('interpretation', 'resistance');
});
return view('admin.rekapantibiotik', compact('orderbydate', 'jsonantibiotik', 'bulan', 'tahun', 'masterAntibioticList'));
}
public function genGlassReport(Request $request) { public function genGlassReport(Request $request) {
$data = []; $data = [];
$bulan = $request->input('bulan'); $bulan = $request->input('bulan');
@@ -275,6 +275,34 @@ class TemplateController extends Controller
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Failed', 'message' => 'Unkown Error']); return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Failed', 'message' => 'Unkown Error']);
return back(); return back();
} }
} else if ($tabel == 'Speciment'){
if ($id == 'new'){
$ceksudah = Organisms::where('name', $request->name)->where('category', $request->category)->where('kelompok', $request->kelompok)->count();
if ($ceksudah == 0){
$data = new Organisms;
$inputData = $request->except(['id', 'tabel', '_token']);
$data->fill($inputData);
$data->save();
} else {
$pesan = $request->name.' ('.$request->category.') Sudah ada, Mohon ubah Data sebelum simpan kembali';
}
} else {
$ceksudah = Organisms::where('id', '!=', $id)->where('name', $request->name)->where('category', $request->category)->where('kelompok', $request->kelompok)->count();
if ($ceksudah == 0){
$data = Organisms::find($id);
$inputData = $request->except(['id', 'tabel', '_token']);
$data->update($inputData);
} else {
$pesan = $request->name.' ('.$request->category.') Sudah ada, Mohon ubah Data sebelum simpan kembali';
}
}
if ($data){
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Success', 'message' => 'Saved']);
return back();
} else {
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Failed', 'message' => 'Unkown Error']);
return back();
}
} else if ($tabel == 'Parameter'){ } else if ($tabel == 'Parameter'){
$getdatalama = Organisms::where('kelompok', $request->kelompok)->first(); $getdatalama = Organisms::where('kelompok', $request->kelompok)->first();
$category = $getdatalama->category ?? $request->kelompok; $category = $getdatalama->category ?? $request->kelompok;
@@ -24,6 +24,8 @@ class RouteServiceProvider extends ServiceProvider
*/ */
public function boot(): void public function boot(): void
{ {
//resolve(\Illuminate\Routing\UrlGenerator::class)->forceScheme('https');
//parent::boot();
RateLimiter::for('api', function (Request $request) { RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
}); });
+15
View File
@@ -0,0 +1,15 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class ResultOnListiner extends Model
{
protected $connection = 'mysqllistener';
protected $primaryKey = "urut";
protected $table = "lis_phoenix";
public $timestamps = false;
protected $guarded = [];
}
@@ -231,110 +231,80 @@ class AstmMessageService
return response()->json(['message' => 'Data berhasil diproses dan disimpan.']); return response()->json(['message' => 'Data berhasil diproses dan disimpan.']);
} else { } else {
if (!empty($mltrData)){ if (!empty($mltrData)) {
Log::info("Trying parser MTRSL :", $mltrData); Log::info("Trying robust parser for MTRSL:", $mltrData);
$parsedData = [];
$parsedData['antibiotics'] = []; $resultSample = new ResultSample();
$antibiotic = ''; $antibioticResults = [];
$resistance = ''; $currentAntibiotic = [];
$value = '';
$interpretation = ''; foreach ($mltrData as $field) {
$mulaikirim = 0; if (strlen($field) < 2) continue; // Lewati field kosong
$resultSample = new ResultSample();
foreach ($mltrData as $index => $field) { // 1. Identifikasi TAG dan VALUE dari setiap field
if ($field == 'ra'){ $tag = substr($field, 0, 2);
if ($antibiotic != ''){ $value = substr($field, 2);
$parsedData['antibiotics'][] = [
'antibiotic' => $antibiotic, // Antibiotik // 2. Gunakan SWITCH pada TAG, bukan pada INDEX
'resistance' => $resistance, // Hasil Resistansi switch ($tag) {
'value' => $value, // Nilai // == Data Pasien & Sampel ==
'interpretation'=> $interpretation // Interpretasi case 'pi': $resultSample->patient_id = $value; break;
]; case 'pn':
$antibiotic = ''; $patientNames = explode(',', $value ?? null);
$resistance = ''; $resultSample->patient_name_last = trim($patientNames[0] ?? '');
$value = ''; $resultSample->patient_name_first = trim($patientNames[1] ?? '');
$interpretation = ''; $resultSample->patient_name_middle = trim($patientNames[2] ?? '');
} else { break;
$mulaikirim = 1; case 'pl': $resultSample->address_street = $value; break;
} case 'ci': $resultSample->accession_number = substr($value, 6); break;
} else { case 'o2': $resultSample->organism = $value; break;
if ($mulaikirim == 1){
$antibiotic = substr($field, 2); // Tanggal bisa memiliki tag s1, s3, dll. Sesuaikan jika perlu
$mulaikirim++; case 's3':
} else if ($mulaikirim == 2){ try {
$resistance = substr($field, 2); // Contoh parsing tanggal dari format Vitek: 08/25/2025
$mulaikirim++; $resultSample->test_complete_datetime = Carbon::createFromFormat('m/d/Y', $value)->format('Y-m-d H:i:s');
} else if ($mulaikirim == 3){ } catch (Exception $e) {
$value = substr($field, 2); $resultSample->test_complete_datetime = now();
$mulaikirim++;
} else if ($mulaikirim == 4){
$interpretation = substr($field, 2);
$mulaikirim++;
} else {
$field = substr($field, 2);
switch ($index) {
case 0:
$resultSample->sender_name = $alat;
break;
case 1:
$resultSample->version_number = $field; // iiV2
break;
case 2:
$resultSample->isolate_number = $field; // is000015F278BD
break;
case 4:
$resultSample->patient_id = $field; // pi12009427
break;
case 5:
$patientNames = explode(',', $field ?? null);
if (count($patientNames) > 0) {
$resultSample->patient_name_last = trim($patientNames[0]); // Last name
}
if (count($patientNames) > 1) {
$resultSample->patient_name_first = trim($patientNames[1]); // First name
}
if (count($patientNames) > 2) {
$resultSample->patient_name_middle = trim($patientNames[2]); // Middle name
}
break;
case 6:
$resultSample->address_street = $field; // plMANINJAU
break;
case 12:
try {
$resultSample->message_datetime = Carbon::parse($field)->format('Y-m-d') ?? null;
}catch (Exception $e) {
$resultSample->message_datetime = date('Y-m-d');
}
break;
case 13:
try {
$resultSample->test_complete_datetime = Carbon::parse($field)->format('Y-m-d') ?? null;
}catch (Exception $e) {
$resultSample->test_complete_datetime = date('Y-m-d');
}
break;
case 14:
$resultSample->accession_number = substr($field, 6); // ci30112024.26859
break;
case 23:
$resultSample->organism = $field; // o2Staphylococcus haemolyticus
break;
} }
} break;
// == Logika Cerdas untuk Blok Antibiotik ==
case 'ra':
// 'ra' adalah sinyal bahwa blok antibiotik SEBELUMNYA sudah selesai.
// Jika $currentAntibiotic tidak kosong, simpan ke hasil utama.
if (!empty($currentAntibiotic)) {
$antibioticResults[] = $currentAntibiotic;
}
// Reset untuk menampung data antibiotik yang baru.
$currentAntibiotic = [];
break;
case 'a1': $currentAntibiotic['antibiotic'] = $value; break; // Kode Antibiotik
case 'a2': $currentAntibiotic['resistance'] = $value; break; // Nama Antibiotik
case 'a3': $currentAntibiotic['value'] = $value; break; // Nilai MIC
case 'a4': $currentAntibiotic['interpretation'] = $value; break; // Interpretasi
case 'an':
// Jika 'an' ada, ini adalah interpretasi final, timpa yang sebelumnya.
$currentAntibiotic['interpretation'] = $value;
break;
// == Metadata Lainnya (opsional) ==
case 'ii': $resultSample->version_number = $value; break;
case 'is': $resultSample->isolate_number = $value; break;
} }
} }
//$resultSample->specimen_type = $parsedData['specimen_type'] ?? null; // Could be inferred
//$resultSample->test_id = $parsedData['test_id'] ?? null;
// Result Record // Penting: Simpan blok antibiotik TERAKHIR setelah loop selesai
if (!empty($currentAntibiotic)) {
$resultSample->additional_result = json_encode($parsedData['antibiotics']); $antibioticResults[] = $currentAntibiotic;
}
$resultSample->sender_name = $alat ?? 'VITEK'; // Pastikan var $alat ada
$resultSample->additional_result = json_encode($antibioticResults);
// Menyimpan data yang sudah diparse // Menyimpan data yang sudah diparse
$resultSample->save(); $resultSample->save();
Log::info("Data MTRL Berhasil di Parse dan di simpan ", $resultSample->toArray()); Log::info("Data MTRSL successfully parsed and saved.", $resultSample->toArray());
return response()->json(['message' => 'Data berhasil diproses dan disimpan.']); return response()->json(['message' => 'Data berhasil diproses dan disimpan.']);
} else { } else {
$headerData = explode("|", $response); $headerData = explode("|", $response);
View File
View File
Loaded 100 of 15171 files, more files were not shown because too many files have changed in this diff. Show more