/// <summary> /// Visit the special services rule node. Check the parameter rules, prerequisite rules and incompatible service rules for the parcel. /// </summary> /// <param name="specialServicesRule"></param> public void Visit(SpecialServicesRule specialServicesRule) { foreach (var ss in _rate.SpecialServices) { if (ss.SpecialServiceId == specialServicesRule.SpecialServiceId) { if (specialServicesRule.InputParameterRules != null && specialServicesRule.InputParameterRules.Count > 1) { if (!specialServicesRule.HasRequiredParameters(ss)) { _state = ValidationState.INVALID; Reason = string.Format("Special service {0} is missing required parameters", ss.SpecialServiceId); return; } if (!specialServicesRule.IsValidParameterValues(ss)) { Reason = string.Format("Special service {0} has value outside the permissable range", ss.SpecialServiceId); _state = ValidationState.INVALID; return; } } } else { if (specialServicesRule.IncompatibleSpecialServices != null && specialServicesRule.IncompatibleSpecialServices.Contains(ss.SpecialServiceId)) { Reason = string.Format("Special service {0} is incompatible with other selected services", ss.SpecialServiceId); _state = ValidationState.INVALID; return; } } } if (specialServicesRule.PrerequisiteRules != null && !specialServicesRule.IsValidPrerequisites(_rate.SpecialServices)) { Reason = string.Format("Special service {0} is missing prerequisites", specialServicesRule.SpecialServiceId); _state = ValidationState.INVALID; return; } }
public static RatesArrayFluent <T> SpecialServiceFromRule <T, S>(this RatesArrayFluent <T> f, SpecialServicesRule rule) where T : class, IRates, new() where S : class, ISpecialServices, new() { var ss = new S { SpecialServiceId = rule.SpecialServiceId, InputParameters = new List <Parameter>() }; if (rule.InputParameterRules == null) { ss.AddParameter(new Parameter("INPUT_VALUE", "0")); } else { foreach (var ip in rule.InputParameterRules.Values) { ss.AddParameter(new Parameter(ip.Name, ip.MinValue.ToString())); } } f.SpecialService <S>(ss); return(f); }