public void CreateWorkOrderIfNecessary(Guid alertId) { // create account, case, work order type, price list, and work order Entity newAccount = new Entity("account"); string uniqueAccountName = Guid.NewGuid().ToString(); newAccount["name"] = uniqueAccountName; Guid createdAccountId = cdsServiceClient.Create(newAccount); entitiesToDelete.Add(new KeyValuePair <Guid, string>(createdAccountId, "account")); output.WriteLine($"Created Account with id {createdAccountId}"); Entity newCase = new Entity("incident"); newCase["title"] = uniqueFaultName; newCase["customerid"] = new EntityReference("account", createdAccountId); Guid createdCaseId = cdsServiceClient.Create(newCase); output.WriteLine($"Created Incident with id {createdCaseId}"); string uniqueWorkOrderTypeName = Guid.NewGuid().ToString(); Entity newWorkOrderType = new Entity("msdyn_workordertype"); newWorkOrderType["msdyn_name"] = uniqueWorkOrderTypeName; newWorkOrderType["msdyn_incidentrequired"] = false; newWorkOrderType["msdyn_taxable"] = false; Guid createdWorkOrderTypeId = cdsServiceClient.Create(newWorkOrderType); entitiesToDelete.Add(new KeyValuePair <Guid, string>(createdWorkOrderTypeId, "msdyn_workordertype")); output.WriteLine($"Created WorkOrderType with id {createdWorkOrderTypeId}"); QueryExpression usDollarQueryExpression = FindEntityWithPropertyValue("transactioncurrency", "isocurrencycode", "USD"); EntityCollection usDollarQueryExpressionResult = cdsServiceClient.RetrieveMultiple(usDollarQueryExpression); Guid currencyId = usDollarQueryExpressionResult.Entities[0].Id; string uniquePriceListName = Guid.NewGuid().ToString(); Entity newPriceList = new Entity("pricelevel"); newPriceList["name"] = uniquePriceListName; newPriceList["transactioncurrencyid"] = new EntityReference("transactioncurrency", currencyId); Guid createdPriceListId = cdsServiceClient.Create(newPriceList); entitiesToDelete.Add(new KeyValuePair <Guid, string>(createdPriceListId, "pricelevel")); output.WriteLine($"Created PriceLevel with id {createdPriceListId}"); Entity newWorkOrder = new Entity("msdyn_workorder"); newWorkOrder["msdyn_systemstatus"] = 690970000; newWorkOrder["msdyn_taxable"] = false; newWorkOrder["msdyn_workordersummary"] = uniqueFaultName; newWorkOrder["msdyn_serviceaccount"] = new EntityReference("account", createdAccountId); newWorkOrder["msdyn_pricelist"] = new EntityReference("pricelevel", createdPriceListId); newWorkOrder["msdyn_workordertype"] = new EntityReference("msdyn_workordertype", createdWorkOrderTypeId); newWorkOrder["msdyn_iotalert"] = new EntityReference(DynamicsEntities.IoTAlert, alertId); Guid createdWorkOrderId = cdsServiceClient.Create(newWorkOrder); output.WriteLine($"Created WorkOrder with id {createdWorkOrderId}"); }
public static async Task <IActionResult> RunAsync( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, [Queue("e-commerce-emails")] IAsyncCollector <CloudQueueMessage> messages, ILogger log) { log.LogInformation($"Webhook activated at {DateTime.Now}"); var watch = new Stopwatch(); watch.Start(); //getting connection string //https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/xrm-tooling/use-connection-strings-xrm-tooling-connect var connectionString = Environment.GetEnvironmentVariable("CDSConnString"); var svc = new CdsServiceClient(connectionString); var myCdsUserId = svc.GetMyCdsUserId(); var qe = new QueryExpression { EntityName = "account", ColumnSet = new ColumnSet() }; qe.ColumnSet.Columns.Add("name"); qe.LinkEntities.Add(new LinkEntity("account", "contact", "primarycontactid", "contactid", JoinOperator.Inner)); qe.LinkEntities[0].Columns.AddColumns("firstname", "lastname"); qe.LinkEntities[0].EntityAlias = "primarycontact"; var ec = svc.RetrieveMultiple(qe); string currentEmailContent = string.Empty; foreach (var act in ec.Entities) { var accountName = act["name"]?.ToString(); var firstName = act.GetAttributeValue <AliasedValue>("primarycontact.firstname")?.Value?.ToString(); var lastName = act.GetAttributeValue <AliasedValue>("primarycontact.lastname")?.Value?.ToString(); currentEmailContent += $"Account {accountName}: {firstName} {lastName}"; log.LogInformation(currentEmailContent); } await messages.AddAsync(new CloudQueueMessage(currentEmailContent)); watch.Stop(); var elapsedInfo = $"Report and execution from Dynamics lasted for {watch.ElapsedMilliseconds} ms ({watch.Elapsed.Seconds} s) for user @{myCdsUserId}"; log.LogInformation(elapsedInfo); return((ActionResult) new OkObjectResult(elapsedInfo)); }
public IEnumerable <Entity> Get() { var fetchxml = $@"<fetch version='1.0' output-format='xml-platform' mapping='logical'> <entity name='contact'> <all-attributes /> </entity> </fetch>"; var contactResponse = _cdsServiceClient.RetrieveMultiple(new FetchExpression(fetchxml)); return(contactResponse.Entities); }
private static EntityCollection GetValuesForDefinition(CdsServiceClient service, Guid definitionId) { var qeValues = new QueryExpression(); qeValues.EntityName = "environmentvariablevalue"; qeValues.ColumnSet = new ColumnSet(); qeValues.ColumnSet.Columns.Add("value"); qeValues.TopCount = 1; qeValues.Criteria.AddFilter(LogicalOperator.And); qeValues.Criteria.AddCondition("environmentvariabledefinitionid", ConditionOperator.Equal, definitionId); return(service.RetrieveMultiple(qeValues)); }
private static EntityCollection GetDefinitions(CdsServiceClient service, string variableName) { var qeDefinitions = new QueryExpression(); qeDefinitions.EntityName = "environmentvariabledefinition"; qeDefinitions.ColumnSet = new ColumnSet(); qeDefinitions.ColumnSet.Columns.Add("environmentvariabledefinitionid"); qeDefinitions.ColumnSet.Columns.Add("defaultvalue"); qeDefinitions.TopCount = 1; qeDefinitions.Criteria.AddFilter(LogicalOperator.And); qeDefinitions.Criteria.AddCondition("displayname", ConditionOperator.Equal, variableName); return(service.RetrieveMultiple(qeDefinitions)); }
static void Main(string[] args) { HorizontalRule("Getting data from CDS"); var connString = Environment.GetEnvironmentVariable("CDSConnString"); var svc = new CdsServiceClient(connString); var myCdsUserId = svc.GetMyCdsUserId(); AnsiConsole.WriteLine("My user ID is " + myCdsUserId); HorizontalRule("Getting back account with primary contacts"); var qe = new QueryExpression { EntityName = "account", ColumnSet = new ColumnSet() }; qe.ColumnSet.Columns.Add("name"); qe.LinkEntities.Add(new LinkEntity("account", "contact", "primarycontactid", "contactid", JoinOperator.Inner)); qe.LinkEntities[0].Columns.AddColumns("firstname", "lastname"); qe.LinkEntities[0].EntityAlias = "primarycontact"; var ec = svc.RetrieveMultiple(qe); AnsiConsole.WriteLine($"Retrieved {ec.Entities.Count} entities"); var projectRepresentation = new Table() .Border(TableBorder.Square) .BorderColor(Color.Red) .AddColumn(new TableColumn("Name")) .AddColumn(new TableColumn("First Name")) .AddColumn(new TableColumn("Last Name")); foreach (var act in ec.Entities) { var accountName = act["name"]?.ToString(); var firstName = act.GetAttributeValue <AliasedValue>("primarycontact.firstname")?.Value?.ToString(); var lastName = act.GetAttributeValue <AliasedValue>("primarycontact.lastname")?.Value?.ToString(); projectRepresentation.AddRow(accountName ?? "", firstName ?? "", lastName ?? ""); } AnsiConsole.Render(projectRepresentation); Console.WriteLine("Retrieved {0} entities", ec.Entities.Count); }
public static Entity RetrieveUserByName(CdsServiceClient service, string fullname, ColumnSet cs = null) { QueryExpression qe = new QueryExpression("systemuser"); qe.Criteria.AddCondition(new ConditionExpression("fullname", ConditionOperator.Equal, fullname)); qe.ColumnSet = new ColumnSet("systemuserid"); if (cs != null) { qe.ColumnSet = cs; } EntityCollection ec = service.RetrieveMultiple(qe); if (ec.Entities.Count == 1) { return(ec.Entities[0]); } return(null); }
public static Entity RetrieveUser(CdsServiceClient service, string azureObjectId, ColumnSet cs = null) { QueryExpression qe = new QueryExpression("systemuser"); qe.Criteria.AddCondition(new ConditionExpression("azureactivedirectoryobjectid", ConditionOperator.Equal, azureObjectId)); qe.ColumnSet = new ColumnSet("systemuserid"); if (cs != null) { qe.ColumnSet = cs; } EntityCollection ec = service.RetrieveMultiple(qe); if (ec.Entities.Count == 1) { return(ec.Entities[0]); } return(null); }
protected override async Task OnMessageActivityAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { try { var member = await TeamsInfo.GetMemberAsync(turnContext, turnContext.Activity.From.Id, cancellationToken); var username = member.UserPrincipalName; string message; Guid postId; string domainName; if (!String.IsNullOrEmpty(turnContext.Activity.Text)) { var connectionString = _config.GetConnectionString("Storage"); var storageAccount = CloudStorageAccount.Parse(connectionString); var tableClient = storageAccount.CreateCloudTableClient(); var table = tableClient.GetTableReference("users"); var user = (User)table.Execute(TableOperation.Retrieve <User>(username, "")).Result; if (user == null) { await turnContext.SendActivityAsync(MessageFactory.Text("Sorry, I couldn't find your user details. Please remove and re-add the D365 Posts Bot app in Teams and try again")); return; } if (user.LastPostId == null) { await turnContext.SendActivityAsync(MessageFactory.Text("Sorry, I couldn't find a message to reply to. Please use the Reply button on the post you want to reply to.")); return; } message = turnContext.Activity.Text; postId = user.LastPostId.Value; domainName = user.LastDomainName; } else { dynamic val = turnContext.Activity.Value; message = val.comment; postId = val.PostId; domainName = val.DomainName; } await turnContext.SendActivityAsync(new Activity { Type = ActivityTypes.Typing }); try { using (var org = new CdsServiceClient(new Uri("https://" + domainName), _config.GetValue <string>("MicrosoftAppId"), _config.GetValue <string>("MicrosoftAppPassword"), true, null)) { // Find the CDS user details var userQry = new QueryByAttribute("systemuser") { ColumnSet = new ColumnSet("systemuserid") }; userQry.AddAttributeValue("domainname", username); var users = org.RetrieveMultiple(userQry); if (users.Entities.Count == 0) { throw new ApplicationException("Could not find your user account in D365"); } org.CallerId = users.Entities[0].Id; var postComment = new Entity("postcomment") { ["postid"] = new EntityReference("post", postId), ["text"] = message }; org.Create(postComment); } await turnContext.SendActivityAsync(MessageFactory.Text("Your reply has been sent")); } catch (Exception ex) { await turnContext.SendActivityAsync(MessageFactory.Text("There was an error sending your reply back to D365: " + ex.Message)); } } catch (Exception ex) { await turnContext.SendActivityAsync(MessageFactory.Text(ex.ToString())); } }
public IEnumerable <Entity> RetrieveMultiple(QueryBase query) { var collection = _client.RetrieveMultiple(query); return(collection.Entities); }