diff --git a/Controllers/AtilFeeCalculationController.cs b/Controllers/AtilFeeCalculationController.cs index 6fc4043..d84ad22 100644 --- a/Controllers/AtilFeeCalculationController.cs +++ b/Controllers/AtilFeeCalculationController.cs @@ -41,7 +41,7 @@ public ActionResult CalculatAtilFee([FromQuery]IEnumerable CalculatAtilFeeBasis(string tiltakstype, string bygningstype, string areal) + public ActionResult CalculatAtilFeeBasis([FromQuery] IEnumerable tiltakstype, string bygningstype, string areal) { try diff --git a/Data/Repository.cs b/Data/Repository.cs index 7dd2d3e..cab82f3 100644 --- a/Data/Repository.cs +++ b/Data/Repository.cs @@ -42,32 +42,33 @@ public List GetTiltakstyper() private void PopulateTiltakstyper() { _tiltakstyper = new List(); - _tiltakstyper.Add(new Tiltakstype() { Kode = "berekonstruksjoner", Navn = "Endring av bygg - innvendig - Bærekonstruksjoner i bygg", Kategori = "5" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "brannskille", Navn = "Endring av bygg - innvendig - Brannskille i bygg", Kategori = "5" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "bruksendring", Navn = "Bruksendring", Kategori = "1, 2, 3" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "driftsbygningendringover1000m2", Navn = "Endring av driftsbygning i landbruket over 1000m2 (BRA)", Kategori = "5" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "driftsbygningendringunder1000m2", Navn = "Endring av driftsbygning i landbruket under 1000m2 (BRA)", Kategori = "5" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "driftsbygningtilbyggover1000m2", Navn = "Tilbygg til driftsbygning i landbruket med samlet area over 1000 m2 (BRA)", Kategori = "1, 2, 3" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "driftsbygningtilbyggunder1000m2", Navn = "Tilbygg til driftsbygning i landbruket med samlet area under 1000 m2 (BRA)", Kategori = "1, 2, 3" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "endringbyggannet", Navn = "Endring av bygg - Annet", Kategori = "5" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "endringdrift", Navn = "Vesentlig endring av tidligere drift", Kategori = "1, 2, 3" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "fasade", Navn = "Endring av bygg - utvendig - Fasade", Kategori = "5" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "fundamenter", Navn = "Endring av bygg - innvendig - Fundamenter i bygg", Kategori = "5" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "installasjonernyttanlegg", Navn = "Bygningstekniske installasjoner - Nytt anlegg", Kategori = "5" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "installasjonerreparasjon", Navn = "Bygningstekniske installasjoner - Reparasjon", Kategori = "5" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "installasjonibygg", Navn = "Bygningstekniske installasjoner - Endring - Teknisk installasjon i bygg", Kategori = "5" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "lydskille", Navn = "Endring av bygg - innvendig - Lydskille i bygg", Kategori = "5" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "nyttbyggdriftsbygningover1000m2", Navn = "Nytt bygg - Driftsbygning i landbruket med samlet areal over 1000 m2", Kategori = "1, 2, 3" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "nyttbyggdriftsbygningunder1000m2", Navn = "Nytt bygg - Driftsbygning i landbruk med samlet areal under 1000 m2", Kategori = "1, 2, 3" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "nyttbyggover70m2", Navn = "Nytt bygg - Over 70 m2 - ikke boligformål", Kategori = "1, 2, 3" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "nyttbyggunder70m2", Navn = "Nytt bygg - Under 70 m2 - ikke boligformål", Kategori = "1, 2, 3" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "pabygg", Navn = "Endring av bygg - utvendig - Påbygg", Kategori = "1, 2, 3" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "plasseringmidlertidig", Navn = "Plassering av midlertidige bygninger, konstruksjoner og anlegg", Kategori = "1, 2, 3" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "tilbyggover50m2", Navn = "Endring av bygg - utvendig - Tilbygg med samlet areal større enn 50 m2", Kategori = "1, 2, 3" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "tilbyggunder50m2", Navn = "Endring av bygg - utvendig - Tilbygg med samlet areal mindre enn 50 m2", Kategori = "1, 2, 3" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "underbygg", Navn = "Endring av bygg - utvendig - Underbygg", Kategori = "1, 2, 3" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "utvendigeinstallasjoner", Navn = "Bygningstekniske installasjoner - Endring - Utvendige tekniske installasjoner", Kategori = "5" }); - _tiltakstyper.Add(new Tiltakstype() { Kode = "vatrom", Navn = "Endring av bygg - innvendig - Våtrom i bygg", Kategori = "5" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = true, Kode = "berekonstruksjoner", Navn = "Endring av bygg - innvendig - Bærekonstruksjoner i bygg", Kategori = "5" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = true, Kode = "brannskille", Navn = "Endring av bygg - innvendig - Brannskille i bygg", Kategori = "5" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "bruksendring", Navn = "Bruksendring", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = true, Kode = "driftsbygningendringover1000m2", Navn = "Endring av driftsbygning i landbruket over 1000m2 (BRA)", Kategori = "5" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = true, Kode = "driftsbygningendringunder1000m2", Navn = "Endring av driftsbygning i landbruket under 1000m2 (BRA)", Kategori = "5" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "driftsbygningtilbyggover1000m2", Navn = "Tilbygg til driftsbygning i landbruket med samlet area over 1000 m2 (BRA)", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "driftsbygningtilbyggunder1000m2", Navn = "Tilbygg til driftsbygning i landbruket med samlet area under 1000 m2 (BRA)", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = true, Kode = "endringbyggannet", Navn = "Endring av bygg - Annet", Kategori = "5" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "endringdrift", Navn = "Vesentlig endring av tidligere drift", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = true, Kode = "fasade", Navn = "Endring av bygg - utvendig - Fasade", Kategori = "5" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = true, Kode = "fundamenter", Navn = "Endring av bygg - innvendig - Fundamenter i bygg", Kategori = "5" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "hovedombygging", Navn = "Endring av bygg - hovedombygging", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = true, Kode = "installasjonernyttanlegg", Navn = "Bygningstekniske installasjoner - Nytt anlegg", Kategori = "5" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = true, Kode = "installasjonerreparasjon", Navn = "Bygningstekniske installasjoner - Reparasjon", Kategori = "5" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = true, Kode = "installasjonibygg", Navn = "Bygningstekniske installasjoner - Endring - Teknisk installasjon i bygg", Kategori = "5" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = true, Kode = "lydskille", Navn = "Endring av bygg - innvendig - Lydskille i bygg", Kategori = "5" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "nyttbyggdriftsbygningover1000m2", Navn = "Nytt bygg - Driftsbygning i landbruket med samlet areal over 1000 m2", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "nyttbyggdriftsbygningunder1000m2", Navn = "Nytt bygg - Driftsbygning i landbruk med samlet areal under 1000 m2", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "nyttbyggover70m2", Navn = "Nytt bygg - Over 70 m2 - ikke boligformål", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "nyttbyggunder70m2", Navn = "Nytt bygg - Under 70 m2 - ikke boligformål", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "pabygg", Navn = "Endring av bygg - utvendig - Påbygg", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "plasseringmidlertidig", Navn = "Plassering av midlertidige bygninger, konstruksjoner og anlegg", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "tilbyggover50m2", Navn = "Endring av bygg - utvendig - Tilbygg med samlet areal større enn 50 m2", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "tilbyggunder50m2", Navn = "Endring av bygg - utvendig - Tilbygg med samlet areal mindre enn 50 m2", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = false, Kode = "underbygg", Navn = "Endring av bygg - utvendig - Underbygg", Kategori = "1, 2, 3" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = true, Kode = "utvendigeinstallasjoner", Navn = "Bygningstekniske installasjoner - Endring - Utvendige tekniske installasjoner", Kategori = "5" }); + _tiltakstyper.Add(new Tiltakstype() {TillaterZeroIAreal = true, Kode = "vatrom", Navn = "Endring av bygg - innvendig - Våtrom i bygg", Kategori = "5" }); } private void PopulateBygningstyper() @@ -202,7 +203,7 @@ private void PopulateKategorier() Category category_3; Category category_5; - List tiltakstyper_kat_1_3 = new List() { "nyttbyggover70m2", "nyttbyggunder70m2", "nyttbyggdriftsbygningover1000m2", "nyttbyggdriftsbygningunder1000m2", "tilbyggover50m2", "tilbyggunder50m2", "pabygg", "underbygg", "driftsbygningtilbyggover1000m2", "driftsbygningtilbyggunder1000m2", "bruksendring", "endringdrift", "plasseringmidlertidig" }; + List tiltakstyper_kat_1_3 = new List() { "hovedombygging", "nyttbyggover70m2", "nyttbyggunder70m2", "nyttbyggdriftsbygningover1000m2", "nyttbyggdriftsbygningunder1000m2", "tilbyggover50m2", "tilbyggunder50m2", "pabygg", "underbygg", "driftsbygningtilbyggover1000m2", "driftsbygningtilbyggunder1000m2", "bruksendring", "endringdrift", "plasseringmidlertidig" }; List tiltakstyper_kat_5 = new List() { "brannskille", "lydskille", "fundamenter", "berekonstruksjoner", "vatrom", "driftsbygningendringover1000m2", "driftsbygningendringunder1000m2", "fasade", "endringbyggannet", "installasjonernyttanlegg", "utvendigeinstallasjoner", "installasjonibygg", "installasjonerreparasjon" }; IEnumerable bygningstype_kat_1 = new List() { "223", "229", "233", "243", "245", "429", "431", "439", "523", "524", "529", "611", "654", "659", "825", "829", "830", "840" }; @@ -219,10 +220,10 @@ private void PopulateKategorier() CategoryAreas = new List() { new Area() { Lower = 0, Upper = 100, CategoryCode = "1", Price = 703 }, - new Area() { Lower = 100, Upper = 500, CategoryCode = "3", Price = 1407 }, - new Area() { Lower = 500, Upper = 1000, CategoryCode = "4", Price = 2110 }, - new Area() { Lower = 1000, Upper = 10000, CategoryCode = "5", Price = 2814 }, - new Area() { Lower = 10000, Upper = 100000000, CategoryCode = "6", Price = 3895 } + new Area() { Lower = 101, Upper = 500, CategoryCode = "3", Price = 1407 }, + new Area() { Lower = 501, Upper = 1000, CategoryCode = "4", Price = 2110 }, + new Area() { Lower = 1001, Upper = 10000, CategoryCode = "5", Price = 2814 }, + new Area() { Lower = 10001, Upper = 100000000, CategoryCode = "6", Price = 3895 } } }; @@ -234,10 +235,10 @@ private void PopulateKategorier() CategoryAreas = new List() { new Area() { Lower = 0, Upper = 100, CategoryCode = "7", Price = 2110 }, - new Area() { Lower = 100, Upper = 500, CategoryCode = "8", Price = 4221 }, - new Area() { Lower = 500, Upper = 1000, CategoryCode = "9", Price = 6331 }, - new Area() { Lower = 1000, Upper = 10000, CategoryCode = "10", Price = 8441 }, - new Area() { Lower = 10000, Upper = 100000000, CategoryCode = "11", Price = 11685 } + new Area() { Lower = 101, Upper = 500, CategoryCode = "8", Price = 4221 }, + new Area() { Lower = 501, Upper = 1000, CategoryCode = "9", Price = 6331 }, + new Area() { Lower = 1001, Upper = 10000, CategoryCode = "10", Price = 8441 }, + new Area() { Lower = 10001, Upper = 100000000, CategoryCode = "11", Price = 11685 } } }; @@ -249,10 +250,10 @@ private void PopulateKategorier() CategoryAreas = new List() { new Area() { Lower = 0, Upper = 100, CategoryCode = "12", Price = 4221 }, - new Area() { Lower = 100, Upper = 500, CategoryCode = "13", Price = 8441 }, - new Area() { Lower = 500, Upper = 1000, CategoryCode = "14", Price = 12662 }, - new Area() { Lower = 1000, Upper = 10000, CategoryCode = "15", Price = 16883 }, - new Area() { Lower = 10000, Upper = 100000000, CategoryCode = "16", Price = 23370 } + new Area() { Lower = 101, Upper = 500, CategoryCode = "13", Price = 8441 }, + new Area() { Lower = 501, Upper = 1000, CategoryCode = "14", Price = 12662 }, + new Area() { Lower = 1001, Upper = 10000, CategoryCode = "15", Price = 16883 }, + new Area() { Lower = 10001, Upper = 100000000, CategoryCode = "16", Price = 23370 } } }; diff --git a/Exceptions/IllegalTiltakstypeException.cs b/Exceptions/IllegalTiltakstypeException.cs new file mode 100644 index 0000000..31afa28 --- /dev/null +++ b/Exceptions/IllegalTiltakstypeException.cs @@ -0,0 +1,20 @@ +using System; + +namespace ATIL.FeeCalculator.Exceptions +{ + [Serializable] + public class IllegalTiltakstypeException : Exception + { + public IllegalTiltakstypeException() + { + } + + public IllegalTiltakstypeException(string message) : base(message) + { + } + + public IllegalTiltakstypeException(string message, Exception innerException) : base(message, innerException) + { + } + } +} \ No newline at end of file diff --git a/Models/Tiltakstype.cs b/Models/Tiltakstype.cs index efea83f..39b4cec 100644 --- a/Models/Tiltakstype.cs +++ b/Models/Tiltakstype.cs @@ -10,6 +10,7 @@ public class Tiltakstype public string Kode { get; set; } public string Navn { get; set; } public string Kategori { get; set; } + public bool TillaterZeroIAreal { get; set; } } } diff --git a/Services/AtilFeeCalculationService.cs b/Services/AtilFeeCalculationService.cs index 557ffa1..8224b77 100644 --- a/Services/AtilFeeCalculationService.cs +++ b/Services/AtilFeeCalculationService.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using ATIL.FeeCalculator.Data; +using ATIL.FeeCalculator.Exceptions; using ATIL.FeeCalculator.Models; namespace ATIL.FeeCalculator.Services @@ -32,19 +33,33 @@ public List GetGebyrKategoriBeskrivelser() public CalculationResult Calculate(IEnumerable tiltakstypekode, string bygningstypekode, string areal) { + bool illegalTiltakstype = false; int maxFee = 0; CalculationResult result = null; + foreach (var tiltakstype in tiltakstypekode) { - var calculation = Calculate(tiltakstype, bygningstypekode, areal); - if (calculation != null) + try { - if (calculation.Fee.FeeAmount > maxFee) + var calculation = Calculate(tiltakstype, bygningstypekode, areal); + if (calculation != null) { - maxFee = calculation.Fee.FeeAmount; - result = calculation; + if (calculation.Fee.FeeAmount > maxFee) + { + maxFee = calculation.Fee.FeeAmount; + result = calculation; + } } } + catch (IllegalTiltakstypeException) + { + illegalTiltakstype = true; + } + + } + if (result == null && illegalTiltakstype) + { + throw new ArgumentException($"Ingen gyldige koder for tiltakstype er angitt."); } return result; @@ -57,23 +72,28 @@ public CalculationResult Calculate(string tiltakstypekode, string bygningstypeko { if (Int32.TryParse(areal, out int arealTall)) { - if (arealTall <= 0) + if (arealTall < 0) { - throw new ArgumentException($"Areal må være et heltall større enn 0. '{areal}' er ikke gyldig."); + throw new ArgumentException($"Areal kan ikke være et negativt tall. '{areal}' er ikke gyldig."); } if (!_repository.GetTiltakstyper().Exists(x => x.Kode.Equals(tiltakstypekode))) { - throw new ArgumentException($"Angitt kode for tiltakstype ('{tiltakstypekode}') er ikke tillatt."); + throw new IllegalTiltakstypeException($"Angitt kode '{tiltakstypekode}' for tiltakstype er ikke tillatt."); + } + + if (arealTall == 0 && _repository.GetTiltakstyper().Any(tiltakstype => tiltakstype.Kode.Equals(tiltakstypekode) && !tiltakstype.TillaterZeroIAreal)) + { + throw new ArgumentException($"Areal må være et heltall større enn 0. '{areal}' er ikke gyldig."); } if (!_repository.GetBygningstyper().Exists(x => x.Kode.Equals(bygningstypekode))) { - throw new ArgumentException($"Angitt kode for bygningstype ('{bygningstypekode}') er ikke tillatt."); + throw new ArgumentException($"Angitt kode '{bygningstypekode}' for bygningstype er ikke tillatt."); } var foundCategory = _repository.GetKategorier().FirstOrDefault(x => x.Tiltakstype.Contains(tiltakstypekode) && x.Bygningstype.Contains(bygningstypekode)); - var foundArea = foundCategory.CategoryAreas.First(x => arealTall > x.Lower && arealTall <= x.Upper); + var foundArea = foundCategory.CategoryAreas.First(x => arealTall >= x.Lower && arealTall <= x.Upper); var res = new CalculationResult() { Area = areal, @@ -94,6 +114,6 @@ public CalculationResult Calculate(string tiltakstypekode, string bygningstypeko { throw; } - } + } } }