using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; namespace GestionIntegral.Api.Dtos.Distribucion { [CustomValidation(typeof(CreateBulkEntradaSalidaCanillaDto), nameof(ValidateNoDuplicatePublicationsInItems))] public class CreateBulkEntradaSalidaCanillaDto { [Required(ErrorMessage = "El ID del canillita es obligatorio.")] public int IdCanilla { get; set; } [Required(ErrorMessage = "La fecha del movimiento es obligatoria.")] public DateTime Fecha { get; set; } [Required(ErrorMessage = "Debe haber al menos un ítem de movimiento.")] [MinLength(1, ErrorMessage = "Debe agregar al menos una publicación.")] // La validación de cada item se hará por los atributos en EntradaSalidaCanillaItemDto public List Items { get; set; } = new List(); public static ValidationResult? ValidateNoDuplicatePublicationsInItems(CreateBulkEntradaSalidaCanillaDto instanceToValidate, ValidationContext context) { if (instanceToValidate == null) { return new ValidationResult("El objeto principal de la solicitud es nulo."); } if (instanceToValidate.Items == null) { return ValidationResult.Success; // O error si una lista nula de items es inválida } if (instanceToValidate.Items.Any()) { if (instanceToValidate.Items.Any(item => item == null)) { return new ValidationResult("La lista de ítems contiene entradas nulas.", new[] { nameof(Items) }); } var duplicateGroups = instanceToValidate.Items .Where(item => item.IdPublicacion != 0) // Considerar solo IDs válidos si 0 no lo es .GroupBy(item => item.IdPublicacion) .Where(group => group.Count() > 1) .ToList(); if (duplicateGroups.Any()) { var duplicatedIds = string.Join(", ", duplicateGroups.Select(g => g.Key)); return new ValidationResult( $"No puede agregar la misma publicación varias veces. Publicaciones duplicadas IDs: {duplicatedIds}", new[] { nameof(Items) } ); } } return ValidationResult.Success; } } }