public async Task <List <ZohoPurchaseOrder> > CreateOrUpdatePurchaseOrder(ZohoSalesOrder z_order, List <HSOrder> orders) { var results = new List <ZohoPurchaseOrder>(); foreach (var order in orders) { var delivery_address = z_order.shipping_address; //TODO: this is not good enough. Might even need to go back to SaleOrder and split out by delivery address var supplier = await _oc.Suppliers.GetAsync(order.ToCompanyID); // TODO: accomodate possibility of more than 100 line items var lineitems = await _oc.LineItems.ListAllAsync <HSLineItem>(OrderDirection.Outgoing, order.ID); // Step 1: Create contact (customer) in Zoho var contact = await CreateOrUpdateVendor(order); // Step 2: Create or update Items from LineItems/Products on Order var items = await CreateOrUpdatePurchaseLineItem(lineitems, supplier); // Step 3: Create purchase order var po = await CreatePurchaseOrder(z_order, order, items, lineitems, delivery_address, contact); results.Add(po); } return(results); }
public static ZohoPurchaseOrder Map(ZohoSalesOrder salesorder, Order order, List <ZohoLineItem> items, List <HSLineItem> lineitems, ZohoAddress delivery_address, ZohoContact vendor) { var po = new ZohoPurchaseOrder() { line_items = items.Select(p => new ZohoLineItem() { //account_id = p.purchase_account_id, item_id = p.item_id, description = p.description, rate = Math.Round(decimal.ToDouble(lineitems.First(l => l.SKU() == p.sku).UnitPrice.Value), 2), quantity = lineitems.First(l => l.SKU() == p.sku)?.Quantity }).ToList(), salesorder_id = salesorder.salesorder_id, purchaseorder_number = order.ID, reference_number = salesorder.reference_number, sub_total = decimal.ToDouble(order.Subtotal), tax_total = decimal.ToDouble(order.TaxCost), total = decimal.ToDouble(order.Total), vendor_id = vendor.contact_id, delivery_customer_id = salesorder.customer_id }; return(po); }
private async Task <ZohoPurchaseOrder> CreatePurchaseOrder(ZohoSalesOrder z_order, HSOrder order, List <ZohoLineItem> items, List <HSLineItem> lineitems, ZohoAddress delivery_address, ZohoContact contact) { var po = await _zoho.PurchaseOrders.ListAsync(new ZohoFilter() { Key = "purchaseorder_number", Value = order.ID }); if (po.Items.Any()) { return(await _zoho.PurchaseOrders.SaveAsync(ZohoPurchaseOrderMapper.Map(z_order, order, items, lineitems, delivery_address, contact, po.Items.FirstOrDefault()))); } return(await _zoho.PurchaseOrders.CreateAsync(ZohoPurchaseOrderMapper.Map(z_order, order, items, lineitems, delivery_address, contact))); }
public static ZohoSalesOrder Map(HSOrderWorksheet worksheet, List <ZohoLineItem> items, ZohoContact contact, IList <OrderPromotion> promotions) { var o = new ZohoSalesOrder() { reference_number = worksheet.Order.ID, salesorder_number = worksheet.Order.ID, date = worksheet.Order.DateSubmitted?.ToString("yyyy-MM-dd"), is_discount_before_tax = true, discount = decimal.ToDouble(promotions.Sum(p => p.Amount)), discount_type = "entity_level", line_items = worksheet.LineItems.Select(item => new ZohoLineItem { item_id = items.First(i => i.sku == item.SKU()).item_id, quantity = item.Quantity, rate = Math.Round((double)(item.UnitPrice ?? 0), 2), avatax_tax_code = item.Product.xp.Tax.Code //discount = decimal.ToDouble(promotions.Where(p => p.LineItemLevel == true && p.LineItemID == line_item.ID).Sum(p => p.Amount)), }).ToList(), tax_total = decimal.ToDouble(worksheet.Order.TaxCost), customer_name = contact.contact_name, sub_total = decimal.ToDouble(worksheet.Order.Subtotal), total = decimal.ToDouble(worksheet.Order.Total), customer_id = contact.contact_id, currency_code = contact.currency_code, currency_symbol = contact.currency_symbol, notes = promotions.Any() ? $"Promotions applied: {promotions.DistinctBy(p => p.Code).Select(p => p.Code).JoinString(" - ", p => p)}" : null //shipping_charge = decimal.ToDouble(order.ShippingCost), //TODO: Please mention any Shipping/miscellaneous charges as additional line items. }; // adding shipping as a line item foreach (var shipment in worksheet.ShipEstimateResponse.ShipEstimates) { var method = shipment.ShipMethods.FirstOrDefault(s => s.ID == shipment.SelectedShipMethodID); o.line_items.Add(new ZohoLineItem { item_id = items.First(i => i.sku == method?.ShippingSku()).item_id, quantity = 1, rate = Math.Round((double)(method?.Cost ?? 0), 2), avatax_tax_code = "FR" }); } return(o); }
public Task <ZohoSalesOrder> CreateAsync(ZohoSalesOrder salesOrder) => CreateAsync <ZohoSalesOrder>(salesOrder);
public Task <ZohoSalesOrder> SaveAsync(ZohoSalesOrder salesOrder) => SaveAsync <ZohoSalesOrder>(salesOrder);
public async Task <List <ZohoPurchaseOrder> > CreateShippingPurchaseOrder(ZohoSalesOrder z_order, HSOrderWorksheet order) { // special request by SMG for creating PO of shipments // we definitely don't want this stopping orders from flowing into Zoho so I'm going to handle exceptions and allow to proceed try { var list = new List <ZohoPurchaseOrder>(); foreach (var item in order.ShipEstimateResponse.ShipEstimates) { var shipping_method = item.ShipMethods.FirstOrDefault(s => s.ID == item.SelectedShipMethodID); if (shipping_method.xp.CarrierAccountID != "ca_8bdb711131894ab4b42abcd1645d988c") { continue; } var vendor = await _zoho.Contacts.ListAsync(new ZohoFilter() { Key = "contact_name", Value = "SMG Shipping" }); var oc_lineitems = new ListPage <HSLineItem>() { Items = new List <HSLineItem>() { new HSLineItem() { ID = $"{z_order.reference_number} - {ZohoExtensions.ShippingSuffix}", UnitPrice = shipping_method?.Cost, ProductID = shipping_method.ShippingSku(), SupplierID = "SMG Shipping", Product = new HSLineItemProduct() { Description = $"{shipping_method?.xp?.Carrier} Shipping Charge", Name = shipping_method.ShippingSku(), ID = shipping_method.ShippingSku(), QuantityMultiplier = 1, xp = new ProductXp() { Tax = new TaxProperties() { Code = "FR", Description = "Shipping Charge" } } } } } }; var z_item = await CreateOrUpdateShippingLineItem(oc_lineitems.Items); var oc_order = new Order() { ID = $"{order.Order.ID}-{order.LineItems.FirstOrDefault()?.SupplierID} - 41000", Subtotal = shipping_method.Cost, Total = shipping_method.Cost, TaxCost = 0M }; var oc_lineitem = new ListPage <HSLineItem>() { Items = new List <HSLineItem>() { new HSLineItem() { Quantity = 1 } } }; var z_po = ZohoPurchaseOrderMapper.Map(z_order, oc_order, z_item, oc_lineitem.Items.ToList(), null, vendor.Items.FirstOrDefault()); var shipping_po = await _zoho.PurchaseOrders.ListAsync(new ZohoFilter() { Key = "purchaseorder_number", Value = $"{order.Order.ID}-{order.LineItems.FirstOrDefault()?.SupplierID} - 41000" }); if (shipping_po.Items.Any()) { z_po.purchaseorder_id = shipping_po.Items.FirstOrDefault()?.purchaseorder_id; list.Add(await _zoho.PurchaseOrders.SaveAsync(z_po)); } else { list.Add(await _zoho.PurchaseOrders.CreateAsync(z_po)); } } return(list); } catch (Exception ex) { return(new List <ZohoPurchaseOrder>()); } }