/// <summary> /// Private constructor. /// </summary> private ProcesoPrincipal() { // Limpio Vista. Vista.AsignacionCantidadProcesados(0); Vista.AsignacionCantidadProcesadosError(0); Vista.AsignacioncantidadProcesadosOk(0); }
/// <summary> /// Setea el estado de las variables contadoras y los Timers en su "Estado inicial". /// </summary> public void Initialize(string ruta) { try { Vista.StartTimer(); this.Start(ruta); } catch (Exception e) { Logger.Default.Fatal(e, "No es posible comenzar la pila de procesos."); } }
/// <summary> /// Indica el final de la rutina de procesos, actualiza la vista, genera un reporte final y detiene el timer indicando el tiempo que demoró el proceso. /// </summary> private void FinalizeProcessor() { try { Vista.EndTimer(); Task.WaitAll(); Vista.SetEstaProcesando(false); } catch (Exception e) { Logger.Default.Fatal(e, "No es posible finalizar la pila de procesos."); } }
/// <summary> /// Método encargado de retornar el porcentaje de tareas completadas y tareas restantes. /// </summary> /// <returns></returns> public static int GetPorcentajeProcesamientoRestante() { int totalEnviadosProcesar = Vista.GetCantidadProcesados(); int elementosTrabajados = (Vista.GetCantidadProcesadosError() + Vista.GetCantidadProcesadosOk()); if (totalEnviadosProcesar == 0) { return(0); } else { return((elementosTrabajados * 100) / totalEnviadosProcesar); } }
/// <summary> /// Abre el archivo de origen, lo recorre realizando un SPLIT validando cada campo y genera una Lista de personas para Procesar. /// </summary> /// <param name="Path">Ruta del fichero de Origen.</param> private void cargarListasPersonas(string path) { try { Thread.Sleep(2000); if (!File.Exists(path)) { throw new Exception("El archivo especificado a la hora de generar las listas de las personas no existe."); } else { List <Persona> colaMasculinos = new List <Persona>(); List <Persona> colaFemeninos = new List <Persona>(); using (StreamReader reader = new StreamReader(path)) { while (!reader.EndOfStream) { string auxString = reader.ReadLine(); Persona auxPerson = new Persona(auxString); switch (auxPerson.Sexo) { case "M": AgregarMasculinoEnCola(ref colaMasculinos, auxPerson); Vista.AdicionCantidadProcesados(); break; case "F": AgregarFemeninoEnCola(ref colaFemeninos, auxPerson); Vista.AdicionCantidadProcesados(); break; default: Logger.Default.Warn(string.Format("Error a la hora de procesar una persona: No respeta el formato. ({0})", auxPerson.ToString())); Vista.AdicionCantidadProcesadosError(); break; } } } this.procesarDuplicados(ref colaMasculinos); this.procesarDuplicados(ref colaFemeninos); this.almacenarListasPersonas(colaFemeninos, colaMasculinos); } } catch (Exception e) { Logger.Default.Fatal(e, "No es posible finalizar la pila de procesos."); throw e; } }
/// <summary> /// Método empleado para finalizar de contabilizar el tiempo. /// </summary> public static void EndTimer() { try { if (!timer.IsRunning) { Exception IsNotRunningException = new Exception("Imposible detener la contabilizacion de tiempo, el timer actualmente se encuentra pausado"); throw IsNotRunningException; } else { timer.Stop(); // Detiene la contabilización de tiempo. Vista.SetEstaProcesando(true); } } catch (Exception e) { Logger.Default.Error(e, "Error: Es imposible comenzar a contabilizar el tiempo."); } }
/// <summary> /// Método empleado para comenzar a contabilizar el tiempo. /// </summary> public static void StartTimer() { try { if (timer.IsRunning) { Exception IsRunningException = new Exception("Imposible comenzar a contabilizar el tiempo, el timer actualmente se esta ejecutando"); throw IsRunningException; } else { timer.Start(); // Comienza a contabilizar. Vista.SetEstaProcesando(true); } } catch (Exception e) { Logger.Default.Error(e, "Error: Es imposible comenzar a contabilizar el tiempo."); } }
/// <summary> /// Agrega la persona en la DB /// </summary> /// <param name="Femenino"></param> public void AgregarFem(Persona Femenino) { try { Femenino.Id = this.ExecuteScalarInt32("qry_Femeninos_ADD", Femenino.Cuit, Femenino.Nombre, Femenino.FechaNacimiento, "Marcos"); Vista.AdicionCantidadProcesadosOk(); } catch (SqlException e) { Vista.AdicionCantidadProcesadosError(); if (e.ErrorCode == -2146232060) { Vista.AdicionRechazadosDatabase(); Logger.Default.Warn(e, "Registro duplicado: El registro se encuentra actualmente en la Base de Datos.."); } } }
/// <summary> /// Agrega la persona en la DB /// </summary> /// <param name="Masculino"></param> public void AgregarMasc(Persona Masculino) { try { //Masculino.Id = this.ExecuteScalarInt32("qry_Masculinos_ADD_Marcos", //Masculino.Cuit, //Masculino.Nombre, //Masculino.FechaNacimiento, //"Marcos"); Thread.Sleep(500); Vista.AdicionCantidadProcesadosOk(); } catch (SqlException e) { Vista.AdicionCantidadProcesadosError(); if (e.ErrorCode == -2146232060) { Logger.Default.Warn(e, "[Registro duplicado] El registro se encuentra actualmente en la Base de Datos.."); } } }
/// <summary> /// Procesa una Lista de personas excluyendo aquellas que poseen CUIT Duplicado. /// </summary> private void procesarDuplicados(ref List <Persona> listaDuplicados) { try { var distinct = listaDuplicados.GroupBy(x => x.Cuit).Select(g => g.First()).ToList(); int diferencia = listaDuplicados.Count - distinct.Count; // Si existe diferencia. if (diferencia > 0) { listaDuplicados = distinct; // La cantidad de registros excluidos por duplicidad pasan a ser Registros con ERROR. Vista.AsignacionCantidadProcesadosError(Vista.GetCantidadProcesadosError() + diferencia); Vista.AsignacionCantidadRepetidos(Vista.GetCantidadRepetidos() + diferencia); } } catch (Exception e) { Logger.Default.Fatal(e, "Error a la hora de procesar los registros duplicados."); throw e; } }