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);
        }
Exemple #2
0
        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);
        }