update docker
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
# Database Configuration
|
||||
DB_HOST=host.docker.internal
|
||||
DB_PORT=5432
|
||||
DB_USER=postgres
|
||||
DB_PASSWORD=gakbikinkembung25
|
||||
DB_NAME=careit_db
|
||||
POSTGRES_PASSWORD=gakbikinkembung25
|
||||
|
||||
# Backend Configuration
|
||||
BACKEND_PORT=8081
|
||||
|
||||
# Frontend Configuration
|
||||
FRONTEND_PORT=3000
|
||||
NEXT_PUBLIC_API_URL=http://backend:8081
|
||||
|
||||
# Development
|
||||
NODE_ENV=development
|
||||
Vendored
+3
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"liveServer.settings.port": 5570
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
.git
|
||||
.gitignore
|
||||
*.log
|
||||
.env
|
||||
.env.local
|
||||
README.md
|
||||
DEBUGGING_GUIDE.md
|
||||
INACBG_DEBUGGING_GUIDE.md
|
||||
INACBG_STATUS.md
|
||||
MIGRASI_MYSQL_KE_POSTGRESQL_GUIDE.md
|
||||
FIX_RIWAYAT_BILLING_FIELDS.md
|
||||
ERROR_ANALYSIS_TANGGAL_KELUAR.md
|
||||
BILLING_DPJP_INTEGRATION.md
|
||||
main.c
|
||||
BELAJAR SEK/
|
||||
testingFE/
|
||||
sql/
|
||||
.vscode/
|
||||
.idea/
|
||||
@@ -2,10 +2,12 @@
|
||||
DB_USER=postgres
|
||||
DB_PASSWORD= gakbikinkembung25
|
||||
# DB_HOST=31.97.109.192
|
||||
DB_HOST= localhost
|
||||
DB_HOST=localhost
|
||||
# DB_HOST=postgres
|
||||
DB_PORT=5432
|
||||
DB_NAME=careit_db
|
||||
HOST=0.0.0.0
|
||||
# PORT=8080
|
||||
PORT=8081
|
||||
# PORT=8082
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
# Build stage
|
||||
FROM golang:1.23-alpine AS builder
|
||||
WORKDIR /app
|
||||
COPY go.mod go.sum ./
|
||||
RUN go mod download
|
||||
COPY . .
|
||||
RUN CGO_ENABLED=0 GOOS=linux go build -o main .
|
||||
|
||||
# Runtime stage
|
||||
FROM alpine:latest
|
||||
WORKDIR /app
|
||||
RUN apk add --no-cache ca-certificates
|
||||
COPY --from=builder /app/main .
|
||||
EXPOSE 8081
|
||||
CMD ["./main"]
|
||||
@@ -14,7 +14,7 @@ func KonekPG() (*gorm.DB, error) {
|
||||
if dsn == "" {
|
||||
user := envOrDefaultPG("DB_USER", "postgres")
|
||||
pass := envOrDefaultPG("DB_PASSWORD", "gakbikinkembung25")
|
||||
host := envOrDefaultPG("DB_HOST", "localhost")
|
||||
host := envOrDefaultPG("DB_HOST", "postgres")
|
||||
port := envOrDefaultPG("DB_PORT", "5432")
|
||||
name := envOrDefaultPG("DB_NAME", "careit_db")
|
||||
|
||||
|
||||
@@ -1,154 +0,0 @@
|
||||
# Panduan Testing Billing API
|
||||
|
||||
## 1. Pastikan Server Berjalan
|
||||
|
||||
Jalankan server Go terlebih dahulu:
|
||||
```bash
|
||||
go run main.go
|
||||
```
|
||||
|
||||
Server akan berjalan di: `http://localhost:8081`
|
||||
|
||||
## 2. Testing di Postman
|
||||
|
||||
### Setup Request
|
||||
|
||||
1. **Method:** `POST`
|
||||
2. **URL:** `http://localhost:8081/billing`
|
||||
3. **Headers:**
|
||||
- Key: `Content-Type`
|
||||
- Value: `application/json`
|
||||
|
||||
### Body (Raw JSON)
|
||||
|
||||
Buka tab **Body** → pilih **raw** → pilih **JSON** dari dropdown, lalu paste JSON berikut:
|
||||
|
||||
```json
|
||||
{
|
||||
"nama_dokter": "dr. Hajeng Wulandari, Sp.A, Mbiomed",
|
||||
"nama_pasien": "Budi Santoso",
|
||||
"jenis_kelamin": "Laki-laki",
|
||||
"usia": 45,
|
||||
"ruangan": "R001",
|
||||
"kelas": "1",
|
||||
"tindakan_rs": "T001",
|
||||
"icd9": "ICD9-001",
|
||||
"icd10": "ICD10-001",
|
||||
"cara_bayar": "BPJS",
|
||||
"total_tarif_rs": 500000
|
||||
}
|
||||
```
|
||||
|
||||
**Catatan:**
|
||||
- Pastikan `nama_dokter` sesuai dengan data yang ada di database
|
||||
- Untuk melihat daftar dokter, gunakan: `GET http://localhost:8081/dokter`
|
||||
|
||||
## 3. Response yang Diharapkan
|
||||
|
||||
### Success (200 OK)
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"message": "Billing berhasil dibuat",
|
||||
"data": {
|
||||
"billing": {
|
||||
"ID_Billing": 1,
|
||||
"ID_Pasien": 1,
|
||||
"Cara_Bayar": "BPJS",
|
||||
"Tanggal_masuk": "2024-01-15T10:30:00Z",
|
||||
"Tanggal_keluar": null,
|
||||
"ID_Dokter": 2,
|
||||
"Total_Tarif_RS": 500000,
|
||||
"Total_Tarif_BPJS": 0,
|
||||
"Billing_sign": "created"
|
||||
},
|
||||
"pasien": {
|
||||
"ID_Pasien": 1,
|
||||
"Nama_Pasien": "Budi Santoso",
|
||||
"Jenis_Kelamin": "Laki-laki",
|
||||
"Usia": 45,
|
||||
"Ruangan": "R001",
|
||||
"Kelas": "1"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Error - Dokter Tidak Ditemukan (500)
|
||||
```json
|
||||
{
|
||||
"status": "error",
|
||||
"message": "Gagal membuat billing",
|
||||
"error": "dokter dengan nama Dr. Ahmad Wijaya tidak ditemukan"
|
||||
}
|
||||
```
|
||||
|
||||
### Error - Validasi Gagal (400)
|
||||
```json
|
||||
{
|
||||
"status": "error",
|
||||
"message": "Data tidak valid",
|
||||
"error": "Key: 'BillingRequest.Nama_Dokter' Error:Field validation for 'Nama_Dokter' failed on the 'required' tag"
|
||||
}
|
||||
```
|
||||
|
||||
## 4. Testing Skenario
|
||||
|
||||
### Skenario 1: Pasien Baru
|
||||
- Kirim request dengan `nama_pasien` yang belum ada di database
|
||||
- Sistem akan membuat pasien baru dengan ID auto-increment
|
||||
- Billing akan dibuat dengan ID_Pasien dari pasien baru
|
||||
|
||||
### Skenario 2: Pasien Sudah Ada
|
||||
- Kirim request dengan `nama_pasien` yang sudah ada di database
|
||||
- Sistem akan menggunakan data pasien yang sudah ada
|
||||
- Billing akan dibuat dengan ID_Pasien dari pasien yang sudah ada
|
||||
|
||||
### Skenario 3: Dokter Tidak Ditemukan
|
||||
- Kirim request dengan `nama_dokter` yang tidak ada di database
|
||||
- Sistem akan mengembalikan error
|
||||
|
||||
## 5. Endpoint Lain untuk Testing
|
||||
|
||||
### Get Daftar Dokter
|
||||
```
|
||||
GET http://localhost:8081/dokter
|
||||
```
|
||||
|
||||
### Get Pasien by ID
|
||||
```
|
||||
GET http://localhost:8081/pasien/1
|
||||
```
|
||||
|
||||
### Health Check
|
||||
```
|
||||
GET http://localhost:8081/
|
||||
```
|
||||
|
||||
## 6. Checklist Sebelum Testing
|
||||
|
||||
- [ ] Server Go sudah berjalan di port 8081
|
||||
- [ ] Database sudah terkoneksi
|
||||
- [ ] Header `Content-Type: application/json` sudah diset
|
||||
- [ ] Body menggunakan raw JSON (bukan form-data)
|
||||
- [ ] Nama dokter sesuai dengan data di database
|
||||
- [ ] Semua field required sudah terisi
|
||||
|
||||
## 7. Troubleshooting
|
||||
|
||||
### Error: "Content-Type harus application/json"
|
||||
**Solusi:** Pastikan di tab Headers ada:
|
||||
- Key: `Content-Type`
|
||||
- Value: `application/json`
|
||||
|
||||
### Error: "dokter dengan nama ... tidak ditemukan"
|
||||
**Solusi:**
|
||||
1. Cek daftar dokter dengan `GET /dokter`
|
||||
2. Gunakan nama dokter yang sesuai dengan data di database
|
||||
|
||||
### Error: "Data tidak valid"
|
||||
**Solusi:**
|
||||
1. Pastikan semua field required terisi
|
||||
2. Pastikan format JSON benar (kurung kurawal lengkap)
|
||||
3. Pastikan field names menggunakan lowercase dengan underscore (snake_case)
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
# Setup Postman untuk Testing Billing API
|
||||
|
||||
## Endpoint
|
||||
**Method:** `POST`
|
||||
**URL:** `http://localhost:8080/billing`
|
||||
*(Sesuaikan dengan port server Anda)*
|
||||
|
||||
## Headers (PENTING!)
|
||||
Pastikan header berikut sudah diset:
|
||||
```
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
## Body (Raw JSON)
|
||||
Pilih tab **Body** → pilih **raw** → pilih **JSON** dari dropdown
|
||||
|
||||
Kemudian paste JSON berikut:
|
||||
|
||||
```json
|
||||
{
|
||||
"nama_dokter": "Dr. Ahmad Wijaya",
|
||||
"nama_pasien": "Budi Santoso",
|
||||
"jenis_kelamin": "Laki-laki",
|
||||
"usia": 45,
|
||||
"ruangan": "R001",
|
||||
"kelas": "1",
|
||||
"tindakan_rs": "T001",
|
||||
"icd9": "ICD9-001",
|
||||
"icd10": "ICD10-001",
|
||||
"cara_bayar": "BPJS",
|
||||
"total_tarif_rs": 500000
|
||||
}
|
||||
```
|
||||
|
||||
## Field yang Required (Wajib Diisi)
|
||||
- `nama_dokter` (string)
|
||||
- `nama_pasien` (string)
|
||||
- `jenis_kelamin` (string) - "Laki-laki" atau "Perempuan"
|
||||
- `usia` (integer)
|
||||
- `ruangan` (string)
|
||||
- `kelas` (string) - "1", "2", atau "3"
|
||||
- `tindakan_rs` (string)
|
||||
- `icd9` (string)
|
||||
- `icd10` (string)
|
||||
- `cara_bayar` (string) - "BPJS" atau "UMUM"
|
||||
- `total_tarif_rs` (integer) - optional
|
||||
|
||||
## Response Success (200 OK)
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"message": "Billing berhasil dibuat",
|
||||
"data": {
|
||||
"billing": {
|
||||
"ID_Billing": "BILL-...",
|
||||
"ID_Pasien": "PAS-...",
|
||||
"Cara_Bayar": "BPJS",
|
||||
"Tanggal_masuk": "2024-01-15T10:30:00Z",
|
||||
"Tanggal_keluar": null,
|
||||
"ID_Dokter": "DOK-001",
|
||||
"Total_Tarif_RS": 500000,
|
||||
"Total_Tarif_BPJS": 0,
|
||||
"Billing_sign": "created"
|
||||
},
|
||||
"pasien": {
|
||||
"ID_Pasien": "PAS-...",
|
||||
"Nama_Pasien": "Budi Santoso",
|
||||
"Jenis_Kelamin": "Laki-laki",
|
||||
"Usia": 45,
|
||||
"Ruangan": "R001",
|
||||
"Kelas": "1"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Error: "Content-Type harus application/json"
|
||||
**Solusi:** Pastikan di tab Headers, ada header:
|
||||
- Key: `Content-Type`
|
||||
- Value: `application/json`
|
||||
|
||||
### Error: "Data tidak valid" dengan semua field required
|
||||
**Kemungkinan penyebab:**
|
||||
1. Body tidak dikirim sebagai JSON (mungkin masih form-data atau x-www-form-urlencoded)
|
||||
2. Format JSON salah (kurung kurawal tidak lengkap, koma salah, dll)
|
||||
3. Field names tidak sesuai (harus lowercase dengan underscore)
|
||||
|
||||
**Solusi:**
|
||||
1. Pastikan di tab Body, pilih **raw** dan dropdown menunjukkan **JSON**
|
||||
2. Copy-paste ulang JSON dari contoh di atas
|
||||
3. Pastikan semua field required terisi
|
||||
|
||||
### Error: "dokter dengan nama ... tidak ditemukan"
|
||||
**Solusi:** Pastikan nama dokter yang dikirim sudah ada di database. Cek dengan GET `/dokter` terlebih dahulu.
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
# Cara Menambahkan Data Dummy Admin
|
||||
|
||||
File ini berisi instruksi untuk menambahkan data dummy admin ke database.
|
||||
|
||||
## Data Admin
|
||||
- **Username**: `admin`
|
||||
- **Password**: `admin123`
|
||||
|
||||
## Cara 1: Menggunakan File SQL (Recommended)
|
||||
|
||||
1. Buka MySQL client atau phpMyAdmin
|
||||
2. Pilih database `care_it_data`
|
||||
3. Jalankan file SQL:
|
||||
```sql
|
||||
-- Hapus data admin jika sudah ada
|
||||
DELETE FROM `admin_ruangan` WHERE `Nama_Admin` = 'admin';
|
||||
|
||||
-- Insert data admin baru
|
||||
INSERT INTO `admin_ruangan` (`Nama_Admin`, `Password`, `ID_Ruangan`)
|
||||
VALUES ('admin', 'admin123', NULL);
|
||||
```
|
||||
|
||||
Atau jalankan file SQL langsung:
|
||||
```bash
|
||||
mysql -u root -p care_it_data < sql/insert_admin_dummy.sql
|
||||
```
|
||||
|
||||
## Cara 2: Menggunakan Script Go
|
||||
|
||||
1. Pastikan Anda berada di direktori `Backend_CareIt`
|
||||
2. Jalankan script:
|
||||
```bash
|
||||
go run scripts/insert_admin.go
|
||||
```
|
||||
|
||||
Script akan otomatis:
|
||||
- Menghapus admin lama jika sudah ada
|
||||
- Menambahkan admin baru dengan username `admin` dan password `admin123`
|
||||
|
||||
## Cara 3: Menggunakan MySQL Command Line
|
||||
|
||||
```bash
|
||||
mysql -u root -p care_it_data
|
||||
```
|
||||
|
||||
Kemudian jalankan:
|
||||
```sql
|
||||
DELETE FROM `admin_ruangan` WHERE `Nama_Admin` = 'admin';
|
||||
INSERT INTO `admin_ruangan` (`Nama_Admin`, `Password`, `ID_Ruangan`)
|
||||
VALUES ('admin', 'admin123', NULL);
|
||||
```
|
||||
|
||||
## Verifikasi
|
||||
|
||||
### Cara 1: Menggunakan Script Go (Recommended)
|
||||
```bash
|
||||
cd Backend_CareIt
|
||||
go run scripts/check_admin.go
|
||||
```
|
||||
|
||||
Script ini akan menampilkan:
|
||||
- Semua data admin di database
|
||||
- Test query untuk memastikan data bisa diakses
|
||||
- Informasi detail tentang setiap admin
|
||||
|
||||
### Cara 2: Menggunakan MySQL Query
|
||||
```sql
|
||||
SELECT * FROM admin_ruangan WHERE Nama_Admin = 'admin';
|
||||
```
|
||||
|
||||
Anda seharusnya melihat data admin dengan:
|
||||
- `ID_Admin`: (auto increment)
|
||||
- `Nama_Admin`: admin
|
||||
- `Password`: admin123
|
||||
- `ID_Ruangan`: NULL
|
||||
|
||||
## Login
|
||||
|
||||
Setelah data ditambahkan, Anda bisa login dengan:
|
||||
- **User Type**: Admin (pilih radio button "Admin")
|
||||
- **Username**: `admin`
|
||||
- **Password**: `admin123`
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Masalah: "Payload login tidak valid"
|
||||
1. Pastikan semua field terisi (username dan password tidak kosong)
|
||||
2. Pastikan backend sudah di-compile ulang setelah perubahan
|
||||
3. Restart backend server
|
||||
|
||||
### Masalah: "Username atau password salah"
|
||||
1. Verifikasi data admin ada di database:
|
||||
```bash
|
||||
go run scripts/check_admin.go
|
||||
```
|
||||
2. Pastikan username dan password sesuai (case-sensitive untuk password)
|
||||
3. Pastikan tidak ada whitespace di username/password
|
||||
4. Cek log backend untuk error detail
|
||||
|
||||
### Masalah: Admin masuk ke dashboard dokter
|
||||
1. Pastikan memilih radio button "Admin" sebelum login
|
||||
2. Clear browser cache dan localStorage
|
||||
3. Pastikan `userRole` di localStorage adalah "admin"
|
||||
|
||||
### Masalah: Data admin tidak ditemukan
|
||||
1. Jalankan script insert admin lagi:
|
||||
```bash
|
||||
go run scripts/insert_admin.go
|
||||
```
|
||||
2. Verifikasi dengan check script:
|
||||
```bash
|
||||
go run scripts/check_admin.go
|
||||
```
|
||||
3. Pastikan koneksi database benar di `database/db.go`
|
||||
|
||||
@@ -1,419 +0,0 @@
|
||||
# CareIT Database Views Documentation
|
||||
|
||||
## 📋 Overview
|
||||
Dokumentasi lengkap untuk semua views yang telah ditambahkan ke database CareIT untuk optimasi query dan mempercepat pengaksesan data.
|
||||
|
||||
---
|
||||
|
||||
## 📊 Daftar Views
|
||||
|
||||
### 1. **v_billing_pasien_info**
|
||||
**Tujuan:** Menampilkan informasi billing pasien dengan data lengkap dan status real-time
|
||||
|
||||
**Kolom:**
|
||||
- `ID_Billing` - ID Billing (PK)
|
||||
- `ID_Pasien` - ID Pasien (FK)
|
||||
- `Nama_Pasien` - Nama lengkap pasien
|
||||
- `Jenis_Kelamin` - Jenis kelamin (Laki-laki/Perempuan)
|
||||
- `Usia` - Usia pasien
|
||||
- `Ruangan` - Nama ruangan
|
||||
- `Kelas` - Kelas perawatan (1, 2, 3)
|
||||
- `Cara_Bayar` - Metode pembayaran (BPJS/Umum)
|
||||
- `Tanggal_Masuk` - Tanggal masuk rumah sakit
|
||||
- `Tanggal_Keluar` - Tanggal keluar (NULL jika masih aktif)
|
||||
- `Hari_Inap` - Jumlah hari perawatan (calculated)
|
||||
- `Total_Tarif_RS` - Total tarif RS
|
||||
- `Total_Klaim` - Total klaim BPJS
|
||||
- `Billing_Sign` - Status billing (Hijau/Kuning/Merah)
|
||||
- `Status_Pasien` - Status pasien (Aktif/Selesai)
|
||||
|
||||
**Use Case:**
|
||||
- Dashboard billing pasien
|
||||
- List view semua pasien
|
||||
- Filter berdasarkan status atau cara bayar
|
||||
- Monitoring status pasien aktif
|
||||
|
||||
**Query Example:**
|
||||
```sql
|
||||
SELECT * FROM v_billing_pasien_info
|
||||
WHERE Status_Pasien = 'Aktif'
|
||||
ORDER BY Tanggal_Masuk DESC;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. **v_billing_detail**
|
||||
**Tujuan:** Menampilkan detail billing dengan informasi dokter dan tindakan
|
||||
|
||||
**Kolom:**
|
||||
- `ID_Billing` - ID Billing
|
||||
- `ID_Pasien` - ID Pasien
|
||||
- `Nama_Pasien` - Nama pasien
|
||||
- `Cara_Bayar` - Metode pembayaran
|
||||
- `Tanggal_Masuk` - Tanggal masuk
|
||||
- `Tanggal_Keluar` - Tanggal keluar
|
||||
- `Dokter` - Daftar dokter yang menangani
|
||||
- `KSM` - Kelompok Staf Medis yang terlibat
|
||||
- `Jumlah_Dokter` - Jumlah dokter yang terlibat
|
||||
- `Jumlah_Tindakan` - Jumlah tindakan yang dilakukan
|
||||
- `Total_Tarif_RS` - Total tarif RS
|
||||
- `Total_Klaim` - Total klaim
|
||||
- `Billing_Sign` - Status billing
|
||||
|
||||
**Use Case:**
|
||||
- Reporting detail billing
|
||||
- Tracking dokter per pasien
|
||||
- Analisis jumlah tindakan per billing
|
||||
- Verifikasi komposisi tim medis
|
||||
|
||||
**Query Example:**
|
||||
```sql
|
||||
SELECT * FROM v_billing_detail
|
||||
WHERE Cara_Bayar = 'BPJS'
|
||||
AND Jumlah_Dokter >= 2;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. **v_billing_diagnosis_procedure**
|
||||
**Tujuan:** Menampilkan diagnosa dan prosedur medis per billing
|
||||
|
||||
**Kolom:**
|
||||
- `ID_Billing` - ID Billing
|
||||
- `Nama_Pasien` - Nama pasien
|
||||
- `Cara_Bayar` - Metode pembayaran
|
||||
- `Kode_Diagnosa` - Daftar kode ICD10 diagnosa
|
||||
- `Diagnosa` - Daftar diagnosa lengkap
|
||||
- `Jumlah_Diagnosa` - Jumlah diagnosa
|
||||
- `Kode_Prosedur` - Daftar kode ICD9 prosedur
|
||||
- `Prosedur` - Daftar prosedur lengkap
|
||||
- `Jumlah_Prosedur` - Jumlah prosedur
|
||||
- `Tanggal_Masuk` - Tanggal masuk
|
||||
- `Tanggal_Keluar` - Tanggal keluar
|
||||
|
||||
**Use Case:**
|
||||
- Medical record extraction
|
||||
- Clinical audit trail
|
||||
- Diagnosis tracking
|
||||
- Procedure validation
|
||||
- Export untuk verifikasi medis
|
||||
|
||||
**Query Example:**
|
||||
```sql
|
||||
SELECT * FROM v_billing_diagnosis_procedure
|
||||
WHERE Diagnosa LIKE '%A00%';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. **v_billing_inacbg_code**
|
||||
**Tujuan:** Menampilkan INACBG code (RI dan RJ) untuk BPJS claim processing
|
||||
|
||||
**Kolom:**
|
||||
- `ID_Billing` - ID Billing
|
||||
- `Nama_Pasien` - Nama pasien
|
||||
- `Cara_Bayar` - Metode pembayaran
|
||||
- `Tipe_Perawatan` - Tipe perawatan (RI=Rawat Inap, RJ=Rawat Jalan)
|
||||
- `Kode_INACBG_RI` - Daftar kode INACBG RI
|
||||
- `Kode_INACBG_RJ` - Daftar kode INACBG RJ
|
||||
- `Jumlah_INACBG_RI` - Jumlah kode RI
|
||||
- `Jumlah_INACBG_RJ` - Jumlah kode RJ
|
||||
- `Total_Klaim` - Total klaim
|
||||
- `Billing_Sign` - Status billing
|
||||
|
||||
**Use Case:**
|
||||
- BPJS claim submission
|
||||
- INACBG code verification
|
||||
- Claim tracking
|
||||
- DRG mapping validation
|
||||
- Financial reconciliation
|
||||
|
||||
**Query Example:**
|
||||
```sql
|
||||
SELECT * FROM v_billing_inacbg_code
|
||||
WHERE Cara_Bayar = 'BPJS'
|
||||
AND Billing_Sign IN ('Kuning', 'Merah');
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. **v_ruangan_pasien_aktif**
|
||||
**Tujuan:** Dashboard ruangan dengan occupancy rate dan distribusi pasien per kelas
|
||||
|
||||
**Kolom:**
|
||||
- `ID_Ruangan` - ID Ruangan (PK)
|
||||
- `Nama_Ruangan` - Nama ruangan
|
||||
- `Jenis_Ruangan` - Jenis ruangan
|
||||
- `Kategori_ruangan` - Kategori ruangan
|
||||
- `Jumlah_Pasien_Aktif` - Total pasien aktif di ruangan
|
||||
- `Pasien_Kelas_1` - Jumlah pasien kelas 1
|
||||
- `Pasien_Kelas_2` - Jumlah pasien kelas 2
|
||||
- `Pasien_Kelas_3` - Jumlah pasien kelas 3
|
||||
- `Nama_Pasien` - Daftar nama pasien aktif
|
||||
|
||||
**Use Case:**
|
||||
- Real-time occupancy dashboard
|
||||
- Room management
|
||||
- Patient distribution analysis
|
||||
- Capacity planning
|
||||
- Class-based tracking
|
||||
|
||||
**Query Example:**
|
||||
```sql
|
||||
SELECT * FROM v_ruangan_pasien_aktif
|
||||
WHERE Jumlah_Pasien_Aktif > 0
|
||||
ORDER BY Jumlah_Pasien_Aktif DESC;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 6. **v_dokter_billing_stat**
|
||||
**Tujuan:** Statistik kinerja dokter dengan tracking billing dan klaim
|
||||
|
||||
**Kolom:**
|
||||
- `ID_Dokter` - ID Dokter (PK)
|
||||
- `Nama_Dokter` - Nama dokter
|
||||
- `Status` - Status (DPJP/PPDS)
|
||||
- `KSM` - Kelompok Staf Medis
|
||||
- `Jumlah_Billing` - Jumlah billing yang ditangani
|
||||
- `Jumlah_Pasien` - Jumlah pasien unik
|
||||
- `Total_Klaim` - Total klaim dari semua billing
|
||||
- `Tanggal_Pasien_Terakhir` - Tanggal pasien terakhir ditangani
|
||||
- `Tipe_Pasien` - Tipe pasien yang ditangani (BPJS/Umum)
|
||||
|
||||
**Use Case:**
|
||||
- Dokter performance dashboard
|
||||
- Workload analysis
|
||||
- Billing tracking per dokter
|
||||
- KSM comparative analysis
|
||||
- Productivity metrics
|
||||
|
||||
**Query Example:**
|
||||
```sql
|
||||
SELECT * FROM v_dokter_billing_stat
|
||||
WHERE Jumlah_Billing > 5
|
||||
ORDER BY Total_Klaim DESC;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7. **v_pasien_billing_history**
|
||||
**Tujuan:** Riwayat lengkap pasien dengan semua billing dan klaim
|
||||
|
||||
**Kolom:**
|
||||
- `ID_Pasien` - ID Pasien (PK)
|
||||
- `Nama_Pasien` - Nama lengkap pasien
|
||||
- `Jenis_Kelamin` - Jenis kelamin
|
||||
- `Usia` - Usia pasien
|
||||
- `Ruangan` - Ruangan tempat dirawat
|
||||
- `Jumlah_Billing` - Total billing sepanjang waktu
|
||||
- `Jumlah_Billing_Aktif` - Billing yang masih aktif
|
||||
- `Jumlah_Billing_Selesai` - Billing yang sudah selesai
|
||||
- `Total_Klaim_Keseluruhan` - Total klaim keseluruhan
|
||||
- `Tanggal_Masuk_Terakhir` - Tanggal masuk terakhir
|
||||
- `Tanggal_Keluar_Terakhir` - Tanggal keluar terakhir
|
||||
- `Riwayat_Cara_Bayar` - Riwayat cara pembayaran
|
||||
|
||||
**Use Case:**
|
||||
- Patient medical history
|
||||
- Complete patient profile
|
||||
- Historical billing analysis
|
||||
- Treatment continuity tracking
|
||||
- Patient lifetime value analysis
|
||||
|
||||
**Query Example:**
|
||||
```sql
|
||||
SELECT * FROM v_pasien_billing_history
|
||||
WHERE Jumlah_Billing > 1
|
||||
ORDER BY Total_Klaim_Keseluruhan DESC;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 8. **v_billing_summary_harian**
|
||||
**Tujuan:** Summary harian billing untuk operational dashboard
|
||||
|
||||
**Kolom:**
|
||||
- `Tanggal` - Tanggal (DATE)
|
||||
- `Jumlah_Billing_Masuk` - Jumlah billing masuk hari tersebut
|
||||
- `Billing_Keluar_Hari_Sama` - Billing keluar di hari yang sama
|
||||
- `Billing_Aktif` - Billing yang masih aktif (tidak keluar)
|
||||
- `Status_Hijau` - Jumlah billing dengan status Hijau
|
||||
- `Status_Kuning` - Jumlah billing dengan status Kuning
|
||||
- `Status_Merah` - Jumlah billing dengan status Merah
|
||||
- `Total_Tarif_RS_Harian` - Total tarif RS harian
|
||||
- `Total_Klaim_Harian` - Total klaim harian
|
||||
- `Tipe_Pasien_Masuk` - Tipe pasien yang masuk (BPJS/Umum)
|
||||
|
||||
**Use Case:**
|
||||
- Daily operational report
|
||||
- Real-time monitoring dashboard
|
||||
- Hospital KPI tracking
|
||||
- Revenue analysis
|
||||
- Status distribution monitoring
|
||||
|
||||
**Query Example:**
|
||||
```sql
|
||||
SELECT * FROM v_billing_summary_harian
|
||||
WHERE Tanggal BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE()
|
||||
ORDER BY Tanggal DESC;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 9. **v_billing_tarif_analysis**
|
||||
**Tujuan:** Analisis detail tarif dan klaim untuk financial validation
|
||||
|
||||
**Kolom:**
|
||||
- `ID_Billing` - ID Billing
|
||||
- `Nama_Pasien` - Nama pasien
|
||||
- `Cara_Bayar` - Metode pembayaran
|
||||
- `Total_Tarif_RS` - Total tarif RS
|
||||
- `Total_Klaim` - Total klaim
|
||||
- `Selisih_Tarif_Klaim` - Selisih tarif dan klaim
|
||||
- `Persentase_Klaim` - Persentase klaim terhadap tarif (%)
|
||||
- `Billing_Sign` - Status billing
|
||||
- `Jumlah_Tindakan` - Jumlah tindakan
|
||||
- `Jumlah_Kode_INACBG` - Jumlah kode INACBG
|
||||
|
||||
**Use Case:**
|
||||
- Financial audit
|
||||
- Tarif vs claim analysis
|
||||
- Billing accuracy validation
|
||||
- Revenue reconciliation
|
||||
- Claim percentage tracking
|
||||
|
||||
**Query Example:**
|
||||
```sql
|
||||
SELECT * FROM v_billing_tarif_analysis
|
||||
WHERE Persentase_Klaim < 50
|
||||
AND Billing_Sign = 'Merah';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 10. **v_ksm_performance**
|
||||
**Tujuan:** Performance metrics per KSM (Kelompok Staf Medis)
|
||||
|
||||
**Kolom:**
|
||||
- `KSM` - Nama KSM (PK)
|
||||
- `Jumlah_Dokter` - Jumlah dokter di KSM
|
||||
- `Jumlah_Billing_Ditangani` - Total billing yang ditangani
|
||||
- `Avg_Billing_Per_Dokter` - Rata-rata billing per dokter
|
||||
- `Total_Klaim_KSM` - Total klaim keseluruhan KSM
|
||||
- `Billing_Sign_Hijau` - Jumlah billing status Hijau
|
||||
- `Billing_Sign_Kuning` - Jumlah billing status Kuning
|
||||
- `Billing_Sign_Merah` - Jumlah billing status Merah
|
||||
|
||||
**Use Case:**
|
||||
- Departmental performance analysis
|
||||
- Comparative KSM metrics
|
||||
- Resource allocation planning
|
||||
- Quality metrics tracking
|
||||
- Financial performance by department
|
||||
|
||||
**Query Example:**
|
||||
```sql
|
||||
SELECT * FROM v_ksm_performance
|
||||
ORDER BY Total_Klaim_KSM DESC;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Index Recommendation
|
||||
|
||||
Untuk optimasi lebih lanjut, recommend untuk membuat index pada kolom yang sering digunakan:
|
||||
|
||||
```sql
|
||||
-- Index untuk v_billing_pasien_info
|
||||
CREATE INDEX idx_billing_pasien_status ON billing_pasien(Tanggal_Keluar, Billing_Sign);
|
||||
CREATE INDEX idx_billing_pasien_cara_bayar ON billing_pasien(Cara_Bayar);
|
||||
CREATE INDEX idx_pasien_ruangan ON pasien(Ruangan);
|
||||
|
||||
-- Index untuk v_billing_detail
|
||||
CREATE INDEX idx_billing_dokter_id ON billing_dokter(ID_Billing, ID_Dokter);
|
||||
CREATE INDEX idx_dokter_ksm ON dokter(KSM);
|
||||
|
||||
-- Index untuk v_billing_diagnosis_procedure
|
||||
CREATE INDEX idx_billing_icd10 ON billing_icd10(ID_Billing);
|
||||
CREATE INDEX idx_billing_icd9 ON billing_icd9(ID_Billing);
|
||||
|
||||
-- Index untuk v_billing_inacbg_code
|
||||
CREATE INDEX idx_billing_inacbg_ri ON billing_inacbg_ri(ID_Billing);
|
||||
CREATE INDEX idx_billing_inacbg_rj ON billing_inacbg_rj(ID_Billing);
|
||||
|
||||
-- Index untuk tanggal
|
||||
CREATE INDEX idx_billing_tanggal_masuk ON billing_pasien(Tanggal_Masuk);
|
||||
CREATE INDEX idx_billing_tanggal_keluar ON billing_pasien(Tanggal_Keluar);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Notes & Best Practices
|
||||
|
||||
### ✅ Kelebihan menggunakan Views:
|
||||
|
||||
1. **Performa Lebih Cepat** - Query sudah pre-compiled
|
||||
2. **Konsistensi Data** - Logika aggregation terpusat
|
||||
3. **Kemudahan Maintenance** - Perubahan logic hanya di satu tempat
|
||||
4. **Security** - Bisa membatasi akses ke kolom tertentu
|
||||
5. **Abstraksi** - Frontend tidak perlu tahu struktur table kompleks
|
||||
|
||||
### ⚠️ Perhatian:
|
||||
|
||||
1. Views adalah **read-only** (SELECT only) di versi MariaDB ini
|
||||
2. Performa depends pada database size - gunakan index yang tepat
|
||||
3. Aggregate functions (COUNT, SUM, etc) bisa lambat untuk dataset besar
|
||||
4. Refresh view dengan menjalankan EXPLAIN untuk cek query plan
|
||||
|
||||
### 🚀 Tips Optimasi:
|
||||
|
||||
1. Gunakan WHERE clause untuk filter sebanyak mungkin
|
||||
2. Limit hasil jika tidak perlu semua data
|
||||
3. Cache hasil di aplikasi jika data tidak berubah sering
|
||||
4. Monitor query performance dengan EXPLAIN
|
||||
5. Update index statistics secara berkala
|
||||
|
||||
---
|
||||
|
||||
## 📊 Contoh Penggunaan di Backend
|
||||
|
||||
### Go Example (menggunakan GORM):
|
||||
|
||||
```go
|
||||
// Model untuk View
|
||||
type BillingPasienInfo struct {
|
||||
IDBilling int `gorm:"column:ID_Billing"`
|
||||
IDPasien int `gorm:"column:ID_Pasien"`
|
||||
NamaPasien string `gorm:"column:Nama_Pasien"`
|
||||
CaraBayar string `gorm:"column:Cara_Bayar"`
|
||||
HariInap int `gorm:"column:Hari_Inap"`
|
||||
StatusPasien string `gorm:"column:Status_Pasien"`
|
||||
}
|
||||
|
||||
func (BillingPasienInfo) TableName() string {
|
||||
return "v_billing_pasien_info"
|
||||
}
|
||||
|
||||
// Usage dalam handler
|
||||
func GetBillingAktif(db *gorm.DB, c *gin.Context) {
|
||||
var billings []BillingPasienInfo
|
||||
db.Where("Status_Pasien = ?", "Aktif").
|
||||
Order("Tanggal_Masuk DESC").
|
||||
Find(&billings)
|
||||
|
||||
c.JSON(200, billings)
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Update & Maintenance
|
||||
|
||||
Views akan **secara otomatis** updated ketika data di table yang di-reference berubah. Tidak perlu maintenance manual.
|
||||
|
||||
---
|
||||
|
||||
**Dokumentasi dibuat: 23 Desember 2025**
|
||||
**Database: CareIT v2**
|
||||
**Version: 1.0**
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,16 +0,0 @@
|
||||
-- Insert data dummy untuk admin ruangan
|
||||
-- Username: admin
|
||||
-- Password: admin123
|
||||
|
||||
-- Hapus data admin jika sudah ada (untuk testing)
|
||||
DELETE FROM `admin_ruangan` WHERE `Nama_Admin` = 'admin';
|
||||
|
||||
-- Insert data admin baru
|
||||
INSERT INTO `admin_ruangan` (`ID_Admin`, `Nama_Admin`, `Password`, `ID_Ruangan`)
|
||||
VALUES (1, 'admin', 'admin123', NULL);
|
||||
|
||||
-- Jika ID_Admin sudah ada, gunakan ID yang lebih tinggi
|
||||
-- Atau biarkan AUTO_INCREMENT yang mengatur
|
||||
-- INSERT INTO `admin_ruangan` (`Nama_Admin`, `Password`, `ID_Ruangan`)
|
||||
-- VALUES ('admin', 'admin123', NULL);
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"nama_dokter": "Dr. Ahmad Wijaya",
|
||||
"nama_pasien": "Budi Santoso",
|
||||
"jenis_kelamin": "Laki-laki",
|
||||
"usia": 45,
|
||||
"ruangan": "R001",
|
||||
"kelas": "1",
|
||||
"tindakan_rs": "T001",
|
||||
"icd9": "ICD9-001",
|
||||
"icd10": "ICD10-001",
|
||||
"cara_bayar": "BPJS",
|
||||
"total_tarif_rs": 500000
|
||||
}
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"nama_dokter": "Dr. Ahmad Wijaya",
|
||||
"nama_pasien": "Budi Santoso",
|
||||
"jenis_kelamin": "Laki-laki",
|
||||
"usia": 45,
|
||||
"ruangan": "R001",
|
||||
"kelas": "1",
|
||||
"tindakan_rs": "T001",
|
||||
"icd9": "ICD9-001",
|
||||
"icd10": "ICD10-001",
|
||||
"cara_bayar": "BPJS",
|
||||
"total_tarif_rs": 500000
|
||||
}
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"status": "success",
|
||||
"message": "Billing berhasil dibuat",
|
||||
"data": {
|
||||
"billing": {
|
||||
"ID_Billing": "BILL-12345678-1234-1234-1234-123456789abc",
|
||||
"ID_Pasien": "PAS-87654321-4321-4321-4321-cba987654321",
|
||||
"Cara_Bayar": "BPJS",
|
||||
"Tanggal_masuk": "2024-01-15T10:30:00Z",
|
||||
"Tanggal_keluar": null,
|
||||
"ID_Dokter": "DOK-001",
|
||||
"Total_Tarif_RS": 500000,
|
||||
"Total_Tarif_BPJS": 0,
|
||||
"Billing_sign": "created"
|
||||
},
|
||||
"pasien": {
|
||||
"ID_Pasien": "PAS-87654321-4321-4321-4321-cba987654321",
|
||||
"Nama_Pasien": "Budi Santoso",
|
||||
"Jenis_Kelamin": "Laki-laki",
|
||||
"Usia": 45,
|
||||
"Ruangan": "R001",
|
||||
"Kelas": "1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
backend:
|
||||
build:
|
||||
context: ./backendcareit_v4
|
||||
dockerfile: Dockerfile
|
||||
container_name: careit_backend
|
||||
environment:
|
||||
DB_HOST: ${DB_HOST:-host.docker.internal}
|
||||
DB_PORT: ${DB_PORT:-5432}
|
||||
DB_USER: ${DB_USER}
|
||||
DB_PASSWORD: ${DB_PASSWORD}
|
||||
DB_NAME: ${DB_NAME}
|
||||
HOST: 0.0.0.0
|
||||
PORT: 8081
|
||||
ports:
|
||||
- "8081:8081"
|
||||
networks:
|
||||
- careit_network
|
||||
restart: unless-stopped
|
||||
|
||||
frontend:
|
||||
build:
|
||||
context: ./frontendcareit_v4
|
||||
dockerfile: Dockerfile
|
||||
container_name: careit_frontend
|
||||
environment:
|
||||
NEXT_PUBLIC_API_URL: http://backend:8081
|
||||
ports:
|
||||
- "3000:3000"
|
||||
depends_on:
|
||||
- backend
|
||||
networks:
|
||||
- careit_network
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
careit_network:
|
||||
driver: bridge
|
||||
@@ -0,0 +1,26 @@
|
||||
.git
|
||||
.gitignore
|
||||
*.log
|
||||
.env
|
||||
.env.local
|
||||
.env.development
|
||||
.env.production
|
||||
README.md
|
||||
INTEGRATION_GUIDE.md
|
||||
ELECTRON_README.md
|
||||
ELECTRON_API_SETUP.md
|
||||
BACKEND_API.md
|
||||
TANGGAL_KELUAR_AUTO_FILL_FLOW.md
|
||||
fix_inacbg_plan.md
|
||||
node_modules
|
||||
.next
|
||||
.vercel
|
||||
.turbo
|
||||
coverage
|
||||
dist
|
||||
build
|
||||
.DS_Store
|
||||
.idea
|
||||
.vscode
|
||||
android/
|
||||
electron/
|
||||
@@ -0,0 +1,17 @@
|
||||
# Build stage
|
||||
FROM node:22-alpine AS builder
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
# Runtime stage
|
||||
FROM node:22-alpine
|
||||
WORKDIR /app
|
||||
COPY package.json package-lock.json ./
|
||||
RUN npm ci --only=production
|
||||
COPY --from=builder /app/.next ./.next
|
||||
COPY --from=builder /app/public ./public
|
||||
EXPOSE 3000
|
||||
CMD ["npm", "start"]
|
||||
@@ -19,7 +19,7 @@ const getApiBaseUrl = (): string => {
|
||||
return process.env.NEXT_PUBLIC_API_URL || "http://31.97.109.192:8082";
|
||||
} else {
|
||||
// Web browser: direct backend call
|
||||
return process.env.NEXT_PUBLIC_API_URL || "http://localhost:8081";
|
||||
return process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000/api";
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user