This commit is contained in:
Dwi Swandhana
2026-08-01 17:02:31 +07:00
parent a3a98b13e3
commit 0891978d46
4 changed files with 393 additions and 0 deletions
+48
View File
@@ -260,6 +260,54 @@ Format JSON yang dihasilkan:
}
```
### Simulasi Kirim Data Seperti SIMRS
Setelah file JSON dibuat dari `register-api:export`, data dapat dikirim ulang ke endpoint `registerApi` seolah-olah berasal dari SIMRS.
Tes tanpa mengirim data:
```bash
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json --dry-run
```
Kirim ke endpoint default dari `APP_URL/registerpasien`:
```bash
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json
```
Kirim ke endpoint tertentu:
```bash
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json \
--url=http://10.10.123.218/registerpasien
```
Batasi pengiriman untuk uji coba:
```bash
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json --limit=5
```
Tambahkan jeda antar request, misalnya `500` milidetik:
```bash
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json --delay=500
```
Berhenti jika ada request gagal:
```bash
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json --stop-on-error
```
Contoh alur lengkap:
```bash
php artisan register-api:export 2026-08-01 --pretty --output=/home/mikro/project/export-register-api-2026-08-01.json
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json --url=http://10.10.123.218/registerpasien
```
## Kontribusi
Jika Anda ingin berkontribusi pada proyek ini, silakan buat **pull request** atau **issue** terkait.
@@ -0,0 +1,115 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Http;
class SendRegisterApiExportCommand extends Command
{
protected $signature = 'register-api:send-export
{file : Path file JSON hasil register-api:export}
{--url= : URL endpoint registerApi, default APP_URL/registerpasien}
{--delay=0 : Jeda antar kirim dalam milidetik}
{--limit=0 : Batasi jumlah data yang dikirim, 0 berarti semua}
{--start=0 : Mulai dari index data ke-n, 0 berarti dari awal}
{--dry-run : Tampilkan payload tanpa mengirim}
{--stop-on-error : Berhenti jika ada request gagal}';
protected $description = 'Simulasi kirim payload registerApi dari file JSON export seolah-olah dikirim oleh SIMRS.';
public function handle(): int
{
$file = (string) $this->argument('file');
if (!File::exists($file) || !is_readable($file)) {
$this->error('File JSON tidak ditemukan atau tidak bisa dibaca: ' . $file);
return Command::FAILURE;
}
$content = File::get($file);
$decoded = json_decode($content, true);
if (!is_array($decoded)) {
$this->error('File bukan JSON valid.');
return Command::FAILURE;
}
$rows = $this->extractRows($decoded);
if (empty($rows)) {
$this->warn('Tidak ada data untuk dikirim.');
return Command::SUCCESS;
}
$start = max(0, (int) $this->option('start'));
$limit = max(0, (int) $this->option('limit'));
$delay = max(0, (int) $this->option('delay'));
$endpoint = $this->endpoint();
$rows = array_slice($rows, $start, $limit > 0 ? $limit : null);
$total = count($rows);
$success = 0;
$failed = 0;
$this->info('Endpoint: ' . $endpoint);
$this->info('Total payload: ' . $total);
foreach ($rows as $index => $payload) {
$sequence = $start + $index + 1;
$label = $payload['nomor_lab'] ?? $payload['norm'] ?? $sequence;
if ($this->option('dry-run')) {
$this->line('[' . $sequence . '] DRY RUN ' . $label . ': ' . json_encode($payload, JSON_UNESCAPED_SLASHES));
$success++;
continue;
}
$response = Http::asJson()
->acceptJson()
->timeout(120)
->post($endpoint, $payload);
if ($response->successful()) {
$success++;
$this->line('[' . $sequence . '] OK ' . $label . ' HTTP ' . $response->status() . ' ' . $response->body());
} else {
$failed++;
$this->error('[' . $sequence . '] GAGAL ' . $label . ' HTTP ' . $response->status() . ' ' . $response->body());
if ($this->option('stop-on-error')) {
break;
}
}
if ($delay > 0 && $index < $total - 1) {
usleep($delay * 1000);
}
}
$this->info('Selesai. Berhasil: ' . $success . ', gagal: ' . $failed);
return $failed > 0 ? Command::FAILURE : Command::SUCCESS;
}
private function extractRows(array $decoded): array
{
if (isset($decoded['data']) && is_array($decoded['data'])) {
return $decoded['data'];
}
if (array_is_list($decoded)) {
return $decoded;
}
return [$decoded];
}
private function endpoint(): string
{
$url = (string) $this->option('url');
if ($url !== '') {
return $url;
}
return rtrim((string) config('app.url'), '/') . '/registerpasien';
}
}
@@ -1542,6 +1542,234 @@ class FrontpageController extends Controller
}
return response()->json(['status' => 'Sukses', 'message' => $pesan], 201);
}
public function registerApiUlang(Request $request) {
$decodedData = $request->json()->all();
$norm = $decodedData['norm'] ?? null;
$nama = $decodedData['nama'] ?? null;
$alamat = $decodedData['alamat'] ?? config('global.addressapps');
$kota = $decodedData['kota'] ?? config('global.subdomainapps');
$tgllahir = $decodedData['tgllahir'] ?? date('Y-m-d');
$nohap = $decodedData['nohap'] ?? '0000000000';
$jk = $decodedData['kelamin'] ?? 'L';
$urgensi = $decodedData['urgensi'] ?? 'Elective';
$berat = $decodedData['beratbadan'] ?? '0';
$nik = $decodedData['nik'] ?? '0';
$bpjs = $decodedData['nobpjs'] ?? '0';
$drpeminta = $decodedData['drpeminta'] ?? null;
$tlsasal = $decodedData['asalpasien'] ?? null;
$diagnosa = $decodedData['diagnosa'] ?? null;
$statusbayar = $decodedData['statusbayar'] ?? null;
$notransaksi = $decodedData['nomor_lab'] ?? null;
$insurance = $decodedData['jenispembayaran'] ?? 'UMM';
$klinis = $decodedData['diagnosa'] ?? $decodedData['klinisi'] ?? null;
$klinisi = $decodedData['klinisi'] ?? $drpeminta;
$rekues = $decodedData['jenispemeriksaan'] ?? null;
$nm_spesimen = $decodedData['spesimen'] ?? null;
$kd_spesimen = $decodedData['kodespesimen'] ?? null;
$pengambilan = $decodedData['pengambilan'] ?? null;
$nmrs = $decodedData['keteranganrujukan'] ?? $decodedData['namarspengirim'] ?? 'RSSA Malang';
$tanggalregis = $decodedData['tanggalregis'] ?? date('Y-m-d');
$tanggalsampel = $decodedData['tanggalsampel'] ?? date('Y-m-d');
$asalpengirim = $decodedData['asalpengirim'] ?? null;
$nofoto = $decodedData['nomorlab'] ?? '';
$telpon = str_replace('_', '', $nohap);
$tlsasal = str_replace('_', ' ', $tlsasal);
$klinisi = str_replace('_', ' ', $klinisi);
$nama = str_replace('_', ' ', $nama);
$alamat = str_replace('_', ' ', $alamat);
$getkodespesimen= Organisms::where('name', $nm_spesimen)->where('kelompok', 'listkodespesimen')->first();
if (isset($getkodespesimen->category)){
$kd_spesimen= $getkodespesimen->category;
} else {
Organisms::create([
'name' => $nm_spesimen,
'category' => $kd_spesimen,
'kelompok' => 'listkodespesimen'
]);
}
$iddokter = '';
$ruangan = 1;
$kelompok = 'admin';
$daftar = date('Y-m-d H:i:s');
$mulai = $daftar;
$tambah = ' + 360 second';
$akhir = date('Y-m-d h:i:s',strtotime($tambah,strtotime($daftar)));
$start = strtotime(date("Y-m-d H:i:s",strtotime($mulai)));
$finish = strtotime(date("Y-m-d H:i:s",strtotime($akhir)));
$tglsekarang = date('Y-m-d');
$noregister = strtoupper($norm);
$yy = date("Y");
$mm = date("m");
$terjadwal = 'sekarang';
$kamar = 'Mikrobiologi';
$pasien_id = 0;
$tgllahir = \Carbon\Carbon::createFromFormat('Y-m-d', $tgllahir);
$pasien = Pasien::where('norm', $noregister)->first();
try {
if (isset($pasien->id)) {
$pasien_id = $pasien->id;
Pasien::where('norm', $noregister)->update([
'nama' => $nama,
'jk' => $jk,
'tgl_lahir' => $tgllahir,
'kota' => $kota,
'telpon' => $telpon,
'nik' => $nik,
'bpjs' => $bpjs,
]);
} else {
$alamatbaru = substr($alamat, 0, 100);
$pasien_id = Pasien::insertGetId([
'norm' => $noregister,
'nama' => $nama,
'jk' => $jk,
'tgl_lahir' => $tgllahir,
'kota' => $kota,
'telpon' => $telpon,
'alamat' => $alamatbaru,
'nik' => $nik,
'bpjs' => $bpjs,
]);
}
} catch (\Exception $e) {
Log::error('Error in register Pasien: '.$e->getMessage());
}
$datetime = new DateTime($tgllahir);
$today = new DateTime();
$diff = $today->diff($datetime);
$tahun = $diff->y;
$bulan = $diff->m;
if ($tahun ==0) {
$usia = $bulan." Bulan";
} else {
$usia = $tahun." Tahun, ". $bulan. " Bulan";
}
$jruang = Ruangan::where('id', $ruangan)->first();
if (isset($jruang->ruangan)){
$kamar = $jruang->ruangan;
} else { $kamar = '-'; $ruangan = 1; }
$tahuncari = date("Y");
$noloketsaja = explode('-', $nofoto);
$noloket = $noloketsaja[1] ?? 0;
$noloket = int($noloket);
$code_poli = 'Mikrobiologi';
$dlp = '';
$check = Poli::where('subpoli', $rekues)->first();
if (isset($check->id)){
$poli_id = $check->id;
$kd_spesimen= $check->subsubpoli;
$nm_spesimen= $check->modaliti;
$dlp = $check->kelompok;
} else {
$poli_id = Poli::insertGetId([
'poli' => 'Mikrobiologi',
'subpoli' => $rekues,
'subsubpoli' => $kd_spesimen,
'modaliti' => $nm_spesimen,
]);
}
if ($iddokter == ''){
$iddokter = 0;
$dokter = null;
} else {
$getdokter = User::where('id', $iddokter)->first();
if (isset($getdokter->nama)){
$dokter = $getdokter->nama;
} else { $dokter = 'Dokter Spesialis'; }
}
$clientIp = $request->server('HTTP_X_FORWARDED_FOR') ?: $request->ip();
$clientIpNumeric = ip2long($clientIp);
if ($nofoto == ''){
return response()->json(['status' => 'Gagal', 'message' => 'Nomor Sample Tidak Boleh Kosong'], 500);
} else {
$ceksudahada = Periksa::where('noregister', $noregister)->where('orderid', $notransaksi)->where('poli_id', $poli_id)->first();
if (isset($ceksudahada->id)){
$pesan = $ceksudahada->nofoto;
} else {
$periksaid = Periksa::insertGetId([
'mulai' => $mulai,
'akhir' => $akhir,
'noloket' => $noloket,
'nofoto' => $nofoto,
'noregister' => $noregister,
'asalpasien' => $tlsasal,
'nmrs' => $nmrs,
'pasien_id' => $pasien_id,
'nmpasien' => $nama,
'jkpasien' => $jk,
'ktp' => $nik,
'bpjs' => $bpjs,
'tgllahirpasien'=> $tgllahir,
'tlppasien' => $telpon,
'alamatpasien' => $alamat,
'reques' => $rekues,
'usia' => $usia,
'berat' => $berat,
'ruangan_id' => $ruangan,
'ruangan' => $kamar,
'klinisi' => $klinisi,
'klinis' => $klinis,
'poli_id' => $poli_id,
'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen,
'keterangan' => '',
'kesimpulan' => $decodedData['spesimen'] ?? $nm_spesimen ?? null,
'asuransi' => $insurance,
'urgensi' => $urgensi,
'daftar' => $mulai,
'dlp' => $dlp,
'pengambilan' => $pengambilan,
'tanggalregis' => $tanggalregis,
'tanggalsampel' => $tanggalsampel,
'pendaftar' => $clientIpNumeric,
'nmpendaftar' => $clientIp,
'asalpengirim' => $asalpengirim,
'orderid' => $notransaksi,
]);
$pesan = $nofoto;
$daftaridtcm = [79,80,81,82,83,84,203, 14,28,55,62,94,104,105,124,138,146];
if (in_array($poli_id, $daftaridtcm)){
$genexpert = false;
} else {
$genexpert = true;
}
Paslab::updateOrCreate(
[
'rnoreg' => $nofoto,
],
[
'nama' => $nama,
'norm' => $noregister,
'rtglast' => $mulai,
'alamat' => $alamat,
'rjenis' => $jk,
'umur' => $usia,
'namadok' => $nik,
'ruangan' => $tlsasal,
'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' => true,
'flg_gxp1' => $genexpert,
'flg_gxp2' => $genexpert,
'flg_gxp3' => $genexpert,
'flg_vitek3' => false,
]
);
}
return response()->json(['status' => 'Sukses', 'message' => $pesan], 201);
}
}
public function register(Request $request) {
$validator = Validator::make($request->all(), [
+2
View File
@@ -27,6 +27,8 @@ Route::get('label/{id}', [DokterController::class, 'ctkLabel']);
Route::get('cekandroid/{firebaseid}', [AuthController::class, 'cekandroid']);
Route::get('mobile/expertise/{periksa}', [MobileApiController::class, 'openExpertise']);
Route::post('registerpasien', [FrontpageController::class, 'registerApi']);
Route::post('registerulang', [FrontpageController::class, 'registerApiUlang']);
Route::post('registerjson', [FrontpageController::class, 'registerApiFormatJSON']);
Route::post('prosesbatal', [DokterController::class, 'cancelOrder']);
Route::post('ekstrakhasil', [DokterController::class, 'gethasiltoSIMRS'])->name('gethasiltoSIMRS');