using Extensiones; using iText.Html2pdf.Attach.Impl.Layout.Form.Element; using Microsoft.Extensions.Primitives; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class Nomina_ReporteVacaciones : ClsPaginas { #region "Propiedades" protected int FiltCveProyecto { get { if (ViewState["FiltCveProyecto"] == null) { return -1; } else { return ViewState["FiltCveProyecto"].ToString().ToEntero(); } } set { ViewState["FiltCveProyecto"] = value; } } protected int FiltCveSubProyecto { get { if (ViewState["FiltCveSubProyecto"] == null) { return -1; } else { return ViewState["FiltCveSubProyecto"].ToString().ToEntero(); } } set { ViewState["FiltCveSubProyecto"] = value; } } protected string FiltFechaInicio { get { string fecha = $"{DateTime.Now.Year - 1}-01-01"; if (ViewState["FiltFechaInicio"] == null) { return fecha; } else { return ViewState["FiltFechaInicio"].ToString(); } } set { ViewState["FiltFechaInicio"] = value; } } protected string FiltFechaFin { get { string fecha = $"{DateTime.Now.Year}-12-31"; if (ViewState["FiltFechaFin"] == null) { return fecha; } else { return ViewState["FiltFechaFin"].ToString(); } } set { ViewState["FiltFechaFin"] = value; } } protected DataTable tabladias { get { if (ViewState["tabladias"] == null) { return new DataTable(); } else { return (DataTable)ViewState["tabladias"]; } } set { ViewState["tabladias"] = value; } } #endregion protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { TxtRpdFechaInicio.Text = $"{FiltFechaInicio.ToDateTime():dd/MM/yyyy}"; TxtRpdFechaFin.Text = $"{FiltFechaFin.ToDateTime():dd/MM/yyyy}"; CargarCentrosDeCosto(DdlProyecto, DdlSubProyecto, LblProyecto, LblSubProyeccto); divddlproyeto.Visible = DdlProyecto.Visible; getinfo(); } } public void getinfo() { using (ClsNominas objnom = new ClsNominas()) { if (objnom.ReporteVacacionesCalendario(FiltCveProyecto, FiltCveSubProyecto, UsuarioActual.CveEmpresa, FiltFechaInicio, FiltFechaFin)) { DataTable tabla1 = objnom.DTSetResultados.Tables[0]; // DataTable tabla2 = objnom.DTSetResultados.Tables[1]; // DataTable tabla3 = objnom.DTSetResultados.Tables[2]; // tabladias = objnom.DTSetResultados.Tables[3]; DataTable tabladiasPersonal = objnom.DTSetResultados.Tables[4]; RepeaterEjerciciosH1.DataSource = tabla3; RepeaterEjerciciosH2.DataSource = tabla3; RepeaterEjerciciosH1.DataBind(); RepeaterEjerciciosH2.DataBind(); // Convertir Tabla 1 a Enumerable con un campo extra List resultado = tabla1.AsEnumerable().Select(row1 => { int cvePersonal = Convert.ToInt32(row1["CvePersonal"]); DataRow[] filasFiltradas = tabladiasPersonal.Select($"CvePersonal = {cvePersonal}"); // Crear un nuevo DataTable con la misma estructura DataTable TDiaspersonal = tabladiasPersonal.Clone(); // Importar las filas filtradas foreach (DataRow fila in filasFiltradas) { TDiaspersonal.ImportRow(fila); //DataRow nuevaFila = TDiaspersonal.NewRow(); //// Copiar manualmente cada columna //foreach (DataColumn columna in tabladiasPersonal.Columns) //{ // nuevaFila[columna.ColumnName] = fila[columna.ColumnName]; //} //TDiaspersonal.Rows.Add(nuevaFila); } TDiaspersonal.AcceptChanges(); //DataTable TDiaspersonal = tabladiasPersonal.FiltraParametros(string.Format("CvePersonal = '{0}'", row1["CvePersonal"])); int contador = tabladiasPersonal.Rows.Count; return new Registro() { CvePersonal = row1.Field("CvePersonal"), Codigo = row1.Field("Codigo"), NombreCompleto = row1.Field("NombreCompleto"), //FechaFin = (row1("FechaFin")).ToString()., FechaInicio = row1.Field("FechaInicio"), FechaAntiguedad = row1.Field("FechaAntiguedad"), Antiguedad = row1.Field("Antiguedad"), ColumnasinicioFin = strColumnasinicioFin(tabladias, tabla2.FiltraParametros(string.Format("CvePersonal = {0}", row1["CvePersonal"])), row1["anio"].ToString().ToEntero(), row1["Mes"].ToString(), row1["Dia"].ToString()), ColumnasVacaciones = strColumnasVacaciones(tabladias, TDiaspersonal), // Campo extra: Enumerable para cada Ejercicio de Tabla 3 Ejercicios = tabla3.AsEnumerable().Select(row3 => { var ejercicio = row3.Field("Ejercicio"); // Buscar en Tabla 2 si existe el registro para CvePersonal y Ejercicio var registro = tabla2.AsEnumerable().FirstOrDefault(row2 => row2.Field("CvePersonal") == row1.Field("CvePersonal") && row2.Field("EJercicio") == ejercicio); // Si no existe, crear un nuevo registro if (registro == null) { return new EjercicioInfo() { Ejercicio = ejercicio, FechaAntiguedad = row1.Field("FechaAntiguedad"), Antiguedad = 0, DiasVacaciones = 0, // Valor predeterminado DiasPagados = 0, // Valor predeterminado DiasDisfrutados = 0 // Valor predeterminado }; } else { // Si existe, devolver los datos de la Tabla 2 return new EjercicioInfo() { Ejercicio = registro.Field("EJercicio"), FechaAntiguedad = registro.Field("FechaAntiguedad"), Antiguedad = registro.Field("Antiguedad"), DiasVacaciones = registro.Field("DiasVacaciones"), DiasPagados = registro.Field("DiasPagados"), DiasDisfrutados = registro.Field("DiasDisfrutados") }; } }).ToList() }; } ).ToList(); RepeaterPrincipal.DataSource = resultado; RepeaterPrincipal.DataBind(); RepeaterPrincipalCalendar.DataSource = resultado; RepeaterPrincipalCalendar.DataBind(); rptanio.DataSource = tabladias.FiltraParametros("MinEjercicio = 1"); rptanio.DataBind(); rptMeses.DataSource = tabladias.FiltraParametros("MinMes = 1"); rptMeses.DataBind(); RepetDias.DataSource = tabladias; RepetDias.DataBind(); rptx.DataSource = tabladias; rptx.DataBind(); } } } public string rightstr(string str,int cantidad) { return str.Length >= cantidad ? str.Substring(str.Length - cantidad) : str; } public string strColumnasinicioFin(DataTable tabladias, DataTable TEjercicio, int anio, string Mes, string Dia) { StringBuilder stringBuilder = new StringBuilder(); StringBuilder strbuilderB = new StringBuilder(); strbuilderB.AppendFormat(" "); int FechaNum =string.Format("{0}{1}{2}", anio, Mes, Dia).ToEntero(); int Mesdia =string.Format("{0}{1}", Mes, Dia).ToEntero(); foreach (DataRow dr in tabladias.Rows) { int colspan = dr["DiasMes"].ToString().ToEntero(); int mesidias = rightstr(dr["FechaNum"].ToString(),4).ToEntero(); int mesa = dr["Mes"].ToString().ToEntero(); int ania = dr["Anio"].ToString().ToEntero()-(mesidias >= Mesdia?0:1); DataRow hdrow = TEjercicio.FiltroPrimero(string.Format("Ejercicio = {0}", ania)); int drFechaNum = dr["FechaNum"].ToString().ToEntero(); string classtd = drFechaNum < FechaNum ? "": ((ania % 2) > 0 ? "yearclass" : "yearclassB"); string antiguedad = ""; string classvac = "borderleft"; string vacacionestomadas = ""; if(hdrow != null) { antiguedad = string.Format("({0})", hdrow["Antiguedad"]); //DiasVacaciones EJercicio EJercicioVac DiasPagados DiasDisfrutados int DiasVacaciones = hdrow["DiasVacaciones"].ToString().ToEntero(); int DiasPagados = hdrow["DiasPagados"].ToString().ToEntero(); int DiasDisfrutados = hdrow["DiasDisfrutados"].ToString().ToEntero(); int mitadDiasVacaciones = DiasVacaciones / 2; classvac = DiasDisfrutados > 0 ? (DiasDisfrutados > mitadDiasVacaciones ? (DiasDisfrutados >= DiasVacaciones ? "success" : "info") : "warning") : "danger"; vacacionestomadas = string.Format("{0}/{1}",DiasDisfrutados, DiasVacaciones); } if (dr["MinMes"].ToString() == "1" && Mesdia != mesidias) { if(mesa == Mes.ToEntero()) { colspan = Dia.ToEntero() - 1; } string canio = drFechaNum >= FechaNum && colspan>5 ? (ania.ToString()) :""; stringBuilder.AppendFormat("{1} {3}", colspan, canio, classtd, antiguedad); strbuilderB.AppendFormat("{2}", colspan, classvac, vacacionestomadas); } if (mesidias == Mesdia) { string canio = drFechaNum >= FechaNum && colspan > 5 ? (ania.ToString()) : ""; if (mesa == Mes.ToEntero()) { colspan = colspan-(Dia.ToEntero() - 1); } stringBuilder.AppendFormat("{1} {3}", colspan, canio, classtd, antiguedad); strbuilderB.AppendFormat("{2}", colspan, classvac, vacacionestomadas); } } stringBuilder.AppendFormat("{0}", strbuilderB.ToString()); return stringBuilder.ToString(); } public string strColumnasVacaciones(DataTable tabladias, DataTable TDiaspersonal) { StringBuilder stringBuilder = new StringBuilder(); foreach (DataRow dr in tabladias.Rows) { DataRow hdr = TDiaspersonal.FiltroPrimero(string.Format("FechaNum={0}", dr["FechaNum"])); if (hdr != null) { if (hdr["InicioM"].ToString() == "1") { stringBuilder.AppendFormat("", hdr["DiasMesAnio"], (dr["MinMes"].ToString() == "1" ? " borderleft " : "")); } } else { if (TDiaspersonal.FiltroPrimero(string.Format("Anio={0} AND Mes ={1}", dr["Anio"], dr["Mes"])) != null) { stringBuilder.AppendFormat("", (dr["MinMes"].ToString() == "1" ? " borderleft " : "")); } else { if (dr["MinMes"].ToString() == "1") { stringBuilder.AppendFormat("", dr["DiasMes"]); } } } } return stringBuilder.ToString(); } public string columnapersonal(int dia, DataTable TDiaspersonal) { return string.Format(""); } protected void LnkConsultar_Click(object sender, EventArgs e) { FiltFechaInicio = $"{TxtRpdFechaInicio.Text.ToDateTime():yyyy-MM-dd}"; FiltFechaFin = $"{TxtRpdFechaFin.Text.ToDateTime():yyyy-MM-dd}"; getinfo(); } } public class Registro { public int CvePersonal { get; set; } public string Codigo { get; set; } public string NombreCompleto { get; set; } public DateTime FechaInicio { get; set; } public DateTime FechaFin { get; set; } public DateTime FechaAntiguedad { get; set; } public int Antiguedad { get; set; } public List Ejercicios { get; set; } //public DataTable TDiaspersonal { get; set; } public string ColumnasinicioFin { get; set; } public string ColumnasVacaciones { get; set; } } public class EjercicioInfo { public int Ejercicio { get; set; } public DateTime FechaAntiguedad { get; set; } public int Antiguedad { get; set; } public int DiasVacaciones { get; set; } public int DiasPagados { get; set; } public int DiasDisfrutados { get; set; } }