Пример #1
0
        public async Task AltersguthabenEndeJahrTest(int gemeldeterLohnAsInt, string dateOfBirthAsString,
                                                     string dateOfEintrittAsString, int einlageAsDouble, double expectedEndaltersguthabenAsDouble)
        {
            // given
            decimal  gemeldeterLohn = gemeldeterLohnAsInt;
            decimal  einlage        = Convert.ToDecimal(einlageAsDouble);
            DateTime dateOfBirth    = DateTime.Parse(dateOfBirthAsString, CultureInfo.InvariantCulture);
            DateTime dateOfEintritt = DateTime.Parse(dateOfEintrittAsString, CultureInfo.InvariantCulture);

            decimal expectedEndaltersguthaben = Convert.ToDecimal(expectedEndaltersguthabenAsDouble);

            var input = new BvgCalculationInput
            {
                Lohn           = gemeldeterLohn,
                DateOfEintritt = dateOfEintritt,
                DateOfBirth    = dateOfBirth,
                Altersguthaben = einlage,
                Geschlecht     = Geschlecht.Mann,
            };

            // when
            var plan   = new BvgPlan();
            var result = await _calculator.CalculateAsync(plan, input).ConfigureAwait(false);

            // then
            result.AlterguthabenEndeJahr.Should().Be(expectedEndaltersguthaben);
        }
Пример #2
0
        public async Task AltersgutschriftTest(int gemeldeterLohnAsInt, double expectedAltersgutschriftAsDouble, string dateOfBirthAsString)
        {
            _outputHelper.WriteLine($"Lohn={gemeldeterLohnAsInt}, AGS={expectedAltersgutschriftAsDouble}, DoB={dateOfBirthAsString}");

            // given
            decimal  gemeldeterLohn           = gemeldeterLohnAsInt;
            decimal  expectedAltersgutschrift = Convert.ToDecimal(expectedAltersgutschriftAsDouble);
            DateTime dateOfBirth = DateTime.Parse(dateOfBirthAsString, CultureInfo.InvariantCulture);

            var input = new BvgCalculationInput
            {
                Lohn           = gemeldeterLohn,
                DateOfEintritt = new DateTime(2016, 1, 1),
                DateOfBirth    = dateOfBirth,
                Altersguthaben = 0m,
                Geschlecht     = Geschlecht.Mann,
            };

            var calculator = _kernel.Get <IBvgCalculator>();
            var plan       = new BvgPlan();

            // when
            var result = await calculator.CalculateAsync(plan, input).ConfigureAwait(false);

            // then
            result.Altersgutschrift.Should().Be(expectedAltersgutschrift);
        }
Пример #3
0
        public Tuple <DateTime, decimal> Calculate(BvgPlan plan, BvgCalculationInput input)
        {
            int      schlussalter     = _calcSchlussalter.Calculate(plan, input);
            DateTime dateOfRetirement = _calcPensionierung.Calculate(plan, input);

            int rechnungsjahr = input.DateOfEintritt.Year;
            int bvgAlter      = rechnungsjahr - input.DateOfBirth.Year;

            bool isPensionierungInRechnungsjahr = bvgAlter == schlussalter;

            var endOfYear = new DateTime(rechnungsjahr, 1, 1);

            if (isPensionierungInRechnungsjahr)
            {
                endOfYear = dateOfRetirement;
            }

            decimal aghEndeJahr = 0;

            if (bvgAlter >= plan.Eintrittsalter)
            {
                decimal schrumpPeriodeRechnungsjahr = (isPensionierungInRechnungsjahr ? dateOfRetirement.Month / 12m : 1m);
                decimal agsRechnungsjahr            = _calcAltersgutschrift.Calculate(plan, input) * schrumpPeriodeRechnungsjahr;

                aghEndeJahr = agsRechnungsjahr + input.Altersguthaben * (1m + _constantsBvg.BvgZins * schrumpPeriodeRechnungsjahr);
            }

            return(Tuple.Create(endOfYear, aghEndeJahr));
        }
Пример #4
0
        public decimal Calculate(BvgPlan plan, BvgCalculationInput input)
        {
            int financialYear = input.DateOfEintritt.Year;

            int xBvg = financialYear - input.DateOfBirth.Year;

            return(GetGutschriftssatz(xBvg, input.Geschlecht, plan));
        }
Пример #5
0
        public Dictionary <DateTime, decimal> Calculate(BvgPlan plan, BvgCalculationInput input)
        {
            var dictProjection = new Dictionary <DateTime, decimal>();

            var aghEndeJahr = _calcAlterguthabenEndeJahr.Calculate(plan, input);

            return(dictProjection);
        }
Пример #6
0
        public DateTime Calculate(BvgPlan plan, BvgCalculationInput input)
        {
            int schlussalter = _calcSchlussalter.Calculate(plan, input);

            DateTime dateOfRetirement = new DateTime(input.DateOfBirth.Year, input.DateOfBirth.Month, 1).AddMonths(1).AddYears(schlussalter).AddDays(-1);

            return(dateOfRetirement);
        }
Пример #7
0
        public BvgCalculationInput GetDetails([FromBody] BvgCalculationInput input)
        {
            var engine = new BvgCalculator(new BvgConstants());

            var result = engine.CalculateAsync(new BvgPlan(), input);

            return(result);
        }
        public async Task <BvgCalculationResult> CalculateAsync(BvgPlan plan, BvgCalculationInput input)
        {
            BvgCalculationResult result = new BvgCalculationResult();

            result.VersicherterLohn      = _calcVersicherterLohn.Calculate(plan, input);
            result.Altersgutschrift      = _calcAltersgutschrift.Calculate(plan, input);
            result.AlterguthabenEndeJahr = _calcAlterguthabenEndeJahr.Calculate(plan, input).Item2;

            result.Altersrente = 1000m;

            return(await Task.FromResult(result));
        }
        public decimal Calculate(BvgPlan plan, BvgCalculationInput input)
        {
            var jahreslohn = _calcJahreslohn.Calculate(plan, input);

            if (jahreslohn <= _calcLohnuntergrenze.Calculate(plan, input))
            {
                return(0m);
            }

            decimal lohn = Math.Max(jahreslohn - _calcKoordinationsabzug.Calculate(plan, input), _calcMinimumLohn.Calculate(plan, input));

            return(lohn);
        }
Пример #10
0
        private static void CalculateHelper(BvgCalculationInput input, BvgPlan plan, IBvgCalculator engine, List <BvgTestData> resultList)
        {
            var result =
                Task.Factory.StartNew(s => engine.CalculateAsync(plan, input), engine, CancellationToken.None,
                                      TaskCreationOptions.None, TaskScheduler.Default)
                .Unwrap().GetAwaiter().GetResult();


            resultList.Add(new BvgTestData()
            {
                Input  = input,
                Result = result,
            });
        }
        public int Calculate(BvgPlan plan, BvgCalculationInput input)
        {
            int schlussalter = 0;

            switch (input.Geschlecht)
            {
            case Geschlecht.Frau:
            {
                schlussalter = plan.SchlussalterFrau;
            }
            break;

            case Geschlecht.Mann:
            {
                schlussalter = plan.SchlussalterMann;
            }
            break;
            }

            return(schlussalter);
        }
Пример #12
0
        public async Task VersicherterLohnTest(int gemeldeterLohnAsInt, int expectedVersicherterLohnAsInt)
        {
            // given
            decimal gemeldeterLohn           = gemeldeterLohnAsInt;
            decimal expectedVersicherterLohn = expectedVersicherterLohnAsInt;

            var input = new BvgCalculationInput
            {
                Lohn           = gemeldeterLohn,
                DateOfEintritt = new DateTime(2016, 1, 1),
                DateOfBirth    = new DateTime(1969, 3, 17),
                Altersguthaben = 0m,
                Geschlecht     = Geschlecht.Mann,
            };

            var calculator = _kernel.Get <IBvgCalculator>();
            var plan       = new BvgPlan();

            // when
            var result = await calculator.CalculateAsync(plan, input).ConfigureAwait(false);

            // then
            result.VersicherterLohn.Should().Be(expectedVersicherterLohn);
        }
Пример #13
0
 public decimal Calculate(BvgPlan plan, BvgCalculationInput input)
 {
     return(0.75m * _calcAhv.GetMaxRente(input.DateOfEintritt.Year));
 }
Пример #14
0
        static void Main()
        {
            var resultList = new List <BvgTestData>();

            var plan = new BvgPlan();

            var engine = new BvgCalculator(new BvgConstants());

            // Testcase 1
            {
                BvgCalculationInput input = new BvgCalculationInput()
                {
                    Geschlecht     = Geschlecht.Mann,
                    Altersguthaben = 40000m,
                    DateOfBirth    = new DateTime(1974, 8, 15),
                    Lohn           = 100000m,
                };

                CalculateHelper(input, plan, engine, resultList);
            }

            // Testcase 2
            {
                BvgCalculationInput input = new BvgCalculationInput()
                {
                    Geschlecht     = Geschlecht.Frau,
                    Altersguthaben = 45600m,
                    DateOfBirth    = new DateTime(1965, 6, 6),
                    Lohn           = 70000m,
                };

                CalculateHelper(input, plan, engine, resultList);
            }

            // Testcase 3
            {
                BvgCalculationInput input = new BvgCalculationInput()
                {
                    Geschlecht     = Geschlecht.Mann,
                    Altersguthaben = 25000m,
                    DateOfBirth    = new DateTime(1963, 1, 24),
                    Lohn           = 28200m,
                };

                CalculateHelper(input, plan, engine, resultList);
            }

            // Testcase 4
            {
                BvgCalculationInput input = new BvgCalculationInput()
                {
                    Geschlecht     = Geschlecht.Frau,
                    Altersguthaben = 44000m,
                    DateOfBirth    = new DateTime(1965, 12, 12),
                    Lohn           = 28200m,
                };

                CalculateHelper(input, plan, engine, resultList);
            }

            // Testcase 5
            {
                BvgCalculationInput input = new BvgCalculationInput()
                {
                    Geschlecht     = Geschlecht.Mann,
                    Altersguthaben = 50000m,
                    DateOfBirth    = new DateTime(1966, 7, 25),
                    Lohn           = 200000m,
                };

                CalculateHelper(input, plan, engine, resultList);
            }

            // Testcase 6
            {
                BvgCalculationInput input = new BvgCalculationInput()
                {
                    Geschlecht     = Geschlecht.Frau,
                    Altersguthaben = 29000,
                    DateOfBirth    = new DateTime(1972, 10, 18),
                    Lohn           = 250000,
                };

                CalculateHelper(input, plan, engine, resultList);
            }

            // Testcase 7
            {
                BvgCalculationInput input = new BvgCalculationInput()
                {
                    Geschlecht     = Geschlecht.Mann,
                    Altersguthaben = 30000,
                    DateOfBirth    = new DateTime(1951, 7, 21),
                    Lohn           = 70000,
                };

                CalculateHelper(input, plan, engine, resultList);
            }

            // Testcase 8
            {
                BvgCalculationInput input = new BvgCalculationInput()
                {
                    Geschlecht     = Geschlecht.Frau,
                    Altersguthaben = 21400,
                    DateOfBirth    = new DateTime(1952, 10, 5),
                    Lohn           = 75000,
                };

                CalculateHelper(input, plan, engine, resultList);
            }

            // Testcase 9
            {
                BvgCalculationInput input = new BvgCalculationInput()
                {
                    Geschlecht     = Geschlecht.Frau,
                    Altersguthaben = 0,
                    DateOfBirth    = new DateTime(1994, 8, 31),
                    Lohn           = 71000,
                };

                CalculateHelper(input, plan, engine, resultList);
            }

            // Testcase 10
            {
                BvgCalculationInput input = new BvgCalculationInput()
                {
                    Geschlecht     = Geschlecht.Mann,
                    Altersguthaben = 0,
                    DateOfBirth    = new DateTime(1995, 5, 13),
                    Lohn           = 66000,
                };

                CalculateHelper(input, plan, engine, resultList);
            }

            XmlSerializer serializer = new XmlSerializer(typeof(List <BvgTestData>));

            serializer.Serialize(System.Console.Out, resultList);
        }
        public async Task <BvgCalculationResult> CalculateAsync(BvgPlan plan, BvgCalculationInput input)
        {
            DateTime calculationDate = new DateTime(2016, 1, 1);
            int      rechnungsjahr   = calculationDate.Year;
            int      bvgAlter        = rechnungsjahr - input.DateOfBirth.Year;
            int      schlussalter    = 0;

            switch (input.Geschlecht)
            {
            case Geschlecht.Frau:
            {
                schlussalter = plan.SchlussalterFrau;
            }
            break;

            case Geschlecht.Mann:
            {
                schlussalter = plan.SchlussalterMann;
            }
            break;
            }

            bool isPensionierungInRechnungsjahr = bvgAlter == schlussalter;

            DateTime dateOfRetirement = new DateTime(input.DateOfBirth.Year, input.DateOfBirth.Month, 1).AddMonths(1).AddYears(schlussalter).AddDays(-1);

            decimal schrumpfPeriode             = dateOfRetirement.Month / 12m;
            decimal schrumpPeriodeRechnungsjahr = (isPensionierungInRechnungsjahr ? schrumpfPeriode : 1m);

            decimal koordinationsabzug    = _bvgConstants.MaxAhvRente * 0.875m;
            decimal maxVersicherbarerLohn = 3.0m * _bvgConstants.MaxAhvRente;
            decimal versicherterLohn      = Math.Min(input.Lohn, maxVersicherbarerLohn) - koordinationsabzug;

            var sparstaffelung = new Sparstaffelung(plan);

            decimal eaghOhneZins = 0m;
            decimal eaghMitZins  = 0m;

            var projections = new Dictionary <DateTime, decimal>();

            projections.Add(calculationDate.Date, eaghMitZins + input.Altersguthaben);

            // Aktuelles Jahr
            if (bvgAlter >= plan.Eintrittsalter)
            {
                decimal agsRechnungsjahr =
                    versicherterLohn * sparstaffelung.GetGutschriftssatz(bvgAlter, input.Geschlecht) * schrumpPeriodeRechnungsjahr;

                eaghOhneZins =
                    agsRechnungsjahr + input.Altersguthaben * (1m + _bvgConstants.BvgZins * schrumpPeriodeRechnungsjahr);

                eaghMitZins = eaghOhneZins;
                if (isPensionierungInRechnungsjahr)
                {
                    projections.Add(dateOfRetirement.Date, eaghMitZins);
                }
                else
                {
                    projections.Add(new DateTime(calculationDate.AddYears(1).Year, 1, 1).Date, eaghMitZins);
                }
            }

            // Folgejahr ohne Schrumpjahr Pensionierung
            for (int x = Math.Max(bvgAlter + 1, plan.Eintrittsalter); x < schlussalter; x++)
            {
                decimal ags = versicherterLohn * sparstaffelung.GetGutschriftssatz(x, input.Geschlecht);

                eaghOhneZins += ags;
                eaghMitZins   = eaghMitZins * (1m + _bvgConstants.BvgZins) + ags;

                projections.Add(new DateTime(input.DateOfBirth.Year + x, 1, 1).AddYears(1).Date, eaghMitZins);
            }

            // Schrumpfjahr
            if (isPensionierungInRechnungsjahr == false)
            {
                decimal agsSchlussjahr  = versicherterLohn * sparstaffelung.GetGutschriftssatz(schlussalter, input.Geschlecht);
                decimal agsSchrumpfjahr = agsSchlussjahr * schrumpfPeriode;

                eaghOhneZins += agsSchrumpfjahr;
                eaghMitZins   = eaghMitZins * (1m + _bvgConstants.BvgZins * schrumpfPeriode) + agsSchrumpfjahr;

                projections.Add(dateOfRetirement, eaghMitZins);
            }


            var result = new BvgCalculationResult()
            {
                EaghMitZins    = eaghMitZins,
                EaghOhneZins   = eaghOhneZins,
                Altersrente    = eaghMitZins * _bvgConstants.Umws,
                Invalidenrente = eaghOhneZins * _bvgConstants.Umws * plan.FactorInvalidenrente,
                Partnerrente   = eaghOhneZins * _bvgConstants.Umws * plan.FactorPartnerrente,
                Waisenrente    = eaghOhneZins * _bvgConstants.Umws * plan.FactorWaisenrente,
            };

            result.Projections = projections.Select(pair => new ProjectionItem()
            {
                DateOfRechnungsjahr = pair.Key, Altersguthaben = pair.Value,
            })
                                 .ToArray();

            return(await Task.FromResult(result));
        }
        public decimal Calculate(BvgPlan plan, BvgCalculationInput input)
        {
            decimal factorAltersgutschrift = _staffelung.Calculate(plan, input);

            return(_calcVersicherterLohn.Calculate(plan, input) * factorAltersgutschrift);
        }
 public decimal Calculate(BvgPlan plan, BvgCalculationInput input)
 {
     return(Math.Min(input.Lohn, 3.0m * _calcAhv.GetMaxRente(input.DateOfEintritt.Year)));
 }