using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using GCHR.Model; using GCHR.Model.Konto; namespace GCHR.Control.Tasks { abstract class Uebersetzung : Task { protected Uebersetzung(int id, string name) : base(id, name) { } protected string Dateiname; protected KontoTypen KontoTyp; private readonly Dictionary _uebersetzungstabelle = new Dictionary(); protected override void AufgabeAusfuehren() { UebersetzungstabelleLaden(); TabelleUebergeben(_uebersetzungstabelle); } protected abstract void TabelleUebergeben(Dictionary uebersetzung); private void UebersetzungstabelleLaden() { var debugFehlerhafteZeile = new List(); var debugHerstellerkontoFehlt = new List(); var debugNichtImKontenrahmen = new List(); var debugDoppeltesHaendlerkonto = new List(); Config.DateiVonServerHolen(Dateiname); var stream = new StreamReader(Constants.DatenexportPfad + Dateiname, Constants.CsvEncoding); // Erste Zeile (Überschrift) ignorieren stream.ReadLine(); while (!stream.EndOfStream) { var zeile = stream.ReadLine(); if (zeile == null) continue; if (IstUeberschrift(zeile)) { // wird vorerst ignoriert /* string ueberschrift = zeile.Split(';').First().Substring(1); Konto konto = new ManStatKonto() { Kontonummer = ueberschrift }; ManuelleKonten.Add(konto); */ } else if (IstSplitKonto(zeile)) { var felder = zeile.Split(';'); var herstellerkonto = FehlendeZiffernErgaenzen(felder[0], Config.HerstellerKontenrahmenZiffern); var herstellerkonto2 = FehlendeZiffernErgaenzen(felder[1], Config.HerstellerKontenrahmenZiffern); var haendlerkonto = FehlendeZiffernErgaenzen(felder[2], Config.HaendlerKontenrahmenZiffern); if (!_uebersetzungstabelle.ContainsKey(haendlerkonto)) { _uebersetzungstabelle.Add(haendlerkonto, herstellerkonto + "," + herstellerkonto2); } else { debugDoppeltesHaendlerkonto.Add(haendlerkonto); } } else if (IstNormalesKonto(zeile)) { var felder = zeile.Split(';'); var herstellerkonto = FehlendeZiffernErgaenzen(felder[0], Config.HerstellerKontenrahmenZiffern); var haendlerkonto = FehlendeZiffernErgaenzen(felder[2], Config.HaendlerKontenrahmenZiffern); if (!_uebersetzungstabelle.ContainsKey(haendlerkonto)) { _uebersetzungstabelle.Add(haendlerkonto, herstellerkonto); } else { debugDoppeltesHaendlerkonto.Add(herstellerkonto); } } else if (IstManuellesKonto(zeile)) { var kontonummer = zeile.Split(';').First().PadLeft(Config.HerstellerKontenrahmenZiffern, '0'); if (!ManuellesKonto(kontonummer) && !debugNichtImKontenrahmen.Contains(kontonummer)) { debugNichtImKontenrahmen.Add(kontonummer); } } else if (HerstellerkontoFehlt(zeile)) { debugHerstellerkontoFehlt.Add(zeile); } else { if (!zeile.Equals("ACC_NO_5;DESCRIPTION;ACC_NO_8;x;y") && !zeile.Equals("") && !zeile.Contains("Konto_")) { debugFehlerhafteZeile.Add(zeile); } } } stream.Close(); #region Verarbeitung der Fehlerlisten if (debugFehlerhafteZeile.Count > 0) { Logger.Progress(string.Format("Fehlerhafte Zeilen ({0}): {1}{2}{3}", debugFehlerhafteZeile.Count, Environment.NewLine, String.Join(Environment.NewLine, debugFehlerhafteZeile.ToArray()), Environment.NewLine)); ReportProgress(70, string.Format("Die Übersetzungstabelle enthält {0} fehlerhafte Zeilen.", debugFehlerhafteZeile.Count)); } if (debugHerstellerkontoFehlt.Count > 0) { Logger.Progress(string.Format("Zeilen ohne Herstellerkonto ({0}): {1}{2}{3}", debugHerstellerkontoFehlt.Count, Environment.NewLine, String.Join(Environment.NewLine, debugHerstellerkontoFehlt.ToArray()), Environment.NewLine)); ReportProgress(80, string.Format("In {0} Zeilen fehlt das Herstellerkonto.", debugHerstellerkontoFehlt.Count)); } if (debugNichtImKontenrahmen.Count > 0) { Logger.Progress(string.Format("Fehlende Manuelle Konten im Kontenrahmen ({0}): {1}{2}{3}", debugNichtImKontenrahmen.Count, Environment.NewLine, String.Join(Environment.NewLine, debugNichtImKontenrahmen.ToArray()), Environment.NewLine)); ReportProgress(90, string.Format("Zu {0} manuellen Konten fehlt der Eintrag im Kontenrahmen.", debugNichtImKontenrahmen.Count)); } if (debugDoppeltesHaendlerkonto.Count > 0) { Logger.Progress(string.Format("Mehrfach zugeordnete Händlerkonten in der Übersetzungstabelle {0} ({1}): {2}{3}{4}", KontoTyp, debugDoppeltesHaendlerkonto.Count, Environment.NewLine, String.Join(Environment.NewLine, debugDoppeltesHaendlerkonto.ToArray()), Environment.NewLine)); throw new ArgumentException(string.Format("Abbruch: {0} Händlerkonten sind in der Übersetzungstabelle {1} mehrfach zugeordnet.", debugDoppeltesHaendlerkonto.Count, KontoTyp)); } #endregion } protected abstract bool ManuellesKonto(string kontonummer); private static String FehlendeZiffernErgaenzen(String kontonummer, int ziffern) { return (kontonummer.Length >= ziffern) ? kontonummer : kontonummer.PadLeft(ziffern, '0'); } private static bool IstSplitKonto(string zeile) { return Regex.IsMatch(zeile, @"^[^;]+;[^;]+;[^;]+"); } private static bool HerstellerkontoFehlt(string zeile) { return Regex.IsMatch(zeile, @"^;;[^;]+"); } private static bool IstManuellesKonto(string zeile) { return Regex.IsMatch(zeile, @"^[^;]+;"); } private static bool IstUeberschrift(string zeile) { return Regex.IsMatch(zeile, @"^[\+]"); } private static bool IstNormalesKonto(string zeile) { return Regex.IsMatch(zeile, @"^[^;]+;;[^;]+"); } } }