public async Task <ShipEstimateResponseWithXp> EstimateShippingCostsAsync(OrderCalculatePayloadWithXp payload) { var shipments = ContainerizeLineItems(payload); var packages = shipments.Select(shipment => shipment.ShipPackage).ToList(); var shipMethodOptions = await _shippingCalculator.CalculateShippingRatesAsync(packages); var response = new ShipEstimateResponseWithXp() { ShipEstimates = shipments.Select((shipment, index) => { return(new ShipEstimateWithXp() { ShipMethods = shipMethodOptions[index].Select(sm => new ShipMethodWithXp() { ID = sm.ID, Name = sm.Name, Cost = sm.Cost, EstimatedTransitDays = sm.EstimatedTransitDays, xp = new ShipMethodXp() { Carrier = sm.Carrier } }).ToList(), ShipEstimateItems = shipment.ShipEstimateItems, xp = new ShipEstimateXp { ShipPackage = packages[index] } }); }).ToList() }; return(response); }
public async Task <OrderSubmitResponseWithXp> ProcessOrderPostSubmitAsync(OrderCalculatePayloadWithXp payload) { var processes = new PostSubmitProcesses(); // Will catch any errors so the later processes are still attempted. Error results are stored. await processes.Run("Send Order Confirmation Email", Task.FromResult("...")); await processes.Run("Create Final Tax Transaction", _taxCalculator.CommitTransactionAsync(MapOrderToTaxSummary(payload))); await processes.Run("Forward Order to ERP system", Task.FromResult("...")); var anyErrors = processes.AnyErrors; var partialOrder = new PartialOrder() { xp = new { NeedsAttention = anyErrors } }; await _oc.Orders.PatchAsync(OrderDirection.All, payload.OrderWorksheet.Order.ID, partialOrder); return(new OrderSubmitResponseWithXp() { HttpStatusCode = anyErrors ? 500 : 200, xp = new OrderSubmitResponseXp() { ProcessResults = processes.Results } }); }
private OrderSummaryForTax MapOrderToTaxSummary(OrderCalculatePayloadWithXp payload) { var taxDetails = new OrderSummaryForTax() { OrderID = payload.OrderWorksheet.Order.ID, CustomerCode = payload.OrderWorksheet.Order.FromUserID, PromotionDiscount = 0, LineItems = payload.OrderWorksheet.LineItems.Select(li => { return(new LineItemSummaryForTax() { LineItemID = li.ID, ProductID = li.ProductID, ProductName = li.Product.Name, Quantity = li.Quantity, UnitPrice = li.UnitPrice ?? 0, PromotionDiscount = li.PromotionDiscount, LineTotal = li.LineTotal, TaxCode = li.Product.xp.TaxCode, ShipFrom = li.ShipFromAddress, ShipTo = li.ShippingAddress }); }).ToList(), ShippingCosts = payload.OrderWorksheet.ShipEstimateResponse.ShipEstimates.Select(se => { var selectedMethod = se.GetSelectedShipMethod(); return(new ShipEstimateSummaryForTax() { ShipEstimateID = se.ID, Description = selectedMethod.Name, Cost = selectedMethod.Cost, }); }).ToList() }; return(taxDetails); }
public async Task <OrderCalculateResponseWithXp> RecalculatePricesAndTaxAsync(OrderCalculatePayloadWithXp payload) { var summary = MapOrderToTaxSummary(payload); var tax = await _taxCalculator.CalculateEstimateAsync(summary); var response = new OrderCalculateResponseWithXp() { TaxTotal = tax.TotalTax, xp = new OrderCalculateResponseXp { TaxDetails = tax } }; return(response); }
private List <ShippingPackageWithLineItems> ContainerizeLineItems(OrderCalculatePayloadWithXp payload) { return(null); }
[OrderCloudWebhookAuth] // Security feature to verifiy request came from Ordercloud. public async Task <OrderSubmitResponseWithXp> PostSubmitProcessingAsync([FromBody] OrderCalculatePayloadWithXp payload) => await _checkoutCommand.ProcessOrderPostSubmitAsync(payload);
[OrderCloudWebhookAuth] // Security feature to verifiy request came from Ordercloud. public async Task <OrderCalculateResponseWithXp> RecalculatePricesAndTaxAsync([FromBody] OrderCalculatePayloadWithXp payload) => await _checkoutCommand.RecalculatePricesAndTaxAsync(payload);
[OrderCloudWebhookAuth] // Security feature to verifiy request came from Ordercloud. public async Task <ShipEstimateResponseWithXp> EstimateShippingCostsAsync([FromBody] OrderCalculatePayloadWithXp payload) => await _checkoutCommand.EstimateShippingCostsAsync(payload);