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_USER=postgres
|
||||||
DB_PASSWORD= gakbikinkembung25
|
DB_PASSWORD= gakbikinkembung25
|
||||||
# DB_HOST=31.97.109.192
|
# DB_HOST=31.97.109.192
|
||||||
DB_HOST= localhost
|
DB_HOST=localhost
|
||||||
|
# DB_HOST=postgres
|
||||||
DB_PORT=5432
|
DB_PORT=5432
|
||||||
DB_NAME=careit_db
|
DB_NAME=careit_db
|
||||||
HOST=0.0.0.0
|
HOST=0.0.0.0
|
||||||
|
# PORT=8080
|
||||||
PORT=8081
|
PORT=8081
|
||||||
# PORT=8082
|
# 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 == "" {
|
if dsn == "" {
|
||||||
user := envOrDefaultPG("DB_USER", "postgres")
|
user := envOrDefaultPG("DB_USER", "postgres")
|
||||||
pass := envOrDefaultPG("DB_PASSWORD", "gakbikinkembung25")
|
pass := envOrDefaultPG("DB_PASSWORD", "gakbikinkembung25")
|
||||||
host := envOrDefaultPG("DB_HOST", "localhost")
|
host := envOrDefaultPG("DB_HOST", "postgres")
|
||||||
port := envOrDefaultPG("DB_PORT", "5432")
|
port := envOrDefaultPG("DB_PORT", "5432")
|
||||||
name := envOrDefaultPG("DB_NAME", "careit_db")
|
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";
|
return process.env.NEXT_PUBLIC_API_URL || "http://31.97.109.192:8082";
|
||||||
} else {
|
} else {
|
||||||
// Web browser: direct backend call
|
// 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