# 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)

## 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=1048576
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" --retries=10 --retry-delay=15 --timeout=300
    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
```

Jika upload pernah gagal dengan HTTP `524`, gunakan chunk lebih kecil dan retry lebih banyak:

```bash
php artisan backup:upload-file /home/mikro/project/backups/lismikro_YYYY-MM-DD_HH-MM-SS.backup \
  --chunk-size=1048576 \
  --retries=10 \
  --retry-delay=15 \
  --timeout=300
```

### 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
    }
  ]
}
```

### 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.

## Lisensi
Proyek ini dilisensikan di bawah lisensi MIT. Lihat file **LICENSE** untuk informasi lebih lanjut.
