Files
satusehat-service/internal/satusehat/DOCUMENT.doc
T

461 lines
13 KiB
Plaintext

# 📚 Dokumentasi Lengkap API Satu Sehat (GoPrint Builder)
**Base URL**: `http://localhost:8080/api/v1/satusehat` *(sesuaikan dengan host dan port environment Anda)*
**Otorisasi**: Membutuhkan Header `Authorization: Bearer <token_internal_aplikasi_anda>`
Dokumen ini memuat panduan lengkap penggunaan endpoint dan struktur **JSON Body (POST)** untuk modul referensi (Master Data) maupun modul usecase (Transaksional Klinis). Aplikasi GoPrint bertindak sebagai *proxy builder* yang akan mengonversi struktur JSON datar (*flat*) Anda menjadi format HL7 FHIR standar Kemenkes.
---
## 🔐 1. Otorisasi (Auth) Kemenkes
Aplikasi otomatis mengurus *Access Token* ke Kemenkes. Namun jika dibutuhkan secara manual, Anda bisa menggunakan:
- `GET /reference/auth/token` : Mendapatkan token aktif dari *cache* (digunakan oleh API internal).
- `POST /reference/auth/token/refresh` : Memaksa (*bypass cache*) untuk mengambil token baru.
---
## 🏢 2. Modul Reference (Master Data)
Modul ini digunakan untuk meregistrasi entitas dasar. URL menggunakan prefix `/reference/{modul}`.
### A. Organization (Faskes / Departemen)
`POST /reference/organization`
```json
{
"active": true,
"type_code": "prov",
"type_display": "Healthcare Provider",
"identifier_system": "http://sys-ids.kemkes.go.id/organization/10000004",
"identifier_value": "10000004",
"name": "RSUP Dr. Cipto Mangunkusumo",
"phone": "021-1500135",
"email": "[email protected]",
"url": "https://www.rscm.co.id/",
"address": "Jl. Diponegoro No.71, Kenari, Senen",
"city": "Jakarta Pusat",
"postal_code": "10430",
"country_code": "ID",
"part_of_id": "1000000"
}
```
### B. Location (Lokasi / Ruangan)
`POST /reference/location`
```json
{
"identifier_system": "http://sys-ids.kemkes.go.id/location/10000004",
"identifier_value": "LOK-001",
"status": "active",
"name": "Poli Penyakit Dalam",
"description": "Poliklinik Penyakit Dalam Gedung A",
"physical_type_code": "ro",
"physical_type_display": "Room",
"managing_organization_id": "10000004",
"part_of_id": "b017aa54-f1df-4ec2-9d84-8823815d7228"
}
```
### C. Patient (Pasien)
`POST /reference/patient`
```json
{
"name": "BUDI SANTOSO",
"nik": "3573012345678901",
"ihs_number": "P0123456789",
"gender": "male",
"birth_date": "1990-12-31",
"phone": "08123456789",
"email": "[email protected]",
"is_active": true
}
```
### D. Practitioner (Tenaga Medis)
`POST /reference/practitioner`
```json
{
"nik": "3301234567890123",
"name": "Dr. Siti Aminah, Sp.PD",
"gender": "female",
"birth_date": "1985-05-15",
"is_active": true
}
```
---
## 🩺 3. Modul Usecase (Data Klinis)
Semua endpoint ini langsung menggunakan nama resource, contoh: `POST /encounter` atau `POST /condition`.
### 1. Encounter (Kunjungan)
Mencatat registrasi/kedatangan pasien ke faskes.
`POST /encounter`
```json
{
"encounter_id": "KUNJ-001",
"organization_id": "10000004",
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"practitioner_id": "N10000001",
"practitioner_name": "Dr. Siti Aminah",
"location_id": "b017aa54-f1df-4ec2-9d84-8823815d7228",
"location_name": "Poli Umum",
"status": "arrived",
"class": "AMB",
"period_start": "2023-10-12T08:00:00+07:00"
}
```
*(Status valid: `planned`, `arrived`, `in-progress`, `finished`, `cancelled`)*
### 2. Condition (Diagnosis / Keluhan)
Mencatat hasil diagnosis ICD-10 pasien.
`POST /condition`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"clinical_status": "active",
"category_code": "encounter-diagnosis",
"category_display": "Encounter Diagnosis",
"code": "J06.9",
"display": "Acute upper respiratory infection, unspecified",
"onset_date_time": "2023-10-12T08:15:00+07:00",
"recorded_date": "2023-10-12T08:20:00+07:00"
}
```
### 3. Observation (Tanda Vital / Fisik)
Mencatat TTV seperti Nadi, Tensi, Suhu, dll (Standar LOINC).
`POST /observation`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"status": "final",
"category_code": "vital-signs",
"category_display": "Vital Signs",
"code": "8867-4",
"display": "Heart rate",
"value": 85,
"unit": "beats/minute",
"unit_code": "/min",
"effective_date_time": "2023-10-12T08:10:00+07:00"
}
```
### 4. Procedure (Tindakan Medis / ICD-9 CM)
Mencatat tindakan medis atau operasi yang dilakukan ke pasien.
`POST /procedure`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"status": "completed",
"category_code": "387713003",
"category_display": "Surgical procedure",
"code": "373632001",
"display": "Minor surgery",
"performed_date_time": "2023-10-12T09:30:00+07:00",
"practitioner_id": "N10000001",
"practitioner_name": "Dr. Siti Aminah"
}
```
### 5. AllergyIntolerance (Alergi)
Mencatat alergi pasien terhadap obat, makanan, atau lingkungan.
`POST /allergyintolerance`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"clinical_status": "active",
"verification_status": "confirmed",
"category": "medication",
"code": "373410000",
"display": "Allergy to Penicillin",
"criticality": "high",
"recorded_date": "2023-10-12T08:10:00+07:00"
}
```
### 6. ClinicalImpression (Kesan Klinis / Triase)
Mencatat hasil asesmen klinis awal atau triase.
`POST /clinicalimpression`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"status": "completed",
"description": "Pasien tampak sadar penuh, tidak ada tanda kegawatdaruratan",
"summary": "Observasi ringan",
"practitioner_id": "N10000001",
"practitioner_name": "Dr. Siti Aminah",
"effective_date_time": "2023-10-12T08:15:00+07:00"
}
```
### 7. Medication (Master Obat per Kunjungan)
Mendefinisikan obat berdasarkan KFA (Kamus Farmasi Alat Kesehatan).
`POST /medication`
```json
{
"status_code": "active",
"kfa_code": "93000940",
"kfa_display": "Paracetamol 500 mg Tablet",
"form_code": "BS019",
"form_display": "Tablet",
"manufacturer_id": "10000004",
"batch_number": "BATCH12345",
"expiration_date": "2025-12-31T00:00:00Z"
}
```
### 8. MedicationRequest (Resep Obat)
Permintaan/resep obat dari Dokter ke Apotek.
`POST /medicationrequest`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"status": "active",
"intent": "order",
"medication_id": "medication-uuid-from-kfa",
"medication_display": "Paracetamol 500 mg Tablet",
"practitioner_id": "N10000001",
"authored_on": "2023-10-12T08:45:00+07:00",
"dosage_instruction": "Diminum 3 kali sehari setelah makan",
"dispense_quantity": 10
}
```
### 9. MedicationDispense (Penyerahan Obat / Apotek)
Pencatatan penyerahan obat fisik kepada pasien oleh Apoteker.
`POST /medicationdispense`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"medication_request_id": "request-uuid-here",
"status": "completed",
"medication_id": "medication-uuid-from-kfa",
"medication_display": "Paracetamol 500 mg Tablet",
"practitioner_id": "N10000002",
"practitioner_name": "Apt. Budi, S.Farm",
"handed_over_date": "2023-10-12T09:00:00+07:00",
"quantity": 10
}
```
### 10. MedicationStatement (Pernyataan Penggunaan Obat)
Riwayat penggunaan obat yang dilaporkan oleh pasien.
`POST /medicationstatement`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"status": "active",
"medication_id": "medication-uuid-from-kfa",
"medication_display": "Paracetamol 500 mg Tablet",
"effective_date_time": "2023-10-12T08:00:00+07:00",
"dosage_text": "Sering minum paracetamol bebas saat pusing"
}
```
### 11. ServiceRequest (Permintaan Layanan / Lab / Rujukan)
Permintaan tindakan lebih lanjut, seperti rujuk poli, rawat inap, atau periksa Lab/Radiologi.
`POST /servicerequest`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"status": "active",
"intent": "order",
"category_code": "108252007",
"category_display": "Laboratory procedure",
"code": "1044-2",
"display": "Darah Rutin",
"requester_id": "N10000001",
"authored_on": "2023-10-12T08:30:00+07:00"
}
```
### 12. DiagnosticReport (Hasil Lab / Radiologi)
Laporan hasil pengecekan Lab atau Radiologi (penggabungan berbagai Observation).
`POST /diagnosticreport`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"status": "final",
"category_code": "LAB",
"category_display": "Laboratory",
"code": "1044-2",
"display": "Hasil Darah Rutin",
"practitioner_id": "N10000001",
"issued_date": "2023-10-12T11:00:00+07:00",
"conclusion": "Semua indikator darah dalam batas normal."
}
```
### 13. Specimen (Sampel Lab)
Data pencatatan spesimen (misal: darah, urin) yang diambil dari tubuh pasien.
`POST /specimen`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"type_code": "119297000",
"type_display": "Blood specimen",
"collection_date_time": "2023-10-12T10:00:00+07:00",
"collector_id": "N10000001",
"received_date_time": "2023-10-12T10:15:00+07:00"
}
```
### 14. ImagingStudy (Pencitraan Radiologi)
Data meta terkait pemeriksaan Radiologi (X-Ray, MRI, CT-Scan).
`POST /imagingstudy`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"status": "available",
"started_date_time": "2023-10-12T10:30:00+07:00",
"number_of_series": 1,
"number_of_instances": 5,
"procedure_code": "XR",
"procedure_display": "X-Ray Chest"
}
```
### 15. Immunization (Riwayat Vaksin)
Pencatatan pemberian imunisasi/vaksinasi.
`POST /immunization`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"status": "completed",
"vaccine_code": "J07BM01",
"vaccine_display": "COVID-19 Vaccine",
"occurrence_date_time": "2023-10-12T09:00:00+07:00",
"practitioner_id": "N10000001",
"location_id": "b017aa54-f1df-4ec2-9d84-8823815d7228",
"dose_quantity": 0.5,
"dose_unit": "ml"
}
```
### 16. CarePlan (Rencana Perawatan)
Rencana medis/keperawatan masa depan untuk pasien.
`POST /careplan`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"status": "active",
"intent": "plan",
"title": "Rencana Diet Diabetes",
"description": "Pasien harus mematuhi diet rendah gula dan karbohidrat.",
"practitioner_id": "N10000001",
"created_date": "2023-10-12T10:00:00+07:00"
}
```
### 17. EpisodeOfCare (Episode Perawatan)
Mengelompokkan serangkaian *Encounter* (kunjungan) yang merujuk pada satu kondisi klinis / episode penyakit yang sama.
`POST /episodeofcare`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"organization_id": "10000004",
"status": "active",
"period_start": "2023-10-01T08:00:00+07:00",
"managing_practitioner_id": "N10000001"
}
```
### 18. Composition (Resume Medis / Dokumen Klinis)
Menggabungkan berbagai resource (Diagnosis, Obat, Tindakan) menjadi satu resume / dokumen medis yang utuh secara hukum.
`POST /composition`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"status": "final",
"type_code": "18842-5",
"type_display": "Discharge Summary",
"title": "Resume Pulang Pasien Rawat Inap",
"date": "2023-10-15T12:00:00+07:00",
"author_id": "N10000001",
"author_name": "Dr. Siti Aminah"
}
```
### 19. QuestionnaireResponse (Hasil Kuesioner Medis)
Jawaban atas asesmen spesifik (misal: Skrining Nyeri, Skrining Jatuh, Tumbuh Kembang).
`POST /questionnaireresponse`
```json
{
"patient_id": "P0123456789",
"patient_name": "Budi Santoso",
"encounter_id": "5fa23d13-0943-4318-b295-eb1ecfa7384a",
"status": "completed",
"questionnaire_url": "http://sys-ids.kemkes.go.id/questionnaire/Nyeri",
"authored_date": "2023-10-12T08:05:00+07:00",
"author_practitioner_id": "N10000002",
"items": [
{
"linkId": "1.1",
"text": "Tingkat Nyeri (0-10)",
"answer_value_integer": 3
}
]
}
```
---
## 💡 4. Standar Method GET, PUT, & PATCH
Semua modul mendukung operasi standar berikut:
1. **`GET /{modul}`** (Search)
Melakukan pencarian. Parameter URL (*Query String*) disesuaikan per modul (misal `?patient=P012...` atau `?name=Budi`).
2. **`GET /{modul}/{id}`** (Get By ID)
Mengambil detail data utuh (dalam format FHIR) berdasarkan ID kemenkes.
3. **`PUT /{modul}/{id}`** (Replace)
Mengirimkan *payload JSON* penuh persis seperti `POST` untuk me-replace (mengganti) dokumen lama.
4. **`PATCH /{modul}/{id}`** (Partial Update)
Menggunakan standar *JSON Patch (RFC 6902)* untuk mengubah satu/beberapa *field* spesifik tanpa mengubah keseluruhan dokumen.
**Contoh Request Body (Array of Objects):**
```json
[
{
"op": "replace",
"path": "/status",
"value": "finished"
}
]
```