/// <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; }