public Mensaje calcularVacacionesDevengadasEmpleados(RazonesSociales razonesSociales, ISession uuidCxn, ISession uuidCxnMaestra, bool usaCommit) { Object[,] reglaFactor = null; devengadaActual = new Dictionary <string, VacacionesDevengadas>(); try { inicializaVariableMensaje(); setSession(uuidCxn); getSession().BeginTransaction(); query.Remove(0, query.Length); //Obtiene el control de vacaciones por día query.Append("from ControlVacDeveng o "); query.Append("where o.razonesSociales.clave =:claveRazonsocial "); query.Append("AND o.fecha = (select MAX(o.fecha) from ControlVacDeveng o) "); IQuery q = getSession().CreateQuery(query.ToString()); q.SetParameter("claveRazonsocial", razonesSociales.clave); ControlVacDeveng control = (ControlVacDeveng)q.UniqueResult(); DateTime? fechaUltimDev = null; List <DateTime> diasPendientes = null; if (control == null) { diasPendientes = new List <DateTime>(); diasPendientes.Add(DateTime.Now); } else { fechaUltimDev = control.fecha; diasPendientes = getDaysBetweenDates(fechaUltimDev.GetValueOrDefault(), DateTime.Now); } query.Remove(0, query.Length); int d = 0; ControlVacDeveng controlCalculadas = null; for (d = 0; d < diasPendientes.Count(); d++) { if (diasPendientes.Any()) { //Obtiene empleados que cumplen aniversario en la empresa al día query.Append("select o.plazasPorEmpleado from PlazasPorEmpleadosMov o "); query.Append("where o.id IN (Select MAX(m.id) from PlazasPorEmpleadosMov m "); query.Append("where m.plazasPorEmpleado.razonesSociales.clave =:claveRazonsocial "); query.Append("AND m.plazasPorEmpleado.fechaFinal >= :fechaActual "); query.Append("AND month(o.plazasPorEmpleado.fechaPrestaciones)=month(:fechaActual) "); query.Append("AND day(o.plazasPorEmpleado.fechaPrestaciones)=day(:fechaActual)"); query.Append("group by m.plazasPorEmpleado.empleados.clave)"); IList <PlazasPorEmpleado> plazasEmpleados = null; q = getSession().CreateQuery(query.ToString()); q.SetParameter("claveRazonsocial", razonesSociales.clave); q.SetParameter("fechaActual", diasPendientes[d]); plazasEmpleados = q.List <PlazasPorEmpleado>(); plazasEmpleados = plazasEmpleados == null ? new List <PlazasPorEmpleado>() : plazasEmpleados; query.Remove(0, query.Length); if (plazasEmpleados.Any()) {//Obtiene los factores de integracion if (reglaFactor == null) { query.Append("from TablaDatos o where o.tablaBase.clave = :clave "); query.Append("AND o.id = (SELECT MAX(t.id) FROM TablaDatos t WHERE t.tablaBase.id = o.tablaBase.id)"); setSession(uuidCxnMaestra); getSession().BeginTransaction(); IList <Object> values; q = getSession().CreateQuery(query.ToString()); q.SetParameter("clave", "05"); values = q.List <object>(); values = values == null ? new List <Object>() : values; if (values.Count() > 0) { byte[] convert = ((TablaDatos)values[0]).fileXml; reglaFactor = util.UtilidadesXML.extraeValoresNodos(util.UtilidadesXML.convierteBytesToXML(convert)); } getSession().Transaction.Commit(); query.Remove(0, query.Length); } //Llenar tabla de Vacaciones Devengadas por día VacacionesDevengadas vd = null; setSession(uuidCxn); getSession().BeginTransaction(); for (int i = 0; i < plazasEmpleados.Count(); i++) { Double antiguedad = (Double)calcularAntiguedadExacta(plazasEmpleados[i].fechaPrestaciones.GetValueOrDefault()); //antiguedad.intValue(); //Obtiene vacaciones devengadas por año a ese empleado query.Append("select CASE WHEN (dev IS NULL) THEN 'NOCALCULADA' ELSE 'CALCULADA' END "); query.Append("from VacacionesDevengadas dev where dev.plazasPorEmpleado.id =:idplaza AND dev.ejercicio =:ejercicio"); q = getSession().CreateQuery(query.ToString()); q.SetParameter("idplaza", plazasEmpleados[i].id); q.SetParameter("ejercicio", Convert.ToInt32(antiguedad)); String calculada = (String)q.UniqueResult(); if (calculada == null) { vd = new VacacionesDevengadas(); vd.razonesSociales = plazasEmpleados[i].razonesSociales; vd.empleados = plazasEmpleados[i].empleados; vd.ejercicio = Convert.ToInt32(antiguedad); Object[] factorEmpleado = (Object[])obtieneFactorIntegracion(reglaFactor, Convert.ToInt32(antiguedad)); query.Remove(0, query.Length); query.Append("select MAX(sdi.fecha),sdi.salarioDiarioFijo from SalariosIntegrados sdi WHERE "); query.Append("empleados.id= :idEmpleado AND fecha <= :fechaPrestacion GROUP BY sdi.salarioDiarioFijo"); q = getSession().CreateQuery(query.ToString()); q.SetParameter("idEmpleado", plazasEmpleados[i].empleados.id); q.SetParameter("fechaPrestacion", plazasEmpleados[i].fechaPrestaciones.GetValueOrDefault().Date); Object[] salarioAniv = (Object[])q.UniqueResult(); if (salarioAniv == null) { vd.salarioAniversario = 0.0; } else { vd.salarioAniversario = ((Double)salarioAniv[1]); } vd.factorPrima = Double.Parse(factorEmpleado[4].ToString()); vd.diasVacaciones = int.Parse(factorEmpleado[3].ToString()); vd.registroInicial = false; double primaVac = Double.Parse(factorEmpleado[4].ToString()) / 100 * int.Parse(factorEmpleado[3].ToString()); vd.diasPrimaVaca = primaVac; getSession().Save(vd); devengadaActual[plazasEmpleados[i].empleados.clave] = vd; } query.Remove(0, query.Length); } } } controlCalculadas = new ControlVacDeveng(); controlCalculadas.fecha = diasPendientes[d]; controlCalculadas.razonesSociales = razonesSociales;//razon getSession().Save(controlCalculadas); } if (usaCommit) { getSession().Transaction.Commit(); } mensajeResultado.resultado = true; mensajeResultado.noError = 0; mensajeResultado.error = ""; } catch (HibernateException ex) { try { if (getSession().Transaction.IsActive) { getSession().Transaction.Rollback(); } mensajeResultado.noError = ControlErroresEntity.buscaNoErrorPorExcepcion(ex); mensajeResultado.error = ex.GetBaseException().Message; } catch (HibernateException exc) { mensajeResultado.noError = ControlErroresEntity.buscaNoErrorPorExcepcion(exc); mensajeResultado.error = exc.GetBaseException().Message; } mensajeResultado.resultado = null; } return(mensajeResultado); }
public Mensaje calcularVacacionesDevengadasEmpleados(RazonesSociales razonesSociales, object[,] factorIntegracion, DBContextSimple dbContextSimple, DBContextMaster dbContextMaestra, bool usaCommit) { Object[,] reglaFactor = factorIntegracion; bool usoBDMaestra = false; devengadaActual = new Dictionary <string, VacacionesDevengadas>(); try { //inicializaVariableMensaje(); //if (dbContextSimple == null) //{ // setSession(dbContext); //} //else //{ // setSession(dbContextSimple); //} // dbContextSimple.Database.BeginTransaction(); ControlVacDeveng control = (from c in dbContextSimple.Set <ControlVacDeveng>() where c.razonesSociales.clave == razonesSociales.clave && c.fecha == (from ct in dbContextSimple.Set <ControlVacDeveng>() select new { ct.fecha }).Max(p => p.fecha) select c).SingleOrDefault(); DateTime fechaUltimDev; List <DateTime> diasPendientes = null; if (control == null) { diasPendientes = new List <DateTime>(); diasPendientes.Add(DateTime.Now); } else { fechaUltimDev = Convert.ToDateTime(control.fecha); diasPendientes = getDaysBetweenDates(fechaUltimDev, new DateTime()); } int d = 0; ControlVacDeveng controlCalculadas = null; for (d = 0; d < diasPendientes.Count; d++) { if (diasPendientes.Count > 0) { //Obtiene empleados que cumplen aniversario en la empresa al día List <PlazasPorEmpleado> plazasEmpleados = null; DateTime fechapen = diasPendientes[d]; plazasEmpleados = (from o in dbContextSimple.Set <PlazasPorEmpleadosMov>() where (from m in dbContextSimple.Set <PlazasPorEmpleadosMov>() where m.plazasPorEmpleado.razonesSociales.clave == razonesSociales.clave && m.plazasPorEmpleado.fechaFinal >= fechapen && o.plazasPorEmpleado.fechaPrestaciones.Value.Month == fechapen.Month && o.plazasPorEmpleado.fechaPrestaciones.Value.Day == fechapen.Day group new { m.plazasPorEmpleado.empleados, m } by new { m.plazasPorEmpleado.empleados.clave } into g select new { Column1 = g.Max(p => p.m.id) }).Contains(new { Column1 = o.id }) select o.plazasPorEmpleado).ToList(); plazasEmpleados = plazasEmpleados == null ? new List <PlazasPorEmpleado>() : plazasEmpleados; if (plazasEmpleados.Count > 0) { if (reglaFactor == null) {//Obtiene los factores de integracion usoBDMaestra = true; //if (dbContextMaster == null) //{ // setSession(dbContext); //} //else //{ // setSession(dbContextMaster); //} List <TablaDatos> values; values = (from o in dbContextMaster.Set <TablaDatos>() where o.tablaBase.clave == ClavesParametrosModulos.claveTipoTablaFactorIntegracion.ToString() && o.id == (from t in dbContextMaster.Set <TablaDatos>() where t.tablaBase.id == o.tablaBase.id select new { t.id }).Max(p => p.id) select o).ToList(); values = values == null ? new List <TablaDatos>() : values; if (values.Count > 0) { byte[] convert = ((TablaDatos)values[0]).fileXml; XDocument doc = UtilidadesXML.convierteBytesToXML(convert); reglaFactor = UtilidadesXML.extraeValoresNodos(doc); } } //Llenar tabla de Vacaciones Devengadas por día VacacionesDevengadas vd = null; if (usoBDMaestra) { if (dbContextSimple == null) { setSession(dbContextSimple); } else { getSession().Database.Connection.Close(); setSession(dbContextSimple); } } for (int i = 0; i < plazasEmpleados.Count; i++) { Double antiguedad = (Double)calcularAntiguedadExacta(Convert.ToDateTime(plazasEmpleados[i].fechaPrestaciones)); //Obtiene vacaciones devengadas por año a ese empleado VacacionesDevengadas vaca = (from a in dbContextSimple.Set <VacacionesDevengadas>() where a.empleados.id == plazasEmpleados[i].empleados.id && a.ejercicio == Convert.ToInt32(antiguedad) select a).SingleOrDefault(); if (vaca == null) { vd = new VacacionesDevengadas(); vd.razonesSociales = plazasEmpleados[i].razonesSociales; vd.empleados = plazasEmpleados[i].empleados; vd.ejercicio = Convert.ToInt32(antiguedad); Object[] factorEmpleado = (Object[])obtieneFactorIntegracion(reglaFactor, Convert.ToInt32(antiguedad)); Object[] salarioAniv = (from sdi in dbContextSimple.Set <SalariosIntegrados>() where sdi.empleados.id == plazasEmpleados[i].empleados.id && sdi.fecha <= plazasEmpleados[i].fechaPrestaciones group sdi by new { sdi.salarioDiarioFijo } into g select new { Column1 = g.Max(p => p.fecha), g.Key.salarioDiarioFijo }).ToArray(); if (salarioAniv == null) { vd.salarioAniversario = 0.0; } else { vd.salarioAniversario = (double)salarioAniv[1]; } vd.factorPrima = Convert.ToDouble(factorEmpleado[4].ToString()); vd.diasVacaciones = Convert.ToInt32(factorEmpleado[3].ToString()); vd.registroInicial = false; double primaVac = Convert.ToDouble(factorEmpleado[4].ToString()) / 100 * Convert.ToInt32(factorEmpleado[3].ToString()); vd.diasPrimaVaca = primaVac; dbContextSimple.Set <VacacionesDevengadas>().Add(vd); devengadaActual.Add(plazasEmpleados[i].empleados.clave, vd); } } } } controlCalculadas = new ControlVacDeveng(); controlCalculadas.fecha = diasPendientes[d]; controlCalculadas.razonesSociales_ID = razonesSociales.id; dbContextSimple.Set <ControlVacDeveng>().Add(controlCalculadas); dbContextSimple.SaveChanges(); } if (usaCommit) { dbContextSimple.Database.CurrentTransaction.Commit(); } mensajeResultado.resultado = true; mensajeResultado.noError = 0; mensajeResultado.error = ""; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(concatena.Remove(0, concatena.Length).Append(msgError).Append("calcularVacacionesDevengadasEmpleados()1_Error: ").Append(ex)); mensajeResultado.noError = ControlErroresEntity.buscaNoErrorPorExcepcion(ex); mensajeResultado.error = ex.GetBaseException().ToString(); mensajeResultado.resultado = null; dbContextSimple.Database.CurrentTransaction.Rollback(); } return(mensajeResultado); }