PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
patient_reconciliation_service.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
19#ifndef PACS_SERVICES_PIR_PATIENT_RECONCILIATION_SERVICE_HPP
20#define PACS_SERVICES_PIR_PATIENT_RECONCILIATION_SERVICE_HPP
21
23
24#include <chrono>
25#include <map>
26#include <optional>
27#include <string>
28#include <vector>
29
31
32// =============================================================================
33// PIR Operation Types
34// =============================================================================
35
44
45// =============================================================================
46// Data Structures
47// =============================================================================
48
54 std::optional<std::string> patient_name;
55
57 std::optional<std::string> patient_id;
58
60 std::optional<std::string> patient_birth_date;
61
63 std::optional<std::string> patient_sex;
64
66 std::optional<std::string> issuer_of_patient_id;
67
69 std::optional<std::string> other_patient_ids;
70};
71
77 std::string target_patient_id;
78
81
83 std::optional<std::string> reason;
84
86 std::optional<std::string> operator_name;
87};
88
94 std::string source_patient_id;
95
97 std::string target_patient_id;
98
100 std::optional<patient_demographics> target_demographics;
101
103 std::optional<std::string> reason;
104
106 std::optional<std::string> operator_name;
107};
108
114 bool success{false};
115
118
121
123 std::string error_message;
124
127
129 std::chrono::system_clock::time_point timestamp{
130 std::chrono::system_clock::now()};
131};
132
138 std::string record_id;
139
142
145 std::optional<std::string> secondary_patient_id;
146
148 std::string operator_name;
149
152
154 std::chrono::system_clock::time_point timestamp;
155
157 bool success{false};
158};
159
160// =============================================================================
161// Patient Reconciliation Service
162// =============================================================================
163
195public:
197
204 bool add_instance(const core::dicom_dataset& dataset);
205
216 const demographics_update_request& request);
217
229 const patient_merge_request& request);
230
237 [[nodiscard]] std::vector<core::dicom_dataset> find_instances(
238 const std::string& patient_id) const;
239
245 [[nodiscard]] size_t instance_count() const noexcept;
246
252 [[nodiscard]] std::vector<std::string> get_patient_ids() const;
253
259 [[nodiscard]] const std::vector<reconciliation_audit_record>&
260 audit_trail() const noexcept;
261
268 [[nodiscard]] std::vector<reconciliation_audit_record>
269 audit_trail_for_patient(const std::string& patient_id) const;
270
271private:
272 void apply_demographics(core::dicom_dataset& dataset,
273 const patient_demographics& demographics) const;
274 std::string generate_record_id() const;
275
276 std::vector<core::dicom_dataset> instances_;
278};
279
283[[nodiscard]] std::string to_string(reconciliation_type type);
284
285} // namespace kcenon::pacs::services::pir
286
287#endif // PACS_SERVICES_PIR_PATIENT_RECONCILIATION_SERVICE_HPP
std::vector< core::dicom_dataset > find_instances(const std::string &patient_id) const
Find all instances for a given patient ID.
bool add_instance(const core::dicom_dataset &dataset)
Add a DICOM instance to the managed store.
size_t instance_count() const noexcept
Get the total number of managed instances.
std::vector< std::string > get_patient_ids() const
Get distinct patient IDs in the store.
reconciliation_result merge_patients(const patient_merge_request &request)
Merge instances from source patient to target patient.
void apply_demographics(core::dicom_dataset &dataset, const patient_demographics &demographics) const
reconciliation_result update_demographics(const demographics_update_request &request)
Update patient demographics across all matching instances.
std::vector< reconciliation_audit_record > audit_trail_for_patient(const std::string &patient_id) const
Get audit records for a specific patient.
const std::vector< reconciliation_audit_record > & audit_trail() const noexcept
Get the audit trail of reconciliation operations.
DICOM Dataset - ordered collection of Data Elements.
reconciliation_type
Type of patient reconciliation operation.
@ patient_link
ADT^A24: link related patients.
@ demographics_update
ADT^A08: update patient demographics.
@ patient_merge
ADT^A40: merge two patients.
std::optional< std::string > operator_name
Operator performing the update.
Updated patient demographics for a reconciliation operation.
std::optional< std::string > patient_name
Patient Name (0010,0010)
std::optional< std::string > patient_birth_date
Patient Birth Date (0010,0030)
std::optional< std::string > other_patient_ids
Other Patient IDs (0010,1000)
std::optional< std::string > issuer_of_patient_id
Issuer of Patient ID (0010,0021)
std::optional< std::string > patient_id
Patient ID (0010,0020)
std::optional< std::string > patient_sex
Patient Sex (0010,0040)
std::string target_patient_id
Patient ID to merge into (target - will retain)
std::optional< std::string > reason
Reason for merge.
std::optional< patient_demographics > target_demographics
Optional updated demographics for the target.
std::optional< std::string > operator_name
Operator performing the merge.
std::string source_patient_id
Patient ID to merge from (source - will be removed)
std::string record_id
Unique identifier for this audit record.
std::chrono::system_clock::time_point timestamp
Timestamp of the operation.
reconciliation_type type
Type of operation performed.