HIPAA Support in BizTalk Server 2006 R2

Hello all!


Please allow me to introduce myself, my name is Tony Bernard and I am a Senior Program Manager on the BizTalk Server team. I am taking over for Suren Machiraju who, as relayed in his final post, has moved on to new and exciting opportunities elsewhere within Microsoft.


I want to take this opportunity to thank Suren for his many years of dedication and leadership on the B2B team!


In my inaugural post, I thought I would discuss a lesser known dimension of the R2 EDI feature set, but one that we have received several questions about – HIPAA support.


Beginning with the R2 release of BizTalk Server 2006 you will no longer need to purchase or install a separate accelerator to get HIPAA support in BizTalk. HIPAA support will be integrated into the EDI engine that installs with R2. In addition to the all the great features that you get with R2 EDI such as partner agreement management, batching, schema extensibility, and interchange/ack reporting you will also get:



  • key HIPAA 4010A transaction set schemas:
    – 270/271 – Eligibility
    – 276/277 – Claim Status
    – 278 – Services Review Request/Response
    – 820 – Payroll Deduction
    – 834 – Benefit Enrollment
    – 835 – Claim Payment
    – 837D – Claim Dental
    – 837I – Claim Institutional
    – 837P – Claim Professional

  • ten other non-HIPAA standard schemas that are widely used in the HIPAA realm, including but not limited to:
     – v3070 277 Healthcare Payer Unsolicited Claim Status
     – v4010 148 Doctor’s First Report of Injury
     – v4040 277 Healthcare Claim Acknowledgement
     – v4050 274 Healthcare Provider Information

  • a schema annotation which enables splitting a multiple part document (e.g. a 837 Claim that has many individual claims) into separate transactions, one for each individual document. This feature is enabled by an annotation called ‘subdocument_break’. When assigned a value of “yes” it will split an inbound transaction into individual transaction sets based on the number of documents included in the original transaction set. For example, an inbound 837D with three separate claims in it would be split into three separate 837D transaction sets with all of the appropriate header information included in each.

  • WEDI/SNIP level 2 validation which includes basic X12 syntax integrity as well as validation of loops, segments, elements and code values.

If there are other HIPAA specific features that you would like to see or you have any specific questions regarding HIPAA functionality let us know.


Happy New Year!
Tony

Searching Text within the archive of HIPAA or Base EDI archive directories

This isagain one of the little known facts when troubleshooting your HIPPA or EDI test or production enviornment. Since the service does not store the original filename of documents that are brought in using the file or ftp recieve handler, you are stuck with having to search for files using the control number and sender/receiver ids. This is ‘officially’ how you are supposed to do it, but how many of us in the EDI/HIPAA world actually have been born and raised following the standards? Rules are made to be broken! Yes, even if we have to adhere to the guidelines for correct payments, there is always the enviornments that we are placed in where the client calls up and states, ‘where did my file go?’ Actually, come to think of it, I have never heard where a client calls in and states, ‘where did my interchange go?’ Yes if we were all using clearing houses it would be one thing, but most (not all) of the clients I have worked for do not. I guess that the client thinks, ‘why pay for a service that does not add any more value than a server that stores files for us that we can host ourselves?’

So the HIPAA and Base EDI stores the data in the %documentshome%\System\External\{Inbox|Outbox} with a continually incrementing number.in/.out filename. A while ago I attempted to search for a particular trading partners files, of course I did not know the filename, I just knew their id and their control number. Actually, I did not know their control number, but I did know their sender id, I just went into the …\External\Inbox\ and searched for * where the ‘A word or phrase in the file:’ I put in their sender id and clicked <Search> came up with nothing. Now I knew that files with that id were in there, but the search capability was not working. I asked the network adminand he said that it was because of a policyrunning on the servers and it could not be changed. I then had to resort to going to aDOS prompt.

New client, same issue. I calledup the network admin and asked themif they could change the policy, smart guy, likable fellow, but his first word was ‘HUH?’ I explained thesituation, that I could not find any files with the text containing their id were found. He placed a .txt file in the folder and filled it witha little known football team’s name ‘Raiders’ and then did a text search for the file. VIOLA-> it found it.

I then told him I would look into it. I found this article. I then found the entry in my registry : HKLM\SYSTEM\ControlSet001\Control\ContentIndex\ and I changed FilterFilesWithUnknownExtensions from Hexidecimal value from 0 to 1 and did my search again and it started finding the files.

This is going to help me track down EDI files significantly!

Interview Questions / FAQ on BizTalk

Here are a few links that might help you to answer some of the BizTalk questions that you may face in a job interview.

All the best 😉

http://geekswithblogs.net/sthomas/archive/2005/12/13/63077.aspx
http://geekswithblogs.net/sthomas/archive/2005/12/29/64404.aspx
http://www.codeproject.com/useritems/BizTalkInterviewQuestions.asp
http://www.netologi.se/default.aspx?Contents=BizTalkFAQ

XML Notepad 2007

Microsoft released an editor for XML files, you can download it here.

Handy features include:
– Tree View synchronized with Node Text View for quick editing of node names and values.
– Incremental search (Ctrl+I) in both tree and text views, so as you type it navigates to matching nodes.
– Cut/copy/paste with full namespace support.
– Drag/drop support for easy manipulation of the tree, even across different instances of XML – Notepad and from the file system.
– Infinite undo/redo for all edit operations.
– In place popup multi-line editing of large text node values.
– Configurable fonts and colors via the options dialog.
– Full find/replace dialog with support for regex and XPath.
– Good performance on large XML documents, loading a 3mb document in about one second.
– Instant XML schema validation while you edit with errors and warnings shown in the task list window.
– Intellisense based on expected elements and attributes and enumerated simple type values.
– Support for custom editors for date, dateTime and time datatypes and other types like color.
– Handy nudge tool bar buttons for quick movement of nodes up and down the tree.
– Inplace HTML viewer for processing xml-stylesheet processing instructions.
– Built-in XML Diff tool. New features included in this version:
– Added keyboard accelerators for find again (F3) and reverse find (SHIFT+F3).
– Added support for loading IXmlBuilder and IXmlEditor implementations from different assemblies using new vs:assembly attribute.
– Made source code localizable by moving all error messages and dialog strings to .resx files.
– Added a default XSL transform.

New icons, a play on the Vista “Notepad” icons. Bug Fixes included in this version:
– Fixed install on Windows Vista machines using Windows Installer XML 3.0.
– Performance of expand node when validating.
– Fixed bug where changed schemas and transforms were not being re-loaded.
– Fixed spurious warnings about file being changed on disk.
– Fixed handling of very long text nodes.
– Fixed round trip of DTD content in tags.
– Fixed validation of elements with xsi:type attributes.
– Scroll bar not updating when node expanded/collapsed in some cases.
– Tree view needs horizontal scrollbar.
– When XML Notepad is minimized and file changes on disk, the file reload prompt is confusing. – Notepad should be restored first.
– XSL output window should pick up new xsl-transform based on input document.
– Fixed unhandled exception when closing a group of XML notepad windows.
– Added registration of “Edit” action for .xml file extension.
– Move source code to CodePlex.

My predictions for 2007

As expected here are some predictions (not in order) for 2007:

o   OASIS finally approves WS-ReliableMessaging and we don’t hear about WS-Reliability anymore.

o   The rise of Semantic Web: We should see more vendors supporting RDF, SPARQL, etc and consequently more developers changing the way Web sites exposes data.

o   SaaS adoption keeps growing: We should expect to see more and more classic enterprise applications moving to SaaS models.

o   .NET 3.0 established itself as a foundation for other Microsoft products: You can argue that’s already true but we should see more products leveraging .NET 3.0 (particularly WCF, WF and Card Space). Among others BizTalk R2, Speech Server 2007, MIIS 3.5 already announced the use of .NET 3.0

o   SCA-JBI becomes an alternative to classic J2EE: Fortunately will be a clear fragmentation between the classic J2EE model (EJB, JMS, JNDI, etc) and the new series of SOA-based Standards (JBI, SCA, etc)

o   WS-* are finally implemented for Ruby On Rails, PHP and Python: WS-Addressing and WS-Security will be the first ones as always.

o   SOA Governance becomes real: Together with the rise of IT Web Services solutions. IT departments will start investing on SOA Governance Frameworks

o   The rise of resource-oriented services: I think we should stop thinking of resource-oriented services as just REST and start implementing more serious alternatives like WS-ResourceTransfer, WS-Resource Framework, RDF,  etc.

o   More Domain Specific Languages for vertical markets: Arguably some of the most notable DSLs have been applied to horizontal solutions (WSBPEL, XAML, WSCI, etc). I expect to see more architects designing DSLs to address Standard problems for vertical industries.

o   Two Connect opens 6 new consulting practices: This one is important enough for me to be on this list.

 

Using BizTalk Server For Email Alert Bus

Just recently I had a customer ask me if they could use their existing BizTalk infrastructure to manage events that were spawned from their primary application.   So, I built a small demonstration that I’ve outlined here.

Basically, this company’s primary application triggers events that should result in email notifications.  They wanted something that could listen for these events, send emails, and be flexible and easy to modify.  The key is that last part.  I wanted to build something that would not require a code change or redeployment if new events were added or email formats had to change.

I started with a basic schema.  All that I get from the primary application is the “event source” and “event ID”.  So I need an orchestration that will fetch the additional data needed to send and format the email alert.  From the base schema, I created another schema that BizTalk will actually use to send the alert.  It looks like this:

I’ve now got a “Template” node which will hold the physical location of the XSLT template, and an “OptionalText” node which will hold any additional text we want to include in the email message (HTML markup supported!).

Next I needed a pipeline to do the XSLT conversion.  If you recall, the BizTalk SDK ships with a sample for using XSLT to build an HTML formatted email message.  I needed to modify that sample because instead of getting the “template” property at design time, I need to use a run-time value.  So, I copied the code from the SDK sample, and modified the core Execute method:

public IBaseMessage Execute(IPipelineContext pc, IBaseMessage inmsg)
{
//variable to grab out template location (promoted value)
string templatePath = inmsg.Context.Read(“TemplateLocation”, “http://CompanyA.PrimaryApp.EmailNotification.ApplicationAlertPropSchema”).ToString();
//call helper method, passing in stream and template path
inmsg.BodyPart.Data = TransformMessage(inmsg.BodyPart.Data, templatePath);
inmsg.BodyPart.ContentType = “text/html”;
return inmsg;
}

 Ok, now I had to consume this custom pipeline component.  My new “send” pipeline in Visual Studio looks like this:

I threw the XML Assembler in there just to be sure that my “TemplateLocation” value would get promoted into context.  Probably unnecessary, but what the heck.

Next we needed the Business Rules that will store the key information needed to construct the email message.  Based on the source of the event, we need to designate a recipient, subject, extra “body” information, and template to be used.  One of the rules I built looks like this:

Note that the (optional) body text field contains HTML markup.  You may also see that I perform the Halt command at the bottom.  If that rule fires, then I want to halt further rule execution. I wanted to be able to handle unknown events, so each defined alert had a Priority number set in the Business Rules Composer. Finally, I created one final rule with a Priority of 0, which by design, will only fire if all preceding rules have been ignored (that is, it’s an event that wasn’t recognized by any earlier rules and processing halted).  That “catch all” rule looks like this:

Almost there.  Now, an orchestration is needed to tie all this together.  My process flow consists of receiving a message, instantiating a .NET class (which holds all the email details), calling my Business Rule(s), building the output message, and sending the message out.  The flow looks like this:

The main guts of this process exist in the final Construct shape.  You’ll see that the Construct shape exists in an Atomic Scope.  That’s because I needed to use a variable of type XmlElement.  Why?  Here’s the code for the Message Assignment:

Create outbound message from inbound message
AlertOutput = AlertInput;
Get the XML element holding the optional text
xmlElem = xpath(AlertOutput, “/*[local-name()=’ApplicationAlert’ and namespace-uri()=’http://CompanyA.PrimaryApp.EmailNotification’]/*[local-name()=’OptionalText’ and namespace-uri()=”]”);
Set the “innerXML” equal to the HTML markup
xmlElem.InnerXml = EmailData.EmailBody;
Set the template to use
AlertOutput.Template = EmailData.EmailTemplate;
Set all the needed email properties
SendFASTAlertPort(Microsoft.XLANGs.BaseTypes.Address) = “mailto:” + EmailData.EmailTo;
AlertOutput(SMTP.From) = EmailData.EmailFrom;
AlertOutput(SMTP.Subject) = EmailData.EmailSubject;
AlertOutput(SMTP.SMTPHost) = “WS03VSSQL05”;

 I had to do the whole “XmlElement” thing because just setting the HTML string equal to the OptionalText field caused the HTML markup to get jumbled.  By using InnerXML on the XMLElement, the HTML (really just valid XML) gets thrown under the OptionalText field as XML data, tags intact.  Pretty handy.

Finally, I built and deployed this whole thing.  I then wrote a few XSLT templates to format my HTML email.  After feeding a few different alerts into BizTalk, my Outlook mailbox contained the following messages:

You’ll see the last sentence in each email “body” represents the HTML markup set in the Business Rule.  So, now I have an architecture where someone could change just the XSLT template and modify the entire alert message.  If you wanted to add new events to be specifically handled, all that’s required is a new business rule, and optionally, a new XSLT template.  Pretty simple!

Technorati Tags: BizTalk

Favourite C# Blog

One of my favourite C# blogs at the moment is ‘I know the answer (it’s 42)‘ by Abhinaba Basu (http://blogs.msdn.com/abhinaba/). Abhinaba currently works for Microsoft at the development centre in Hyderabad, India.
I really like this blog becuase Abhinaba goes beyond the code an explains why things work the way they do, getting deep into the […]

Add DOCTYPE Declaration Component

Our current infrastructure supports over 200 interfaces with external trading partners in the B2B role. Unfortunately, some of the cXML partners cannot handle Xml Namespaces and insist on receiving DOCTYPES.
Although DOCTYPE’s can be added through the BizTalk mapper, we needed a mechanism to remove the Xml Namespace from the resultant message before passing through to […]