Please review this code. It should calculate the tax precentage a person will pay in a progressive tax system. The goal is a perfect program.
Comments please.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class TaxLevel
{
private decimal _Money=-1;
/// <summary>
/// the money count that the tax applies to
/// </summary>
public decimal Money
{
get { return _Money; }
set { if (value > 0) { _Money = value; } else { throw new ArgumentOutOfRangeException("Money must be grater than 0"); } }
}
private decimal _TaxDeduction=-1;
/// <summary>
/// the tax level where 1.0 is 100% tax
/// </summary>
public decimal TaxDeduction
{
get { return _TaxDeduction; }
set { if (value > 0 && value < 1.0m) { _TaxDeduction = value; } else { throw new ArgumentOutOfRangeException("TaxDeduction must be between 0.0 and 1.0"); } }
}
}
class TaxCalculator
{
List<TaxLevel> _TaxLevels;
public bool DeterminateTaxLevels(){
_TaxLevels = new List<TaxLevel>();
_TaxLevels.Add(new TaxLevel {Money = 4770m, TaxDeduction = 0.10m });
_TaxLevels.Add(new TaxLevel { Money = 3700, TaxDeduction = 0.14m });
_TaxLevels.Add(new TaxLevel { Money = 4249m, TaxDeduction = 0.20m });
_TaxLevels.Add(new TaxLevel { Money = 5529m, TaxDeduction = 0.28m });
_TaxLevels.Add(new TaxLevel { Money = 21089m, TaxDeduction = 0.31m });
_TaxLevels.Add(new TaxLevel { Money = decimal.MaxValue, TaxDeduction = 0.42m });
return true;
}
/// <summary>
/// Gets Salley In Bruto Calculates Netto Sallery
/// </summary>
/// <param name="SalleryInNis">Employee Bruto Sallery</param>
/// <returns>Neto Sallery</returns>
public decimal CalculateNetto(decimal SalleryInNis)
{
if (SalleryInNis < 0) throw new ArgumentOutOfRangeException("SalleryInNis must be greater than 0");
if (_TaxLevels == null) throw new ArgumentNullException("DeterminateTaxLevels First");
decimal TmpSallery =SalleryInNis;
decimal Netto = 0.0m;
foreach (var taxlevel in _TaxLevels)
{
if (TmpSallery <= 0) break;
if (TmpSallery > taxlevel.Money)
{
Netto += taxlevel.Money * (1-taxlevel.TaxDeduction);
}
else {
Netto += TmpSallery * (1-taxlevel.TaxDeduction);
}
TmpSallery -= taxlevel.Money;
}
return Netto;
}
/// <summary>
/// Calculates Average Tax for employee
/// </summary>
/// <param name="SalleryInNis">Employee Bruto Sallery</param>
/// <returns>AverageTax</returns>
public decimal CalculateAverageTax(decimal SalleryInNis)
{
if (SalleryInNis < 0) throw new ArgumentOutOfRangeException("SalleryInNis must be greater than 0");
return 1- (CalculateNetto(SalleryInNis) / SalleryInNis);
}
}
class Program
{
static void Main(string[] args)
{
decimal Sal= 11712000;
TaxCalculator TaxCalculator = new TaxCalculator();
TaxCalculator.DeterminateTaxLevels();
Console.WriteLine("Brutto " + Sal);
Console.WriteLine("Netto " + TaxCalculator.CalculateNetto(Sal));
Console.WriteLine("Average Tax " + TaxCalculator.CalculateAverageTax(Sal));
Console.Read();
}
}
}