public void SetHIR(BO.HomeProduct product, BO.HomeInsurancePolicy policy)
        {
            bool isAdded = false;

            if (product.MaximumBuildingValue < policy.BuildingValue)
            {
                IsHIR     = true;
                HIRReason = "Building value exceeded the limit";
                HIRStatus = 1;
                isAdded   = true;
            }
            if (product.MaximumContentValue < policy.ContentValue)
            {
                IsHIR     = true;
                HIRReason = HIRReason = isAdded ? HIRReason + ", " + "Content Value exceeded the limit" : "Content Value exceeded the limit";
                HIRStatus = 1;
                isAdded   = true;
            }
            if (product.MaximumJewelleryValue < policy.JewelleryValue)
            {
                IsHIR     = true;
                HIRReason = HIRReason = isAdded ? HIRReason + ", " + "Jewellery Value exceeded the limit" : "Jewellery Value exceeded the limit";
                HIRStatus = 1;
                isAdded   = true;
            }
            if (product.MaximumTotalValue < policy.BuildingValue + policy.ContentValue)
            {
                IsHIR     = true;
                HIRReason = HIRReason = isAdded ? ", " + "Total Value exceeded the limit" : "Total Value exceeded the limit";
                HIRStatus = 1;
                isAdded   = true;
            }
        }
        public decimal GetRenewalDelayedDaysAmount(BO.HomeInsurancePolicyDetails policy, BO.HomeProduct homeProduct, decimal netPremium)
        {
            decimal delayedDaysAmount = 0;

            if (policy.HomeInsurancePolicy.RenewalDelayedDays > 0)
            {
                delayedDaysAmount = (netPremium * policy.HomeInsurancePolicy.RenewalDelayedDays) / 365;
            }
            return(delayedDaysAmount);
        }
        private void Calculate(BO.HomeInsurancePolicyDetails policy, BO.HomeProduct homeProduct)
        {
            //Calcuate the base premium.
            BuildingPremium = homeProduct.Rate * policy.HomeInsurancePolicy.BuildingValue / 100;
            ContentPremium  = homeProduct.Rate * policy.HomeInsurancePolicy.ContentValue / 100;
            //Premium = BuildingPremium + ContentPremium;
            BaseBuildingContentRate = homeProduct.Rate;

            //Calculate the riot premium.
            if (policy.HomeInsurancePolicy.IsRiotStrikeDamage.ToString().ToLower() == "y")
            {
                BuildingRiot  = homeProduct.RiotCoverRate * policy.HomeInsurancePolicy.BuildingValue / 100;
                ContentRiot   = homeProduct.RiotCoverRate * policy.HomeInsurancePolicy.ContentValue / 100;
                JewelleryRiot = homeProduct.RiotCoverRate * policy.HomeInsurancePolicy.JewelleryValue / 100;

                TotalRiot = BuildingRiot + ContentRiot;

                if (TotalRiot <= homeProduct.RiotCoverMinAmount)
                {
                    TotalRiot = homeProduct.RiotCoverMinAmount;
                }
                RiotRate = homeProduct.RiotCoverRate;
            }

            //Calculate the home domestic helper amount.
            if (policy.HomeInsurancePolicy.NoOfDomesticWorker > 0 || policy.HomeDomesticHelpdt.Rows.Count > 0)
            {
                var domesticHelpers = policy.HomeDomesticHelpdt.Rows.Count;
                DomesticHelperAmount = domesticHelpers > 0 ? (domesticHelpers - 1) * homeProduct.DomesticHelperAmount : 0;
            }

            //Calculate the jewellery amount.
            var jCover = homeProduct.JewelleryCover.Find(x => x.KeyType == policy.HomeInsurancePolicy.JewelleryCover);

            if (jCover != null)
            {
                JewellerAmount = jCover.Amount;
                if (jCover.KeyType == "EXTREME")
                {
                    JewellerAmount = jCover.Rate * policy.HomeInsurancePolicy.JewelleryValue / 100;
                }
            }

            // TotalPremium = Math.Round(Premium + TotalRiot + DomesticHelperAmount + JewellerAmount, 3, MidpointRounding.AwayFromZero);
            TotalBasicPremium = Math.Round(BuildingPremium + ContentPremium, 3, MidpointRounding.AwayFromZero);
            TotalSRCCPremium  = Math.Round(BuildingRiot + ContentRiot + JewelleryRiot, 3, MidpointRounding.AwayFromZero);

            if (TotalBasicPremium <= homeProduct.MinimumPremium)
            {
                TotalBasicPremium = homeProduct.MinimumPremium;
            }

            TotalBasicPremium = TotalBasicPremium + DomesticHelperAmount + JewellerAmount;

            TotalPremium = TotalBasicPremium + TotalSRCCPremium;

            //Deduct the renewal delayed days amount from the premium.
            if (policy.HomeInsurancePolicy.RenewalDelayedDays > 0)
            {
                var renewalDelayedAmount = GetRenewalDelayedDaysAmount(policy, homeProduct, BuildingPremium + ContentPremium + TotalRiot + DomesticHelperAmount + JewellerAmount);
                TotalPremium = Math.Round(BuildingPremium + ContentPremium + TotalRiot + DomesticHelperAmount + JewellerAmount - renewalDelayedAmount, 3, MidpointRounding.AwayFromZero);

                var renewalDelayedAmount1 = GetRenewalDelayedDaysAmount(policy, homeProduct, BuildingPremium + ContentPremium + DomesticHelperAmount + JewellerAmount);
                TotalBasicPremium = Math.Round(BuildingPremium + ContentPremium + DomesticHelperAmount + JewellerAmount - renewalDelayedAmount1, 3, MidpointRounding.AwayFromZero);

                var renewalDelayedAmount2 = GetRenewalDelayedDaysAmount(policy, homeProduct, BuildingRiot + ContentRiot);
                TotalSRCCPremium = Math.Round(BuildingRiot + ContentRiot - renewalDelayedAmount2, 3, MidpointRounding.AwayFromZero);
            }

            PremiumBeforeDiscount = TotalPremium;

            //Calculate the commission.
            CommissionBeforeDiscount = GetCommision(policy.HomeInsurancePolicy, TotalBasicPremium, TotalSRCCPremium);

            //If the user give the discount
            if (!policy.HomeInsurancePolicy.UserChangedPremium)
            {
                PremiumAfterDiscount    = PremiumBeforeDiscount;
                CommissionAfterDiscount = CommissionBeforeDiscount;
            }
            else
            {
                PremiumAfterDiscount    = policy.HomeInsurancePolicy.PremiumAfterDiscount;
                CommissionAfterDiscount = policy.HomeInsurancePolicy.CommissionAfterDiscount;
            }

            //Calculate the VAT.
            TaxOnBasicPremium             = GetTax(TotalBasicPremium, homeProduct.TaxRate);
            TaxOnSRCCPremium              = GetTax(TotalSRCCPremium, homeProduct.TaxRate);
            TaxOnPremiumBeforeDiscount    = GetTax(PremiumBeforeDiscount, homeProduct.TaxRate);
            TaxOnPremiumAfterDiscount     = GetTax(PremiumAfterDiscount, homeProduct.TaxRate);
            TaxOnCommissionBeforeDiscount = GetTax(CommissionBeforeDiscount, homeProduct.TaxRate);
            TaxOnCommissionAfterDiscount  = GetTax(CommissionAfterDiscount, homeProduct.TaxRate);

            //Apply discount.
            Discount = PremiumBeforeDiscount - PremiumAfterDiscount;

            //Set HIR - building or content value exceeded the maximum value policy will move to HIR status admin need to approve.
            SetHIR(homeProduct, policy.HomeInsurancePolicy);
        }
        public void CalculateCommission(BO.HomeProduct homeProduct, BO.HomeInsurancePolicy policy,
                                        long homeID, string documentNo, string LinkID, int renewalCount)
        {
            try
            {
                int lineNo = 0;
                if (homeProduct.Category != null && homeProduct.Category.Count > 0)
                {
                    List <PolicyCategory> policyCategories = new List <PolicyCategory>();
                    foreach (var dr in homeProduct.Category)
                    {
                        lineNo++;
                        if (!policy.UserChangedPremium)
                        {
                            if (dr.ValueType == "Percent" && dr.Code == "BASICCOMM")
                            {
                                var policyCategory = new PolicyCategory();
                                policyCategory.Agency    = dr.Agency;
                                policyCategory.AgentCode = dr.AgentCode;
                                policyCategory.Code      = dr.Code;
                                policyCategory.Category  = dr.Category;
                                policyCategory.CommissionBeforeDiscount = TotalBasicPremium * dr.Value / 100;
                                policyCategory.CommissionAfterDiscount  = TotalBasicPremium * dr.Value / 100;
                                policyCategory.DocumentNo                    = documentNo;
                                policyCategory.EndorsementCount              = 0;
                                policyCategory.EndorsementNo                 = string.Empty;
                                policyCategory.DocumentID                    = homeID;
                                policyCategory.LineNo                        = lineNo.ToString();
                                policyCategory.LinkID                        = LinkID;
                                policyCategory.PremiumAfterDiscount          = TotalBasicPremium;
                                policyCategory.PremiumBeforeDiscount         = TotalBasicPremium;
                                policyCategory.TaxOnCommissionBeforeDiscount = GetTax(policyCategory.CommissionBeforeDiscount, homeProduct.TaxRate);
                                policyCategory.TaxOnCommissionAfterDiscount  = GetTax(policyCategory.CommissionAfterDiscount, homeProduct.TaxRate);
                                policyCategory.TaxOnPremiumBeforeDiscount    = GetTax(TotalBasicPremium, homeProduct.TaxRate);
                                policyCategory.TaxOnPremiumAfterDiscount     = GetTax(TotalBasicPremium, homeProduct.TaxRate);
                                policyCategory.Value        = dr.Value;
                                policyCategory.ValueType    = dr.ValueType;
                                policyCategory.IsDeductable = dr.IsDeductable;
                                policyCategory.RenewalCount = renewalCount;
                                policyCategory.HomeID       = homeID;

                                policyCategories.Add(policyCategory);
                            }
                            if (dr.ValueType == "Percent" && dr.Code == "SRCCCOMM")
                            {
                                var policyCategory = new PolicyCategory();
                                policyCategory.Agency    = dr.Agency;
                                policyCategory.AgentCode = dr.AgentCode;
                                policyCategory.Code      = dr.Code;
                                policyCategory.Category  = dr.Category;
                                policyCategory.CommissionBeforeDiscount = TotalSRCCPremium * dr.Value / 100;
                                policyCategory.CommissionAfterDiscount  = TotalSRCCPremium * dr.Value / 100;
                                policyCategory.DocumentNo                    = documentNo;
                                policyCategory.EndorsementCount              = 0;
                                policyCategory.EndorsementNo                 = string.Empty;
                                policyCategory.DocumentID                    = homeID;
                                policyCategory.LineNo                        = lineNo.ToString();
                                policyCategory.LinkID                        = LinkID;
                                policyCategory.PremiumAfterDiscount          = TotalSRCCPremium;
                                policyCategory.PremiumBeforeDiscount         = TotalSRCCPremium;
                                policyCategory.TaxOnCommissionBeforeDiscount = GetTax(policyCategory.CommissionBeforeDiscount, homeProduct.TaxRate);
                                policyCategory.TaxOnCommissionAfterDiscount  = GetTax(policyCategory.CommissionAfterDiscount, homeProduct.TaxRate);
                                policyCategory.TaxOnPremiumBeforeDiscount    = GetTax(TotalSRCCPremium, homeProduct.TaxRate);
                                policyCategory.TaxOnPremiumAfterDiscount     = GetTax(TotalSRCCPremium, homeProduct.TaxRate);
                                policyCategory.Value        = dr.Value;
                                policyCategory.ValueType    = dr.ValueType;
                                policyCategory.IsDeductable = dr.IsDeductable;
                                policyCategory.RenewalCount = renewalCount;
                                policyCategory.HomeID       = homeID;

                                policyCategories.Add(policyCategory);
                            }
                            if (dr.ValueType == "Percent" && dr.Code == "AGTCOMM")
                            {
                                var policyCategory = new PolicyCategory();
                                policyCategory.Agency    = dr.Agency;
                                policyCategory.AgentCode = dr.AgentCode;
                                policyCategory.Code      = dr.Code;
                                policyCategory.Category  = dr.Category;
                                policyCategory.CommissionBeforeDiscount = TotalPremium * dr.Value / 100;
                                policyCategory.CommissionAfterDiscount  = TotalPremium * dr.Value / 100;
                                policyCategory.DocumentNo                    = documentNo;
                                policyCategory.EndorsementCount              = 0;
                                policyCategory.EndorsementNo                 = string.Empty;
                                policyCategory.DocumentID                    = homeID;
                                policyCategory.LineNo                        = lineNo.ToString();
                                policyCategory.LinkID                        = LinkID;
                                policyCategory.PremiumAfterDiscount          = TotalPremium;
                                policyCategory.PremiumBeforeDiscount         = TotalPremium;
                                policyCategory.TaxOnCommissionBeforeDiscount = GetTax(policyCategory.CommissionBeforeDiscount, homeProduct.TaxRate);
                                policyCategory.TaxOnCommissionAfterDiscount  = GetTax(policyCategory.CommissionAfterDiscount, homeProduct.TaxRate);
                                policyCategory.TaxOnPremiumBeforeDiscount    = GetTax(TotalPremium, homeProduct.TaxRate);
                                policyCategory.TaxOnPremiumAfterDiscount     = GetTax(TotalPremium, homeProduct.TaxRate);
                                policyCategory.Value        = dr.Value;
                                policyCategory.ValueType    = dr.ValueType;
                                policyCategory.IsDeductable = dr.IsDeductable;
                                policyCategory.RenewalCount = renewalCount;
                                policyCategory.HomeID       = homeID;

                                policyCategories.Add(policyCategory);
                            }
                        }
                        else
                        {
                            if (dr.ValueType == "Percent" && dr.Code == "BASICCOMM")
                            {
                                var policyCategory = new PolicyCategory();
                                policyCategory.Agency    = dr.Agency;
                                policyCategory.AgentCode = dr.AgentCode;
                                policyCategory.Code      = dr.Code;
                                policyCategory.Category  = dr.Category;
                                policyCategory.CommissionBeforeDiscount = TotalBasicPremium * dr.Value / 100;
                                policyCategory.CommissionAfterDiscount  = CommissionAfterDiscount;
                                policyCategory.DocumentNo                    = documentNo;
                                policyCategory.EndorsementCount              = 0;
                                policyCategory.EndorsementNo                 = string.Empty;
                                policyCategory.DocumentID                    = homeID;
                                policyCategory.LineNo                        = lineNo.ToString();
                                policyCategory.LinkID                        = LinkID;
                                policyCategory.PremiumAfterDiscount          = PremiumAfterDiscount;
                                policyCategory.PremiumBeforeDiscount         = TotalBasicPremium;
                                policyCategory.TaxOnCommissionBeforeDiscount = GetTax(policyCategory.CommissionBeforeDiscount, homeProduct.TaxRate);
                                policyCategory.TaxOnCommissionAfterDiscount  = GetTax(policyCategory.CommissionAfterDiscount, homeProduct.TaxRate);
                                policyCategory.TaxOnPremiumBeforeDiscount    = GetTax(TotalBasicPremium, homeProduct.TaxRate);
                                policyCategory.TaxOnPremiumAfterDiscount     = GetTax(PremiumAfterDiscount, homeProduct.TaxRate);
                                policyCategory.Value        = dr.Value;
                                policyCategory.ValueType    = dr.ValueType;
                                policyCategory.IsDeductable = dr.IsDeductable;
                                policyCategory.RenewalCount = renewalCount;
                                policyCategory.HomeID       = homeID;

                                policyCategories.Add(policyCategory);
                            }
                            if (dr.ValueType == "Percent" && dr.Code == "SRCCCOMM")
                            {
                                var policyCategory = new PolicyCategory();
                                policyCategory.Agency    = dr.Agency;
                                policyCategory.AgentCode = dr.AgentCode;
                                policyCategory.Code      = dr.Code;
                                policyCategory.Category  = dr.Category;
                                policyCategory.CommissionBeforeDiscount = TotalSRCCPremium * dr.Value / 100;
                                policyCategory.CommissionAfterDiscount  = policy.IsRiotStrikeDamage.ToString().ToLower() == "y" ? CommissionAfterDiscount : 0;
                                policyCategory.DocumentNo                    = documentNo;
                                policyCategory.EndorsementCount              = 0;
                                policyCategory.EndorsementNo                 = string.Empty;
                                policyCategory.DocumentID                    = homeID;
                                policyCategory.LineNo                        = lineNo.ToString();
                                policyCategory.LinkID                        = LinkID;
                                policyCategory.PremiumAfterDiscount          = policy.IsRiotStrikeDamage.ToString().ToLower() == "y" ? PremiumAfterDiscount : 0;
                                policyCategory.PremiumBeforeDiscount         = TotalSRCCPremium;
                                policyCategory.TaxOnCommissionBeforeDiscount = GetTax(policyCategory.CommissionBeforeDiscount, homeProduct.TaxRate);
                                policyCategory.TaxOnCommissionAfterDiscount  = GetTax(policyCategory.CommissionAfterDiscount, homeProduct.TaxRate);
                                policyCategory.TaxOnPremiumBeforeDiscount    = GetTax(TotalSRCCPremium, homeProduct.TaxRate);
                                policyCategory.TaxOnPremiumAfterDiscount     = GetTax(PremiumAfterDiscount, homeProduct.TaxRate);
                                policyCategory.Value        = dr.Value;
                                policyCategory.ValueType    = dr.ValueType;
                                policyCategory.IsDeductable = dr.IsDeductable;
                                policyCategory.RenewalCount = renewalCount;
                                policyCategory.HomeID       = homeID;

                                policyCategories.Add(policyCategory);
                            }
                            if (dr.ValueType == "Percent" && dr.Code == "AGTCOMM")
                            {
                                var policyCategory = new PolicyCategory();
                                policyCategory.Agency    = dr.Agency;
                                policyCategory.AgentCode = dr.AgentCode;
                                policyCategory.Code      = dr.Code;
                                policyCategory.Category  = dr.Category;
                                policyCategory.CommissionBeforeDiscount = PremiumBeforeDiscount * dr.Value / 100;
                                policyCategory.CommissionAfterDiscount  = PremiumAfterDiscount * dr.Value / 100;
                                policyCategory.DocumentNo                    = documentNo;
                                policyCategory.EndorsementCount              = 0;
                                policyCategory.EndorsementNo                 = string.Empty;
                                policyCategory.DocumentID                    = homeID;
                                policyCategory.LineNo                        = lineNo.ToString();
                                policyCategory.LinkID                        = LinkID;
                                policyCategory.PremiumAfterDiscount          = PremiumAfterDiscount;
                                policyCategory.PremiumBeforeDiscount         = PremiumBeforeDiscount;
                                policyCategory.TaxOnCommissionBeforeDiscount = GetTax(policyCategory.CommissionBeforeDiscount, homeProduct.TaxRate);
                                policyCategory.TaxOnCommissionAfterDiscount  = GetTax(policyCategory.CommissionAfterDiscount, homeProduct.TaxRate);
                                policyCategory.TaxOnPremiumBeforeDiscount    = GetTax(PremiumBeforeDiscount, homeProduct.TaxRate);
                                policyCategory.TaxOnPremiumAfterDiscount     = GetTax(PremiumAfterDiscount, homeProduct.TaxRate);
                                policyCategory.Value        = dr.Value;
                                policyCategory.ValueType    = dr.ValueType;
                                policyCategory.IsDeductable = dr.IsDeductable;
                                policyCategory.RenewalCount = renewalCount;
                                policyCategory.HomeID       = homeID;

                                policyCategories.Add(policyCategory);
                            }
                        }
                    }
                    if (policy.UserChangedPremium)
                    {
                        var commissionDiscount = policy.CommissionAfterDiscount;
                        foreach (var pc in policyCategories)
                        {
                            if (pc.IsDeductable)
                            {
                                if (pc.CommissionBeforeDiscount < commissionDiscount)
                                {
                                    pc.CommissionAfterDiscount      = pc.CommissionBeforeDiscount;
                                    pc.TaxOnCommissionAfterDiscount = GetTax(pc.CommissionBeforeDiscount, homeProduct.TaxRate);
                                    commissionDiscount = commissionDiscount - pc.CommissionBeforeDiscount;
                                }
                                else
                                {
                                    pc.CommissionAfterDiscount      = commissionDiscount;
                                    pc.TaxOnCommissionAfterDiscount = GetTax(commissionDiscount, homeProduct.TaxRate);
                                    commissionDiscount = 0;
                                }
                            }
                        }
                    }
                    InsertCategory(policy, policyCategories);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }