diff --git a/AGENTS.md b/AGENTS.md index 03f8d68e..7c8ccbaa 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -125,8 +125,26 @@ How the polymorphic openEHR Reference Model is encoded in OpenAPI: upstream (Better, EHRbase) or in `simplified_formats`. - **No tests.** This project has none and none are expected; do not scaffold a test framework. -- **Trace numbers in commits.** History references Jira tickets (`SPECITS-NN`) — - follow that style. +- **Commit messages: short subject, optional body, Jira ticket on the subject + line.** Follow GitHub-style conventions: a concise subject line (target ~70 + characters, hard limit ~72) written in the imperative mood and capturing the + headline change. When a Jira ticket exists, reference it on the subject line + in the form `(SPECITS-NN)` (or the equivalent project key — `SPECPR`, + `SPECRM`, …) so `git log --oneline` stays scannable. If the change needs + more context — rationale, cross-references to upstream issues/Discourse + threads, lists of touched files, links to implementations consulted — put + it in the commit body, separated from the subject by a blank line. Reserve + the body for information that doesn't already live in the diff or the + amendment record; the amendment record stays terse (see the rule above) + precisely because the commit body carries the full story. +- **Keep amendment-record entries short and succinct.** `master00-amendment_record.adoc` + in each AsciiDoc spec is a one-line-per-issue ledger, not a changelog narrative. + Each entry should be a single sentence (or a short semicolon-separated list when + one ticket bundles related fixes), naming the headline change and the affected + RM/FLAT names in backticks. Keep the full rationale and worked examples in the + spec body and in the commit message / PR description — not in the amendment record. + When extending an existing unreleased entry rather than adding a new row, fold + the new headline into the existing list with a `;` separator and stop there. ### Recurring schema-alignment pitfalls @@ -176,9 +194,33 @@ before editing: - HL7 SMART App Launch IG — - SMART Health IT — - `docs/simplified_formats/` and `docs/simplified_data_template/` - - EHRbase SDT docs — - - Better Care WebTemplate — - - WebTemplate test suite — + - EHRbase SDT user docs — + - EHRbase FLAT data-types reference (canonical examples for every RM type) — + + - EHRbase server source — + - EHRbase openEHR SDK (Java; FLAT/STRUCTURED un/marshalling) — + ; relevant subtree: + `serialisation/src/main/java/org/ehrbase/openehr/sdk/serialisation/`. + - Better Care WebTemplate (Kotlin reference implementation) — + ; the FLAT path-suffix conventions + are codified in two parallel trees: + - `src/main/kotlin/care/better/platform/web/template/converter/flat/mapper/ToFlatMapper.kt` + — emits the FLAT keys/suffixes for each RM type. + - `src/main/kotlin/care/better/platform/web/template/converter/raw/factory/leaf/Factory.kt` + — parses inbound FLAT keys back to RM (and lists tolerated input aliases). + - Better WebTemplate test suite (golden FLAT/STRUCTURED fixtures) — + + - openEHR Discourse (ITS / Platform categories) — + for raised gaps, + e.g. . + +For any Simplified-Formats edit that affects path suffixes, attribute names, or +mutex rules, the **two implementations are the tie-breaker** when prose and +intuition disagree: the FLAT path-suffix vocabulary the spec normatively documents +must match what Better's `*ToFlatMapper.kt` emits and what EHRbase's +`09_flat/01_data_types/index.rst` shows. Known intentional divergences from the +RM attribute names (`|mediatype` vs `media_type`, `|alternatetext` vs +`alternate_text`) are baked into both implementations and must be preserved. URLs were live-checked at last edit; verify before quoting and keep the bibliography in each `master.adoc` in sync. diff --git a/docs/simplified_formats/master00-amendment_record.adoc b/docs/simplified_formats/master00-amendment_record.adoc index 35998e55..64d6c959 100644 --- a/docs/simplified_formats/master00-amendment_record.adoc +++ b/docs/simplified_formats/master00-amendment_record.adoc @@ -6,10 +6,15 @@ 4+^h|*ITS_REST Release (unreleased)* -|[[latest_issue]]1.1.0 +|[[latest_issue]]1.1.1 +|{spec_tickets}/SPECITS-94[SPECITS-94^]. Clarified Level Removal (attribute elision vs wrapper collapse) and `EVENT` rule; added `\|other` and `\|preferred_term` suffixes on `DV_CODED_TEXT`; fixed `LINK` (`\|target`) and `DV_MULTIMEDIA` (`\|mediatype`) mappings; corrected `EVENT_CONTEXT` table and added `PARTICIPATION` section; corrected PARTY `\|id_namespace` RM path; documented PARTICIPATION `/relationship` for `PARTY_RELATED` performer; expanded `DV_PROPORTION` table (`\|precision`, `\|accuracy`, `\|accuracy_is_percent`; `\|normal_status` RM path); fixed `DV_DATE_TIME` / `DV_TIME` headers and bare-path notes; swept recurring `\|magnitude_status` and `\|normal_status` row corrections across `DV_COUNT` / `DV_DATE` / `DV_DATE_TIME` / `DV_TIME` / `DV_DURATION` / `DV_QUANTITY`; added `\|accuracy` / `\|accuracy_is_percent` to `DV_COUNT`. +|REST WG +|[[latest_issue_date]]28 Apr 2026 + +|1.1.0 |{spec_tickets}/SPECITS-61[SPECITS-61^]. Cleanup and consolidate Simplified Formats specification; Deprecating Simplified Data Template (SDT) specification |REST WG -|[[latest_issue_date]]05 Nov 2025 +|05 Nov 2025 4+^h|*ITS_REST Release 1.0.3* diff --git a/docs/simplified_formats/master04-basic_concepts.adoc b/docs/simplified_formats/master04-basic_concepts.adoc index 38822c3c..6fe34b35 100644 --- a/docs/simplified_formats/master04-basic_concepts.adoc +++ b/docs/simplified_formats/master04-basic_concepts.adoc @@ -843,32 +843,97 @@ Algorithm for converting structured format to flat: == Level Removal -Certain RM types are omitted from paths to simplify the structure. -These types do not typically carry significant clinical information and would unnecessarily complicate the path structure. +Paths in Flat and Structured formats omit two distinct kinds of segments relative to the canonical RM path: -=== Always Removed +1. *Container attribute names* of `LOCATABLE`-to-`LOCATABLE` relationships are never present as path segments -- the parent connects directly to the child via the child's archetype node-id alias. +2. In addition, certain *wrapper node types* are themselves collapsed -- their archetype node-id is also dropped -- because they act only as structural slots and carry no clinically meaningful identity at that level. -The following node types are always removed from paths, but their respective data carrying attribute is taken as the value at that specific level: +=== Container Attributes Elided from Paths -* `ITEM_TREE` replaced by `ITEM_TREE.items` -* `ITEM_LIST` replaced by `ITEM_LIST.items` -* `ITEM_SINGLE` replaced by `ITEM_SINGLE.item` -* `ITEM_TABLE` replaced by `ITEM_TABLE.rows` -* `HISTORY` replaced by `HISTORY.events` +The following RM attribute names are universally absent from paths: -=== Conditionally Removed +* `COMPOSITION.content` +* `SECTION.items` +* `OBSERVATION.data`, `OBSERVATION.state`, `OBSERVATION.protocol` +* `EVALUATION.data`, `EVALUATION.protocol` +* `INSTRUCTION.activities`, `INSTRUCTION.protocol` +* `ACTION.description`, `ACTION.protocol` +* `ADMIN_ENTRY.data` +* `ACTIVITY.description` +* `HISTORY.events` +* `EVENT.data`, `EVENT.state` +* `ITEM_TREE.items`, `ITEM_LIST.items`, `ITEM_SINGLE.item`, `ITEM_TABLE.rows` +* `CLUSTER.items` -The following types are removed when they meet specific criteria. +=== Always Collapsed Wrapper Types -An `EVENT` node is removed when: +In addition to the attribute elision above, the following wrapper node types are themselves collapsed -- their archetype node-id is also dropped, so the parent connects directly to the wrapper's contents: -1. Its maximum occurrence is 1 (i.e., `max = 1`) -2. AND it has no sibling `EVENT` nodes in the same parent +* `ITEM_STRUCTURE` (abstract) and its concrete subtypes: +** `ITEM_TREE` +** `ITEM_LIST` +** `ITEM_SINGLE` +** `ITEM_TABLE` +* `HISTORY` + +These types act as fixed structural slots in their parent (`ENTRY` for the `ITEM_STRUCTURE` family; `OBSERVATION` for `HISTORY`) and have no archetype node-id distinct from that slot. + +=== Conditionally Collapsed Wrapper Types + +An `EVENT` node is collapsed when both of the following hold: + +1. Its maximum occurrence is 1 (i.e., `max = 1`), AND +2. No sibling `EVENT` nodes (of any concrete event type) exist in the same parent `HISTORY`. `EVENT` nodes are retained when: -* Multiple `EVENT` types exist in the same `OBSERVATION` (e.g., `POINT_EVENT` and `INTERVAL_EVENT`) -* The `EVENT` can occur multiple times +* Multiple `EVENT` types exist in the same parent `HISTORY` (e.g., a `POINT_EVENT` alongside an `INTERVAL_EVENT`), or +* The `EVENT` can occur multiple times (`max > 1`). + +=== Example + +Take a single measurement magnitude inside a laboratory result panel. The canonical RM path is: + +[source] +---- +/content[openEHR-EHR-OBSERVATION.laboratory_test_result.v1] + /data[at0001] + /events[at0002] + /data[at0003] + /items[openEHR-EHR-CLUSTER.laboratory_test_panel.v1] + /items[openEHR-EHR-CLUSTER.laboratory_test_analyte.v1] + /items[at0001] + /value +---- + +The same field in Flat form: + +[source] +---- +laboratory_test_report/laboratory_test/laboratory_test_panel/laboratory_result:0/result_value|magnitude +---- + +Differences: + +* Container attribute names (`content`, `data`, `events`, `items`, `value`) are elided wherever they appear. +* The `HISTORY` (`at0001`) and `ITEM_TREE` (`at0003`) wrapper nodes are collapsed; the `EVENT` (`at0002`) is conditionally collapsed (here `max=1`, single event type). +* The `OBSERVATION` and the two `CLUSTER` nodes are retained under their archetype-id aliases (`laboratory_test`, `laboratory_test_panel`, `laboratory_result`); the inner `CLUSTER` repeats, hence the `:0` instance index. +* `ELEMENT.value` is replaced by the `|magnitude` attribute suffix. + + +[[open_value_sets]] +== Open Value-Sets and the `|other` Suffix + +When an archetype constrains a leaf to `DV_CODED_TEXT` with an _open_ value-set -- the bound terminology lists recommended codes but the constraint also accepts values outside the list (`listOpen: true` in the web template; non-`limit-to-list` in ADL) -- the same leaf may at runtime carry either a `DV_CODED_TEXT` (chosen from the list) or a `DV_TEXT` (free-text value). + +Many archetypes deliberately combine a recommended coded list with free-text fallback (e.g. `state_of_dress`, `confounding_factors`, `overall_test_status`). Without a dedicated FLAT-level discriminator the `DV_CODED_TEXT` vs `DV_TEXT` branch would have to be inferred from value patterns, which is fragile and ambiguous. The `|other` suffix makes the branch explicit at the FLAT level and removes the need for receivers to reason about it. + +* On *write*: clients supply the free-text value via `|other: ""`. The server persists the leaf as a `DV_TEXT` in the canonical RM (not as a `DV_CODED_TEXT` with empty `defining_code`). +* On *read*: when the leaf carries a `DV_TEXT` whose archetype constraint is `DV_CODED_TEXT` with `listOpen: true`, the server SHOULD emit it via `|other: ""` so that round-trip equality holds at the FLAT level. +* `|other` is mutually exclusive with `|code`, `|value` and `|terminology` on the same leaf path; servers MUST reject combinations. +* `|other` MUST be rejected when the constraint is closed (`listOpen: false`). + +The per-suffix table is in the <> class section. == Validation diff --git a/docs/simplified_formats/master05-rm_mapping.adoc b/docs/simplified_formats/master05-rm_mapping.adoc index ba371583..2b3ea4f9 100644 --- a/docs/simplified_formats/master05-rm_mapping.adoc +++ b/docs/simplified_formats/master05-rm_mapping.adoc @@ -922,9 +922,9 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | yes | -| `\|type` +| `\|target` | STRING -| type.value +| target.value | yes | |=== @@ -1303,7 +1303,7 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates "conformance-ehrbase.de.v0/context/_participation:0|id_namespace": "HOSPITAL-NS", "conformance-ehrbase.de.v0/context/start_time": "2021-12-21T14:19:31.649613+01:00", "conformance-ehrbase.de.v0/context/_end_time": "2021-12-21T15:19:31.649613+01:00", - "conformance-ehrbase.de.v0/context/_location": "2021-12-21T15:19:31.649613+01:00", + "conformance-ehrbase.de.v0/context/_location": "Ward A3, Room 12", "conformance-ehrbase.de.v0/context/setting|code": "238", "conformance-ehrbase.de.v0/context/setting|value": "other care", "conformance-ehrbase.de.v0/context/setting|terminology": "openehr" @@ -1318,37 +1318,172 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | Required | Note +| `/start_time` +| <> +| start_time +| yes +| + +| `/setting` +| <> +| setting +| yes +| ValueSet (openEHR `setting` group) + +| `/_end_time` +| <> +| end_time +| no +| + +| `/_location` +| String +| location +| no +| Free-text label (e.g. "Ward A3"); not a date-time. + +| `/_health_care_facility` +| <> +| health_care_facility +| no +| + +| `/_participation:i` +| <> +| participations +| no +| +|=== + +NOTE: `other_context` (RM `ITEM_STRUCTURE`) is not represented as a leaf in this table; archetyped context content is serialised under its own archetype-id paths within the COMPOSITION body, not under `/context`. The leading underscore on `_end_time`, `_location`, `_health_care_facility` and `_participation:i` marks them as optional RM-level attributes (see <>). + +[[PARTICIPATION]] +== PARTICIPATION + +See RM specification of the https://specifications.openehr.org/releases/RM/latest/common.html#_participation_class[PARTICIPATION] class. + +The `performer` (`PARTY_IDENTIFIED`) is inlined: its attributes are emitted at the same level as `function` and `mode`, rather than nested under `/performer`. + +[source,json] +---- +{ + "conformance-ehrbase.de.v0/context/_participation:0|function": "requester", + "conformance-ehrbase.de.v0/context/_participation:0|mode": "face-to-face communication", + "conformance-ehrbase.de.v0/context/_participation:0|name": "Dr. Marcus Johnson", + "conformance-ehrbase.de.v0/context/_participation:0|id": "199", + "conformance-ehrbase.de.v0/context/_participation:0|id_scheme": "HOSPITAL-NS", + "conformance-ehrbase.de.v0/context/_participation:0|id_namespace": "HOSPITAL-NS", + "conformance-ehrbase.de.v0/context/_participation:0|identifiers_id:0": "122", + "conformance-ehrbase.de.v0/context/_participation:0|identifiers_issuer:0": "issuer", + "conformance-ehrbase.de.v0/context/_participation:0|identifiers_assigner:0": "assigner", + "conformance-ehrbase.de.v0/context/_participation:0|identifiers_type:0": "type" +} +---- + +[cols="5*", options="header"] +|=== +| Flat Path +| Flat type +| RM Path +| Required +| Note + +| `\|function` +| String +| function.value +| yes +| + +| `\|mode` +| String +| mode.value +| no +| ValueSet (openEHR `participation mode` group) + | `\|name` | String -| name +| performer.name | no | | `\|id` | String -| external_ref.id.value +| performer.external_ref.id.value | no | | `\|id_scheme` | String -| external_ref.id.scheme +| performer.external_ref.id.scheme | no | | `\|id_namespace` | String -| external_ref.id.namespace +| performer.external_ref.namespace | (yes) -| required if id is set +| required if `\|id` is set. (RM `OBJECT_REF` has `namespace` directly on the reference, not nested under `id`.) -| `/_identifier:i` -| <> -| identifiers +| `\|identifiers_id:i` +| String +| performer.identifiers[i].id +| no +| + +| `\|identifiers_issuer:i` +| String +| performer.identifiers[i].issuer +| no +| + +| `\|identifiers_assigner:i` +| String +| performer.identifiers[i].assigner +| no +| + +| `\|identifiers_type:i` +| String +| performer.identifiers[i].type | no | |=== +NOTE: PARTICIPATION's `time` (RM `DV_INTERVAL`) is not currently emitted by FLAT mappings. Entries with a constrained participation `time` interval require the canonical RM JSON form. + +[[participation_party_related]] +=== PARTY_RELATED performer + +When the `performer` is a `PARTY_RELATED` (a sub-type of `PARTY_IDENTIFIED` that carries a `relationship: DV_CODED_TEXT`), the `relationship` attribute is emitted as a sub-path under the participation, with the standard <> suffixes (`\|code`, `\|value`, `\|terminology`): + +[source,json] +---- +{ + "conformance-ehrbase.de.v0/context/_participation:0|function": "next of kin", + "conformance-ehrbase.de.v0/context/_participation:0|name": "Susan Doe", + "conformance-ehrbase.de.v0/context/_participation:0/relationship|code": "10", + "conformance-ehrbase.de.v0/context/_participation:0/relationship|value": "mother", + "conformance-ehrbase.de.v0/context/_participation:0/relationship|terminology": "openehr" +} +---- + +[cols="5*", options="header"] +|=== +| Flat Path +| Flat type +| RM Path +| Required +| Note + +| `/relationship` +| <> +| relationship (when `performer` is `PARTY_RELATED`) +| (yes) +| Required when `performer` is a `PARTY_RELATED`; not present otherwise. +|=== + +NOTE: Implementation status — ehrbase reads and writes this path (`PartyRelatedStdConfig.addRelationship`); Better's `ParticipationToFlatMapper` currently treats the performer as `PARTY_IDENTIFIED` only and does not emit `relationship`. Producers that need cross-implementation portability for a `PARTY_RELATED` performer should either fall back to canonical RM JSON or limit usage to ehrbase-side flows until parity is established. + [[OBJECT_REF]] == OBJECT_REF @@ -1524,7 +1659,7 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | `\|id_namespace` | String -| external_ref.id.namespace +| external_ref.namespace | (yes) | required if id is set |=== @@ -1583,7 +1718,7 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | `\|id_namespace` | String -| external_ref.id.namespace +| external_ref.namespace | (yes) | required if id is set @@ -1654,7 +1789,7 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | `\|id_namespace` | String -| external_ref.id.namespace +| external_ref.namespace | (yes) | required if id is set @@ -1863,6 +1998,7 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates "conformance-ehrbase.de.v0/conformance_section/conformance_observation/any_event:0/dv_coded_text|value": "term1", "conformance-ehrbase.de.v0/conformance_section/conformance_observation/any_event:0/dv_coded_text|code": "at0006", "conformance-ehrbase.de.v0/conformance_section/conformance_observation/any_event:0/dv_coded_text|terminology": "local", + "conformance-ehrbase.de.v0/conformance_section/conformance_observation/any_event:0/dv_coded_text|preferred_term": "Term One", "conformance-ehrbase.de.v0/conformance_section/conformance_observation/any_event:0/dv_coded_text|formatting": "plain", "conformance-ehrbase.de.v0/conformance_section/conformance_observation/any_event:0/dv_coded_text/_language|code": "en", "conformance-ehrbase.de.v0/conformance_section/conformance_observation/any_event:0/dv_coded_text/_language|terminology": "ISO_639-1", @@ -1878,6 +2014,15 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates } ---- +Free-text value when the archetype constraint allows an open value-set (`listOpen: true` in the web template): + +[source,json] +---- +{ + "conformance-ehrbase.de.v0/conformance_section/conformance_observation/any_event:0/dv_coded_text|other": "free-text value not in the coded list" +} +---- + [cols="5*", options="header"] |=== | Flat Path @@ -1904,6 +2049,18 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | (yes) | only required for external terminologies +| `\|preferred_term` +| String +| defining_code.preferred_term +| no +| Optional preferred display rubric for the `defining_code`. See the `\|preferred_term` row of <> for the analogous mapping on a bare `CODE_PHRASE`. + +| `\|other` +| String +| _value_ (as `<>`) +| no +| Free-text value used when the constraint allows an open value-set (`listOpen: true` in the web template). When `\|other` is set, `\|code`, `\|value`, `\|terminology` and `\|preferred_term` MUST NOT be set; the leaf is serialised in the canonical RM as a `DV_TEXT` rather than a `DV_CODED_TEXT`. + | `\|formatting` | String | formatting @@ -1929,6 +2086,16 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | |=== +=== When a `DV_CODED_TEXT` becomes a `DV_TEXT` + +Where the archetype constraint allows an open value-set (`listOpen: true` in the web template; non-`limit-to-list` in ADL), a leaf bound to `DV_CODED_TEXT` may be populated with a free-text value via the `\|other` suffix. In that case: + +* the canonical RM serialisation of the leaf is a <>, not a `DV_CODED_TEXT` with empty `defining_code`; +* `\|other` is mutually exclusive with `\|code`, `\|value`, `\|terminology` and `\|preferred_term` on the same leaf; +* on a closed list (`listOpen: false`), `\|other` MUST be rejected. + +See <> for the cross-cutting rule and rationale. + [[DV_ORDINAL]] == DV_ORDINAL @@ -2199,13 +2366,13 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | String | magnitude_status | no -| ValueSet (",>,>=,<,\<=,~) +| ValueSet (=,>,>=,<,\<=,~) | `\|normal_status` | String -| normal_status +| normal_status.code_string | no -| ValueSet normal_status +| ValueSet `normal_statuses` (codes `HHH`, `HH`, `H`, `N`, `L`, `LL`, `LLL`). The FLAT carries only the `code_string`; the underlying `CODE_PHRASE` terminology is implicitly `openehr`. | `\|accuracy` | Real @@ -2303,6 +2470,12 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | yes | ValueSet proportion_kind +| `\|precision` +| Integer +| precision +| no +| Number of decimal places to which `\|numerator` and `\|denominator` are expressed. Value `0` implies integral; `-1` implies no limit. + | | Real | magnitude @@ -2313,13 +2486,25 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | String | magnitude_status | no -| ValueSet (",>,>=,<,\<=,~) +| ValueSet (=,>,>=,<,\<=,~) + +| `\|accuracy` +| Real +| accuracy +| no +| Half-range accuracy of measurement. Interpretation depends on `\|accuracy_is_percent`. A value of `0` means accuracy is 100% (no error). + +| `\|accuracy_is_percent` +| Boolean +| accuracy_is_percent +| no +| When `true`, `\|accuracy` is a percentage (0–100); when `false` or absent, `\|accuracy` is an absolute quantity in the same units as the value. | `\|normal_status` | String -| normal_status +| normal_status.code_string | no -| ValueSet normal_status +| ValueSet `normal_statuses` (codes `HHH`, `HH`, `H`, `N`, `L`, `LL`, `LLL`). The FLAT carries only the `code_string`; the underlying `CODE_PHRASE` terminology is implicitly `openehr`. | `/_normal_range` | <> @@ -2379,13 +2564,25 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | String | magnitude_status | no -| ValueSet (",>,>=,<,\<=,~) +| ValueSet (=,>,>=,<,\<=,~) | `\|normal_status` | String -| normal_status +| normal_status.code_string +| no +| ValueSet `normal_statuses` (codes `HHH`, `HH`, `H`, `N`, `L`, `LL`, `LLL`). The FLAT carries only the `code_string`; the underlying `CODE_PHRASE` terminology is implicitly `openehr`. + +| `\|accuracy` +| Real +| accuracy +| no +| Half-range accuracy of measurement. Interpretation depends on `\|accuracy_is_percent`. A value of `0` means accuracy is 100% (no error). + +| `\|accuracy_is_percent` +| Boolean +| accuracy_is_percent | no -| ValueSet normal_status +| When `true`, `\|accuracy` is a percentage (0–100); when `false` or absent, `\|accuracy` is an absolute quantity in the same units as the value. | `/_normal_range` | <> @@ -2450,13 +2647,13 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | String | magnitude_status | no -| ValueSet (",>,>=,<,\<=,~) +| ValueSet (=,>,>=,<,\<=,~) | `\|normal_status` | String -| normal_status +| normal_status.code_string | no -| ValueSet normal_status +| ValueSet `normal_statuses` (codes `HHH`, `HH`, `H`, `N`, `L`, `LL`, `LLL`). The FLAT carries only the `code_string`; the underlying `CODE_PHRASE` terminology is implicitly `openehr`. | `/_normal_range` | <> @@ -2474,7 +2671,7 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates [[DV_DATE_TIME]] == DV_DATE_TIME -See RM specification of the https://specifications.openehr.org/releases/RM/latest/data_types.html#_dv_date_class[DV_DATE] class. +See RM specification of the https://specifications.openehr.org/releases/RM/latest/data_types.html#_dv_date_time_class[DV_DATE_TIME] class. [source,json] ---- @@ -2510,7 +2707,7 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | String | value | Yes -| ISO8601 date +| ISO8601 date-time | `/_accuracy` | <> @@ -2522,13 +2719,13 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | String | magnitude_status | no -| ValueSet (",>,>=,<,\<=,~) +| ValueSet (=,>,>=,<,\<=,~) | `\|normal_status` | String -| normal_status +| normal_status.code_string | no -| ValueSet normal_status +| ValueSet `normal_statuses` (codes `HHH`, `HH`, `H`, `N`, `L`, `LL`, `LLL`). The FLAT carries only the `code_string`; the underlying `CODE_PHRASE` terminology is implicitly `openehr`. | `/_normal_range` | <> @@ -2545,12 +2742,12 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates == DV_TIME -See RM specification of the https://specifications.openehr.org/releases/RM/latest/data_types.html#_dv_date_class[DV_DATE] class. +See RM specification of the https://specifications.openehr.org/releases/RM/latest/data_types.html#_dv_time_class[DV_TIME] class. [source,json] ---- { - "conformance-ehrbase.de.v0/conformance_section/conformance_observation/any_event:0/dv_date": "2022-01-12" + "conformance-ehrbase.de.v0/conformance_section/conformance_observation/any_event:0/dv_time": "13:22:34.000868+01:00" } ---- @@ -2581,7 +2778,7 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | String | value | Yes -| ISO8601 date +| ISO8601 time | `/_accuracy` | <> @@ -2593,13 +2790,13 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | String | magnitude_status | no -| ValueSet (",>,>=,<,\<=,~) +| ValueSet (=,>,>=,<,\<=,~) | `\|normal_status` | String -| normal_status +| normal_status.code_string | no -| ValueSet normal_status +| ValueSet `normal_statuses` (codes `HHH`, `HH`, `H`, `N`, `L`, `LL`, `LLL`). The FLAT carries only the `code_string`; the underlying `CODE_PHRASE` terminology is implicitly `openehr`. | `/_normal_range` | <> @@ -2662,7 +2859,7 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | no | -| accuracy_is_percent +| `\|accuracy_is_percent` | Boolean | accuracy_is_percent | no @@ -2672,13 +2869,13 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | String | magnitude_status | no -| ValueSet (",>,>=,<,\<=,~) +| ValueSet (=,>,>=,<,\<=,~) | `\|normal_status` | String -| normal_status +| normal_status.code_string | no -| ValueSet normal_status +| ValueSet `normal_statuses` (codes `HHH`, `HH`, `H`, `N`, `L`, `LL`, `LLL`). The FLAT carries only the `code_string`; the underlying `CODE_PHRASE` terminology is implicitly `openehr`. | `/_normal_range` | <> @@ -2886,7 +3083,7 @@ See RM specification of the https://specifications.openehr.org/releases/RM/lates | no | -| `\|media_type` +| `\|mediatype` | String | media_type.code_string | Yes