update
This commit is contained in:
@@ -64,3 +64,15 @@ BPJS_CONSID="2112121"
|
||||
BPJS_SECRET_KEY="121212121"
|
||||
BPJS_BASE_URL="https://new-api.bpjs-kesehatan.go.id:8080"
|
||||
BPJS_SERVICE_NAME="new-vclaim-rest"
|
||||
|
||||
CLOUD_BACKUP_API_URL=https://duidev.com
|
||||
CLOUD_BACKUP_API_TOKEN=
|
||||
CLOUD_BACKUP_NAME=lismikro
|
||||
CLOUD_BACKUP_CHUNK_SIZE=5242880
|
||||
CLOUD_BACKUP_DOWNLOAD_PATH=
|
||||
CLOUD_BACKUP_PG_RESTORE=pg_restore
|
||||
CLOUD_BACKUP_DB_HOST=10.10.123.193
|
||||
CLOUD_BACKUP_DB_PORT=5002
|
||||
CLOUD_BACKUP_DB_DATABASE=lismikro
|
||||
CLOUD_BACKUP_DB_USERNAME=lismikro
|
||||
CLOUD_BACKUP_DB_PASSWORD=
|
||||
+213
-1
@@ -47,9 +47,221 @@ Untuk panduan pengguna atau manual book dari LIS, dapat diunduh melalui link ber
|
||||
- **Bootstrap** (Frontend)
|
||||
- **jQuery** (Frontend)
|
||||
|
||||
## Backup Database ke Cloud
|
||||
|
||||
Backup database dijalankan dari server production `10.10.123.218`. Database yang di-backup berada di server PostgreSQL `10.10.123.193`, lalu file hasil backup `.backup` dikirim secara bertahap/chunked ke `https://duidev.com` sebagai cadangan cloud.
|
||||
|
||||
Alur backup:
|
||||
|
||||
```text
|
||||
10.10.123.218 -> pg_dump dari 10.10.123.193 -> upload .backup ke duidev.com
|
||||
```
|
||||
|
||||
Alur restore:
|
||||
|
||||
```text
|
||||
10.10.123.218 -> download backup terbaru dari duidev.com -> pg_restore ke 10.10.123.193
|
||||
```
|
||||
|
||||
### Konfigurasi Server Production
|
||||
|
||||
Tambahkan konfigurasi berikut di file `.env` server production `10.10.123.218`:
|
||||
|
||||
```env
|
||||
CLOUD_BACKUP_API_URL=https://duidev.com
|
||||
CLOUD_BACKUP_API_TOKEN=isi_token_rahasia_yang_sama_dengan_duidev
|
||||
CLOUD_BACKUP_NAME=lismikro
|
||||
CLOUD_BACKUP_CHUNK_SIZE=5242880
|
||||
CLOUD_BACKUP_DB_HOST=10.10.123.193
|
||||
CLOUD_BACKUP_DB_PORT=5002
|
||||
CLOUD_BACKUP_DB_DATABASE=lismikro
|
||||
CLOUD_BACKUP_DB_USERNAME=lismikro
|
||||
CLOUD_BACKUP_DB_PASSWORD=
|
||||
```
|
||||
|
||||
Jika password PostgreSQL sudah disimpan di `.pgpass`, `CLOUD_BACKUP_DB_PASSWORD` boleh dikosongkan.
|
||||
|
||||
Setelah mengubah `.env`, jalankan:
|
||||
|
||||
```bash
|
||||
php artisan config:clear
|
||||
```
|
||||
|
||||
### Password PostgreSQL Tanpa Prompt
|
||||
|
||||
Buat file `~/.pgpass` pada user Linux yang menjalankan cron:
|
||||
|
||||
```text
|
||||
10.10.123.193:5002:lismikro:lismikro:PASSWORD_DATABASE
|
||||
```
|
||||
|
||||
Lalu amankan permission-nya:
|
||||
|
||||
```bash
|
||||
chmod 600 ~/.pgpass
|
||||
```
|
||||
|
||||
### Script Backup Harian
|
||||
|
||||
Contoh file `/home/mikro/project/backup.sh`:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
echo "===== Backup mulai: $(date '+%Y-%m-%d %H:%M:%S') ====="
|
||||
|
||||
BACKUP_DIR="/home/mikro/project/backups"
|
||||
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
|
||||
FILE="$BACKUP_DIR/lismikro_$DATE.backup"
|
||||
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
pg_dump -h 10.10.123.193 -p 5002 -U lismikro -d lismikro -F c -v -f "$FILE"
|
||||
STATUS=$?
|
||||
|
||||
if [ $STATUS -eq 0 ]; then
|
||||
echo "Backup berhasil: $FILE"
|
||||
|
||||
cd /home/mikro/project/htdocs
|
||||
php artisan backup:upload-file "$FILE"
|
||||
UPLOAD_STATUS=$?
|
||||
|
||||
if [ $UPLOAD_STATUS -eq 0 ]; then
|
||||
echo "Upload cloud berhasil"
|
||||
else
|
||||
echo "Upload cloud gagal dengan status: $UPLOAD_STATUS"
|
||||
fi
|
||||
|
||||
find "$BACKUP_DIR" -type f -name "lismikro_*.backup" -mtime +2 -delete
|
||||
else
|
||||
echo "Backup gagal dengan status: $STATUS"
|
||||
fi
|
||||
|
||||
echo "===== Backup selesai: $(date '+%Y-%m-%d %H:%M:%S') ====="
|
||||
echo ""
|
||||
```
|
||||
|
||||
Aktifkan script:
|
||||
|
||||
```bash
|
||||
chmod +x /home/mikro/project/backup.sh
|
||||
```
|
||||
|
||||
### Crontab
|
||||
|
||||
Jalankan backup setiap hari jam `23:59`:
|
||||
|
||||
```cron
|
||||
59 23 * * * /home/mikro/project/backup.sh >> /home/mikro/project/backup.log 2>&1
|
||||
```
|
||||
|
||||
Lihat log:
|
||||
|
||||
```bash
|
||||
tail -n 100 /home/mikro/project/backup.log
|
||||
```
|
||||
|
||||
### Upload Manual
|
||||
|
||||
Jika sudah memiliki file `.backup` dan ingin mengirim ulang ke cloud:
|
||||
|
||||
```bash
|
||||
cd /home/mikro/project/htdocs
|
||||
php artisan backup:upload-file /home/mikro/project/backups/lismikro_YYYY-MM-DD_HH-MM-SS.backup
|
||||
```
|
||||
|
||||
### Download Backup Terbaru
|
||||
|
||||
Untuk download saja tanpa restore:
|
||||
|
||||
```bash
|
||||
cd /home/mikro/project/htdocs
|
||||
php artisan backup:restore-latest --download-only
|
||||
```
|
||||
|
||||
### Restore Penuh ke Database
|
||||
|
||||
Restore dijalankan dari server production `10.10.123.218` dan target database adalah `10.10.123.193`.
|
||||
|
||||
```bash
|
||||
cd /home/mikro/project/htdocs
|
||||
php artisan backup:restore-latest
|
||||
```
|
||||
|
||||
Jika ingin langsung restore tanpa pertanyaan konfirmasi:
|
||||
|
||||
```bash
|
||||
php artisan backup:restore-latest --yes
|
||||
```
|
||||
|
||||
Perintah restore memakai `pg_restore --clean --if-exists --no-owner` secara default. Pastikan `pg_restore` tersedia di server production.
|
||||
|
||||
## Export Reverse Payload `registerApi`
|
||||
|
||||
Perintah ini menarik data dari tabel `periksa` berdasarkan tanggal tertentu, lalu mengubahnya kembali menjadi JSON dengan key yang sama seperti payload awal `registerApi`.
|
||||
|
||||
Contoh export berdasarkan tanggal daftar:
|
||||
|
||||
```bash
|
||||
php artisan register-api:export 2026-08-01 --pretty
|
||||
```
|
||||
|
||||
Simpan hasil ke file:
|
||||
|
||||
```bash
|
||||
php artisan register-api:export 2026-08-01 --pretty --output=/home/mikro/project/export-register-api-2026-08-01.json
|
||||
```
|
||||
|
||||
Secara default filter memakai kolom `daftar`. Jika ingin memakai tanggal lain:
|
||||
|
||||
```bash
|
||||
php artisan register-api:export 2026-08-01 --column=tanggalregis --pretty
|
||||
php artisan register-api:export 2026-08-01 --column=tanggalsampel --pretty
|
||||
```
|
||||
|
||||
Format JSON yang dihasilkan:
|
||||
|
||||
```json
|
||||
{
|
||||
"tanggal": "2026-08-01",
|
||||
"filter_column": "daftar",
|
||||
"total": 1,
|
||||
"data": [
|
||||
{
|
||||
"norm": "RM001",
|
||||
"nama": "Nama Pasien",
|
||||
"alamat": "Alamat Pasien",
|
||||
"kota": "Kota",
|
||||
"tgllahir": "1990-01-01",
|
||||
"nohap": "0000000000",
|
||||
"kelamin": "L",
|
||||
"urgensi": "Elective",
|
||||
"beratbadan": "0",
|
||||
"nik": "0",
|
||||
"nobpjs": "0",
|
||||
"drpeminta": "Dokter Peminta",
|
||||
"asalpasien": "Rawat Jalan",
|
||||
"diagnosa": "Diagnosa",
|
||||
"statusbayar": null,
|
||||
"nomor_lab": "ORDER001",
|
||||
"jenispembayaran": "UMM",
|
||||
"klinisi": "Dokter Peminta",
|
||||
"jenispemeriksaan": "Jenis Pemeriksaan",
|
||||
"spesimen": "Sputum",
|
||||
"kodespesimen": "SPT",
|
||||
"pengambilan": null,
|
||||
"keteranganrujukan": "RSSA Malang",
|
||||
"namarspengirim": "RSSA Malang",
|
||||
"tanggalregis": "2026-08-01",
|
||||
"tanggalsampel": "2026-08-01",
|
||||
"asalpengirim": null
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 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.
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Symfony\Component\Process\Process;
|
||||
|
||||
class BackupRestoreLatestCommand extends Command
|
||||
{
|
||||
protected $signature = 'backup:restore-latest
|
||||
{--url= : Base URL server cloud backup}
|
||||
{--token= : Token API cloud backup}
|
||||
{--name= : Nama backup}
|
||||
{--output= : Lokasi file download}
|
||||
{--file= : Pakai file backup lokal, tanpa download}
|
||||
{--download-only : Hanya download, tidak restore}
|
||||
{--host= : Host PostgreSQL target}
|
||||
{--port= : Port PostgreSQL target}
|
||||
{--database= : Database PostgreSQL target}
|
||||
{--username= : Username PostgreSQL target}
|
||||
{--password= : Password PostgreSQL target, opsional jika .pgpass sudah ada}
|
||||
{--clean=1 : Jalankan pg_restore --clean}
|
||||
{--if-exists=1 : Jalankan pg_restore --if-exists}
|
||||
{--no-owner=1 : Jalankan pg_restore --no-owner}
|
||||
{--yes : Lewati konfirmasi restore}';
|
||||
|
||||
protected $description = 'Download backup terbaru dari duidev.com dan restore penuh ke PostgreSQL.';
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
$backupName = (string) ($this->option('name') ?: config('cloud_backup.backup_name', 'lismikro'));
|
||||
$file = $this->option('file')
|
||||
? (string) $this->option('file')
|
||||
: $this->downloadLatest($backupName);
|
||||
|
||||
if (!$file || !File::exists($file)) {
|
||||
$this->error('File backup tidak ditemukan.');
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
$this->info('File backup siap: ' . $file);
|
||||
|
||||
if ($this->option('download-only')) {
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
$host = (string) ($this->option('host') ?: config('cloud_backup.db_host'));
|
||||
$port = (string) ($this->option('port') ?: config('cloud_backup.db_port'));
|
||||
$database = (string) ($this->option('database') ?: config('cloud_backup.db_database'));
|
||||
$username = (string) ($this->option('username') ?: config('cloud_backup.db_username'));
|
||||
|
||||
if (!$this->option('yes') && !$this->confirm("Restore penuh ke database {$database} di {$host}:{$port}?", false)) {
|
||||
$this->warn('Restore dibatalkan.');
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
$command = [
|
||||
(string) config('cloud_backup.pg_restore', 'pg_restore'),
|
||||
'-h', $host,
|
||||
'-p', $port,
|
||||
'-U', $username,
|
||||
'-d', $database,
|
||||
'-v',
|
||||
];
|
||||
|
||||
if ((int) $this->option('clean') === 1) {
|
||||
$command[] = '--clean';
|
||||
}
|
||||
|
||||
if ((int) $this->option('if-exists') === 1) {
|
||||
$command[] = '--if-exists';
|
||||
}
|
||||
|
||||
if ((int) $this->option('no-owner') === 1) {
|
||||
$command[] = '--no-owner';
|
||||
}
|
||||
|
||||
$command[] = $file;
|
||||
|
||||
$env = null;
|
||||
$password = (string) ($this->option('password') ?: config('cloud_backup.db_password'));
|
||||
if ($password !== '') {
|
||||
$env = ['PGPASSWORD' => $password];
|
||||
}
|
||||
|
||||
$process = new Process($command, base_path(), $env, null, null);
|
||||
$process->setTimeout(null);
|
||||
|
||||
$this->info('Menjalankan pg_restore...');
|
||||
$process->run(function (string $type, string $buffer): void {
|
||||
$this->output->write($buffer);
|
||||
});
|
||||
|
||||
if (!$process->isSuccessful()) {
|
||||
$this->error('Restore gagal dengan kode: ' . $process->getExitCode());
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
$this->info('Restore selesai.');
|
||||
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
private function downloadLatest(string $backupName): ?string
|
||||
{
|
||||
$baseUrl = rtrim((string) ($this->option('url') ?: config('cloud_backup.api_url')), '/');
|
||||
$token = (string) ($this->option('token') ?: config('cloud_backup.api_token'));
|
||||
|
||||
if ($baseUrl === '' || $token === '') {
|
||||
$this->error('CLOUD_BACKUP_API_URL dan CLOUD_BACKUP_API_TOKEN wajib diisi.');
|
||||
return null;
|
||||
}
|
||||
|
||||
$output = $this->option('output')
|
||||
? (string) $this->option('output')
|
||||
: (string) config('cloud_backup.download_path');
|
||||
|
||||
File::ensureDirectoryExists(dirname($output), 0750, true);
|
||||
|
||||
$metadata = Http::withToken($token)
|
||||
->timeout(60)
|
||||
->get($baseUrl . '/api/backups/latest', ['backup_name' => $backupName]);
|
||||
|
||||
if (!$metadata->successful()) {
|
||||
$this->error('Gagal membaca metadata backup terbaru. HTTP ' . $metadata->status());
|
||||
$this->line($metadata->body());
|
||||
return null;
|
||||
}
|
||||
|
||||
$info = $metadata->json();
|
||||
$this->info('Backup terbaru: ' . ($info['file'] ?? '-'));
|
||||
|
||||
$download = Http::withToken($token)
|
||||
->timeout(0)
|
||||
->sink($output)
|
||||
->get($baseUrl . '/api/backups/latest/download', ['backup_name' => $backupName]);
|
||||
|
||||
if (!$download->successful()) {
|
||||
File::delete($output);
|
||||
$this->error('Gagal download backup. HTTP ' . $download->status());
|
||||
$this->line($download->body());
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!empty($info['sha256']) && hash_file('sha256', $output) !== strtolower((string) $info['sha256'])) {
|
||||
File::delete($output);
|
||||
$this->error('Checksum file download tidak sesuai.');
|
||||
return null;
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class BackupUploadFileCommand extends Command
|
||||
{
|
||||
protected $signature = 'backup:upload-file
|
||||
{file : Path file .backup yang akan dikirim}
|
||||
{--url= : Base URL server cloud backup}
|
||||
{--token= : Token API cloud backup}
|
||||
{--name= : Nama backup}
|
||||
{--chunk-size= : Ukuran chunk dalam byte}';
|
||||
|
||||
protected $description = 'Upload file backup ke duidev.com secara bertahap/chunked.';
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
$file = (string) $this->argument('file');
|
||||
if (!is_file($file) || !is_readable($file)) {
|
||||
$this->error('File backup tidak ditemukan atau tidak bisa dibaca: ' . $file);
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
$baseUrl = rtrim((string) ($this->option('url') ?: config('cloud_backup.api_url')), '/');
|
||||
$token = (string) ($this->option('token') ?: config('cloud_backup.api_token'));
|
||||
$backupName = (string) ($this->option('name') ?: config('cloud_backup.backup_name', 'lismikro'));
|
||||
$chunkSize = (int) ($this->option('chunk-size') ?: config('cloud_backup.chunk_size', 5 * 1024 * 1024));
|
||||
|
||||
if ($baseUrl === '' || $token === '') {
|
||||
$this->error('CLOUD_BACKUP_API_URL dan CLOUD_BACKUP_API_TOKEN wajib diisi.');
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
if ($chunkSize < 1024 * 1024) {
|
||||
$this->error('Chunk size minimal 1 MB.');
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
$size = filesize($file);
|
||||
$checksum = hash_file('sha256', $file);
|
||||
$totalChunks = (int) ceil($size / $chunkSize);
|
||||
$uploadId = now()->format('YmdHis') . '_' . Str::random(16);
|
||||
$endpoint = $baseUrl . '/api/backups/chunk';
|
||||
|
||||
$this->info('Upload backup: ' . basename($file));
|
||||
$this->info('Total chunk: ' . $totalChunks);
|
||||
|
||||
$handle = fopen($file, 'rb');
|
||||
if (!$handle) {
|
||||
$this->error('Gagal membuka file backup.');
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
try {
|
||||
for ($index = 0; $index < $totalChunks; $index++) {
|
||||
$chunk = fread($handle, $chunkSize);
|
||||
if ($chunk === false) {
|
||||
$this->error('Gagal membaca chunk ke-' . $index);
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
$response = Http::withToken($token)
|
||||
->timeout(300)
|
||||
->attach('chunk', $chunk, 'chunk_' . $index . '.part')
|
||||
->post($endpoint, [
|
||||
'backup_name' => $backupName,
|
||||
'upload_id' => $uploadId,
|
||||
'filename' => basename($file),
|
||||
'chunk_index' => $index,
|
||||
'total_chunks' => $totalChunks,
|
||||
'total_size' => $size,
|
||||
'checksum' => $checksum,
|
||||
]);
|
||||
|
||||
if (!$response->successful()) {
|
||||
$this->error('Upload chunk ke-' . $index . ' gagal. HTTP ' . $response->status());
|
||||
$this->line($response->body());
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
$this->line('Chunk ' . ($index + 1) . '/' . $totalChunks . ' terkirim.');
|
||||
}
|
||||
} finally {
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
$this->info('Upload backup selesai.');
|
||||
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -459,7 +459,7 @@ class DokterController extends Controller
|
||||
$dlp = $request->input('val10');
|
||||
$idperiksa = $request->input('periksa_id');
|
||||
$nofoto = $request->input('acc_number');
|
||||
$addendumketerangan = $request->input('addendumketerangan');
|
||||
$addendumketerangan = $request->input('addendumketerangan') ?? '';
|
||||
if ($kerja == 'Draft'){
|
||||
$iddokter = Session('id');
|
||||
}
|
||||
@@ -468,310 +468,314 @@ class DokterController extends Controller
|
||||
$nm_spesimen = $periksa->nm_spesimen ?? '';
|
||||
$noregister = $periksa->noregister ?? '';
|
||||
$nmadendum = $periksa->nmadendum ?? '';
|
||||
$tglverifikasi = $periksa->verifikasi ?? $today;
|
||||
|
||||
$cekganda = Periksa::where('noregister', $noregister)->where('nmadendum', $nmadendum)->where('id', '!=', $idperiksa)->get();
|
||||
$statusdraft = 'Pemeriksaan awal';
|
||||
KomponenJawaban::where('accnumber', $nofoto)->where('template', $dlp)->delete();
|
||||
$data = $request->except(['_token', 'periksa_id', 'val01', 'val10', 'acc_number']);
|
||||
foreach ($data as $key => $value) {
|
||||
if ($value === "" || is_null($value) || $value === "Pilih Salah Satu") continue;
|
||||
$isidataawal = null;
|
||||
if (is_array($value)) {
|
||||
$isidataawal = json_encode($value);
|
||||
} else {
|
||||
if ($key == 'id_statusmediatamlainnya' AND $value != ''){
|
||||
$statusdraft = $value;
|
||||
} else if ($key == 'id_statusmediasellainnya' AND $value != ''){
|
||||
$statusdraft = $value;
|
||||
} else if ($key == 'id_statusmediasda' AND $value != ''){
|
||||
$statusdraft = $value;
|
||||
} else if ($key == 'id_statusmediamcconkey' AND $value != ''){
|
||||
$statusdraft = $value;
|
||||
} else if ($key == 'id_statusmediacap' AND $value != ''){
|
||||
$statusdraft = $value;
|
||||
} else if ($key == 'id_statusmediabap' AND $value != ''){
|
||||
$statusdraft = $value;
|
||||
$statuslama = $periksa->status ?? '';
|
||||
if ($statuslama == 'Selesai' AND $addendumketerangan == ''){
|
||||
return response()->json(['icon' => 'error', 'status' => 'Gagal', 'message' => 'Pemeriksaan sudah selesai, silahkan buat adendum untuk menambahkan keterangan']);
|
||||
} else {
|
||||
$tglverifikasi = $periksa->verifikasi ?? $today;
|
||||
$cekganda = Periksa::where('noregister', $noregister)->where('nmadendum', $nmadendum)->where('id', '!=', $idperiksa)->get();
|
||||
$statusdraft = 'Pemeriksaan awal';
|
||||
KomponenJawaban::where('accnumber', $nofoto)->where('template', $dlp)->delete();
|
||||
$data = $request->except(['_token', 'periksa_id', 'val01', 'val10', 'acc_number']);
|
||||
foreach ($data as $key => $value) {
|
||||
if ($value === "" || is_null($value) || $value === "Pilih Salah Satu") continue;
|
||||
$isidataawal = null;
|
||||
if (is_array($value)) {
|
||||
$isidataawal = json_encode($value);
|
||||
} else {
|
||||
}
|
||||
$isidataawal = $value;
|
||||
}
|
||||
KomponenJawaban::updateOrCreate(
|
||||
[
|
||||
'accnumber' => $nofoto,
|
||||
'komponen' => $key,
|
||||
],
|
||||
[
|
||||
'isidata' => $isidataawal,
|
||||
'template' => $dlp,
|
||||
'created_by' => session('nama'),
|
||||
]
|
||||
);
|
||||
$yangperludicloning = '';
|
||||
if ($key == 'id_selepitel'){ $yangperludicloning = 'lsg_selepitel'; }
|
||||
if ($key == 'id_selradang'){ $yangperludicloning = 'lsg_selradang'; }
|
||||
if ($key == 'id_mikroorganisme'){ $yangperludicloning = 'lsg_mikroorganisme'; }
|
||||
if ($key == 'id_mikroorganismeoptional'){ $yangperludicloning = 'lsg_mikroorganismeoptional'; }
|
||||
if ($key == 'id_pewarnaanziehlnielsen'){ $yangperludicloning = 'lsg_pewarnaanziehlnielsen'; }
|
||||
if ($key == 'id_pewarnaanziehlnielsensewaktu'){ $yangperludicloning = 'lsg_pewarnaanziehlnielsensewaktu'; }
|
||||
if ($key == 'id_pewarnaankoh'){ $yangperludicloning = 'lsg_pewarnaankoh'; }
|
||||
if ($key == 'id_pewarnaankohoptional'){ $yangperludicloning = 'lsg_pewarnaankohoptional'; }
|
||||
if ($key == 'id_pewarnaanneisser'){ $yangperludicloning = 'lsg_pewarnaanneisser'; }
|
||||
if ($key == 'id_pewarnaannegatif'){ $yangperludicloning = 'lsg_pewarnaannegatif'; }
|
||||
if ($key == 'id_pewarnaanspora'){ $yangperludicloning = 'lsg_pewarnaanspora'; }
|
||||
if ($key == 'id_pewarnaangiesma'){ $yangperludicloning = 'lsg_pewarnaangiesma'; }
|
||||
if ($key == 'id_pewarnaangiesmaoptional'){ $yangperludicloning = 'lsg_pewarnaangiesmaoptional'; }
|
||||
if ($key == 'lsg_selepitel'){ $yangperludicloning = 'id_selepitel'; }
|
||||
if ($key == 'lsg_selradang'){ $yangperludicloning = 'id_selradang'; }
|
||||
if ($key == 'lsg_mikroorganisme'){ $yangperludicloning = 'id_mikroorganisme'; }
|
||||
if ($key == 'lsg_mikroorganismeoptional'){ $yangperludicloning = 'id_mikroorganismeoptional'; }
|
||||
if ($key == 'lsg_pewarnaanziehlnielsen'){ $yangperludicloning = 'id_pewarnaanziehlnielsen'; }
|
||||
if ($key == 'lsg_pewarnaanziehlnielsensewaktu'){ $yangperludicloning = 'id_pewarnaanziehlnielsensewaktu'; }
|
||||
if ($key == 'lsg_pewarnaankoh'){ $yangperludicloning = 'id_pewarnaankoh'; }
|
||||
if ($key == 'lsg_pewarnaankohoptional'){ $yangperludicloning = 'id_pewarnaankohoptional'; }
|
||||
if ($key == 'lsg_pewarnaanneisser'){ $yangperludicloning = 'id_pewarnaanneisser'; }
|
||||
if ($key == 'lsg_pewarnaannegatif'){ $yangperludicloning = 'id_pewarnaannegatif'; }
|
||||
if ($key == 'lsg_pewarnaanspora'){ $yangperludicloning = 'id_pewarnaanspora'; }
|
||||
if ($key == 'lsg_pewarnaangiesma'){ $yangperludicloning = 'id_pewarnaangiesma'; }
|
||||
if ($key == 'lsg_pewarnaangiesmaoptional'){ $yangperludicloning = 'id_pewarnaangiesmaoptional'; }
|
||||
|
||||
if (!empty($cekganda) AND $yangperludicloning != ''){
|
||||
foreach($cekganda as $rcloning){
|
||||
$nofotocloning = $rcloning->nofoto;
|
||||
$dlpcloning = $rcloning->dlp ?? 'Kultur';
|
||||
$cekada = KomponenJawaban::where('accnumber', $nofotocloning)->where('komponen', $yangperludicloning)->first();
|
||||
if ($cekada){
|
||||
|
||||
if ($key == 'id_statusmediatamlainnya' AND $value != ''){
|
||||
$statusdraft = $value;
|
||||
} else if ($key == 'id_statusmediasellainnya' AND $value != ''){
|
||||
$statusdraft = $value;
|
||||
} else if ($key == 'id_statusmediasda' AND $value != ''){
|
||||
$statusdraft = $value;
|
||||
} else if ($key == 'id_statusmediamcconkey' AND $value != ''){
|
||||
$statusdraft = $value;
|
||||
} else if ($key == 'id_statusmediacap' AND $value != ''){
|
||||
$statusdraft = $value;
|
||||
} else if ($key == 'id_statusmediabap' AND $value != ''){
|
||||
$statusdraft = $value;
|
||||
} else {
|
||||
KomponenJawaban::updateOrCreate(
|
||||
[
|
||||
'accnumber' => $nofotocloning,
|
||||
'komponen' => $yangperludicloning,
|
||||
],
|
||||
[
|
||||
'isidata' => $isidataawal,
|
||||
'template' => $dlpcloning,
|
||||
'created_by' => session('nama'),
|
||||
]
|
||||
);
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofotocloning,
|
||||
'jawaban' => $isidataawal,
|
||||
'inputor' => Session('nama'),
|
||||
'keterangan' => 'Clone Data '.$yangperludicloning.' Dari ('.$nofoto.')',
|
||||
'verifikasi' => '',
|
||||
]);
|
||||
}
|
||||
$isidataawal = $value;
|
||||
}
|
||||
KomponenJawaban::updateOrCreate(
|
||||
[
|
||||
'accnumber' => $nofoto,
|
||||
'komponen' => $key,
|
||||
],
|
||||
[
|
||||
'isidata' => $isidataawal,
|
||||
'template' => $dlp,
|
||||
'created_by' => session('nama'),
|
||||
]
|
||||
);
|
||||
$yangperludicloning = '';
|
||||
if ($key == 'id_selepitel'){ $yangperludicloning = 'lsg_selepitel'; }
|
||||
if ($key == 'id_selradang'){ $yangperludicloning = 'lsg_selradang'; }
|
||||
if ($key == 'id_mikroorganisme'){ $yangperludicloning = 'lsg_mikroorganisme'; }
|
||||
if ($key == 'id_mikroorganismeoptional'){ $yangperludicloning = 'lsg_mikroorganismeoptional'; }
|
||||
if ($key == 'id_pewarnaanziehlnielsen'){ $yangperludicloning = 'lsg_pewarnaanziehlnielsen'; }
|
||||
if ($key == 'id_pewarnaanziehlnielsensewaktu'){ $yangperludicloning = 'lsg_pewarnaanziehlnielsensewaktu'; }
|
||||
if ($key == 'id_pewarnaankoh'){ $yangperludicloning = 'lsg_pewarnaankoh'; }
|
||||
if ($key == 'id_pewarnaankohoptional'){ $yangperludicloning = 'lsg_pewarnaankohoptional'; }
|
||||
if ($key == 'id_pewarnaanneisser'){ $yangperludicloning = 'lsg_pewarnaanneisser'; }
|
||||
if ($key == 'id_pewarnaannegatif'){ $yangperludicloning = 'lsg_pewarnaannegatif'; }
|
||||
if ($key == 'id_pewarnaanspora'){ $yangperludicloning = 'lsg_pewarnaanspora'; }
|
||||
if ($key == 'id_pewarnaangiesma'){ $yangperludicloning = 'lsg_pewarnaangiesma'; }
|
||||
if ($key == 'id_pewarnaangiesmaoptional'){ $yangperludicloning = 'lsg_pewarnaangiesmaoptional'; }
|
||||
if ($key == 'lsg_selepitel'){ $yangperludicloning = 'id_selepitel'; }
|
||||
if ($key == 'lsg_selradang'){ $yangperludicloning = 'id_selradang'; }
|
||||
if ($key == 'lsg_mikroorganisme'){ $yangperludicloning = 'id_mikroorganisme'; }
|
||||
if ($key == 'lsg_mikroorganismeoptional'){ $yangperludicloning = 'id_mikroorganismeoptional'; }
|
||||
if ($key == 'lsg_pewarnaanziehlnielsen'){ $yangperludicloning = 'id_pewarnaanziehlnielsen'; }
|
||||
if ($key == 'lsg_pewarnaanziehlnielsensewaktu'){ $yangperludicloning = 'id_pewarnaanziehlnielsensewaktu'; }
|
||||
if ($key == 'lsg_pewarnaankoh'){ $yangperludicloning = 'id_pewarnaankoh'; }
|
||||
if ($key == 'lsg_pewarnaankohoptional'){ $yangperludicloning = 'id_pewarnaankohoptional'; }
|
||||
if ($key == 'lsg_pewarnaanneisser'){ $yangperludicloning = 'id_pewarnaanneisser'; }
|
||||
if ($key == 'lsg_pewarnaannegatif'){ $yangperludicloning = 'id_pewarnaannegatif'; }
|
||||
if ($key == 'lsg_pewarnaanspora'){ $yangperludicloning = 'id_pewarnaanspora'; }
|
||||
if ($key == 'lsg_pewarnaangiesma'){ $yangperludicloning = 'id_pewarnaangiesma'; }
|
||||
if ($key == 'lsg_pewarnaangiesmaoptional'){ $yangperludicloning = 'id_pewarnaangiesmaoptional'; }
|
||||
|
||||
if (!empty($cekganda) AND $yangperludicloning != ''){
|
||||
foreach($cekganda as $rcloning){
|
||||
$nofotocloning = $rcloning->nofoto;
|
||||
$dlpcloning = $rcloning->dlp ?? 'Kultur';
|
||||
$cekada = KomponenJawaban::where('accnumber', $nofotocloning)->where('komponen', $yangperludicloning)->first();
|
||||
if ($cekada){
|
||||
|
||||
} else {
|
||||
KomponenJawaban::updateOrCreate(
|
||||
[
|
||||
'accnumber' => $nofotocloning,
|
||||
'komponen' => $yangperludicloning,
|
||||
],
|
||||
[
|
||||
'isidata' => $isidataawal,
|
||||
'template' => $dlpcloning,
|
||||
'created_by' => session('nama'),
|
||||
]
|
||||
);
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofotocloning,
|
||||
'jawaban' => $isidataawal,
|
||||
'inputor' => Session('nama'),
|
||||
'keterangan' => 'Clone Data '.$yangperludicloning.' Dari ('.$nofoto.')',
|
||||
'verifikasi' => '',
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$analis = $request->input('analis');
|
||||
$ppds3 = $request->input('ppds3');
|
||||
$cekdokter = optional(User::find($iddokter));
|
||||
$cekanalis = optional(User::find($analis));
|
||||
$cekppds3 = optional(User::find($ppds3));
|
||||
$statusdraft = $this->resolvePeriksaHierarchyStatus($periksa->status, $statusdraft);
|
||||
switch ($kerja) {
|
||||
case 'verifikasi':
|
||||
if ($periksa->status != 'Selesai'){
|
||||
$tglverifikasi = date('Y-m-d H:i:s');
|
||||
}
|
||||
$updateData = [
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'dokter_id' => Session('id'),
|
||||
'nmdokter' => Session('nama'),
|
||||
'ppdssenior' => $ppds3,
|
||||
'nmppdssenior' => $cekppds3->nama ?? null,
|
||||
'tandatangan' => '',
|
||||
'verifikasi' => $tglverifikasi,
|
||||
'akhir' => $tglverifikasi,
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'status' => 'Selesai',
|
||||
];
|
||||
$periksa->update($updateData);
|
||||
if ($this->shouldMarkAsCritical($request)) {
|
||||
$this->upsertCriticalValueSample($periksa);
|
||||
}
|
||||
$surat = self::genSurat($periksa->id, 'dengan kop');
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofoto,
|
||||
'jawaban' => $surat,
|
||||
'inputor' => Session('nama'),
|
||||
'verifikasi' => 'Accepted',
|
||||
'keterangan' => 'Expertise',
|
||||
]);
|
||||
if (isset($addendumketerangan) AND $addendumketerangan != ''){
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofoto,
|
||||
'jawaban' => $addendumketerangan,
|
||||
'inputor' => Session('nama'),
|
||||
'verifikasi' => 'Accepted',
|
||||
'keterangan' => 'Addendum',
|
||||
]);
|
||||
}
|
||||
if (is_null($nofoto)){
|
||||
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Sukses', 'message' => 'Expertise Verified']);
|
||||
} else {
|
||||
$pesan = 'Expertise Saved';
|
||||
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Sukses', 'message' => $pesan]);
|
||||
}
|
||||
case 'statuspewarnaanlsg':
|
||||
$periksa->update([
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'nmdrafter' => Session('nama'),
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'status' => $this->resolvePeriksaHierarchyStatus($periksa->status, 'Pewarnaan Langsung'),
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'status' => 'Success', 'message' => 'Set Status Pewarnaan Langsung']);
|
||||
case 'preliminary':
|
||||
$updateData = [
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'dokter_id' => Session('id'),
|
||||
'nmdokter' => Session('nama'),
|
||||
'ppdssenior' => $ppds3,
|
||||
'nmppdssenior' => $cekppds3->nama ?? null,
|
||||
'tandatangan' => '',
|
||||
'verifikasi' => $tglverifikasi,
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'status' => $this->resolvePeriksaHierarchyStatus($periksa->status, 'Preliminary Results'),
|
||||
];
|
||||
$periksa->update($updateData);
|
||||
if ($this->shouldMarkAsCritical($request)) {
|
||||
$this->upsertCriticalValueSample($periksa);
|
||||
}
|
||||
$surat = self::genSurat($periksa->id, 'dengan kop');
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofoto,
|
||||
'jawaban' => $surat,
|
||||
'inputor' => Session('nama'),
|
||||
'verifikasi' => 'Accepted',
|
||||
'keterangan' => 'Preliminary Results',
|
||||
]);
|
||||
$pesan = 'Preliminary Results Saved';
|
||||
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Sukses', 'message' => $pesan]);
|
||||
case 'Permohonan Verifikasi':
|
||||
$updateData = [
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'dokter_id' => $iddokter,
|
||||
'nmdokter' => $cekdokter->nama ?? null,
|
||||
'ppdssenior' => $ppds3,
|
||||
'nmppdssenior' => $cekppds3->nama ?? null,
|
||||
'tandatangan' => '',
|
||||
'baca' => $today,
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'nmpembaca' => Session('nama'),
|
||||
'status' => $this->resolvePeriksaHierarchyStatus($periksa->status, 'Expertise Saved (Un Verified)'),
|
||||
];
|
||||
$periksa->update($updateData);
|
||||
$surat = self::genSurat($periksa->id, 'dengan kop');
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofoto,
|
||||
'jawaban' => $surat,
|
||||
'inputor' => Session('nama'),
|
||||
'verifikasi' => 'Accepted',
|
||||
'keterangan' => 'Kirim ke SPV',
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Sukses', 'message' => 'Permohonan Verifikasi Terkirim']);
|
||||
case 'Permohonan Verifikasi Preliminary':
|
||||
$updateData = [
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'dokter_id' => $iddokter,
|
||||
'nmdokter' => $cekdokter->nama ?? null,
|
||||
'ppdssenior' => $ppds3,
|
||||
'nmppdssenior' => $cekppds3->nama ?? null,
|
||||
'tandatangan' => '',
|
||||
'baca' => $today,
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'nmpembaca' => Session('nama'),
|
||||
'status' => $this->resolvePeriksaHierarchyStatus($periksa->status, 'Otor Maldi (Un Verified)'),
|
||||
];
|
||||
$periksa->update($updateData);
|
||||
$surat = self::genSurat($periksa->id, 'dengan kop');
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofoto,
|
||||
'jawaban' => $surat,
|
||||
'inputor' => Session('nama'),
|
||||
'verifikasi' => 'Accepted',
|
||||
'keterangan' => 'Kirim Preliminary ke SPV',
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Sukses', 'message' => 'Permohonan Verifikasi Preliminary Terkirim']);
|
||||
case 'tolakadendum':
|
||||
Riwayat::where('nofoto', $nofoto)->whereNull('verifikasi')->update([
|
||||
'verifikasi' => 'Declined',
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'status' => 'Success', 'message' => 'Addendum Declined']);
|
||||
case 'Draft':
|
||||
$periksa->update([
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'nmdrafter' => Session('nama'),
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'status' => $statusdraft
|
||||
]);
|
||||
$surat = self::genSurat($periksa->id, 'dengan kop');
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofoto,
|
||||
'jawaban' => $surat,
|
||||
'inputor' => Session('nama'),
|
||||
'verifikasi' => '',
|
||||
'keterangan' => 'Draft',
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'status' => 'Success', 'message' => 'Draft Expertise Saved']);
|
||||
case 'terimadendum':
|
||||
$getid = Riwayat::where('keterangan', 'Adendum')->where('nofoto', $nofoto)->whereNull('verifikasi')->first();
|
||||
if (isset($getid->id)){
|
||||
Riwayat::where('id', $getid->id)->update([
|
||||
'verifikasi' => 'Accepted',
|
||||
]);
|
||||
Periksa::where('nofoto', $getid->nofoto)->update([
|
||||
$analis = $request->input('analis');
|
||||
$ppds3 = $request->input('ppds3');
|
||||
$cekdokter = optional(User::find($iddokter));
|
||||
$cekanalis = optional(User::find($analis));
|
||||
$cekppds3 = optional(User::find($ppds3));
|
||||
$statusdraft = $this->resolvePeriksaHierarchyStatus($periksa->status, $statusdraft);
|
||||
switch ($kerja) {
|
||||
case 'verifikasi':
|
||||
if ($periksa->status != 'Selesai'){
|
||||
$tglverifikasi = date('Y-m-d H:i:s');
|
||||
}
|
||||
$updateData = [
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'dokter_id' => Session('id'),
|
||||
'nmdokter' => Session('nama'),
|
||||
'ppdssenior' => $ppds3,
|
||||
'nmppdssenior' => $cekppds3->nama ?? null,
|
||||
'tandatangan' => '',
|
||||
'verifikasi' => $tglverifikasi,
|
||||
'akhir' => $tglverifikasi,
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'tgladendum' => now(),
|
||||
'keterangan' => $getid->jawaban
|
||||
'status' => 'Selesai',
|
||||
];
|
||||
$periksa->update($updateData);
|
||||
if ($this->shouldMarkAsCritical($request)) {
|
||||
$this->upsertCriticalValueSample($periksa);
|
||||
}
|
||||
$surat = self::genSurat($periksa->id, 'dengan kop');
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofoto,
|
||||
'jawaban' => $surat,
|
||||
'inputor' => Session('nama'),
|
||||
'verifikasi' => 'Accepted',
|
||||
'keterangan' => 'Expertise',
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'status' => 'Success', 'message' => 'Addendum Accepted']);
|
||||
} else {
|
||||
return response()->json(['icon' => 'error', 'status' => 'Gagal', 'message' => 'Addendum Data Cannot Be Found']);
|
||||
}
|
||||
default:
|
||||
$periksa->update([
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'dokter_id' => $iddokter,
|
||||
'nmdokter' => $cekdokter->nama ?? null,
|
||||
'ppdssenior' => $ppds3,
|
||||
'nmppdssenior' => $cekppds3->nama ?? null,
|
||||
'nmdrafter' => Session('nama'),
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'status' => $statusdraft
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'status' => 'Success', 'message' => 'Expertise Saved']);
|
||||
if (isset($addendumketerangan) AND $addendumketerangan != ''){
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofoto,
|
||||
'jawaban' => $addendumketerangan,
|
||||
'inputor' => Session('nama'),
|
||||
'verifikasi' => 'Accepted',
|
||||
'keterangan' => 'Addendum',
|
||||
]);
|
||||
}
|
||||
if (is_null($nofoto)){
|
||||
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Sukses', 'message' => 'Expertise Verified']);
|
||||
} else {
|
||||
$pesan = 'Expertise Saved';
|
||||
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Sukses', 'message' => $pesan]);
|
||||
}
|
||||
case 'statuspewarnaanlsg':
|
||||
$periksa->update([
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'nmdrafter' => Session('nama'),
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'status' => $this->resolvePeriksaHierarchyStatus($periksa->status, 'Pewarnaan Langsung'),
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'status' => 'Success', 'message' => 'Set Status Pewarnaan Langsung']);
|
||||
case 'preliminary':
|
||||
$updateData = [
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'dokter_id' => Session('id'),
|
||||
'nmdokter' => Session('nama'),
|
||||
'ppdssenior' => $ppds3,
|
||||
'nmppdssenior' => $cekppds3->nama ?? null,
|
||||
'tandatangan' => '',
|
||||
'verifikasi' => $tglverifikasi,
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'status' => $this->resolvePeriksaHierarchyStatus($periksa->status, 'Preliminary Results'),
|
||||
];
|
||||
$periksa->update($updateData);
|
||||
if ($this->shouldMarkAsCritical($request)) {
|
||||
$this->upsertCriticalValueSample($periksa);
|
||||
}
|
||||
$surat = self::genSurat($periksa->id, 'dengan kop');
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofoto,
|
||||
'jawaban' => $surat,
|
||||
'inputor' => Session('nama'),
|
||||
'verifikasi' => 'Accepted',
|
||||
'keterangan' => 'Preliminary Results',
|
||||
]);
|
||||
$pesan = 'Preliminary Results Saved';
|
||||
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Sukses', 'message' => $pesan]);
|
||||
case 'Permohonan Verifikasi':
|
||||
$updateData = [
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'dokter_id' => $iddokter,
|
||||
'nmdokter' => $cekdokter->nama ?? null,
|
||||
'ppdssenior' => $ppds3,
|
||||
'nmppdssenior' => $cekppds3->nama ?? null,
|
||||
'tandatangan' => '',
|
||||
'baca' => $today,
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'nmpembaca' => Session('nama'),
|
||||
'status' => $this->resolvePeriksaHierarchyStatus($periksa->status, 'Expertise Saved (Un Verified)'),
|
||||
];
|
||||
$periksa->update($updateData);
|
||||
$surat = self::genSurat($periksa->id, 'dengan kop');
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofoto,
|
||||
'jawaban' => $surat,
|
||||
'inputor' => Session('nama'),
|
||||
'verifikasi' => 'Accepted',
|
||||
'keterangan' => 'Kirim ke SPV',
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Sukses', 'message' => 'Permohonan Verifikasi Terkirim']);
|
||||
case 'Permohonan Verifikasi Preliminary':
|
||||
$updateData = [
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'dokter_id' => $iddokter,
|
||||
'nmdokter' => $cekdokter->nama ?? null,
|
||||
'ppdssenior' => $ppds3,
|
||||
'nmppdssenior' => $cekppds3->nama ?? null,
|
||||
'tandatangan' => '',
|
||||
'baca' => $today,
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'nmpembaca' => Session('nama'),
|
||||
'status' => $this->resolvePeriksaHierarchyStatus($periksa->status, 'Otor Maldi (Un Verified)'),
|
||||
];
|
||||
$periksa->update($updateData);
|
||||
$surat = self::genSurat($periksa->id, 'dengan kop');
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofoto,
|
||||
'jawaban' => $surat,
|
||||
'inputor' => Session('nama'),
|
||||
'verifikasi' => 'Accepted',
|
||||
'keterangan' => 'Kirim Preliminary ke SPV',
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Sukses', 'message' => 'Permohonan Verifikasi Preliminary Terkirim']);
|
||||
case 'tolakadendum':
|
||||
Riwayat::where('nofoto', $nofoto)->whereNull('verifikasi')->update([
|
||||
'verifikasi' => 'Declined',
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'status' => 'Success', 'message' => 'Addendum Declined']);
|
||||
case 'Draft':
|
||||
$periksa->update([
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'nmdrafter' => Session('nama'),
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'status' => $statusdraft
|
||||
]);
|
||||
$surat = self::genSurat($periksa->id, 'dengan kop');
|
||||
Riwayat::create([
|
||||
'nofoto' => $nofoto,
|
||||
'jawaban' => $surat,
|
||||
'inputor' => Session('nama'),
|
||||
'verifikasi' => '',
|
||||
'keterangan' => 'Draft',
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'status' => 'Success', 'message' => 'Draft Expertise Saved']);
|
||||
case 'terimadendum':
|
||||
$getid = Riwayat::where('keterangan', 'Adendum')->where('nofoto', $nofoto)->whereNull('verifikasi')->first();
|
||||
if (isset($getid->id)){
|
||||
Riwayat::where('id', $getid->id)->update([
|
||||
'verifikasi' => 'Accepted',
|
||||
]);
|
||||
Periksa::where('nofoto', $getid->nofoto)->update([
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'tgladendum' => now(),
|
||||
'keterangan' => $getid->jawaban
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'status' => 'Success', 'message' => 'Addendum Accepted']);
|
||||
} else {
|
||||
return response()->json(['icon' => 'error', 'status' => 'Gagal', 'message' => 'Addendum Data Cannot Be Found']);
|
||||
}
|
||||
default:
|
||||
$periksa->update([
|
||||
'keterangan' => $keterangan,
|
||||
'dlp' => $dlp,
|
||||
'analis' => $analis,
|
||||
'nmanalis' => $cekanalis->nama ?? null,
|
||||
'dokter_id' => $iddokter,
|
||||
'nmdokter' => $cekdokter->nama ?? null,
|
||||
'ppdssenior' => $ppds3,
|
||||
'nmppdssenior' => $cekppds3->nama ?? null,
|
||||
'nmdrafter' => Session('nama'),
|
||||
'nmexcutor' => Session('nama'),
|
||||
'excutor' => Session('id'),
|
||||
'status' => $statusdraft
|
||||
]);
|
||||
return response()->json(['icon' => 'success', 'status' => 'Success', 'message' => 'Expertise Saved']);
|
||||
}
|
||||
}
|
||||
}
|
||||
protected function resolvePeriksaHierarchyStatus($currentStatus, $proposedStatus): string {
|
||||
@@ -3891,7 +3895,7 @@ class DokterController extends Controller
|
||||
$data[] = array(
|
||||
'nofoto' => $rows->nofoto,
|
||||
'nolab' => $rows->orderid,
|
||||
'norm' => $rows->norm,
|
||||
'norm' => $rows->noregister,
|
||||
'jenispemeriksaan' => $rows->reques,
|
||||
'mulai' => $rows->daftar,
|
||||
'selesai' => $rows->verifikasi,
|
||||
|
||||
@@ -1122,7 +1122,7 @@ class FrontpageController extends Controller
|
||||
$nik = $request->input('nik') ?? 0;
|
||||
$bpjs = $request->input('bpjs') ?? 0;
|
||||
$tlsasal = $request->input('asalpasien');
|
||||
$nmrs = $request->input('namarspengirim') ?? 'RSSA Malang';
|
||||
$nmrs = $request->input('namarspengirim') ?? $request->input('keteranganrujukan') ?? 'RSSA Malang';
|
||||
$klinisi = $request->input('drpeminta');
|
||||
$insurance = $request->input('asuransi') ?? 'UMM';
|
||||
$rekues = $request->input('layanan');
|
||||
@@ -1340,7 +1340,7 @@ class FrontpageController extends Controller
|
||||
$nm_spesimen = $decodedData['spesimen'] ?? null;
|
||||
$kd_spesimen = $decodedData['kodespesimen'] ?? null;
|
||||
$pengambilan = $decodedData['pengambilan'] ?? null;
|
||||
$nmrs = $decodedData['keteranganrujukan'] ?? 'RSSA Malang';
|
||||
$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;
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'api_url' => env('CLOUD_BACKUP_API_URL', 'https://duidev.com'),
|
||||
'api_token' => env('CLOUD_BACKUP_API_TOKEN'),
|
||||
'backup_name' => env('CLOUD_BACKUP_NAME', 'lismikro'),
|
||||
'chunk_size' => (int) env('CLOUD_BACKUP_CHUNK_SIZE', 5 * 1024 * 1024),
|
||||
'download_path' => env('CLOUD_BACKUP_DOWNLOAD_PATH', storage_path('app/cloud-backups/lismikro_latest.backup')),
|
||||
|
||||
'pg_restore' => env('CLOUD_BACKUP_PG_RESTORE', 'pg_restore'),
|
||||
'db_host' => env('CLOUD_BACKUP_DB_HOST', '10.10.123.193'),
|
||||
'db_port' => env('CLOUD_BACKUP_DB_PORT', '5002'),
|
||||
'db_database' => env('CLOUD_BACKUP_DB_DATABASE', 'lismikro'),
|
||||
'db_username' => env('CLOUD_BACKUP_DB_USERNAME', 'lismikro'),
|
||||
'db_password' => env('CLOUD_BACKUP_DB_PASSWORD'),
|
||||
];
|
||||
Reference in New Issue
Block a user