public List <Field> GetDynamics365SetStateDataDestinationFields() { List <Field> fields = new List <Field>(); try { List <Dynamics365State> states = Dynamics365State.GetStates(Entity, Connection); if (states?.Count > 0) { // add state and status field from destination entity Dynamics365State state = states[0]; Dynamics365Status status = state.Statuses[0]; fields.AddRange(Entity.GetFields(Connection).Where(field => ((Dynamics365Field)field).LogicalName == state.LogicalName || ((Dynamics365Field)field).LogicalName == status.LogicalName)); } if (Entity.LogicalName == CASE_ENTITY_NAME) { Dynamics365Entity incidentResolution = Dynamics365Entity.Create(CASE_RESOLUTION_ENTITY_NAME, Connection); fields.AddRange(incidentResolution.GetFields(Connection).Where(field => ((Dynamics365Field)field).LogicalName == "subject" || ((Dynamics365Field)field).LogicalName == "description")); } else if (Entity.LogicalName == QUOTE_ENTITY_NAME) { Dynamics365Entity quoteClose = Dynamics365Entity.Create(CASE_RESOLUTION_ENTITY_NAME, Connection); fields.AddRange(quoteClose.GetFields(Connection).Where(field => ((Dynamics365Field)field).LogicalName == "subject" || ((Dynamics365Field)field).LogicalName == "description")); } else if (Entity.LogicalName == OPPORTUNITY_ENTITY_NAME) { Dynamics365Entity opportunityClose = Dynamics365Entity.Create(CASE_RESOLUTION_ENTITY_NAME, Connection); fields.AddRange(opportunityClose.GetFields(Connection).Where(field => ((Dynamics365Field)field).LogicalName == "subject" || ((Dynamics365Field)field).LogicalName == "description" || ((Dynamics365Field)field).LogicalName == "actualend" || ((Dynamics365Field)field).LogicalName == "actualrevenue")); } // todo - check this is correct. need to be able to support multiple values for 'first non-null value' logic //foreach (FieldValue value in values) //{ // // prevent fields from being selected more than once // fields.RemoveAll(field => field == value.DestinationField); //} } catch { } return(fields); }
public List <Dynamics365Entity> GetTargetEntities() { List <Dynamics365Entity> targetEntities = new List <Dynamics365Entity>(); try { // todo - this should only display on the form for fields that are lookups. it's not tied in any way to the dynamics365lookupvalue if (((Dynamics365Field)DestinationField).Targets != default(string[])) { foreach (string target in ((Dynamics365Field)DestinationField).Targets) { targetEntities.Add(Dynamics365Entity.Create(target, ((Dynamics365RecordOperation)Parent).Connection)); } } } catch { } return(targetEntities); }
/// <summary> /// Creates an empty DataTable for the specified fields. /// </summary> /// <param name="fields">The fields.</param> /// <returns>The data table.</returns> protected DataTable CreateEmptyDataTable(List <Dynamics365Field> fields) { DataTable dataTable = new DataTable(Name); foreach (Dynamics365Field field in fields) { EntityMetadata entityMetadata = Dynamics365Entity.Create(field.EntityLogicalName, (Dynamics365Connection)Parent).GetEntityMetadata((Dynamics365Connection)Parent); AttributeMetadata attributeMetadata = entityMetadata.Attributes.FirstOrDefault(findField => findField.LogicalName == field.LogicalName); if (attributeMetadata != default(AttributeMetadata)) { AddDataColumns(dataTable, field, attributeMetadata); } else { throw new ApplicationException(string.Format("The field {0} could not be found in {1}", field.LogicalName, entityMetadata.LogicalName)); } } return(dataTable); }
/// <summary> /// Gets a list of fields in an entity or link-entity node of a FetchXML query. /// </summary> /// <param name="entityNode">The entity node.</param> /// <returns>The fields.</returns> private List <Dynamics365Field> GetEntityNodeFields(XmlNode entityNode) { List <Dynamics365Field> fields = new List <Dynamics365Field>(); Dynamics365Entity entity = Dynamics365Entity.Create(entityNode.Attributes["name"].Value, (Dynamics365Connection)Parent); EntityMetadata entityMetadata = entity.GetEntityMetadata((Dynamics365Connection)Parent); foreach (XmlNode node in entityNode.ChildNodes) { if (node.Name.ToLower() == "attribute") { string attributeName = node.Attributes["name"].Value; AttributeMetadata attributeMetadata = entityMetadata.Attributes.FirstOrDefault(findField => findField.LogicalName == attributeName); if (attributeMetadata != default(AttributeMetadata)) { fields.Add(Dynamics365Field.CreateFromMetadata(attributeMetadata, (Dynamics365Connection)Parent)); } else { throw new ApplicationException(string.Format("The {0} field in {1} does not exist in Dynamics 365", attributeName, Name)); } } if (node.Name.ToLower() == "link-entity") { List <Dynamics365Field> linkedFields = GetEntityNodeFields(node); foreach (Dynamics365Field linkedField in linkedFields) { fields.Add(linkedField); } } } return(fields); }
protected override string GetRequestDescription(OrganizationRequest request) { Guid id = Guid.Empty; string state = mode == SetStateMode.Fixed ? State.Name : "<State>"; string status = mode == SetStateMode.Fixed ? Status.Name : "<Status>"; if (request is UpdateRequest updateRequest) { id = updateRequest.Target.Id; } else if (request is SetStateRequest setStateRequest) { id = setStateRequest.EntityMoniker.Id; } else if (request is CloseIncidentRequest closeIncidentRequest) { id = ((EntityReference)closeIncidentRequest.IncidentResolution[CASE_RESOLUTION_INCIDENT_ID]).Id; state = "Resolved"; EntityMetadata metadata = Dynamics365Entity.Create(CASE_ENTITY_NAME, Connection).GetEntityMetadata(Connection); StatusAttributeMetadata statusMetadata = ((StatusAttributeMetadata)metadata.Attributes.First(field => field.LogicalName == STATUSCODE_NAME)); status = statusMetadata.OptionSet.Options.First(option => option.Value == closeIncidentRequest.Status.Value).Label.UserLocalizedLabel.Label; } else if (request is ReviseQuoteRequest reviseQuoteRequest) { id = reviseQuoteRequest.QuoteId; state = "Draft"; status = "In Progress"; } else if (request is WinQuoteRequest winQuoteRequest) { id = ((EntityReference)winQuoteRequest.QuoteClose[QUOTE_CLOSE_QUOTE_ID]).Id; state = "Won"; status = "Won"; } else if (request is CloseQuoteRequest closeQuoteRequest) { id = ((EntityReference)closeQuoteRequest.QuoteClose[QUOTE_CLOSE_QUOTE_ID]).Id; state = "Closed"; EntityMetadata metadata = Dynamics365Entity.Create(QUOTE_ENTITY_NAME, Connection).GetEntityMetadata(Connection); StatusAttributeMetadata statusMetadata = ((StatusAttributeMetadata)metadata.Attributes.First(field => field.LogicalName == STATUSCODE_NAME)); status = statusMetadata.OptionSet.Options.First(option => option.Value == closeQuoteRequest.Status.Value).Label.UserLocalizedLabel.Label; } else if (request is WinOpportunityRequest winOpportunityRequest) { id = ((EntityReference)winOpportunityRequest.OpportunityClose[OPPORTUNITY_CLOSE_OPPORTUNITY_ID]).Id; state = "Won"; EntityMetadata metadata = Dynamics365Entity.Create(OPPORTUNITY_ENTITY_NAME, Connection).GetEntityMetadata(Connection); StatusAttributeMetadata statusMetadata = ((StatusAttributeMetadata)metadata.Attributes.First(field => field.LogicalName == STATUSCODE_NAME)); status = statusMetadata.OptionSet.Options.First(option => option.Value == winOpportunityRequest.Status.Value).Label.UserLocalizedLabel.Label; } else if (request is LoseOpportunityRequest loseOpportunityRequest) { id = ((EntityReference)loseOpportunityRequest.OpportunityClose[OPPORTUNITY_CLOSE_OPPORTUNITY_ID]).Id; state = "Lost"; EntityMetadata metadata = Dynamics365Entity.Create(OPPORTUNITY_ENTITY_NAME, Connection).GetEntityMetadata(Connection); StatusAttributeMetadata statusMetadata = ((StatusAttributeMetadata)metadata.Attributes.First(field => field.LogicalName == STATUSCODE_NAME)); status = statusMetadata.OptionSet.Options.First(option => option.Value == loseOpportunityRequest.Status.Value).Label.UserLocalizedLabel.Label; } return(string.Format(Properties.Resources.Dynamics365SetStateOperationRequestDescription, Entity.DisplayName, id, state, status)); }
protected override List <OrganizationRequest> CreateOrganisationRequests(DataRow row, CancellationToken cancel, IProgress <ExecutionProgress> progress) { List <OrganizationRequest> requests = new List <OrganizationRequest>(); // todo - hard coded strings OptionSetValue stateValue = mode == SetStateMode.Fixed ? new OptionSetValue(State.Code) : (OptionSetValue)Values.First(fieldValue => ((Dynamics365Field)fieldValue.DestinationField).LogicalName == STATECODE_NAME).GetValue(row, cancel, progress); OptionSetValue statusValue = mode == SetStateMode.Fixed ? new OptionSetValue(Status.Code) : (OptionSetValue)Values.First(fieldValue => ((Dynamics365Field)fieldValue.DestinationField).LogicalName == STATUSCODE_NAME).GetValue(row, cancel, progress); if (Entity.LogicalName == CASE_ENTITY_NAME && stateValue.Value == StateCode.CaseResolved) { EntityMetadata metadata = Dynamics365Entity.Create(CASE_RESOLUTION_ENTITY_NAME, Connection).GetEntityMetadata(Connection); Entity incidentResolution = new Entity(metadata.LogicalName); incidentResolution[CASE_RESOLUTION_INCIDENT_ID] = GetTargetEntity(row, cancel, progress).ToEntityReference(); if (mode == SetStateMode.Variable) { PopulateEntityFromDataRow(incidentResolution, row, cancel, progress); } requests.Add(new CloseIncidentRequest() { IncidentResolution = incidentResolution, Status = statusValue }); } else if (Entity.LogicalName == QUOTE_ENTITY_NAME && stateValue.Value == StateCode.QuoteDraft) { requests.Add(new ReviseQuoteRequest() { QuoteId = GetTargetEntity(row, cancel, progress).Id, ColumnSet = new ColumnSet(true) }); } else if (Entity.LogicalName == QUOTE_ENTITY_NAME && stateValue.Value == StateCode.QuoteWon) { EntityMetadata metadata = Dynamics365Entity.Create(QUOTE_CLOSE_ENTITY_NAME, Connection).GetEntityMetadata(Connection); Entity quoteClose = new Entity(metadata.LogicalName); quoteClose[QUOTE_CLOSE_QUOTE_ID] = GetTargetEntity(row, cancel, progress).ToEntityReference(); if (mode == SetStateMode.Variable) { PopulateEntityFromDataRow(quoteClose, row, cancel, progress); } requests.Add(new WinQuoteRequest() { QuoteClose = quoteClose, Status = statusValue }); } else if (Entity.LogicalName == QUOTE_ENTITY_NAME && stateValue.Value == StateCode.QuoteClosed) { EntityMetadata metadata = Dynamics365Entity.Create(QUOTE_CLOSE_ENTITY_NAME, Connection).GetEntityMetadata(Connection); Entity quoteClose = new Entity(metadata.LogicalName); quoteClose[QUOTE_CLOSE_QUOTE_ID] = GetTargetEntity(row, cancel, progress).ToEntityReference(); if (mode == SetStateMode.Variable) { PopulateEntityFromDataRow(quoteClose, row, cancel, progress); } requests.Add(new CloseQuoteRequest() { QuoteClose = quoteClose, Status = statusValue }); } else if (Entity.LogicalName == OPPORTUNITY_ENTITY_NAME && stateValue.Value == StateCode.OpportunityWon) { EntityMetadata metadata = Dynamics365Entity.Create(OPPORTUNITY_CLOSE_ENTITY_NAME, Connection).GetEntityMetadata(Connection); Entity opportunityClose = new Entity(metadata.LogicalName); opportunityClose[OPPORTUNITY_CLOSE_OPPORTUNITY_ID] = GetTargetEntity(row, cancel, progress).ToEntityReference(); if (mode == SetStateMode.Variable) { PopulateEntityFromDataRow(opportunityClose, row, cancel, progress); } requests.Add(new WinOpportunityRequest() { OpportunityClose = opportunityClose, Status = statusValue }); } else if (Entity.LogicalName == OPPORTUNITY_ENTITY_NAME && State.Code == StateCode.OpportunityLost) { EntityMetadata metadata = Dynamics365Entity.Create(OPPORTUNITY_CLOSE_ENTITY_NAME, Connection).GetEntityMetadata(Connection); Entity opportunityClose = new Entity(metadata.LogicalName); opportunityClose[OPPORTUNITY_CLOSE_OPPORTUNITY_ID] = GetTargetEntity(row, cancel, progress).ToEntityReference(); if (mode == SetStateMode.Variable) { PopulateEntityFromDataRow(opportunityClose, row, cancel, progress); } requests.Add(new LoseOpportunityRequest() { OpportunityClose = opportunityClose, Status = statusValue }); } else if (Entity.LogicalName == PROCESS_ENTITY_NAME) { requests.Add(new SetStateRequest() { EntityMoniker = new EntityReference(Entity.LogicalName, GetTargetEntity(row, cancel, progress).Id), State = new OptionSetValue(stateValue.Value), Status = new OptionSetValue(statusValue.Value) }); } else { UpdateRequest request = new UpdateRequest() { Target = GetTargetEntity(row, cancel, progress) }; request.Target.Attributes[STATECODE_NAME] = stateValue; request.Target.Attributes[STATUSCODE_NAME] = statusValue; requests.Add(request); } return(requests); }
/// <summary> /// Appends rows to the specified data table from the specified EntityCollection. /// </summary> /// <param name="dataTable">The DataTable.</param> /// <param name="entities">The EntityCollection.</param> /// <param name="recordLimit">The record limit.</param> /// <returns>A DataTable with appended rows.</returns> protected DataTable AppendRows(DataTable dataTable, EntityCollection entities, int recordLimit) { Dictionary <string, EntityMetadata> metadata = new Dictionary <string, EntityMetadata>(); foreach (DataColumn column in dataTable.Columns) { string entityLogicalName = column.ColumnName.Substring(0, column.ColumnName.IndexOf(".")); if (!metadata.ContainsKey(entityLogicalName)) { metadata.Add(entityLogicalName, Dynamics365Entity.Create(entityLogicalName, (Dynamics365Connection)Parent).GetEntityMetadata((Dynamics365Connection)Parent)); } } for (int recordIndex = 0; recordIndex < entities.Entities.Count && dataTable.Rows.Count < recordLimit; recordIndex++) { Entity record = entities.Entities[recordIndex]; DataRow row = dataTable.NewRow(); foreach (KeyValuePair <string, object> attribute in record.Attributes) { string entityLogicalName = record.LogicalName; string attributeLogicalName = attribute.Key; object attributeValue = attribute.Value; if (attribute.Value is AliasedValue) { AliasedValue aliasedValue = (AliasedValue)attribute.Value; entityLogicalName = aliasedValue.EntityLogicalName; attributeLogicalName = aliasedValue.AttributeLogicalName; attributeValue = aliasedValue.Value; } string nativeColumnName = string.Format("{0}.{1}", entityLogicalName, attributeLogicalName); if (DataTypes == DataTypes.Native) { if (dataTable.Columns.Contains(nativeColumnName)) { row[nativeColumnName] = attributeValue; } } else if (DataTypes == DataTypes.Neutral) { AttributeMetadata attributeMetadata = metadata[entityLogicalName].Attributes.FirstOrDefault(findField => findField.LogicalName == attributeLogicalName); Dynamics365TypeConverter converter = new Dynamics365TypeConverter(attributeMetadata); if (converter.Dynamics365Type == typeof(EntityReference) || converter.Dynamics365Type == typeof(EntityCollection)) { if (LookupBehaviour == LookupBehaviour.Name || LookupBehaviour == LookupBehaviour.NameAndIdentifier || LookupBehaviour == LookupBehaviour.EntityAndNameAndIdentifier) { string nameColumn = string.Format("{0}.Name", nativeColumnName); if (dataTable.Columns.Contains(nameColumn)) { if (converter.Dynamics365Type == typeof(EntityReference)) { row[nameColumn] = ((EntityReference)attributeValue).Name; } else if (converter.Dynamics365Type == typeof(EntityCollection)) { string names = string.Empty; foreach (Entity entity in ((EntityCollection)attributeValue).Entities) { EntityReference party = (EntityReference)entity["partyid"]; names = names == string.Empty ? party.Name : string.Concat(names, PARTYLIST_DELIMITER, party.Name); } row[nameColumn] = names; } } } if (LookupBehaviour == LookupBehaviour.Identifier || LookupBehaviour == LookupBehaviour.NameAndIdentifier || LookupBehaviour == LookupBehaviour.EntityAndNameAndIdentifier) { string identifierColumn = string.Format("{0}.Identifier", nativeColumnName); if (dataTable.Columns.Contains(identifierColumn)) { if (converter.Dynamics365Type == typeof(EntityReference)) { row[identifierColumn] = ((EntityReference)attributeValue).Id.ToString(); } else if (converter.Dynamics365Type == typeof(EntityCollection)) { string identifiers = string.Empty; foreach (Entity entity in ((EntityCollection)attributeValue).Entities) { EntityReference party = (EntityReference)entity["partyid"]; identifiers = identifiers == string.Empty ? party.Id.ToString() : string.Concat(identifiers, PARTYLIST_DELIMITER, party.Id.ToString()); } row[identifierColumn] = identifiers; } } } if (LookupBehaviour == LookupBehaviour.Entity || LookupBehaviour == LookupBehaviour.EntityAndNameAndIdentifier) { string entityColumn = string.Format("{0}.Entity", nativeColumnName); if (dataTable.Columns.Contains(entityColumn)) { if (converter.Dynamics365Type == typeof(EntityReference)) { row[entityColumn] = ((EntityReference)attributeValue).LogicalName; } else if (converter.Dynamics365Type == typeof(EntityCollection)) { string logicalNames = string.Empty; foreach (Entity entity in ((EntityCollection)attributeValue).Entities) { EntityReference party = (EntityReference)entity["partyid"]; logicalNames = logicalNames == string.Empty ? party.LogicalName : string.Concat(logicalNames, PARTYLIST_DELIMITER, party.LogicalName); } row[entityColumn] = logicalNames; } } } } else if (converter.Dynamics365Type == typeof(OptionSetValue)) { if (OptionSetBehaviour == OptionSetBehaviour.Name || OptionSetBehaviour == OptionSetBehaviour.NameAndCode) { string nameColumn = string.Format("{0}.Name", nativeColumnName); if (dataTable.Columns.Contains(nameColumn)) { EnumAttributeMetadata enumMetadata = (EnumAttributeMetadata)attributeMetadata; OptionMetadata optionMetadata = enumMetadata.OptionSet.Options.FirstOrDefault(option => option.Value == ((OptionSetValue)attributeValue).Value); if (optionMetadata != default(OptionMetadata)) { row[nameColumn] = optionMetadata.Label.UserLocalizedLabel.Label; } } } if (OptionSetBehaviour == OptionSetBehaviour.Code || OptionSetBehaviour == OptionSetBehaviour.NameAndCode) { string codeColumn = string.Format("{0}.Code", nativeColumnName); if (dataTable.Columns.Contains(codeColumn)) { row[codeColumn] = ((OptionSetValue)attributeValue).Value; } } } else if (converter.Dynamics365Type == typeof(OptionSetValueCollection)) { if (OptionSetBehaviour == OptionSetBehaviour.Name || OptionSetBehaviour == OptionSetBehaviour.NameAndCode) { string nameColumn = string.Format("{0}.Name", nativeColumnName); if (dataTable.Columns.Contains(nameColumn)) { List <string> labels = new List <string>(); EnumAttributeMetadata enumMetadata = (EnumAttributeMetadata)attributeMetadata; OptionSetValueCollection optionSetValues = (OptionSetValueCollection)attributeValue; foreach (OptionSetValue optionSetValue in optionSetValues) { OptionMetadata optionMetadata = enumMetadata.OptionSet.Options.FirstOrDefault(option => option.Value == optionSetValue.Value); if (optionMetadata != default(OptionMetadata)) { labels.Add(optionMetadata.Label.UserLocalizedLabel.Label); } } row[nameColumn] = string.Join(Dynamics365TypeConverter.MULTI_OPTION_SET_DELIMITER, labels.Select(label => label)); } } if (OptionSetBehaviour == OptionSetBehaviour.Code || OptionSetBehaviour == OptionSetBehaviour.NameAndCode) { string codeColumn = string.Format("{0}.Code", nativeColumnName); if (dataTable.Columns.Contains(codeColumn)) { OptionSetValueCollection optionSetValues = (OptionSetValueCollection)attributeValue; row[codeColumn] = string.Join(Dynamics365TypeConverter.MULTI_OPTION_SET_DELIMITER, optionSetValues.Select(optionSet => optionSet.Value.ToString())); } } } else { if (dataTable.Columns.Contains(nativeColumnName)) { row[nativeColumnName] = converter.ConvertFrom(null, null, attributeValue); } } } } dataTable.Rows.Add(row); } return(dataTable); }