Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using JMA.Plugin.CRM.MSDynamics.DTO;
- using Microsoft.Xrm.Sdk;
- using Microsoft.Xrm.Sdk.Messages;
- using Xrm;
- namespace JMA.Plugin.CRM.MSDynamics
- {
- public class Orders
- {
- #region private variables
- XrmServiceContext _serviceContext;
- JMASettings _dynamicsCrmSettings;
- PriceLevel _PriceLevel;
- UoM _UoM;
- #endregion
- #region public properties
- public PriceLevel PriceLevel
- {
- get
- {
- if (_PriceLevel == null)
- {
- _PriceLevel = (from c in _serviceContext.PriceLevelSet
- //where c.Name == _dynamicsCrmSettings.MSDynamicsPriceLevel
- select c).FirstOrDefault();
- if (_PriceLevel == null)
- {
- _PriceLevel = new PriceLevel();
- _PriceLevel.Id = new Guid();
- _PriceLevel.Name = "Default";
- _serviceContext.AddObject(_PriceLevel);
- _serviceContext.SaveChanges();
- }
- return _PriceLevel;
- }
- return _PriceLevel;
- }
- set { _PriceLevel = value; }
- }
- public UoM Uom
- {
- get
- {
- //TO DO UOM
- //where c.Name == _dynamicsCrmSettings.MSDynamicsUom
- if (_UoM == null)
- {
- _UoM = (from c in _serviceContext.UoMSet
- select c).FirstOrDefault();
- }
- return _UoM;
- }
- set { _UoM = value; }
- }
- #endregion
- public Orders(XrmServiceContext serviceContext, JMASettings dynamicsCrmSettings)
- {
- _serviceContext = serviceContext;
- _dynamicsCrmSettings = dynamicsCrmSettings;
- }
- public string CreateOrder(JMAOrder order)
- {
- var salesOrder = (from c in _serviceContext.SalesOrderSet
- where c.Id == order.OrderGuid
- select c).FirstOrDefault();
- if (salesOrder == null)
- {
- Contact contact = (from a in _serviceContext.ContactSet
- where a.EMailAddress1 == order.BillingAddress.Email
- select a).FirstOrDefault();
- if (contact == null)
- {
- Contacts cots = new Contacts(_serviceContext, _dynamicsCrmSettings);
- contact = new Contact
- {
- FirstName = order.BillingAddress.FirstName,
- LastName = order.BillingAddress.LastName,
- Address1_Line1 = order.BillingAddress.Address1,
- Address1_City = order.BillingAddress.City,
- Address1_StateOrProvince = order.BillingAddress.RegionName,
- Address1_PostalCode = order.BillingAddress.PostalCode,
- Telephone1 = order.BillingAddress.PhoneNumber,
- EMailAddress1 = order.BillingAddress.Email
- };
- _serviceContext.AddObject(contact);
- _serviceContext.SaveChanges();
- }
- salesOrder = CreateSalesOrder(contact, order);
- foreach (var orderProductVariant in order.OrderDetails)
- {
- CreateProduct(orderProductVariant.Product);
- var salesOrderDetail = CreateSalesOrderDetail(salesOrder, orderProductVariant);
- }
- _serviceContext.SaveChanges();
- return "OK";
- }
- return String.Format("Sales Order {0} already exists in MS Dynamics.", order.Id);
- }
- private SalesOrder CreateSalesOrder(Contact contact, JMAOrder jo)
- {
- var salesOrder = new SalesOrder() { Id = jo.OrderGuid };
- salesOrder.CustomerId = contact.ToEntityReference();
- salesOrder.Name = jo.Id.ToString();
- salesOrder.OrderNumber = jo.Id.ToString();
- salesOrder.OverriddenCreatedOn = jo.CreationDate;
- salesOrder.PriceLevelId = PriceLevel.ToEntityReference();
- SetOrderFields(salesOrder, jo);
- if (!_serviceContext.IsAttached(contact)) _serviceContext.Attach(contact);
- _serviceContext.AddRelatedObject(contact, new Relationship("contactorders_association"), salesOrder);
- return salesOrder;
- }
- private void SetOrderFields(SalesOrder salesOrder, JMAOrder jo)
- {
- if (!String.IsNullOrEmpty(jo.ShippingMethod))
- {
- InsertOptionValueRequest request = new InsertOptionValueRequest();
- request.EntityLogicalName = "salesorder";
- request.AttributeLogicalName = "shippingmethodcode";
- request.Label = new Label(jo.ShippingMethod, 1036);
- request.Value = jo.ShippingMethodId;
- InsertOptionValueResponse response = (InsertOptionValueResponse)_serviceContext.Execute(request);
- //_log.Information(string.Format("ShippingMethod '{0}' has been added to list", jo.ShippingMethod));
- //Use the local cache
- //_ShippingMethods.Add(jo.ShippingMethod, shippingMethodId);
- salesOrder.ShippingMethodCode = jo.ShippingMethodId;
- }
- if (jo.BillingAddress != null)
- {
- salesOrder.BillTo_ContactName = jo.BillingAddress.FirstName + " " + jo.BillingAddress.LastName;
- salesOrder.BillTo_Line1 = jo.BillingAddress.Address1;
- salesOrder.BillTo_Line2 = jo.BillingAddress.Address2;
- salesOrder.BillTo_PostalCode = jo.BillingAddress.PostalCode;
- salesOrder.BillTo_City = jo.BillingAddress.City;
- salesOrder.BillTo_StateOrProvince = jo.BillingAddress.RegionName;
- salesOrder.BillTo_Country = jo.BillingAddress.CountryName;
- salesOrder.BillTo_Fax = jo.BillingAddress.FaxNumber;
- salesOrder.BillTo_Telephone = jo.BillingAddress.PhoneNumber;
- }
- if (jo.ShippingAddress != null)
- {
- //salesOrder.ShipTo_AddressTypeCode = new OptionSetValue(1);//Envoi
- salesOrder.ShipTo_Line1 = jo.ShippingAddress.FirstName + " " + jo.ShippingAddress.LastName;
- salesOrder.ShipTo_Line1 = jo.ShippingAddress.Address1;
- salesOrder.ShipTo_Line2 = jo.ShippingAddress.Address2;
- salesOrder.ShipTo_PostalCode = jo.ShippingAddress.PostalCode;
- salesOrder.ShipTo_City = jo.ShippingAddress.City;
- salesOrder.ShipTo_StateOrProvince = jo.ShippingAddress.RegionName;
- salesOrder.ShipTo_Country = jo.ShippingAddress.CountryName;
- salesOrder.ShipTo_Fax = jo.ShippingAddress.FaxNumber;
- salesOrder.ShipTo_Telephone = jo.ShippingAddress.PhoneNumber;
- }
- salesOrder.SubmitDate = jo.CreationDate;
- salesOrder.DiscountAmount = jo.DiscountInclTax;
- salesOrder.FreightAmount = jo.ShippingInclTax;
- //salesOrder.Attributes["new_shippingstatus"] = jo.ShippingStatus.ToString();
- //var a = jo.Shipments.LastOrDefault();
- //if (a != null)
- //{
- // salesOrder.Attributes["new_trackingnumber"] = a.TrackingNumber;
- // if (a.ShippedDateUtc.HasValue)
- // salesOrder.DateFulfilled = a.ShippedDateUtc.Value.ToLocalTime();
- //}
- //salesOrder.Attributes["new_paymentstatus"] = jo.PaymentStatus.ToString();
- //salesOrder.Attributes["new_paymentmethod"] = jo.PaymentMethodSystemName.Replace("Payments.", "");
- //if (jo.PaidDateUtc.HasValue)
- //{
- // salesOrder.Attributes["new_paiddate"] = jo.PaidDateUtc.Value.ToLocalTime();
- //}
- //salesOrder.Attributes["new_orderstatus"] = jo.OrderStatus.ToString();
- //salesOrder.Attributes["new_backofficeurl"] = string.Format("{0}Admin/Order/Edit/{1}", EngineContext.Current.Resolve<Nop.Core.Domain.StoreInformationSettings>().StoreUrl, jo.Id);
- }
- public void CreateProduct(JMAProduct jp)
- {
- Product p = (from a in _serviceContext.ProductSet
- where a.Id == jp.ProductGuid
- select a).FirstOrDefault();
- if (p == null)
- {
- p = new Product();
- p.Id = jp.ProductGuid;
- p.Price = jp.PurchaseCost;
- p.Name = jp.Name;
- p.ProductNumber = jp.Sku;
- p.QuantityDecimal = 4;
- p.DefaultUoMScheduleId =
- new Microsoft.Xrm.Client.CrmEntityReference(_serviceContext.UoMScheduleSet.FirstOrDefault().LogicalName, _serviceContext.UoMScheduleSet.FirstOrDefault().Id);
- p.DefaultUoMId =
- new Microsoft.Xrm.Client.CrmEntityReference(_serviceContext.UoMSet.FirstOrDefault().LogicalName, _serviceContext.UoMSet.FirstOrDefault().Id);
- _serviceContext.AddObject(p);
- _serviceContext.SaveChanges();
- }
- }
- private SalesOrderDetail CreateSalesOrderDetail(SalesOrder salesOrder, JMAOrderDetail od)
- {
- var salesOrderDetail = new SalesOrderDetail();
- salesOrderDetail.SalesOrderId = salesOrder.ToEntityReference();
- //if (od.Sku == null)
- // throw new ApplicationException(string.Format("Product SKU is empty on ProductVariantId {0}, please fill it", od.Id));
- //if (!Products.TryGetValue(joProductVariant.ProductVariant.Sku, out productId))
- // throw new ApplicationException(string.Format("Product SKU {0} have not equivalent in CRM, please add it", joProductVariant.ProductVariant.Sku));
- salesOrderDetail.ProductId = new EntityReference("product", od.Product.ProductGuid);
- salesOrderDetail.UoMId = Uom.ToEntityReference();
- salesOrderDetail.IsPriceOverridden = true;
- salesOrderDetail.Quantity = od.Quantity;
- salesOrderDetail.PricePerUnit = Math.Round(od.PriceExclTax, 2);
- //The tax is not a unit tax!
- salesOrderDetail.Tax = Math.Round(od.PriceInclTax - od.PriceExclTax, 2);
- if (!_serviceContext.IsAttached(salesOrder)) _serviceContext.Attach(salesOrder);
- _serviceContext.AddRelatedObject(salesOrder, new Relationship("order_details"), salesOrderDetail);
- return salesOrderDetail;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement