protected OrderEditorArgs(DesktopWindow desktopWindow, PatientProfileSummary patientProfile, OrderRequisition requisition, OrderSubmitType submitType)
     : base(desktopWindow)
 {
     PatientProfile = patientProfile;
     Requisition    = requisition;
     SubmitType     = submitType;
 }
Example #2
0
        /// <summary>
        /// Finds the visit specified in the requisition, or if no visit is specified, auto-generates a visit.
        /// </summary>
        /// <param name="requisition"></param>
        /// <param name="patient"></param>
        /// <param name="orderingFacility"></param>
        /// <returns></returns>
        private Visit FindOrCreateVisit(OrderRequisition requisition, Patient patient, Facility orderingFacility, string accessionNumber)
        {
            if (requisition.Visit != null && requisition.Visit.VisitRef != null)
            {
                return(this.PersistenceContext.Load <Visit>(requisition.Visit.VisitRef, EntityLoadFlags.Proxy));
            }

            // if Visit Workflow is disabled, then we must auto-generate a "dummy" visit in order to keep the system happy
            // the user will never see this dummy visit
            if (!new WorkflowConfigurationReader().EnableVisitWorkflow)
            {
                var patientClasses = PersistenceContext.GetBroker <IEnumBroker>().Load <PatientClassEnum>(false);

                // create a visit using the minimum possible amount of information
                var visit = new Visit
                {
                    Patient      = patient,
                    VisitNumber  = new VisitNumber(accessionNumber, orderingFacility.InformationAuthority),
                    Status       = VisitStatus.AA,
                    AdmitTime    = Platform.Time,
                    Facility     = orderingFacility,
                    PatientClass = CollectionUtils.FirstElement(patientClasses)
                };

                this.PersistenceContext.Lock(visit, DirtyState.New);
                return(visit);
            }

            throw new RequestValidationException("A visit is required.");
        }
            internal override EntityRef Submit(OrderRequisition requisition, OrderEditorComponent component)
            {
                ReplaceOrderResponse response = null;

                Platform.GetService <IOrderEntryService>(
                    service => response = service.ReplaceOrder(new ReplaceOrderRequest(this.OrderRef, component.SelectedCancelReason, requisition))
                    );

                return(response.Order.OrderRef);
            }
            internal override EntityRef Submit(OrderRequisition requisition, OrderEditorComponent component)
            {
                PlaceOrderResponse response = null;

                Platform.GetService <IOrderEntryService>(
                    service => response = service.PlaceOrder(new PlaceOrderRequest(requisition))
                    );

                return(response.Order.OrderRef);
            }
            internal override EntityRef Submit(OrderRequisition requisition, OrderEditorComponent component)
            {
                ModifyOrderResponse response = null;

                requisition.OrderRef = component.OrderRef;
                Platform.GetService <IOrderEntryService>(service =>
                {
                    response = service.ModifyOrder(new ModifyOrderRequest(requisition));
                });
                return(response.Order.OrderRef);
            }
Example #6
0
        /// <summary>
        /// Creates duplicates of any attached documents in the order that also appear in the
        /// requisition, and then replaces the references in the requisition to refer to the
        /// duplicates.
        /// </summary>
        /// <param name="order"></param>
        /// <param name="requisition"></param>
        private void DuplicateAttachmentsForOrderReplace(Order order, OrderRequisition requisition)
        {
            foreach (var attachment in order.Attachments)
            {
                var summary = CollectionUtils.SelectFirst(requisition.Attachments,
                                                          s => s.Document.DocumentRef.Equals(attachment.Document.GetRef(), true));

                if (summary != null)
                {
                    var dup = attachment.Document.Duplicate(true);
                    PersistenceContext.Lock(dup, DirtyState.New);
                    summary.Document.DocumentRef = dup.GetRef();
                }
            }
        }
Example #7
0
        public void UpdateOrderFromRequisition(Order order, OrderRequisition requisition, Staff currentStaff, IPersistenceContext context)
        {
            // only certain properties of an order may be updated from a requisition
            // Patient cannot not be updated
            // DiagnosticService cannot be updated
            // OrderingFacility cannot be updated

            // do not update the individual procedures, as this is done separately - see UpdateProcedureFromRequisition

            // Some properties cannot be updated if the procedure is terminated
            if (!order.IsTerminated)
            {
                order.Visit = context.Load <Visit>(requisition.Visit.VisitRef, EntityLoadFlags.Proxy);

                order.SchedulingRequestTime = requisition.SchedulingRequestTime;
                order.OrderingPractitioner  = context.Load <ExternalPractitioner>(
                    requisition.OrderingPractitioner.PractitionerRef, EntityLoadFlags.Proxy);
                order.ReasonForStudy = requisition.ReasonForStudy;
                order.Priority       = EnumUtils.GetEnumValue <OrderPriority>(requisition.Priority);

                // wipe out and reset the result recipients
                order.ResultRecipients.Clear();

                CollectionUtils.Map <ResultRecipientDetail, ResultRecipient>(
                    requisition.ResultRecipients,
                    s => new ResultRecipient(
                        context.Load <ExternalPractitionerContactPoint>(s.ContactPoint.ContactPointRef, EntityLoadFlags.Proxy),
                        EnumUtils.GetEnumValue <ResultCommunicationMode>(s.PreferredCommunicationMode))).ForEach(r => order.ResultRecipients.Add(r));
            }

            // synchronize Order.Attachments from order requisition
            var attachmentAssembler = new OrderAttachmentAssembler();

            attachmentAssembler.Synchronize(order.Attachments, requisition.Attachments, currentStaff, context);

            // synchronize Order.Notes from order requisition
            var noteAssembler = new OrderNoteAssembler();

            noteAssembler.SynchronizeOrderNotes(order, requisition.Notes, currentStaff, context);

            if (requisition.ExtendedProperties != null)
            {
                ExtendedPropertyUtils.Update(order.ExtendedProperties, requisition.ExtendedProperties);
            }
        }
Example #8
0
        public OrderRequisition CreateOrderRequisition(Order order, IPersistenceContext context)
        {
            var patientProfileAssembler  = new PatientProfileAssembler();
            var visitAssembler           = new VisitAssembler();
            var pracAssembler            = new ExternalPractitionerAssembler();
            var facilityAssembler        = new FacilityAssembler();
            var dsAssembler              = new DiagnosticServiceAssembler();
            var attachmentAssembler      = new OrderAttachmentAssembler();
            var noteAssembler            = new OrderNoteAssembler();
            var resultRecipientAssembler = new ResultRecipientAssembler();

            var requisition = new OrderRequisition
            {
                OrderRef = order.GetRef(),
                Patient  =
                    patientProfileAssembler.CreatePatientProfileSummary(
                        CollectionUtils.FirstElement(order.Procedures).PatientProfile, context),
                Visit                 = visitAssembler.CreateVisitSummary(order.Visit, context),
                DiagnosticService     = dsAssembler.CreateSummary(order.DiagnosticService),
                SchedulingRequestTime = order.SchedulingRequestTime,
                OrderingPractitioner  =
                    pracAssembler.CreateExternalPractitionerSummary(order.OrderingPractitioner, context),
                OrderingFacility = facilityAssembler.CreateFacilitySummary(order.OrderingFacility),
                ReasonForStudy   = order.ReasonForStudy,
                Priority         = EnumUtils.GetEnumValueInfo(order.Priority, context),
                ResultRecipients = CollectionUtils.Map <ResultRecipient, ResultRecipientDetail>(
                    order.ResultRecipients,
                    r => resultRecipientAssembler.CreateResultRecipientDetail(r, context)),
                Procedures = CollectionUtils.Map <Procedure, ProcedureRequisition>(
                    order.Procedures,
                    procedure => CreateProcedureRequisition(procedure, context)),
                Attachments = CollectionUtils.Map <OrderAttachment, AttachmentSummary>(
                    order.Attachments,
                    attachment => attachmentAssembler.CreateOrderAttachmentSummary(attachment, context)),
                Notes = CollectionUtils.Map <OrderNote, OrderNoteDetail>(
                    OrderNote.GetNotesForOrder(order),
                    note => noteAssembler.CreateOrderNoteDetail(note, context)),
                ExtendedProperties = ExtendedPropertyUtils.Copy(order.ExtendedProperties),
                CanModify          = !order.IsTerminated
            };

            return(requisition);
        }
Example #9
0
        private string GetAccessionNumberForOrder(OrderRequisition requisition)
        {
            // if this is a downtime requisition, validate the downtime A#, otherwise obtain a new A#
            var accessionBroker = this.PersistenceContext.GetBroker <IAccessionNumberBroker>();

            if (requisition.IsDowntimeOrder)
            {
                // validate that the downtime A# is less than then current sequence position
                var currentMaxAccession = accessionBroker.PeekNext();
                if (requisition.DowntimeAccessionNumber.CompareTo(currentMaxAccession) > -1)
                {
                    throw new RequestValidationException("Invalid downtime accession number.");
                }

                return(requisition.DowntimeAccessionNumber);
            }

            // get new A#
            return(this.PersistenceContext.GetBroker <IAccessionNumberBroker>().GetNext());
        }
 /// <summary>
 /// Submit the specified order requisition to the server.
 /// </summary>
 /// <param name="requisition"></param>
 /// <param name="component"></param>
 /// <returns></returns>
 internal abstract EntityRef Submit(OrderRequisition requisition, OrderEditorComponent component);
Example #11
0
        private Order PlaceOrderHelper(OrderRequisition requisition)
        {
            // get appropriate A# for this order
            var accNum = GetAccessionNumberForOrder(requisition);

            var patient           = this.PersistenceContext.Load <Patient>(requisition.Patient.PatientRef, EntityLoadFlags.Proxy);
            var orderingFacility  = this.PersistenceContext.Load <Facility>(requisition.OrderingFacility.FacilityRef, EntityLoadFlags.Proxy);
            var visit             = FindOrCreateVisit(requisition, patient, orderingFacility, accNum);
            var orderingPhysician = this.PersistenceContext.Load <ExternalPractitioner>(requisition.OrderingPractitioner.PractitionerRef, EntityLoadFlags.Proxy);
            var diagnosticService = this.PersistenceContext.Load <DiagnosticService>(requisition.DiagnosticService.DiagnosticServiceRef);
            var priority          = EnumUtils.GetEnumValue <OrderPriority>(requisition.Priority);


            var resultRecipients = CollectionUtils.Map(
                requisition.ResultRecipients ?? new List <ResultRecipientDetail>(),
                (ResultRecipientDetail s) => new ResultRecipient(
                    this.PersistenceContext.Load <ExternalPractitionerContactPoint>(s.ContactPoint.ContactPointRef, EntityLoadFlags.Proxy),
                    EnumUtils.GetEnumValue <ResultCommunicationMode>(s.PreferredCommunicationMode)));

            // generate set of procedures
            // create a temp map from procedure back to its requisition, this will be needed later
            var orderAssembler        = new OrderEntryAssembler();
            var mapProcToReq          = new Dictionary <Procedure, ProcedureRequisition>();
            var procedureNumberBroker = PersistenceContext.GetBroker <IProcedureNumberBroker>();
            var dicomUidBroker        = PersistenceContext.GetBroker <IDicomUidBroker>();
            var procedures            = CollectionUtils.Map(
                requisition.Procedures ?? new List <ProcedureRequisition>(),
                delegate(ProcedureRequisition req)
            {
                var rpt = this.PersistenceContext.Load <ProcedureType>(req.ProcedureType.ProcedureTypeRef);
                var rp  = new Procedure(rpt, procedureNumberBroker.GetNext(), dicomUidBroker.GetNewUid());
                mapProcToReq.Add(rp, req);

                // important to set this flag prior to creating the procedure steps, because it may affect
                // which procedure steps are created
                rp.DowntimeRecoveryMode = requisition.IsDowntimeOrder;
                return(rp);
            });


            // generate a new order with the default set of procedures
            var order = Order.NewOrder(
                new OrderCreationArgs(
                    Platform.Time,
                    this.CurrentUserStaff,
                    null,
                    accNum,
                    patient,
                    visit,
                    diagnosticService,
                    requisition.ReasonForStudy,
                    priority,
                    orderingFacility,
                    requisition.SchedulingRequestTime,
                    orderingPhysician,
                    resultRecipients,
                    procedures),
                procedureNumberBroker,
                dicomUidBroker);

            // note: need to lock the new order now, prior to creating the procedure steps
            // otherwise may get exceptions saying the Procedure is a transient object
            this.PersistenceContext.Lock(order, DirtyState.New);

            // create procedure steps and update from requisition
            foreach (var procedure in order.Procedures)
            {
                procedure.CreateProcedureSteps();
                if (mapProcToReq.ContainsKey(procedure))
                {
                    orderAssembler.UpdateProcedureFromRequisition(procedure, mapProcToReq[procedure], this.CurrentUserStaff, this.PersistenceContext);
                }
            }

            // add order notes
            if (requisition.Notes != null)
            {
                var noteAssembler = new OrderNoteAssembler();
                noteAssembler.SynchronizeOrderNotes(order, requisition.Notes, this.CurrentUserStaff, this.PersistenceContext);
            }

            // add attachments
            if (requisition.Attachments != null)
            {
                var attachmentAssembler = new OrderAttachmentAssembler();
                attachmentAssembler.Synchronize(order.Attachments, requisition.Attachments, this.CurrentUserStaff, this.PersistenceContext);
            }

            if (requisition.ExtendedProperties != null)
            {
                ExtendedPropertyUtils.Update(order.ExtendedProperties, requisition.ExtendedProperties);
            }

            return(order);
        }
 public OrderSubmittedArgs(DesktopWindow desktopWindow, PatientProfileSummary patientProfile, OrderRequisition requisition, OrderSubmitType submitType)
     : base(desktopWindow, patientProfile, requisition, submitType)
 {
 }
 public void AddToOrderRequisitions(OrderRequisition orderRequisition)
 {
     base.AddObject("OrderRequisitions", orderRequisition);
 }
 public static OrderRequisition CreateOrderRequisition(int ID, string orderRequisitionNo, global::System.DateTime orderRequisitionDate, int requisition_Customer, bool status, byte[] rowVersion)
 {
     OrderRequisition orderRequisition = new OrderRequisition();
     orderRequisition.Id = ID;
     orderRequisition.OrderRequisitionNo = orderRequisitionNo;
     orderRequisition.OrderRequisitionDate = orderRequisitionDate;
     orderRequisition.Requisition_Customer = requisition_Customer;
     orderRequisition.Status = status;
     orderRequisition.RowVersion = rowVersion;
     return orderRequisition;
 }
Example #15
0
        /// <summary>
        /// Create a random order on the specified visit.
        /// </summary>
        /// <param name="visit">Visit/patient for which the order is created.</param>
        /// <param name="informationAuthority">Performing facility will be selected to match this information authority.</param>
        /// <param name="diagnosticServiceName">Name of the diagnostic service to order.</param>
        /// <param name="schedulingOffsetDays">A positive or negative number of days from today.</param>
        /// <param name="modalityName">The name of the modality.</param>
        /// <param name="facilityCode">The code of the ordering and performing facility.</param>
        /// <param name="laterality">The procedure laterality.</param>
        /// <returns></returns>
        public static OrderSummary RandomOrder(VisitSummary visit, EnumValueInfo informationAuthority, string diagnosticServiceName, int schedulingOffsetDays, string modalityName, string facilityCode, EnumValueInfo laterality)
        {
            InitReferenceDataCacheOnce();

            var scheduledTime = Platform.Time + TimeSpan.FromDays(schedulingOffsetDays);
            LoadDiagnosticServicePlanResponse dsResponse = null;
            OrderSummary orderSummary = null;

            Platform.GetService(
                delegate(IOrderEntryService service)
            {
                DiagnosticServiceSummary diagnosticService;
                if (String.IsNullOrEmpty(diagnosticServiceName) && String.IsNullOrEmpty(modalityName))
                {
                    diagnosticService = ChooseRandom(_diagnosticServices);
                    dsResponse        = service.LoadDiagnosticServicePlan(new LoadDiagnosticServicePlanRequest(diagnosticService.DiagnosticServiceRef));
                }
                else
                {
                    diagnosticService = CollectionUtils.SelectFirst(_diagnosticServices,
                                                                    delegate(DiagnosticServiceSummary ds)
                    {
                        dsResponse = service.LoadDiagnosticServicePlan(new LoadDiagnosticServicePlanRequest(ds.DiagnosticServiceRef));
                        return((ds.Name == diagnosticServiceName) ||
                               (!String.IsNullOrEmpty(modalityName) && (CollectionUtils.SelectFirst(dsResponse.DiagnosticServicePlan.ProcedureTypes,
                                                                                                    ptd => ptd.Name.IndexOf(modalityName) == 0) != null)));
                    });

                    if (diagnosticService == null)
                    {
                        throw new Exception(String.Format("Cannot find diagnostic service with name {0}", diagnosticServiceName));
                    }
                }

                var performingFacility = CollectionUtils.SelectFirst(_orderEntryFormData.FacilityChoices,
                                                                     delegate(FacilitySummary facility)
                {
                    if (facilityCode == null)
                    {
                        return(facility.InformationAuthority.Code == informationAuthority.Code);
                    }

                    return(facility.Code == facilityCode);
                });

                var randomPhysician = ChooseRandom(_practitioners);
                var randomPriority  = ChooseRandom(_orderEntryFormData.OrderPriorityChoices);

                var requisition = new OrderRequisition
                {
                    Patient               = visit.Patient,
                    Visit                 = visit,
                    DiagnosticService     = diagnosticService,
                    OrderingPractitioner  = randomPhysician,
                    OrderingFacility      = performingFacility,
                    Priority              = randomPriority,
                    ReasonForStudy        = "Randomly generated test order",
                    SchedulingRequestTime = scheduledTime,
                    Procedures            = new List <ProcedureRequisition>(),
                    ResultRecipients      = new List <ResultRecipientDetail>(),
                    Attachments           = new List <AttachmentSummary>(),
                    Notes                 = new List <OrderNoteDetail>()
                };

                requisition.Procedures.AddRange(
                    CollectionUtils.Map(dsResponse.DiagnosticServicePlan.ProcedureTypes,
                                        (ProcedureTypeSummary rpt) => new ProcedureRequisition(rpt, performingFacility)
                {
                    ScheduledTime     = scheduledTime,
                    Laterality        = laterality,
                    ScheduledDuration = 30                                                                                                             // default to a non-zero scheduled duration
                }));

                var response = service.PlaceOrder(new PlaceOrderRequest(requisition));

                orderSummary = response.Order;
            });

            return(orderSummary);
        }