1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
//! EpisodeOfCare
//!
//! URL: http://hl7.org/fhir/StructureDefinition/EpisodeOfCare
//!
//! Version: 5.0.0
//!
//! EpisodeOfCare Resource: An association between a patient and an organization / healthcare provider(s) during which time encounters may occur.
//!
//! FHIR: <https://build.fhir.org/>
//!
//! UML: <https://build.fhir.org/uml.html>
// Allow unused crate::r5::types as types;
#![allow(unused_imports)]
use crate::r5::types;
use ::serde::{Deserialize, Serialize};
use fhir_derive_macros::Validate;
/// An association between a patient and an organization / healthcare
/// provider(s) during which time encounters may occur.
///
/// EpisodeOfCare represents a period during which a managing organization
/// assumes a level of responsibility for a patient's care, potentially
/// spanning many encounters. It groups together the type of care, the medical
/// reasons and diagnoses being addressed, the care manager and care team, and
/// the accounts used for billing. In FHIR R5 it is commonly used to model
/// longitudinal programs such as disease management, specialist referrals, or
/// ongoing treatment relationships.
///
/// Clinically and administratively, an EpisodeOfCare acts as the umbrella
/// under which individual clinical events are grouped: each
/// [`Encounter`](crate::r5::resources::encounter::Encounter) that occurs
/// while the episode is active may reference this resource so that the
/// visits, orders, and results belonging to the same program of care can be
/// tracked and reported together. The `status` and `status_history` fields
/// track the episode's lifecycle from `planned` through `active` to
/// `finished` or `cancelled`, while `reason` and `diagnosis` capture the
/// clinical justification and the conditions being managed.
///
/// Related resources: the `patient` field references the
/// [`Patient`](crate::r5::resources::patient::Patient) who is the focus of
/// the episode, and the type/class of the episode, its reasons, and its
/// diagnoses are typically coded using
/// [`CodeableConcept`](crate::r5::types::CodeableConcept). See also
/// `CareTeam` and `Organization` for related workflow resources.
///
/// # Examples
///
/// ```
/// use fhir::r5::resources::episode_of_care::EpisodeOfCare;
///
/// let value = EpisodeOfCare::default();
/// let json = ::serde_json::to_value(&value).unwrap();
/// let back: EpisodeOfCare = ::serde_json::from_value(json).unwrap();
/// assert_eq!(value, back);
/// ```
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct EpisodeOfCare {
/// Logical id of this artifact
pub id: Option<types::String>,
/// Metadata about the resource
pub meta: Option<types::Meta>,
/// A set of rules under which this content was created
pub implicit_rules: Option<types::Uri>,
/// Language of the resource content
pub language: Option<types::Code>,
/// Text summary of the resource, for human interpretation
pub text: Option<types::Narrative>,
/// Contained, inline Resources
pub contained: Option<Vec<::serde_json::Value>>,
/// Additional content defined by implementations
pub extension: Option<Vec<types::Extension>>,
/// Extensions that cannot be ignored
pub modifier_extension: Option<Vec<types::Extension>>,
/// Business Identifier(s) relevant for this EpisodeOfCare
pub identifier: Option<Vec<types::Identifier>>,
/// Current lifecycle state of the episode: planned | waitlist | active | onhold | finished | cancelled | entered-in-error
pub status: types::Code,
/// Past list of status codes (the current status may be included to cover the start date of the status)
pub status_history: Option<Vec<EpisodeOfCareStatusHistory>>,
/// Type/class - e.g. specialist referral, disease management
pub r#type: Option<Vec<types::CodeableConcept>>,
/// The list of medical reasons that are expected to be addressed during the episode of care
pub reason: Option<Vec<EpisodeOfCareReason>>,
/// The list of medical conditions that were addressed during the episode of care
pub diagnosis: Option<Vec<EpisodeOfCareDiagnosis>>,
/// Reference to the [`Patient`](crate::r5::resources::patient::Patient) who is the focus of this episode of care
pub patient: types::Reference,
/// Organization that assumes overall responsibility for care coordination during the episode
pub managing_organization: Option<types::Reference>,
/// Interval during which the managing organization's responsibility is assumed
pub period: Option<types::Period>,
/// Originating Referral Request(s)
pub referral_request: Option<Vec<types::Reference>>,
/// Care manager/care coordinator for the patient
pub care_manager: Option<types::Reference>,
/// Other practitioners facilitating this episode of care
pub care_team: Option<Vec<types::Reference>>,
/// The set of accounts that may be used for billing for this EpisodeOfCare
pub account: Option<Vec<types::Reference>>,
}
/// Past list of status codes (the current status may be included to cover the
/// start date of the status).
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct EpisodeOfCareStatusHistory {
/// Unique id for inter-element referencing
pub id: Option<types::String>,
/// Additional content defined by implementations
pub extension: Option<Vec<types::Extension>>,
/// Extensions that cannot be ignored even if unrecognized
pub modifier_extension: Option<Vec<types::Extension>>,
/// planned | waitlist | active | onhold | finished | cancelled | entered-in-error
pub status: types::Code,
/// Duration the EpisodeOfCare was in the specified status
pub period: types::Period,
}
/// The list of medical reasons that are expected to be addressed during the
/// episode of care.
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct EpisodeOfCareReason {
/// Unique id for inter-element referencing
pub id: Option<types::String>,
/// Additional content defined by implementations
pub extension: Option<Vec<types::Extension>>,
/// Extensions that cannot be ignored even if unrecognized
pub modifier_extension: Option<Vec<types::Extension>>,
/// What the reason value should be used for/as
pub r#use: Option<types::CodeableConcept>,
/// Medical reason to be addressed
pub value: Option<Vec<types::CodeableReference>>,
}
/// The list of medical conditions that were addressed during the episode of
/// care.
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct EpisodeOfCareDiagnosis {
/// Unique id for inter-element referencing
pub id: Option<types::String>,
/// Additional content defined by implementations
pub extension: Option<Vec<types::Extension>>,
/// Extensions that cannot be ignored even if unrecognized
pub modifier_extension: Option<Vec<types::Extension>>,
/// The medical condition that was addressed during the episode of care
pub condition: Option<Vec<types::CodeableReference>>,
/// Role that this diagnosis has within the episode of care (e.g. admission, billing, discharge …)
pub r#use: Option<types::CodeableConcept>,
}
#[cfg(test)]
mod tests {
use super::*;
type T = EpisodeOfCare;
#[test]
fn test_default() {
let _ = T::default();
}
#[test]
fn test_serde_round_trip() {
let value = T::default();
let json = ::serde_json::to_value(&value).expect("to_value");
let back: T = ::serde_json::from_value(json).expect("from_value");
assert_eq!(value, back);
}
}