Browse Source

- Mandantenschnittstelle verschoben
- Kia hinzugefügt
- MandantFactory

Robert Bedner 11 years ago
parent
commit
dc5f6571ad
42 changed files with 428 additions and 323 deletions
  1. 46 30
      Control/Tasks/Datenimport.cs
  2. 3 29
      Control/Tasks/Export.cs
  3. 2 1
      Control/Tasks/TaskManager.cs
  4. 7 7
      Control/Tasks/Verarbeitung.cs
  5. 2 2
      Control/ThreadXData.cs
  6. 0 4
      GCHR.sln.DotSettings.user
  7. 4 4
      Main.xaml.cs
  8. 0 4
      Mandantenschnittstelle/Mandanten.cs
  9. 11 0
      Model/Ampelstatus.cs
  10. 1 31
      Model/Constants.cs
  11. 4 4
      Model/DateipfadeXml.cs
  12. 8 9
      Model/GchrConfig.cs
  13. 20 8
      Model/Konfiguration.cs
  14. 4 4
      Model/Konto/HaendlerKonto.cs
  15. 2 3
      Model/Mandant/Citroen.cs
  16. 3 4
      Model/Mandant/Fiat.cs
  17. 4 6
      Model/Mandant/Ford.cs
  18. 2 3
      Model/Mandant/Honda.cs
  19. 1 1
      Model/Mandant/IMandant.cs
  20. 7 0
      Model/Mandant/Kia.cs
  21. 34 0
      Model/Mandant/MandantFactory.cs
  22. 4 0
      Model/Mandant/Mandanten.cs
  23. 3 4
      Model/Mandant/Opel.cs
  24. 2 3
      Model/Mandant/Peugeot.cs
  25. 1 1
      Model/Mandant/Renault.cs
  26. 1 1
      Model/Mandant/Test.cs
  27. 2 3
      Model/Mandant/Volkswagen.cs
  28. 3 4
      Model/Mandant/Volvo.cs
  29. 4 4
      Model/Periode.cs
  30. 8 0
      Model/Status.cs
  31. 16 22
      Model/Uebersetzung/Eintrag.cs
  32. 0 3
      Model/Uebersetzung/Exceptions.cs
  33. 8 11
      Model/Uebersetzung/HerstellerKontenrahmen.cs
  34. 7 7
      Model/Uebersetzung/HerstellerKonto.cs
  35. 29 30
      Model/Uebersetzung/KontoTyp.cs
  36. 14 16
      Model/Uebersetzung/Regel.cs
  37. 10 13
      Model/Uebersetzung/Uebersetzungstabelle.cs
  38. 0 45
      Tests/KonfigurationTest.cs
  39. 17 0
      Tests/Model/DateipfadeTest.cs
  40. 114 0
      Tests/Model/KonfigurationTest.cs
  41. 19 1
      Tests/Model/PeriodeTest.cs
  42. 1 1
      View/Einstellungen.xaml.cs

+ 46 - 30
Control/Tasks/Datenimport.cs

@@ -40,33 +40,29 @@ namespace GCHR.Control.Tasks
         {
             if (_kontoTyp == KontoTypen.Stat && !Config.StatKontenImportieren) return;
             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 if (Config.WebserviceAktiv)
+            if (Data.ImportdatenSichern)
             {
-                import = KontenVonWebserviceLaden();
+                ImportdatenSichern(import);
             }
-            else
+            var konten = ImportInKontenUmwandeln(import);
+            ReportProgress(80);
+            if (_kontoTyp == KontoTypen.SuSa)
             {
-                import = KontenVonOdbcLaden();
+                SummeSaldiPruefen(konten.Sum(konto => konto.Summe));
             }
+            Data.AddKonten(konten);
+        }
 
-            if (Data.ImportdatenSichern)
+        private IList<string> Importieren()
+        {
+            if (Data.Offlinemodus && File.Exists(Dateiname))
             {
-                ImportdatenSichern(import);
+                return File.ReadAllLines(Dateiname).ToList();
             }
-            return import;
+            return (Config.WebserviceAktiv) ? KontenVonWebserviceLaden() : KontenVonOdbcLaden();
         }
 
-        private List<string> KontenVonWebserviceLaden()
+        private IList<string> KontenVonWebserviceLaden()
         {
             var args = new NameValueCollection
                 {
@@ -82,7 +78,7 @@ namespace GCHR.Control.Tasks
             }
         }
 
-        private List<string> KontenVonOdbcLaden()
+        private IList<string> KontenVonOdbcLaden()
         {
             var result = new List<string>();
             using (var con = new OdbcConnection(Config.OdbcConnectionString))
@@ -108,11 +104,11 @@ namespace GCHR.Control.Tasks
             return result;
         }
 
-        private void ImportdatenSichern(List<string> import)
+        private void ImportdatenSichern(IEnumerable<string> import)
         {
             using (var sw = new StreamWriter(Dateiname, false, Constants.CsvEncoding))
             {
-                sw.WriteLine(String.Join(Environment.NewLine, import.ToArray()));
+                sw.WriteLine(string.Join(Environment.NewLine, import.ToArray()));
             }
         }
 
@@ -122,19 +118,39 @@ namespace GCHR.Control.Tasks
         }
 
 
-        private List<HaendlerKonto> ImportInKontenUmwandeln(IEnumerable<string> import)
+        private IList<HaendlerKonto> ImportInKontenUmwandeln(IList<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 (import == null || !import.Any())
+            {
+                ReportProgress(90, "Die Abfrage '" + _kontoTyp + "' lieferte keine Ergebnisse.");
+                return new List<HaendlerKonto>();
+            }
 
-            if (_kontoTyp == KontoTypen.SuSa)
+
+            try
             {
-                SummeSaldiPruefen(konten.Sum(konto => konto.Summe));
+                return (from tempZeile in import
+                        select tempZeile.Split(';')
+                        into feld
+                        group feld by (feld[0] + ";" + feld[3])
+                        into kontoSaldi
+                        select NeuesKonto(kontoSaldi.ToList())).ToList();
+            }
+            catch (IndexOutOfRangeException ex)
+            {
+                Logger.Info("Fehler in der Abfrage '" + _kontoTyp + "':" + ex.Message);
+                if (import.Count() > 10)
+                {
+                    Logger.Info("Erste Zeile: " + import[0]);
+                }
+                else
+                {
+                    Logger.Info("Import: " + Environment.NewLine + string.Join(Environment.NewLine, import.ToArray()));
+                    
+                }
+                ReportProgress(90, "Fehler in der Abfrage '" + _kontoTyp + "':" + Environment.NewLine + "Erste Zeile: " + import[0]);
+                return new List<HaendlerKonto>();
             }
-            ReportProgress(80);
-            return konten;
         }
 
         private void SummeSaldiPruefen(Decimal summe)

+ 3 - 29
Control/Tasks/Export.cs

@@ -2,9 +2,9 @@
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
-using GCHR.Mandantenschnittstelle;
 using GCHR.Model;
 using GCHR.Model.Konto;
+using GCHR.Model.Mandant;
 
 namespace GCHR.Control.Tasks
 {
@@ -18,41 +18,15 @@ namespace GCHR.Control.Tasks
         public Export(int id, string name)
             : base(id, name) 
         {
-            _mandant = MandantRegistrieren();
+            _mandant = MandantFactory.Create(Config.Mandantenname);
             HaendlerKonto.Mandant = _mandant;
             _debugExportFile = Config.AktuellePeriode.ProtokollDatei;
         }
 
         private const String DebugHeader =
-            "Konto_Nr_Hersteller;Konto_Bezeichnung;Konto_Nr_Haendler;Konto_Typ;Marke_Haendler;Betrieb_Haendler;Soll;Haben;Summe";
+            "Konto_Nr_Hersteller;Konto_Bezeichnung;Konto_Nr_Haendler;Konto_Typ;Konto_Art;Marke_Haendler;Betrieb_Haendler;Soll;Haben;Summe";
 
 
-        private IMandant MandantRegistrieren()
-        {
-            switch (Config.Mandantenname)
-            {
-                case Mandanten.Citroen:
-                    return new Citroen();
-                case Mandanten.Fiat:
-                    return new Fiat();
-                case Mandanten.Ford:
-                    return new Ford();
-                case Mandanten.Honda:
-                    return new Honda();
-                case Mandanten.Opel:
-                    return new Opel();
-                case Mandanten.Peugeot:
-                    return new Peugeot();
-                case Mandanten.Renault:
-                    return new Renault();
-                case Mandanten.Volkswagen:
-                    return new Volkswagen();
-                case Mandanten.Volvo:
-                    return new Volvo();
-            }
-            return null;
-        }
-
         /// <summary>
         /// Wartet auf das Eintreffen der manuellen Konten und startet dann den Export von Balance, Accounts und Debug, 
         /// falls entsprechende Dateiangaben gesetzt sind.

+ 2 - 1
Control/Tasks/TaskManager.cs

@@ -17,7 +17,8 @@ namespace GCHR.Control.Tasks
 
         public void CreateTasks(RunWorkerCompletedEventHandler completed, Periode periode)
         {
-            HaendlerKonto.AktuellePeriode = periode;                    
+            HaendlerKonto.AktuellePeriode = periode;
+            _config.AktuellePeriode = periode;        
 
             Data.SetDepartmentCase(CreateDepartmentCaseInstance());
 

+ 7 - 7
Control/Tasks/Verarbeitung.cs

@@ -21,10 +21,10 @@ namespace GCHR.Control.Tasks
             Data.AufSusaStatWarten.Set();
         }
 
-        private readonly Dictionary<string, HaendlerKonto> _zielKonten = new Dictionary<string, HaendlerKonto>();
+        private readonly IDictionary<string, HaendlerKonto> _zielKonten = new Dictionary<string, HaendlerKonto>();
 
-        private readonly Dictionary<string, string> _nichtZugeordnet = new Dictionary<string, string>();
-        private readonly Dictionary<string, string> _nichtImKontenrahmen = new Dictionary<string, string>();
+        private readonly IDictionary<string, string> _nichtZugeordnet = new SortedDictionary<string, string>();
+        private readonly IDictionary<string, string> _nichtImKontenrahmen = new SortedDictionary<string, string>();
 
         private readonly HaendlerKonto _debugKontoKontenrahmen = new HaendlerKonto(KontoTypen.Debug) { Kontonummer = "00000000_1", Bezeichnung = "nicht im Kontenrahmen" };
         private readonly HaendlerKonto _debugKontoUebersetzung = new HaendlerKonto(KontoTypen.Debug) { Kontonummer = "00000000_2", Bezeichnung = "Uebersetzung fehlt" };
@@ -51,9 +51,9 @@ namespace GCHR.Control.Tasks
 
             if (kontonummer == null)
             {
-                if (aktKonto.Summe != 0.0m && !_nichtZugeordnet.ContainsKey(aktKonto.Kontonummer + aktKonto.KontoTyp))
+                if (aktKonto.Summe != 0.0m && !_nichtZugeordnet.ContainsKey(aktKonto.KontoTyp + aktKonto.Kontonummer))
                 {
-                    _nichtZugeordnet.Add(aktKonto.Kontonummer + aktKonto.KontoTyp, DebugInfo(aktKonto));
+                    _nichtZugeordnet.Add(aktKonto.KontoTyp + aktKonto.Kontonummer, DebugInfo(aktKonto));
                 }
                 _debugKontoUebersetzung.KontoZuordnen(aktKonto);
                 return;
@@ -114,8 +114,8 @@ namespace GCHR.Control.Tasks
 
         private static string DebugInfo(string kontonummer, HaendlerKonto aktKonto)
         {
-            return String.Format("{0} (Typ: {1}, Summe: {2}, Anzahl Perioden: {3})",
-                                    kontonummer, aktKonto.KontoTyp, aktKonto.Summe, aktKonto.ZugeordneteSaldi.Count);
+            return String.Format("{0} (Typ: {1}, Kontoart: {4}, Summe (M:{5}, B:{6}): {2}, Anzahl Perioden: {3})",
+                                    kontonummer, aktKonto.KontoTyp, aktKonto.Summe, aktKonto.ZugeordneteSaldi.Count, aktKonto.Kontoart, aktKonto.Marke, aktKonto.Betrieb);
         }
 
         private static string DebugInfo(HaendlerKonto aktKonto)

+ 2 - 2
Control/ThreadXData.cs

@@ -48,7 +48,7 @@ namespace GCHR.Control
         {
             lock (_konten)
             {
-                _konten.Sort((k1, k2) => k1.ToString().CompareTo(k2.ToString()));
+                _konten.Sort((k1, k2) => String.Compare(k1.ToString(), k2.ToString(), StringComparison.Ordinal));
                 return _konten;
             }
         }
@@ -69,7 +69,7 @@ namespace GCHR.Control
             }
         }
 
-        public void AddKonten(List<HaendlerKonto> konten)
+        public void AddKonten(IList<HaendlerKonto> konten)
         {
             lock (_konten)
             {

+ 0 - 4
GCHR.sln.DotSettings.user

@@ -1,4 +0,0 @@
-<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
-	<s:String x:Key="/Default/Environment/UnitTesting/NUnitProvider/CustomNUnitFolder/@EntryValue">C:\Program Files (x86)\NUnit 2.5.3\bin\net-2.0\</s:String>
-	<s:String x:Key="/Default/Environment/UnitTesting/NUnitProvider/UseAddins/@EntryValue">Never</s:String>
-	<s:Boolean x:Key="/Default/Housekeeping/SolutionSettingsUpgraded/IsUpgraded/@EntryValue">True</s:Boolean></wpf:ResourceDictionary>

+ 4 - 4
Main.xaml.cs

@@ -101,10 +101,10 @@ namespace GCHR
             for (var i = 0; i < monateZurueck; i++)
             {
                 neuerMonat = neuerMonat.Vorgaenger;
-                if (File.Exists(neuerMonat.Vorgaenger.BalanceDatei))
-                {
-                    return neuerMonat;
-                }
+                if (!File.Exists(neuerMonat.Vorgaenger.BalanceDatei)) continue;
+                var aelterAlsFuenfTage =
+                    File.GetLastWriteTime(neuerMonat.Vorgaenger.BalanceDatei).AddDays(5).CompareTo(DateTime.Now) <= 0;
+                return (aelterAlsFuenfTage) ? neuerMonat : neuerMonat.Vorgaenger;
             }
             return neuerMonat.Nachfolger;
         }

+ 0 - 4
Mandantenschnittstelle/Mandanten.cs

@@ -1,4 +0,0 @@
-namespace GCHR.Mandantenschnittstelle
-{
-    public enum Mandanten { Citroen, Fiat, Ford, Honda, Opel, Peugeot, Renault, Volkswagen, Volvo };
-}

+ 11 - 0
Model/Ampelstatus.cs

@@ -0,0 +1,11 @@
+namespace GCHR.Model
+{
+    public enum Ampelstatus
+    {
+        Keine = -1,
+        Arbeitend = 0,
+        Gruen = 1,
+        Gelb = 2,
+        Rot = 3
+    }
+}

+ 1 - 31
Model/Constants.cs

@@ -1,25 +1,10 @@
-using System;
-using System.Globalization;
+using System.Globalization;
 using System.Text;
 
 namespace GCHR.Model
 {
     internal static class Constants
     {
-        public static string Vormonat(string periode)
-        {
-            var jahr = Int32.Parse(periode.Substring(0, 4));
-            var monat = Int32.Parse(periode.Substring(4, 2));
-
-            monat--;
-            if (monat == 0)
-            {
-                monat = 12;
-                jahr--;
-            }
-            return jahr + monat.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0');
-        }
-
         private static readonly byte[] Key = {76, 123, 122, 84, 45, 12, 44, 78, 56, 43, 47, 6, 
               2, 13, 23, 23, 45, 255, 65, 20, 33, 5, 235, 66};
         private static readonly byte[] Iv = { 56, 254, 98, 123, 66, 4, 90, 34, 111, 34, 78, 33, 222, 80, 74, 35 };
@@ -46,19 +31,4 @@ namespace GCHR.Model
         public static NumberFormatInfo Zahlenformat = CultureInfo.GetCultureInfo("de-DE").NumberFormat;
         public static NumberFormatInfo ZahlenformatImport = CultureInfo.GetCultureInfo("en-US").NumberFormat;
     }
-
-    public enum Ampelstatus
-    {
-        Keine = -1,
-        Arbeitend = 0,
-        Gruen = 1,
-        Gelb = 2,
-        Rot = 3
-    }
-
-    public class Status
-    {
-        public Ampelstatus Ampelstatus;
-        public string Message;
-    }
 }

+ 4 - 4
Model/DateipfadeXml.cs

@@ -10,9 +10,9 @@
 
         public string ManuelleKonten = "data\\ManuelleKonten.xml";
 
-        public string ExportBalance = "export\\{0}\\export_{0}-{1}_balance.txt";
-        public string ExportAccounts = "export\\{0}\\export_{0}-{1}_accounts.txt";
-        public string ExportLog = "export\\{0}\\export_{0}-{1}_info.log";
-        public string ExportProtokoll = "export\\{0}\\export_{0}-{1}_protokoll.csv";
+        public string ExportBalance = "export\\{2}\\export_{0}-{1}_balance.txt";
+        public string ExportAccounts = "export\\{2}\\export_{0}-{1}_accounts.txt";
+        public string ExportLog = "export\\{2}\\export_{0}-{1}_info.log";
+        public string ExportProtokoll = "export\\{2}\\export_{0}-{1}_protokoll.csv";
     }
 }

+ 8 - 9
Model/GchrConfig.cs

@@ -3,8 +3,8 @@ using System.Collections.Generic;
 using System.IO;
 using System.Xml.Schema;
 using System.Xml.Serialization;
-using GCHR.Mandantenschnittstelle;
 using GCHR.Model.Konto;
+using GCHR.Model.Mandant;
 
 namespace GCHR.Model
 {
@@ -54,7 +54,7 @@ namespace GCHR.Model
         public string Haendler = "Autohaus";
 
         public Mandanten Mandantenname = Mandanten.Opel;
-        public string Eurodatanummer = "000000";
+        public string Eurodatanummer = "00000000";
 
         [XmlElement("Händlernummer")]
         public string Haendlernummer = "000000";
@@ -65,9 +65,6 @@ namespace GCHR.Model
         [XmlElement("Händlerkontenrahmen", DataType = "int")]
         public int Haendlerkontenrahmen = 5;
 
-        public string Marke = "Department,3,1";
-        public string Betrieb = "Department,1,2";
-
         public string Hauptmarke = "1";
         public string Hauptbetrieb = "01";
 
@@ -102,6 +99,8 @@ namespace GCHR.Model
         [XmlElement("P")]
         public string OdbcPassword = Constants.Encrypt("");
 
+        public string Datenbank = "deop00";
+
         public AbfragenXml Abfragen = new AbfragenXml();
         
         [XmlArray("DepartmentÜbersetzung")]
@@ -157,11 +156,11 @@ namespace GCHR.Model
     [XmlRoot("Abfragen")]
     public class AbfragenXml
     {
-        [XmlElement("AB")]
-        public string SuSaKontenQuery;
+        [XmlElement("AB")] public string SuSaKontenQuery =
+            "DVrUHLvXeCt+FJ9iR52w8Nf9GbFBnru0uyqX06FC24LF+LPIjESLb6OLaB+go7HUe3yzHSc7VHszzJ/tfURIvzN7ta6JdXkmjGJcLxxFcExNRfC5iCe0IdyBIgogP3lVyRZdOsCGKpOQ3LAnA8dt1n/kHvOivGCP9JPHwGYoXokkVWXUxDH7eOYRB0pJWGiF3MmC5keteH8lrqTDP9kHFw73QqzjUuDKQukgQd6iwL3DXQY+2W0l5jGX7rVuAHchjUHmahC/8l0+lCvs68VFpwQDRQpKjmPZqriponnOebxL4/G0Lt6yyM4+b1YH2skOinuAw7G7VYNYVNpoapUBBn5LzbupINaU78Tobl2LVYgA4z49KFecfm4iq+Sf+R5Rgp0cQbmnpjm98z88zT6wTOxPHdac2uif8L+3DWUbtZc7OoqgkaFWDvCFf8iKY1XXtgZLchb1Nz2N9nn7nkM5wA4dN5l1UqTT9Xdnfl+pAoP5znuLUeanDecVuPmMX6yzaAalyQRO+Ox5r1EcPLMM8hkK5b0XztZ5TSa9vWpb/NY=";
 
-        [XmlElement("ABS")]
-        public string StatKontenQuery;
+        [XmlElement("ABS")] public string StatKontenQuery =
+            "pAYfFlGeHG/yGbIb2wXh1LFhPVFAI854oD1wfw8Kppuk6FTH1LRAU7jvCUgqLliktrf8tq5ojrLD3lWpiemQ9gisq9FPNpwZS0xnYgYw+JUGAmRvpldbKEQ9gAOHURmVPA1MkJfIAEqWKgQHLkBCvt7DKsdRia1+qxlYoJeVItd1wvr7ICiCdgWhUI/9+ZEzFd/DfFgX03n/3ujJH2JFYo42vYKmRhjmwtiQ5unkJkH02/PdGNTRW18PSfGCsvUlfl8ba176Bt8zYnDS7ILI2K7f50tyDBP3KycmfYzoy3lDZItgCLkJIRGJPRDXSZ/1NISoVJBDpNbMjt6zDgUo2hhsWiCzbhej4U+DO4ZoUhG03TBPgywJuuudLBSO8c2i93/APt0f4kWEg8imluVPjJh16/6HscIc2cr0pRQSwrBJ3ZVKybeyKJ260mzB7p5zYTBAa2EgTBIIYk8YBfTXY+ezFKgv6xgE0ynW7eLtJtd449NLrUZhnYDHzV6heAak9B0cwaL4Y+Xfi5KrHFLMU07rbjavwQNhnChMNcLSyNgpSZFHwiJ5jg==";
     }
 
     [XmlRoot("Über")]

+ 20 - 8
Model/Konfiguration.cs

@@ -1,11 +1,12 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Text.RegularExpressions;
 using GCHR.Control;
 using GCHR.Control.IO;
-using GCHR.Mandantenschnittstelle;
 using GCHR.Model.Konto;
+using GCHR.Model.Mandant;
 
 namespace GCHR.Model
 {
@@ -17,7 +18,8 @@ namespace GCHR.Model
 
         public static Konfiguration CreateInstance(string cfgDatei)
         {
-            return _instance ?? (_instance = new Konfiguration(cfgDatei));
+            _instance = new Konfiguration(cfgDatei);
+            return _instance;
         }
 
         public static Konfiguration GetInstance()
@@ -43,16 +45,19 @@ namespace GCHR.Model
             AktuellePeriode = new Periode("200001");
             _configDatei = cfgDatei;
             _gchrConfig = (GchrConfig)new GchrConfigIO(_configDatei).Laden();
-            _konten = (Konten) new KontenIO(_gchrConfig.Dateipfade.ManuelleKonten).Laden();
+            _konten = (Konten) new KontenIO(ManuelleKonten).Laden();
             KontenXmlUmsortieren();
             Periode.Dateipfade = _gchrConfig.Dateipfade;
             Periode.ErsterMonatImGeschaeftsjahr = _gchrConfig.Einstellungen.Geschaeftsjahr;
-            AktuellePeriode = new Periode("200001");
             Logger.ConfigDatei = cfgDatei;
-            if (!Logger.DateiExistiert)
+            if (!Logger.DateiExistiert || !File.Exists(_configDatei))
             {
                 Speichern();
             }
+            if (!File.Exists(ManuelleKonten))
+            {
+                ManuelleKontenSpeichern();
+            }
         }
 
         private void KontenXmlUmsortieren()
@@ -80,7 +85,7 @@ namespace GCHR.Model
 
         public void ManuelleKontenSpeichern()
         {
-            new KontenIO(_gchrConfig.Dateipfade.ManuelleKonten).Speichern(_konten);
+            new KontenIO(ManuelleKonten).Speichern(_konten);
         }
 
         public string Haendler
@@ -92,7 +97,7 @@ namespace GCHR.Model
         }
 
 
-        public string Haendlernummer
+        public string HaendlernummerBmCode
         {
             get
             {
@@ -265,7 +270,12 @@ namespace GCHR.Model
 
         private string QueryAnpassen(string queryStr, Periode aktuellePeriode)
         {
-            queryStr = Regex.Replace(queryStr, @"\<datenbank\>", "");
+            var datenbank = _gchrConfig.Einstellungen.Datenbank;
+            if (datenbank.Length > 0 && datenbank.Substring(0, 2) == "de")
+            {
+                datenbank += ".dbo.";
+            }
+            queryStr = Regex.Replace(queryStr, @"\<datenbank\>", datenbank);
 
             queryStr = Regex.Replace(queryStr, @"\<period[e]?\>", aktuellePeriode.ToString());
             queryStr = Regex.Replace(queryStr, @"\<jahresbeginn\>", aktuellePeriode.Jahresbeginn.ToString());
@@ -330,5 +340,7 @@ namespace GCHR.Model
         {
             get { return _gchrConfig.Einstellungen.StatImport; }
         }
+
+        public object Datenbank { get { return _gchrConfig.Einstellungen.Datenbank; } }
     }
 }

+ 4 - 4
Model/Konto/HaendlerKonto.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Xml.Serialization;
-using GCHR.Mandantenschnittstelle;
+using GCHR.Model.Mandant;
 
 namespace GCHR.Model.Konto
 {
@@ -190,15 +190,15 @@ namespace GCHR.Model.Konto
                 {
                     return new List<string>
                     {
-                        string.Format("'{0};{8};;;{1}{2};'{3};'{4};{5:0.2};{6:0.00};{7:0.00}", KontonummerFormatiert,
+                        string.Format("'{0};{8};;{1}{2};;'{3};'{4};{5:0.2};{6:0.00};{7:0.00}", KontonummerFormatiert,
                                       KontoTypKuerzel(KontoTyp), Minus, Marke, Betrieb, Soll, Haben, Summe, Bezeichnung)
                     };
                 }
 
                 return new List<string>
                     {
-                        string.Format("'{0};{1}{2};'{3};'{4};{5:0.00};{6:0.00};{7:0.00}", Kontonummer,
-                                      KontoTypKuerzel(KontoTyp), Minus, Marke, Betrieb, Soll, Haben, Summe)
+                        string.Format("'{0};{1}{2};{8};'{3};'{4};{5:0.00};{6:0.00};{7:0.00}", Kontonummer,
+                                      KontoTypKuerzel(KontoTyp), Minus, Marke, Betrieb, Soll, Haben, Summe, Kontoart)
                     };
             }
         }

+ 2 - 3
Mandantenschnittstelle/Citroen.cs → Model/Mandant/Citroen.cs

@@ -1,9 +1,8 @@
 using System;
 using System.Text.RegularExpressions;
-using GCHR.Model;
 using GCHR.Model.Konto;
 
-namespace GCHR.Mandantenschnittstelle
+namespace GCHR.Model.Mandant
 {
     class Citroen : IMandant
     {
@@ -29,7 +28,7 @@ namespace GCHR.Mandantenschnittstelle
         {
             get
             {
-                return String.Format("01{0}{1}{2}{3}", _config.Haendlernummer.PadLeft(7, '0'), _config.Eurodatanummer, _config.AktuellePeriode.Monat, _config.AktuellePeriode.JahrZweistellig);
+                return String.Format("01{0}{1}{2}{3}", _config.HaendlernummerBmCode.PadLeft(7, '0'), _config.Eurodatanummer, _config.AktuellePeriode.Monat, _config.AktuellePeriode.JahrZweistellig);
             }
         }
 

+ 3 - 4
Mandantenschnittstelle/Fiat.cs → Model/Mandant/Fiat.cs

@@ -1,8 +1,7 @@
 using System;
-using GCHR.Model;
 using GCHR.Model.Konto;
 
-namespace GCHR.Mandantenschnittstelle
+namespace GCHR.Model.Mandant
 {
     class Fiat : IMandant
     {
@@ -28,7 +27,7 @@ namespace GCHR.Mandantenschnittstelle
         {
             get
             {
-                return String.Format("AA{0} {1}{2} ,20EUR", _config.Haendlernummer, _config.AktuellePeriode.Monat, _config.AktuellePeriode.JahrZweistellig);
+                return String.Format("AA{0} {1}{2} ,20EUR", _config.HaendlernummerBmCode, _config.AktuellePeriode.Monat, _config.AktuellePeriode.JahrZweistellig);
             }
         }
 
@@ -36,7 +35,7 @@ namespace GCHR.Mandantenschnittstelle
         {
             get
             {
-                return String.Format("XX{0} {1}{2}", _config.Haendlernummer, _config.AktuellePeriode.Monat, _config.AktuellePeriode.JahrZweistellig);
+                return String.Format("XX{0} {1}{2}", _config.HaendlernummerBmCode, _config.AktuellePeriode.Monat, _config.AktuellePeriode.JahrZweistellig);
             }
         }
 

+ 4 - 6
Mandantenschnittstelle/Ford.cs → Model/Mandant/Ford.cs

@@ -1,9 +1,7 @@
-
-using System;
-using GCHR.Model;
+using System;
 using GCHR.Model.Konto;
 
-namespace GCHR.Mandantenschnittstelle
+namespace GCHR.Model.Mandant
 {
     class Ford : IMandant
     {
@@ -41,7 +39,7 @@ namespace GCHR.Mandantenschnittstelle
         {
             get
             {
-                return String.Format("AA{0}M{1}{2} .20EUR", Config.Haendlernummer, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
+                return String.Format("AA{0} {1}{2} .20EUR", Config.HaendlernummerBmCode, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
             }
         }
 
@@ -49,7 +47,7 @@ namespace GCHR.Mandantenschnittstelle
         {
             get
             {
-                return String.Format("XX{0}M{1}{2}", Config.Haendlernummer, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
+                return String.Format("XX{0} {1}{2}", Config.HaendlernummerBmCode, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
             }
 
         }

+ 2 - 3
Mandantenschnittstelle/Honda.cs → Model/Mandant/Honda.cs

@@ -1,8 +1,7 @@
 using System;
-using GCHR.Model;
 using GCHR.Model.Konto;
 
-namespace GCHR.Mandantenschnittstelle
+namespace GCHR.Model.Mandant
 {
     class Honda : IMandant
     {
@@ -31,7 +30,7 @@ namespace GCHR.Mandantenschnittstelle
                 return
                     string.Format(
                         "{1};Dealernumber{0};Honda Germany{0}{2};Evaluation;{3}{0}{4};Fiscal-Year;{5}{0};Timestamp;{6}",
-                        Environment.NewLine, Config.Haendlernummer, Config.AktuellePeriode.Jahr,
+                        Environment.NewLine, Config.HaendlernummerBmCode, Config.AktuellePeriode.Jahr,
                         Config.AktuellePeriode.Monat,
                         Config.AktuellePeriode.Jahresbeginn.Jahr,
                         Config.AktuellePeriode.Jahresbeginn.Monat,

+ 1 - 1
Mandantenschnittstelle/IMandant.cs → Model/Mandant/IMandant.cs

@@ -1,6 +1,6 @@
 using GCHR.Model.Konto;
 
-namespace GCHR.Mandantenschnittstelle
+namespace GCHR.Model.Mandant
 {
     interface IMandant
     {

+ 7 - 0
Model/Mandant/Kia.cs

@@ -0,0 +1,7 @@
+
+namespace GCHR.Model.Mandant
+{
+    class Kia : Opel
+    {
+    }
+}

+ 34 - 0
Model/Mandant/MandantFactory.cs

@@ -0,0 +1,34 @@
+namespace GCHR.Model.Mandant
+{
+    class MandantFactory
+    {
+
+        internal static IMandant Create(Mandanten mandanten)
+        {
+            switch (mandanten)
+            {
+                case Mandanten.Citroen:
+                    return new Citroen();
+                case Mandanten.Fiat:
+                    return new Fiat();
+                case Mandanten.Ford:
+                    return new Ford();
+                case Mandanten.Honda:
+                    return new Honda();
+                case Mandanten.Kia:
+                    return new Kia();
+                case Mandanten.Opel:
+                    return new Opel();
+                case Mandanten.Peugeot:
+                    return new Peugeot();
+                case Mandanten.Renault:
+                    return new Renault();
+                case Mandanten.Volkswagen:
+                    return new Volkswagen();
+                case Mandanten.Volvo:
+                    return new Volvo();
+            }
+            return new Test();
+        }
+    }
+}

+ 4 - 0
Model/Mandant/Mandanten.cs

@@ -0,0 +1,4 @@
+namespace GCHR.Model.Mandant
+{
+    public enum Mandanten { Citroen, Fiat, Ford, Honda, Kia, Opel, Peugeot, Renault, Volkswagen, Volvo };
+}

+ 3 - 4
Mandantenschnittstelle/Opel.cs → Model/Mandant/Opel.cs

@@ -1,8 +1,7 @@
 using System;
-using GCHR.Model;
 using GCHR.Model.Konto;
 
-namespace GCHR.Mandantenschnittstelle
+namespace GCHR.Model.Mandant
 {
     class Opel : IMandant
     {
@@ -28,7 +27,7 @@ namespace GCHR.Mandantenschnittstelle
         {
             get
             {
-                return String.Format("AA{0}M{1}{2} .20EUR", Config.Haendlernummer, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
+                return String.Format("AA{0}M{1}{2} .20EUR", Config.HaendlernummerBmCode, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
             }
         }
 
@@ -36,7 +35,7 @@ namespace GCHR.Mandantenschnittstelle
         {
             get
             {
-                return String.Format("XX{0}M{1}{2}", Config.Haendlernummer, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
+                return String.Format("XX{0}M{1}{2}", Config.HaendlernummerBmCode, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
             }
 
         }

+ 2 - 3
Mandantenschnittstelle/Peugeot.cs → Model/Mandant/Peugeot.cs

@@ -1,9 +1,8 @@
 using System;
 using System.Text.RegularExpressions;
-using GCHR.Model;
 using GCHR.Model.Konto;
 
-namespace GCHR.Mandantenschnittstelle
+namespace GCHR.Model.Mandant
 {
     class Peugeot : IMandant
     {
@@ -29,7 +28,7 @@ namespace GCHR.Mandantenschnittstelle
         {
             get
             {
-                return String.Format("01{0}{1}{2}{3}", _config.Haendlernummer.PadLeft(7, '0'), _config.Eurodatanummer, _config.AktuellePeriode.Monat, _config.AktuellePeriode.JahrZweistellig);
+                return String.Format("01{0}{1}{2}{3}", _config.HaendlernummerBmCode.PadLeft(7, '0'), _config.Eurodatanummer, _config.AktuellePeriode.Monat, _config.AktuellePeriode.JahrZweistellig);
             }
         }
 

+ 1 - 1
Mandantenschnittstelle/Renault.cs → Model/Mandant/Renault.cs

@@ -1,5 +1,5 @@
 
-namespace GCHR.Mandantenschnittstelle
+namespace GCHR.Model.Mandant
 {
     class Renault : Opel
     {

+ 1 - 1
Mandantenschnittstelle/Test.cs → Model/Mandant/Test.cs

@@ -1,7 +1,7 @@
 using System;
 using GCHR.Model.Konto;
 
-namespace GCHR.Mandantenschnittstelle
+namespace GCHR.Model.Mandant
 {
     class Test : IMandant
     {

+ 2 - 3
Mandantenschnittstelle/Volkswagen.cs → Model/Mandant/Volkswagen.cs

@@ -2,10 +2,9 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Xml.Linq;
-using GCHR.Model;
 using GCHR.Model.Konto;
 
-namespace GCHR.Mandantenschnittstelle
+namespace GCHR.Model.Mandant
 {
     class Volkswagen : IMandant
     {
@@ -64,7 +63,7 @@ namespace GCHR.Mandantenschnittstelle
                                     new XElement(Tns + "PartnerKey",
                                         new XElement(Tns + "Country", Country),
                                         new XElement(Tns + "Brand", Hauptmarke.V),
-                                        new XElement(Tns + "PartnerNumber", _config.Haendlernummer)
+                                        new XElement(Tns + "PartnerNumber", _config.HaendlernummerBmCode)
                                     ),
                                     new XElement(Tns + "IsCumulative", "true"),
                                     new XElement(Tns + "AccountingDate",

+ 3 - 4
Mandantenschnittstelle/Volvo.cs → Model/Mandant/Volvo.cs

@@ -1,8 +1,7 @@
 using System;
-using GCHR.Model;
 using GCHR.Model.Konto;
 
-namespace GCHR.Mandantenschnittstelle
+namespace GCHR.Model.Mandant
 {
     class Volvo : IMandant
     {
@@ -28,7 +27,7 @@ namespace GCHR.Mandantenschnittstelle
         {
             get
             {
-                return String.Format("AA{0}F{1}{2} .20EUR", Config.Haendlernummer, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
+                return String.Format("AA{0}F{1}{2} .20EUR", Config.HaendlernummerBmCode, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
             }
         }
 
@@ -36,7 +35,7 @@ namespace GCHR.Mandantenschnittstelle
         {
             get
             {
-                return String.Format("XX{0}F{1}{2}", Config.Haendlernummer, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
+                return String.Format("XX{0}F{1}{2}", Config.HaendlernummerBmCode, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
             }
 
         }

+ 4 - 4
Model/Periode.cs

@@ -105,7 +105,7 @@ namespace GCHR.Model
         {
             get
             {
-                return String.Format(Dateipfade.ExportBalance, Jahr, Monat);
+                return String.Format(Dateipfade.ExportBalance, Jahr, Monat, Jahresbeginn.Jahr);
             }
         }
 
@@ -113,7 +113,7 @@ namespace GCHR.Model
         {
             get
             {
-                return String.Format(Dateipfade.ExportAccounts, Jahr, Monat);
+                return String.Format(Dateipfade.ExportAccounts, Jahr, Monat, Jahresbeginn.Jahr);
             }
         }
 
@@ -121,7 +121,7 @@ namespace GCHR.Model
         {
             get
             {
-                var datei = String.Format(Dateipfade.ExportLog, Jahr, Monat);
+                var datei = String.Format(Dateipfade.ExportLog, Jahr, Monat, Jahresbeginn.Jahr);
                 return datei;
             }
         }
@@ -130,7 +130,7 @@ namespace GCHR.Model
         {
             get
             {
-                return String.Format(Dateipfade.ExportProtokoll, Jahr, Monat);
+                return String.Format(Dateipfade.ExportProtokoll, Jahr, Monat, Jahresbeginn.Jahr);
             }
         }
 

+ 8 - 0
Model/Status.cs

@@ -0,0 +1,8 @@
+namespace GCHR.Model
+{
+    public class Status
+    {
+        public Ampelstatus Ampelstatus;
+        public string Message;
+    }
+}

+ 16 - 22
Model/Uebersetzung/Eintrag.cs

@@ -1,7 +1,4 @@
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
 using GCHR.Model.Konto;
 
 namespace GCHR.Model.Uebersetzung
@@ -10,22 +7,22 @@ namespace GCHR.Model.Uebersetzung
     {
         public string KontonummerHaendler;
 
-        private string ktnrHerstellerSusa = "";
-        private string ktnrHerstellerSusaSplit = "";
-        private string ktnrHerstellerStat = "";
-        private string ktnrHerstellerStatSplit = "";
+        private readonly string _ktnrHerstellerSusa = "";
+        private readonly string _ktnrHerstellerSusaSplit = "";
+        private readonly string _ktnrHerstellerStat = "";
+        private readonly string _ktnrHerstellerStatSplit = "";
 
         public Eintrag(string csv)
         {
-            string[] feld = csv.Split(new char[] { ';' });
+            var feld = csv.Split(new[] { ';' });
 
             try
             {
                 KontonummerHaendler = feld[0];
-                ktnrHerstellerSusa = feld[1];
-                ktnrHerstellerSusaSplit = feld[2];
-                ktnrHerstellerStat = feld[3];
-                ktnrHerstellerStatSplit = feld[4];
+                _ktnrHerstellerSusa = feld[1];
+                _ktnrHerstellerSusaSplit = feld[2];
+                _ktnrHerstellerStat = feld[3];
+                _ktnrHerstellerStatSplit = feld[4];
             }
             catch (ArgumentOutOfRangeException)
             {
@@ -34,32 +31,29 @@ namespace GCHR.Model.Uebersetzung
 
         public override string ToString()
         {
-            return String.Join(";", new string[] { KontonummerHaendler, ktnrHerstellerSusa, ktnrHerstellerSusaSplit,
-                                                   ktnrHerstellerStat, ktnrHerstellerStatSplit });
+            return String.Join(";", new[] { KontonummerHaendler, _ktnrHerstellerSusa, _ktnrHerstellerSusaSplit,
+                                                   _ktnrHerstellerStat, _ktnrHerstellerStatSplit });
         }    
 
         public string Uebersetzen(HaendlerKonto haendlerKonto, bool split)
         {
-            string herstellerKontonummer = uebersetzen(haendlerKonto, split);
+            var herstellerKontonummer = KontoUebersetzen(haendlerKonto, split);
             if (herstellerKontonummer == "") throw new KontoNichtZugeordnetException(haendlerKonto);
             return herstellerKontonummer;
         }
 
-        private string uebersetzen(HaendlerKonto haendlerKonto, bool split)
+        private string KontoUebersetzen(HaendlerKonto haendlerKonto, bool split)
         {
             if (haendlerKonto.KontoTyp == KontoTypen.Stat)
             {
-                return (split) ? ktnrHerstellerStatSplit : ktnrHerstellerStat;
-            }
-            else
-            {
-                return (split) ? ktnrHerstellerSusaSplit : ktnrHerstellerSusa;
+                return (split) ? _ktnrHerstellerStatSplit : _ktnrHerstellerStat;
             }
+            return (split) ? _ktnrHerstellerSusaSplit : _ktnrHerstellerSusa;
         }
 
         public void Debug(bool susaKonto, bool splitKontenVerwenden)
         {
-            if (susaKonto && ktnrHerstellerSusa == "")
+            if (susaKonto && _ktnrHerstellerSusa == "")
                 throw new KontoNichtZugeordnetException(KontonummerHaendler);
         }
     }

+ 0 - 3
Model/Uebersetzung/Exceptions.cs

@@ -1,7 +1,4 @@
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
 using GCHR.Model.Konto;
 
 namespace GCHR.Model.Uebersetzung

+ 8 - 11
Model/Uebersetzung/HerstellerKontenrahmen.cs

@@ -1,31 +1,28 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using System.Collections.Generic;
 using System.IO;
 
 namespace GCHR.Model.Uebersetzung
 {
     class HerstellerKontenrahmen
     {
-        private Dictionary<string, HerstellerKonto> kontenrahmen = new Dictionary<string, HerstellerKonto>();
+        private readonly Dictionary<string, HerstellerKonto> _kontenrahmen = new Dictionary<string, HerstellerKonto>();
 
         public HerstellerKontenrahmen(StreamReader sr)
         {
             while (!sr.EndOfStream)
             {
-                HerstellerKonto kto = new HerstellerKonto(sr.ReadLine());
-                while (kontenrahmen.ContainsKey(kto.Kontonummer))
+                var kto = new HerstellerKonto(sr.ReadLine());
+                while (_kontenrahmen.ContainsKey(kto.Kontonummer))
                 {
                     kto.Kontonummer += "X";
                 }
-                kontenrahmen.Add(kto.Kontonummer, kto);
+                _kontenrahmen.Add(kto.Kontonummer, kto);
             }
         }
 
         public void Speichern(StreamWriter sw)
         {
-            foreach (HerstellerKonto kto in kontenrahmen.Values)
+            foreach (var kto in _kontenrahmen.Values)
             {
                 sw.WriteLine(kto);
             }
@@ -33,12 +30,12 @@ namespace GCHR.Model.Uebersetzung
 
         public bool Contains(string kontonummer)
         {
-            return kontenrahmen.ContainsKey(kontonummer);
+            return _kontenrahmen.ContainsKey(kontonummer);
         }
 
         public HerstellerKonto Get(string kontonummer)
         {
-            return kontenrahmen[kontonummer];
+            return _kontenrahmen[kontonummer];
         }
 
 

+ 7 - 7
Model/Uebersetzung/HerstellerKonto.cs

@@ -19,9 +19,9 @@ namespace GCHR.Model.Uebersetzung
                 KontoRegel = new Regel(kontoInfo[4]);
                 VerrechnungVon = kontoInfo[5];
                 VerrechnungNach = kontoInfo[6];
-                Konto_3 = kontoInfo[7];
-                Konto_4 = kontoInfo[8];
-                Konto_5 = kontoInfo[9];
+                Konto3 = kontoInfo[7];
+                Konto4 = kontoInfo[8];
+                Konto5 = kontoInfo[9];
                 Ebenen = kontoInfo[10];
             }
             catch (ArgumentOutOfRangeException)
@@ -34,7 +34,7 @@ namespace GCHR.Model.Uebersetzung
         public override string ToString()
         {
             return String.Join(";", new string[] { Kontonummer, Bezeichnung, Kontoart, KontoTyp.ToString(), KontoRegel.ToString(), 
-                                                   VerrechnungVon, VerrechnungNach, Konto_3, Konto_4, Konto_5, Ebenen });
+                                                   VerrechnungVon, VerrechnungNach, Konto3, Konto4, Konto5, Ebenen });
         }
         
         #region IKonto Member
@@ -52,9 +52,9 @@ namespace GCHR.Model.Uebersetzung
         public Regel KontoRegel { get; set; }
         public string VerrechnungVon { get; set; }
         public string VerrechnungNach { get; set; }
-        public string Konto_3 { get; set; }
-        public string Konto_4 { get; set; }
-        public string Konto_5 { get; set; }
+        public string Konto3 { get; set; }
+        public string Konto4 { get; set; }
+        public string Konto5 { get; set; }
         public string Ebenen { get; set; }
     }
 }

+ 29 - 30
Model/Uebersetzung/KontoTyp.cs

@@ -1,7 +1,5 @@
 using System;
-using System.Collections.Generic;
 using System.Linq;
-using System.Text;
 
 namespace GCHR.Model.Uebersetzung
 {
@@ -13,23 +11,21 @@ namespace GCHR.Model.Uebersetzung
 
         public KontoTyp(string typ)
         {
-            if (typ.Length > 0)
-            {
-                kontoTyp = tryParseKontoTyp(typ.Substring(0, 1));
-                negativ = typ.Contains('-');
-                alternativ = typ.Contains('A');
+            if (typ.Length <= 0) return;
+            _kontoTyp = TryParseKontoTyp(typ.Substring(0, 1));
+            _negativ = typ.Contains('-');
+            _alternativ = typ.Contains('A');
 
-                if (kontoTyp == Typ.V)
-                {
-                    if (typ.Contains("HH")) buchung = Buchung.HH;
-                    if (typ.Contains("HS")) buchung = Buchung.HS;
-                    if (typ.Contains("SH")) buchung = Buchung.SH;
-                    if (typ.Contains("SS")) buchung = Buchung.SS;
-                }
+            if (_kontoTyp == Typ.V)
+            {
+                if (typ.Contains("HH")) _buchung = Buchung.HH;
+                if (typ.Contains("HS")) _buchung = Buchung.HS;
+                if (typ.Contains("SH")) _buchung = Buchung.SH;
+                if (typ.Contains("SS")) _buchung = Buchung.SS;
             }
         }
 
-        private static Typ tryParseKontoTyp(string typ)
+        private static Typ TryParseKontoTyp(string typ)
         {
             try
             {
@@ -41,49 +37,52 @@ namespace GCHR.Model.Uebersetzung
             }
         }
 
-        private Typ kontoTyp = Typ.S;
-        private bool negativ = false;
-        private bool alternativ = false;
+        private readonly Typ _kontoTyp = Typ.S;
+        private readonly bool _negativ;
+        private readonly bool _alternativ;
 
-        private Buchung buchung = Buchung.SH;
+        private readonly Buchung _buchung = Buchung.SH;
 
         public decimal Faktor
         {
-            get { return (negativ) ? -1m : 1m; }
+            get { return (_negativ) ? -1m : 1m; }
         }
 
         public override bool Equals(object obj)
         {
-            if (obj is KontoTyp)
+            var typ = obj as KontoTyp;
+            if (typ != null)
             {
-                return equals(((KontoTyp)obj).kontoTyp);
+                return EqualsTyp(typ._kontoTyp);
             }
             if (obj is Typ)
             {
-                return equals((Typ)obj);
+                return EqualsTyp((Typ)obj);
             }
-            if (obj is string)
+            var str = obj as string;
+            if (str != null)
             {
                 try
                 {
-                    return equals((Typ)Enum.Parse(typeof(Typ), ((string)obj).Substring(0, 1)));
+                    return EqualsTyp((Typ)Enum.Parse(typeof(Typ), str.Substring(0, 1)));
                 }
                 catch (Exception)
                 {
+                    return false;
                 }
             }
-            return base.Equals(obj);
+            return false;
         }
 
-        private bool equals(Typ typ)
+        private bool EqualsTyp(Typ typ)
         {
-            if (typ == kontoTyp)
+            if (typ == _kontoTyp)
                 return true;
 
             if (typ == Typ.D || typ == Typ.D)
                 return true;
 
-            if ((typ == Typ.V && kontoTyp == Typ.S) || (typ == Typ.S && kontoTyp == Typ.V))
+            if ((typ == Typ.V && _kontoTyp == Typ.S) || (typ == Typ.S && _kontoTyp == Typ.V))
                 return true;
 
             return false;
@@ -91,7 +90,7 @@ namespace GCHR.Model.Uebersetzung
 
         public override string ToString()
         {
-            return kontoTyp + ((alternativ) ? "A" : "") + ((kontoTyp == Typ.V) ? buchung.ToString() : "") + ((negativ) ? "-" : "");
+            return _kontoTyp + ((_alternativ) ? "A" : "") + ((_kontoTyp == Typ.V) ? _buchung.ToString() : "") + ((_negativ) ? "-" : "");
         }
 
         public override int GetHashCode()

+ 14 - 16
Model/Uebersetzung/Regel.cs

@@ -1,7 +1,5 @@
 using System;
-using System.Collections.Generic;
 using System.Linq;
-using System.Text;
 
 namespace GCHR.Model.Uebersetzung
 {
@@ -14,32 +12,32 @@ namespace GCHR.Model.Uebersetzung
         {
             if (regel == "")
             {
-                markeDefault = Hauptmarke;
-                betriebDefault = Hauptbetrieb;
+                _markeDefault = Hauptmarke;
+                _betriebDefault = Hauptbetrieb;
                 return;
             }
-            string[] split = regel.Split(new char[] { ',' });
+            var split = regel.Split(new char[] { ',' });
 
-            string[] markeSplit = split[0].Split(new char[] { ':' });
-            markeRegel = (markeSplit[0] != "") ? markeSplit[0] : "0";
-            markeDefault = (markeSplit.Count() > 1) ? markeSplit[1] : Hauptmarke;
+            var markeSplit = split[0].Split(new char[] { ':' });
+            _markeRegel = (markeSplit[0] != "") ? markeSplit[0] : "0";
+            _markeDefault = (markeSplit.Count() > 1) ? markeSplit[1] : Hauptmarke;
 
             if (split.Count() > 1)
             {
-                string[] betriebSplit = split[1].Split(new char[] { ':' });
-                betriebRegel = (betriebSplit[0] != "") ? betriebSplit[0] : "0";
-                betriebDefault = (betriebSplit.Count() > 1) ? betriebSplit[1] : Hauptbetrieb;
+                var betriebSplit = split[1].Split(new char[] { ':' });
+                _betriebRegel = (betriebSplit[0] != "") ? betriebSplit[0] : "0";
+                _betriebDefault = (betriebSplit.Count() > 1) ? betriebSplit[1] : Hauptbetrieb;
             }
         }
 
-        private string markeRegel = "0";
-        private string markeDefault;
-        private string betriebRegel = "0";
-        private string betriebDefault;
+        private readonly string _markeRegel = "0";
+        private readonly string _markeDefault;
+        private readonly string _betriebRegel = "0";
+        private readonly string _betriebDefault;
 
         public override string ToString()
         {
-            return String.Format("{0}:{1},{2}:{3}", markeRegel, markeDefault, betriebRegel, betriebDefault);
+            return String.Format("{0}:{1},{2}:{3}", _markeRegel, _markeDefault, _betriebRegel, _betriebDefault);
         }
     }
 }

+ 10 - 13
Model/Uebersetzung/Uebersetzungstabelle.cs

@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using System.Collections.Generic;
 using System.IO;
 using GCHR.Model.Konto;
 
@@ -9,25 +6,25 @@ namespace GCHR.Model.Uebersetzung
 {
     class Uebersetzungstabelle
     {
-        public HerstellerKontenrahmen herstellerKontenrahmen { set; private get; }
-        private Dictionary<string, Eintrag> uebersetzungstabelle = new Dictionary<string, Eintrag>();
+        public HerstellerKontenrahmen HerstellerKontenrahmen { set; private get; }
+        private readonly Dictionary<string, Eintrag> _uebersetzungstabelle = new Dictionary<string, Eintrag>();
 
         public Uebersetzungstabelle(StreamReader sr)
         {
             while (!sr.EndOfStream)
             {
-                Eintrag eintrag = new Eintrag(sr.ReadLine());
-                while (uebersetzungstabelle.ContainsKey(eintrag.KontonummerHaendler))
+                var eintrag = new Eintrag(sr.ReadLine());
+                while (_uebersetzungstabelle.ContainsKey(eintrag.KontonummerHaendler))
                 {
                     eintrag.KontonummerHaendler += "X";
                 }
-                uebersetzungstabelle.Add(eintrag.KontonummerHaendler, eintrag);
+                _uebersetzungstabelle.Add(eintrag.KontonummerHaendler, eintrag);
             }
         }
 
         public void Speichern(StreamWriter sw)
         {
-            foreach (Eintrag eintrag in uebersetzungstabelle.Values)
+            foreach (var eintrag in _uebersetzungstabelle.Values)
             {
                 sw.WriteLine(eintrag);
             }
@@ -35,12 +32,12 @@ namespace GCHR.Model.Uebersetzung
 
         public HerstellerKonto Uebersetzen(HaendlerKonto haendlerKonto, bool split)
         {
-            return herstellerKontenrahmen.Get(uebersetzen(haendlerKonto, split));
+            return HerstellerKontenrahmen.Get(KontoUebersetzen(haendlerKonto, split));
         }
 
-        public string uebersetzen(HaendlerKonto haendlerKonto, bool split)
+        private string KontoUebersetzen(HaendlerKonto haendlerKonto, bool split)
         {
-            return uebersetzungstabelle[haendlerKonto.Kontonummer].Uebersetzen(haendlerKonto, split);
+            return _uebersetzungstabelle[haendlerKonto.Kontonummer].Uebersetzen(haendlerKonto, split);
         }
     }
 }

+ 0 - 45
Tests/KonfigurationTest.cs

@@ -1,45 +0,0 @@
-using System;
-using System.IO;
-using System.Xml.Serialization;
-using GCHR.Control;
-using GCHR.Mandantenschnittstelle;
-using GCHR.Model;
-using NUnit.Framework;
-
-namespace GCHR.Tests
-{
-    [TestFixture]
-    public class KonfigurationTest
-    {
-        private static string PfadUndDatei(string dateiOhneEndung)
-        {
-            return Directory.GetCurrentDirectory() + "\\config\\" + dateiOhneEndung + ".xml";
-        }
-
-        private static Konfiguration KonfigurationLaden(string test)
-        {
-            return new Konfiguration(PfadUndDatei(test));
-        }
-
-        [Test]
-        public void DateiMitStandardwertenAnlegen()
-        {
-            var datei = PfadUndDatei("standard");
-            File.Delete(datei);
-            var config = new Konfiguration(datei);
-            
-            Assert.IsTrue(File.Exists(datei));
-            Assert.AreEqual("Autohaus", config.Haendler);
-            Assert.AreEqual(Mandanten.Opel, config.Mandantenname);
-            Assert.AreEqual(5, config.HerstellerKontenrahmenStellen);
-            Assert.AreEqual(5, config.HaendlerKontenrahmenStellen);
-            Assert.AreEqual("0", config.BilanzMarke);
-            Assert.AreEqual("07", config.BilanzBetrieb);
-            Assert.IsFalse(config.KontoOhneUebersetzungUebernehmen);
-            Assert.IsTrue(config.StatKontenImportieren);
-            Assert.AreEqual("01", config.Geschaeftsjahr);
-
-            Assert.AreEqual("DSN=O21;UID=sa;PWD=;", config.OdbcConnectionString);
-        }
-    }
-}

+ 17 - 0
Tests/Model/DateipfadeTest.cs

@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using NUnit.Framework;
+
+namespace GCHR.Tests.Model
+{
+    [TestFixture]
+    class DateipfadeTest
+    {
+        public void Standardwerte()
+        {
+            
+        }
+    }
+}

+ 114 - 0
Tests/Model/KonfigurationTest.cs

@@ -0,0 +1,114 @@
+using System;
+using System.IO;
+using GCHR.Model;
+using GCHR.Model.Mandant;
+using NUnit.Framework;
+
+namespace GCHR.Tests.Model
+{
+    [TestFixture]
+    public class KonfigurationTest
+    {
+        private static string PfadUndDatei(string dateiOhneEndung)
+        {
+            return Directory.GetCurrentDirectory() + "\\config\\" + dateiOhneEndung + ".xml";
+        }
+
+        private static Konfiguration KonfigurationLaden(string test)
+        {
+            return new Konfiguration(PfadUndDatei(test));
+        }
+
+        [Test]
+        public void DateiMitStandardwertenAnlegen()
+        {
+            var datei = PfadUndDatei("standard");
+            File.Delete(datei);
+            var config = new Konfiguration(datei);
+            
+            Assert.IsTrue(File.Exists(datei));
+            Assert.AreEqual("Autohaus", config.Haendler);
+            Assert.AreEqual(Mandanten.Opel, config.Mandantenname);
+            Assert.AreEqual(5, config.HerstellerKontenrahmenStellen);
+            Assert.AreEqual(5, config.HaendlerKontenrahmenStellen);
+            Assert.AreEqual("0", config.BilanzMarke);
+            Assert.AreEqual("07", config.BilanzBetrieb);
+            Assert.IsFalse(config.KontoOhneUebersetzungUebernehmen);
+            Assert.IsTrue(config.StatKontenImportieren);
+            Assert.AreEqual("01", config.Geschaeftsjahr);
+
+            Assert.AreEqual("00000000", config.Eurodatanummer);
+            Assert.AreEqual("000000", config.HaendlernummerBmCode);
+
+            Assert.AreEqual("DSN=O21;UID=sa;PWD=;", config.OdbcConnectionString);
+            Assert.AreEqual("deop00", config.Datenbank);
+
+            config.AktuellePeriode = new Periode("201104", true);
+
+            Assert.AreEqual("SELECT " + Environment.NewLine +
+                            "    T1.ACCT_NO," + Environment.NewLine +
+                            "    DEBIT_AMOUNT," + Environment.NewLine +
+                            "    CREDIT_AMOUNT," + Environment.NewLine +
+                            "    DEPARTMENT," + Environment.NewLine +
+                            "    BOOKKEEP_PERIOD," + Environment.NewLine +
+                            "    T2.TYPE_ACCTT" + Environment.NewLine +
+                            "FROM deop00.dbo.ACCT_BALANCE T1" + Environment.NewLine +
+                            "LEFT JOIN deop00.dbo.ACCOUNT_INFO T2 " + Environment.NewLine +
+                            "  ON T1.ACCT_NO=T2.ACCT_NR" + Environment.NewLine +
+                            "WHERE " + Environment.NewLine +
+                            "  BOOKKEEP_PERIOD <= 201104" + Environment.NewLine +
+                            "AND (" + Environment.NewLine +
+                            "  BOOKKEEP_PERIOD >= 201101 " + Environment.NewLine +
+                            "  OR (" + Environment.NewLine +
+                            "    T2.TYPE_ACCTT = '1' " + Environment.NewLine +
+                            "    AND BOOKKEEP_PERIOD >= 201001" + Environment.NewLine +
+                            "  )" + Environment.NewLine +
+                            ")" + Environment.NewLine +
+                            "ORDER BY 1,4,5;" + Environment.NewLine, config.SuSaKontenQuery);
+
+            config.AktuellePeriode = new Periode("201302");
+
+            Assert.AreEqual("" + Environment.NewLine +
+                            "SELECT " + Environment.NewLine +
+                            "    T1.ACCT_NO," + Environment.NewLine +
+                            "    DEBIT_QUANTITY," + Environment.NewLine +
+                            "    CREDIT_QUANTITY," + Environment.NewLine +
+                            "    DEPARTMENT," + Environment.NewLine +
+                            "    BOOKKEEP_PERIOD," + Environment.NewLine +
+                            "    T2.TYPE_ACCTT" + Environment.NewLine +
+                            "FROM deop00.dbo.ACCT_BALANCE T1" + Environment.NewLine +
+                            "LEFT JOIN deop00.dbo.ACCOUNT_INFO T2 " + Environment.NewLine +
+                            "  ON T1.ACCT_NO=T2.ACCT_NR" + Environment.NewLine +
+                            "WHERE " + Environment.NewLine +
+                            "  BOOKKEEP_PERIOD <= 201302" + Environment.NewLine +
+                            "AND (" + Environment.NewLine +
+                            "  BOOKKEEP_PERIOD >= 201301 " + Environment.NewLine +
+                            "  OR (" + Environment.NewLine +
+                            "    T2.TYPE_ACCTT = '1' " + Environment.NewLine +
+                            "    AND BOOKKEEP_PERIOD >= 201301" + Environment.NewLine +
+                            "  )" + Environment.NewLine +
+                            ")" + Environment.NewLine +
+                            "ORDER BY 1,4,5;" + Environment.NewLine, config.StatKontenQuery);
+
+        }
+
+        [Test]
+        public void ManuelleKonten()
+        {
+            var dateipfade = new DateipfadeXml();
+            File.Delete(dateipfade.ManuelleKonten);
+
+            KonfigurationLaden("standard");
+
+            Assert.IsTrue(File.Exists(dateipfade.ManuelleKonten));
+
+            
+        }
+
+        [Test]
+        public void Webservice()
+        {
+            
+        }
+    }
+}

+ 19 - 1
Tests/PeriodeTest.cs → Tests/Model/PeriodeTest.cs

@@ -1,7 +1,7 @@
 using GCHR.Model;
 using NUnit.Framework;
 
-namespace GCHR.Tests
+namespace GCHR.Tests.Model
 {
     [TestFixture]
     class PeriodeTest
@@ -61,6 +61,24 @@ namespace GCHR.Tests
             var periodeOhneJahresabschluss = new Periode("201303", true);
             Assert.AreEqual("201301", periodeOhneJahresabschluss.Jahresbeginn.ToString());
             Assert.AreEqual("201201", periodeOhneJahresabschluss.Bilanzbeginn.ToString());
+
+            Periode.ErsterMonatImGeschaeftsjahr = "09";
+        }
+
+        [Test]
+        public void JahresbeginnUndBilanzbeginnMitAbweichendemGeschaeftsjahr()
+        {
+            Periode.ErsterMonatImGeschaeftsjahr = "09";
+
+            var periode = new Periode("201307");
+            Assert.AreEqual("201209", periode.Jahresbeginn.ToString());
+            Assert.AreEqual("201209", periode.Bilanzbeginn.ToString());
+
+            var periodeOhneJahresabschluss = new Periode("201210", true);
+            Assert.AreEqual("201209", periodeOhneJahresabschluss.Jahresbeginn.ToString());
+            Assert.AreEqual("201109", periodeOhneJahresabschluss.Bilanzbeginn.ToString());
+
+            Periode.ErsterMonatImGeschaeftsjahr = "01";
         }
 
         [Test]

+ 1 - 1
View/Einstellungen.xaml.cs

@@ -3,8 +3,8 @@ using System.Data.Odbc;
 using System.IO;
 using System.Windows;
 using System.Windows.Input;
-using GCHR.Mandantenschnittstelle;
 using GCHR.Model;
+using GCHR.Model.Mandant;
 
 namespace GCHR.View
 {