//Método llamado desde la aplicacion web public static void ProcesaAusencias(DateTime fechaini, DateTime fechafin, bool AutoPro = true) { IConfiguration config = ConfigHelper.GetConfiguration(); if (!AutoPro) { string carpetaDestino = config["RutaFileTemp"]; string remoteFile = config["FileAbsentismos"]; string fileName = remoteFile.Substring(remoteFile.LastIndexOf("/") + 1); _listaAbsentismo = ProcessAbsentismosWorkbook(carpetaDestino + "\\" + fileName); } //Recorro todos empleados de TBL_EMPLEADOS para consultar sus ausencias try { int maxidProceso; DateTime fechIniProceso = DateTime.Now; var context = new SINCRODEDBContext(); { var employees = context.TblEmpleados.ToList(); maxidProceso = context.TblProcesos.Any() ? context.TblProcesos.Max(p => p.IdPro) : 0; //Inserto el proceso var proceso = new TblProcesos() { IdPro = ++maxidProceso, FechaIniPro = fechIniProceso, FechaFinPro = DateTime.Now, EmpleadosPro = employees.Count, ErroresPro = 0, AutoPro = AutoPro, RegistrosPro = 0, TipoPro = false }; context.TblProcesos.Add(proceso); int maxIdAbs = context.TblAbsentismoProcesado.Any() ? context.TblAbsentismoProcesado.Max(p => p.IdAbs) : 0; int ausenciasCount = 0; foreach (var employee in employees) { { #region Obtener Ausencias var ausenciasEmpleado = from a in _listaAbsentismo where a.NifDni == employee.DniEmp && a.FechaFin.HasValue && ((a.FechaInicio >= fechaini && a.FechaInicio <= fechafin) || (a.FechaFin.Value >= fechaini && a.FechaFin.Value <= fechafin)) select new AusenciaEmpleado { DNI = a.NifDni, FechaInicio = a.FechaInicio, FechaFin = a.FechaFin, CodAusencia = a.CodAusencia }; #endregion #region Salvar Ausencias en la tabla TBL_ABSENTISMOPROCESADO foreach (var ausencia in ausenciasEmpleado) { //TODO depende de la base de datos Dassnet //Para cada empleado inserto el marcaje var absentismoProcesado = new TblAbsentismoProcesado() { IdAbs = ++maxIdAbs, IdEmp = employee.IdEmp, DniEmp = employee.DniEmp, IdPro = maxidProceso, FechaInicio = ausencia.FechaInicio, FechaFin = ausencia.FechaFin, CodAusencia = ausencia.CodAusencia }; context.TblAbsentismoProcesado.Add(absentismoProcesado); ausenciasCount++; } } } Log("Salvando los datos de absentismos"); context.SaveChanges(); Log("Salvados " + ausenciasCount + " ausencias"); //Llamar al ws de Evalos para enviar las ausencias SendAusenciaToWS(context, maxidProceso, fechIniProceso); } #endregion } catch (Exception ex) { Log("#region Salvando en la tabla de ausencias: " + ex.ToString()); } }
//Método llamado cuando el sincrode está en producción de forma automática public static void ProcesaMarcajes() { IConfiguration config = ConfigHelper.GetConfiguration(); //Recorro todos empleados de TBL_EMPLEADOS para consultar su marcaje try { int maxidProceso; DateTime fechIniProceso = DateTime.Now; using (var context = new SINCRODEDBContext()) { var employees = context.TblEmpleados.ToList(); //Tomo los datos necesarios para iniciar el proceso y salvarlo al final de procesar todos los marcajes DateTime lastdateprocess = context.TblProcesos.Any(p => p.TipoPro) ? context.TblProcesos.Where(p => p.TipoPro).Max(p => p.FechaIniPro) : new DateTime(2019, 10, 1); maxidProceso = context.TblProcesos.Any() ? context.TblProcesos.Max(p => p.IdPro) : 0; string fechaIni = string.Format("{0}{1}{2}{3}{4}{5}", lastdateprocess.Year, lastdateprocess.Month.ToString().PadLeft(2, '0'), lastdateprocess.Day.ToString().PadLeft(2, '0'), lastdateprocess.Hour.ToString().PadLeft(2, '0'), lastdateprocess.Minute.ToString().PadLeft(2, '0'), lastdateprocess.Second.ToString().PadLeft(2, '0')); string fechaFin = string.Format("{0}{1}{2}{3}{4}{5}", fechIniProceso.Year, fechIniProceso.Month.ToString().PadLeft(2, '0'), fechIniProceso.Day.ToString().PadLeft(2, '0'), fechIniProceso.Hour.ToString().PadLeft(2, '0'), fechIniProceso.Minute.ToString().PadLeft(2, '0'), fechIniProceso.Second.ToString().PadLeft(2, '0')); long intfechaIni = Convert.ToInt64(fechaIni); long intfechaFin = Convert.ToInt64(fechaFin); //Inserto el proceso var proceso = new TblProcesos() { IdPro = ++maxidProceso, FechaIniPro = fechIniProceso, FechaFinPro = DateTime.Now, EmpleadosPro = employees.Count, ErroresPro = 0, AutoPro = true, RegistrosPro = 0 }; context.TblProcesos.Add(proceso); int maxidMarcaje = context.TblMarcajeprocesado.Any() ? context.TblMarcajeprocesado.Max(p => p.IdMar) : 0; int marcajescount = 0; Log("Se procesa a partir de la última fecha procesada: " + lastdateprocess); foreach (var employee in employees) { using (var dassnetcontext = new DASSNETContext()) { #region Obtener Marcaje de Dassnet var marcajesEmpleado = from m in dassnetcontext.MensajesAcceso join p in dassnetcontext.PersonasT on m.FkPersona equals p.Id join l in dassnetcontext.Lectores on m.FkLector equals l.Id join t in dassnetcontext.Tarjetas on m.FkTarjeta equals t.Id into tempJoin from j in tempJoin.DefaultIfEmpty() where p.Dni == employee.DniEmp && Convert.ToInt64(m.FechaYhora) >= intfechaIni && Convert.ToInt64(m.FechaYhora) <= intfechaFin select new MarcajeEmpleado { Id = m.Id, FechayHora = Utils.StrToDateTime(m.FechaYhora), DNI = p.Dni, CodTarjeta = j == null ? "" : j.CodTarjeta, CodLector = l.Id, Nombre = l.Nombre }; #endregion #region Salvar Marcajes en la tabla TBL_MARCAJEPROCESADO foreach (var marcaje in marcajesEmpleado) { #region Obtener Marcaje de Dassnet //TODO depende de la base de datos Dassnet //Para cada empleado inserto el marcaje var marcajeprocesado = new TblMarcajeprocesado() { IdMar = ++maxidMarcaje, IdEmp = employee.IdEmp, IdPro = maxidProceso, FechaMarcajeMar = marcaje.FechayHora, DniEmp = employee.DniEmp, CodTarjetaMar = marcaje.CodTarjeta, IdLectorMar = marcaje.CodLector.ToString(), NombreLectorMar = marcaje.Nombre }; context.TblMarcajeprocesado.Add(marcajeprocesado); marcajescount++; #endregion } } } Log("Salvando los datos de marcaje"); context.SaveChanges(); Log("Salvados " + marcajescount + " marcajes"); //Llamar al ws de Evalos para mandarle el arreglo con los marcajes SendMarcajeToWS(context, maxidProceso, fechIniProceso); } #endregion } catch (Exception ex) { Log("#region Salvando en la tabla marcaje: " + ex.ToString()); } }