Skip to content

Instantly share code, notes, and snippets.

@rbirkby
Created November 16, 2011 12:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save rbirkby/1369973 to your computer and use it in GitHub Desktop.
Save rbirkby/1369973 to your computer and use it in GitHub Desktop.
A UK Vat Calculator written in an OO style
using System;
class Program {
static void Main() {
WriteAmount(new DateTime(2008, 11, 01), 1.00M);
WriteAmount(new DateTime(2009, 01, 01), 1.00M);
WriteAmount(new DateTime(2010, 12, 01), 1.00M);
WriteAmount(new DateTime(2011, 12, 01), 1.00M);
}
static void WriteAmount(DateTime date, decimal exVatAmount) {
VatCalculator calculator = VatCalculator.Create(date);
Console.WriteLine(string.Format("On {0:D}, for an amount of {1:c} the VAT inclusive figure is {2:c} for a rate of {3:p}", date, exVatAmount, calculator.CalculateAmount(exVatAmount), calculator.VatRate));
}
}
abstract class VatCalculator {
private static readonly VatCalculator _vatCalculator2008 = new VatCalculator2008();
private static readonly VatCalculator _vatCalculator2009 = new VatCalculator2009();
private static readonly VatCalculator _vatCalculator2010 = new VatCalculator2010();
private static readonly VatCalculator _vatCalculator2011 = new VatCalculator2011();
public static VatCalculator Create(DateTime date) {
if(date < new DateTime(2008, 12, 1)) {
return _vatCalculator2008;
} else if(date < new DateTime(2010, 1, 1)) {
return _vatCalculator2009;
} else if(date > new DateTime(2011, 1, 4)) {
return _vatCalculator2011;
} else {
return _vatCalculator2010;
}
}
public abstract decimal VatRate {get; }
public abstract decimal CalculateAmount(decimal exVatAmount);
private class VatCalculator2008 : VatCalculator {
public override decimal VatRate {get {return 0.175M;}}
public override decimal CalculateAmount(decimal exVatAmount) { return exVatAmount * 1.175M; }
}
private class VatCalculator2009 : VatCalculator {
public override decimal VatRate {get {return 0.15M;}}
public override decimal CalculateAmount(decimal exVatAmount) { return exVatAmount * 1.15M; }
}
private class VatCalculator2010 : VatCalculator {
public override decimal VatRate {get {return 0.175M;}}
public override decimal CalculateAmount(decimal exVatAmount) { return exVatAmount * 1.175M; }
}
private class VatCalculator2011 : VatCalculator {
public override decimal VatRate {get {return 0.2M;}}
public override decimal CalculateAmount(decimal exVatAmount) { return exVatAmount * 1.2M; }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment