Exemplo n.º 1
0
        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}");
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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));
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 9
0
        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()));
            }
        }
Exemplo n.º 10
0
        public IEnumerable <Entity> RetrieveMultiple(QueryBase query)
        {
            var collection = _client.RetrieveMultiple(query);

            return(collection.Entities);
        }