/// <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;
        }
Пример #2
0
        /// <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);
        }