< Summary

Information
Class: Buergerportal.Gebuehren.Gebuehrenrechner
Assembly: Buergerportal.Gebuehren
File(s): /builds/konradschrader2001/buergerportal/Buergerportal/src/Buergerportal.Gebuehren/Gebuehrenrechner.cs
Line coverage
84%
Covered lines: 28
Uncovered lines: 5
Coverable lines: 33
Total lines: 97
Line coverage: 84.8%
Branch coverage
77%
Covered branches: 7
Total branches: 9
Branch coverage: 77.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
Grundgebuehr(...)50%3250%
ErmaessigungsProzent(...)80%5587.5%
BerechneGebuehr(...)100%22100%

File(s)

/builds/konradschrader2001/buergerportal/Buergerportal/src/Buergerportal.Gebuehren/Gebuehrenrechner.cs

#LineLine coverage
 1namespace Buergerportal.Gebuehren;
 2
 3/// <summary>
 4/// Art der beantragten Amtshandlung. Jede Art hat eine Grundgebuehr
 5/// gemaess (fiktiver) kommunaler Gebuehrenordnung.
 6/// </summary>
 7public enum Amtshandlung
 8{
 9    Meldebescheinigung,
 10    Fuehrungszeugnis,
 11    Bauvoranfrage,
 12    Gewerbeanmeldung
 13}
 14
 15/// <summary>
 16/// Personenbezogene Ermaessigungsgruende. Wirken sich prozentual
 17/// auf die Grundgebuehr aus.
 18/// </summary>
 19public enum Ermaessigung
 20{
 21    Keine,
 22    Sozialleistungsbezug,
 23    Schwerbehinderung,
 24    Student
 25}
 26
 27/// <summary>
 28/// Berechnet Verwaltungsgebuehren fuer Amtshandlungen eines Buergerportals.
 29/// Bewusst testbar geschnitten: reine Funktionen, klar abgegrenzte Regeln,
 30/// definierte Fehlerfaelle.
 31/// </summary>
 32public class Gebuehrenrechner
 33{
 34    // Grundgebuehren in Euro gemaess Gebuehrenordnung (fiktiv).
 135    private static readonly Dictionary<Amtshandlung, decimal> Grundgebuehren = new()
 136    {
 137        [Amtshandlung.Meldebescheinigung] = 9.00m,
 138        [Amtshandlung.Fuehrungszeugnis]   = 13.00m,
 139        [Amtshandlung.Bauvoranfrage]      = 75.00m,
 140        [Amtshandlung.Gewerbeanmeldung]   = 26.00m
 141    };
 42
 43    /// <summary>
 44    /// Liefert die Grundgebuehr einer Amtshandlung ohne jede Ermaessigung.
 45    /// </summary>
 46    public decimal Grundgebuehr(Amtshandlung handlung)
 1247    {
 1248        if (!Grundgebuehren.TryGetValue(handlung, out var betrag))
 049        {
 050            throw new ArgumentOutOfRangeException(
 051                nameof(handlung),
 052                $"Keine Grundgebuehr fuer '{handlung}' hinterlegt.");
 53        }
 54
 1255        return betrag;
 1256    }
 57
 58    /// <summary>
 59    /// Prozentsatz der Ermaessigung. Ausgelagert, damit die Regel
 60    /// einzeln testbar ist.
 61    /// </summary>
 862    public decimal ErmaessigungsProzent(Ermaessigung ermaessigung) => ermaessigung switch
 863    {
 364        Ermaessigung.Keine                => 0.00m,
 265        Ermaessigung.Sozialleistungsbezug => 1.00m,   // vollstaendige Befreiung
 266        Ermaessigung.Schwerbehinderung    => 0.50m,
 167        Ermaessigung.Student              => 0.30m,
 068        _ => throw new ArgumentOutOfRangeException(nameof(ermaessigung))
 869    };
 70
 71    /// <summary>
 72    /// Berechnet die zu zahlende Gebuehr fuer eine Amtshandlung unter
 73    /// Beruecksichtigung einer Ermaessigung. Ergebnis wird kaufmaennisch
 74    /// auf zwei Nachkommastellen gerundet.
 75    /// </summary>
 76    /// <param name="handlung">Die beantragte Amtshandlung.</param>
 77    /// <param name="ermaessigung">Der Ermaessigungsgrund.</param>
 78    /// <param name="anzahl">Anzahl gleicher Amtshandlungen (Standard 1).</param>
 79    /// <exception cref="ArgumentException">Wenn anzahl kleiner als 1 ist.</exception>
 80    public decimal BerechneGebuehr(
 81        Amtshandlung handlung,
 82        Ermaessigung ermaessigung = Ermaessigung.Keine,
 83        int anzahl = 1)
 1084    {
 1085        if (anzahl < 1)
 386        {
 387            throw new ArgumentException(
 388                "Die Anzahl muss mindestens 1 betragen.", nameof(anzahl));
 89        }
 90
 791        var grund = Grundgebuehr(handlung) * anzahl;
 792        var prozent = ErmaessigungsProzent(ermaessigung);
 793        var betrag = grund * (1.00m - prozent);
 94
 795        return Math.Round(betrag, 2, MidpointRounding.ToEven);
 796    }
 97}