using System; using System.Collections.Generic; using System.Data.Odbc; using System.IO; using System.Linq; using GCHR.Model; using GCHR.Model.Konto; namespace GCHR.Control.Tasks { class Datenimport : Task { public static Datenimport DatenimportSuSa(int id, string name) { var datenimport = new Datenimport(id, name) {_kontoTyp = KontoTypen.SuSa}; return datenimport; } public static Datenimport DatenimportStat(int id, string name) { var datenimport = new Datenimport(id, name) {_kontoTyp = KontoTypen.Stat}; return datenimport; } private Datenimport(int id, string name) : base(id, name) { } private KontoTypen _kontoTyp; private string QueryStr { get { return (_kontoTyp == KontoTypen.SuSa) ? Config.SuSaKontenQuery : Config.StatKontenQuery; } } protected override void AufgabeAusfuehren() { var import = Importieren(); Data.AddKonten(ImportInKontenUmwandeln(import)); } private IEnumerable Importieren() { List import; if (Data.Offlinemodus && File.Exists(Dateiname())) { import = File.ReadAllLines(Dateiname()).ToList(); } else { import = KontenVonOdbcLaden(); if (Data.ImportdatenSichern) { ImportdatenSichern(import); } } return import; } private List KontenVonOdbcLaden() { var result = new List(); using (var con = new OdbcConnection(Config.OdbcConnectionString)) { con.ConnectionTimeout = 300; con.Open(); var query = new OdbcCommand(QueryStr, con) {CommandTimeout = 300}; var reader = query.ExecuteReader(); while (reader.Read()) { var zeile = reader.GetString(0).Trim(); for (var i = 1; i < reader.FieldCount; i++) { zeile += ";" + reader.GetString(i).Trim(); } result.Add(zeile); } reader.Close(); con.Close(); } return result; } private void ImportdatenSichern(List import) { using (var sw = new StreamWriter(Dateiname(), false, Constants.CsvEncoding)) { sw.WriteLine(String.Join(Environment.NewLine, import.ToArray())); } } private string Dateiname() { return String.Format(Constants.Importdaten, HaendlerKonto.AktuellePeriode, _kontoTyp); } private List ImportInKontenUmwandeln(IEnumerable import) { var konten = (from tempZeile in import select tempZeile.Split(';') into feld group feld by (feld[0] + ";" + feld[3]) into kontoSaldi select NeuesKonto(kontoSaldi.ToList())).ToList(); if (_kontoTyp == KontoTypen.SuSa) { SummeSaldiPruefen(konten.Sum(konto => konto.Summe)); } ReportProgress(80); return konten; } private void SummeSaldiPruefen(Decimal summe) { var summeString = String.Format(Constants.Zahlenformat, "{0:c}", summe); Logger.Progress("Summe über alle SuSa-Konten: " + summeString); if (summe != 0.0m) { ReportProgress(75, "Beim Import der SuSa-Konten trat ein Fehler auf." + Environment.NewLine + "Die Summe über alle SuSa-Konten ist " + summeString + " €"); } } private HaendlerKonto NeuesKonto(IEnumerable kontoSaldi) { var neuesKonto = new HaendlerKonto(_kontoTyp); var feld = kontoSaldi.First(); neuesKonto.Kontonummer = Config.HaendlerKontonummerFormatieren(feld[0].Trim()); neuesKonto.DepartmentImport = feld[3].Trim(); Config.DepartmentAnpassen(neuesKonto); if (PeriodeMitgeliefert(feld)) { foreach (var saldo in kontoSaldi) { neuesKonto.SaldoZuordnen(saldo[4].Substring(0,6), ToDecimal(saldo[1]), ToDecimal(saldo[2])); } } else { neuesKonto.Soll = (from saldo in kontoSaldi select ToDecimal(saldo[1])).Sum(); neuesKonto.Haben = (from saldo in kontoSaldi select ToDecimal(saldo[2])).Sum(); } if (KontoartMitgeliefert(feld)) { neuesKonto.Kontoart = feld[5]; } return neuesKonto; } private static Decimal ToDecimal(string feld) { return Decimal.Parse(feld, Constants.ZahlenformatImport); } private static bool PeriodeMitgeliefert(IEnumerable feld) { return feld.Count() > 4; } private static bool KontoartMitgeliefert(IEnumerable feld) { return feld.Count() > 5; } } }