/// <summary> /// Create an Ack message based on a received message /// </summary> /// <param name="inboundMessage">received message</param> /// <param name="ackCode">Should be "AE" or "AR", can be "AA".</param> /// <param name="errorMessage">The reason the message was rejected or an error. If "AA" was supplied as ackCode the errorMessage should be null.</param> /// <returns>Created ACK message</returns> public static IMessage MakeACK(IMessage inboundMessage, string ackCode, string errorMessage) { IMessage ackMessage = null; // Get an object from the right ACK class string ackClassType = string.Format("NHapi.Model.V{0}.Message.ACK, NHapi.Model.V{0}", inboundMessage.Version.Remove(inboundMessage.Version.IndexOf('.'), 1)); Type x = Type.GetType(ackClassType); ackMessage = (IMessage)Activator.CreateInstance(x); Terser inboundTerser = new Terser(inboundMessage); ISegment inboundHeader = null; inboundHeader = inboundTerser.getSegment("MSH"); // Find the HL7 version of the inbound message: // string version = null; try { version = Terser.Get(inboundHeader, 12, 0, 1, 1); } catch (NHapi.Base.HL7Exception) { // I'm not happy to proceed if we can't identify the inbound // message version. throw new NHapi.Base.HL7Exception("Failed to get valid HL7 version from inbound MSH-12-1"); } // Create a Terser instance for the outbound message (the ACK). Terser terser = new Terser(ackMessage); // Populate outbound MSH fields using data from inbound message ISegment outHeader = (ISegment)terser.getSegment("MSH"); DeepCopy.copy(inboundHeader, outHeader); // Now set the message type, HL7 version number, acknowledgement code // and message control ID fields: string sendingApp = terser.Get("/MSH-3"); string sendingEnv = terser.Get("/MSH-4"); terser.Set("/MSH-3", CommunicationName); terser.Set("/MSH-4", EnvironmentIdentifier); terser.Set("/MSH-5", sendingApp); terser.Set("/MSH-6", sendingEnv); terser.Set("/MSH-7", DateTime.Now.ToString("yyyyMMddmmhh")); terser.Set("/MSH-9", "ACK"); terser.Set("/MSH-12", version); terser.Set("/MSA-1", ackCode == null ? "AA" : ackCode); terser.Set("/MSA-2", Terser.Get(inboundHeader, 10, 0, 1, 1)); // Set error message if (errorMessage != null) { terser.Set("/ERR-7", errorMessage); } return(ackMessage); }
private void SetACK(AckTypes ackType, String messageString) { Terser terser = new Terser(hl7Ack.Message); ISegment err = terser.getSegment("/ERR(0)"); ISegment criticalSegment = TryToRecoverCriticalDataFromMessage(messageString); try { FillMSHSegment((ISegment)hl7Ack.Message.GetStructure("MSH"), criticalSegment); if (criticalSegment == null) { terser.Set("/MSA-1", Enum.GetName(typeof(AckTypes), ackType)); terser.Set("/MSA-2", ""); } else { terser.Set("/MSA-1", Enum.GetName(typeof(AckTypes), ackType)); terser.Set("/MSA-2", Terser.Get(criticalSegment, 10, 0, 1, 1)); } } catch (HL7Exception he) { _errorMessage.Append(he.Message); return; //do not throw exceptions; } //terser.Set("ERR(0)-7", _errorMessage); terser.Set("/ERR(0)-7-1-1", _errorMessage.ToString()); }
/// <summary> /// Set request message parameters /// </summary> protected void SetRequestMessageParams(NHapi.Base.Model.IMessage request) { Terser setTerser = new Terser(request); setTerser.Set("/MSH-7", DateTime.Now.ToString("yyyyMMddHHmmss")); setTerser.Set("/EVN-2", DateTime.Today.ToString("yyyyMMdd")); }
/// Create an Ack message based on a received message/// /// received message/// /// Acknowlegde code/// /// Message to be created/// /// Created message public string MakeACK(string AckHead, string version, string ackCode, IMessage ackMessage) { // Create a Terser instance for the outbound message (the ACK). Terser terser = new Terser(ackMessage); // Populate outbound MSH fields using data from inbound message // Now set the message type, HL7 version number, acknowledgement code // and message control ID fields: string sendingApp = terser.Get("/MSH-3"); string sendingEnv = terser.Get("/MSH-4"); string CommunicationNameOfThisApplication = string.Empty; string EnvironmentIdentifierOfThisApplication = string.Empty; terser.Set("/MSH-3", CommunicationNameOfThisApplication); terser.Set("/MSH-4", EnvironmentIdentifierOfThisApplication); terser.Set("/MSH-5", sendingApp); terser.Set("/MSH-6", sendingEnv); terser.Set("/MSH-7", DateTime.Now.ToString("yyyyMMddmmhh")); terser.Set("/MSH-9", "ACK"); terser.Set("/MSH-12", version); // The ackCode should be "AA" if the message was correctly handled and "AE" if there was an error terser.Set("/MSA-1", ackCode == null ? "AA" : ackCode); terser.Set("/MSA-2", AckHead); return(PipeParser.Encode(ackMessage, new EncodingCharacters('|', '^', '~', '\\', '&'))); }
private void FillMSHSegment(ISegment mshIn, ISegment mshOut) { if (mshOut == null) { throw new System.Exception("mshout"); } Guid g = Guid.NewGuid(); Terser.Set(mshIn, 7, 0, 1, 1, DateTime.Now.ToString("yyyyMMddHHmmss")); Terser.Set(mshIn, 7, 0, 1, 1, DateTime.Now.ToString("yyyyMMddHHmmss")); if (mshIn == null) { Terser.Set(mshIn, 3, 0, 1, 1, ""); Terser.Set(mshIn, 4, 0, 1, 1, ""); Terser.Set(mshIn, 5, 0, 1, 1, ""); Terser.Set(mshIn, 6, 0, 1, 1, ""); Terser.Set(mshIn, 9, 0, 1, 1, "ACK"); } else { Terser.Set(mshIn, 3, 0, 1, 1, Terser.Get(mshIn, 5, 0, 1, 1)); Terser.Set(mshIn, 4, 0, 1, 1, Terser.Get(mshIn, 6, 0, 1, 1)); Terser.Set(mshIn, 5, 0, 1, 1, Terser.Get(mshIn, 3, 0, 1, 1)); Terser.Set(mshIn, 6, 0, 1, 1, Terser.Get(mshIn, 4, 0, 1, 1)); Terser.Set(mshIn, 9, 0, 1, 1, Terser.Get(mshIn, 9, 0, 1, 1)); Terser.Set(mshIn, 9, 0, 2, 1, Terser.Get(mshIn, 9, 0, 2, 1)); } }