private static bool FindPolicy(ClaimHeader claimHeader, Claim claim, out IUWHeader uwHeader)
 {
     lock (SyncLock)
     {
         var claimService = ObjectFactory.Resolve<ClaimService>();
         try
         {
             Logger.InfoFormat("Looking for Policy based on Claim\r\n{0}\r\n", 
                 JObject.FromObject(
                 new {claim.ClaimReference, claim.PolicyNumber}));
             uwHeader = claimService.GetPolicyDataForCoverageVerification(claim.PolicyNumber, XiapConstants.XIAP_DATASOURCE, null);
             
             claim.PolicyShellWasCreated = false;
             return true;
         }
         catch (Exception ex)
         {
             //try
             //{
             //    Logger.InfoFormat("Could not find Policy in Genius.X, going to Genius\r\n{0}\r\n", 
             //        JObject.FromObject(new {claim.ClaimReference, claim.PolicyNumber}));
             //    var claimProduct = claimHeader.GetProduct();
             //    var linkedUwProduct = claimProduct.Links.First(l => l.ProductLinkType == (short)StaticValues.ProductLinkType.ClaimtoPolicy);
             //    var tran = UWBusinessTransactionFactory.CreatePolicy(linkedUwProduct.ProductCode, DateTime.UtcNow, false);
             //    var header = tran.Header;
             //    header.HeaderReference = claim.PolicyNumber;
             //    var updater = ObjectFactory.Resolve<UpdateFromGeniusPlugin>();
             //    updater.ProcessComponent(header, ProcessInvocationPoint.Virtual, 0);
                 
             //    //_updater.Handle(header);
             //    tran.Complete(false);
             //    claim.PolicyShellWasCreated = true;
             //    uwHeader = claimService.GetPolicyDataForCoverageVerification(claim.PolicyNumber, XiapConstants.XIAP_DATASOURCE, null);
             //    return true;
             //}
             //catch (Exception ex)
             //{
                 claim.PolicyShellWasCreated = false;
                 claim.ClaimIsAttachedToPolicy = false;
                 claim.CustomCode18 = "F01";
                 claim.ClaimProcessingFailed = true;
                 claim.FailureReason = "Policy does not exist";
                 Logger.ErrorFormat("Exception creating policy from Genius policy \r\n{0}\r\n", 
                     JObject.FromObject(new{ex.Message, ex.StackTrace}));
                 uwHeader = null;
                 return false;
             //}
         }
     }
 }
 /// <summary>
 /// Updates the header title, inception and expiry dates with the values from the Genius Policy header.
 /// </summary>
 /// <param name="xiapHeader">The xiap header.</param>
 /// <param name="externalHeader">The external header.</param>
 private void UpdateHeader(Header xiapHeader, IUWHeader externalHeader)
 {
     xiapHeader.ExternalReference = externalHeader.ExternalReference;
     HeaderVersion headerVersion = (HeaderVersion)xiapHeader.GetLatestVersion();
     if (headerVersion != null)
     {
         headerVersion.HeaderTitle = externalHeader.HeaderTitle;
         headerVersion.InceptionDate = externalHeader.InceptionDate;
         headerVersion.ExpiryDate = externalHeader.ExpiryDate;
     }
 }
        /// <summary>
        /// Updates the Major Insured and Major Broker name involvements on the GeniusX policy, from the Genius Policy.
        /// </summary>
        /// <param name="xiapHeader">The xiap header.</param>
        /// <param name="externalHeader">The external header.</param>
        private void UpdateNameInvolvement(Header xiapHeader, IUWHeader externalHeader)
        {
            // Update Insured from Genius policy
            var insured = externalHeader.IUWNameInvolvements.Where(a => a.NameInvolvementType == (short)StaticValues.NameInvolvementType.MajorInsured).FirstOrDefault();
            UwNameInvolvement ni = null;
            if (insured != null)
            {
                // we have an insured on the Genius Policy so see if we have one on the GeniusX policy.
                ni = xiapHeader.UwNameInvolvements.Where(a => a.NameInvolvementType == (short)StaticValues.NameInvolvementType.MajorInsured).FirstOrDefault();
                if (ni != null)
                {
                    // Update the Name id
                    ni.NameID = insured.NameID;
                }
                else
                {
                    // Check if Insured NI is configured on product and can be created
                    // If so, create and update from Genius
                    long productVersionID = xiapHeader.GetProduct().ProductVersionID;
                    var productNI = ProductService.GetProductNameInvolvementQuery().GetProductNameInvolvementByNameInvolvementType(productVersionID, (short)StaticValues.NameInvolvementType.MajorInsured);
                    if (productNI != null)
                    {
                        ni = xiapHeader.AddNewUwNameInvolvement((short)StaticValues.NameInvolvementType.MajorInsured, insured.NameID);
                        ni.NameUsageTypeCode = insured.NameUsageTypeCode;
                    }
                }
            }


            // Update LossBroker from Genius policy
            var mjrBroker = externalHeader.IUWNameInvolvements.Where(a => a.NameInvolvementType == (short)StaticValues.NameInvolvementType.MajorBroker).FirstOrDefault();
            UwNameInvolvement nameInvMajorBroker = null;
            if (mjrBroker != null)
            {
                // If we have a Major Broker on the Genius Policy, find one on the GeniusX policy
                var nameInvMajorBrokerVersion = xiapHeader.UwNameInvolvements.Where(a => a.NameInvolvementType == (short)StaticValues.NameInvolvementType.MajorBroker).SelectMany(uni => uni.UwNameInvolvementVersion.Where(lv => lv.IsLatestVersion == true)).FirstOrDefault();

                if (nameInvMajorBrokerVersion != null)
                {
                    // Get the name involvement from the lastest version.
                    nameInvMajorBroker = nameInvMajorBrokerVersion.UwNameInvolvement;
                }

                if (nameInvMajorBroker != null)
                {
                    // Update the Name id already existing on the GeniusX policy
                    nameInvMajorBroker.NameID = mjrBroker.NameID;
                }
                else
                {
                    // Check if Major Broker NI is configured on product and can be created
                    // Create it, if so, and apply Genius policy data.
                    long productVersionID = xiapHeader.GetProduct().ProductVersionID;
                    var productNI = ProductService.GetProductNameInvolvementQuery().GetProductNameInvolvementByNameInvolvementType(productVersionID, (short)StaticValues.NameInvolvementType.MajorInsured);
                    if (productNI != null)
                    {
                        nameInvMajorBroker = xiapHeader.AddNewUwNameInvolvement((short)StaticValues.NameInvolvementType.MajorBroker, mjrBroker.NameID);
                        nameInvMajorBroker.NameUsageTypeCode = mjrBroker.NameUsageTypeCode;
                    }
                }
            }
        }
        /// <summary>
        /// Validates the external Genius Policy can be used to refresh the GeniusX policy.
        /// </summary>
        /// <param name="xiapheader">The xiapheader.</param>
        /// <param name="externalheader">The externalheader.</param>
        /// <param name="results">The results.</param>
        /// <returns>Process Results Collection</returns>
        private ProcessResultsCollection ValidateExternalHeader(Header xiapheader, IUWHeader externalheader, ProcessResultsCollection results)
        {
            // Genius policy not found
            if (externalheader == null)
            {
                UWBusinessLogicHelper.AddError(results, MessageConstants.INVALID_POLICY_REFERENCE, ProcessInvocationPoint.Virtual, xiapheader);
            }
            else
            {
                // Genius policy product must match XIAP product
                if (externalheader.ProductCode != xiapheader.GetProduct().Product.Code)
                {
                    UWBusinessLogicHelper.AddError(results, UwMessageConstants.GENIUS_PRODUCT_DOES_NOT_MATCH, ProcessInvocationPoint.Virtual, xiapheader);
                }
            }

            return results;
        }