139 lines
4.7 KiB
PHP
139 lines
4.7 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Periksa;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Support\Facades\File;
|
|
|
|
class ExportRegisterApiByDateCommand extends Command
|
|
{
|
|
protected $signature = 'register-api:export
|
|
{date : Tanggal data periksa, format YYYY-MM-DD}
|
|
{--column=daftar : Kolom tanggal untuk filter, contoh daftar/tanggalregis/tanggalsampel}
|
|
{--output= : Simpan hasil JSON ke file}
|
|
{--pretty : Format JSON agar mudah dibaca}';
|
|
|
|
protected $description = 'Export data periksa per tanggal ke format JSON payload registerApi.';
|
|
|
|
public function handle(): int
|
|
{
|
|
$date = $this->argument('date');
|
|
$column = (string) $this->option('column');
|
|
|
|
if (!$this->isValidDate($date)) {
|
|
$this->error('Format tanggal harus YYYY-MM-DD.');
|
|
return Command::FAILURE;
|
|
}
|
|
|
|
if (!in_array($column, ['daftar', 'tanggalregis', 'tanggalsampel'], true)) {
|
|
$this->error('Kolom tanggal hanya boleh: daftar, tanggalregis, tanggalsampel.');
|
|
return Command::FAILURE;
|
|
}
|
|
|
|
$records = Periksa::with('getPasien')
|
|
->whereDate($column, $date)
|
|
->orderBy($column)
|
|
->orderBy('id')
|
|
->get()
|
|
->map(fn (Periksa $periksa) => $this->mapPeriksaToRegisterPayload($periksa))
|
|
->values();
|
|
|
|
$payload = [
|
|
'tanggal' => $date,
|
|
'filter_column' => $column,
|
|
'total' => $records->count(),
|
|
'data' => $records,
|
|
];
|
|
|
|
$jsonOptions = JSON_UNESCAPED_SLASHES;
|
|
if ($this->option('pretty')) {
|
|
$jsonOptions |= JSON_PRETTY_PRINT;
|
|
}
|
|
|
|
$json = json_encode($payload, $jsonOptions);
|
|
if ($json === false) {
|
|
$this->error('Gagal membuat JSON.');
|
|
return Command::FAILURE;
|
|
}
|
|
|
|
if ($this->option('output')) {
|
|
$output = (string) $this->option('output');
|
|
File::ensureDirectoryExists(dirname($output));
|
|
File::put($output, $json . PHP_EOL);
|
|
$this->info('Export selesai: ' . $output);
|
|
$this->info('Total data: ' . $records->count());
|
|
return Command::SUCCESS;
|
|
}
|
|
|
|
$this->line($json);
|
|
|
|
return Command::SUCCESS;
|
|
}
|
|
|
|
private function mapPeriksaToRegisterPayload(Periksa $periksa): array
|
|
{
|
|
$pasien = $periksa->getPasien;
|
|
$tanggalLahir = $this->formatDate($periksa->tgllahirpasien ?? $pasien?->tgl_lahir);
|
|
$tanggalRegis = $this->formatDate($periksa->tanggalregis) ?: $this->formatDate($periksa->daftar);
|
|
$tanggalSampel = $this->formatDate($periksa->tanggalsampel) ?: $tanggalRegis;
|
|
$diagnosa = $periksa->klinis ?: null;
|
|
$klinisi = $periksa->klinisi ?: null;
|
|
|
|
return [
|
|
'norm' => $periksa->noregister,
|
|
'nama' => $periksa->nmpasien,
|
|
'alamat' => $periksa->alamatpasien ?: config('global.addressapps'),
|
|
'kota' => $pasien?->kota ?: config('global.subdomainapps'),
|
|
'tgllahir' => $tanggalLahir ?: date('Y-m-d'),
|
|
'nohap' => $periksa->tlppasien ?: '0000000000',
|
|
'kelamin' => $periksa->jkpasien ?: 'L',
|
|
'urgensi' => $periksa->urgensi ?: 'Elective',
|
|
'beratbadan' => (string) ($periksa->berat ?? '0'),
|
|
'nik' => $periksa->ktp ?: '0',
|
|
'nobpjs' => $periksa->bpjs ?: '0',
|
|
'drpeminta' => $klinisi,
|
|
'asalpasien' => $periksa->asalpasien,
|
|
'diagnosa' => $diagnosa,
|
|
'statusbayar' => null,
|
|
'nomor_lab' => $periksa->orderid,
|
|
'jenispembayaran' => $periksa->asuransi ?: 'UMM',
|
|
'klinisi' => $klinisi,
|
|
'jenispemeriksaan' => $periksa->reques,
|
|
'spesimen' => $periksa->nm_spesimen,
|
|
'kodespesimen' => $periksa->kd_spesimen,
|
|
'pengambilan' => $periksa->pengambilan,
|
|
'keteranganrujukan' => $periksa->nmrs ?: 'RSSA Malang',
|
|
'namarspengirim' => $periksa->nmrs ?: 'RSSA Malang',
|
|
'tanggalregis' => $tanggalRegis ?: date('Y-m-d'),
|
|
'tanggalsampel' => $tanggalSampel ?: date('Y-m-d'),
|
|
'asalpengirim' => $periksa->asalpengirim,
|
|
];
|
|
}
|
|
|
|
private function isValidDate(string $date): bool
|
|
{
|
|
try {
|
|
$parsed = Carbon::createFromFormat('Y-m-d', $date);
|
|
} catch (\Throwable) {
|
|
return false;
|
|
}
|
|
|
|
return $parsed && $parsed->format('Y-m-d') === $date;
|
|
}
|
|
|
|
private function formatDate(mixed $value): ?string
|
|
{
|
|
if (!$value) {
|
|
return null;
|
|
}
|
|
|
|
try {
|
|
return Carbon::parse($value)->format('Y-m-d');
|
|
} catch (\Throwable) {
|
|
return null;
|
|
}
|
|
}
|
|
}
|