It sounded to me like a good opportunity to try out HL7 Soups custom parameters, where I can code up my logic in c#.
Firstly I went through there introduction video on custom transformers, and then grabbed the sample code to base mine transformer on.
I must say that I love the API, it makes coding with HL7 super easy. The trick I found is to make sure you typecast the messages to IHL7Message right at the beginning. It gives you heaps more methods and properties than the basic IMessage type (which is generic because it also works with JSON, CSV, etc).
The only thing I tripped up on was finding the repeat fields themselves. I thought they may have been accessible on the GetFields() method, so I mucked around there for a bit. But actually, they are a property of IField. I just needed to call GetRelatedRepeatFields(), and it gave me an iterator that included the original field and its siblings.
The deployment was easy, and I loved the debugging right in Visual Studio. So much easier than having to log out each line like in Mirth.
Anyway, here is the code I created, hope it helps.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HL7Soup.Integrations;
namespace CustomTransformersSample
{
[DisplayName("Find Patient
Email")]
public class FindPatientEmail : CustomTransformer
{
public override void
Transform(IWorkflowInstance workflowInstance, IMessage message, Dictionary<string, string> parameters)
{
string email = "";
//Get the
incoming message
IHL7Message hl7 = workflowInstance.Activities[0].Message as IHL7Message;
//Find
the PID-14
IHL7Field pid14 = (IHL7Field)hl7.GetPart("PID-14");
if (pid14 != null)
{
//Look at
all the PID 14s
foreach (var repeatField in
pid14.GetRelatedRepeatFields())
{
//Get the
4th component (which is email)
IHL7Component component = repeatField.GetComponent("4");
if (component != null &&
component.Text != "")
{
//Found
the email. Return it.
email = component.Text;
break;
}
}
}
workflowInstance.SetVariable("Patient Email", email);
}
}
}