Esempio n. 1
0
        public static List <NOM_Nomina_Detalle> HorasExtras(NOM_Nomina nomina, decimal salarioMin, NOM_PeriodosPago periodoPago, bool isImpuestoSobreNomina = false, decimal porcentaje = 0)
        {
            decimal sd           = nomina.SD;
            decimal limiteExento = 0;
            int     horasExtras  = 0;

            decimal valorDobles  = 0;
            decimal valorTriples = 0;

            int horasDobles  = 0;
            int horasTriples = 0;

            int diasD = 0;
            int diasT = 0;
            int tipo  = 0;

            decimal isnDobles  = 0;
            decimal isnTriples = 0;

            List <NOM_Nomina_Detalle> listaDetalles = new List <NOM_Nomina_Detalle>();

            //GetData()
            //Validar el rango de fechas del periodo
            //Recibo
            //integrar al xml

            //Para obtener los dias, no solo sera con el count sino revisar que no sean las mismas fechas

            List <HorasExtrasEmpleado> listaGeneral = NominasDao.GetHorasExtras(nomina.IdEmpleado, periodoPago);

            listaGeneral = listaGeneral.OrderBy(x => x.Fecha).ToList();

            if (listaGeneral.Count <= 0)
            {
                return(null);
            }

            List <HorasExtrasEmpleado> listaSimples = listaGeneral.Where(x => x.Simples == true).ToList();

            List <HorasExtrasEmpleado> listaDobleTriples = listaGeneral.Where(x => x.Simples == false).ToList();

            #region SIMPLES

            if (listaSimples.Count > 0)
            {
                int horasTotalesSimples = 0;

                horasTotalesSimples = listaSimples.Sum(x => x.Horas);

                //limte exento
                decimal limiteExentoSimple = salarioMin * 5;

                decimal gravadoSimple1     = 0;
                decimal exentoSimple       = 0;
                decimal gravadoSimple2     = 0;
                decimal totalGravadoSimple = 0;
                decimal mitadSimple        = 0;
                decimal totalSimples       = 0;
                int     diasSimples        = 0;
                decimal isnSimples         = 0;

                diasSimples = listaSimples.Select(x => x.Fecha).Distinct().Count();;

                totalSimples = sd * horasTotalesSimples;

                mitadSimple = totalSimples / 2;

                //gravado 1
                gravadoSimple1 = mitadSimple;

                //gravado 2
                if (mitadSimple > limiteExentoSimple)
                {
                    gravadoSimple2 = mitadSimple;
                }
                else
                {
                    //exento
                    exentoSimple = mitadSimple;
                }

                totalGravadoSimple = gravadoSimple1 + gravadoSimple2;

                isnSimples = totalSimples * porcentaje;

                NOM_Nomina_Detalle itemS = new NOM_Nomina_Detalle()
                {
                    Id                  = 0,
                    IdNomina            = nomina.IdNomina,
                    IdConcepto          = 14,
                    Total               = Utils.TruncateDecimales(totalSimples),
                    GravadoISR          = Utils.TruncateDecimales(totalGravadoSimple),
                    ExentoISR           = exentoSimple,
                    IntegraIMSS         = 0,
                    ImpuestoSobreNomina = isnSimples, //genera impuesto sobre nomina ?
                    Complemento         = false,
                    DiasHE              = diasSimples,
                    TipoHE              = 3,
                    HorasE              = horasTotalesSimples
                };

                if (itemS.Total > 0)
                {
                    listaDetalles.Add(itemS);
                }
            }

            #endregion

            #region HORAS DOBLES TRIPLES

            if (listaDobleTriples.Count > 0)
            {
                int horasTotales = listaDobleTriples.Sum(x => x.Horas);

                if (horasTotales > 9) //
                {
                    int cont = 0;
                    int indx = 1;

                    DateTime hold        = new DateTime(1999, 1, 1);
                    int      diasDoble   = 0;
                    int      diasTriples = 0;

                    foreach (var item in listaDobleTriples)
                    {
                        if (hold != item.Fecha && cont < 9)
                        {
                            hold = item.Fecha;
                            //incrementa dias d y cont
                            diasDoble++;
                            cont += item.Horas;

                            if (cont > 9)
                            {
                                diasTriples++;
                            }
                        }
                        else if (cont <= 9)
                        {
                            //solo incrementa cont
                            cont += item.Horas;

                            if (cont > 9)
                            {
                                diasTriples++;
                            }
                        }
                        else if (hold != item.Fecha && cont > 9)
                        {
                            hold = item.Fecha;
                            //incrementa dias t y cont
                            diasTriples++;
                            cont += item.Horas;
                        }
                        else
                        {
                            //solo incrementa cont
                            cont += item.Horas;
                        }
                        //    cont = item.Horas;
                        //if (cont < 9)
                        //{
                        //    indx++;
                        //}
                        //else
                        //{
                        //    diasD = indx;
                        //    break;
                        //}
                    }

                    //diasT = listaDobleTriples.Count - diasD;
                    diasD = diasDoble;
                    diasT = diasTriples;

                    horasDobles  = 9;
                    horasTriples = horasTotales - 9;
                }
                else
                {
                    diasD       = listaDobleTriples.Select(x => x.Fecha).Distinct().Count();
                    horasDobles = horasTotales;
                }

                //limte exento
                limiteExento = salarioMin * 5;

                valorDobles  = 2 * sd;
                valorTriples = 3 * sd;

                //total horas dobles
                decimal totalDobles = horasDobles * valorDobles;

                //total horas triples
                decimal totalTriples = horasTriples * valorTriples;

                //total a pagat
                decimal totalPago = totalDobles + totalTriples;

                //GRAVADOS
                //DIVIDMOS EN DOS LAS PARTE DE LAS HORAS DOBLES
                decimal gravado2     = 0;
                decimal exento       = 0;
                decimal gravado1     = 0;
                decimal totalGravado = 0;

                decimal mitadDobles = totalDobles / 2;

                //gravado 1
                gravado1 = mitadDobles;

                //gravado 2
                if (mitadDobles > limiteExento)
                {
                    gravado2 = mitadDobles;
                }
                else
                {
                    //exento
                    exento = mitadDobles;
                }

                totalGravado = gravado1 + gravado2;

                //1 dobles
                //2 triples
                //3 simples
                isnDobles = totalDobles * porcentaje;
                NOM_Nomina_Detalle itemD = new NOM_Nomina_Detalle()
                {
                    Id                  = 0,
                    IdNomina            = nomina.IdNomina,
                    IdConcepto          = 14,
                    Total               = Utils.TruncateDecimales(totalDobles),
                    GravadoISR          = Utils.TruncateDecimales(totalGravado),
                    ExentoISR           = exento,
                    IntegraIMSS         = 0,
                    ImpuestoSobreNomina = isnDobles, //genera impuesto sobre nomina ?
                    Complemento         = false,
                    DiasHE              = diasD,
                    TipoHE              = 1,
                    HorasE              = horasDobles
                };

                isnTriples = totalTriples * porcentaje;
                NOM_Nomina_Detalle itemT = new NOM_Nomina_Detalle()
                {
                    Id                  = 0,
                    IdNomina            = nomina.IdNomina,
                    IdConcepto          = 14,
                    Total               = Utils.TruncateDecimales(totalTriples),
                    GravadoISR          = Utils.TruncateDecimales(totalTriples),
                    ExentoISR           = 0,
                    IntegraIMSS         = 0,
                    ImpuestoSobreNomina = isnTriples, //genera impuesto sobre nomina ?
                    Complemento         = false,
                    DiasHE              = diasT,
                    TipoHE              = 2,
                    HorasE              = horasTriples
                };

                if (itemD.Total > 0)
                {
                    listaDetalles.Add(itemD);
                }
                if (itemT.Total > 0)
                {
                    listaDetalles.Add(itemT);
                }
            }

            #endregion

            return(listaDetalles);
        }