protected Guid GetUuid(string localId, string uuidString) { if (String.IsNullOrEmpty(localId)) { return Guid.Empty; } CorrelatedResSyncInfo[] results = _correlatedResSyncInfoStore.GetByLocalId(_resourceKindString, new string[]{localId}); if (results.Length > 0) return results[0].ResSyncInfo.Uuid; Guid result; if (string.IsNullOrEmpty(uuidString)) result = Guid.NewGuid(); else try { GuidConverter converter = new GuidConverter(); result = (Guid)converter.ConvertFromString(uuidString); if (Guid.Empty.Equals(result)) result = Guid.NewGuid(); } catch (Exception) { result = Guid.NewGuid(); } ResSyncInfo newResSyncInfo = new ResSyncInfo(result, _originApplication, 0, string.Empty, DateTime.Now); CorrelatedResSyncInfo newCorrelation = new CorrelatedResSyncInfo(localId, newResSyncInfo); _correlatedResSyncInfoStore.Put(_resourceKindString, newCorrelation); return result; }
protected string GetLocalId(string uuidString) { GuidConverter converter = new GuidConverter(); try { Guid uuid = (Guid)converter.ConvertFromString(uuidString); return GetLocalId(uuid); } catch (Exception) { return string.Empty; } }
private string GetTradingAccountLocalId(string uuidString) { GuidConverter converter = new GuidConverter(); try { Guid uuid = (Guid)converter.ConvertFromString(uuidString); return GetTradingAccountLocalId(uuid); } catch (Exception) { return ""; } }
private Guid StringToGuid(string guid) { try { GuidConverter converter = new GuidConverter(); Guid result = (Guid)converter.ConvertFromString(guid); return result; } catch { return Guid.Empty; } }
private string GetLocalId(string uuidString, SupportedResourceKinds resKind) { GuidConverter converter = new GuidConverter(); try { Guid uuid = (Guid)converter.ConvertFromString(uuidString); return GetLocalId(uuid, resKind); } catch (Exception) { return string.Empty; } }
public override SdataTransactionResult Update(PayloadBase payload, List<SyncFeedEntryLink> links) { SdataTransactionResult tmpTransactionResult; salesOrdertype salesorder = null; #region check input values if (!(payload is SalesOrderPayload)) { tmpTransactionResult = new SdataTransactionResult(); tmpTransactionResult.HttpMethod = "PUT"; tmpTransactionResult.ResourceKind = _resourceKind; tmpTransactionResult.HttpStatus = System.Net.HttpStatusCode.BadRequest; tmpTransactionResult.HttpMessage = ("salesorder payload missing"); return tmpTransactionResult; } salesorder = (payload as SalesOrderPayload).SalesOrdertype; if (salesorder == null) { tmpTransactionResult = new SdataTransactionResult(); tmpTransactionResult.HttpMethod = "PUT"; tmpTransactionResult.ResourceKind = _resourceKind; tmpTransactionResult.HttpStatus = System.Net.HttpStatusCode.BadRequest; tmpTransactionResult.HttpMessage = ("salesorder payload missing"); return tmpTransactionResult; } foreach (SyncFeedEntryLink link in links) { if (link.LinkRel != RelEnum.related.ToString()) continue; string localID = string.Empty; if (link.Href.StartsWith(_context.DatasetLink, StringComparison.InvariantCultureIgnoreCase)) if (link.Href.LastIndexOf("('") < link.Href.LastIndexOf("')")) localID = link.Href.Substring(link.Href.LastIndexOf("('") + 2, link.Href.LastIndexOf("')") - link.Href.LastIndexOf("('") - 2); SupportedResourceKinds reskind = ResourceKindHelpers.GetResourceKind(link.PayloadPath); if (localID == string.Empty) localID = GetLocalId(link.Uuid, reskind); payload.ForeignIds.Add(link.PayloadPath, localID); } if (payload == null) return null; string customerID; if (!payload.ForeignIds.TryGetValue("tradingAccount", out customerID)) { tmpTransactionResult = new SdataTransactionResult(); tmpTransactionResult.HttpMethod = "PUT"; tmpTransactionResult.ResourceKind = _resourceKind; tmpTransactionResult.HttpStatus = System.Net.HttpStatusCode.BadRequest; tmpTransactionResult.HttpMessage = ("Trading Acount Id missing"); return tmpTransactionResult; } if (!customerID.StartsWith(Sage.Integration.Northwind.Application.API.Constants.CustomerIdPrefix)) { tmpTransactionResult = new SdataTransactionResult(); tmpTransactionResult.HttpMethod = "PUT"; tmpTransactionResult.ResourceKind = _resourceKind; tmpTransactionResult.HttpStatus = System.Net.HttpStatusCode.BadRequest; tmpTransactionResult.HttpMessage = ("Salesorder submission is only supported by customers"); return tmpTransactionResult; } #endregion DataSets.OrderTableAdapters.OrdersTableAdapter tableAdapter = new OrdersTableAdapter(); DataSets.OrderTableAdapters.Order_DetailsTableAdapter detailsTableAdapter=new Order_DetailsTableAdapter(); DataSets.Order order = new DataSets.Order(); int id; if (!(Int32.TryParse(payload.LocalID, out id))) id = 0; int recordCount; using (OleDbConnection connection = new OleDbConnection(_context.Config.ConnectionString)) { tableAdapter.Connection = connection; recordCount = tableAdapter.FillBy(order.Orders, id); if (recordCount == 0) return null; detailsTableAdapter.Connection = connection; detailsTableAdapter.FillBy(order.Order_Details, id); } DataSets.Order.OrdersRow row = (DataSets.Order.OrdersRow)order.Orders[0]; #region fill dataset from document try { if (!salesorder.dateSpecified) row.SetOrderDateNull(); else row.OrderDate = salesorder.date; if (!salesorder.dueDateSpecified) row.SetRequiredDateNull(); else row.RequiredDate = (DateTime)salesorder.dueDate; //if (orderDoc.shippedvia.IsNull) // newOrder.SetShipViaNull(); //else // newOrder.ShipVia = (int)orderDoc.shippedvia.Value; if (salesorder.postalAddresses == null || salesorder.postalAddresses.Length == 0) { row.SetShipAddressNull(); row.SetShipCityNull(); row.SetShipCountryNull(); row.SetShipPostalCodeNull(); } else { postalAddresstype postadress = salesorder.postalAddresses[0]; row.ShipAddress = postadress.address1; row.ShipCity = postadress.townCity; row.ShipPostalCode = postadress.zipPostCode; row.ShipCountry = postadress.country; } if (!salesorder.carrierTotalPriceSpecified) row.Freight = (decimal)0; else row.Freight = (decimal)salesorder.carrierTotalPrice; //row.CreateUser = _context.Config.CrmUser; row.ModifyUser = _context.Config.CrmUser; //row.CreateID = _context.Config.SequenceNumber; row.ModifyID = _context.Config.SequenceNumber; Dictionary<Guid, SyncFeedEntryLink> itemLinks = new Dictionary<Guid, SyncFeedEntryLink>(); GuidConverter converter = new GuidConverter(); Guid itemUuid; foreach (SyncFeedEntryLink link in links) { SupportedResourceKinds resKind = ResourceKindHelpers.GetResourceKind(link.PayloadPath); if (resKind != SupportedResourceKinds.salesOrderLines) continue; try { itemUuid = (Guid)converter.ConvertFromString(link.Uuid); if (!Guid.Empty.Equals(itemUuid)) itemLinks.Add(itemUuid, link); } catch (Exception) { } } List<DataSets.Order.Order_DetailsRow> rowsToDelete = new List<DataSets.Order.Order_DetailsRow>(); //foreach (DataSets.Order.Order_DetailsRow detailsRow in rowsToDelete) //{ // detailsRow.Delete(); //} foreach (DataSets.Order.Order_DetailsRow detailsRow in order.Order_Details) { string itemId = detailsRow.OrderID.ToString() + "-" + detailsRow.ProductID.ToString(); itemUuid = GetUuid(itemId, "", SupportedResourceKinds.salesOrderLines); SyncFeedEntryLink itemlink; if (itemLinks.TryGetValue(itemUuid, out itemlink)) { string lineNumberstring = itemlink.PayloadPath.Substring(itemlink.PayloadPath.IndexOf("[") + 1, itemlink.PayloadPath.IndexOf("]") - itemlink.PayloadPath.IndexOf("[") - 1); int lineNumber; if (Int32.TryParse(lineNumberstring, out lineNumber)) { if (lineNumber < salesorder.salesOrderLines.Length) { salesOrderLinetype soLine = salesorder.salesOrderLines[lineNumber]; detailsRow.ModifyUser = _context.Config.CrmUser; detailsRow.ModifyID = _context.Config.SequenceNumber; if (soLine.quantitySpecified) detailsRow.Quantity = Convert.ToInt16(soLine.quantity); else detailsRow.Quantity = 0; if (soLine.initialPriceSpecified) detailsRow.UnitPrice = (Decimal)soLine.initialPrice; else detailsRow.UnitPrice = 0; if ((!soLine.discountTotalSpecified) || (detailsRow.Quantity == 0) || (detailsRow.UnitPrice == 0)) { detailsRow.Discount = (float)0; } else { // discountPC = discountsum / qunatity * listprice //detailRow.Discount = Convert.ToSingle((decimal)lineItemDoc.discountsum.Value / ((decimal)detailRow.Quantity * detailRow.UnitPrice)); float discount = Convert.ToSingle((decimal)soLine.discountTotal / (detailsRow.UnitPrice)); if (discount > 1) discount = 0; detailsRow.Discount = discount; } } } itemLinks.Remove(itemUuid); } else { //delete item rowsToDelete.Add(detailsRow); } } foreach (SyncFeedEntryLink itemlink in itemLinks.Values) { { try { int productID; string productIdString; string productIdPayload = String.Format("{0}/{1}", itemlink.PayloadPath, "commodity"); if (payload.ForeignIds.TryGetValue(productIdPayload, out productIdString)) { try { productID = Convert.ToInt32(productIdString); } catch (Exception) { continue; } } else continue; string lineNumberstring = itemlink.PayloadPath.Substring(itemlink.PayloadPath.IndexOf("[") + 1, itemlink.PayloadPath.IndexOf("]") - itemlink.PayloadPath.IndexOf("[") - 1); int lineNumber; if (Int32.TryParse(lineNumberstring, out lineNumber)) { if (lineNumber < salesorder.salesOrderLines.Length) { salesOrderLinetype soLine = salesorder.salesOrderLines[lineNumber]; DataSets.Order.Order_DetailsRow detailRow = order.Order_Details.NewOrder_DetailsRow(); soLine.applicationID = payload.LocalID + "-" + productID.ToString(); detailRow.OrderID = Convert.ToInt32(payload.LocalID); detailRow.ProductID = productID; if (soLine.quantitySpecified) detailRow.Quantity = Convert.ToInt16(soLine.quantity); else detailRow.Quantity = 0; if (soLine.initialPriceSpecified) detailRow.UnitPrice = (Decimal)soLine.initialPrice; else detailRow.UnitPrice = 0; if ((!soLine.discountTotalSpecified) || (detailRow.Quantity == 0) || (detailRow.UnitPrice == 0)) { detailRow.Discount = (float)0; } else { // discountPC = discountsum / qunatity * listprice //detailRow.Discount = Convert.ToSingle((decimal)lineItemDoc.discountsum.Value / ((decimal)detailRow.Quantity * detailRow.UnitPrice)); float discount = Convert.ToSingle((decimal)soLine.discountTotal / (detailRow.UnitPrice)); if (discount > 1) discount = 0; detailRow.Discount = discount; } detailRow.CreateUser = _context.Config.CrmUser; detailRow.ModifyUser = _context.Config.CrmUser; detailRow.CreateID = _context.Config.SequenceNumber; detailRow.ModifyID = _context.Config.SequenceNumber; order.Order_Details.AddOrder_DetailsRow(detailRow); } } } // this error occours in case of invalid data types catch (Exception e) { tmpTransactionResult = new SdataTransactionResult(); tmpTransactionResult.HttpMethod = "POST"; tmpTransactionResult.ResourceKind = _resourceKind; tmpTransactionResult.HttpStatus = System.Net.HttpStatusCode.BadRequest; tmpTransactionResult.HttpMessage = e.Message; return tmpTransactionResult; } } } using (OleDbConnection connection = new OleDbConnection(_context.Config.ConnectionString)) { OleDbTransaction transaction = null; try { connection.Open(); transaction = connection.BeginTransaction(); tableAdapter.Connection = connection; detailsTableAdapter.Connection = connection; tableAdapter.SetTransaction(transaction); detailsTableAdapter.SetTransaction(transaction); foreach (DataSets.Order.Order_DetailsRow detailsRow in rowsToDelete) { detailsTableAdapter.Delete(detailsRow.OrderID, detailsRow.ProductID, detailsRow.UnitPrice, detailsRow.Quantity, detailsRow.Discount, detailsRow.CreateID, detailsRow.CreateUser, detailsRow.ModifyID, detailsRow.ModifyUser); } tableAdapter.Update(order.Orders); detailsTableAdapter.Update(order.Order_Details); transaction.Commit(); tmpTransactionResult = new SdataTransactionResult(); tmpTransactionResult.HttpMethod = "PUT"; tmpTransactionResult.ResourceKind = _resourceKind; tmpTransactionResult.HttpStatus = System.Net.HttpStatusCode.OK; tmpTransactionResult.LocalId = payload.LocalID; return tmpTransactionResult; } catch (Exception transactionException) { if (transaction != null) transaction.Rollback(); throw; } } } catch (Exception e) { tmpTransactionResult = new SdataTransactionResult(); tmpTransactionResult.HttpMethod = "PUT"; tmpTransactionResult.ResourceKind = _resourceKind; tmpTransactionResult.HttpStatus = System.Net.HttpStatusCode.BadRequest; tmpTransactionResult.HttpMessage = e.ToString(); return tmpTransactionResult; } #endregion }
public void ReadXml(System.Xml.XmlReader reader, Type payloadType) { GuidConverter guidConverter = new GuidConverter(); if ((reader.NodeType == System.Xml.XmlNodeType.Element) && (reader.LocalName == "entry") && (reader.NamespaceURI == Namespaces.atomNamespace)) { bool reading = true; while (reading) { if (reader.NodeType == System.Xml.XmlNodeType.Element) { switch (reader.LocalName) { case "title": reading = reader.Read(); if (reader.NodeType == System.Xml.XmlNodeType.Text) this.Title = reader.Value; break; case "id": reading = reader.Read(); if (reader.NodeType == System.Xml.XmlNodeType.Text) this.Id = reader.Value; break; case "uuid": reading = reader.Read(); if (reader.NodeType == System.Xml.XmlNodeType.Text) { string uuidString = reader.Value; this.Uuid = (Guid)guidConverter.ConvertFromString(uuidString); } break; case "httpStatus": reading = reader.Read(); if (reader.NodeType == System.Xml.XmlNodeType.Text) this.HttpStatusCode = (HttpStatusCode)Enum.Parse(typeof(HttpStatusCode), reader.Value); break; case "httpMessage": reading = reader.Read(); if (reader.NodeType == System.Xml.XmlNodeType.Text) this.HttpMessage = reader.Value; break; case "location": reading = reader.Read(); if (reader.NodeType == System.Xml.XmlNodeType.Text) this.HttpLocation = reader.Value; break; case "httpMethod": reading = reader.Read(); if (reader.NodeType == System.Xml.XmlNodeType.Text) this.HttpMethod = reader.Value; break; case "payload": System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(payloadType); object obj = serializer.Deserialize(reader); if (obj is PayloadBase) this.Payload = obj as PayloadBase; break; case "syncState": System.Xml.Serialization.XmlSerializer syncStateSerializer = new System.Xml.Serialization.XmlSerializer(typeof(SyncState)); object obj1 = syncStateSerializer.Deserialize(reader); if (obj1 is SyncState) this.SyncState = obj1 as SyncState; break; case "link": if (reader.HasAttributes) { SyncFeedEntryLink link = new SyncFeedEntryLink(); while (reader.MoveToNextAttribute()) { if (reader.LocalName.Equals("payloadpath", StringComparison.InvariantCultureIgnoreCase)) link.PayloadPath = reader.Value; if (reader.LocalName.Equals("rel", StringComparison.InvariantCultureIgnoreCase)) link.LinkRel = reader.Value; if (reader.LocalName.Equals("type", StringComparison.InvariantCultureIgnoreCase)) link.LinkType = reader.Value; if (reader.LocalName.Equals("title", StringComparison.InvariantCultureIgnoreCase)) link.Title = reader.Value; if (reader.LocalName.Equals("uuid", StringComparison.InvariantCultureIgnoreCase)) link.Uuid = reader.Value; if (reader.LocalName.Equals("href", StringComparison.InvariantCultureIgnoreCase)) link.Href = reader.Value; } this.SyncLinks.Add(link); } break; case "linked": System.Xml.Serialization.XmlSerializer linkedSerializer = new System.Xml.Serialization.XmlSerializer(typeof(LinkedElement)); object linkedObj = linkedSerializer.Deserialize(reader); if (linkedObj is LinkedElement) this.Linked = linkedObj as LinkedElement; break; default: reading = reader.Read(); break; } } else { if ((reader.NodeType == System.Xml.XmlNodeType.EndElement) && (reader.LocalName == "entry")) reading = false; else reading = reader.Read(); } } } }
internal static SdataTransactionResult GetSdataTransactionResult(List<TransactionResult> transactions, string endpoint, SupportedResourceKinds resource) { if (transactions == null) return null; if (transactions.Count == 0) return null; GuidConverter guidConverter = new GuidConverter(); SdataTransactionResult result; foreach (TransactionResult transaction in transactions) { if (transaction.Status != TransactionStatus.Success) { result = new SdataTransactionResult(); result.ResourceKind = resource; result.LocalId = transaction.ID; try { result.Uuid = (Guid)guidConverter.ConvertFromString(transaction.CRMID); } catch (Exception) { } result.HttpMessage = transaction.Message; result.Location = endpoint + "('" + transaction.ID + "')"; result.HttpStatus = Helper.GetHttpStatus(transaction.Status, transaction.Action); result.HttpMethod = Helper.GetHttpMethod(transaction.Action); return result; } } if (transactions.Count == 0) return null; result = new SdataTransactionResult(); result.ResourceKind = resource; result.LocalId = transactions[0].ID; try { result.Uuid = (Guid)guidConverter.ConvertFromString(transactions[0].CRMID); } catch (Exception) { } result.HttpMessage = transactions[0].Message; result.Location = endpoint + "('" + transactions[0].ID + "')"; result.HttpStatus = Helper.GetHttpStatus(transactions[0].Status, transactions[0].Action); result.HttpMethod = Helper.GetHttpMethod(transactions[0].Action); return result; }
private void PersistRelations(List<TransactionResult> transactions) { GuidConverter guidConverter = new GuidConverter(); foreach (TransactionResult transaction in transactions) { if (transaction.Status == TransactionStatus.Success) { SupportedResourceKinds resourceKind = GetSupportedResourceKind(transaction.EntityName); if (resourceKind == SupportedResourceKinds.None) continue; string uuidString = transaction.CRMID; Guid uuid = Guid.Empty; try { uuid = (Guid)guidConverter.ConvertFromString(uuidString); } catch { continue; } if (uuid == Guid.Empty) continue; string localId = transaction.ID; ResSyncInfo resSyncInfo = new ResSyncInfo(uuid, _context.DatasetLink + resourceKind.ToString(), -1, "", DateTime.Now); CorrelatedResSyncInfo correlatedResSyncInfo = new CorrelatedResSyncInfo(localId, resSyncInfo); // store the new correlation to the sync store _correlatedResSyncInfoStore.Put(resourceKind.ToString(), correlatedResSyncInfo); } } }