Datenimport.cs 7.5 KB

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