protected override void Execute(CodeActivityContext executionContext)
        {
            #region "Load CRM Service from context"

            Common objCommon = new Common(executionContext);
            objCommon.tracingService.Trace("Load CRM Service from context --- OK");
            #endregion

            #region "Read Parameters"
            String _FieldName       = this.FieldName.Get(executionContext);
            String _ParentRecordURL = this.ParentRecordURL.Get(executionContext);
            if (_ParentRecordURL == null || _ParentRecordURL == "")
            {
                return;
            }
            string[] urlParts             = _ParentRecordURL.Split("?".ToArray());
            string[] urlParams            = urlParts[1].Split("&".ToCharArray());
            string   ParentObjectTypeCode = urlParams[0].Replace("etc=", "");
            string   ParentId             = urlParams[1].Replace("id=", "");
            objCommon.tracingService.Trace("ParentObjectTypeCode=" + ParentObjectTypeCode + "--ParentId=" + ParentId);
            #endregion


            #region "CalculateRollupField Execution"
            string ParentEntityName = objCommon.sGetEntityNameFromCode(ParentObjectTypeCode, objCommon.service);
            CalculateRollupFieldRequest calculateRollup = new CalculateRollupFieldRequest();
            calculateRollup.FieldName = _FieldName;
            calculateRollup.Target    = new EntityReference(ParentEntityName, new Guid(ParentId));
            CalculateRollupFieldResponse resp = (CalculateRollupFieldResponse)objCommon.service.Execute(calculateRollup);
            #endregion
        }
Esempio n. 2
0
        private CalculateRollupFieldResponse HandleCalculateRollupField(OrganizationRequest orgRequest, EntityReference userRef)
        {
            var request = MakeRequest <CalculateRollupFieldRequest>(orgRequest);
            var resp    = new CalculateRollupFieldResponse();

            resp.Results["Entity"] = dataMethods.CalculateRollUpField(request.Target, request.FieldName, userRef);
            return(resp);
        }
Esempio n. 3
0
 public static void CalculateRollup(IOrganizationService _service, string fieldName, EntityReference targetRef)
 {
     //  Execute the Request
     CalculateRollupFieldRequest req = new CalculateRollupFieldRequest()
     {
         FieldName = fieldName,
         Target    = targetRef
     };
     CalculateRollupFieldResponse resp = (CalculateRollupFieldResponse)_service.Execute(req);
 }
        public static void HandleConfigs(CrmServiceClient svc, string entityName, int TypeConfig, int TypeError)
        {
            List <Entity> configs = getQuery(svc,
                                             new[] { "np_rollupupdateconfigid", "np_fields_for_update" }, TypeConfig, entityName);

            foreach (var config in configs)
            {
                if (!config.Attributes.Contains("np_fields_for_update"))
                {
                    continue;
                }

                try
                {
                    QueryExpression query = new QueryExpression(entityName)
                    {
                        ColumnSet = new ColumnSet($"{entityName}id")
                    };
                    List <Entity> recordsOfEntity = getDataOfQuery(svc, query);
                    foreach (var record in recordsOfEntity)
                    {
                        foreach (string fieldName in config.Attributes["np_fields_for_update"].ToString().Split(','))
                        {
                            Console.WriteLine($"Try to update record with ID = {record.Id}");
                            try
                            {
                                CalculateRollupFieldRequest crfr = new CalculateRollupFieldRequest
                                {
                                    Target    = new EntityReference(entityName, record.Id),
                                    FieldName = fieldName
                                };
                                CalculateRollupFieldResponse
                                    response = (CalculateRollupFieldResponse)svc.Execute(crfr);
                            }
                            catch (Exception ex)
                            {
                                Entity err = new Entity("np_rollupupdateconfig");
                                err["np_recordtype"]        = new OptionSetValue(TypeError);
                                err["np_entitywithrollups"] = entityName;
                                err["np_recordid"]          = record.Id.ToString();
                                svc.Create(err);
                                Console.WriteLine($"Can`t update record with ID = {record.Id}.Error was created!");
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Erorr ocurred when tried to retrieve data from Entity with name {entityName}");
                    Console.WriteLine(ex.Message);
                }
            }
        }
        /// <summary>
        /// Execute
        /// </summary>
        /// <param name="serviceProvider"></param>
        public void Execute(IServiceProvider serviceProvider)
        {
            if (serviceProvider == null)
            {
                throw new ArgumentNullException("serviceProvider");
            }

            // Get execution context, tracing, and Org Service factory from the svc provider then use the factory to generate the Organization Service.
            IPluginExecutionContext     context        = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory ServiceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService        service        = ServiceFactory.CreateOrganizationService(null);
            ITracingService             tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            //create the service context
            OrganizationServiceContext serviceContext = new OrganizationServiceContext(service);

            //log
            tracingService.Trace("Start logging");
            tracingService.Trace("Context Message: " + context.MessageName.ToLower());

            try
            {
                var detailclaimid   = Guid.Empty;
                var isdeletecontext = false;
                if (context.MessageName.ToLower() == Constants.CONTEXT_CREATE || context.MessageName.ToLower() == Constants.CONTEXT_UPDATE)
                {
                    tracingService.Trace("In Update/Create Context");
                    if (context.PrimaryEntityName == Constants.FINDING_ENTITY_NAME)
                    {
                        if (context.PostEntityImages[Constants.POSTIMAGE_ALIAS_NAME] == null)
                        {
                            throw new InvalidPluginExecutionException("The plugin needs a post image registered with alias '" + Constants.POSTIMAGE_ALIAS_NAME + "'.");
                        }
                        detailclaimid = ((EntityReference)(context.PostEntityImages[Constants.POSTIMAGE_ALIAS_NAME][Constants.FINDING_DETAILCLAIMID_FIELD])).Id;
                    }
                    else if (context.PrimaryEntityName == Constants.RECOVERY_ENTITY_NAME)
                    {
                        if (context.PostEntityImages[Constants.POSTIMAGE_ALIAS_NAME] == null)
                        {
                            throw new InvalidPluginExecutionException("The plugin needs a post image registered with alias '" + Constants.POSTIMAGE_ALIAS_NAME + "'.");
                        }
                        detailclaimid = ((EntityReference)(context.PostEntityImages[Constants.POSTIMAGE_ALIAS_NAME][Constants.RECOVERY_DETAILCLAIM_FIELD])).Id;
                    }
                }
                else if (context.InputParameters["Target"] is EntityReference)
                {
                    tracingService.Trace("In Delete Context");
                    if (context.PreEntityImages[Constants.PREIMAGE_ALIAS_NAME] == null)
                    {
                        throw new InvalidPluginExecutionException("The plugin needs a pre image registered with alias '" + Constants.PREIMAGE_ALIAS_NAME + "'.");
                    }
                    if (context.PreEntityImages[Constants.PREIMAGE_ALIAS_NAME].Contains(Constants.FINDING_DETAILCLAIMID_FIELD))
                    {
                        detailclaimid = ((EntityReference)context.PreEntityImages[Constants.PREIMAGE_ALIAS_NAME][Constants.FINDING_DETAILCLAIMID_FIELD]).Id;
                    }
                    else if (context.PreEntityImages[Constants.PREIMAGE_ALIAS_NAME].Contains(Constants.RECOVERY_DETAILCLAIM_FIELD))
                    {
                        detailclaimid = ((EntityReference)context.PreEntityImages[Constants.PREIMAGE_ALIAS_NAME][Constants.RECOVERY_DETAILCLAIM_FIELD]).Id;
                    }
                    tracingService.Trace("Detailclaimid initialized");
                    isdeletecontext = true;
                }

                tracingService.Trace("DetailclaimId :" + detailclaimid.ToString());

                if (detailclaimid == Guid.Empty)
                {
                    tracingService.Trace("DetailClaimId cannot be initialized");
                    return;
                }

                #region detail claim totals
                //Manually calculate rollup fields on detail claim entity record
                //Request
                tracingService.Trace("Detail Claim - Calculate Rollup Fields");
                CalculateRollupFieldRequest findingtotalscorrectquantityrequest = new CalculateRollupFieldRequest {
                    Target = new EntityReference(Constants.DETAILCLAIM_ENTITY_NAME, detailclaimid), FieldName = Constants.DETAILCLAIM_TOTALCORRECTQUANTITY_FIELD
                };
                CalculateRollupFieldRequest findingtotalscorrectamountrequest = new CalculateRollupFieldRequest {
                    Target = new EntityReference(Constants.DETAILCLAIM_ENTITY_NAME, detailclaimid), FieldName = Constants.DETAILCLAIM_TOTALCORRECTAMOUNT_FIELD
                };
                CalculateRollupFieldRequest findinttotalsexceptionamountrequest = new CalculateRollupFieldRequest {
                    Target = new EntityReference(Constants.DETAILCLAIM_ENTITY_NAME, detailclaimid), FieldName = Constants.DETAILCLAIM_TOTALEXCEPTIONAMOUNT_FIELD
                };
                //Response
                CalculateRollupFieldResponse findingtotalscorrectquantityresponse = (CalculateRollupFieldResponse)service.Execute(findingtotalscorrectquantityrequest);
                CalculateRollupFieldResponse findingtotalscorrectamountresponse   = (CalculateRollupFieldResponse)service.Execute(findingtotalscorrectamountrequest);
                CalculateRollupFieldResponse findinttotalsexceptionamountresponse = (CalculateRollupFieldResponse)service.Execute(findinttotalsexceptionamountrequest);
                tracingService.Trace("Detail Claim - Calculation Complete");

                tracingService.Trace("Compute Recovery Amount");
                CrmHelper crmHelper = new CrmHelper();
                crmHelper.CalculateRecovery(serviceContext, service, tracingService, detailclaimid);
                #endregion

                #region header claim totals
                //Rollup totals to header claim entity
                var detailclaim = service.Retrieve(Constants.DETAILCLAIM_ENTITY_NAME, detailclaimid, new ColumnSet(Constants.DETAILCLAIM_SAKCLAIMID_FIELD));
                if (!detailclaim.Contains(Constants.DETAILCLAIM_SAKCLAIMID_FIELD))
                {
                    tracingService.Trace("Detail Claim - Id " + detailclaimid + " doesn't have associated header claim. Exiting code!");
                    return;
                }

                tracingService.Trace("Detail Claim - Header Claim Exists.");
                var claimid = ((EntityReference)detailclaim[Constants.DETAILCLAIM_SAKCLAIMID_FIELD]).Id;

                var findingtotalcorrectquantity = GetTotals(service, tracingService, Constants.DETAILCLAIM_ENTITY_NAME, Constants.DETAILCLAIM_TOTALCORRECTQUANTITY_FIELD, Constants.DETAILCLAIM_SAKCLAIMID_FIELD, claimid, isdeletecontext ? Constants.DETAILCLAIM_ID_FIELD : "", isdeletecontext ? detailclaimid.ToString() : "", false);
                var findingtotalcorrectamount   = GetTotals(service, tracingService, Constants.DETAILCLAIM_ENTITY_NAME, Constants.DETAILCLAIM_TOTALCORRECTAMOUNT_FIELD, Constants.DETAILCLAIM_SAKCLAIMID_FIELD, claimid, isdeletecontext ? Constants.DETAILCLAIM_ID_FIELD : "", isdeletecontext ? detailclaimid.ToString() : "");
                var findingtotalexceptionamount = GetTotals(service, tracingService, Constants.DETAILCLAIM_ENTITY_NAME, Constants.DETAILCLAIM_TOTALEXCEPTIONAMOUNT_FIELD, Constants.DETAILCLAIM_SAKCLAIMID_FIELD, claimid, isdeletecontext ? Constants.DETAILCLAIM_ID_FIELD : "", isdeletecontext ? detailclaimid.ToString() : "");

                var recoverytotalrecoveredamount          = GetTotals(service, tracingService, Constants.DETAILCLAIM_ENTITY_NAME, Constants.DETAILCLAIM_TOTALRECOVEREDAMOUNT_FIELD, Constants.DETAILCLAIM_SAKCLAIMID_FIELD, claimid);
                var recoverytotalremainingrecoveryamount  = GetTotals(service, tracingService, Constants.DETAILCLAIM_ENTITY_NAME, Constants.DETAILCLAIM_TOTALREMAININGRECOVERYAMOUNT_FIELD, Constants.DETAILCLAIM_SAKCLAIMID_FIELD, claimid);
                var recoverytotalidentifiedrecoveryamount = GetTotals(service, tracingService, Constants.DETAILCLAIM_ENTITY_NAME, Constants.DETAILCLAIM_TOTALIDENTIFIEDRECOVERYAMOUNT_FIELD, Constants.DETAILCLAIM_SAKCLAIMID_FIELD, claimid);


                tracingService.Trace("Totals Completed");
                //throw new InvalidPluginExecutionException("Debugging");
                var headerclaim = new Entity(Constants.CLAIM_ENTITY_NAME);
                headerclaim.Id = claimid;

                //findings
                headerclaim[Constants.CLAIM_TOTALCORRECTQUANTITY_FIELD] = findingtotalcorrectquantity;
                headerclaim[Constants.CLAIM_TOTALCORRECTAMOUNT_FIELD]   = new Money(findingtotalcorrectamount);
                headerclaim[Constants.CLAIM_TOTALEXCEPTIONAMOUNT_FIELD] = new Money(findingtotalexceptionamount);

                //recoveries
                headerclaim[Constants.CLAIM_TOTALRECOVEREDAMOUNT_FIELD]          = new Money(recoverytotalrecoveredamount);
                headerclaim[Constants.CLAIM_TOTALREMAININGRECOVERYAMOUNT_FIELD]  = new Money(recoverytotalremainingrecoveryamount);
                headerclaim[Constants.CLAIM_TOTALIDENTIFIEDRECOVERYAMOUNT_FIELD] = new Money(recoverytotalidentifiedrecoveryamount);

                service.Update(headerclaim);
                tracingService.Trace("Claim - Header claim totals updated.");
                #endregion

                #region case provider
                var caseproviderid = Guid.Empty;
                var claim          = service.Retrieve(Constants.CLAIM_ENTITY_NAME, claimid, new ColumnSet(Constants.CLAIM_CASEPROVIDERID_FIELD));
                if (!claim.Contains(Constants.CLAIM_CASEPROVIDERID_FIELD))
                {
                    tracingService.Trace("Claim - Id " + claimid + " doesn't have associated case provider. Exiting code!");
                    return;
                }
                else
                {
                    caseproviderid = ((EntityReference)claim[Constants.CLAIM_CASEPROVIDERID_FIELD]).Id;
                }

                tracingService.Trace("Case Provider - Recovery Amount Calculation");
                CalculateRollupFieldRequest totalidentifiedrecoveryamount = new CalculateRollupFieldRequest {
                    Target = new EntityReference(Constants.CASEPROVIDER_ENTITY_NAME, caseproviderid), FieldName = Constants.CASEPROVIDER_TOTALIDENTIFIEDRECOVERYAMOUNT_FIELD
                };
                CalculateRollupFieldRequest totalrecoveredamount = new CalculateRollupFieldRequest {
                    Target = new EntityReference(Constants.CASEPROVIDER_ENTITY_NAME, caseproviderid), FieldName = Constants.CASEPROVIDER_TOTALRECOVEREDAMOUNT_FIELD
                };
                CalculateRollupFieldRequest totalremainingrecoveryamount = new CalculateRollupFieldRequest {
                    Target = new EntityReference(Constants.CASEPROVIDER_ENTITY_NAME, caseproviderid), FieldName = Constants.CASEPROVIDER_TOTALREMAININGRECOVERYAMOUNT_FIELD
                };
                ////Response
                CalculateRollupFieldResponse totalidentifiedrecoveryamountresponse = (CalculateRollupFieldResponse)service.Execute(totalidentifiedrecoveryamount);
                CalculateRollupFieldResponse totalrecoveredamountresponse          = (CalculateRollupFieldResponse)service.Execute(totalrecoveredamount);
                CalculateRollupFieldResponse totalremainingrecoveryamountresponse  = (CalculateRollupFieldResponse)service.Execute(totalremainingrecoveryamount);
                tracingService.Trace("Case Provider - Recovery Amount Calculation Complete");
                #endregion

                #region case
                var caseid       = Guid.Empty;
                var caseprovider = service.Retrieve(Constants.CASEPROVIDER_ENTITY_NAME, caseproviderid, new ColumnSet(true));
                if (!caseprovider.Contains(Constants.CASEPROVIDER_CASEID_FIELD))
                {
                    tracingService.Trace("CaseProvider with Id " + caseproviderid + " doesn't have associated case. Exiting code!");
                    return;
                }
                else
                {
                    caseid = ((EntityReference)caseprovider[Constants.CASEPROVIDER_CASEID_FIELD]).Id;
                }

                tracingService.Trace("Calculate case total recovery totals");
                var casetotalidentifiedrecoveryamount = GetTotals(service, tracingService, Constants.CASEPROVIDER_ENTITY_NAME, Constants.CASEPROVIDER_TOTALIDENTIFIEDRECOVERYAMOUNT_FIELD, Constants.CASEPROVIDER_CASEID_FIELD, caseid);
                var casetotalrecoveredamount          = GetTotals(service, tracingService, Constants.CASEPROVIDER_ENTITY_NAME, Constants.CASEPROVIDER_TOTALRECOVEREDAMOUNT_FIELD, Constants.CASEPROVIDER_CASEID_FIELD, caseid);
                var casetotalremainingrecoveryamount  = GetTotals(service, tracingService, Constants.CASEPROVIDER_ENTITY_NAME, Constants.CASEPROVIDER_TOTALREMAININGRECOVERYAMOUNT_FIELD, Constants.CASEPROVIDER_CASEID_FIELD, caseid);

                tracingService.Trace("Case total recoveries calculated");

                //update case
                tracingService.Trace("Update Case");
                var caseentity = new Entity(Constants.CASE_ENTITY_NAME);
                caseentity.Id = caseid;
                caseentity[Constants.CASE_TOTALIDENTIFIEDRECOVERYAMOUNT_FIELD] = new Money(casetotalidentifiedrecoveryamount);
                caseentity[Constants.CASE_TOTALRECOVEREDAMOUNT_FIELD]          = new Money(casetotalrecoveredamount);
                caseentity[Constants.CASE_TOTALREMAININGRECOVERYAMOUNT_FIELD]  = new Money(casetotalremainingrecoveryamount);
                service.Update(caseentity);
                tracingService.Trace("Case Updated");
                #endregion
            }
            catch (InvalidPluginExecutionException ex)
            {
                tracingService.Trace("Error in pluing " + PLUGIN_NAME + ". " + ex.Message);
                throw;
            }
        }
Esempio n. 6
0
        protected override void Execute(CodeActivityContext activityContext)
        {
            //Create the tracing service.
            ITracingService tracingService = activityContext.GetExtension <ITracingService>();

            //Create the context.
            IWorkflowContext            workflowContext = activityContext.GetExtension <IWorkflowContext>();
            IOrganizationServiceFactory serviceFactory  = activityContext.GetExtension <IOrganizationServiceFactory>();
            IOrganizationService        service         = serviceFactory.CreateOrganizationService(workflowContext.UserId);

            //Check the InArgument value.
            if (this.Arg_WO != null)
            {
                //Get the Work Order Record.
                Entity workOrder = service.Retrieve("msdyn_workorder", this.Arg_WO.Get <EntityReference>(activityContext).Id, new ColumnSet(true));

                //Retrieve the standards collection for this work order.
                EntityCollection standards = getWorkOrderStandards(service, workOrder.Id);

                //Retrieve the domains collection for this work order.
                EntityCollection domains = getWorkOrderDomains(service, workOrder.Id);

                //Retieve the elements collection for this work order.
                EntityCollection elements = getWorkOrderElements(service, workOrder.Id);

                #region Domain Calculation
                if (domains != null)
                {
                    //Retrieve each domain and update it.
                    foreach (Entity domain in domains.Entities)
                    {
                        Entity domainRecord = service.Retrieve("msdyn_workorderservice", domain.Id, new ColumnSet(true));
                        CalculateRollupFieldRequest totalApplicableElementRequest =

                            new CalculateRollupFieldRequest {
                            Target = new EntityReference("msdyn_workorderservice", domainRecord.Id), FieldName = "net_totalnumberofapplicableelements"
                        };

                        CalculateRollupFieldResponse totalApplicableElementResponse = (CalculateRollupFieldResponse)service.Execute(totalApplicableElementRequest);

                        domainRecord = totalApplicableElementResponse.Entity;

                        //service.Update(workOrder);

                        CalculateRollupFieldRequest SumOfJudgmentRequest =

                            new CalculateRollupFieldRequest {
                            Target = new EntityReference("msdyn_workorderservice", domainRecord.Id), FieldName = "net_sumofjudgment"
                        };

                        CalculateRollupFieldResponse sumOfJudgmentResponse = (CalculateRollupFieldResponse)service.Execute(SumOfJudgmentRequest);

                        domainRecord = sumOfJudgmentResponse.Entity;

                        service.Update(domainRecord);

                        Entity domainUpdated          = service.Retrieve("msdyn_workorderservice", domainRecord.Id, new ColumnSet(true));
                        int    totalApplicableELement = domainUpdated.GetAttributeValue <int>("net_totalnumberofapplicableelements");
                        int    sumOfJudgement         = domainUpdated.GetAttributeValue <int>("net_sumofjudgment");
                        int    AgreePercentage        = 0;
                        if (totalApplicableELement != 0)
                        {
                            AgreePercentage = sumOfJudgement * 100 / (totalApplicableELement * 2);
                        }
                        else
                        {
                            AgreePercentage = 0;
                        }

                        domainUpdated["net_agreepercentage"] = AgreePercentage;
                        service.Update(domainUpdated);
                    }
                }
                #endregion

                #region Standard Calculation
                if (standards != null)
                {
                    //Retrieve the elements in each standard
                    foreach (Entity standard in standards.Entities)
                    {
                        //define the numebr of applicable element.
                        int totalNumberofApplicableElement = 0;

                        //define the sum of judgment.
                        int sumOfJudgment = 0;

                        //define the weight.
                        int sumOfWeight = 0;

                        //define the Overall Judgment Percentage
                        Decimal overallJudgmentPercentage = 0;

                        //define the weighted score.
                        Decimal weightedScore = 0;

                        //define the weighted score percentage.
                        Decimal weightedScorePercentage = 0;

                        //fetch all elements in the standard
                        EntityCollection elementStandards = getStandardElements(service, standard.Id);

                        foreach (Entity element in elementStandards.Entities)
                        {
                            //Get the compliance status
                            OptionSetValue complianceStatus = element.GetAttributeValue <OptionSetValue>("net_compliantcoordinator");

                            if (complianceStatus != null)
                            {
                                int elementStatus = complianceStatus.Value;
                                //if status != N/A
                                if (elementStatus != 3)
                                {
                                    //increment the total number of applicable element.
                                    totalNumberofApplicableElement = totalNumberofApplicableElement + 1;
                                }
                            }


                            int elementJudgment = element.GetAttributeValue <int>("net_inspectionjudgement");
                            //add the element judgment to the sum of judgment.
                            sumOfJudgment = sumOfJudgment + elementJudgment;

                            //get the weight.
                            int weight = element.GetAttributeValue <int>("net_weight");
                            //add the weight to the sumofweight.
                            sumOfWeight = sumOfWeight + weight;

                            weightedScore = weightedScore + (elementJudgment * weight);
                        }
                        if (totalNumberofApplicableElement != 0)
                        {
                            overallJudgmentPercentage = (Decimal)(sumOfJudgment) * (Decimal)100 / (Decimal)(2 * totalNumberofApplicableElement);
                        }
                        else
                        {
                            overallJudgmentPercentage = 0;
                        }
                        if (sumOfWeight != 0)
                        {
                            weightedScore = weightedScore / sumOfWeight;
                        }
                        else
                        {
                            weightedScore = 0;
                        }


                        weightedScorePercentage = weightedScore / 2 * 100;

                        standard["net_totalofapplicableelement"] = totalNumberofApplicableElement;
                        standard["net_sumofjudgment"]            = sumOfJudgment;
                        standard["net_compliancepercentage"]     = overallJudgmentPercentage;
                        standard["net_weightedscore"]            = weightedScore;
                        standard["net_weightedscorepercentage"]  = weightedScorePercentage;
                        service.Update(standard);
                    }
                }
                #endregion

                #region Update the Rollup Fields
                CalculateRollupFieldRequest rollupRequest =

                    new CalculateRollupFieldRequest {
                    Target = new EntityReference("msdyn_workorder", workOrder.Id), FieldName = "net_totalnumberofapplicableelements"
                };

                CalculateRollupFieldResponse response = (CalculateRollupFieldResponse)service.Execute(rollupRequest);

                workOrder = response.Entity;

                //service.Update(workOrder);

                CalculateRollupFieldRequest rollupRequestSumOfJudgment =

                    new CalculateRollupFieldRequest {
                    Target = new EntityReference("msdyn_workorder", workOrder.Id), FieldName = "net_sumofjudgment"
                };

                CalculateRollupFieldResponse responseSumOfJudgment = (CalculateRollupFieldResponse)service.Execute(rollupRequestSumOfJudgment);

                workOrder = responseSumOfJudgment.Entity;

                service.Update(workOrder);
                #endregion

                #region Work Order Calculation
                Entity updatedWorkOrder = service.Retrieve("msdyn_workorder", workOrder.Id, new ColumnSet(true));

                int totalOfApplicableElements = updatedWorkOrder.GetAttributeValue <int>("net_totalnumberofapplicableelements");
                int workOrderSumOfJudgment    = updatedWorkOrder.GetAttributeValue <int>("net_sumofjudgment");
                //int maxPossibleScore = workOrder.GetAttributeValue<int>("net_maxpossiblescore");
                int     maxPossibleScore            = totalOfApplicableElements * 2;
                Decimal overallCompliancePercentage = 0;
                if (maxPossibleScore != 0)
                {
                    overallCompliancePercentage = (Decimal)((Decimal)workOrderSumOfJudgment * 100 / (Decimal)maxPossibleScore);
                }
                else
                {
                    overallCompliancePercentage = 0;
                }

                //define the weighted score.
                Decimal workOrderWeightedScore = 0;

                //define the weight.
                int workOrderSumOfWeight = 0;

                if (elements != null)
                {
                    string  elementsID          = "";
                    Decimal RiskLevelPercentage = 0;
                    foreach (Entity element in elements.Entities)
                    {
                        elementsID = (elementsID + "<value>" + element.Id + "</value>");

                        int elementJudgment = element.GetAttributeValue <int>("net_inspectionjudgement");

                        //get the weight.
                        int weight = element.GetAttributeValue <int>("net_weight");
                        //add the weight to the sumofweight.
                        workOrderSumOfWeight = workOrderSumOfWeight + weight;

                        workOrderWeightedScore = workOrderWeightedScore + (elementJudgment * weight);
                    }

                    if (workOrderSumOfWeight != 0)
                    {
                        workOrderWeightedScore = workOrderWeightedScore / workOrderSumOfWeight;
                    }
                    else
                    {
                        workOrderWeightedScore = 0;
                    }

                    //retrieve the number of critical element definition.
                    //EntityCollection criticalElementDefinition = getCriticalElementsDefinitionByElementInstance(service, elementsID);
                    //int numberOfCriticalElementsDefinition = criticalElementDefinition.Entities.Count;

                    string fetch = $@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
  <entity name='net_element'>
    <attribute name='net_elementid' />
    <attribute name='net_name' />
    <attribute name='createdon' />
    <order attribute='net_name' descending='false' />
    <filter type='and'>
      <condition attribute='net_critical' operator='eq' value='1' />
    </filter>
    <link-entity name='msdyn_workorderservicetask' from='net_element' to='net_elementid' alias='ab'>
      <filter type='and'>
        <condition attribute='msdyn_workorderservicetaskid' operator='in'>"
                                   + elementsID +
                                   "</condition>" +
                                   "</filter>" +
                                   "</link-entity>" +
                                   "</entity>" +
                                   "</fetch>";
                    EntityCollection criticalElementsDefinition = service.RetrieveMultiple(new FetchExpression(fetch));
                    int numberOfCriticalElementsDefinition      = criticalElementsDefinition.Entities.Count;

                    //Retrieve the number of critical elements.
                    int numberOfCriticalElements = getWorkOrderCriticalElements(service, workOrder.Id).Entities.Count;

                    if (numberOfCriticalElementsDefinition == 0)
                    {
                        RiskLevelPercentage = 0;
                    }
                    else
                    {
                        RiskLevelPercentage = (Decimal)numberOfCriticalElements * (Decimal)100 / (Decimal)numberOfCriticalElementsDefinition;
                    }

                    //update the work order.
                    updatedWorkOrder["net_overallcompliance"] = overallCompliancePercentage;
                    updatedWorkOrder["net_weightedscore"]     = workOrderWeightedScore;
                    updatedWorkOrder["net_numberofcriticalinspectionelements"] = numberOfCriticalElements;
                    updatedWorkOrder["net_numberofcriticalelementdefinition"]  = numberOfCriticalElementsDefinition;
                    updatedWorkOrder["net_riskslevelpercentage"] = RiskLevelPercentage;

                    service.Update(updatedWorkOrder);
                }
                #endregion
            }
        }
Esempio n. 7
0
        internal override OrganizationResponse Execute(OrganizationRequest orgRequest, EntityReference userRef)
        {
            var request = MakeRequest <CalculateRollupFieldRequest>(orgRequest);


            var dbEntity = db.GetEntity(request.Target);
            var metadata = this.metadata.EntityMetadata.GetMetadata(dbEntity.LogicalName);
            var field    = metadata.Attributes.FirstOrDefault(a => a.LogicalName == request.FieldName);

            if (field == null)
            {
                throw new FaultException($"Couldn't find the field '{request.FieldName}' on the entity '{dbEntity.LogicalName}'");
            }
            else
            {
                string definition = (field as BooleanAttributeMetadata)?.FormulaDefinition;
                if ((field as BooleanAttributeMetadata)?.SourceType == 2)
                {
                    definition = (field as BooleanAttributeMetadata).FormulaDefinition;
                }
                else if ((field as DateTimeAttributeMetadata)?.SourceType == 2)
                {
                    definition = (field as DateTimeAttributeMetadata).FormulaDefinition;
                }
                else if ((field as DecimalAttributeMetadata)?.SourceType == 2)
                {
                    definition = (field as DecimalAttributeMetadata).FormulaDefinition;
                }
                else if ((field as IntegerAttributeMetadata)?.SourceType == 2)
                {
                    definition = (field as IntegerAttributeMetadata).FormulaDefinition;
                }
                else if ((field as MoneyAttributeMetadata)?.SourceType == 2)
                {
                    definition = (field as MoneyAttributeMetadata).FormulaDefinition;
                }
                else if ((field as PicklistAttributeMetadata)?.SourceType == 2)
                {
                    definition = (field as PicklistAttributeMetadata).FormulaDefinition;
                }
                else if ((field as StringAttributeMetadata)?.SourceType == 2)
                {
                    definition = (field as StringAttributeMetadata).FormulaDefinition;
                }

                if (definition == null)
                {
                    throw new FaultException($"Field '{request.FieldName}' on entity '{dbEntity.LogicalName}' is not a rollup field");
                }
                else
                {
                    var tree            = WorkflowConstructor.ParseRollUp(definition);
                    var factory         = core.ServiceFactory;
                    var resultTree      = tree.Execute(dbEntity, core.TimeOffset, core.GetWorkflowService(), factory, factory.GetService(typeof(ITracingService)) as ITracingService);
                    var resultLocaltion = ((resultTree.StartActivity as RollUp).Aggregation[1] as Aggregate).VariableName;
                    var result          = resultTree.Variables[resultLocaltion];
                    if (result != null)
                    {
                        dbEntity[request.FieldName] = result;
                    }
                }
            }
            Utility.HandleCurrencies(this.metadata, db, dbEntity);
            db.Update(dbEntity);

            var resp = new CalculateRollupFieldResponse();

            resp.Results["Entity"] = db.GetEntity(request.Target);
            return(resp);
        }