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);
            }));
        }
Beispiel #2
0
        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);
        }