Files
RS_System/RS_system/Models/ViewModels/RegistrarColaboracionViewModel.cs
2026-02-01 14:28:17 -06:00

88 lines
3.0 KiB
C#

using System.ComponentModel.DataAnnotations;
using Rs_system.Models;
namespace Rs_system.Models.ViewModels;
public class RegistrarColaboracionViewModel
{
[Required(ErrorMessage = "Debe seleccionar un miembro")]
public long MiembroId { get; set; }
[Display(Name = "Mes Inicial")]
[Required(ErrorMessage = "Debe seleccionar el mes inicial")]
[Range(1, 12, ErrorMessage = "Mes debe estar entre 1 y 12")]
public int MesInicial { get; set; }
[Display(Name = "Año Inicial")]
[Required(ErrorMessage = "Debe seleccionar el año inicial")]
[Range(2000, 2100, ErrorMessage = "Año debe estar entre 2000 y 2100")]
public int AnioInicial { get; set; }
[Display(Name = "Mes Final")]
[Required(ErrorMessage = "Debe seleccionar el mes final")]
[Range(1, 12, ErrorMessage = "Mes debe estar entre 1 y 12")]
public int MesFinal { get; set; }
[Display(Name = "Año Final")]
[Required(ErrorMessage = "Debe seleccionar el año final")]
[Range(2000, 2100, ErrorMessage = "Año debe estar entre 2000 y 2100")]
public int AnioFinal { get; set; }
[Required(ErrorMessage = "Debe seleccionar al menos un tipo de colaboración")]
public List<long> TiposSeleccionados { get; set; } = new();
[Required(ErrorMessage = "Debe ingresar el monto total")]
[Range(0.01, 999999.99, ErrorMessage = "El monto total debe ser mayor a 0")]
[Display(Name = "Monto Total Entregado")]
public decimal MontoTotal { get; set; }
[Display(Name = "Tipo de Colaboración Prioritaria")]
public long? TipoPrioritario { get; set; }
[MaxLength(500, ErrorMessage = "Las observaciones no pueden exceder 500 caracteres")]
[Display(Name = "Observaciones")]
public string? Observaciones { get; set; }
// Para cargar en el formulario
public List<TipoColaboracion> TiposDisponibles { get; set; } = new();
// Propiedad calculada: Total de meses
public int TotalMeses
{
get
{
try
{
var fechaInicial = new DateTime(AnioInicial, MesInicial, 1);
var fechaFinal = new DateTime(AnioFinal, MesFinal, 1);
if (fechaFinal < fechaInicial)
return 0;
return ((AnioFinal - AnioInicial) * 12) + (MesFinal - MesInicial) + 1;
}
catch
{
return 0;
}
}
}
// Propiedad calculada: Monto sugerido total basado en los tipos seleccionados
public decimal MontoSugeridoTotal
{
get
{
if (TiposDisponibles == null || !TiposSeleccionados.Any())
return 0;
var tiposSeleccionadosData = TiposDisponibles
.Where(t => TiposSeleccionados.Contains(t.Id))
.ToList();
var montoSugeridoPorMes = tiposSeleccionadosData.Sum(t => t.MontoSugerido);
return montoSugeridoPorMes * TotalMeses;
}
}
}