Example #1
0
        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();
            }
        }
Example #2
0
        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
        }
Example #3
0
        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();
            }
        }