public async override Task Validate(CostCenterInput input)
        {
            await base.Validate(input);

            var bn = await Queries.GetCostCenterFromBusinessName(input.IdBusinessName);

            if (bn.Any())
            {
                throw new CustomException("Ya existe un cost center asociado a este business name");
            }
        }
        public async override Task Validate(WarehouseDocumentInput input)
        {
            if (!input.ProductDocuments.Any())
            {
                throw new CustomException("Tiene que haber al menos un producto");
            }
            else
            {
                var isUnique = input.ProductDocuments.GroupBy(o => o.IdProduct).Max(g => g.Count()) == 1;
                if (!isUnique)
                {
                    throw new CustomException("No se pueden ingresar productos repetidos");
                }
            }

            await base.Validate(input);

            if (!Enum.IsDefined(typeof(DocumentType), input.DocumentType))
            {
                throw new ArgumentOutOfRangeException("input.DocumentType", "Enum fuera de rango");
            }

            if (!Enum.IsDefined(typeof(PaymentType), input.PaymentType))
            {
                throw new ArgumentOutOfRangeException("input.PaymentType", "Enum fuera de rango");
            }

            if (!Enum.IsDefined(typeof(DocumentState), input.DocumentState))
            {
                throw new ArgumentOutOfRangeException("input.DocumentState", "Enum fuera de rango");
            }

            if (!input.Output)
            {
                // Documento de entrada, por lo que se debe ingresar un origen desde donde vienen los productos, ese origen debe
                // ser un proveedor, o sea, un business name que no posea centro de costos. El valor de destino es null, ya que
                // el id de bodega previamente ingresado tomará ese lugar.
                if (string.IsNullOrWhiteSpace(input.Source))
                {
                    throw new CustomException("Debe ingresar un origen");
                }
                input.Destiny = input.IdWarehouse;
                var provider = await Queries.GetCostCenterFromBusinessName(input.Source);

                if (provider.Any())
                {
                    throw new CustomException("El business name posee centro de costos, por lo que no puede ser un proveedor");
                }
            }
            if (input.Output)
            {
                // Documento de salida, por lo que se debe ingresar un destino haia donde irán los productos, ese destino debe ser
                // un business name que si posea centro de costos, para poder realizar la transacción. En este caso, el valor de origen
                // es null, ya que el id de bodega previamente ingresado tomará ese lugar.
                if (string.IsNullOrWhiteSpace(input.Destiny))
                {
                    throw new CustomException("Debe ingresar un destino");
                }
                input.Source = input.IdWarehouse;
                var noprovider = await Queries.GetCostCenterFromBusinessName(input.Destiny);

                if (!noprovider.Any())
                {
                    throw new CustomException("El business name no posee centro de costos, por lo que es un proveedor");
                }
            }
        }