/// <summary> /// Сворачивает попозиционные errorCode и message в глобальные errorCode и message. /// </summary> /// <param name="response">Ответ, данные в котором надо свернуть.</param> /// <param name="messageWhenNoOrders">Сообщение для ситуации когда чек пустой.</param> /// <param name="messageWhenAllOrdersSuccessful">Сообщение для ситуации когда все строки со скидкой.</param> /// <param name="delimiter">Разделитель строк при сборке (по умолчанию <b>; \r\n</b>).</param> public static void RollupMessages( this GetDiscountResponse response, string messageWhenNoOrders, string messageWhenAllOrdersSuccessful, string?delimiter = "; \r\n") { response = response ?? throw new ArgumentNullException(nameof(response)); if (response.Orders.Count == 0) { response.Status = Globals.StatusSuccess; response.ErrorCode = 0; response.Message = messageWhenNoOrders; return; } if (response.Orders.All(x => x.ErrorCode == 0)) { response.Status = Globals.StatusSuccess; response.ErrorCode = 0; response.Message = messageWhenAllOrdersSuccessful; return; } response.Message = string.Join( delimiter, response.Orders.Select((x, i) => (string.IsNullOrEmpty(x.Description) ? (string.IsNullOrEmpty(x.Barcode) ? $"Строка {(i + 1)}" : x.Barcode) : x.Description) + ": " + x.Message)); if (response.Orders.Any(x => x.ErrorCode == 0)) { response.Status = Globals.StatusSuccess; response.ErrorCode = 0; return; } response.Status = Globals.StatusError; response.ErrorCode = response.Orders.All(x => x.ErrorCode == GetDiscountOrderErrorCodes.UnknownBarcode || x.ErrorCode == GetDiscountOrderErrorCodes.EmptyBarcode) ? GetDiscountErrorCodes.NoDiscountsUnknownBarcodes : GetDiscountErrorCodes.NoDiscountsParamsNotValid; }
/// <summary> /// Выполняет валидацию объекта с учётом вложенных коллекций (Orders, Products, ...), используя <see cref="ProtocolSettings">параметры протокола</see>, заданные в конструкторе. /// </summary> /// <param name="instance">Экземпляр объекта для проверки.</param> /// <param name="results">Список, который необходимо заполнить ошибками (если они будут найдены).</param> /// <returns>Результат валидации: <b>true</b> в случае успешной валидации или <b>false</b> если были обнаружены ошибки.</returns> public bool TryValidateObject(object instance, out List <ValidationResult> results) { if (instance == null) { throw new ArgumentNullException(nameof(instance)); } var psp = new ProtocolSettingsServiceProvider(protocolSettings); var vc = new ValidationContext(instance, psp, null); results = new List <ValidationResult>(); var isValid = Validator.TryValidateObject(instance, vc, results, true); IEnumerable <object>?children = instance switch { GetDiscountRequest gdr => gdr.Orders, GetDiscountResponse gdr => gdr.Orders, ConfirmPurchaseRequest cpr => cpr.Skus, GetProgramsResponse gpr => gpr.Programs, GetProductsResponse gpr => gpr.Products, UpdatePharmaciesRequest upr => upr.Pharmacies, _ => null, }; if (children != null) { foreach (var child in children) { if (child != null) { var childvc = new ValidationContext(child, psp, null); isValid &= Validator.TryValidateObject(child, childvc, results, true); } } } return(isValid); }