update docker

This commit is contained in:
AnggerRevo5
2026-01-30 13:10:48 +07:00
parent 9df710d81e
commit 39bb79f848
31 changed files with 142 additions and 100887 deletions
+17
View File
@@ -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
+3
View File
@@ -0,0 +1,3 @@
{
"liveServer.settings.port": 5570
}
+19
View File
@@ -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/
+3 -1
View File
@@ -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
+15
View File
@@ -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"]
+1 -1
View File
@@ -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")
-154
View File
@@ -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)
-97
View File
@@ -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.
-115
View File
@@ -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`
-419
View File
@@ -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"
}
}
}
+40
View File
@@ -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
BIN
View File
Binary file not shown.
+26
View File
@@ -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/
+17
View File
@@ -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"]
+1 -1
View File
@@ -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";
}
};