/// <summary> /// Handles an update. /// </summary> /// <param name="message">The request.</param> /// <param name="evt">The <see cref="Hl7MessageReceivedEventArgs" /> instance containing the event data.</param> /// <returns>Returns the response message from the merge event.</returns> /// <exception cref="System.InvalidOperationException"></exception> internal IMessage HandlePixUpdate(NHapi.Model.V231.Message.ADT_A01 message, Hl7MessageReceivedEventArgs evt) { var dataService = ApplicationContext.Current.GetService <IPatientRepositoryService>(); // Create a details array var details = new List <IResultDetail>(); // Validate the inbound message MessageUtil.Validate(message, details); IMessage response = null; // Control if (message == null) { return(null); } try { // Create Query Data var data = MessageUtil.CreatePatient(message.MSH, message.EVN, message.PID, message.PD1, details); if (data == null) { throw new InvalidOperationException(ApplicationContext.Current.GetLocaleString("MSGE00A")); } var result = dataService.Save(data); if (result == null || result.VersionKey == null) { throw new InvalidOperationException(ApplicationContext.Current.GetLocaleString("DTPE001")); } //audit = auditUtil.CreateAuditData("ITI-8", result.VersionId.UpdateMode == UpdateModeType.Update ? ActionType.Update : ActionType.Create, OutcomeIndicator.Success, evt, new List<VersionedDomainIdentifier>() { result.VersionId }); // Now process the result response = MessageUtil.CreateNack(message, details, typeof(NHapi.Model.V25.Message.ACK)); MessageUtil.UpdateMSH(new NHapi.Base.Util.Terser(response), message); (response as NHapi.Model.V25.Message.ACK).MSH.MessageType.TriggerEvent.Value = message.MSH.MessageType.TriggerEvent.Value; (response as NHapi.Model.V25.Message.ACK).MSH.MessageType.MessageStructure.Value = "ACK"; } catch (Exception e) { this.traceSource.TraceEvent(TraceEventType.Error, 0, e.ToString()); if (!details.Exists(o => o.Message == e.Message || o.Exception == e)) { details.Add(new ResultDetail(ResultDetailType.Error, e.Message, e)); } response = MessageUtil.CreateNack(message, details, typeof(NHapi.Model.V25.Message.ACK)); } return(response); }
/// <summary> /// Handles the admit. /// </summary> /// <param name="message">The message.</param> /// <param name="eventArgs">The <see cref="Hl7MessageReceivedEventArgs"/> instance containing the event data.</param> /// <returns>IMessage.</returns> /// <exception cref="System.InvalidOperationException"> /// </exception> internal IMessage HandleAdmit(NHapi.Model.V231.Message.ADT_A01 message, Hl7MessageReceivedEventArgs eventArgs) { var patientRepositoryService = ApplicationContext.Current.GetService <IPatientRepositoryService>(); var details = new List <IResultDetail>(); MessageUtil.Validate(message, details); IMessage response; if (message == null) { return(null); } try { var patient = MessageUtil.CreatePatient(message.MSH, message.EVN, message.PID, message.PD1, details); if (details.Count(d => d.Type == ResultDetailType.Error) > 0) { throw new InvalidOperationException(ApplicationContext.Current.GetLocaleString("MSGE00A")); } var result = patientRepositoryService.Insert(patient); if (result?.VersionKey == null) { throw new InvalidOperationException(ApplicationContext.Current.GetLocaleString("DTPE001")); } response = MessageUtil.CreateNack(message, details, typeof(ACK)); MessageUtil.UpdateMSH(new Terser(response), message); (response as ACK).MSH.MessageType.TriggerEvent.Value = message.MSH.MessageType.TriggerEvent.Value; (response as ACK).MSH.MessageType.MessageStructure.Value = "ACK"; } catch (Exception e) { #if DEBUG this.traceSource.TraceEvent(TraceEventType.Error, 0, e.StackTrace); #endif this.traceSource.TraceEvent(TraceEventType.Error, 0, e.Message); if (!details.Exists(o => o.Message == e.Message || o.Exception == e)) { details.Add(new ResultDetail(ResultDetailType.Error, e.Message, e)); } response = MessageUtil.CreateNack(message, details, typeof(ACK)); } return(response); }
/// <summary> /// Handle a PIX admission /// </summary> private IMessage HandlePixAdmit(NHapi.Model.V231.Message.ADT_A01 request, Hl7MessageReceivedEventArgs evt) { // Get config var config = this.Context.GetService(typeof(ISystemConfigurationService)) as ISystemConfigurationService; var locale = this.Context.GetService(typeof(ILocalizationService)) as ILocalizationService; var dataService = this.Context.GetService(typeof(IClientRegistryDataService)) as IClientRegistryDataService; // Create a details array List <IResultDetail> dtls = new List <IResultDetail>(); // Validate the inbound message MessageUtil.Validate((IMessage)request, config, dtls, this.Context); IMessage response = null; // Control if (request == null) { return(null); } // Data controller AuditUtil auditUtil = new AuditUtil() { Context = this.Context }; //DataUtil dataUtil = new DataUtil() { Context = this.Context }; // Construct appropriate audit AuditData audit = null; try { // Create Query Data ComponentUtility cu = new ComponentUtility() { Context = this.Context }; DeComponentUtility dcu = new DeComponentUtility() { Context = this.Context }; var data = cu.CreateComponents(request, dtls); if (data == null) { throw new InvalidOperationException(locale.GetString("MSGE00A")); } var result = dataService.Register(data, request.MSH.ProcessingID.ProcessingID.Value == "P" ? DataPersistenceMode.Production : DataPersistenceMode.Debugging); if (result == null || result.VersionId == null) { throw new InvalidOperationException(locale.GetString("DTPE001")); } dtls.AddRange(result.Details); audit = auditUtil.CreateAuditData("ITI-8", result.VersionId.UpdateMode == UpdateModeType.Update ? ActionType.Update : ActionType.Create, OutcomeIndicator.Success, evt, new List <VersionedDomainIdentifier>() { result.VersionId }); // Now process the result response = MessageUtil.CreateNack(request, dtls, this.Context, typeof(NHapi.Model.V231.Message.ACK)); MessageUtil.UpdateMSH(new NHapi.Base.Util.Terser(response), request, config); (response as NHapi.Model.V231.Message.ACK).MSH.MessageType.TriggerEvent.Value = request.MSH.MessageType.TriggerEvent.Value; (response as NHapi.Model.V231.Message.ACK).MSH.MessageType.MessageType.Value = "ACK"; } catch (Exception e) { Trace.TraceError(e.ToString()); if (!dtls.Exists(o => o.Message == e.Message || o.Exception == e)) { dtls.Add(new ResultDetail(ResultDetailType.Error, e.Message, e)); } response = MessageUtil.CreateNack(request, dtls, this.Context, typeof(NHapi.Model.V231.Message.ACK)); audit = auditUtil.CreateAuditData("ITI-8", ActionType.Create, OutcomeIndicator.EpicFail, evt, new List <VersionedDomainIdentifier>()); } finally { IAuditorService auditSvc = this.Context.GetService(typeof(IAuditorService)) as IAuditorService; if (auditSvc != null) { auditSvc.SendAudit(audit); } } return(response); }