satusehat-integration 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. satusehat_integration-0.1.0/PKG-INFO +11 -0
  2. satusehat_integration-0.1.0/README.md +184 -0
  3. satusehat_integration-0.1.0/pyproject.toml +9 -0
  4. satusehat_integration-0.1.0/setup.cfg +4 -0
  5. satusehat_integration-0.1.0/src/__init__.py +1 -0
  6. satusehat_integration-0.1.0/src/builder/__init__.py +227 -0
  7. satusehat_integration-0.1.0/src/builder/account.py +67 -0
  8. satusehat_integration-0.1.0/src/builder/adverse_event.py +31 -0
  9. satusehat_integration-0.1.0/src/builder/allergy_intolerance.py +48 -0
  10. satusehat_integration-0.1.0/src/builder/appointment.py +31 -0
  11. satusehat_integration-0.1.0/src/builder/appointment_response.py +31 -0
  12. satusehat_integration-0.1.0/src/builder/audit_event.py +31 -0
  13. satusehat_integration-0.1.0/src/builder/base_builder.py +26 -0
  14. satusehat_integration-0.1.0/src/builder/basic.py +31 -0
  15. satusehat_integration-0.1.0/src/builder/binary.py +31 -0
  16. satusehat_integration-0.1.0/src/builder/biologically_derived_product.py +31 -0
  17. satusehat_integration-0.1.0/src/builder/body_structure.py +31 -0
  18. satusehat_integration-0.1.0/src/builder/bundle.py +150 -0
  19. satusehat_integration-0.1.0/src/builder/care_plan.py +92 -0
  20. satusehat_integration-0.1.0/src/builder/care_team.py +31 -0
  21. satusehat_integration-0.1.0/src/builder/charge_item.py +87 -0
  22. satusehat_integration-0.1.0/src/builder/charge_item_definition.py +32 -0
  23. satusehat_integration-0.1.0/src/builder/charge_item_response.py +26 -0
  24. satusehat_integration-0.1.0/src/builder/claim.py +141 -0
  25. satusehat_integration-0.1.0/src/builder/claim_response.py +112 -0
  26. satusehat_integration-0.1.0/src/builder/clinical_impression.py +38 -0
  27. satusehat_integration-0.1.0/src/builder/communication.py +31 -0
  28. satusehat_integration-0.1.0/src/builder/communication_request.py +31 -0
  29. satusehat_integration-0.1.0/src/builder/composition.py +83 -0
  30. satusehat_integration-0.1.0/src/builder/condition.py +163 -0
  31. satusehat_integration-0.1.0/src/builder/consent.py +31 -0
  32. satusehat_integration-0.1.0/src/builder/contract.py +31 -0
  33. satusehat_integration-0.1.0/src/builder/coverage.py +31 -0
  34. satusehat_integration-0.1.0/src/builder/coverage_eligibility_request.py +35 -0
  35. satusehat_integration-0.1.0/src/builder/coverage_eligibility_response.py +32 -0
  36. satusehat_integration-0.1.0/src/builder/detected_issue.py +31 -0
  37. satusehat_integration-0.1.0/src/builder/device.py +111 -0
  38. satusehat_integration-0.1.0/src/builder/device_definition.py +31 -0
  39. satusehat_integration-0.1.0/src/builder/device_request.py +31 -0
  40. satusehat_integration-0.1.0/src/builder/device_use_statement.py +31 -0
  41. satusehat_integration-0.1.0/src/builder/diagnostic_report.py +109 -0
  42. satusehat_integration-0.1.0/src/builder/document_reference.py +104 -0
  43. satusehat_integration-0.1.0/src/builder/effect_evidence_synthesis.py +31 -0
  44. satusehat_integration-0.1.0/src/builder/encounter.py +134 -0
  45. satusehat_integration-0.1.0/src/builder/enrollment_request.py +31 -0
  46. satusehat_integration-0.1.0/src/builder/episode_of_care.py +60 -0
  47. satusehat_integration-0.1.0/src/builder/event_definition.py +31 -0
  48. satusehat_integration-0.1.0/src/builder/evidence.py +31 -0
  49. satusehat_integration-0.1.0/src/builder/evidence_variable.py +31 -0
  50. satusehat_integration-0.1.0/src/builder/example_scenario.py +31 -0
  51. satusehat_integration-0.1.0/src/builder/family_member_history.py +23 -0
  52. satusehat_integration-0.1.0/src/builder/flag.py +31 -0
  53. satusehat_integration-0.1.0/src/builder/genomic_study.py +23 -0
  54. satusehat_integration-0.1.0/src/builder/goal.py +71 -0
  55. satusehat_integration-0.1.0/src/builder/group.py +20 -0
  56. satusehat_integration-0.1.0/src/builder/guidance_response.py +31 -0
  57. satusehat_integration-0.1.0/src/builder/imaging_manifest.py +31 -0
  58. satusehat_integration-0.1.0/src/builder/imaging_selection.py +31 -0
  59. satusehat_integration-0.1.0/src/builder/imaging_study.py +98 -0
  60. satusehat_integration-0.1.0/src/builder/immunization.py +83 -0
  61. satusehat_integration-0.1.0/src/builder/immunization_evaluation.py +31 -0
  62. satusehat_integration-0.1.0/src/builder/immunization_recommendation.py +31 -0
  63. satusehat_integration-0.1.0/src/builder/invoice.py +130 -0
  64. satusehat_integration-0.1.0/src/builder/library.py +31 -0
  65. satusehat_integration-0.1.0/src/builder/linkage.py +31 -0
  66. satusehat_integration-0.1.0/src/builder/list_resource.py +40 -0
  67. satusehat_integration-0.1.0/src/builder/location.py +73 -0
  68. satusehat_integration-0.1.0/src/builder/measure.py +31 -0
  69. satusehat_integration-0.1.0/src/builder/measure_report.py +31 -0
  70. satusehat_integration-0.1.0/src/builder/media.py +31 -0
  71. satusehat_integration-0.1.0/src/builder/medication.py +40 -0
  72. satusehat_integration-0.1.0/src/builder/medication_administration.py +26 -0
  73. satusehat_integration-0.1.0/src/builder/medication_dispense.py +26 -0
  74. satusehat_integration-0.1.0/src/builder/medication_request.py +64 -0
  75. satusehat_integration-0.1.0/src/builder/medication_statement.py +26 -0
  76. satusehat_integration-0.1.0/src/builder/message_definition.py +31 -0
  77. satusehat_integration-0.1.0/src/builder/message_header.py +31 -0
  78. satusehat_integration-0.1.0/src/builder/molecular_sequence.py +99 -0
  79. satusehat_integration-0.1.0/src/builder/nutrition_order.py +20 -0
  80. satusehat_integration-0.1.0/src/builder/observation.py +139 -0
  81. satusehat_integration-0.1.0/src/builder/operation_outcome.py +31 -0
  82. satusehat_integration-0.1.0/src/builder/organization.py +62 -0
  83. satusehat_integration-0.1.0/src/builder/patient.py +52 -0
  84. satusehat_integration-0.1.0/src/builder/payment_notice.py +23 -0
  85. satusehat_integration-0.1.0/src/builder/payment_reconciliation.py +23 -0
  86. satusehat_integration-0.1.0/src/builder/person.py +31 -0
  87. satusehat_integration-0.1.0/src/builder/plan_definition.py +31 -0
  88. satusehat_integration-0.1.0/src/builder/practitioner.py +54 -0
  89. satusehat_integration-0.1.0/src/builder/practitioner_role.py +69 -0
  90. satusehat_integration-0.1.0/src/builder/procedure.py +164 -0
  91. satusehat_integration-0.1.0/src/builder/provenance.py +31 -0
  92. satusehat_integration-0.1.0/src/builder/questionnaire.py +31 -0
  93. satusehat_integration-0.1.0/src/builder/questionnaire_response.py +23 -0
  94. satusehat_integration-0.1.0/src/builder/related_person.py +77 -0
  95. satusehat_integration-0.1.0/src/builder/request_group.py +31 -0
  96. satusehat_integration-0.1.0/src/builder/research_definition.py +31 -0
  97. satusehat_integration-0.1.0/src/builder/research_element_definition.py +31 -0
  98. satusehat_integration-0.1.0/src/builder/research_subject.py +31 -0
  99. satusehat_integration-0.1.0/src/builder/risk_assessment.py +78 -0
  100. satusehat_integration-0.1.0/src/builder/risk_evidence_synthesis.py +31 -0
  101. satusehat_integration-0.1.0/src/builder/schedule.py +31 -0
  102. satusehat_integration-0.1.0/src/builder/search_parameter.py +31 -0
  103. satusehat_integration-0.1.0/src/builder/service_request.py +117 -0
  104. satusehat_integration-0.1.0/src/builder/slot.py +31 -0
  105. satusehat_integration-0.1.0/src/builder/specimen.py +75 -0
  106. satusehat_integration-0.1.0/src/builder/subscription.py +31 -0
  107. satusehat_integration-0.1.0/src/builder/substance.py +20 -0
  108. satusehat_integration-0.1.0/src/builder/substance_nucleic_acid.py +31 -0
  109. satusehat_integration-0.1.0/src/builder/substance_polymer.py +31 -0
  110. satusehat_integration-0.1.0/src/builder/substance_protein.py +31 -0
  111. satusehat_integration-0.1.0/src/builder/substance_source_material.py +31 -0
  112. satusehat_integration-0.1.0/src/builder/substance_specification.py +31 -0
  113. satusehat_integration-0.1.0/src/builder/supply_delivery.py +31 -0
  114. satusehat_integration-0.1.0/src/builder/supply_request.py +31 -0
  115. satusehat_integration-0.1.0/src/builder/task.py +115 -0
  116. satusehat_integration-0.1.0/src/builder/test_report.py +31 -0
  117. satusehat_integration-0.1.0/src/builder/test_script.py +31 -0
  118. satusehat_integration-0.1.0/src/builder/verification_result.py +31 -0
  119. satusehat_integration-0.1.0/src/datatype/__init__.py +69 -0
  120. satusehat_integration-0.1.0/src/datatype/datatype.py +6 -0
  121. satusehat_integration-0.1.0/src/datatype/datatypes.py +613 -0
  122. satusehat_integration-0.1.0/src/datatype/test_datatypes.py +13 -0
  123. satusehat_integration-0.1.0/src/queue/error_classifier.py +10 -0
  124. satusehat_integration-0.1.0/src/queue/monitor.py +5 -0
  125. satusehat_integration-0.1.0/src/queue/rate_limiter.py +15 -0
  126. satusehat_integration-0.1.0/src/satusehat_integration.egg-info/PKG-INFO +11 -0
  127. satusehat_integration-0.1.0/src/satusehat_integration.egg-info/SOURCES.txt +128 -0
  128. satusehat_integration-0.1.0/src/satusehat_integration.egg-info/dependency_links.txt +1 -0
  129. satusehat_integration-0.1.0/src/satusehat_integration.egg-info/requires.txt +7 -0
  130. satusehat_integration-0.1.0/src/satusehat_integration.egg-info/top_level.txt +4 -0
@@ -0,0 +1,11 @@
1
+ Metadata-Version: 2.4
2
+ Name: satusehat-integration
3
+ Version: 0.1.0
4
+ Summary: SATUSEHAT FHIR R4 SDK for Python
5
+ Requires-Python: >=3.10
6
+ Requires-Dist: requests>=2.31
7
+ Requires-Dist: pydantic>=2.0
8
+ Provides-Extra: dev
9
+ Requires-Dist: pytest; extra == "dev"
10
+ Requires-Dist: pytest-cov; extra == "dev"
11
+ Requires-Dist: ruff; extra == "dev"
@@ -0,0 +1,184 @@
1
+ # satusehat-integration-python
2
+
3
+ > **Open-source Python SDK for integrating with SATUSEHAT** — Indonesia's national health data platform powered by FHIR R4. Pure Python, no framework dependency.
4
+
5
+ [![Python](https://img.shields.io/badge/Python-3.10%2B-blue)](https://python.org)
6
+ [![FHIR R4](https://img.shields.io/badge/FHIR-R4-orange)](https://hl7.org/fhir/R4/)
7
+ [![License](https://img.shields.io/badge/License-MIT-green)](LICENSE)
8
+ [![CI](https://github.com/ivanwilliammd/satusehat-integration-python/actions/workflows/ci.yml/badge.svg)](https://github.com/ivanwilliammd/satusehat-integration-python/actions)
9
+
10
+ ---
11
+
12
+ ## Overview
13
+
14
+ `satusehat-integration-python` is an **open-source** Python SDK for integrating with **SATUSEHAT** — Indonesia's national health data platform powered by FHIR R4.
15
+
16
+ Built on the official [SATUSEHAT Platform Guidelines](https://satusehat.kemkes.go.id/platform/docs). Ships with:
17
+ - **50 DataType** classes — composable FHIR R4 value objects with `to_json()` serialization
18
+ - **50 PayloadBuilder** classes — fluent builders for all FHIR resources (Patient, Practitioner, Organization, etc.)
19
+ - **Queue + Rate Limiter** — in-memory queue with configurable RPM rate limiting
20
+
21
+ Zero dependencies beyond standard library. Works standalone or with Django/FastAPI/Flask.
22
+
23
+ ---
24
+
25
+ ## Requirements
26
+
27
+ - Python 3.10 or later
28
+
29
+ ---
30
+
31
+ ## Quick Install
32
+
33
+ ```bash
34
+ pip install satusehat-integration-python
35
+ # or
36
+ git clone https://github.com/ivanwilliammd/satusehat-integration-python.git
37
+ cd satusehat-integration-python && pip install -e .
38
+ ```
39
+
40
+ ```env
41
+ # .env
42
+ SATUSEHAT_ENV=DEV # DEV | STG | PROD
43
+ SATUSEHAT_BASE_URL_DEV=https://api-satusehat-dev.dto.kemkes.go.id
44
+ CLIENTID_DEV=your_client_id
45
+ CLIENTSECRET_DEV=your_client_secret
46
+ ORGID_DEV=your_org_id
47
+ ```
48
+
49
+ ---
50
+
51
+ ## Architecture
52
+
53
+ ### DataType Classes (`src/datatype/`)
54
+
55
+ Atomic FHIR R4 value objects. All provide a `to_json()` method — nested types serialize to clean FHIR JSON automatically.
56
+
57
+ | Category | Classes |
58
+ |----------|---------|
59
+ | Core | `Coding`, `CodeableConcept`, `Identifier`, `ContactPoint`, `Address`, `HumanName`, `Reference` |
60
+ | Quantity | `Age`, `Quantity` |
61
+ | Utility | `Period`, `ParameterComponent` |
62
+
63
+ Example — `HumanName`:
64
+
65
+ ```python
66
+ from src.datatype.datatypes import HumanName
67
+
68
+ name = HumanName(
69
+ family='Doe',
70
+ given=['John', 'Michael'],
71
+ use='official'
72
+ )
73
+ # name.to_json() → {'family': 'Doe', 'given': ['John', 'Michael'], 'use': 'official'}
74
+ ```
75
+
76
+ ### PayloadBuilder Pattern (`src/builder/`)
77
+
78
+ Fluent builder for each FHIR resource. Each builder exposes chainable methods and returns the resource payload via `to_json()`.
79
+
80
+ ```python
81
+ from src.builder.payload_builders import PatientBuilder, HumanName
82
+
83
+ patient = PatientBuilder()
84
+ patient.add_name(HumanName(family='Doe', given=['John'], use='official').to_json())
85
+ patient.set_gender('male')
86
+ patient.set_birth_date('1990-01-15')
87
+
88
+ payload = patient.to_json()
89
+ ```
90
+
91
+ ---
92
+
93
+ ## Supported FHIR Resources
94
+
95
+ All 51 resources fully implemented via PayloadBuilder classes. Core (✅) + Non-Core (💼):
96
+
97
+ | # | Resource | Notes |
98
+ |---|----------|-------|
99
+ | 1 | Patient | ✅ MPI |
100
+ | 2 | Practitioner | ✅ SDMK |
101
+ | 3 | PractitionerRole | ✅ |
102
+ | 4 | Organization | ✅ MSI |
103
+ | 5 | Location | ✅ |
104
+ | 6 | Encounter | ✅ |
105
+ | 7 | Condition | ✅ |
106
+ | 8 | Observation | ✅ |
107
+ | 9 | Procedure | ✅ |
108
+ | 10 | MedicationRequest | ✅ |
109
+ | 11 | Bundle | ✅ batch/transaction |
110
+ | 12–37 | CarePlan through Task | ✅ |
111
+ | 38–50 | Account through Invoice | 💼 Billing/Claim resources |
112
+
113
+ ---
114
+
115
+ ## Usage Examples
116
+
117
+ ### Patient
118
+
119
+ ```python
120
+ from src.builder.payload_builders import PatientBuilder
121
+
122
+ patient = PatientBuilder()
123
+ patient.add_name({
124
+ 'family': 'Doe',
125
+ 'given': ['John'],
126
+ 'use': 'official'
127
+ })
128
+ patient.set_gender('male')
129
+ patient.set_birth_date('1990-01-15')
130
+ patient.add_telecom({'system': 'phone', 'value': '081234567890', 'use': 'mobile'})
131
+
132
+ payload = patient.to_json()
133
+ print(payload)
134
+ ```
135
+
136
+ ### Claim (BPJS Klaim)
137
+
138
+ ```python
139
+ from src.builder.payload_builders import ClaimBuilder
140
+
141
+ claim = ClaimBuilder()
142
+ claim.set_status('active')
143
+ claim.set_use('claim')
144
+ claim.set_type('institutional')
145
+ claim.set_patient('pat-123', 'enc-456')
146
+ claim.add_item(1, 'PROCID001', 150000, 'IDR')
147
+ claim.set_total(150000, 'IDR')
148
+
149
+ payload = claim.to_json()
150
+ ```
151
+
152
+ ---
153
+
154
+ ## Documentation
155
+
156
+ | Page | Description |
157
+ |------|-------------|
158
+ | [Wiki Home](https://github.com/ivanwilliammd/satusehat-integration-python.wiki.git) | Full documentation |
159
+ | [Getting Started](https://github.com/ivanwilliammd/satusehat-integration-python/wiki/Getting-Started) | Installation, configuration |
160
+ | [DataTypes](https://github.com/ivanwilliammd/satusehat-integration-python/wiki/DataTypes) | Complete type reference |
161
+ | [Builders](https://github.com/ivanwilliammd/satusehat-integration-python/wiki/Builders) | Builder usage guide |
162
+ | [Resources](https://github.com/ivanwilliammd/satusehat-integration-python/wiki/Resources) | All FHIR resources |
163
+ | [Claim Module](https://github.com/ivanwilliammd/satusehat-integration-python/wiki/Claim-Module) | BPJS Klaim integration |
164
+
165
+ ---
166
+
167
+ ## External Resources
168
+
169
+ - [HL7 FHIR R4 Specification](https://hl7.org/fhir/R4/)
170
+ - [SATUSEHAT Platform Docs](https://satusehat.kemkes.go.id/platform/docs)
171
+ - [Main PHP SDK](https://github.com/ivanwilliammd/satusehat-integration)
172
+ - [SATUSEHAT Sandbox API](https://api-satusehat-dev.dto.kemkes.go.id)
173
+
174
+ ---
175
+
176
+ ## Contributing
177
+
178
+ Contributions are welcome. Please ensure tests pass and follow existing code conventions.
179
+
180
+ ---
181
+
182
+ ## License
183
+
184
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,9 @@
1
+ [project]
2
+ name = "satusehat-integration"
3
+ version = "0.1.0"
4
+ description = "SATUSEHAT FHIR R4 SDK for Python"
5
+ requires-python = ">=3.10"
6
+ dependencies = ["requests>=2.31", "pydantic>=2.0"]
7
+
8
+ [project.optional-dependencies]
9
+ dev = ["pytest", "pytest-cov", "ruff"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1 @@
1
+ # src package
@@ -0,0 +1,227 @@
1
+ from src.builder.account import AccountBuilder
2
+ from src.builder.adverse_event import AdverseEventBuilder
3
+ from src.builder.allergy_intolerance import AllergyIntoleranceBuilder
4
+ from src.builder.appointment import AppointmentBuilder
5
+ from src.builder.appointment_response import AppointmentResponseBuilder
6
+ from src.builder.audit_event import AuditEventBuilder
7
+ from src.builder.base_builder import BaseBuilder
8
+ from src.builder.basic import BasicBuilder
9
+ from src.builder.binary import BinaryBuilder
10
+ from src.builder.biologically_derived_product import BiologicallyDerivedProductBuilder
11
+ from src.builder.body_structure import BodyStructureBuilder
12
+ from src.builder.bundle import BundleBuilder
13
+ from src.builder.care_plan import CarePlanBuilder
14
+ from src.builder.care_team import CareTeamBuilder
15
+ from src.builder.charge_item import ChargeItemBuilder
16
+ from src.builder.charge_item_definition import ChargeItemDefinitionBuilder
17
+ from src.builder.charge_item_response import ChargeItemResponseBuilder
18
+ from src.builder.claim import ClaimBuilder
19
+ from src.builder.claim_response import ClaimResponseBuilder
20
+ from src.builder.clinical_impression import ClinicalImpressionBuilder
21
+ from src.builder.communication import CommunicationBuilder
22
+ from src.builder.communication_request import CommunicationRequestBuilder
23
+ from src.builder.composition import CompositionBuilder
24
+ from src.builder.condition import ConditionBuilder
25
+ from src.builder.consent import ConsentBuilder
26
+ from src.builder.contract import ContractBuilder
27
+ from src.builder.coverage import CoverageBuilder
28
+ from src.builder.coverage_eligibility_request import CoverageEligibilityRequestBuilder
29
+ from src.builder.coverage_eligibility_response import CoverageEligibilityResponseBuilder
30
+ from src.builder.detected_issue import DetectedIssueBuilder
31
+ from src.builder.device import DeviceBuilder
32
+ from src.builder.device_definition import DeviceDefinitionBuilder
33
+ from src.builder.device_request import DeviceRequestBuilder
34
+ from src.builder.device_use_statement import DeviceUseStatementBuilder
35
+ from src.builder.diagnostic_report import DiagnosticReportBuilder
36
+ from src.builder.document_reference import DocumentReferenceBuilder
37
+ from src.builder.effect_evidence_synthesis import EffectEvidenceSynthesisBuilder
38
+ from src.builder.encounter import EncounterBuilder
39
+ from src.builder.enrollment_request import EnrollmentRequestBuilder
40
+ from src.builder.episode_of_care import EpisodeOfCareBuilder
41
+ from src.builder.event_definition import EventDefinitionBuilder
42
+ from src.builder.evidence import EvidenceBuilder
43
+ from src.builder.evidence_variable import EvidenceVariableBuilder
44
+ from src.builder.example_scenario import ExampleScenarioBuilder
45
+ from src.builder.family_member_history import FamilyMemberHistoryBuilder
46
+ from src.builder.flag import FlagBuilder
47
+ from src.builder.genomic_study import GenomicStudyBuilder
48
+ from src.builder.goal import GoalBuilder
49
+ from src.builder.group import GroupBuilder
50
+ from src.builder.guidance_response import GuidanceResponseBuilder
51
+ from src.builder.imaging_manifest import ImagingManifestBuilder
52
+ from src.builder.imaging_selection import ImagingSelectionBuilder
53
+ from src.builder.imaging_study import ImagingStudyBuilder
54
+ from src.builder.immunization import ImmunizationBuilder
55
+ from src.builder.immunization_evaluation import ImmunizationEvaluationBuilder
56
+ from src.builder.immunization_recommendation import ImmunizationRecommendationBuilder
57
+ from src.builder.invoice import InvoiceBuilder
58
+ from src.builder.library import LibraryBuilder
59
+ from src.builder.linkage import LinkageBuilder
60
+ from src.builder.list_resource import ListResourceBuilder
61
+ from src.builder.location import LocationBuilder
62
+ from src.builder.measure import MeasureBuilder
63
+ from src.builder.measure_report import MeasureReportBuilder
64
+ from src.builder.media import MediaBuilder
65
+ from src.builder.medication import MedicationBuilder
66
+ from src.builder.medication_administration import MedicationAdministrationBuilder
67
+ from src.builder.medication_dispense import MedicationDispenseBuilder
68
+ from src.builder.medication_request import MedicationRequestBuilder
69
+ from src.builder.medication_statement import MedicationStatementBuilder
70
+ from src.builder.message_definition import MessageDefinitionBuilder
71
+ from src.builder.message_header import MessageHeaderBuilder
72
+ from src.builder.molecular_sequence import MolecularSequenceBuilder
73
+ from src.builder.nutrition_order import NutritionOrderBuilder
74
+ from src.builder.observation import ObservationBuilder
75
+ from src.builder.operation_outcome import OperationOutcomeBuilder
76
+ from src.builder.organization import OrganizationBuilder
77
+ from src.builder.patient import PatientBuilder
78
+ from src.builder.payment_notice import PaymentNoticeBuilder
79
+ from src.builder.payment_reconciliation import PaymentReconciliationBuilder
80
+ from src.builder.person import PersonBuilder
81
+ from src.builder.plan_definition import PlanDefinitionBuilder
82
+ from src.builder.practitioner import PractitionerBuilder
83
+ from src.builder.practitioner_role import PractitionerRoleBuilder
84
+ from src.builder.procedure import ProcedureBuilder
85
+ from src.builder.provenance import ProvenanceBuilder
86
+ from src.builder.questionnaire import QuestionnaireBuilder
87
+ from src.builder.questionnaire_response import QuestionnaireResponseBuilder
88
+ from src.builder.related_person import RelatedPersonBuilder
89
+ from src.builder.request_group import RequestGroupBuilder
90
+ from src.builder.research_definition import ResearchDefinitionBuilder
91
+ from src.builder.research_element_definition import ResearchElementDefinitionBuilder
92
+ from src.builder.research_subject import ResearchSubjectBuilder
93
+ from src.builder.risk_assessment import RiskAssessmentBuilder
94
+ from src.builder.risk_evidence_synthesis import RiskEvidenceSynthesisBuilder
95
+ from src.builder.schedule import ScheduleBuilder
96
+ from src.builder.search_parameter import SearchParameterBuilder
97
+ from src.builder.service_request import ServiceRequestBuilder
98
+ from src.builder.slot import SlotBuilder
99
+ from src.builder.specimen import SpecimenBuilder
100
+ from src.builder.substance import SubstanceBuilder
101
+ from src.builder.substance_nucleic_acid import SubstanceNucleicAcidBuilder
102
+ from src.builder.substance_polymer import SubstancePolymerBuilder
103
+ from src.builder.substance_protein import SubstanceProteinBuilder
104
+ from src.builder.substance_source_material import SubstanceSourceMaterialBuilder
105
+ from src.builder.substance_specification import SubstanceSpecificationBuilder
106
+ from src.builder.subscription import SubscriptionBuilder
107
+ from src.builder.supply_delivery import SupplyDeliveryBuilder
108
+ from src.builder.supply_request import SupplyRequestBuilder
109
+ from src.builder.task import TaskBuilder
110
+ from src.builder.test_report import TestReportBuilder
111
+ from src.builder.test_script import TestScriptBuilder
112
+ from src.builder.verification_result import VerificationResultBuilder
113
+
114
+ __all__ = [
115
+ "AccountBuilder",
116
+ "AdverseEventBuilder",
117
+ "AllergyIntoleranceBuilder",
118
+ "AppointmentBuilder",
119
+ "AppointmentResponseBuilder",
120
+ "AuditEventBuilder",
121
+ "BaseBuilder",
122
+ "BasicBuilder",
123
+ "BinaryBuilder",
124
+ "BiologicallyDerivedProductBuilder",
125
+ "BodyStructureBuilder",
126
+ "BundleBuilder",
127
+ "CarePlanBuilder",
128
+ "CareTeamBuilder",
129
+ "ChargeItemBuilder",
130
+ "ChargeItemDefinitionBuilder",
131
+ "ChargeItemResponseBuilder",
132
+ "ClaimBuilder",
133
+ "ClaimResponseBuilder",
134
+ "ClinicalImpressionBuilder",
135
+ "CommunicationBuilder",
136
+ "CommunicationRequestBuilder",
137
+ "CompositionBuilder",
138
+ "ConditionBuilder",
139
+ "ConsentBuilder",
140
+ "ContractBuilder",
141
+ "CoverageBuilder",
142
+ "CoverageEligibilityRequestBuilder",
143
+ "CoverageEligibilityResponseBuilder",
144
+ "DetectedIssueBuilder",
145
+ "DeviceBuilder",
146
+ "DeviceDefinitionBuilder",
147
+ "DeviceRequestBuilder",
148
+ "DeviceUseStatementBuilder",
149
+ "DiagnosticReportBuilder",
150
+ "DocumentReferenceBuilder",
151
+ "EffectEvidenceSynthesisBuilder",
152
+ "EncounterBuilder",
153
+ "EnrollmentRequestBuilder",
154
+ "EpisodeOfCareBuilder",
155
+ "EventDefinitionBuilder",
156
+ "EvidenceBuilder",
157
+ "EvidenceVariableBuilder",
158
+ "ExampleScenarioBuilder",
159
+ "FamilyMemberHistoryBuilder",
160
+ "FlagBuilder",
161
+ "GenomicStudyBuilder",
162
+ "GoalBuilder",
163
+ "GroupBuilder",
164
+ "GuidanceResponseBuilder",
165
+ "ImagingManifestBuilder",
166
+ "ImagingSelectionBuilder",
167
+ "ImagingStudyBuilder",
168
+ "ImmunizationBuilder",
169
+ "ImmunizationEvaluationBuilder",
170
+ "ImmunizationRecommendationBuilder",
171
+ "InvoiceBuilder",
172
+ "LibraryBuilder",
173
+ "LinkageBuilder",
174
+ "ListResourceBuilder",
175
+ "LocationBuilder",
176
+ "MeasureBuilder",
177
+ "MeasureReportBuilder",
178
+ "MediaBuilder",
179
+ "MedicationBuilder",
180
+ "MedicationAdministrationBuilder",
181
+ "MedicationDispenseBuilder",
182
+ "MedicationRequestBuilder",
183
+ "MedicationStatementBuilder",
184
+ "MessageDefinitionBuilder",
185
+ "MessageHeaderBuilder",
186
+ "MolecularSequenceBuilder",
187
+ "NutritionOrderBuilder",
188
+ "ObservationBuilder",
189
+ "OperationOutcomeBuilder",
190
+ "OrganizationBuilder",
191
+ "PatientBuilder",
192
+ "PaymentNoticeBuilder",
193
+ "PaymentReconciliationBuilder",
194
+ "PersonBuilder",
195
+ "PlanDefinitionBuilder",
196
+ "PractitionerBuilder",
197
+ "PractitionerRoleBuilder",
198
+ "ProcedureBuilder",
199
+ "ProvenanceBuilder",
200
+ "QuestionnaireBuilder",
201
+ "QuestionnaireResponseBuilder",
202
+ "RelatedPersonBuilder",
203
+ "RequestGroupBuilder",
204
+ "ResearchDefinitionBuilder",
205
+ "ResearchElementDefinitionBuilder",
206
+ "ResearchSubjectBuilder",
207
+ "RiskAssessmentBuilder",
208
+ "RiskEvidenceSynthesisBuilder",
209
+ "ScheduleBuilder",
210
+ "SearchParameterBuilder",
211
+ "ServiceRequestBuilder",
212
+ "SlotBuilder",
213
+ "SpecimenBuilder",
214
+ "SubstanceBuilder",
215
+ "SubstanceNucleicAcidBuilder",
216
+ "SubstancePolymerBuilder",
217
+ "SubstanceProteinBuilder",
218
+ "SubstanceSourceMaterialBuilder",
219
+ "SubstanceSpecificationBuilder",
220
+ "SubscriptionBuilder",
221
+ "SupplyDeliveryBuilder",
222
+ "SupplyRequestBuilder",
223
+ "TaskBuilder",
224
+ "TestReportBuilder",
225
+ "TestScriptBuilder",
226
+ "VerificationResultBuilder",
227
+ ]
@@ -0,0 +1,67 @@
1
+ """Account resource builder for SATUSEHAT FHIR R4."""
2
+ from typing import List, Optional
3
+ from src.builder.base_builder import BaseBuilder
4
+
5
+
6
+ class AccountBuilder(BaseBuilder):
7
+ """Builder for Account resource."""
8
+
9
+ def __init__(self):
10
+ super().__init__("Account")
11
+ def set_id(self, id: str) -> "AccountBuilder":
12
+ self.data["id"] = id
13
+ return self
14
+
15
+ def set_status(self, status: str) -> "AccountBuilder":
16
+ self.data["status"] = status
17
+ return self
18
+
19
+ def set_type(self, code: str, system: str, display: Optional[str] = None) -> "AccountBuilder":
20
+ self.data["type"] = {"coding": [{"system": system, "code": code}]}
21
+ if display:
22
+ self.data["type"]["coding"][0]["display"] = display
23
+ return self
24
+
25
+ def set_name(self, name: str) -> "AccountBuilder":
26
+ self.data["name"] = name
27
+ return self
28
+
29
+ def set_subject(self, reference: str, display: Optional[str] = None) -> "AccountBuilder":
30
+ self.data["subject"] = {"reference": reference}
31
+ if display:
32
+ self.data["subject"]["display"] = display
33
+ return self
34
+
35
+ def set_service_period(self, start: Optional[str] = None, end: Optional[str] = None) -> "AccountBuilder":
36
+ period: dict = {}
37
+ if start:
38
+ period["start"] = start
39
+ if end:
40
+ period["end"] = end
41
+ self.data["servicePeriod"] = period
42
+ return self
43
+
44
+ def add_coverage(
45
+ self,
46
+ coverage_reference: str,
47
+ priority: Optional[int] = None,
48
+ coverage_display: Optional[str] = None
49
+ ) -> "AccountBuilder":
50
+ self.data.setdefault("coverage", [])
51
+ cov: dict = {"coverage": {"reference": coverage_reference}}
52
+ if priority:
53
+ cov["priority"] = priority
54
+ if coverage_display:
55
+ cov["coverage"]["display"] = coverage_display
56
+ self.data["coverage"].append(cov)
57
+ return self
58
+
59
+ def set_owner(self, reference: str, display: Optional[str] = None) -> "AccountBuilder":
60
+ self.data["owner"] = {"reference": reference}
61
+ if display:
62
+ self.data["owner"]["display"] = display
63
+ return self
64
+
65
+ def set_description(self, description: str) -> "AccountBuilder":
66
+ self.data["description"] = description
67
+ return self
@@ -0,0 +1,31 @@
1
+ from typing import Optional
2
+ from src.builder.base_builder import BaseBuilder
3
+
4
+
5
+ class AdverseEventBuilder(BaseBuilder):
6
+ def __init__(self) -> None:
7
+ super().__init__("AdverseEvent")
8
+
9
+ def set_id(id: str) -> "AdverseEventBuilder":
10
+ self._set("id", id)
11
+ return self
12
+
13
+ def add_identifier(system: str, value: str) -> "AdverseEventBuilder":
14
+ self._append("identifier", {"system": system, "value": value})
15
+ return self
16
+
17
+ def set_status(status: str) -> "AdverseEventBuilder":
18
+ self._set("status", status)
19
+ return self
20
+
21
+ def set_code(code: dict) -> "AdverseEventBuilder":
22
+ self._set("code", code)
23
+ return self
24
+
25
+ def set_subject(reference: str, display: str = None) -> "AdverseEventBuilder":
26
+ self._set("subject", {"reference": reference, "display": display}) if display else self._set("subject", {"reference": reference})
27
+ return self
28
+
29
+ def set_description(description: str) -> "AdverseEventBuilder":
30
+ self._set("description", description)
31
+ return self
@@ -0,0 +1,48 @@
1
+ from src.builder.base_builder import BaseBuilder
2
+
3
+ class AllergyIntoleranceBuilder(BaseBuilder):
4
+ def __init__(self) -> None:
5
+ super().__init__("AllergyIntolerance")
6
+
7
+ def identifier(self, identifier: dict) -> "AllergyIntoleranceBuilder":
8
+ return self._push("identifier", identifier)
9
+
10
+ def clinical_status(self, code: str, system: str = "http://terminology.kemkes.go.id/CodeSystem/allergyintolerance-clinical", display: str = "") -> "AllergyIntoleranceBuilder":
11
+ v = {"coding": [{"system": system, "code": code, "display": display}]}
12
+ return self._set("clinicalStatus", v)
13
+
14
+ def verification_status(self, code: str, system: str = "http://terminology.kemkes.go.id/CodeSystem/allergyintolerance-verification", display: str = "") -> "AllergyIntoleranceBuilder":
15
+ return self._set("verificationStatus", {"coding": [{"system": system, "code": code, "display": display}]})
16
+
17
+ def type(self, code: str, system: str = "http://terminology.kemkes.go.id/CodeSystem/allergyintolerance-type", display: str = "") -> "AllergyIntoleranceBuilder":
18
+ return self._set("type", {"coding": [{"system": system, "code": code, "display": display}]})
19
+
20
+ def category(self, value: str) -> "AllergyIntoleranceBuilder":
21
+ return self._set("category", [value])
22
+
23
+ def code(self, codeable_concept: dict) -> "AllergyIntoleranceBuilder":
24
+ return self._set("code", codeable_concept)
25
+
26
+ def patient(self, reference: str, display: str = "") -> "AllergyIntoleranceBuilder":
27
+ sub = {"reference": reference}
28
+ if display:
29
+ sub["display"] = display
30
+ return self._set("patient", sub)
31
+
32
+ def encounter(self, reference: str) -> "AllergyIntoleranceBuilder":
33
+ return self._set("encounter", {"reference": reference})
34
+
35
+ def onset_date_time(self, value: str) -> "AllergyIntoleranceBuilder":
36
+ return self._set("onsetDateTime", value)
37
+
38
+ def recorded_date(self, value: str) -> "AllergyIntoleranceBuilder":
39
+ return self._set("recordedDate", value)
40
+
41
+ def recorder(self, reference: str) -> "AllergyIntoleranceBuilder":
42
+ return self._set("recorder", {"reference": reference})
43
+
44
+ def asserter(self, reference: str) -> "AllergyIntoleranceBuilder":
45
+ return self._set("asserter", {"reference": reference})
46
+
47
+ def note(self, text: str) -> "AllergyIntoleranceBuilder":
48
+ return self._set("note", [{"text": text}])
@@ -0,0 +1,31 @@
1
+ from typing import Optional
2
+ from src.builder.base_builder import BaseBuilder
3
+
4
+
5
+ class AppointmentBuilder(BaseBuilder):
6
+ def __init__(self) -> None:
7
+ super().__init__("Appointment")
8
+
9
+ def set_id(id: str) -> "AppointmentBuilder":
10
+ self._set("id", id)
11
+ return self
12
+
13
+ def add_identifier(system: str, value: str) -> "AppointmentBuilder":
14
+ self._append("identifier", {"system": system, "value": value})
15
+ return self
16
+
17
+ def set_status(status: str) -> "AppointmentBuilder":
18
+ self._set("status", status)
19
+ return self
20
+
21
+ def set_code(code: dict) -> "AppointmentBuilder":
22
+ self._set("code", code)
23
+ return self
24
+
25
+ def set_subject(reference: str, display: str = None) -> "AppointmentBuilder":
26
+ self._set("subject", {"reference": reference, "display": display}) if display else self._set("subject", {"reference": reference})
27
+ return self
28
+
29
+ def set_description(description: str) -> "AppointmentBuilder":
30
+ self._set("description", description)
31
+ return self
@@ -0,0 +1,31 @@
1
+ from typing import Optional
2
+ from src.builder.base_builder import BaseBuilder
3
+
4
+
5
+ class AppointmentResponseBuilder(BaseBuilder):
6
+ def __init__(self) -> None:
7
+ super().__init__("AppointmentResponse")
8
+
9
+ def set_id(id: str) -> "AppointmentResponseBuilder":
10
+ self._set("id", id)
11
+ return self
12
+
13
+ def add_identifier(system: str, value: str) -> "AppointmentResponseBuilder":
14
+ self._append("identifier", {"system": system, "value": value})
15
+ return self
16
+
17
+ def set_status(status: str) -> "AppointmentResponseBuilder":
18
+ self._set("status", status)
19
+ return self
20
+
21
+ def set_code(code: dict) -> "AppointmentResponseBuilder":
22
+ self._set("code", code)
23
+ return self
24
+
25
+ def set_subject(reference: str, display: str = None) -> "AppointmentResponseBuilder":
26
+ self._set("subject", {"reference": reference, "display": display}) if display else self._set("subject", {"reference": reference})
27
+ return self
28
+
29
+ def set_description(description: str) -> "AppointmentResponseBuilder":
30
+ self._set("description", description)
31
+ return self