38 lines
1.4 KiB
C#
38 lines
1.4 KiB
C#
using Hl7.Fhir.Model;
|
|
using Task = System.Threading.Tasks.Task;
|
|
|
|
public class MedicationAdministrationFhirMapper
|
|
{
|
|
private readonly FhirReferenceResolver _refs;
|
|
|
|
public MedicationAdministrationFhirMapper(FhirReferenceResolver refs) => _refs = refs;
|
|
|
|
public async Task<(CreateMedicationAdministrationRequest Request, Guid EncounterId)> ToCreateRequestAsync(
|
|
Hl7.Fhir.Model.MedicationAdministration fhir)
|
|
{
|
|
if (fhir.Context is null)
|
|
throw new FhirMappingException(
|
|
"MedicationAdministration context is required.", "required");
|
|
|
|
var encounterId = await _refs.ResolveEncounterReferenceAsync(fhir.Context);
|
|
|
|
var drugName = fhir.Medication is CodeableConcept cc
|
|
? cc.Text ?? cc.Coding?.FirstOrDefault()?.Display ?? "Unknown"
|
|
: "Unknown";
|
|
|
|
var dose = fhir.Dosage?.Dose as Quantity;
|
|
var route = fhir.Dosage?.Route?.Text ?? fhir.Dosage?.Route?.Coding?.FirstOrDefault()?.Display ?? "IV";
|
|
var performer = fhir.Performer?.FirstOrDefault()?.Actor?.Display ?? "Unknown";
|
|
|
|
var req = new CreateMedicationAdministrationRequest(
|
|
DrugName: drugName,
|
|
Dose: dose?.Value ?? 0m,
|
|
DoseUnit: dose?.Unit ?? "mg",
|
|
Route: route,
|
|
AdministeredAt: fhir.Effective.ToUtcDateTimeOffset(),
|
|
AdministeredBy: performer);
|
|
|
|
return (req, encounterId);
|
|
}
|
|
}
|