Uebersetzung.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text.RegularExpressions;
  6. using GCHR.Model;
  7. using GCHR.Model.Konto;
  8. namespace GCHR.Control.Tasks
  9. {
  10. abstract class Uebersetzung : Task
  11. {
  12. protected Uebersetzung(int id, string name)
  13. : base(id, name) { }
  14. protected string Dateiname;
  15. protected KontoTypen KontoTyp;
  16. private readonly Dictionary<string, string> _uebersetzungstabelle = new Dictionary<string, string>();
  17. protected override void AufgabeAusfuehren()
  18. {
  19. UebersetzungstabelleLaden();
  20. TabelleUebergeben(_uebersetzungstabelle);
  21. }
  22. protected abstract void TabelleUebergeben(Dictionary<string, string> uebersetzung);
  23. private void UebersetzungstabelleLaden()
  24. {
  25. var debugFehlerhafteZeile = new List<string>();
  26. var debugHerstellerkontoFehlt = new List<string>();
  27. var debugNichtImKontenrahmen = new List<string>();
  28. var debugDoppeltesHaendlerkonto = new List<string>();
  29. Config.DateiVonServerHolen(Dateiname);
  30. var stream = new StreamReader(Constants.DatenexportPfad + Dateiname, Constants.CsvEncoding);
  31. // Erste Zeile (Überschrift) ignorieren
  32. stream.ReadLine();
  33. while (!stream.EndOfStream)
  34. {
  35. var zeile = stream.ReadLine();
  36. if (zeile == null) continue;
  37. if (IstUeberschrift(zeile))
  38. {
  39. // wird vorerst ignoriert
  40. /*
  41. string ueberschrift = zeile.Split(';').First().Substring(1);
  42. Konto konto = new ManStatKonto() { Kontonummer = ueberschrift };
  43. ManuelleKonten.Add(konto);
  44. */
  45. }
  46. else if (IstSplitKonto(zeile))
  47. {
  48. var felder = zeile.Split(';');
  49. var herstellerkonto = FehlendeZiffernErgaenzen(felder[0], Config.HerstellerKontenrahmenZiffern);
  50. var herstellerkonto2 = FehlendeZiffernErgaenzen(felder[1], Config.HerstellerKontenrahmenZiffern);
  51. var haendlerkonto = FehlendeZiffernErgaenzen(felder[2], Config.HaendlerKontenrahmenZiffern);
  52. if (!_uebersetzungstabelle.ContainsKey(haendlerkonto))
  53. {
  54. _uebersetzungstabelle.Add(haendlerkonto, herstellerkonto + "," + herstellerkonto2);
  55. }
  56. else
  57. {
  58. debugDoppeltesHaendlerkonto.Add(haendlerkonto);
  59. }
  60. }
  61. else if (IstNormalesKonto(zeile))
  62. {
  63. var felder = zeile.Split(';');
  64. var herstellerkonto = FehlendeZiffernErgaenzen(felder[0], Config.HerstellerKontenrahmenZiffern);
  65. var haendlerkonto = FehlendeZiffernErgaenzen(felder[2], Config.HaendlerKontenrahmenZiffern);
  66. if (!_uebersetzungstabelle.ContainsKey(haendlerkonto))
  67. {
  68. _uebersetzungstabelle.Add(haendlerkonto, herstellerkonto);
  69. }
  70. else
  71. {
  72. debugDoppeltesHaendlerkonto.Add(herstellerkonto);
  73. }
  74. }
  75. else if (IstManuellesKonto(zeile))
  76. {
  77. var kontonummer = zeile.Split(';').First().PadLeft(Config.HerstellerKontenrahmenZiffern, '0');
  78. if (!ManuellesKonto(kontonummer) && !debugNichtImKontenrahmen.Contains(kontonummer))
  79. {
  80. debugNichtImKontenrahmen.Add(kontonummer);
  81. }
  82. }
  83. else if (HerstellerkontoFehlt(zeile))
  84. {
  85. debugHerstellerkontoFehlt.Add(zeile);
  86. }
  87. else
  88. {
  89. if (!zeile.Equals("ACC_NO_5;DESCRIPTION;ACC_NO_8;x;y") && !zeile.Equals("") && !zeile.Contains("Konto_"))
  90. {
  91. debugFehlerhafteZeile.Add(zeile);
  92. }
  93. }
  94. }
  95. stream.Close();
  96. #region Verarbeitung der Fehlerlisten
  97. if (debugFehlerhafteZeile.Count > 0)
  98. {
  99. Logger.Progress(string.Format("Fehlerhafte Zeilen ({0}): {1}{2}{3}", debugFehlerhafteZeile.Count, Environment.NewLine, String.Join(Environment.NewLine, debugFehlerhafteZeile.ToArray()), Environment.NewLine));
  100. ReportProgress(70, string.Format("Die Übersetzungstabelle enthält {0} fehlerhafte Zeilen.", debugFehlerhafteZeile.Count));
  101. }
  102. if (debugHerstellerkontoFehlt.Count > 0)
  103. {
  104. Logger.Progress(string.Format("Zeilen ohne Herstellerkonto ({0}): {1}{2}{3}", debugHerstellerkontoFehlt.Count, Environment.NewLine, String.Join(Environment.NewLine, debugHerstellerkontoFehlt.ToArray()), Environment.NewLine));
  105. ReportProgress(80, string.Format("In {0} Zeilen fehlt das Herstellerkonto.", debugHerstellerkontoFehlt.Count));
  106. }
  107. if (debugNichtImKontenrahmen.Count > 0)
  108. {
  109. 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));
  110. ReportProgress(90, string.Format("Zu {0} manuellen Konten fehlt der Eintrag im Kontenrahmen.", debugNichtImKontenrahmen.Count));
  111. }
  112. if (debugDoppeltesHaendlerkonto.Count > 0)
  113. {
  114. 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));
  115. throw new ArgumentException(string.Format("Abbruch: {0} Händlerkonten sind in der Übersetzungstabelle {1} mehrfach zugeordnet.", debugDoppeltesHaendlerkonto.Count, KontoTyp));
  116. }
  117. #endregion
  118. }
  119. protected abstract bool ManuellesKonto(string kontonummer);
  120. private static String FehlendeZiffernErgaenzen(String kontonummer, int ziffern)
  121. {
  122. return (kontonummer.Length >= ziffern) ? kontonummer : kontonummer.PadLeft(ziffern, '0');
  123. }
  124. private static bool IstSplitKonto(string zeile)
  125. {
  126. return Regex.IsMatch(zeile, @"^[^;]+;[^;]+;[^;]+");
  127. }
  128. private static bool HerstellerkontoFehlt(string zeile)
  129. {
  130. return Regex.IsMatch(zeile, @"^;;[^;]+");
  131. }
  132. private static bool IstManuellesKonto(string zeile)
  133. {
  134. return Regex.IsMatch(zeile, @"^[^;]+;");
  135. }
  136. private static bool IstUeberschrift(string zeile)
  137. {
  138. return Regex.IsMatch(zeile, @"^[\+]");
  139. }
  140. private static bool IstNormalesKonto(string zeile)
  141. {
  142. return Regex.IsMatch(zeile, @"^[^;]+;;[^;]+");
  143. }
  144. }
  145. }