private IEnumerable <string> GetUndesirabilityReasons <TBaseGrowthZoneClusterConsumption>( TBaseGrowthZoneClusterConsumption baseGrowthZoneClusterConsumption, Func <ICityBudgetConfiguration, decimal> getCityBudgetValue) where TBaseGrowthZoneClusterConsumption : BaseGrowthZoneClusterConsumption { if (baseGrowthZoneClusterConsumption.PopulationDensity < 9) { return(Enumerable.Empty <string>()); } if (!_taxRateMultiplier.HasValue) { _taxRateMultiplier = 1M / TaxDefinition.GetSelectableTaxRatePercentages().Max(); } return(baseGrowthZoneClusterConsumption .ZoneClusterMembers .Single(x => x.IsCentralClusterMember) .GetZoneInfo() .WithResultIfHasMatch(centralZone => { var issueThreshold = 1.5M - (getCityBudgetValue(_cityBudgetConfiguration) * _taxRateMultiplier); return GetIssueResults(centralZone, x => x.RepresentsUndesirabilityFor(baseGrowthZoneClusterConsumption)) .Where(x => x.IssueAmount > issueThreshold) .Select(x => x.Issue); })); }
public TaxDefinition GetTaxDefinition(DateTime moment) { //This is prove of concept. Hard-coded data. var result = new TaxDefinition() { Id = 0, //First and last day of the month PeriodFrom = new DateTime(moment.Year, moment.Month, 1), PeriodTo = new DateTime(moment.Year, moment.Month, moment.AddMonths(1).AddDays(-1).Day), Definitions = new List <TaxDefinitionItem>() { new TaxDefinitionItem() { Name = "Tax does not apply", FromAmountIncluding = 0m, UpToAmount = 1000m, BaseTaxAmount = 0, PercentAboveFrom = 0, }, new TaxDefinitionItem() { Name = "Tax 10%", FromAmountIncluding = 1000m, UpToAmount = TaxDefinitionItem.MaxUpToAmount, BaseTaxAmount = 0m, PercentAboveFrom = 0.10m }, new TaxDefinitionItem() { Name = "Social contribution", FromAmountIncluding = 1000m, UpToAmount = 3000m, BaseTaxAmount = 0m, PercentAboveFrom = 0.15m }, // This definition adds social contribution for income above 3000 or the amount 1000-3000. new TaxDefinitionItem() { Name = "Social contribution for above 3000", FromAmountIncluding = 3000m, UpToAmount = TaxDefinitionItem.MaxUpToAmount, BaseTaxAmount = 300m, PercentAboveFrom = 0m } } }; return(result); }