123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- 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<string> Importieren()
- {
- List<string> import;
- if (Data.Offlinemodus && File.Exists(Dateiname()))
- {
- import = File.ReadAllLines(Dateiname()).ToList();
- }
- else
- {
- import = KontenVonOdbcLaden();
- if (Data.ImportdatenSichern)
- {
- ImportdatenSichern(import);
- }
- }
- return import;
- }
- private List<string> KontenVonOdbcLaden()
- {
- var result = new List<string>();
- 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<string> 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<HaendlerKonto> ImportInKontenUmwandeln(IEnumerable<string> 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<string[]> 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();
- }
- return neuesKonto;
- }
- private static Decimal ToDecimal(string feld)
- {
- return Decimal.Parse(feld, Constants.ZahlenformatImport);
- }
- private static bool PeriodeMitgeliefert(IEnumerable<string> feld)
- {
- return feld.Count() > 4;
- }
- }
- }
|