private void workerCalculo_DoWork(object sender, DoWorkEventArgs e) { cnx = new SqlConnection(cdn); cmd = new SqlCommand(); cmd.Connection = cnx; CalculoNomina.Core.NominaHelper nh = new CalculoNomina.Core.NominaHelper(); nh.Command = cmd; Empleados.Core.EmpleadosHelper eh = new Empleados.Core.EmpleadosHelper(); eh.Command = cmd; Altas.Core.AltasHelper ah = new Altas.Core.AltasHelper(); ah.Command = cmd; Reingreso.Core.ReingresoHelper rh = new Reingreso.Core.ReingresoHelper(); rh.Command = cmd; int estatus = 0; int existeAltaReingreso = 0; #region LISTAS List<CalculoNomina.Core.Nomina> lstConceptosPercepciones = new List<CalculoNomina.Core.Nomina>(); List<CalculoNomina.Core.Nomina> lstConceptosDeducciones = new List<CalculoNomina.Core.Nomina>(); List<CalculoNomina.Core.Nomina> lstConceptosPercepcionesModificados = new List<CalculoNomina.Core.Nomina>(); List<CalculoNomina.Core.Nomina> lstConceptosDeduccionesModificados = new List<CalculoNomina.Core.Nomina>(); #endregion int progreso = 0, total = 0, indice = 0; int existeConcepto = 0; total = dgvEmpleados.Rows.Count; StreamWriter swLog = new StreamWriter(@"C:\Temp\LogHealthTrabajador" + DateTime.Now.Year.ToString() + "_" + DateTime.Now.Month.ToString() + "_" + DateTime.Now.Day.ToString() + "_" + DateTime.Now.Minute.ToString() + ".txt", true); swLog.WriteLine(String.Format("Calculo de Nómina: Del {0} al {1}", periodoInicio.ToShortDateString(), periodoFin.ToShortDateString())); foreach (DataGridViewRow fila in dgvEmpleados.Rows) { try { cnx.Open(); estatus = int.Parse(eh.obtenerEstatus(int.Parse(fila.Cells["idtrabajador"].Value.ToString())).ToString()); cnx.Close(); swLog.WriteLine(String.Format("Empleado: {0}, Estatus: {1}", fila.Cells["idtrabajador"].Value.ToString(), estatus.ToString())); if (estatus == 0) { cnx.Open(); nh.eliminaPreNomina(int.Parse(fila.Cells["idtrabajador"].Value.ToString())); cnx.Close(); swLog.WriteLine(String.Format("Empleado: {0}, Se elimina Prenomina", fila.Cells["idtrabajador"].Value.ToString())); continue; } else { cnx.Open(); existeAltaReingreso = ah.existeAlta(GLOBALES.IDEMPRESA, int.Parse(fila.Cells["idtrabajador"].Value.ToString()), periodoInicioPosterior, periodoFinPosterior); cnx.Close(); swLog.WriteLine(String.Format("Empleado: {0}, Existencia de Alta: {1}, Fecha Inicio: {2}, Fecha Fin: {3} ", fila.Cells["idtrabajador"].Value.ToString(), existeAltaReingreso, periodoInicioPosterior.ToShortDateString(), periodoFinPosterior.ToShortDateString())); if (existeAltaReingreso != 0) { cnx.Open(); nh.eliminaPreNomina(int.Parse(fila.Cells["idtrabajador"].Value.ToString())); cnx.Close(); swLog.WriteLine(String.Format("Empleado: {0}, Se elimina Prenomina", fila.Cells["idtrabajador"].Value.ToString())); continue; } cnx.Open(); existeAltaReingreso = rh.existeReingreso(GLOBALES.IDEMPRESA, int.Parse(fila.Cells["idtrabajador"].Value.ToString()), periodoInicioPosterior, periodoFinPosterior); cnx.Close(); swLog.WriteLine(String.Format("Empleado: {0}, Existencia de Reingreso: {1}, Fecha Inicio: {2}, Fecha Fin: {3} ", fila.Cells["idtrabajador"].Value.ToString(), existeAltaReingreso, periodoInicioPosterior.ToShortDateString(), periodoFinPosterior.ToShortDateString())); if (existeAltaReingreso != 0) { cnx.Open(); nh.eliminaPreNomina(int.Parse(fila.Cells["idtrabajador"].Value.ToString())); cnx.Close(); swLog.WriteLine(String.Format("Empleado: {0}, Se elimina Prenomina", fila.Cells["idtrabajador"].Value.ToString())); continue; } } } catch (Exception error) { MessageBox.Show("Error al verificar el estatus del trabajador: " + fila.Cells["noempleado"].Value.ToString() + "\r\n\r\n" + error.Message, "Error"); cnx.Close(); continue; } progreso = (indice * 100) / total; indice++; if (FLAGPRIMERCALCULO) { workerCalculo.ReportProgress(progreso, "CARGANDO DATOS DE LOS TRABAJADORES. ESPERE A QUE TERMINE EL PROCESO."); } else workerCalculo.ReportProgress(progreso, "CALCULANDO."); #region CONCEPTOS Y FORMULAS DEL TRABAJADOR try { cnx.Open(); nh.eliminaNominaTrabajador(int.Parse(fila.Cells["idtrabajador"].Value.ToString()), periodoInicio.Date, periodoFin.Date, _tipoNomina); lstConceptosPercepciones = nh.conceptosNominaTrabajador(GLOBALES.IDEMPRESA, "P", int.Parse(fila.Cells["idtrabajador"].Value.ToString()), periodoInicio.Date, periodoFin.Date, _periodo); lstConceptosDeducciones = nh.conceptosNominaTrabajador(GLOBALES.IDEMPRESA, "D", int.Parse(fila.Cells["idtrabajador"].Value.ToString()), periodoInicio.Date, periodoFin.Date, _periodo); cnx.Close(); } catch (Exception error) { MessageBox.Show("Error: CONCEPTOS Y FORMULAS DEL TRABAJADOR. Primer Calculo." + " ID Trabajador: " + int.Parse(fila.Cells["idtrabajador"].Value.ToString()) + "\r\n \r\n" + error.Message, "Error"); cnx.Dispose(); return; } #endregion #region CALCULO DE PERCEPCIONES List<CalculoNomina.Core.tmpPagoNomina> lstPercepciones = new List<CalculoNomina.Core.tmpPagoNomina>(); lstPercepciones = CALCULO.PERCEPCIONES(lstConceptosPercepciones, periodoInicio.Date, periodoFin.Date, _tipoNomina); #endregion #region BULK DATOS PERCEPCIONES BulkData(lstPercepciones); #endregion #region OBTENCION DE PERCEPCIONES lstPercepciones = new List<CalculoNomina.Core.tmpPagoNomina>(); CalculoNomina.Core.tmpPagoNomina per = new CalculoNomina.Core.tmpPagoNomina(); per.idempresa = GLOBALES.IDEMPRESA; per.idtrabajador = int.Parse(fila.Cells["idtrabajador"].Value.ToString()); per.fechainicio = periodoInicio.Date; per.fechafin = periodoFin; per.tipoconcepto = "P"; per.tiponomina = _tipoNomina; cnx.Open(); lstPercepciones = nh.obtenerPercepcionesTrabajador(per); cnx.Close(); #endregion #region CALCULO DE DEDUCCIONES List<CalculoNomina.Core.tmpPagoNomina> lstDeducciones = new List<CalculoNomina.Core.tmpPagoNomina>(); lstDeducciones = CALCULO.DEDUCCIONES(lstConceptosDeducciones, lstPercepciones, periodoInicio.Date, periodoFin.Date, _tipoNomina); #endregion #region BULK DATOS DEDUCCIONES BulkData(lstDeducciones); #endregion #region PROGRAMACION DE MOVIMIENTOS List<CalculoNomina.Core.tmpPagoNomina> lstOtrasDeducciones = new List<CalculoNomina.Core.tmpPagoNomina>(); ProgramacionConcepto.Core.ProgramacionHelper pch = new ProgramacionConcepto.Core.ProgramacionHelper(); pch.Command = cmd; decimal percepciones = lstPercepciones.Where(f => f.tipoconcepto == "P").Sum(f => f.cantidad); if (percepciones != 0) { int existe = 0; ProgramacionConcepto.Core.ProgramacionConcepto programacion = new ProgramacionConcepto.Core.ProgramacionConcepto(); programacion.idtrabajador = int.Parse(fila.Cells["idtrabajador"].Value.ToString()); List<ProgramacionConcepto.Core.ProgramacionConcepto> lstProgramacion = new List<ProgramacionConcepto.Core.ProgramacionConcepto>(); try { cnx.Open(); existe = (int)pch.existeProgramacion(programacion); cnx.Close(); } catch (Exception error) { MessageBox.Show("Error: \r\n \r\n" + error.Message, "Error"); cnx.Dispose(); } if (existe != 0) { try { cnx.Open(); lstProgramacion = pch.obtenerProgramacion(programacion); cnx.Close(); } catch (Exception error) { MessageBox.Show("Error: \r\n \r\n" + error.Message, "Error"); cnx.Dispose(); } for (int i = 0; i < lstProgramacion.Count; i++) { if (periodoFin.Date <= lstProgramacion[i].fechafin) { Conceptos.Core.ConceptosHelper ch = new Conceptos.Core.ConceptosHelper(); ch.Command = cmd; Conceptos.Core.Conceptos concepto = new Conceptos.Core.Conceptos(); concepto.id = lstProgramacion[i].idconcepto; List<Conceptos.Core.Conceptos> lstNoConcepto = new List<Conceptos.Core.Conceptos>(); try { cnx.Open(); lstNoConcepto = ch.obtenerConcepto(concepto); cnx.Close(); } catch (Exception error) { MessageBox.Show("Error: \r\n \r\n" + error.Message, "Error"); } CalculoNomina.Core.tmpPagoNomina pne = new CalculoNomina.Core.tmpPagoNomina(); pne.idempresa = GLOBALES.IDEMPRESA; pne.idtrabajador = int.Parse(fila.Cells["idtrabajador"].Value.ToString()); pne.fechainicio = periodoInicio.Date; pne.fechafin = periodoFin.Date; pne.noconcepto = lstNoConcepto[0].noconcepto; try { cnx.Open(); existeConcepto = (int)nh.existeConcepto(pne); cnx.Close(); } catch { MessageBox.Show("Error al obtener la existencia del concepto.", "Error"); cnx.Dispose(); } CalculoNomina.Core.tmpPagoNomina vn = new CalculoNomina.Core.tmpPagoNomina(); vn.idtrabajador = int.Parse(fila.Cells["idtrabajador"].Value.ToString()); vn.idempresa = GLOBALES.IDEMPRESA; vn.idconcepto = lstProgramacion[i].idconcepto; vn.noconcepto = lstNoConcepto[0].noconcepto; vn.tipoconcepto = lstNoConcepto[0].tipoconcepto; vn.fechainicio = periodoInicio.Date; vn.fechafin = periodoFin.Date; vn.exento = 0; vn.gravado = 0; vn.cantidad = lstProgramacion[i].cantidad; vn.guardada = false; vn.tiponomina = _tipoNomina; vn.modificado = false; vn.obracivil = _obracivil; if (lstNoConcepto[0].gravado && !lstNoConcepto[0].exento) { vn.gravado = lstProgramacion[i].cantidad; vn.exento = 0; } if (lstNoConcepto[0].gravado && lstNoConcepto[0].exento) { CalculoFormula formulaExcento = new CalculoFormula(int.Parse(fila.Cells["idtrabajador"].Value.ToString()), periodoInicio.Date, periodoFin.Date, lstNoConcepto[0].formulaexento); vn.exento = decimal.Parse(formulaExcento.calcularFormula().ToString()); if (vn.cantidad <= vn.exento) { vn.exento = vn.cantidad; vn.gravado = 0; } else { vn.gravado = vn.cantidad - vn.exento; } } if (!lstNoConcepto[0].gravado && lstNoConcepto[0].exento) { vn.gravado = 0; vn.exento = lstProgramacion[i].cantidad; } if (existeConcepto == 0) { lstOtrasDeducciones.Add(vn); } else { try { cnx.Open(); nh.actualizaConceptoModificado(vn); cnx.Close(); } catch { MessageBox.Show("Error al actualizar el concepto.", "Error"); cnx.Dispose(); } } } } } } #endregion #region MOVIMIENTOS Movimientos.Core.MovimientosHelper mh = new Movimientos.Core.MovimientosHelper(); mh.Command = cmd; if (percepciones != 0) { int existe = 0; Movimientos.Core.Movimientos mov = new Movimientos.Core.Movimientos(); mov.idtrabajador = int.Parse(fila.Cells["idtrabajador"].Value.ToString()); mov.fechainicio = periodoInicio.Date; mov.fechafin = periodoFin.Date; List<Movimientos.Core.Movimientos> lstMovimiento = new List<Movimientos.Core.Movimientos>(); try { cnx.Open(); existe = (int)mh.existeMovimiento(mov); cnx.Close(); } catch (Exception error) { MessageBox.Show("Error: \r\n \r\n" + error.Message, "Error"); cnx.Dispose(); } if (existe != 0) { try { cnx.Open(); lstMovimiento = mh.obtenerMovimiento(mov); cnx.Close(); } catch (Exception error) { MessageBox.Show("Error: \r\n \r\n" + error.Message, "Error"); cnx.Dispose(); } for (int i = 0; i < lstMovimiento.Count; i++) { Conceptos.Core.ConceptosHelper ch = new Conceptos.Core.ConceptosHelper(); ch.Command = cmd; Conceptos.Core.Conceptos concepto = new Conceptos.Core.Conceptos(); concepto.id = lstMovimiento[i].idconcepto; List<Conceptos.Core.Conceptos> lstNoConcepto = new List<Conceptos.Core.Conceptos>(); try { cnx.Open(); lstNoConcepto = ch.obtenerConcepto(concepto); cnx.Close(); } catch (Exception error) { MessageBox.Show("Error: \r\n \r\n" + error.Message, "Error"); } CalculoNomina.Core.tmpPagoNomina vn = new CalculoNomina.Core.tmpPagoNomina(); vn.idtrabajador = int.Parse(fila.Cells["idtrabajador"].Value.ToString()); ; vn.idempresa = GLOBALES.IDEMPRESA; vn.idconcepto = lstMovimiento[i].idconcepto; vn.noconcepto = lstNoConcepto[0].noconcepto; vn.tipoconcepto = lstNoConcepto[0].tipoconcepto; vn.fechainicio = periodoInicio.Date; vn.fechafin = periodoFin.Date; vn.exento = 0; vn.gravado = 0; vn.cantidad = lstMovimiento[i].cantidad; vn.guardada = false; vn.tiponomina = _tipoNomina; vn.modificado = false; if (lstNoConcepto[0].gravado && !lstNoConcepto[0].exento) { vn.gravado = lstMovimiento[i].cantidad; vn.exento = 0; } if (lstNoConcepto[0].gravado && lstNoConcepto[0].exento) { CalculoFormula formulaExcento = new CalculoFormula(int.Parse(fila.Cells["idtrabajador"].Value.ToString()), periodoInicio.Date, periodoFin.Date, lstNoConcepto[0].formulaexento); vn.exento = decimal.Parse(formulaExcento.calcularFormula().ToString()); if (vn.cantidad <= vn.exento) { vn.exento = vn.cantidad; vn.gravado = 0; } else { vn.gravado = vn.cantidad - vn.exento; } } if (!lstNoConcepto[0].gravado && lstNoConcepto[0].exento) { vn.gravado = 0; vn.exento = lstMovimiento[i].cantidad; } cnx.Open(); existe = (int)nh.existeConcepto(vn); cnx.Close(); if (existe == 0) { lstOtrasDeducciones.Add(vn); } else { cnx.Open(); nh.actualizaConcepto(vn); cnx.Close(); } } } } #endregion #region BULK DATOS PROGRAMACION DE MOVIMIENTOS BulkData(lstOtrasDeducciones); #endregion #region APLICACION DE DEPTOS/PUESTOS Aplicaciones.Core.AplicacionesHelper aplicah = new Aplicaciones.Core.AplicacionesHelper(); aplicah.Command = cmd; Aplicaciones.Core.Aplicaciones aplicacion = new Aplicaciones.Core.Aplicaciones(); aplicacion.periodoinicio = periodoInicio; aplicacion.periodofin = periodoFin; aplicacion.idempresa = GLOBALES.IDEMPRESA; List<Aplicaciones.Core.Aplicaciones> lstAplicaciones = new List<Aplicaciones.Core.Aplicaciones>(); try { cnx.Open(); lstAplicaciones = aplicah.obtenerFechasDeAplicacion(aplicacion); cnx.Close(); } catch (Exception) { throw; } if (lstAplicaciones.Count != 0) { for (int i = 0; i < lstAplicaciones.Count; i++) { Empleados.Core.EmpleadosHelper emph = new Empleados.Core.EmpleadosHelper(); emph.Command = cmd; try { cnx.Open(); emph.actualizaDeptoPuesto(lstAplicaciones[i].iddeptopuesto, lstAplicaciones[i].idtrabajador, lstAplicaciones[i].deptopuesto); aplicah.eliminaAplicacion(lstAplicaciones[i].id); cnx.Close(); } catch (Exception) { MessageBox.Show("Error: Al modificar y/o eliminar el depto/puesto o aplicación.", "Error"); cnx.Dispose(); } } } #endregion } swLog.Close(); #region PERIODO calculoNoPeriodo(); #endregion #region NETOS NEGATIVOS nh = new CalculoNomina.Core.NominaHelper(); nh.Command = cmd; List<CalculoNomina.Core.NetosNegativos> lstNetos; int contadorNetosNegativos = 0; StreamWriter sw = new StreamWriter(@"C:\Temp\NetosNegativos" + periodoInicio.Year.ToString() + "_" + periodoInicio.Month.ToString() + "_" + periodoInicio.Day.ToString() + ".txt", true); foreach (DataGridViewRow fila in dgvEmpleados.Rows) { lstNetos = new List<CalculoNomina.Core.NetosNegativos>(); try { cnx.Open(); lstNetos = nh.obtenerNetosNegativos(GLOBALES.IDEMPRESA, periodoInicio.Date, periodoFin.Date, int.Parse(fila.Cells["idtrabajador"].Value.ToString())); cnx.Close(); decimal sumaPercepciones = lstNetos.Where(n => n.tipoconcepto == "P").Sum(n => n.cantidad); decimal sumaDeducciones = lstNetos.Where(n => n.tipoconcepto == "D").Sum(n => n.cantidad); decimal subsidio = lstNetos.Where(d => d.noconcepto == 16).Sum(d => d.cantidad); decimal netoPagar = 0; sumaPercepciones = sumaPercepciones + subsidio; sumaDeducciones = sumaDeducciones - subsidio; netoPagar = sumaPercepciones - sumaDeducciones; string linea1 = ""; string noEmpleado = "", nombreCompleto = ""; noEmpleado = fila.Cells["noempleado"].Value.ToString(); nombreCompleto = fila.Cells["nombres"].Value.ToString() + " " + fila.Cells["paterno"].Value.ToString() + " " + fila.Cells["materno"].Value.ToString(); if (netoPagar < 0) { contadorNetosNegativos++; linea1 = noEmpleado + ", " + nombreCompleto + ", Cantidad Neta Negativa: " + netoPagar.ToString(); sw.WriteLine(linea1); } } catch (Exception error) { MessageBox.Show("Error: Lista de Netos. \r\n \r\n" + error.Message, "Error"); cnx.Dispose(); } } sw.WriteLine("TOTAL CANTIDADES NEGATIVAS: " + contadorNetosNegativos.ToString()); sw.Close(); if (contadorNetosNegativos != 0) { MessageBox.Show("CANTIDADES NEGATIVAS. VERIFIQUE ARCHIVO EN C:\\Temp\\NetosNegativos" + periodoInicio.Year.ToString() + "_" + periodoInicio.Month.ToString() + "_" + periodoInicio.Day.ToString() + ".txt", "Información"); } #endregion }