public static void SendAusenciaToWS(SINCRODEDBContext sincrodecontext, int idPro, DateTime fIniPro) { IConfiguration config = ConfigHelper.GetConfiguration(); Log("Comenzando el envio de ausencias al WS"); //Mando a crear la ausencia en Evalos //Creo el json con los datos q debo enviarle al ws string jsonabsence; string wsEvalosMethod = config["EvalosAccess"] + "absence/"; string username = config["EvalosUser"]; string password = config["EvalosPassword"]; int cantTotalRegistros = 0; int cantRegistroPro = 0; int cantErrores = 0; int maxidProlog; void EnviarAusenciaWS(int idEmpleado, int idAusencia, Absence absence) { TblProcesoslog procesoLog; jsonabsence = JsonConvert.SerializeObject(absence); if (jsonabsence != "[]") { if (config["ShowDetailsLog"].ToUpper() == "TRUE") { Log("Json usado en el envío al WS de ausencia " + jsonabsence); } try { var httpWebResponse = WebServiceRest.PutPostRequest(wsEvalosMethod, username, password, jsonabsence, "PUT"); string messageLog; string messageError = string.Empty; StreamReader reader = new StreamReader(httpWebResponse.GetResponseStream()); string body = reader.ReadToEnd(); if (httpWebResponse.StatusCode == HttpStatusCode.OK) { cantRegistroPro++; //Si la ausencia se envió satisfactoriamente se borra de la tabla de absentismos procesados var ausenciaToDelete = sincrodecontext.TblAbsentismoProcesado.FirstOrDefault(m => m.IdAbs == idAusencia); if (ausenciaToDelete != null) { sincrodecontext.TblAbsentismoProcesado.Remove(ausenciaToDelete); } else { Log(string.Format("No fue posible encontrar registro con Id {0} en TblAbsentismoProcesado", idAusencia)); } messageLog = httpWebResponse.StatusDescription; } else { Log("Respuesta de POST de Ausencia, empleado " + absence.CodeEmployee + " => " + body); cantErrores++; messageLog = httpWebResponse.StatusDescription; messageError = httpWebResponse.StatusDescription; } //Salvo el log de los procesos procesoLog = new TblProcesoslog() { IdProlog = ++maxidProlog, IdPro = idPro, IdEmp = idEmpleado, FechaIniPro = fIniPro, DescProlog = messageLog, ExcProlog = messageError }; sincrodecontext.TblProcesoslog.Add(procesoLog); sincrodecontext.SaveChanges(); } catch (Exception e) { Log("Error en el envio de POST de Ausencia: " + e.Message); } } } maxidProlog = sincrodecontext.TblProcesoslog.Any() ? sincrodecontext.TblProcesoslog.Max(l => l.IdProlog) : 0; var empleadosXDistinct = (from m in sincrodecontext.TblAbsentismoProcesado select m.IdEmp).Distinct().ToList(); foreach (var empleado in empleadosXDistinct) { var ausenciasEmpleado = (from m1 in sincrodecontext.TblAbsentismoProcesado select m1).Where(m => m.IdEmp == empleado).ToList(); foreach (var ausenciaEmpleado in ausenciasEmpleado) { if (ausenciaEmpleado.FechaFin.HasValue) { var idAusencia = sincrodecontext.TblCodigosAusencias.FirstOrDefault(a => a.CodAusencia == ausenciaEmpleado.CodAusencia).IdAus; var absence = new Absence() { CodeEmployee = ausenciaEmpleado.DniEmp, StartDate = ausenciaEmpleado.FechaInicio.Date.ToString("yyyyMMdd", CultureInfo.InvariantCulture), EndDate = ausenciaEmpleado.FechaFin.Value.Date.ToString("yyyyMMdd", CultureInfo.InvariantCulture), Incidence = idAusencia, }; cantTotalRegistros += 1; EnviarAusenciaWS(empleado, ausenciaEmpleado.IdAbs, absence); } } var proceso = sincrodecontext.TblProcesos.Where(p => p.IdPro == idPro).FirstOrDefault(); proceso.RegistrosPro = cantRegistroPro; proceso.ErroresPro = cantErrores; sincrodecontext.SaveChanges(); } }
private void Ejecutar() { IConfiguration config = ConfigHelper.GetConfiguration(); #region Descargar y guardar fichero del FTP //string servidorftp = "ftp://gentalia.ddns.net/SincronizadorDE/DATOSLOGA_V2.xls"; string servidorftp = config["FTPLoga"]; string usuario = config["FTPuser"]; string password = config["FTPPassword"]; string carpetaDestino = config["RutaFileTemp"];// "D:\\InOut"; string remoteFile = config["FileLoga"]; string fileName = remoteFile.Substring(remoteFile.LastIndexOf("/") + 1); int NumberOfRetries = Convert.ToInt16(config["CantDeReintentos"]); int DelayOnRetry = 1000; DownloadFile(servidorftp, remoteFile, usuario, password, carpetaDestino); for (int i = 1; i <= NumberOfRetries; ++i) { try { _listaLoga = ProcessLOGAWorkbook(carpetaDestino + "\\" + fileName); Log("Fichero LOGA procesado"); break; // When done we can break loop } catch (IOException ex) when(i <= NumberOfRetries) { // You may check error code to filter some exceptions, not every error // can be recovered. System.Threading.Thread.Sleep(DelayOnRetry); if (i == NumberOfRetries) { Log("Error procesando el fichero LOGA: " + ex.ToString()); } } } if (Intervalo.nextTimeToExecute == 1) { //Si es la primera hora del día se intenta descargar el archivo de Absentismos remoteFile = config["FileAbsentismos"]; fileName = remoteFile.Substring(remoteFile.LastIndexOf("/") + 1); DownloadFile(servidorftp, remoteFile, usuario, password, carpetaDestino); for (int i = 1; i <= NumberOfRetries; ++i) { try { _listaAbsentismo = ProcessAbsentismosWorkbook(carpetaDestino + "\\" + fileName); Log("Fichero de Absentismos procesado"); break; // When done we can break loop } catch (IOException ex) when(i <= NumberOfRetries) { // You may check error code to filter some exceptions, not every error // can be recovered. System.Threading.Thread.Sleep(DelayOnRetry); if (i == NumberOfRetries) { Log("Error procesando el fichero de Absentismos: " + ex.ToString()); } } } } #endregion #region Salvar empleado en la base de datos si no existe try { TblEmpleados employeeFound; int encontrados = 0; int creados = 0; using (var context = new SINCRODEDBContext()) { int maxidEmp = context.TblEmpleados.Any() ? context.TblEmpleados.Max(e => e.IdEmp) : 0; Log("Salvando empleados en la BD SincroDE"); foreach (CamposLOGA campo in _listaLoga) { employeeFound = context.TblEmpleados.FirstOrDefault(s => s.DniEmp == campo.NifDni); //Si no encuentra el empleado lo inserta if (employeeFound != null) { employeeFound.NombreEmp = TruncateStr(campo.Nombre, 100); employeeFound.ApellidosEmp = TruncateStr(campo.Apellidos, 100); employeeFound.NumeroEmp = TruncateStr(campo.NoPersonal, 20); employeeFound.IdoracleEmp = TruncateStr(campo.IdOracle, 20); employeeFound.DniSuperior = TruncateStr(campo.DniSuperior, 20); employeeFound.CodcenEmp = TruncateStr(campo.CodigoCentro, 50); employeeFound.UbicenEmp = TruncateStr(campo.UbicacionCentroTrabajo, 30); employeeFound.CoddepEmp = TruncateStr(campo.CodigoDepartamento, 50); employeeFound.DescdepEmp = TruncateStr(campo.DescripcionCentroTrabajo, 50); employeeFound.PNRSupEmp = TruncateStr(campo.PNRSupEmp, 20); employeeFound.NombresupEmp = TruncateStr(campo.NombreResponsable, 50); employeeFound.ApellidossupEmp = TruncateStr(campo.ApellidosResponsable, 50); employeeFound.CodnegocioEmp = TruncateStr(campo.CodigoNegocio, 20); employeeFound.CodsociedadEmp = TruncateStr(campo.CodigoSociedad, 20); employeeFound.CodsubnegocioEmp = TruncateStr(campo.CodigoSubNegocio, 20); employeeFound.DesccentrabajoEmp = TruncateStr(campo.DescripcionCentroTrabajo, 50); employeeFound.Descnegocio = TruncateStr(campo.DescripcionNegocio, 50); employeeFound.DescsociedadEmp = TruncateStr(campo.DescripcionSociedad, 50); employeeFound.DescsubnegocioEmp = TruncateStr(campo.DescripcionSubNegocio, 50); employeeFound.JornlaboralDomingo = campo.JornadaLaboralDomingo; employeeFound.JornlaboralLunes = campo.JornadaLaboralLunes; employeeFound.JornlaboralMartes = campo.JornadaLaboralMartes; employeeFound.JornlaboralMiercoles = campo.JornadaLaboralMiercoles; employeeFound.JornlaboralJueves = campo.JornadaLaboralJueves; employeeFound.JornlaboralViernes = campo.JornadaLaboralViernes; employeeFound.JornlaboralSabado = campo.JornadaLaboralSabado; employeeFound.JornlaboralFestivo = campo.JornadaLaboralFestiva; employeeFound.PorcenjornadaEmp = campo.PorcentajeReduccionJornada; employeeFound.TipocontratoEmp = campo.TipoContrato; employeeFound.CodcontratoEmp = campo.CodContratoEmp; employeeFound.Ad = TruncateStr(campo.Ad, 50); employeeFound.CojornadaEmp = campo.CoJornadaEmp; employeeFound.EmailEmp = campo.EmailEmp; context.TblEmpleados.Update(employeeFound); encontrados++; } else { var empl = new TblEmpleados() { IdEmp = ++maxidEmp, NombreEmp = TruncateStr(campo.Nombre, 100), ApellidosEmp = TruncateStr(campo.Apellidos, 100), DniEmp = TruncateStr(campo.NifDni, 20), NumeroEmp = TruncateStr(campo.NoPersonal, 20), IdoracleEmp = TruncateStr(campo.IdOracle, 20), DniSuperior = TruncateStr(campo.DniSuperior, 20), CodcenEmp = TruncateStr(campo.CodigoCentro, 50), UbicenEmp = TruncateStr(campo.UbicacionCentroTrabajo, 30), CoddepEmp = TruncateStr(campo.CodigoDepartamento, 50), DescdepEmp = TruncateStr(campo.DescripcionCentroTrabajo, 50), PNRSupEmp = TruncateStr(campo.PNRSupEmp, 20), NombresupEmp = TruncateStr(campo.NombreResponsable, 50), ApellidossupEmp = TruncateStr(campo.ApellidosResponsable, 50), CodnegocioEmp = TruncateStr(campo.CodigoNegocio, 20), CodsociedadEmp = TruncateStr(campo.CodigoSociedad, 20), CodsubnegocioEmp = TruncateStr(campo.CodigoSubNegocio, 20), DesccentrabajoEmp = TruncateStr(campo.DescripcionCentroTrabajo, 50), Descnegocio = TruncateStr(campo.DescripcionNegocio, 50), DescsociedadEmp = TruncateStr(campo.DescripcionSociedad, 50), DescsubnegocioEmp = TruncateStr(campo.DescripcionSubNegocio, 50), JornlaboralDomingo = campo.JornadaLaboralDomingo, //TODO JornlaboralLunes = campo.JornadaLaboralLunes, //TODO JornlaboralMartes = campo.JornadaLaboralMartes, //TODO JornlaboralMiercoles = campo.JornadaLaboralMiercoles, //TODO JornlaboralJueves = campo.JornadaLaboralJueves, //TODO JornlaboralViernes = campo.JornadaLaboralViernes, //TODO JornlaboralSabado = campo.JornadaLaboralSabado, //TODO JornlaboralFestivo = campo.JornadaLaboralFestiva, //TODO PorcenjornadaEmp = campo.PorcentajeReduccionJornada, TipocontratoEmp = campo.TipoContrato, CodcontratoEmp = campo.CodContratoEmp, Ad = TruncateStr(campo.Ad, 50), CojornadaEmp = campo.CoJornadaEmp, EmailEmp = campo.EmailEmp }; context.TblEmpleados.Add(empl); creados++; } } context.SaveChanges(); Log("Total de empleados en el fichero LOGA: " + _listaLoga.Count + " Empleados encontrados: " + encontrados + " Empleados creados: " + creados); Log("Enviando empleados al WS de Evalos"); creados = 0; encontrados = 0; foreach (var empleado in context.TblEmpleados) { #region Consumir el WebService de Evalos para cada empleado que se crea var wsEvalosMethod = config["EvalosAccess"] + "employee"; string userEvalos = config["EvalosUser"]; string passwordEvalos = config["EvalosPassword"]; var tracews = "Get Employee: URL: " + wsEvalosMethod + " DNI: " + empleado.DniEmp; try { //string employee; //employee = WebServiceRest.GetEmployee(wsEvalosMethod, userEvalos, passwordEvalos, empleado.DniEmp); //Log("Se obtuvo el employee del WS: " + employee); //if (employee == null || employee == string.Empty || employee == "null") //{ string codigoKiosko = "000"; if (context.TblEmpleados.Any(e => e.DniSuperior == empleado.DniEmp)) { codigoKiosko = ObtenerCodigoSupervisor(empleado.DniEmp); } string emailEmp = string.IsNullOrEmpty(empleado.EmailEmp) || !IsValidEmail(empleado.EmailEmp) ? string.Empty : empleado.EmailEmp; //Mando a crear el empleado en Evalos //Creo el json con los datos q debo enviarle al ws var employeeData = new Employee { Code = empleado.DniEmp, Description = empleado.NombreEmp + " " + empleado.ApellidosEmp, CodeArea = empleado.UbicenEmp, CodeDepartment = empleado.CodnegocioEmp, CodeCompany = empleado.CodsociedadEmp, CodeSection = empleado.CodsubnegocioEmp, DateAdd = "20190901", CodeAccess = "999", CodeCorrection = "100", CodeSchedule = "1ES", CustomFields = new CustomField { EM_IDORACLE = empleado.IdoracleEmp, EM_NUMPERSO = empleado.NumeroEmp, EM_TIPOCONTRATO = empleado.TipocontratoEmp.ToString().PadLeft(3, '0'), EM_REDUCCION = Math.Truncate(empleado.PorcenjornadaEmp ?? 0).ToString().PadLeft(3, '0'), EM_NIEJERARQUIA = empleado.DniSuperior }, Observations = string.Empty, CodeWorkflow = ((empleado.CodcontratoEmp == "TT") || (empleado.CodcontratoEmp == "CW") || (empleado.CodcontratoEmp == "FT") || (empleado.CodcontratoEmp == "FC") ? "200" : "100"), CodeKiosk = codigoKiosko, Email = emailEmp, CodePatternCalendar = ((empleado.CodcontratoEmp == "FW") || (empleado.CodcontratoEmp == "FT") || (empleado.CodcontratoEmp == "FC") ? "1FW" : "1ES"), PatternCalendarData = new PatternCalendar { StartDate = "20190101", EndDate = "20991231", Replace = true } }; string employeejson = JsonConvert.SerializeObject(employeeData); Log("Enviado al PUT de empleado " + employeejson); tracews = "Put Employee: URL: " + wsEvalosMethod + " json: " + employeejson; var httpWebResponse = WebServiceRest.PutPostRequest(wsEvalosMethod, userEvalos, passwordEvalos, employeejson, "PUT"); if (httpWebResponse.StatusCode == HttpStatusCode.OK) { creados++; } else { if (config["ShowDetailsLog"].ToUpper() == "TRUE") { Log("Respuesta erronea del PUT " + httpWebResponse.StatusCode + " => " + httpWebResponse.StatusDescription); } } //} //else //{ // encontrados++; //} } catch (Exception ex) { Log("Excepción en el consumo del WS de Evalos " + tracews + ": " + ex.ToString()); } #endregion } //Log("Total de empleados en la BD SincroDE: " + context.TblEmpleados.Count().ToString() + " Empleados encontrados en Evalos: " + encontrados + " Empleados enviados: " + creados); Log("Total de empleados en la BD SincroDE: " + context.TblEmpleados.Count().ToString() + " Empleados enviados: " + creados); } } catch (Exception ex) { Log("Error salvando empleados en la BD Sincrode: " + ex.ToString()); } #endregion #region Procesando marcajes Log("Comienzo del proceso de marcaje"); //Llamando al métodos para procesar los marcajes string paramFecini = config["FechaInicialPrueba"]; string paraFecFin = config["FechaFinalPrueba"]; DateTime fechaini = new DateTime(); DateTime fechafin = new DateTime(); bool setfechas = true; //si no se logra obtener una fecha válida se asume q no estan bien puestos los parámetros if (string.IsNullOrEmpty(paramFecini) || string.IsNullOrEmpty(paraFecFin)) { MarcajesDassnet.ProcesaMarcajes(); } else { try { fechaini = DateTime.ParseExact(paramFecini + " 00:00:00", "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); fechafin = DateTime.ParseExact(paraFecFin + " 23:59:59", "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); } catch (Exception) { setfechas = false; } if (setfechas) { Log("Se procesa desde " + fechaini + " hasta " + fechafin); MarcajesDassnet.ProcesaMarcajesRango(fechaini, fechafin); } else { Log("Fechas de parámetro incorrectas. Se procesa a partir de la última fecha procesada"); MarcajesDassnet.ProcesaMarcajes(); } } #endregion #region Salvar ausencias en la base de datos if (Intervalo.nextTimeToExecute == 1) { Log("Se comienzan a procesar las ausencias en la base de datos"); //si no se logra obtener una fecha válida se asume q no estan bien puestos los parámetros if (string.IsNullOrEmpty(paramFecini) || string.IsNullOrEmpty(paraFecFin)) { ProcesaAusencias(); } else { try { fechaini = DateTime.ParseExact(paramFecini + " 00:00:00", "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); fechafin = DateTime.ParseExact(paraFecFin + " 23:59:59", "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); } catch (Exception) { setfechas = false; } if (setfechas) { Log("Se procesa desde " + fechaini + " hasta " + fechafin); ProcesaAusencias(fechaini, fechafin); } else { Log("Fechas de parámetro incorrectas. Se procesa a partir de la última fecha procesada"); ProcesaAusencias(); } } } #endregion }
public static void SendMarcajeToWS(SINCRODEDBContext sincrodecontext, int idPro, DateTime fIniPro) { IConfiguration config = ConfigHelper.GetConfiguration(); Log("Comenzando el envio de marcajes al WS"); //Mando a crear el marcaje en Evalos //Creo el json con los datos q debo enviarle al ws string jsonattendance; string wsEvalosMethod = config["EvalosAccess"] + "booking/attendance/"; string username = config["EvalosUser"]; string password = config["EvalosPassword"]; int cantTotalRegistros = 0; int cantRegistroPro = 0; int cantErrores = 0; int maxidProlog; List <Attendance> attendances = new List <Attendance>(); List <int> attendanceIds = new List <int>(); void EnviarMarcajesWS(int idEmpleado) { TblProcesoslog procesoLog; jsonattendance = JsonConvert.SerializeObject(attendances.ToArray()); if (jsonattendance != "[]") { if (config["ShowDetailsLog"].ToUpper() == "TRUE") { Log("Json usado en el envío al WS de marcaje " + jsonattendance); } try { var httpWebResponse = WebServiceRest.PutPostRequest(wsEvalosMethod, username, password, jsonattendance, "POST"); //Log("Respuesta del Post " + httpWebResponse.StatusCode + "" + httpWebResponse.StatusDescription); string messageLog; string messageError = string.Empty; if (httpWebResponse.StatusCode == HttpStatusCode.Created) { StreamReader reader = new StreamReader(httpWebResponse.GetResponseStream()); string body = reader.ReadToEnd(); Log("Respuesta de POST de Marcajes, empleado " + attendances.Last <Attendance>().CodeEmployee + " => " + body); var jsonBody = JsonConvert.DeserializeObject <List <MarcajesResponse> >(body); for (int i = 0; i < attendances.Count; i++) { if (jsonBody[i].Message == "OK") { cantRegistroPro++; //Si el marcaje se envió satisfactoriamente se borra de la tabla de marcajes procesados var marcajeToDelete = sincrodecontext.TblMarcajeprocesado.FirstOrDefault(m => m.IdMar == attendanceIds[i]); if (marcajeToDelete != null) { sincrodecontext.TblMarcajeprocesado.Remove(marcajeToDelete); } else { Log(string.Format("No se encontró en la tabla TBL_MARCAJEPROCESADO un registro con ID = {0}", attendanceIds[i])); } } else { Log("Error en marcaje " + attendances[i].Date + " => " + jsonBody[i].Message); cantErrores++; messageError = body; } } messageLog = httpWebResponse.StatusDescription; //Log("Respuesta satisfactoria del POST " + messagelog); } else { cantErrores += attendances.Count; messageLog = httpWebResponse.StatusDescription; messageError = httpWebResponse.StatusDescription; //Log("Respuesta incorrecta del POST " + messagelog); } //Salvo el log de los procesos procesoLog = new TblProcesoslog() { IdProlog = ++maxidProlog, IdPro = idPro, IdEmp = idEmpleado, FechaIniPro = fIniPro, DescProlog = messageLog, ExcProlog = messageError }; sincrodecontext.TblProcesoslog.Add(procesoLog); sincrodecontext.SaveChanges(); } catch (Exception e) { Log("Error en el envio de POST de Marcajes: " + e.Message); } } attendances.Clear(); attendanceIds.Clear(); } maxidProlog = sincrodecontext.TblProcesoslog.Any() ? sincrodecontext.TblProcesoslog.Max(l => l.IdProlog) : 0; //var empleadosXDistincta = sincrodecontext.TblMarcajeprocesado.Select(m => m.IdEmp).Distinct(); var empleadosXDistinct = (from m in sincrodecontext.TblMarcajeprocesado select m.IdEmp).Distinct().ToList(); //Log("Cantidad de marcajes con distintos empleados en la tabla "+empleadosXDistinct.Count()); foreach (var empleado in empleadosXDistinct) { //var marcajesEmpleado = sincrodecontext.TblMarcajeprocesado.Where(m => m.IdEmp == empleado); var marcajesEmpleado = (from m1 in sincrodecontext.TblMarcajeprocesado select m1).Where(m => m.IdEmp == empleado).ToList(); foreach (var marcajeempleado in marcajesEmpleado) { var attendance = new Attendance() { CodeEmployee = marcajeempleado.DniEmp, Date = marcajeempleado.FechaMarcajeMar.Date.ToString("yyyyMMdd", CultureInfo.InvariantCulture), Time = marcajeempleado.FechaMarcajeMar.ToString("HHmmss", CultureInfo.InvariantCulture), Installation = "LOC", Clock = marcajeempleado.IdLectorMar.PadLeft(3, '0'), Lector = "01", Incidence = "00", Card = marcajeempleado.CodTarjetaMar, //"Ip": "10.0.0.1" }; attendances.Add(attendance); attendanceIds.Add(marcajeempleado.IdMar); cantTotalRegistros += 1; //Si ya hay 100 marcajes se realiza el envío y se sigue iterando en el foreach if (attendances.Count == 100) { //Envío de los datos de marcaje al WS de Evalos EnviarMarcajesWS(empleado); } } //Envío de los datos de marcaje al WS de Evalos EnviarMarcajesWS(empleado); var proceso = sincrodecontext.TblProcesos.Where(p => p.IdPro == idPro).FirstOrDefault(); proceso.RegistrosPro = cantRegistroPro; proceso.ErroresPro = cantErrores; sincrodecontext.SaveChanges(); } }