Ejemplo n.º 1
0
        /// <summary>
        /// Metodo que genera las cuotas imss -
        /// NOM_Nomina - para obetener los datos de la nomina como Id, SD, SDI, dias laborados,
        /// </summary>
        /// <param name="nomina"></param>
        /// <param name="zsalarial"></param>
        /// <param name="primaRiesgo"></param>
        /// <param name="finiquito"></param>
        private static NOM_Cuotas_IMSS CuotasImss2(decimal salarioMinimoGeneral, decimal uma, decimal?primaRiesgo, NOM_Nomina nomina = null, NOM_Finiquito finiquito = null, bool usarUMA = true, int diasDelPeriodo = 0, int permisosSinG = 0)
        {
            //Relativo Patron = 0 dias laborados de un colaborador que aun esta dado de alta

            //PARAMETROS DE CONFIGURACION
            _usarUMAParaCalculo = usarUMA;

            //A) FACTOR VECES SALARIO MINIMO
            var factorSalarioMinimoGeneralVigente = _nominasDao.GetValorParametrosConfig(ParametrosDeConfiguracion.FSMGV); //para obtener el numero de veces del Salario minimo

            if (factorSalarioMinimoGeneralVigente != null)
            {
                if (factorSalarioMinimoGeneralVigente != null)
                {
                    _factorVeces = (int)factorSalarioMinimoGeneralVigente.ValorInt;//al momento del desarrollo es 3
                }
            }

            //validacion
            if (nomina == null && finiquito == null)
            {
                return(null);
            }
            //si ambos objetos contienen datos
            //la prioridad es nomina - entonces finiquito seteamos a null
            if (nomina != null)
            {
                finiquito = null;
            }

            //Anteriormente se obtenia los dias Laborados del finiquito, pero se cambio a que sean los dias del periodo -> solitud por alondra
            _diasLaborados = nomina?.Dias_Laborados ?? diasDelPeriodo;//finiquito.DiasLaborados;// aqui cambiar por los dias de periodicidad de pago en el contrato - incidencias
            _zonaSalarial  = _usarUMAParaCalculo == true ? uma : salarioMinimoGeneral;

            _SDI = nomina?.SDI ?? finiquito.SDI;

            _idNomina    = nomina?.IdNomina ?? 0;        //si el metodo es ejecutado desde el procesado de la nomina, se toma el idNomina
            _idFiniquito = finiquito?.IdFiniquito ?? 0;  //si el metodo es ejecuta desde el procesado del finiquito, se toma el id del finiquito sino se inicializa a cero
            _SD          = nomina?.SD ?? finiquito.SD;
            _sbc         = nomina?.SBC ?? finiquito.SBC; // Salario Base de Cotizacion

            var tablaImss = _nominasDao.GeTablaImss();

            //Regla PS - se concidera los Permiso sin Goce para el calculo de las cuotas
            if (nomina != null && permisosSinG > 0)
            {
                //validamos si los dias de PS son igual que los dias del periodo
                //es decir que tiene Permisos sin goce en todo los dias de la nomina

                if (permisosSinG == diasDelPeriodo)
                {
                    _diasLaborados = 0;//se consideran como faltas y el pago de las cuotas las pagará el patron
                }
                else
                {
                    _diasLaborados += permisosSinG;//? si son 15 dias de PS se calculará la parte obrera y patron ?  es decir, lo no absorvera el patron el total?
                }
            }


            //Si los dias laborados es igual a cero
            //entonces se toma el dia del periodo, para el cálculo de los relativos que se cobrará al patron
            if (_diasLaborados == 0)
            {
                _diasLaborados   = diasDelPeriodo;
                relativoPatronal = true;
            }



            //1) Cuota fija
            #region CUOTA FIJA

            //1   Especie - Cuota Fija    20.400  0.000
            var itemCutoaFija = tablaImss.FirstOrDefault(x => x.IdIMSS == 1);

            var cuotaFija = _diasLaborados * _zonaSalarial;

            if (itemCutoaFija != null)
            {
                _cuotaFijaPatron = cuotaFija * (itemCutoaFija.Patron / 100);
            }

            #endregion

            //Excedentes
            #region EXCEDENTES
            //se busca el registro en la bd para obtener los porcentajes Patron-Obrero
            var itemExcedente = tablaImss.FirstOrDefault(x => x.IdIMSS == 2);

            if (itemExcedente != null)
            {
                _smgv = _zonaSalarial * _factorVeces; // Salario Minimo General Vigente o UMA

                decimal R1P = 0;
                decimal R2O = 0;

                if (_smgv > _sbc)
                {
                    R1P = 0;
                }
                else
                {
                    R1P = ((_sbc - _smgv) * (itemExcedente.Patron / 100)) * _diasLaborados;
                    R2O = ((_sbc - _smgv) * (itemExcedente.Obrero / 100)) * _diasLaborados;
                }
                _excedentePatron = R1P;
                _excedenteObrero = R2O;

                //               decimal R2P = 0;
                //decimal R2O = 0;

                //    //Calcular Excedente Patron
                //    R2P = R1P * (itemExcedente.Patron / 100);
                //    _excedentePatron = R2P * _diasLaborados;

                //    if (_excedentePatron < 0)
                //    {
                //        _excedentePatron = 0;
                //    }
                //    //Calcular Exedente Obrero
                //    R2O = R1P * (itemExcedente.Obrero / 100);
                //    _excedenteObrero = R2O * _diasLaborados;
                //    if (_excedenteObrero < 0)
                //    {
                //        _excedenteObrero = 0;
                //    }
            }

            #endregion

            //3) Prestaciones en Dinero
            #region PRESTACIONES EN DINERO

            var itemPrestacionesDinero = tablaImss.FirstOrDefault(x => x.IdIMSS == 3);

            if (itemPrestacionesDinero != null)
            {
                _prestacionesDineroPatron = (_sbc * (itemPrestacionesDinero.Patron / 100)) * _diasLaborados;
                _prestacionesDineroObrero = (_sbc * (itemPrestacionesDinero.Obrero / 100)) * _diasLaborados;
            }

            #endregion

            //4) Pensionados y Beneficiados
            #region PENSIONADOS Y BENEFICIADOS

            var itemPensionados = tablaImss.FirstOrDefault(x => x.IdIMSS == 4);

            if (itemPensionados != null)
            {
                _pencionadosBeneficiadosPatron = (_sbc * (itemPensionados.Patron / 100)) * _diasLaborados;
                _pencionadosBeneficiadosObrero = (_sbc * (itemPensionados.Obrero / 100)) * _diasLaborados;
            }

            #endregion

            //5) Invalidez y Vida
            #region INVALIDEZ Y VIDA

            var itemIvalidez = tablaImss.FirstOrDefault(x => x.IdIMSS == 5);

            if (itemIvalidez != null)
            {
                _invalidezVidaPatron = (_sbc * (itemIvalidez.Patron / 100)) * _diasLaborados;
                _invalidezVidaObrero = (_sbc * (itemIvalidez.Obrero / 100)) * _diasLaborados;
            }

            #endregion

            //6) Guarderia
            #region GUARDERÍA

            var itemGuardería = tablaImss.FirstOrDefault(x => x.IdIMSS == 6);

            if (itemGuardería != null)
            {
                _guarderiasPatron = (_sbc * (itemGuardería.Patron / 100)) * _diasLaborados;
            }

            #endregion

            //7) Seguro de Retiro
            #region SEGURO DE RETIRO

            var itemSeguro = tablaImss.FirstOrDefault(x => x.IdIMSS == 7);

            if (itemSeguro != null)
            {
                _seguroRetiroPatron = (_sbc * (itemSeguro.Patron / 100)) * _diasLaborados;
            }

            #endregion

            //8) Cesantía y Vejez
            #region CESANTÍA Y VEJEZ

            var itemCesantia = tablaImss.FirstOrDefault(x => x.IdIMSS == 8);

            if (itemCesantia != null)
            {
                _cesantiaVejezPatron = (_sbc * (itemCesantia.Patron / 100)) * _diasLaborados;
                _cesantiaVejezObrero = (_sbc * (itemCesantia.Obrero / 100)) * _diasLaborados;
            }

            #endregion

            //9) Infonavit
            #region INFONAVIT

            var itemInfonavit = tablaImss.FirstOrDefault(x => x.IdIMSS == 9);

            if (itemInfonavit != null)
            {
                _infonavitPatron = (_sbc * (itemInfonavit.Patron / 100)) * _diasLaborados;
            }

            #endregion

            //10) Riesgo de Trabajo
            #region RIESGO DE TRABAJO

            var riesgoTrabajo = primaRiesgo ?? 0;

            _riesgoTrabajoPatron = (_sbc * ((decimal)riesgoTrabajo / 100)) * _diasLaborados;

            #endregion

            //Sumatoria
            #region TOTAL PATRON, TOTAL OBRERO
            //Si el Salario Diario es menor o igual al SMG las cuotas del obrero lo pagará el patron
            if (_SD <= salarioMinimoGeneral)
            {
                _totalPatron = _cuotaFijaPatron + _excedentePatron + _prestacionesDineroPatron +
                               _pencionadosBeneficiadosPatron +
                               _invalidezVidaPatron + _guarderiasPatron + _seguroRetiroPatron + _cesantiaVejezPatron +
                               _infonavitPatron + _riesgoTrabajoPatron + _excedenteObrero + _prestacionesDineroObrero + _pencionadosBeneficiadosObrero +
                               _invalidezVidaObrero + _cesantiaVejezObrero;

                _totalObrero = 0;
            }
            else
            {
                _totalObrero = _excedenteObrero + _prestacionesDineroObrero + _pencionadosBeneficiadosObrero +
                               _invalidezVidaObrero + _cesantiaVejezObrero; _totalPatron = _cuotaFijaPatron + _excedentePatron + _prestacionesDineroPatron +
                                                                                           _pencionadosBeneficiadosPatron +
                                                                                           _invalidezVidaPatron + _guarderiasPatron + _seguroRetiroPatron + _cesantiaVejezPatron +
                                                                                           _infonavitPatron + _riesgoTrabajoPatron;

                _totalObrero = _excedenteObrero + _prestacionesDineroObrero + _pencionadosBeneficiadosObrero +
                               _invalidezVidaObrero + _cesantiaVejezObrero;
            }


            #endregion

            //Si el Salario diario es igual o menor al salario minimo
            // las cuota las paga el patron.
            // O si los dias laborados es cero, pero el colaborar esta activo las cuotas las paga el patron
            if (_SD <= salarioMinimoGeneral || relativoPatronal == true)
            {
                var cuotasImss = new NOM_Cuotas_IMSS()
                {
                    IdCuota                       = 0,
                    IdNomina                      = nomina?.IdNomina ?? 0,
                    IdFiniquito                   = finiquito?.IdFiniquito ?? 0,
                    Cuota_Fija_Patron             = Utils.TruncateDecimales(_cuotaFijaPatron),
                    Excedente_Patron              = Utils.TruncateDecimales((_excedentePatron + _excedenteObrero)),
                    Excedente_Obrero              = 0,
                    PrestacionesDinero_Patron     = Utils.TruncateDecimales((_prestacionesDineroPatron + _prestacionesDineroObrero)),
                    PrestacionesDinero_Obrero     = 0,
                    Pensionados_Patron            = Utils.TruncateDecimales((_pencionadosBeneficiadosPatron + _pencionadosBeneficiadosObrero)),
                    Pensionados_Obrero            = 0,
                    InvalidezVida_Patron          = Utils.TruncateDecimales((_invalidezVidaPatron + _invalidezVidaObrero)),
                    InvalidezVida_Obrero          = 0,
                    GuarderiasPrestaciones_Patron = Utils.TruncateDecimales(_guarderiasPatron),
                    SeguroRetiro_Patron           = Utils.TruncateDecimales(_seguroRetiroPatron),
                    CesantiaVejez_Patron          = Utils.TruncateDecimales((_cesantiaVejezPatron + _cesantiaVejezObrero)),
                    CesantiaVejez_Obrero          = 0,
                    Infonavit_Patron              = Utils.TruncateDecimales(_infonavitPatron),
                    RiesgoTrabajo_Patron          = Utils.TruncateDecimales(_riesgoTrabajoPatron),
                    TotalPatron                   = Utils.TruncateDecimales(_totalPatron),
                    TotalObrero                   = Utils.TruncateDecimales(_totalObrero)
                };
                // _nominasDao.AddCuotasImss(cuotasImss);

                return(cuotasImss);
            }
            else
            {
                var cuotasImss = new NOM_Cuotas_IMSS()
                {
                    IdCuota                       = 0,
                    IdNomina                      = nomina?.IdNomina ?? 0,
                    IdFiniquito                   = finiquito?.IdFiniquito ?? 0,
                    Cuota_Fija_Patron             = Utils.TruncateDecimales(_cuotaFijaPatron),
                    Excedente_Patron              = Utils.TruncateDecimales(_excedentePatron),
                    Excedente_Obrero              = Utils.TruncateDecimales(_excedenteObrero),
                    PrestacionesDinero_Patron     = Utils.TruncateDecimales(_prestacionesDineroPatron),
                    PrestacionesDinero_Obrero     = Utils.TruncateDecimales(_prestacionesDineroObrero),
                    Pensionados_Patron            = Utils.TruncateDecimales(_pencionadosBeneficiadosPatron),
                    Pensionados_Obrero            = Utils.TruncateDecimales(_pencionadosBeneficiadosObrero),
                    InvalidezVida_Patron          = Utils.TruncateDecimales(_invalidezVidaPatron),
                    InvalidezVida_Obrero          = Utils.TruncateDecimales(_invalidezVidaObrero),
                    GuarderiasPrestaciones_Patron = Utils.TruncateDecimales(_guarderiasPatron),
                    SeguroRetiro_Patron           = Utils.TruncateDecimales(_seguroRetiroPatron),
                    CesantiaVejez_Patron          = Utils.TruncateDecimales(_cesantiaVejezPatron),
                    CesantiaVejez_Obrero          = Utils.TruncateDecimales(_cesantiaVejezObrero),
                    Infonavit_Patron              = Utils.TruncateDecimales(_infonavitPatron),
                    RiesgoTrabajo_Patron          = Utils.TruncateDecimales(_riesgoTrabajoPatron),
                    TotalPatron                   = Utils.TruncateDecimales(_totalPatron),
                    TotalObrero                   = Utils.TruncateDecimales(_totalObrero)
                };
                //   _nominasDao.AddCuotasImss(cuotasImss);
                return(cuotasImss);
            }

            //if (relativoPatronal != true)
            //{
            //    //Guardar el concepto en detalle de la nomina
            //    MDeducciones.Imss(_totalObrero, idNomina: _idNomina, idFiniquito: _idFiniquito);
            //}
            //else
            //{
            //    _totalObrero = 0;
            //}


            ////Obeto utilizado en el metodo del procesado para la sumatoria de la nomina con los demas conceptos
            //var totalConcepto = new TotalConcepto
            //{
            //    Total = _totalObrero,
            //    ImpuestoSobreNomina = 0,
            //    TotalObligaciones = 0
            //};

            //return totalConcepto;
        }