using System.Collections.Generic;
public static void Main()
var orderItemString = "[ { \"reference\": \"0199999026\", \"name\": \"Tygprover Kokt ull 100% ull hel karta\", \"quantity\": 1, \"unit\": \"pcs\", \"unitPrice\": 1600, \"taxRate\": 2500, \"taxAmount\": 400, \"grossTotalAmount\": 2000, \"netTotalAmount\": 1600 }, { \"reference\": \"0105011025\", \"name\": \"Tunn vadmal 205/03 mellangrå\", \"quantity\": 2, \"unit\": \"pcs\", \"unitPrice\": 13200, \"taxRate\": 2500, \"taxAmount\": 6600, \"grossTotalAmount\": 33000, \"netTotalAmount\": 26400 }, { \"reference\": \"0100000860\", \"name\": \"Tunn vadmal 231/01 mörk olivgrön\", \"quantity\": 1, \"unit\": \"pcs\", \"unitPrice\": 13200, \"taxRate\": 2500, \"taxAmount\": 3300, \"grossTotalAmount\": 16500, \"netTotalAmount\": 13200 }, { \"reference\": \"0100000398\", \"name\": \"Tunn vadmal 273/02 lila\", \"quantity\": 0.8, \"unit\": \"pcs\", \"unitPrice\": 13200, \"taxRate\": 2500, \"taxAmount\": 2640, \"grossTotalAmount\": 13200, \"netTotalAmount\": 10560 }, { \"reference\": \"0100000374\", \"name\": \"Tunn vadmal 217/01 gråblå\", \"quantity\": 0.8, \"unit\": \"pcs\", \"unitPrice\": 13200, \"taxRate\": 2500, \"taxAmount\": 2640, \"grossTotalAmount\": 13200, \"netTotalAmount\": 10560 }, { \"reference\": \"*\", \"name\": \"Fraktavgift\", \"quantity\": 1, \"unit\": \"pcs\", \"unitPrice\": 4720, \"taxRate\": 2500, \"taxAmount\": 1180, \"grossTotalAmount\": 5900, \"netTotalAmount\": 4720 }]";
var paymentAmount = 83800;
var orderItems = JsonConvert.DeserializeObject<List<OrderItem>>(orderItemString);
Console.WriteLine("Number of order items : " + orderItems.Count());
Validate(paymentAmount, orderItems);
foreach (var orderItem in orderItems)
var vatPerUnit = Math.Round(orderItem.TaxAmount / orderItem.Quantity, 3);
Console.WriteLine("--------------------------------Order item - "+itemIndex+"---------------------------------------");
Console.WriteLine("Name: "+ orderItem.Name);
Console.WriteLine("Reference "+ orderItem.Reference);
Console.WriteLine("Net amount per unit: "+ orderItem.UnitPrice);
Console.WriteLine("Gorss amount per unit: "+ (orderItem.UnitPrice + vatPerUnit));
Console.WriteLine("Quantity: "+ orderItem.Quantity);
Console.WriteLine("Tax Rate: "+ orderItem.TaxRate);
Console.WriteLine("Tax amount: "+ vatPerUnit);
Console.WriteLine("===========================================================================");
Console.WriteLine("Total Net amount: "+ orderItems.Sum(x => x.NetTotalAmount));
Console.WriteLine("Total Gross amount: "+ orderItems.Sum(y => y.GrossTotalAmount));
Console.WriteLine("Order amount: "+ paymentAmount);
public string Name {get; set;}
public string Reference {get; set;}
public decimal UnitPrice {get; set;}
public decimal Quantity {get; set;}
public decimal TaxRate {get; set;}
public decimal TaxAmount {get; set;}
public decimal NetTotalAmount {get; set;}
public decimal GrossTotalAmount {get; set;}
private static void Validate(decimal paymentAmount,List<OrderItem> orderItems)
foreach(var orderItem in orderItems)
if(orderItem.TaxRate <=0 || orderItem.TaxAmount <=0)
Console.WriteLine("Tax details missing for item : " + itemIndex);
if(orderItem.NetTotalAmount != (orderItem.Quantity * orderItem.UnitPrice))
Console.WriteLine("Mismatch in NetTotalAmount calculation for item : " + itemIndex);
if(orderItem.GrossTotalAmount != orderItem.NetTotalAmount + orderItem.TaxAmount)
Console.WriteLine("Mismatch in NetTotalAmount calculation for item : " + itemIndex);
if ( orderItems.Sum(x => x.GrossTotalAmount) != paymentAmount)
Console.WriteLine("Mismatch in order total gross vs order amount.");