Datenimport.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Specialized;
  4. using System.Data.Odbc;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Net;
  8. using System.Text;
  9. using GCHR.Model;
  10. using GCHR.Model.Konto;
  11. namespace GCHR.Control.Tasks
  12. {
  13. class Datenimport : Task
  14. {
  15. public static Datenimport DatenimportSuSa(int id, string name)
  16. {
  17. var datenimport = new Datenimport(id, name) {_kontoTyp = KontoTypen.SuSa};
  18. return datenimport;
  19. }
  20. public static Datenimport DatenimportStat(int id, string name)
  21. {
  22. var datenimport = new Datenimport(id, name) {_kontoTyp = KontoTypen.Stat};
  23. return datenimport;
  24. }
  25. private Datenimport(int id, string name)
  26. : base(id, name) { }
  27. private KontoTypen _kontoTyp;
  28. private string QueryStr
  29. {
  30. get { return (_kontoTyp == KontoTypen.SuSa) ? Config.SuSaKontenQuery : Config.StatKontenQuery; }
  31. }
  32. protected override void AufgabeAusfuehren()
  33. {
  34. var import = Importieren();
  35. Data.AddKonten(ImportInKontenUmwandeln(import));
  36. }
  37. private IEnumerable<string> Importieren()
  38. {
  39. List<string> import;
  40. if (Data.Offlinemodus && File.Exists(Dateiname))
  41. {
  42. import = File.ReadAllLines(Dateiname).ToList();
  43. }
  44. else if (Config.WebserviceAktiv)
  45. {
  46. import = KontenVonWebserviceLaden();
  47. }
  48. else
  49. {
  50. import = KontenVonOdbcLaden();
  51. }
  52. if (Data.ImportdatenSichern)
  53. {
  54. ImportdatenSichern(import);
  55. }
  56. return import;
  57. }
  58. private List<string> KontenVonWebserviceLaden()
  59. {
  60. var args = new NameValueCollection
  61. {
  62. { "dsn", "odbc:" + Config.OdbcConnectionString },
  63. { "query", QueryStr }
  64. };
  65. using (var web = new WebClient())
  66. {
  67. web.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
  68. var responsebytes = web.UploadValues(Config.Webservice, "POST", args);
  69. return Encoding.UTF8.GetString(responsebytes).Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList();
  70. }
  71. }
  72. private List<string> KontenVonOdbcLaden()
  73. {
  74. var result = new List<string>();
  75. using (var con = new OdbcConnection(Config.OdbcConnectionString))
  76. {
  77. con.ConnectionTimeout = 300;
  78. con.Open();
  79. var query = new OdbcCommand(QueryStr, con) {CommandTimeout = 300};
  80. var reader = query.ExecuteReader();
  81. while (reader.Read())
  82. {
  83. var zeile = reader.GetString(0).Trim();
  84. for (var i = 1; i < reader.FieldCount; i++)
  85. {
  86. zeile += ";" + reader.GetString(i).Trim();
  87. }
  88. result.Add(zeile);
  89. }
  90. reader.Close();
  91. con.Close();
  92. }
  93. return result;
  94. }
  95. private void ImportdatenSichern(List<string> import)
  96. {
  97. using (var sw = new StreamWriter(Dateiname, false, Constants.CsvEncoding))
  98. {
  99. sw.WriteLine(String.Join(Environment.NewLine, import.ToArray()));
  100. }
  101. }
  102. private string Dateiname
  103. {
  104. get { return String.Format(Config.Importdaten, Periode.AktuellePeriode, _kontoTyp); }
  105. }
  106. private List<HaendlerKonto> ImportInKontenUmwandeln(IEnumerable<string> import)
  107. {
  108. var konten = (from tempZeile in import
  109. select tempZeile.Split(';') into feld
  110. group feld by (feld[0] + ";" + feld[3]) into kontoSaldi
  111. select NeuesKonto(kontoSaldi.ToList())).ToList();
  112. if (_kontoTyp == KontoTypen.SuSa)
  113. {
  114. SummeSaldiPruefen(konten.Sum(konto => konto.Summe));
  115. }
  116. ReportProgress(80);
  117. return konten;
  118. }
  119. private void SummeSaldiPruefen(Decimal summe)
  120. {
  121. var summeString = String.Format(Constants.Zahlenformat, "{0:c}", summe);
  122. Logger.Progress("Summe über alle SuSa-Konten: " + summeString);
  123. if (summe != 0.0m)
  124. {
  125. ReportProgress(75, "Beim Import der SuSa-Konten trat ein Fehler auf." + Environment.NewLine +
  126. "Die Summe über alle SuSa-Konten ist " + summeString + " €");
  127. }
  128. }
  129. private HaendlerKonto NeuesKonto(IList<string[]> kontoSaldi)
  130. {
  131. var neuesKonto = new HaendlerKonto(_kontoTyp);
  132. var feld = kontoSaldi.First();
  133. neuesKonto.Kontonummer = Config.HaendlerKontonummerFormatieren(feld[0].Trim());
  134. neuesKonto.DepartmentImport = feld[3].Trim();
  135. Config.DepartmentAnpassen(neuesKonto);
  136. if (PeriodeMitgeliefert(feld))
  137. {
  138. foreach (var saldo in kontoSaldi)
  139. {
  140. neuesKonto.SaldoZuordnen(saldo[4].Substring(0,6), ToDecimal(saldo[1]), ToDecimal(saldo[2]));
  141. }
  142. }
  143. else
  144. {
  145. neuesKonto.Soll = (from saldo in kontoSaldi
  146. select ToDecimal(saldo[1])).Sum();
  147. neuesKonto.Haben = (from saldo in kontoSaldi
  148. select ToDecimal(saldo[2])).Sum();
  149. }
  150. if (KontoartMitgeliefert(feld))
  151. {
  152. neuesKonto.Kontoart = feld[5];
  153. }
  154. return neuesKonto;
  155. }
  156. private static Decimal ToDecimal(string feld)
  157. {
  158. return Decimal.Parse(feld, Constants.ZahlenformatImport);
  159. }
  160. private static bool PeriodeMitgeliefert(IEnumerable<string> feld)
  161. {
  162. return feld.Count() > 4;
  163. }
  164. private static bool KontoartMitgeliefert(IEnumerable<string> feld)
  165. {
  166. return feld.Count() > 5;
  167. }
  168. }
  169. }