Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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)));
        }
Beispiel #4
0
        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);
Beispiel #7
0
        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>());
            }
        }