Example #1
0
 public ILogicEvaluationResult Evaluate(IProcessExecutionContext executionContext, ISerializedParameters parameters, Platform.ITransaction transaction)
 {
     throw new NotImplementedException();
 }
        public override ILogicEvaluationResult Evaluate(IProcessExecutionContext executionContext, ISerializedParameters parameters, Platform.ITransaction transaction)
        {
            try
            {
                _ = executionContext ?? throw new ArgumentNullException("executionContext");
                _ = parameters ?? throw new ArgumentNullException("parameters");
                _ = transaction ?? throw new ArgumentNullException("transaction");
                if (!(transaction is ITransaction))
                {
                    throw new ArgumentException("transaction does not represent a valid Process Transaction type.");
                }

                ValidateParameters(executionContext, parameters);

                var customer = (transaction as ITransaction).Customer ?? throw new Exception("Transaction is missing required Customer reference.");

                OrganizationRequest req = null;
                if (customer.RecordType == "contact")
                {
                    req = new OrganizationRequest(parameters["ContactActionName"]);
                }
                else
                {
                    req = new OrganizationRequest(parameters["AccountActionName"]);
                }

                if (req is null)
                {
                    throw new Exception("Unsupported customer type.");
                }

                req["Target"]      = new EntityReference(customer.RecordType, customer.Id);
                req["Transaction"] = transaction.ToEntityReference();

                //process any additional parameter data passed in from the configuration.
                if (parameters.Count > 1)
                {
                    foreach (var key in parameters.Keys)
                    {
                        if (key != "AccountActionName" && key != "ContactActionName" && !string.IsNullOrEmpty(parameters[key]))
                        {
                            req[key] = parameters[key];
                        }
                    }
                }

                var response = executionContext.DataService.ToOrgService().Execute(req);

                if (!response.Results.ContainsKey("IsTrue"))
                {
                    throw new Exception("Action did not return the required IsTrue output parameter.");
                }

                bool isTrue = (bool)response["IsTrue"];

                string message = null;
                // capture optional message if it exits
                if (response.Results.ContainsKey("Message") && response["Message"] is string)
                {
                    message = response["Message"] as string;
                }


                return(new LogicEvaluationResult(isTrue, message));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
        }
Example #3
0
 public ILogicEvaluationResult Evaluate(IProcessExecutionContext executionContext, Platform.ITransaction transaction)
 {
     return(Type.Evaluate(executionContext, Parameters, transaction));
 }
        public override ILogicEvaluationResult Evaluate(IProcessExecutionContext executionContext, ISerializedParameters parameters, Platform.ITransaction transaction)
        {
            executionContext.Trace("DataRecordQueryMatchEvaluator is Evaluating.");

            if (executionContext is null)
            {
                throw new ArgumentNullException("executionContext");
            }
            if (executionContext.Container is null)
            {
                throw new ArgumentException("executionContext must provide a Container.");
            }
            if (parameters is null)
            {
                throw new ArgumentNullException("parameters");
            }
            if (transaction is null)
            {
                throw new ArgumentNullException("transaction");
            }
            if (!(transaction is ITransaction))
            {
                throw new ArgumentException("transaction does not represent a valid Process Transaction.");
            }

            ValidateParameters(executionContext, parameters);


            var dataRecord = (transaction as ITransaction).DataRecord;


            var orgService = executionContext.DataService.ToOrgService();

            var fetchXml = parameters["FetchXml"];

            //convert the fetchxml to a query expression
            var req = new FetchXmlToQueryExpressionRequest
            {
                FetchXml = fetchXml
            };

            var resp = (FetchXmlToQueryExpressionResponse)orgService.Execute(req);
            var qry  = resp.Query;

            qry.NoLock = true;

            // Wrap the existing filter criteria with an AND clause where record id is equal to the current record. When
            // the query is run it will either return one record indicating that the current data record matches the filter
            // criteria or it will return zero record indicating that the current record does not match the filter criteria.
            var idFieldName = qry.EntityName + "id";

            FilterExpression wrapperFilter = new FilterExpression {
                FilterOperator = LogicalOperator.And,
                Conditions     =
                {
                    new ConditionExpression
                    {
                        AttributeName = idFieldName,
                        Operator      = ConditionOperator.Equal,
                        Values        = { dataRecord.Id }
                    }
                }
            };

            if (qry.Criteria != null)
            {
                wrapperFilter.Filters.Add(qry.Criteria);
            }

            qry.Criteria = wrapperFilter;

            // Execute the query to see if a record is returned or not
            var results = orgService.RetrieveMultiple(qry);

            executionContext.Trace("DataRecordQueryMatchEvaluator found {0} matching records", results.Entities.Count);

            if (results.Entities.Count == 1)
            {
                return(new LogicEvaluationResult(true, null));
            }

            return(new LogicEvaluationResult(false, null));
        }