German Practice Management FHIR Profiles (R4)
0.49.0 - STU1
German Practice Management FHIR Profiles (R4) - Local Development build (v0.49.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions
This Implementation Guide is primarily extension-focused, but it also defines selected custom StructureDefinition profiles where routing, slicing, or validation rules need to be explicit on top of standard FHIR R4 and German base profiles.
The IG therefore combines reusable extensions and terminology with a small number of targeted profiles for patient demographics, coverage routing, laboratory exchange, procedures, and related ambulatory workflows.
| Resource | Usage | Key Extensions |
|---|---|---|
| PraxisBillingPattern | Abrechnungsmuster / Ziffernketten | BillingPatternStopfield |
| ChargeItem | Individual billable service (EBM-Ziffer, GOÄ-Leistung) | BillingSystem, BillingCode, BillingPoints, GoaeFaktor, BillingRlvRelevanz |
| ChargeItemDefinition | Billing catalog entry (EBM/GOÄ catalog) | MultiplierMin/Default/Max, BillingRequirements, BillingExclusions, BillingPruefzeit, BillingFachgruppen |
| Claim | Submitted billing claim per Schein | AbrechnungsquartalExt, ScheinPositionExt, RabStatusExt |
| ClaimResponse | KV response to submitted claims | HonorarbescheidCorrectionSign |
| Account | Offene Posten / accounts receivable | RechnungsbetragExt, MahnstufeExt, FaelligkeitsdatumExt |
| Resource | Usage | Key Extensions |
|---|---|---|
| Contract | RLV/QZV budget allocation per quarter | RlvFallwert, RlvZugewiesen, RlvEntbudgetiert, RlvKategorie |
| Basic | KV benchmark data (Fachgruppen-Durchschnittswerte) | KvBenchmarkRlvFallwertAk1/2/3, KvBenchmarkDurchschnittFallzahl |
| Resource | Usage | Key Extensions |
|---|---|---|
| PaymentReconciliation | KV quarterly payment statement | HonorarbescheidQuartal |
| ClaimResponse | Individual line-item corrections | HonorarbescheidCorrectionSign |
| Resource | Usage | Key Extensions |
|---|---|---|
| Encounter | Patient visit with queue management | ArrivalTimeExt, EncounterCalledExt, EncounterCreatedAtExt |
| Condition | Diagnoses with German-specific metadata | DauerdiagnoseExt |
| ServiceRequest | Überweisungen (referrals) | ReferralSugTypeExt, ReferralOptimizationStatusExt |
| Communication | Einweisungen (hospital admissions) | KheBelegarztExt, KheNotfallExt, KheUnfallExt |
| CareTeam | Treatment team (interdisciplinary care coordination) | — |
| ProcedureAmbulantDE | Ambulante Eingriffe mit OPS-Kodierung | — (OPS via CodingOPS from de.basisprofil.r4) |
| PraxisLabDiagnosticReport | Laborbefund mit LAB/MB/PAT Varianten | category slicing, result/specimen references, supports Einzelbefund/Kumulativbefund/Mikrobiologie/Pathologie |
| PraxisLabObservation | Laborergebnisse mit LOINC/LDT-Codierung | Observation status, category, code slicing, referenceRange, interpretation |
| PraxisSpecimen | Probenmaterial für xDT-Adapter (LDT/GDT) | — (SNOMED-CT + optional LDT-Code) |
| Resource | Usage | Key Extensions |
|---|---|---|
| FPDEPatient | Patient demographics with maiden name and district support | humanname-own-name, iso21090-ADXP-precinct |
| Provenance | AI provenance tracking (EU AI Act) | AiGeneratedExt, AiModelExt, HumanReviewedExt |
| FPDECoverageGKV | GKV insurance with Wohnortprinzip (WOP) | gkv/wop |
| FPDECoveragePrivat | PKV / self-pay coverage with optional PVS routing | billingAssignment |
| PractitionerRole | WB-Assistent / Sicherstellungsassistent | WbRolleExt, WbSupervisorRoleExt |
| Consent | Patient consent management | EinwilligungKuerzelExt, EinwilligungWiderrufMoeglichExt, EinwilligungAuswahlExt |
The PraxisCondition profile extends the base FHIR Condition resource to standardize diagnosis recording in German ambulatory practice with mandatory KV billing requirements (KVDT 6.06).
| Element | Cardinality | Notes |
|---|---|---|
code |
1..1 | Must-Support. ICD-10-GM coding from BFARM CodeSystem. |
code.coding[icd10gm] |
1..* | Sliced by system. Must include at least one ICD-10-GM coding. |
code.coding[icd10gm].extension[diagnosesicherheit] |
0..1 | Must-Support. Upstream extension binding to KBV_VS_SFHIR_ICD_DIAGNOSESICHERHEIT (A/G/V/Z). Required by KV for billing claims. |
clinicalStatus |
0..1 | Must-Support. Active, recurrence, remission, resolved. |
verificationStatus |
0..1 | Must-Support. Unconfirmed, provisional, differential, confirmed, refuted, entered-in-error. |
subject |
1..1 | Reference(Patient). The patient who has the condition. |
| Extension | Type | Cardinality | Description |
|---|---|---|---|
dauerdiagnose |
boolean | 0..1 | Must-Support. Marks chronic/persistent diagnoses that auto-roll to next quarters. |
The KV requires all diagnoses submitted in billing claims to carry a diagnosesicherheit code:
| Code | Meaning | Clinical Status | Verification Status |
|---|---|---|---|
| G | Gesichert (Confirmed) | active / resolved / remission | confirmed |
| A | Ausschluss (Ruled out) | — | refuted |
| V | Verdacht (Suspected) | active / provisional | provisional |
| Z | Zustand nach (History of) | resolved | confirmed |
PVS systems must extract and populate this extension on every diagnosis before sending the claim to the KV. The binding is required.
PraxisCondition applies to the standard FHIR R4 Condition resource (from de.basisprofil.r4 or FHIR R4 core). It does not constrain base Condition elements, but requires support for:
When recording a diagnosis in the PVS:
See example example-diagnose for a complete instance.
The AnamneseQuestionnaire profile extends the base FHIR Questionnaire resource to standardize ambulatory history-taking forms (Anamneseboegen) in practice management systems. It supports multiple questionnaire types (initial intake, pain assessment, preventive health screening, and follow-up) with structured groups of clinical questions.
| Type | Code | Usage |
|---|---|---|
| Erstanamnese | erstanamnese |
Comprehensive initial intake form for new patients |
| Schmerzanamnese | schmerzanamnese |
Focused pain assessment questionnaire |
| Praeventionsanamnese | praevention |
Preventive health screening form |
| Verlaufsanamnese | follow-up |
Repeat assessment during treatment course |
| Fachspezifisch | fachspezifisch |
Specialty-specific questionnaire template |
#active for active templates#PatientAnamneseBogentypVStrue, PVS systems should surface the item prominently in the clinical workflow.Standard FHIR Questionnaire item types including: group, display, boolean, decimal, integer, date, dateTime, time, string, text, url, choice, open-choice, attachment, reference, quantity.
Patients complete these questionnaires via a QuestionnaireResponse-Builder interface. Each response is linked to the template via QuestionnaireResponse.questionnaire reference. PVS systems can then:
See example example-anamnese-erstanamnese for a complete three-group Erstanamnese template (Previous Conditions, Medication, Social History).
The InsurancePlanDE profile extends the base FHIR InsurancePlan resource with slicing on plan to distinguish GKV (statutory health insurance) and PKV (private health insurance) tariffs.
| Slice | Type Code | Usage |
|---|---|---|
plan[gkv] |
InsurancePlanType#gkv |
GKV Satzungsleistungen und kassenindividuelle Leistungen |
plan[pkv] |
InsurancePlanType#pkv |
PKV GOÄ-Faktoren und Erstattungsregeln |
FHIR R4 does not provide a direct reference element from Coverage to InsurancePlan. The recommended pattern for this IG is to use Coverage.class to link a patient's Coverage to the specific InsurancePlan tariff by identifier:
Coverage.class[type=plan].value → InsurancePlan.identifier (Tarif-Identifier)
Coverage.class[type=plan].name → InsurancePlan.name (human-readable label)
Example: A GKV patient with AOK Bayern PZR Satzungsleistung:
Coverage.class[0].type = http://terminology.hl7.org/CodeSystem/coverage-class#plan
Coverage.class[0].value = "aok-bayern-pzr"
Coverage.class[0].name = "AOK Bayern — Basis + PZR Satzungsleistung"
The value "aok-bayern-pzr" matches the InsurancePlan.identifier of the corresponding InsurancePlanDE instance. Systems can look up the full tariff details (benefit limits, GOÄ-Faktoren, Satzungsleistungen) from the referenced InsurancePlan resource using this identifier.
See example-coverage-aok-tarif for a complete example.
The CareTeamDE profile models treatment teams (Behandler-Teams) in German ambulatory care. It supports interdisciplinary care coordination with role-based participant slicing.
| Element | Cardinality | Profile Constraint |
|---|---|---|
status |
0..1 | MS; proposed | active | suspended | inactive | entered-in-error |
category |
0..* | MS; typically LOINC LA27975-4 (Encounter-focused care team) |
name |
0..1 | MS; human-readable team name (e.g. "Zahnarztpraxis Dr. Mueller") |
subject |
0..1 | MS; Reference(Patient) — the patient for whom the team provides care |
period |
0..1 | MS; start and end times for team engagement |
participant |
0..* | MS; sliced by role (BehandlerRolleVS) |
participant[behandler].member |
0..1 | MS; Reference(Practitioner | PractitionerRole | Organization) |
participant[behandler].role |
0..* | MS; bound to BehandlerRolleVS (required) |
managingOrganization |
0..* | Reference(Organization) — the practice or facility managing the team |
Participants are sliced on the role element to distinguish treatment roles:
| Slice | Role CodeSystem | Usage |
|---|---|---|
participant[behandler] |
BehandlerRolleCS | Individual health professionals or organizations with a clinical role on the team |
Each participant[behandler] slice must include:
role from BehandlerRolleVS (Zahnarzt, Arzt, ZFA, MFA, WB-Assistent, Physiotherapeut)member Reference to the Practitioner, PractitionerRole, or Organization holding that roleperiod (start/end) for that participant's engagementA PVS adapter should:
CareTeamDE instance for each patient-facing treatment team.period.start / period.end to track when the team composition was active.See examples: example-care-team, example-care-team-small, example-care-team-inactive, example-care-team-mvz.
The PraxisDevice profile extends the base FHIR Device resource for medical devices and lab analyzers in German ambulatory practice. It integrates with GDT 3.5 device data (FK 8402 Gerätekennung) and provides structured coding for device identification.
| Element | Cardinality | Profile Constraint |
|---|---|---|
status |
0..1 | MS; active | inactive | entered-in-error |
identifier |
0..* | MS; sliced by system (gdtId) |
identifier[gdtId] |
0..1 | MS; GDT device identifier (FK 8402) with system = gdt-device-id |
deviceName |
0..* | MS; device name(s) with type classification |
deviceName.name |
1..1 | MS; human-readable device name |
deviceName.type |
1..1 | MS; manufacturer-name | user-friendly-name | patient-reported-name |
manufacturer |
0..1 | MS; device manufacturer (e.g., "Roche Diagnostics") |
modelNumber |
0..1 | MS; device model (e.g., "Cobas 6000") |
version |
0..* | MS; software/firmware version (optional but recommended) |
type |
0..1 | MS; device type, preferably SNOMED-CT (e.g., automated analyzer, ECG device) |
GDT 3.5 device data (FK 8402 Gerätekennung) maps to PraxisDevice.identifier[gdtId].value. The practice management system uses this identifier to:
See examples: example-cobas-6000, example-schiller-at102.
A PVS adapter should:
PraxisDevice instance for each device managed by the practice.identifier[gdtId].value with the GDT device identifier from the PVS.deviceName, manufacturer, modelNumber, version, and type to encode device metadata.active / inactive) to reflect the device's current operational state in the practice.The ProcedureAmbulantDE profile extends the base FHIR Procedure resource to support ambulatory procedures (Eingriffe) in German practice management. Procedure coding uses the OPS (Operationen- und Prozedurenschlüssel) via the CodingOPS profile from de.basisprofil.r4, which includes the Seitenlokalisation extension for laterality.
| Element | Cardinality | Description |
|---|---|---|
status |
1..1 | MS; procedure status (e.g., completed, in-progress) |
code |
1..1 | MS; procedure code — sliced to allow OPS coding |
code.coding[ops] |
0..1 | MS; OPS coding using CodingOPS profile from de.basisprofil.r4 |
code.coding[ops].system |
1..1 | Fixed: http://fhir.de/CodeSystem/bfarm/ops |
code.coding[ops].version |
1..1 | OPS catalog year (e.g., "2024") — required by CodingOPS |
code.coding[ops].code |
1..1 | OPS code (e.g., 1-650.1) |
subject |
1..1 | MS; Reference(Patient) |
performed[x] |
0..1 | MS; date or period when the procedure was performed |
bodySite |
0..* | MS; detailed body site (supplementary to Seitenlokalisation in OPS coding) |
Laterality (Seitenlokalisation) is modeled as an extension on the code.coding[ops] element, as defined by the CodingOPS profile:
code.coding[ops].extension[seitenlokalisation].valueCoding
system: https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ICD_SEITENLOKALISATION
code: L | R | B
The bodySite element may additionally carry more granular anatomical location information (e.g., for multi-site procedures).
Seitenlokalisation = L (links) recorded as an extension on the OPS coding.See examples: example-procedure-koloskopie, example-procedure-wundversorgung-links.
The FPDEPatient profile extends the base FHIR Patient resource to support German-specific demographic attributes required by practice management systems. It adds support for maiden name (Geburtsname) and district/neighborhood (Ortsteil) information.
| Element | Cardinality | Extension | Description |
|---|---|---|---|
name |
0..* | MS; supports official, nickname, and maiden name uses | |
name[].use |
0..1 | Can be #official, #nickname, #maiden, etc. |
|
name[].family |
0..1 | humanname-own-name |
MS; family name. When use=maiden, the humanname-own-name extension captures the original maiden name |
address |
0..* | MS; patient's residential address | |
address[].extension |
0..* | iso21090-ADXP-precinct |
MS; neighborhood/district (Ortsteil, Stadtteil) of the address |
humanname-own-name — Maiden Name (Geburtsname)The FHIR standard extension http://hl7.org/fhir/StructureDefinition/humanname-own-name is used to capture the patient's maiden name when name.use = #maiden. This extension is defined in the base FHIR specification and allows recording the original family name before marriage.
Example:
name[1].use = #maiden
name[1].family = "Schmidt"
name[1]._family.extension[0].url = "http://hl7.org/fhir/StructureDefinition/humanname-own-name"
name[1]._family.extension[0].valueString = "Schmidt"
iso21090-ADXP-precinct — District/Neighborhood (Ortsteil)The ISO 21090 standard extension http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-precinct is used to capture the neighborhood or district (Ortsteil, Stadtteil) as part of the patient's address. This is a German-common requirement where practices need to differentiate between districts of larger cities.
Example:
address[0].extension[0].url = "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-precinct"
address[0].extension[0].valueString = "Kreuzberg"
use=maiden with the humanname-own-name extension.When recording patient demographics in a PVS:
Patient resourcename[0] with the official name (use=official)name[1] with use=maiden and populate name[1].family with the maiden name. Add the humanname-own-name extension to name[1]._family to explicitly store the value.line, city, postalCode, country).iso21090-ADXP-precinct extension to address[].extension.FPDEPatient before submission.See examples: example-patient-geburtsname, example-patient-ohne-geburtsname, example-patient-ortsteil.
The FPDECoverageGKV profile extends the base FHIR Coverage resource to support German statutory health insurance (GKV — gesetzliche Krankenversicherung) with the Wohnortprinzip (WOP — residence-based principle) designation. The WOP indicates the regional KV (Kassenärztliche Vereinigung) responsible for the patient's care based on their place of residence.
| Element | Cardinality | Extension | Description |
|---|---|---|---|
status |
0..1 | Coverage status (active, inactive, entered-in-error, etc.) | |
type |
1..1 | Must code GKV using http://fhir.de/CodeSystem/versicherungsart-de-basis |
|
beneficiary |
1..1 | Reference(Patient) — the insured patient | |
payor |
1..* | Reference to the insurance carrier (Krankenkasse) | |
extension |
0..* | gkv/wop |
MS; Wohnortprinzip (WOP) code from KBV CodeSystem |
gkv/wop — Wohnortprinzip (WOP)The extension http://fhir.de/StructureDefinition/gkv/wop from de.basisprofil.r4 is used to specify the regional KV responsible for the patient. The value is a Coding from the KBV CodeSystem https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP, which lists all German KV regions (e.g., 38 = Nordrhein, 17 = Westfalen-Lippe).
Example:
extension[0].url = "http://fhir.de/StructureDefinition/gkv/wop"
extension[0].valueCoding.system = "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP"
extension[0].valueCoding.code = "38"
extension[0].valueCoding.display = "Nordrhein"
| Code | Display | Region |
|---|---|---|
| 38 | Nordrhein | Nordrhein (North Rhine) |
| 17 | Westfalen-Lippe | Westfalen-Lippe (Westphalia-Lippe) |
| 33 | Baden-Württemberg | Baden-Württemberg |
| 52 | Saarland | Saarland |
| (and others) | See KBV CodeSystem for complete list |
When recording GKV coverage in a PVS:
Coverage resourcestatus = #active (or appropriate status)type with GKV coding from http://fhir.de/CodeSystem/versicherungsart-de-basisbeneficiary to a Reference(Patient)payor to the insurance carrier (Krankenkasse) name or referencegkv/wop extension with the appropriate WOP codeFPDECoverageGKV before submissionUpstream Dependency: The gkv/wop extension is provided by the de.basisprofil.r4 package and is not redefined in this IG. It is reused as-is.
See examples: example-coverage-gkv-wop, example-coverage-gkv-wop-west.
The FPDECoveragePrivat profile constrains Coverage for private billing scenarios where routing to an external billing service (PVS) is decided per Coverage. This is the critical modeling choice: a patient can have multiple Coverage resources, and only some of them may route receivables to a third-party biller.
de.basisprofil.r4 version 1.6.0-ballot2 does not currently publish a dedicated coverage-de-pkv profile. This IG therefore derives FPDECoveragePrivat from coverage-de-basis and requires a German insurance type coding of PKV or SEL.
| Element | Cardinality | Extension | Description |
|---|---|---|---|
status |
0..1 | Coverage status | |
type |
1..1 | Must include http://fhir.de/CodeSystem/versicherungsart-de-basis with code PKV or SEL |
|
beneficiary |
1..1 | Reference(Patient) — the covered patient | |
subscriber |
0..1 | Optional subscriber for classic PKV relationships | |
payor |
1..* | Insurance carrier or direct payer, depending on the coverage type | |
extension[billingAssignment] |
0..1 | billing-assignment |
Reference(Organization) — PVS / billing service buying receivables from this coverage relationship |
Coverage is the source of truth for external billing routing.extension[billing-assignment] is present, the referenced Organization is the PVS / billing service for that coverage.Claim.payee.type = other and Claim.payee.party.billing-assignment.When recording private billing coverage in a PVS:
Coverage resource based on FPDECoveragePrivattype with PKV or SEL from VersicherungsartDeBasisbeneficiary to the covered patient and payor to the insurer or direct payerbilling-assignment only when receivables are assigned to an external billing serviceConsent resource scoped to the same CoverageFPDECoveragePrivat before submissionSee examples: ExampleCoveragePrivat, ExamplePvsOrganization, ExampleConsentBillingAssignment.
The PraxisSpecimen profile extends the base FHIR Specimen resource to standardize specimen (Probenmaterial) documentation in German ambulatory practice. It is designed for xDT adapters (LDT, GDT 3.5) that exchange laboratory order and result information. The profile ensures that specimen identifiers and material types are captured in a PVS-agnostic manner, compatible with laboratory systems.
| Element | Cardinality | Profile Constraint |
|---|---|---|
identifier |
0..* | Optional; labs may assign their own specimen identifiers using system-specific URLs |
type |
1..1 | MS; sliced by coding system (SNOMED-CT + optional LDT) |
type.coding[snomed] |
1..1 | MS; SNOMED-CT coding (extensible) using ProbenmaterialSnomedVS |
type.coding[snomed].system |
1..1 | Fixed: http://snomed.info/sct |
type.coding[snomed].code |
1..1 | MS; SNOMED-CT code for specimen material |
type.coding[ldt] |
0..1 | Optional; LDT FK 8428 material designation using LdtMaterialbezeichnungCS |
type.coding[ldt].system |
1..1 | Fixed: https://fhir.cognovis.de/praxis/CodeSystem/ldt-materialbezeichnung |
type.coding[ldt].code |
1..1 | LDT FK 8428 code (e.g., EDTA-Blut, Serum, Urin-MSU) |
subject |
1..1 | MS; Reference(Patient) — the patient providing the specimen |
collection |
0..1 | MS; capture collection method, timing, and body site |
collection.collectedDateTime |
0..1 | MS; when the specimen was collected |
collection.method |
0..1 | MS; SNOMED-CT or LDT code for collection technique (venipuncture, swab, etc.) |
collection.bodySite |
0..1 | MS; anatomical location of specimen collection |
container |
0..* | MS; tube type and container information |
container.type |
0..1 | MS; SNOMED-CT code for container type (EDTA tube, serum separator, etc.) |
Specimen identifiers are lab-specific. No shared NamingSystem is defined for specimen identifiers. Each laboratory assigns identifiers using its own system URL:
identifier[0].system = "https://<lab-specific-url>/proben-id"
identifier[0].value = "<lab-specific-specimen-id>"
Example: A specimen from "Labor Beispiel" might use:
system = "https://labor-beispiel.de/proben-id"
value = "BL-2026-00147"
Different laboratories can have different URL structures; there is no registry of these URLs — they are internal to each laboratory system.
SNOMED-CT (extensible) provides internationally recognized coding for specimen types:
122555007 — Venous blood specimen122575003 — Urine specimen258529004 — Throat swabLDT FK 8428 (optional) adds German-specific material designation from the KBV LDT3 specification:
EDTA-Blut — EDTA-Blut (venous blood in EDTA tube)Serum — BlutserumUrin-MSU — Mittelstrahl urineAbstrich — Swab / smearLiquor — Cerebrospinal fluidStuhl — Stool sampleBoth coding systems can coexist; SNOMED-CT is mandatory, LDT is optional. xDT adapters can map between the two at transformation time.
The kbv.mio.laborbefund (KBV MIO Laboratory Report) ImplementationGuide defines specimen handling for laboratory results in Germany. PraxisSpecimen is inspired by KBV_PR_MIO_LAB_Specimen but is not constrained to it because:
PraxisSpecimen must remain PVS-agnostic — applicable to any ambulatory practice system, not tied to a specific MIO workflowSpecimen resource as parent, ensuring broad compatibilityRefer to the KBV MIO Laboratory Report guide for context on laboratory workflow integration.
When capturing specimen information in a PVS:
Specimen resourcetype.coding[snomed] with the appropriate SNOMED-CT codetype.coding[ldt] if the PVS maintains LDT material designationssubject with a reference to the patientcollection.collectedDateTime, collection.method, collection.bodySite)container.type) aids downstream laboratory processingPraxisSpecimen before transmission122555007 (Venous blood specimen) + LDT EDTA-Blut (EDTA-Blut), collected by venipuncture, in EDTA tube.122575003 (Urine specimen) + LDT Urin-MSU (Mittelstrahl urine), mid-stream collection.258529004 (Throat swab), collected by swab technique from pharynx.See examples: example-specimen-blut-edta, example-specimen-urin-msu, example-specimen-rachenabstrich.
The PraxisLabObservation profile extends the base FHIR Observation resource to standardize laboratory result documentation in German ambulatory practice. It is designed for in-practice and rapid laboratory testing with flexible result types (quantitative, qualitative, coded) and dual coding support for LOINC and LDT test identifiers.
| Element | Cardinality | Profile Constraint |
|---|---|---|
status |
1..1 | MS; final | preliminary | registered | amended (typically #final or #preliminary) |
category |
1..* | MS; sliced to require laboratory (1..1) |
category[laboratory] |
1..1 | MS; fixed to http://terminology.hl7.org/CodeSystem/observation-category#laboratory |
code |
1..1 | MS; test code — sliced with LOINC and LDT-Testkennung (FK 8420) |
code.coding[loinc] |
0..1 | MS; LOINC coding; system fixed to http://loinc.org |
code.coding[ldt] |
0..1 | MS; LDT test identifier; system fixed to https://fhir.cognovis.de/praxis/NamingSystem/ldt-testkennungen |
code Invariant |
— | praxis-lab-obs-code; at least one of LOINC or LDT coding required (error level) |
subject |
1..1 | MS; Reference(Patient) — the patient for whom the test was performed |
effective[x] |
0..1 | MS; only dateTime allowed; when the measurement/test was performed |
value[x] |
0..1 | MS; only Quantity | string | CodeableConcept (quantitative, qualitative, or coded results) |
interpretation |
0..* | MS; result interpretation (H/L/N etc.); extensibly bound to HL7 ObservationInterpretation ValueSet |
referenceRange |
0..* | MS; normal range with UCUM-constrained low/high values |
referenceRange.low |
0..1 | MS; lower bound; system fixed to http://unitsofmeasure.org |
referenceRange.high |
0..1 | MS; upper bound; system fixed to http://unitsofmeasure.org |
specimen |
0..1 | MS; Reference(PraxisSpecimen) — the specimen analyzed (optional) |
The profile enforces flexible coding with at least one code slice present:
LOINC (Slice: loinc):
http://loinc.org4548-4 for HbA1c)LDT FK 8420 (Slice: ldt):
https://fhir.cognovis.de/praxis/NamingSystem/ldt-testkennungen03034000 for HbA1c)Invariant praxis-lab-obs-code:
code.coding.where(system = 'http://loinc.org').exists()
OR code.coding.where(system = 'https://fhir.cognovis.de/praxis/NamingSystem/ldt-testkennungen').exists()
At least one coding slice must be present; severity is #error.
The profile allows three forms of result representation:
Interpretation (MS):
H (High), L (Low), N (Normal), NEG (Negative), POS (Positive)Reference Range (MS):
low and high bounds must use UCUM-constrained unitshttp://unitsofmeasure.orgreferenceRange.age (optional)The profile is designed for xDT adapter workflows:
PraxisLabObservation:
code.coding[ldt]value[x] (Quantity, string, or CodeableConcept)specimen.collection.collectedDateTimeinterpretationdevice extension (future work)When capturing lab results in a PVS:
Observation resource of type PraxisLabObservationstatus as #final (or #preliminary if not yet verified)category[laboratory] to the fixed laboratory codecode.coding:
code.coding[loinc] if a LOINC mapping exists for the testcode.coding[ldt] if the test is identified by LDT FK 8420 codesubject to Reference(Patient)effective[x] with the test date/timevalue[x] with the appropriate result type (Quantity, string, or CodeableConcept)interpretation (e.g., #H, #L, #N) if provided by the analyzer or labreferenceRange with normal range limits using UCUM unitsspecimen = Reference(PraxisSpecimen)PraxisLabObservation before submissionlab-obs-example-hba1c — LOINC + LDT coding, 6.1 %, high interpretation, EDTA-Blut specimenlab-obs-example-leukozyten-urin — LOINC + LDT coding, "negativ" result, normal interpretationlab-obs-example-ldt-only-custom — LDT coding only, quantitative in mg/dL, custom test without LOINCSee examples: lab-obs-example-hba1c, lab-obs-example-leukozyten-urin, lab-obs-example-ldt-only-custom.
The PraxisLabDiagnosticReport profile extends the base FHIR DiagnosticReport resource to standardize laboratory result reporting in German ambulatory practice. It supports multiple laboratory report variants (standard lab, microbiology, pathology) via category slices, and accommodates both single-point and cumulative reporting patterns through separate DiagnosticReport instances.
| Element | Cardinality | Profile Constraint |
|---|---|---|
status |
1..1 | MS; final | preliminary | amended | corrected (typically #final or #preliminary) |
category |
1..* | MS; sliced by HL7 v2 Table 0074 (LAB, MB, PAT); at least one slice must be present |
category[lab] |
0..1 | MS; fixed to http://terminology.hl7.org/CodeSystem/v2-0074#LAB (standard laboratory reports) |
category[mb] |
0..1 | MS; fixed to http://terminology.hl7.org/CodeSystem/v2-0074#MB (microbiology reports) |
category[pat] |
0..1 | MS; fixed to http://terminology.hl7.org/CodeSystem/v2-0074#PAT (pathology/histology reports) |
category Invariant |
— | praxis-lab-dr-category; at least one category slice must be present (error level) |
code |
1..1 | MS; report code (typically LOINC panel code; not constrained to LOINC only to allow laboratory-specific codes) |
subject |
1..1 | MS; Reference(Patient) — the patient for whom the report was generated |
effective[x] |
0..1 | MS; only dateTime allowed; specimen collection or report generation date |
issued |
0..1 | MS; when the report was issued/authorized |
performer |
0..* | MS; Reference(Practitioner | Organization) — performing lab or technician |
resultsInterpreter |
0..* | MS; Reference(Practitioner | Organization) — physician/specialist responsible for interpretation |
specimen |
0..* | MS; Reference(PraxisSpecimen) — specimens analyzed in this report |
result |
0..* | MS; Reference(PraxisLabObservation) — individual test results |
conclusion |
0..1 | MS; narrative summary or clinical interpretation text |
presentedForm |
0..* | MS; attached PDF/document representation of the report |
basedOn |
0..* | MS; Reference(ServiceRequest) — orders underlying this report (useful for cumulative report linkage) |
The profile enforces report classification via open slicing on category with three named slices:
LAB (Standard Laboratory):
http://terminology.hl7.org/CodeSystem/v2-0074#LABMB (Microbiology):
http://terminology.hl7.org/CodeSystem/v2-0074#MBPAT (Pathology):
http://terminology.hl7.org/CodeSystem/v2-0074#PATInvariant praxis-lab-dr-category:
category.coding.where(system = 'http://terminology.hl7.org/CodeSystem/v2-0074'
and (code = 'LAB' or code = 'MB' or code = 'PAT')).exists()
At least one category slice must be present; severity is #error.
#finaleffectiveDateTime values[mb] set to #MB[pat] set to #PATpresentedForm typically contains detailed PDF reportSpecimen References:
specimen must reference only PraxisSpecimen resourcesResult References:
result must reference only PraxisLabObservation resourcesFor practices tracking longitudinal trends (e.g., quarterly HbA1c, monthly INR):
DiagnosticReport instance for each measurement dateeffectiveDateTime and issuedbasedOn references if part of a managed condition (e.g., diabetes follow-up order)GET /fhir/DiagnosticReport?code=4548-4&subject=Patient/123&sort=-dateThis pattern avoids FHIR-level grouping complexity and relies on clients to assemble trends via code + date filtering.
#preliminary, no presenter form yet.When capturing lab reports in a PVS:
DiagnosticReport resource of type PraxisLabDiagnosticReportstatus to #final (for complete reports) or #preliminary (for partial/early reports)category:
category[lab]category[mb]category[pat]code to the report code (typically LOINC, e.g., 58410-2 for CBC)subject to Reference(Patient)effective[x] with specimen collection date as dateTimeissued with report authorization/release dateresult to all relevant PraxisLabObservation resourcesspecimen to all relevant PraxisSpecimen resourcesresultsInterpreter Reference for the responsible physicianconclusion with clinical summary or interpretationpresentedForm with contentType + URL or base64PraxisLabDiagnosticReport before submissionexample-lab-dr-blutbild — LAB category, LOINC 58410-2, final status, EDTA blood specimenexample-lab-dr-urinkultur — MB category, E. coli with antibiogram, final statusexample-lab-dr-histologie — PAT category, basal cell carcinoma diagnosis, PDF report, final statusexample-lab-dr-preliminary — LAB category, preliminary status (result not yet complete)example-lab-dr-hba1c-jan — LAB category, final, Q1 2026 dateexample-lab-dr-hba1c-apr — LAB category, final, Q2 2026 date (demonstrates trend pattern)example-lab-dr-hba1c-q3 — LAB category, final, Q3 2026 date (completes quarterly series)See examples: example-lab-dr-blutbild, example-lab-dr-urinkultur, example-lab-dr-histologie, example-lab-dr-preliminary, example-lab-dr-hba1c-jan, example-lab-dr-hba1c-apr, example-lab-dr-hba1c-q3.
The choice of base resource follows FHIR R4 semantics: