public async Task <UpdateResult <Job> > UpdateOrder(Job job, OrderModel orderModel, string mode) { if (job.Order.Type != orderModel.Type) { throw new InvalidOperationException("Updating with a different ordermodel for this job"); } // FIXME: Finding a resolver here would help here dude switch (orderModel.Type) { case OrderTypes.Delivery: case OrderTypes.ClassifiedDelivery: { var orderCalculationService = new DefaultOrderCalculationService(); var serviceChargeCalculationService = new DefaultDeliveryServiceChargeCalculationService(); var orderProcessor = new DeliveryOrderProcessor( orderCalculationService, serviceChargeCalculationService); orderProcessor.ProcessOrder(orderModel); var jobUpdater = new DeliveryJobUpdater(job); jobUpdater.UpdateJob(orderModel, mode); job = jobUpdater.Job; break; } } var result = await UpdateJob(job); return(new UpdateResult <Job>(result.MatchedCount, result.ModifiedCount, job)); }
public void Test_CalculateNetTotal_Valid() { // Arrange List <ItemDetails> items = new List <ItemDetails>(); items.Add(new ItemDetails { Quantity = 5, Price = 10.0m }); items.Add(new ItemDetails { Quantity = 2, Price = 100.0m }); items.Add(new ItemDetails { Quantity = 10, Price = 15.0m }); var orderCalcSvc = new DefaultOrderCalculationService(); // Act var expected = 0.0m; foreach (var item in items) { expected += (item.Price * item.Quantity); } var actual = orderCalcSvc.CalculateNetTotal(items); // Assert Assert.AreEqual(expected, actual); }
public void Test_CalculateTotalToPay_Valid() { // Arrange List <ItemDetails> items = new List <ItemDetails>(); items.Add(new ItemDetails { Quantity = 5, Price = 10.0m, VAT = 15 }); items.Add(new ItemDetails { Quantity = 2, Price = 100.0m, VAT = 15 }); items.Add(new ItemDetails { Quantity = 10, Price = 15.0m, VAT = 15 }); var orderCalcSvc = new DefaultOrderCalculationService(); decimal serviceCharge = 100.0m; // Act var expected = 0.0m; foreach (var item in items) { var total = item.Quantity * item.Price; var totalPlusVat = total * (1 + item.VAT / 100); expected += totalPlusVat; } expected += serviceCharge; var actual = orderCalcSvc.CalculateTotalToPay(items, serviceCharge); // Assert Assert.AreEqual(expected, actual); }
public void Test_VerifyAndCalculateTotalVATAmount_Invalid() { // Arrange List <ItemDetails> items = new List <ItemDetails>(); items.Add(new ItemDetails { Quantity = 5, Price = 10.0m, VAT = 15 }); items.Add(new ItemDetails { Quantity = 2, Price = 100.0m, VAT = 15 }); items.Add(new ItemDetails { Quantity = 10, Price = 15.0m, VAT = 15 }); var orderCalcSvc = new DefaultOrderCalculationService(); var subTotal = 0.0m; var netTotal = 0.0m; // Act foreach (var item in items) { var total = item.Quantity * item.Price; var totalPlusVat = total * (1 + item.VAT / 100); subTotal += totalPlusVat; netTotal += total; } var expected = subTotal - netTotal; var submittedTotalVATAmount = 0.0m; // Assert Assert.Throws <OrderCalculationException>( () => orderCalcSvc.VerifyAndTotalVATAmount( items, 10.0m, submittedTotalVATAmount)); }
public void Test_VerifyAndCalculateTotalToPay_Invalid() { // Arrange List <ItemDetails> items = new List <ItemDetails>(); items.Add(new ItemDetails { Quantity = 5, Price = 10.0m, VAT = 15 }); items.Add(new ItemDetails { Quantity = 2, Price = 100.0m, VAT = 15 }); items.Add(new ItemDetails { Quantity = 10, Price = 15.0m, VAT = 15 }); var orderCalcSvc = new DefaultOrderCalculationService(); var expected = 0.0m; decimal serviceCharge = 0.0m; // Act foreach (var item in items) { var total = item.Quantity * item.Price; var totalPlusVat = total * (1 + item.VAT / 100); expected += totalPlusVat; } expected += serviceCharge; var submittedTotalToPay = 0.0m; // Assert Assert.Throws <OrderCalculationException>( () => orderCalcSvc.VerifyAndCalculateTotalToPay( items, serviceCharge, submittedTotalToPay)); }
public void Test_VerifyAndCalculateNetTotal_Invalid() { // Arrange List <ItemDetails> items = new List <ItemDetails>(); items.Add(new ItemDetails { Quantity = 5, Price = 10.0m }); items.Add(new ItemDetails { Quantity = 2, Price = 100.0m }); items.Add(new ItemDetails { Quantity = 10, Price = 15.0m }); var orderCalcSvc = new DefaultOrderCalculationService(); var expected = 0.0m; // Act foreach (var item in items) { expected += (item.Price * item.Quantity); } var submittedNetTotal = 0.0m; // Assert Assert.Throws <OrderCalculationException>( () => orderCalcSvc.VerifyAndCalculateNetTotal(items, submittedNetTotal)); }
public void Test_VerifyAndCalculateSubtotal_Valid() { // Arrange List <ItemDetails> items = new List <ItemDetails>(); items.Add(new ItemDetails { Quantity = 5, Price = 10.0m, VAT = 15 }); items.Add(new ItemDetails { Quantity = 2, Price = 100.0m, VAT = 15 }); items.Add(new ItemDetails { Quantity = 10, Price = 15.0m, VAT = 15 }); var orderCalcSvc = new DefaultOrderCalculationService(); var expected = 0.0m; // Act foreach (var item in items) { var total = item.Quantity * item.Price; var totalPlusVat = total * (1 + item.VAT / 100); expected += totalPlusVat; } var submittedSubTotal = expected; var actual = orderCalcSvc.VerifyAndCalculateSubtotal(items, submittedSubTotal); // Assert Assert.AreEqual(expected, actual); }
public void Test_CalculateTotaVATAmount_Valid() { // Arrange List <ItemDetails> items = new List <ItemDetails>(); items.Add(new ItemDetails { Quantity = 5, Price = 10.0m, VAT = 15 }); items.Add(new ItemDetails { Quantity = 2, Price = 100.0m, VAT = 15 }); items.Add(new ItemDetails { Quantity = 10, Price = 15.0m, VAT = 15 }); var orderCalcSvc = new DefaultOrderCalculationService(); var subTotal = 0.0m; var netTotal = 0.0m; // Act foreach (var item in items) { var total = item.Quantity * item.Price; var totalPlusVat = total * (1 + item.VAT / 100); subTotal += totalPlusVat; netTotal += total; } var expected = subTotal - netTotal; var actual = orderCalcSvc.CalculateTotalVATAmount(items, 10.0m); // Assert Assert.AreEqual(expected, actual); }
public void Test_ProcessOrder_Valid() { // Arrange var orderCalcSvc = new DefaultOrderCalculationService(); var serviceChargeCalcSvc = new DefaultDeliveryServiceChargeCalculationService(); var deliveryOrderProcessor = new DeliveryOrderProcessor( orderCalcSvc, serviceChargeCalcSvc); var deliveryOrder = new DeliveryOrder { UserId = "this.User", From = new DefaultAddress { Address = "My Home" }, To = new DefaultAddress { Address = "My Office" }, OrderCart = new OrderDetails { PackageList = new List <ItemDetails>() { new ItemDetails { Item = "Coffee", Quantity = 2, Price = 150.0m, VAT = 15.0m } } }, PaymentMethod = "CashOnDelivery", ReferenceInvoiceId = "SMPL-1NV01C31D" }; // Act deliveryOrderProcessor.ProcessOrder(deliveryOrder); var coffees = deliveryOrder.OrderCart.PackageList; var cart = deliveryOrder.OrderCart; var serviceCharge = serviceChargeCalcSvc.CalculateServiceCharge(coffees); var subTotal = orderCalcSvc.CalculateSubtotal(coffees); var totalToPay = orderCalcSvc.CalculateTotalToPay(coffees, serviceCharge); var totalVATAmount = orderCalcSvc.CalculateTotalVATAmount(coffees, serviceCharge); var totalWeight = 0; // Assert Assert.AreEqual(serviceCharge, cart.ServiceCharge); Assert.AreEqual(subTotal, cart.SubTotal); Assert.AreEqual(totalToPay, cart.TotalToPay); Assert.AreEqual(totalVATAmount, cart.TotalVATAmount); Assert.AreEqual(totalWeight, cart.TotalWeight); }
public async Task<ReplaceOneResult> UpdateOrder(Job job, OrderModel orderModel) { if (job.Order.Type != orderModel.Type) { throw new InvalidOperationException("Updating with a different ordermodel for this job"); } // FIXME: Finding a resolver here would help here dude switch (orderModel.Type) { case OrderTypes.Delivery: case OrderTypes.ClassifiedDelivery: { var orderCalculationService = new DefaultOrderCalculationService(); var serviceChargeCalculationService = new DefaultDeliveryServiceChargeCalculationService(); var orderProcessor = new DeliveryOrderProcessor( orderCalculationService, serviceChargeCalculationService); orderProcessor.ProcessOrder(orderModel); var jobUpdater = new DeliveryJobUpdater(job); jobUpdater.UpdateJob(orderModel); job = jobUpdater.Job; break; } } var result = await UpdateJob(job); return result; }