public MergeOrderResponse MergeOrder(MergeOrderRequest request) { Platform.CheckForNullReference(request, "request"); Platform.CheckMemberIsSet(request.SourceOrderRefs, "SourceOrderRefs"); Platform.CheckTrue(request.SourceOrderRefs.Count > 0, "SourceOrderRefs.Count > 0"); Platform.CheckMemberIsSet(request.DestinationOrderRef, "DestinationOrderRef"); var response = new MergeOrderResponse(); DryRunHelper(request.DryRun, delegate { var destinationOrder = this.PersistenceContext.Load <Order>(request.DestinationOrderRef); var sourceOrders = CollectionUtils.Map(request.SourceOrderRefs, (EntityRef r) => PersistenceContext.Load <Order>(r)); var mergeInfo = new OrderMergeInfo(this.CurrentUserStaff, Platform.Time, destinationOrder); MergeOrderHelper(destinationOrder, sourceOrders, mergeInfo, request.ValidationOnly); if (request.DryRun) { var orderAssembler = new OrderAssembler(); var orderDetail = orderAssembler.CreateOrderDetail(destinationOrder, OrderAssembler.CreateOrderDetailOptions.GetVerboseOptions(), PersistenceContext); response.DryRunMergedOrder = orderDetail; } }); return(response); }
private void MergeOrderHelper(Order destinationOrder, IEnumerable <Order> sourceOrders, OrderMergeInfo mergeInfo, bool validateOnly) { var sourceOrderAccessionNumbers = new List <string>(); foreach (var sourceOrder in sourceOrders) { sourceOrderAccessionNumbers.Add(sourceOrder.AccessionNumber); string failureReason; if (!sourceOrder.CanMerge(mergeInfo, out failureReason)) { throw new RequestValidationException(failureReason); } if (validateOnly) { continue; } // Merge the source order into the destination order. var result = sourceOrder.Merge(mergeInfo); // sync state so that ghost procedures get OIDs, prior to queuing ghost HL7 events PersistenceContext.SynchState(); // create all necessary HL7 events foreach (var ghostProcedure in result.GhostProcedures) { LogicalHL7Event.ProcedureCancelled.EnqueueEvents(ghostProcedure); LogicalHL7Event.ProcedureCreated.EnqueueEvents(ghostProcedure.GhostOf); } LogicalHL7Event.OrderModified.EnqueueEvents(destinationOrder); } }