/// <summary> /// Prepare condition attributes model /// </summary> /// <param name="model">Condition attributes model</param> /// <param name="checkoutAttribute">Checkout attribute</param> /// <returns>A task that represents the asynchronous operation</returns> protected virtual async Task PrepareConditionAttributesModelAsync(ConditionModel model, CheckoutAttribute checkoutAttribute) { if (model == null) { throw new ArgumentNullException(nameof(model)); } if (checkoutAttribute == null) { throw new ArgumentNullException(nameof(checkoutAttribute)); } model.EnableCondition = !string.IsNullOrEmpty(checkoutAttribute.ConditionAttributeXml); //get selected checkout attribute var selectedAttribute = (await _checkoutAttributeParser.ParseCheckoutAttributesAsync(checkoutAttribute.ConditionAttributeXml)).FirstOrDefault(); model.SelectedAttributeId = selectedAttribute?.Id ?? 0; //get selected checkout attribute values identifiers var selectedValuesIds = await _checkoutAttributeParser .ParseCheckoutAttributeValues(checkoutAttribute.ConditionAttributeXml).SelectMany(ta => ta.values.Select(v => v.Id)).ToListAsync(); //get available condition checkout attributes (ignore this attribute and non-combinable attributes) var availableConditionAttributes = (await _checkoutAttributeService.GetAllCheckoutAttributesAsync()) .Where(attribute => attribute.Id != checkoutAttribute.Id && attribute.CanBeUsedAsCondition()); model.ConditionAttributes = await availableConditionAttributes.SelectAwait(async attribute => new AttributeConditionModel { Id = attribute.Id, Name = attribute.Name, AttributeControlType = attribute.AttributeControlType, Values = (await _checkoutAttributeService.GetCheckoutAttributeValuesAsync(attribute.Id)).Select(value => new SelectListItem { Text = value.Name, Value = value.Id.ToString(), Selected = selectedAttribute?.Id == attribute.Id && selectedValuesIds.Contains(value.Id) }).ToList() }).ToListAsync(); }