public static Customer CreateCustomerWithProduct(String testName) { var c = new Customer() { FirstName = "Bob", LastName = testName }; c.Save(); var o = new SalesOrder() { Customer = c }; o.Save(); var p = new Product() { Name = testName + " Product" }; p.Save(); var l = new LineItem() { Product = p, Quantity = 1, SalesOrder = o }; l.Save(); return(c); }
public static void UpdateItemQuantityOnSale(SalesOrder so) { //Validation of user entries if (so.Customer == null) { throw new UserFriendlyException("Choose a Customer to procceed"); } if (so.Status != SalesOrderStatus.InProgress) { throw new UserFriendlyException("You cannot Finalize an order that is not in progress"); } if (so.SalesOProducts.Count == 0) { throw new UserFriendlyException("You invoice must include items"); } if (so.SalesOProducts.Any(x => x.Item == null || x.Quantity <= 0 || x.UnitPrice <= 0)) { throw new UserFriendlyException("Kindly review your items"); } //Validate Stock quantities if (so.SalesOProducts.Any(x => x.Quantity > x.Item.AvailableQuantity)) { SalesOProducts sop = so.SalesOProducts.FirstOrDefault(x => x.Quantity > x.Item.AvailableQuantity); throw new UserFriendlyException("Not enough quantity in stock of item:" + sop.Item.ItemName); } //decrease qty from stock for (int i = 0; i < so.SalesOProducts.Count; i++) { Item x = so.SalesOProducts[i].Item; x.AvailableQuantity -= so.SalesOProducts[i].Quantity; x.Save(); } //Update Sales Order status so.Status = SalesOrderStatus.Finalized; so.Save(); //ZEY ELLY FO2HA //for (int i =0; i < so.SalesOProducts.Count;i++) //{ // SalesOProducts obj = so.SalesOProducts[i]; // if (obj.Item == null) // throw new UserFriendlyException("Item not found"); // if (obj.Quantity <= 0) // throw new UserFriendlyException("Item:" + obj.Item.ItemName + " quantity is invalid"); // if (obj.UnitPrice <= 0) // throw new UserFriendlyException("Item:" + obj.Item.ItemName + " UNIT price is invalid"); //} }
public void LineItem_LazyLoadsOrder() { var o = new SalesOrder(); o.Save(); var line = new LineItem() { SalesOrder = o }; line.Save(); var test = LineItem.Get(line.LineItemId); Assert.AreEqual(o.SalesOrderId, line.SalesOrder.SalesOrderId); }
public bool UpdateOrders(DateTime?startDate, int orderLimit = 0) { Log("\nLoading Orders from Shopify"); object ordersJson = shop.GetOrders(startDate); //Log(ordersJson.ToString()); JObject ordersJ = JsonConvert.DeserializeObject <JObject>(ordersJson.ToString()); List <ShopifyOrder> orders = JsonConvert.DeserializeObject <List <ShopifyOrder> >(ordersJ["orders"].ToString()); Log(string.Format("{0} orders loaded.", orders.Count)); StatusUpdate(string.Format("Updating {0} orders.", orders.Count)); for (int i = 0; i < orders.Count; i++) { ShopifyOrder order = orders[i]; DataSet.OrderDataTable orderDT = orderTA.GetDataByOrderID(shop.ID, order.id); if ((orderDT.Count == 0)) // && (order.order_number == 1008) { int salesOrderType = 0; // Order Type - different values for pending and paid if (order.financial_status == "pending") { salesOrderType = shop.data.OrderTypePending; } else { salesOrderType = shop.data.OrderType; } SalesOrder sales = SalesOrder.CreateNew(visma._context, 0); // Create with type 0 and update it later in the code, otherwise we might get exception from VismaSDK sales.YourOrderNumber = order.name; sales.OrderDate = order.created_at; sales.OrderType = salesOrderType; // Terms of Payment int?termsOfPayment = shop.GetValueIDFromShopData(shop.termsOfPayment, order.gateway); if (termsOfPayment.HasValue) { sales.TermsOfPaymentId = termsOfPayment.Value; } // Delivery Method int?deliveryMethod = order.shipping_lines.Count() > 0 ? shop.GetValueIDFromShopData(shop.deliveryMethods, order.shipping_lines[0].code) : null; if (deliveryMethod.HasValue) { sales.DeliveryMethodId = deliveryMethod.Value; } //Log(string.Format(" {0} > {1}", order.gateway, termsOfPayment.ToString())); //Log(string.Format(" {0} > {1}", order.shipping_lines.Count() > 0 ? order.shipping_lines[0].code : "", deliveryMethod.ToString())); // Customer Customer orderCustomer = null; if (order.customer != null) { string customerTags = order.customer.tags; //Log(customerTags); if (!string.IsNullOrEmpty(customerTags)) { string customerTag = customerTags.Split(',').Where(x => x.Trim().StartsWith("+C")).FirstOrDefault(); customerTag = (!string.IsNullOrEmpty(customerTag)) ? customerTag.Replace("+C", "") : customerTag; int customerID = -1; if (int.TryParse(customerTag, out customerID)) { // Use existing customer from Visma orderCustomer = visma.GetCustomerByNumber(customerID); sales.CustomerNumber = customerID; } else { DataSet.CustomerDataTable customerDT = customerTA.GetDataByShopifyCustomerID(shop.ID, order.customer.id); if (customerDT.Count > 0) { customerID = customerDT[0].VismaCustomerNumber; orderCustomer = visma.GetCustomerByNumber(customerID); sales.CustomerNumber = customerID; Log(string.Format(" - Order customer [#{0}] already exists in Visma as Customer {1}", order.customer.id, orderCustomer.Number)); } } } if (orderCustomer == null) { // Create new customer in Visma orderCustomer = Customer.CreateNew(visma._context); string orderCustomerName = string.Format("{0} {1}", order.customer.first_name, order.customer.last_name); orderCustomer.Name1 = orderCustomerName; orderCustomer.SellerID = shop.data.Seller; orderCustomer.CustomerGroupID = shop.customerGroup; //orderCustomer.InvoiceEmail = order.customer.email; Contact orderContact = orderCustomer.Contacts.AddNew(); orderContact.Email = order.customer.email; // Default address long addressID = 0; if (order.customer.default_address != null) { ShopifyAddress address = order.customer.default_address; addressID = address.id.HasValue ? address.id.Value : 0; orderCustomer.StreetAddress = string.Format("{0} {1}", address.address1, address.address2).Trim(); orderCustomer.City = string.Format("{0} {1}", address.zip, address.city).Trim(); orderCustomer.Country = address.country_code; // If customer has a company name -> store it as the main visma Customer name if (!string.IsNullOrEmpty(address.company)) { orderContact.Name = orderCustomerName; orderCustomer.Name1 = address.company; } orderCustomer.PhoneNumber = address.phone; orderContact.Phone = address.phone; } // Save additional customer tags such as VAT number orderCustomer.Save(); sales.CustomerNumber = orderCustomer.Number; // Save new customer mapping to ShopifyVisma database customerTA.InsertCustomer(shop.ID, order.customer.id, orderCustomer.Number, addressID, 1); Log(string.Format(" - Order customer [#{0}] saved to Visma as Customer {1}", order.customer.id, orderCustomer.Number)); } } sales.TermsOfDeliveryId = shop.data.TermsOfDelivery; sales.SellerId = orderCustomer != null ? orderCustomer.SellerID : shop.data.Seller; // Order delivery date DateTime orderDeliveryDate = order.created_at.AddYears(1); sales.DeliveryDate = orderDeliveryDate; // Unifaun string locationIDText = order.GetNoteAttribute("Unifaun Location ID"); int locationID = 0; if (int.TryParse(locationIDText, out locationID)) { //sales.DriverId = locationID; //sales.OrdererNumber = locationID; } string locationName = order.GetNoteAttribute("Unifaun Location Name"); string locationStreetAddress = order.GetNoteAttribute("Unifaun Location Street"); string locationCity = order.GetNoteAttribute("Unifaun Location City"); string locationZIP = order.GetNoteAttribute("Unifaun Location ZIP"); //sales.OrdererNumber // Billing address if (order.billing_address != null) { ShopifyAddress address = order.billing_address; sales.CustomerName = sales.OrdererName; sales.CustomerStreetAddress = sales.OrdererStreetAddress; sales.CustomerCity = sales.OrdererCity; if (orderCustomer != null) { //sales.OrdererNumber = orderCustomer.Number; sales.CustomerNumber = orderCustomer.Number; } } // Shipping address if (order.shipping_address != null) { ShopifyAddress address = order.shipping_address; sales.DeliveryName = string.Format("{0} {1}", address.first_name, address.last_name).Trim(); sales.DeliveryStreetAddress = string.Format("{0} {1}", address.address1, address.address2).Trim(); sales.DeliveryCity = string.Format("{0} {1}", address.zip, address.city).Trim(); sales.OrdererName = string.Format("{0} {1}", address.first_name, address.last_name).Trim(); sales.OrdererStreetAddress = string.Format("{0} {1}", address.address1, address.address2).Trim(); sales.OrdererCity = string.Format("{0} {1}", address.zip, address.city).Trim(); if (locationID > 0) { sales.OrdererName = locationID.ToString(); sales.OrdererName2 = locationName; } // Unifaun shipping address if (!string.IsNullOrEmpty(locationStreetAddress) && !string.IsNullOrEmpty(locationCity)) { sales.OrdererStreetAddress = string.Format("{0}", locationStreetAddress); sales.OrdererCity = string.Format("{0} {1}", locationZIP, locationCity); } if (orderCustomer != null) { sales.DeliveryNumber = orderCustomer.Number; } } // Order items foreach (var lineItem in order.line_items) { SalesOrderRow salesRow = sales.SalesorderRows.AddNew(); salesRow.ArticleCode = lineItem.sku; salesRow.ArticleName = lineItem.title; salesRow.Amount = lineItem.quantity; salesRow.DeliveryStart = orderDeliveryDate; //salesRow.VatPercent = 0; if (lineItem.price.HasValue) { salesRow.UnitPrice = visma.ToPrice(lineItem.price.Value); } } // Shipping items foreach (var lineItem in order.shipping_lines) { SalesOrderRow salesRow = sales.SalesorderRows.AddNew(); salesRow.ArticleCode = "207"; salesRow.ArticleName = lineItem.title.Length <= 50 ? lineItem.title : lineItem.title.Substring(0, 50); salesRow.Amount = 1; // lineItem.quantity; salesRow.DeliveryStart = orderDeliveryDate; salesRow.VatPercent = shop.VatRate; if (lineItem.price.HasValue) { salesRow.UnitPrice = visma.ToPrice(lineItem.price.Value); } } // CoD payment method if (sales.TermsOfPaymentId == 20) // TODO: Move value to Shop table { SalesOrderRow salesRow = sales.SalesorderRows.AddNew(); salesRow.ArticleCode = "204"; salesRow.ArticleName = order.gateway.Length <= 50 ? order.gateway : order.gateway.Substring(0, 50); salesRow.Amount = 1; // lineItem.quantity; salesRow.DeliveryStart = orderDeliveryDate; salesRow.VatPercent = shop.VatRate; salesRow.UnitPrice = 5; // TODO: Move value to Shop table } if (orderCustomer == null) { } sales.Save(); Log(string.Format(" - Sales Order {0} created from order {1} ({2}). ", sales.Number, order.id, order.name)); orderTA.InsertOrder(shop.ID, order.id, sales.Number); } else { Log(string.Format(" - Order {0} ({1}) is already in Visma.", order.id, order.name)); } } return(true); }