/// <summary> /// Permet de vérifier toutes les contraintes dans l'ordre d'une séquence de contraintes sur un SelectorInstance. /// </summary> /// <param name="sequences">Sequences de contraintes</param> /// <param name="selectorInstance">SelectorInstance cible</param> /// <param name="workflowInstance">WorkflowInstance</param> /// <param name="values">Valeurs à modifier</param> /// <returns>Message de retour</returns> public async Task <HttpResponseMessageResult> CheckConstraint(Constraint contrainte, long referenceSequence, int ordreSequence, ConstraintLevelEnum level, SelectorInstance selectorInstance, WorkflowInstance workflowInstance, IEnumerable <KeyValuePair <long, double> > values) { HttpResponseMessageResult res = new HttpResponseMessageResult() { IsSuccess = true }; if (contrainte.Type == ConstraintTypeEnum.Hardcode) { if (contrainte.Name == Constant.CONSTRAINT_TREESUM) { return(await CheckTreeSum(referenceSequence, ordreSequence, level, selectorInstance, workflowInstance)); } //if (contrainte.Name == Constant.ACTION_SPLIT_COPY) // ; //if (contrainte.Name == Constant.ACTION_AGREGATE_PRIMEUM) // ; } if (contrainte.Type == ConstraintTypeEnum.Dynamic) { // TODO } return(res); }
private async Task <HttpResponseMessageResult> CheckTreeSum(long referenceSequence, int ordreSequence, ConstraintLevelEnum level, SelectorInstance selectorInstance, WorkflowInstance workflowInstance) { HttpResponseMessageResult res = new HttpResponseMessageResult() { IsSuccess = true }; await ConfigVariableDomain.LoadVariables(); string nomDimension = await GetConstraintParameter(referenceSequence, ordreSequence, Constant.PARAMETER_CONSTRAINT_ALIGNMENTNAME); Dictionary <long, Tuple <ValueObject, int, string, bool> > dicVo = await ValueObjectDomain.CreateDictionaryVO(nomDimension, selectorInstance); // Construction des arbres int topLvl = dicVo.Values.Select(t => t.Item2).Min(); int bottomLvl = dicVo.Values.Select(t => t.Item2).Max(); IEnumerable <TreeValueObject> lstTree = ValueObjectDomain.BuildTreeVO(dicVo, nomDimension, topLvl, bottomLvl); // On parcours les arbres et on vérifie les valeurs HashSet <long> idsAlreadyComputed = new HashSet <long>(); //Dictionary<long, Tuple<double, double>> outOfConstraint = new Dictionary<long, Tuple<double, double>>(); Dictionary <long, object> outOfConstraint = new Dictionary <long, object>(); foreach (TreeValueObject tvo in lstTree) { string format = await ValueObjectDomain.GetNumericalFormat(tvo.Node.TypeValue, workflowInstance.DataSetId); for (int currentLvl = bottomLvl; currentLvl > topLvl; currentLvl--) { IEnumerable <TreeValueObject> nodes = TreeValueObject.GetNodesFromLevel(tvo, currentLvl); foreach (TreeValueObject child in nodes) { if ((child.Parent == null) || idsAlreadyComputed.Contains(child.Parent.Node.Id)) { continue; } double sumComputed = child.Parent.Children.Select(subnode => ValueObjectDomain.GetMostCurrentValue(subnode.Node)).Sum(); double sumParent = ValueObjectDomain.GetMostCurrentValue(child.Parent.Node); if (!ValueObjectHelper.AlmostEqual(sumComputed, sumParent, format)) { outOfConstraint.Add(child.Parent.Node.Id, new { expected = sumParent, computed = sumComputed }); } idsAlreadyComputed.Add(child.Parent.Node.Id); } } } if (outOfConstraint.Count > 0) { res.Json = JsonConvert.SerializeObject(outOfConstraint); res.Message = "Some values are not sum of their children."; if ((level == ConstraintLevelEnum.Info) || (level == ConstraintLevelEnum.Warning)) { res.IsSuccess = true; } if (level == ConstraintLevelEnum.Error) { res.IsSuccess = false; } } return(res); }