Skip to content

Commit

Permalink
Nidi/add simulation pension plan (#54)
Browse files Browse the repository at this point in the history
* SAVEPOINT

* SAVEPOINT

* catch exception if web api is not available

* add tax account

* SAVEPOINT

* SAVEPOINT

* add investment account

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* finalize investment account simulation

* SAVEPOINT

* FIX UNIT TESTS

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* upgrade to .net 8

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* DO PACKAGE UPGRADE

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* save:wq

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* DO PACKAGE UPGRADE

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

* SAVEPOINT

---------

Co-authored-by: Dieter Niggeler <dniggeler@MacBook-Air-von-Maria.local>
  • Loading branch information
dniggeler and Dieter Niggeler committed Jun 9, 2024
1 parent e1d0a2e commit f5cf499
Show file tree
Hide file tree
Showing 10 changed files with 120 additions and 114 deletions.
1 change: 1 addition & 0 deletions src/.editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ charset = utf-8-bom
# .NET Coding Conventions #
###############################
[*.{cs,vb}]
max_line_length = 160
# Organize usings
dotnet_sort_system_directives_first = true
# this. preferences
Expand Down
36 changes: 28 additions & 8 deletions src/BlazorBvgRevisionApp/MyComponents/BvgPersonForm.razor
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
@using System.Globalization
@using BlazorBvgRevisionApp.MyComponents.Models
@using Domain.Enums

<MudGrid>
<MudItem md="4" xs="6">
<MudNumericField T="int" Label="VA Gültigkeitsdatum" Min="2023" Step="1" @bind-Value="@Person.ValidityYearCertificate" Placeholder="Gültigkeitsdatum" />
<MudItem md="3" xs="6">
<MudNumericField T="int" Label="VA Gültigkeitsjahrdatum" Min="2023" Step="1" @bind-Value="@Person.ValidityYearCertificate" Placeholder="Gültigkeitsjahr" />
</MudItem>

<MudItem md="4" xs="6">
<MudTextField Label="Name" Variant="Variant.Text" @bind-Value="@Person.Name"/>
<MudItem md="3" xs="6">
<MudTextField Required="true" RequiredError="" Label="Name" Variant="Variant.Text" @bind-Value="@Person.Name" />
</MudItem>

<MudItem md="4">
<MudDatePicker Label="Geburtsdatum" Editable="true" @bind-Date="@Person.DateOfBirth" DateFormat="yyyy-MM-dd" Placeholder="Geburtstag" Mask="@(new DateMask("0000-00-00"))"/>
<MudItem md="3" xs="6">
<MudDatePicker Label="Geburtsdatum" Editable="true" @bind-Date="@Person.DateOfBirth" DateFormat="yyyy-MM-dd" Required="true" RequiredError="" Placeholder="Geburtstag" Mask="@(new DateMask("0000-00-00"))"/>
</MudItem>

<MudItem md="4">
<GenderSelector Label="Geschlecht" SelectedGender="@Person.Gender" OnSelected="@(arg => Person.Gender = arg)"/>
<MudItem md="3" xs="6">
<GenderSelector Label="Geschlecht" SelectedGender="@gender" OnSelected="@(SetGender)" />
</MudItem>

<MudItem md="4">
Expand All @@ -33,5 +34,24 @@
</MudGrid>

@code {
private Gender? gender;

[Parameter] public required BvgPersonViewModel Person { get; set; }

protected override void OnParametersSet()
{
if (Person.Gender != Gender.Undefined)
{
gender = Person.Gender;
}
}

private void SetGender(Gender? g)
{
gender = g;
if (g.HasValue)
{
Person.Gender = g.Value;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@ public class BvgPersonViewModel

[Required]
[StringLength(25, ErrorMessage = "Name ist zu lang.", ErrorMessageResourceName = "error.person.name")]
public string Name { get; set; }
public string? Name { get; set; }

[Required]
public int ValidityYearCertificate { get; set; }

public DateTime? DateOfBirth { get; set; }

[Required]
public Gender Gender { get; set; }

public decimal BvgRetirementCapitalEndOfYear { get; set; }
Expand Down
15 changes: 9 additions & 6 deletions src/BlazorBvgRevisionApp/Pages/Index.razor
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
Es ist jedoch nicht einfach, die Auswirkungen dieser Änderungen auf die persönliche Vorsorge abzuleiten.
Dies liegt hauptsächlich an zwei Gründen:

<MudList Dense="true">
<MudList T="string" Dense="true">
<MudListItem Icon="@Icons.Material.Filled.ArrowRight">
Die Herausforderung für Personen, die sich nicht jeden Tag mit Ihrer Vorsorge beschäftigen, besteht darin,
aus dem komplexen Geflecht von BVG-Regeln, Rechenvorschriften und Grenzwerten die zukünftigen Leistungen zu berechnen.
Expand All @@ -38,7 +38,7 @@
</MudText>
<MudText>
Ihre persönliche Auswirkungsberechnung erfolgt in mehreren Schritten:
<MudList Dense="true">
<MudList T="string" Dense="true">
<MudListItem Icon="@Icons.Material.Filled.ArrowRight">
Im ersten Schritt geben Sie Ihre persönlichen Daten ein, die für die Berechnung der Rentenleistungen erforderlich sind.
</MudListItem>
Expand All @@ -54,12 +54,15 @@
</MudList>

Die Auswirkungsberechnung unterliegt den folgenden Einschränkungen:
<ul>
<MudList T="string" Dense="true">
<li>Personenkreis: die Berechnung von Leistungen einer (Teil-)invaliden Person ist nicht unterstützt. Pensionierte sind von der Reform nicht betroffen.</li>
<li>Leistungen: die Berechnung beschränkt sich auf die Sparleistung (das Altersguthaben zum ordentlichen Rentenbeginn) und der daraus resultierenden Alterrente.
Ausgenommen sind also Risikoleistungen (wie Invaliden-, Partner-/Witwen- und Waisenrenten)</li>
<li>
Leistungen: die Berechnung beschränkt sich auf die Sparleistung (das Altersguthaben zum ordentlichen Rentenbeginn) und der daraus resultierenden Alterrente.
Ausgenommen sind also Risikoleistungen (wie Invaliden-, Partner-/Witwen- und Waisenrenten)
</li>
<li></li>
</ul>
</MudList>

</MudText>

<MudText>
Expand Down
4 changes: 2 additions & 2 deletions src/BlazorBvgRevisionApp/Pages/Links.razor
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

<MudContainer>
<MudText Typo="Typo.h6">Nützliche Links zur Reform BVG 21</MudText>
<MudList Clickable="true">
<MudList T="string" Clickable="true">
@foreach ((string Title, string Url) link in links)
{
<MudListItem>
<MudListItem T="string">
@link.Title
<BibLink Url="@link.Url" MaxLength="50" />
</MudListItem>
Expand Down
78 changes: 48 additions & 30 deletions src/BlazorBvgRevisionApp/Pages/MyPension.razor
Original file line number Diff line number Diff line change
Expand Up @@ -32,23 +32,25 @@
<MudText Class="mb-4">
Alle diese Werte sind auf Ihrem Vorsorgeausweis, den Sie mindestens einmal jährlich erhalten, aufgeführt.
</MudText>

<BvgPersonForm Person="@Person"></BvgPersonForm>

<MudText Class="mt-8" Typo="Typo.h6">Schritt 2: Haben Sie Anspruch auf einen Rentenzuschlag?</MudText>
<MudForm Model="@Person" @ref="bvgForm" @bind-IsValid="@success">
<BvgPersonForm Person="@Person"/>

<MudText Class="mt-8" Typo="Typo.h6">Schritt 2: Haben Sie Anspruch auf einen Rentenzuschlag?</MudText>

<MudText Class="mt-4">
Falls Sie die beiden Vorraussetzungen für einen Rentenzuschlag erfüllen und Sie einer Übergangsgeneration angehören,
erhöht sich BVG Altersrente. Details dazu finden Sie <MudLink Target="_blank" Href="https://www.bsv.admin.ch/bsv/de/home/sozialversicherungen/bv/reformen-und-revisionen.html">hier</MudLink>.
</MudText>
<MudText Class="mt-4">
Falls Sie die beiden Vorraussetzungen für einen Rentenzuschlag erfüllen und Sie einer Übergangsgeneration angehören,
erhöht sich BVG Altersrente. Details dazu finden Sie <MudLink Target="_blank" Href="https://www.bsv.admin.ch/bsv/de/home/sozialversicherungen/bv/reformen-und-revisionen.html">hier</MudLink>.
</MudText>

<EligibleForPension PreCondition="@PreCondition"/>
<EligibleForPension PreCondition="@PreCondition"/>

<MudGrid>
<MudItem md="12">
<MudButton OnClick="OnBvgCalculate" Variant="Variant.Filled" Color="Color.Primary" Disabled="@IsPersonNotValid()">Berechne</MudButton>
</MudItem>
</MudGrid>
<MudGrid>
<MudItem md="12">
<MudButton OnClick="OnBvgCalculate" Variant="Variant.Filled" Color="Color.Primary" Disabled="@(!success)">Berechne</MudButton>
</MudItem>
</MudGrid>
</MudForm>

@if(RevisionCalculationResult is not null)
{
Expand All @@ -68,7 +70,7 @@

<MudGrid>
<MudItem md="12">
<MudButton OnClick="OnSimulatePlan" Variant="Variant.Filled" Color="Color.Secondary" Disabled="@IsPersonNotValid()">Prüfe Plan</MudButton>
<MudButton OnClick="OnSimulatePlan" Variant="Variant.Filled" Color="Color.Secondary" Disabled="@(!ValidPersonDateOfBirth())">Prüfe Plan</MudButton>
</MudItem>
</MudGrid>

Expand All @@ -90,23 +92,32 @@
{
private BvgPersonViewModel Person { get; set; } = new ();
private BvgCalculationResult? RevisionCalculationResult { get; set; }
private BvgCalculationResult? SimulationRevisionCalculationResult { get; set; }
private BvgCalculationResult? SimulationRevisionCalculationResult;
private BvgCalculationResult? CurrentCalculationResult { get; set; }
private EligibleForPensionViewModel PreCondition { get; } = new();
private PensionPlanViewModel PensionPlan = new();
private PensionPlanSimulationResult? PlanSimulationResult;
private MudForm? bvgForm;
private bool success;

protected override void OnInitialized()
{
if (EnvironmentService.IsDevelopment())
{
Person = GetTestPerson();
PensionPlan = GetTestPensionPlan();
PensionPlan = GetDefaultPensionPlan();
}
}

private void OnBvgCalculate(MouseEventArgs obj)
private void OnBvgCalculate(MouseEventArgs _)
{
bvgForm?.Validate();

if(!ValidPersonDateOfBirth())
{
return;
}

BvgPerson bvgPerson = new()
{
ReportedSalary = Person.ReportedSalary,
Expand Down Expand Up @@ -201,26 +212,26 @@
new TableResult("Altersrente", simulationRetirementPension, simulationRevisionRetirementPension)
];

if (PreCondition.IsEligible() &&
SimulationRevisionCalculationResult is not null)
if (PreCondition.IsEligible() && SimulationRevisionCalculationResult is not null)
{
decimal finalRetirementCapital = Math.Max(Person.FinalRetirementCapital, SimulationRevisionCalculationResult?.FinalRetirementCapital ?? decimal.Zero);

decimal pensionSupplement = BvgPensionSupplementCalculator.CalculatePensionSupplement(Person.DateOfBirth ?? DateTime.MaxValue, finalRetirementCapital);

SimulationRevisionCalculationResult.RetirementPension += pensionSupplement;
if (SimulationRevisionCalculationResult is not null)
{
SimulationRevisionCalculationResult.RetirementPension += pensionSupplement;
}

results.Add(new TableResult("davon Rentenzuschlag", null, Math.Round(pensionSupplement), true));
}


return results.ToArray();
}

private bool IsPersonNotValid()
private bool ValidPersonDateOfBirth()
{
return !(Person.Gender is not Gender.Undefined &&
Person.DateOfBirth is not null);
return Person.DateOfBirth is not null;
}

private BvgPersonViewModel GetTestPerson()
Expand All @@ -233,18 +244,16 @@
ReportedSalary = 192967,
BvgRetirementCapitalEndOfYear = 169805M,
FinalRetirementCapital = 1171484,
Gender = Gender.Female,
Gender = Gender.Male,
};
}

private PensionPlanViewModel GetTestPensionPlan()
private PensionPlanViewModel GetDefaultPensionPlan()
{
return new PensionPlanViewModel
{
ProjectionInterestRate = 0.01M,
InsuredSalary = 192967,
RetirementCapitalEndOfYear = 721065M,
ConversionRate = 0.058M,
ProjectionInterestRate = 0.015M,
ConversionRate = 0.068M,
RetirementCredits = [
new RetirementCreditRange{FromAge = 0, ToAge = 24, Rate = 0M},
new RetirementCreditRange{FromAge = 25, ToAge = 34, Rate = 0.07M},
Expand All @@ -254,4 +263,13 @@
]
};
}

private PensionPlanViewModel GetTestPensionPlan()
{
PensionPlanViewModel defaultPlan = GetDefaultPensionPlan();
defaultPlan.InsuredSalary = 192967;
defaultPlan.RetirementCapitalEndOfYear = 721065M;

return defaultPlan;
}
}
30 changes: 15 additions & 15 deletions src/BlazorBvgRevisionApp/Pages/Revision.razor
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,27 @@

<p>Am <strong>22. September 2024</strong> wird die <strong>Reform der beruflichen Vorsorge (BVG-Reform)</strong> zur Volksabstimmung kommen. Diese Reform, die vom Parlament im März 2023 verabschiedet wurde, zielt darauf ab, die Finanzierung der 2. Säule zu stärken, das Leistungsniveau insgesamt zu erhalten und die Absicherung von Teilzeitbeschäftigten – insbesondere von Frauen – zu verbessern. Hier sind die wichtigsten Änderungen, die den Destinatär betreffen:</p>

<MudList>
<MudListItem><strong>Senkung des Eintrittsschwelle</strong>: Die Eintrittsschwelle wird von derzeit 22’050 Franken auf 19’845 Franken gesenkt. Das bedeutet, dass Personen, die insgesamt pro Jahr so viel verdienen, zum Eintritt in eine Pensionskasse verpflichtet werden und dann obligatorisch versichert wären</MudListItem>
<MudListItem><strong>Senkung des Umwandlungssatzes</strong>: Der Umwandlungssatz, der die Umrechnung des angesparten Kapitals in eine lebenslange Rente bestimmt, wird gesenkt. Dies kann Auswirkungen auf die Rentenhöhe haben.</MudListItem>
<MudListItem><strong>Verstärkung des Sparprozesses</strong>: Die BVG-Reform zielt darauf ab, das Endaltersguthaben zu erhöhen, um langfristig die Senkung des Umwandlungssatzes zu kompensieren. Dies betrifft die Beiträge und die Anlagestrategie.</MudListItem>
<MudListItem><strong>Rentenzuschlag für die Übergangsgeneration</strong>: Eine wichtige Massnahme ist der Rentenzuschlag für Personen, die kurz vor der Pensionierung stehen. Dies soll die Renten der Übergangsgeneration stabilisieren.</MudListItem>
<MudListItem><strong>Lohnabhängiger Koordinationsabzug</strong>: Der Koordinationsabzug betrifft den Teil des Einkommens, der nicht in die Berechnung der Altersgutschriften einfliesst. Dieser Aspekt wurde ebenfalls in die Reform aufgenommen. Der versicherte Lohn, der als Grundlage für die Berechnung dient, ist der Teil des Einkommens, der in die berufliche Vorsorge einbezogen wird.</MudListItem>
<MudListItem><strong>Vereinfachung der Altersgutschriftensätze</strong>: Die Berechnung der Altersgutschriften wurde transparenter gestaltet, indem die Sätze vereinfacht wurden.</MudListItem>
<MudList T="string">
<MudListItem T="string"><strong>Senkung des Eintrittsschwelle</strong>: Die Eintrittsschwelle wird von derzeit 22’050 Franken auf 19’845 Franken gesenkt. Das bedeutet, dass Personen, die insgesamt pro Jahr so viel verdienen, zum Eintritt in eine Pensionskasse verpflichtet werden und dann obligatorisch versichert wären</MudListItem>
<MudListItem T="string"><strong>Senkung des Umwandlungssatzes</strong>: Der Umwandlungssatz, der die Umrechnung des angesparten Kapitals in eine lebenslange Rente bestimmt, wird gesenkt. Dies kann Auswirkungen auf die Rentenhöhe haben.</MudListItem>
<MudListItem T="string"><strong>Verstärkung des Sparprozesses</strong>: Die BVG-Reform zielt darauf ab, das Endaltersguthaben zu erhöhen, um langfristig die Senkung des Umwandlungssatzes zu kompensieren. Dies betrifft die Beiträge und die Anlagestrategie.</MudListItem>
<MudListItem T="string"><strong>Rentenzuschlag für die Übergangsgeneration</strong>: Eine wichtige Massnahme ist der Rentenzuschlag für Personen, die kurz vor der Pensionierung stehen. Dies soll die Renten der Übergangsgeneration stabilisieren.</MudListItem>
<MudListItem T="string"><strong>Lohnabhängiger Koordinationsabzug</strong>: Der Koordinationsabzug betrifft den Teil des Einkommens, der nicht in die Berechnung der Altersgutschriften einfliesst. Dieser Aspekt wurde ebenfalls in die Reform aufgenommen. Der versicherte Lohn, der als Grundlage für die Berechnung dient, ist der Teil des Einkommens, der in die berufliche Vorsorge einbezogen wird.</MudListItem>
<MudListItem T="string"><strong>Vereinfachung der Altersgutschriftensätze</strong>: Die Berechnung der Altersgutschriften wurde transparenter gestaltet, indem die Sätze vereinfacht wurden.</MudListItem>
</MudList>

<MudText Class="mt-4" Typo="Typo.h6">Fachbegriffe:</MudText>
<MudList>
<MudListItem><strong>Eintrittsschwelle</strong>: Bezeichnet den Mindestlohn, den eine Person bei einem Arbeitgeber erzielen muss, um obligatorisch gemäss BVG versichert zu sein.</MudListItem>
<MudListItem><strong>Endaltersguthaben</strong>: Das gesamte angesparte Kapital bei Renteneintritt.</MudListItem>
<MudListItem><strong>Koordinationsabzug</strong>: Der Teil des Einkommens, der nicht für die Berechnung der Altersgutschriften berücksichtigt wird.</MudListItem>
<MudListItem><strong>Umwandlungssatz</strong>: Der Prozentsatz, mit dem das angesparte Kapital in eine lebenslange Rente umgerechnet wird.</MudListItem>
<MudListItem><strong>Versicherter Lohn</strong>: Der Teil des Einkommens, der in die berufliche Vorsorge einbezogen wird.</MudListItem>
<MudList T="string">
<MudListItem T="string"><strong>Eintrittsschwelle</strong>: Bezeichnet den Mindestlohn, den eine Person bei einem Arbeitgeber erzielen muss, um obligatorisch gemäss BVG versichert zu sein.</MudListItem>
<MudListItem T="string"><strong>Endaltersguthaben</strong>: Das gesamte angesparte Kapital bei Renteneintritt.</MudListItem>
<MudListItem T="string"><strong>Koordinationsabzug</strong>: Der Teil des Einkommens, der nicht für die Berechnung der Altersgutschriften berücksichtigt wird.</MudListItem>
<MudListItem T="string"><strong>Umwandlungssatz</strong>: Der Prozentsatz, mit dem das angesparte Kapital in eine lebenslange Rente umgerechnet wird.</MudListItem>
<MudListItem T="string"><strong>Versicherter Lohn</strong>: Der Teil des Einkommens, der in die berufliche Vorsorge einbezogen wird.</MudListItem>
</MudList>

<MudText Typo="Typo.h6">Quellen: </MudText>
<MudList>
<MudListItem>
<MudList T="string">
<MudListItem T="string">
Bundesamt für Sozialversicherung:
<BibLink Url="https://www.bsv.admin.ch/bsv/de/home/sozialversicherungen/bv/reformen-und-revisionen.html" MaxLength="50" />
</MudListItem>
Expand Down
6 changes: 3 additions & 3 deletions src/BlazorBvgRevisionApp/Services/PensionPlanSimulator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public PensionPlanSimulationResult Calculate(PensionPlanViewModel pensionPlan, B
});

bvgCalculationResult.Match(
Left: error => logger.LogError("BVG calculation error: {error}", error),
Left: error => logger.LogError($"BVG calculation error: {error}"),
Right: result => logger.LogInformation($"BVG calculation result: {JsonSerializer.Serialize(result)}"));

RetirementSavingsProcessResult[] projections = projectionCalculator.ProjectionTable(
Expand All @@ -60,7 +60,7 @@ public PensionPlanSimulationResult Calculate(PensionPlanViewModel pensionPlan, B
return new PensionPlanSimulationResult(null, null);
}

private Func<TechnicalAge, decimal> RetirementCreditSelector(decimal insuredSalary, RetirementCreditRange[] retirementCreditTable)
private static Func<TechnicalAge, decimal> RetirementCreditSelector(decimal insuredSalary, RetirementCreditRange[] retirementCreditTable)
{
Dictionary<int, decimal> retirementCreditByAge = CreateRetirementCreditDictionary(retirementCreditTable);

Expand All @@ -74,7 +74,7 @@ private Func<TechnicalAge, decimal> RetirementCreditSelector(decimal insuredSala
};
}

private Dictionary<int, decimal> CreateRetirementCreditDictionary(RetirementCreditRange[] pensionPlanRetirementCredits)
private static Dictionary<int, decimal> CreateRetirementCreditDictionary(RetirementCreditRange[] pensionPlanRetirementCredits)
{
Dictionary<int, decimal> retirementCreditByAge = Enumerable.Range(0,100).ToDictionary(item => item, _ => Zero);

Expand Down
Loading

0 comments on commit f5cf499

Please sign in to comment.