浏览代码

- CSV-Export und Landrover.cs
- Encoding in Schnittstelle

Robert Bedner 10 年之前
父节点
当前提交
968b68a906

+ 3 - 1
Control/Tasks/Datenimport.cs

@@ -48,7 +48,9 @@ namespace GCHR.Control.Tasks
             ReportProgress(80);
             if (_kontoTyp == KontoTypen.SuSa)
             {
-                SummeSaldiPruefen(konten.Sum(konto => konto.Summe));
+                var saldo = konten.Sum(konto => konto.Summe);
+                SummeSaldiPruefen(saldo);
+                Data.JahresergebnisKonto.SaldoZuordnen(HaendlerKonto.AktuellePeriode.Jahresbeginn.Vorgaenger.ToString(), saldo * -1, 0);
             }
             Data.AddKonten(konten);
         }

+ 4 - 4
Control/Tasks/Export.cs

@@ -89,8 +89,8 @@ namespace GCHR.Control.Tasks
             }
 
             var summeSusa = String.Format("{0:c}", _konten.Sum(k => (k.KontoTyp == KontoTypen.SuSa) ? k.Summe : 0.0m));
-            var summeOhneFaktor = String.Format("{0:c}", _konten.Sum(k => (k.KontoTyp == KontoTypen.SuSa) ? k.Summe : 0.0m));
-            var summeBilanz = String.Format("{0:c}", _konten.Sum(k => (k.Kontoart == "1") ? k.Summe : 0.0m));
+            var summeOhneFaktor = String.Format("{0:c}", _konten.Sum(k => (k.KontoTyp == KontoTypen.SuSa) ? k.SummeOhneFaktor : 0.0m));
+            var summeBilanz = String.Format("{0:c}", _konten.Sum(k => (k.Kontoart == Config.BilanzKontoart) ? k.Summe : 0.0m));
 
             Logger.Progress("Export-Summe über alle SuSa-Konten: " + summeSusa);
             Logger.Progress("Export-Summe ohne Faktoren: " + summeOhneFaktor);
@@ -108,11 +108,11 @@ namespace GCHR.Control.Tasks
             ReportProgress(100);
         }
 
-        private static StreamWriter DateiStream (string datei)
+        private StreamWriter DateiStream (string datei)
         {
             var info = new FileInfo(datei);
             if (info.Directory != null) info.Directory.Create();
-            return new StreamWriter(info.FullName, false, Constants.CsvEncoding);
+            return new StreamWriter(info.FullName, false, _mandant.Encoding);
         }
     }
 }

+ 2 - 0
Control/Tasks/Kontenrahmen.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using GCHR.Model;
+using GCHR.Model.Mandant;
 
 namespace GCHR.Control.Tasks
 {
@@ -112,6 +113,7 @@ namespace GCHR.Control.Tasks
             if (felder.Count() < 3) throw new FehlerhafteZeileException(zeile);
 
             var kontoNummer = felder[0].PadLeft(Config.HerstellerKontenrahmenStellen, '0');
+
             if (_kontenrahmen.ContainsKey(kontoNummer)) throw new KontoDoppeltException(kontoNummer);
 
             var kontoDesc = felder[1].Trim();

+ 2 - 0
Control/Tasks/TaskManager.cs

@@ -21,6 +21,8 @@ namespace GCHR.Control.Tasks
             _config.AktuellePeriode = periode;        
 
             Data.SetDepartmentCase(CreateDepartmentCaseInstance());
+            Data.JahresergebnisKonto = _config.JahresergebnisKonto;
+
 
             completed += Ablaufsteuerung;
 

+ 1 - 0
Control/Tasks/Uebersetzung.cs

@@ -5,6 +5,7 @@ using System.Linq;
 using System.Text.RegularExpressions;
 using GCHR.Model;
 using GCHR.Model.Konto;
+using GCHR.Model.Mandant;
 
 namespace GCHR.Control.Tasks
 {

+ 6 - 2
Control/Tasks/Verarbeitung.cs

@@ -21,7 +21,7 @@ namespace GCHR.Control.Tasks
             Data.AufSusaStatWarten.Set();
         }
 
-        private readonly IDictionary<string, HaendlerKonto> _zielKonten = new Dictionary<string, HaendlerKonto>();
+        private readonly IDictionary<string, HaendlerKonto> _zielKonten = new SortedDictionary<string, HaendlerKonto>();
 
         private readonly IDictionary<string, string> _nichtZugeordnet = new SortedDictionary<string, string>();
         private readonly IDictionary<string, string> _nichtImKontenrahmen = new SortedDictionary<string, string>();
@@ -29,7 +29,6 @@ namespace GCHR.Control.Tasks
         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" };
 
-
         private List<HaendlerKonto> KontenrahmenUebersetzen(IEnumerable<HaendlerKonto> kontenimport)
         {
             Data.KontoOhneUebersetzungUebernehmen = Config.KontoOhneUebersetzungUebernehmen;
@@ -39,6 +38,11 @@ namespace GCHR.Control.Tasks
                 KontoUebersetzen(aktKonto);
             }
 
+            if (Data.KeinJahresabschluss)
+            {
+                _zielKonten.Add(Data.JahresergebnisKonto.KontonummerFormatiert, Data.JahresergebnisKonto);
+            }
+
             ReportNichtZugeordnet();
             ReportNichtImKontenrahmen();
 

+ 2 - 0
Control/ThreadXData.cs

@@ -34,6 +34,8 @@ namespace GCHR.Control
 
         private DepartmentCase _departmentCase;
 
+        public HaendlerKonto JahresergebnisKonto = new HaendlerKonto(KontoTypen.Debug);
+
         public bool Offlinemodus;
         public bool ImportdatenSichern;
         public bool Exportprotokoll;

+ 1 - 1
Main.xaml

@@ -36,7 +36,7 @@
         </Grid.Background>
         <StackPanel Opacity="1.0" Name="GridMain" Margin="10">
 
-            <Label Foreground="White" FontSize="20" FontWeight="Bold" Name="Kopfzeile">AZ West - Opel</Label>
+            <Label Foreground="White" FontSize="20" FontWeight="Bold" Name="Kopfzeile">Fehler in gchr.xml!</Label>
             
         <!--
             <ScrollViewer Height="80" Margin="10,3">

+ 3 - 0
Model/GchrConfig.cs

@@ -90,6 +90,9 @@ namespace GCHR.Model
             set { _geschaeftsjahr = value; }
         }
 
+        public string JahresergebnisKonto = "10108381";
+        public string JahresergebnisBezeichnung = "Gewinn-/Verlust-Vortrag";
+
         [XmlElement("ODBC")]
         public string Odbc = "O21";
 

+ 17 - 0
Model/Konfiguration.cs

@@ -200,6 +200,14 @@ namespace GCHR.Model
             }
         }
 
+        public string BilanzKontoart
+        {
+            get
+            {
+                return _gchrConfig.Einstellungen.BilanzKontoart;
+            }
+        }
+
         private static string DepartmentFilter
         {
             get
@@ -271,6 +279,10 @@ namespace GCHR.Model
         private string QueryAnpassen(string queryStr, Periode aktuellePeriode)
         {
             var datenbank = _gchrConfig.Einstellungen.Datenbank;
+            if (datenbank == "deop00")
+            {
+                datenbank = "";
+            }
             if (datenbank.Length > 0 && datenbank.Substring(0, 2) == "de")
             {
                 datenbank += ".dbo.";
@@ -342,5 +354,10 @@ namespace GCHR.Model
         }
 
         public object Datenbank { get { return _gchrConfig.Einstellungen.Datenbank; } }
+
+        public HaendlerKonto JahresergebnisKonto
+        {
+            get { return new HaendlerKonto(KontoTypen.SuSa) { Kontonummer = _gchrConfig.Einstellungen.JahresergebnisKonto, Bezeichnung = _gchrConfig.Einstellungen.JahresergebnisBezeichnung + " " + AktuellePeriode.Jahresbeginn.Vorgaenger.Jahr, Betrieb = "", Marke = "" }; }
+        }
     }
 }

+ 20 - 1
Model/Konto/HaendlerKonto.cs

@@ -11,7 +11,7 @@ namespace GCHR.Model.Konto
     {
         private static int _markeLength = 1;
         private static int _betriebLength = 2;
-        private static IMandant _mandant = new Test();
+        private static IMandant _mandant = new Csv();
 
         public static Periode AktuellePeriode = new Periode("200001");
 
@@ -292,6 +292,12 @@ namespace GCHR.Model.Konto
             get { return SaldoVon(AktuellePeriode.Vormonat(5)).ToString(Constants.Zahlenformat); }
         }
 
+        public decimal Monatssumme(int monatAbJahresbeginn)
+        {
+            var periode = AktuellePeriode.MonatDesJahres(monatAbJahresbeginn);
+            return Monatssumme(periode);
+        }
+
         private decimal Monatssumme (string periode)
         {
             if (ZugeordneteSaldi.Count > 0)
@@ -301,6 +307,19 @@ namespace GCHR.Model.Konto
             return (ZugeordneteKonten.Count > 0) ? ZugeordneteKonten.Sum(k => k.Monatssumme(periode)) : 0m;
         }
 
+        public decimal Eroeffnungsbilanz
+        {
+            get
+            {
+                if (ZugeordneteSaldi.Count > 0)
+                {
+                    return
+                        ZugeordneteSaldi.Sum(s => (String.Compare(s.Periode, AktuellePeriode.Jahresbeginn.ToString(), StringComparison.Ordinal) < 0) ? s.Summe : 0m);
+                }
+                return (ZugeordneteKonten.Count > 0) ? ZugeordneteKonten.Sum(k => k.Eroeffnungsbilanz) : 0m;
+            }
+        }
+
         public decimal SummeAktuellePeriode { get { return Monatssumme(AktuellePeriode.ToString()); } }
 
         public string Kontoart { get; set; }

+ 7 - 1
Model/Mandant/Citroen.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Text;
 using System.Text.RegularExpressions;
 using GCHR.Model.Konto;
 
@@ -66,7 +67,12 @@ namespace GCHR.Model.Mandant
 
         public string KontonummerFormatieren(HaendlerKonto konto)
         {
-            return konto.Marke + konto.Betrieb + konto.Kontonummer;
+            return konto.Kontonummer;
+        }
+
+        public Encoding Encoding
+        {
+            get { return Encoding.Default; }
         }
 
         public string AccountsBody(HaendlerKonto konto)

+ 11 - 5
Model/Mandant/Test.cs → Model/Mandant/Csv.cs

@@ -1,9 +1,10 @@
 using System;
+using System.Text;
 using GCHR.Model.Konto;
 
 namespace GCHR.Model.Mandant
 {
-    class Test : IMandant
+    class Csv : IMandant
     {
         public bool BalanceDatei
         {
@@ -25,7 +26,7 @@ namespace GCHR.Model.Mandant
         {
             get 
             { 
-                return String.Empty;
+                return "Konto_Nr;Saldo";
             }
         }
 
@@ -39,7 +40,7 @@ namespace GCHR.Model.Mandant
 
         public string BalanceBody(HaendlerKonto kto)
         {
-            return String.Empty;
+            return KontonummerFormatieren(kto) + ";" + kto.Summe;
         }
 
 
@@ -47,13 +48,13 @@ namespace GCHR.Model.Mandant
         {
             get
             {
-                return String.Empty;
+                return "Konto_Nr;Konto_Bezeichnung";
             }
         }
 
         public string AccountsBody(HaendlerKonto kto)
         {
-            return String.Empty;
+            return KontonummerFormatieren(kto) + ";" + kto.Bezeichnung;
         }
 
         public string AccountsFooter
@@ -68,5 +69,10 @@ namespace GCHR.Model.Mandant
         {
             return konto.Marke + konto.Betrieb + konto.Kontonummer;
         }
+
+        public Encoding Encoding
+        {
+            get { return Encoding.Default; }
+        }
     }
 }

+ 6 - 0
Model/Mandant/Fiat.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Text;
 using GCHR.Model.Konto;
 
 namespace GCHR.Model.Mandant
@@ -65,6 +66,11 @@ namespace GCHR.Model.Mandant
             return konto.Marke + konto.Betrieb + konto.Kontonummer;
         }
 
+        public Encoding Encoding
+        {
+            get { return Encoding.Default; }
+        }
+
         public string AccountsBody(HaendlerKonto konto)
         {
             return KontonummerFormatieren(konto).PadRight(42, ' ') + konto.Bezeichnung;

+ 13 - 1
Model/Mandant/Ford.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Text;
 using GCHR.Model.Konto;
 
 namespace GCHR.Model.Mandant
@@ -71,7 +72,18 @@ namespace GCHR.Model.Mandant
 
         public string KontonummerFormatieren(HaendlerKonto konto)
         {
-            return konto.Kontonummer;
+            /* Manuelle Konten nur bei Ford Österreich, dann aber ohne Department!
+            if (konto.KontoTyp == KontoTypen.ManStat)
+            {
+                return konto.ToString().PadLeft(Config.HerstellerKontenrahmenStellen, '0');
+            } 
+             */   
+            return konto.Kontonummer.PadLeft(Config.HerstellerKontenrahmenStellen, '0');
+        }
+
+        public Encoding Encoding
+        {
+            get { return Encoding.Default; }
         }
     }
 }

+ 6 - 0
Model/Mandant/Honda.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Text;
 using GCHR.Model.Konto;
 
 namespace GCHR.Model.Mandant
@@ -74,6 +75,11 @@ namespace GCHR.Model.Mandant
             return konto.Kontonummer.Substring(0, 4) + konto.Marke + konto.Betrieb + konto.Kontonummer.Substring(4);
         }
 
+        public Encoding Encoding
+        {
+            get { return Encoding.Default; }
+        }
+
         public string AccountsBody(HaendlerKonto konto)
         {
             return string.Empty;

+ 173 - 0
Model/Mandant/Hyundai.cs

@@ -0,0 +1,173 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml.Linq;
+using GCHR.Model.Konto;
+
+namespace GCHR.Model.Mandant
+{
+    internal class Hyundai : IMandant
+    {
+        private const string Country = "DE";
+        private const string Currency = "EUR";
+
+        private static readonly XNamespace Tns = XNamespace.None;
+
+        private XDocument _xmlDocument;
+        private readonly XElement _accounts = new XElement(Tns + "RecordList");
+        private readonly HashSet<string> _makes = new HashSet<string>();
+        private readonly HashSet<string> _sites = new HashSet<string>();
+        private readonly HashSet<string> _departments = new HashSet<string>();
+
+        private readonly Konfiguration _config = Konfiguration.GetInstance();
+
+        public bool BalanceDatei
+        {
+            get { return true; }
+        }
+
+        public bool AccountsDatei
+        {
+            get { return false; }
+        }
+
+        public string BalanceHeader
+        {
+            get
+            {
+                return String.Empty;
+            }
+        }
+
+        private IEnumerable<XElement> MakeList
+        {
+            get
+            {
+                return (from make in _makes
+                        select new XElement("MakeListEntry", new XElement("Make", make), new XElement("MakeCode", make == "01" ? "8252" : "0000")));
+            }
+        }
+
+        private IEnumerable<XElement> BmCodeList
+        {
+            get
+            {
+                return (from dept in _departments
+                        select
+                            new XElement("BmCodeListEntry", new XElement("Make", dept.Split(new[] {'-'})[0]),
+                                         new XElement("Site", dept.Split(new[] {'-'})[1]),
+                                         new XElement("BmCode", _config.HaendlernummerBmCode)));
+            }
+        }
+
+        public string BalanceFooter
+        {
+            get
+            {
+                _xmlDocument = new XDocument();
+                _xmlDocument.Add(new XElement(Tns + "HbvData",
+                                              new XElement(Tns + "Header",
+                                                           new XElement(Tns + "Country", Country),
+                                                           new XElement(Tns + "MainBmCode", _config.HaendlernummerBmCode),
+                                                           new XElement(Tns + "Month", _config.AktuellePeriode.Monat),
+                                                           new XElement(Tns + "Year", _config.AktuellePeriode.Jahr),
+                                                           new XElement(Tns + "Currency", Currency),
+                                                           new XElement(Tns + "NumberOfMakes", _makes.Count),
+                                                           new XElement(Tns + "NumberOfSites", _sites.Count),
+                                                           new XElement(Tns + "ExtractionDate", DateTime.Now.ToShortDateString()),
+                                                           new XElement(Tns + "ExtractionTime", string.Format("{0:T}", DateTime.Now)),
+                                                           new XElement(Tns + "BeginFiscalYear", _config.Geschaeftsjahr)
+                                                  ),
+                                              new XElement(Tns + "MakeList", MakeList),
+                                              new XElement(Tns + "BmCodeList", BmCodeList),
+                                              _accounts
+                                     ));
+                
+                return _xmlDocument.ToString();
+            }
+        }
+
+        public string BalanceBody(HaendlerKonto konto)
+        {
+            // Konto: Account-Make-Site-Origin-SalesChannel-CostCarrier
+            var split = konto.Kontonummer.Split(new[] {'-'});  
+            var make = (split[1] == "??") ? konto.Marke : split[1];
+            if (!_makes.Contains(make))
+            {
+                _makes.Add(make);
+            }
+            var site = (split[2] == "??") ? konto.Betrieb : split[2];
+            if (!_sites.Contains(site))
+            {
+                _sites.Add(site);
+            }
+            var department = make + "-" + site;
+            if (!_departments.Contains(department))
+            {
+                _departments.Add(department);
+            }
+
+            _accounts.Add(new XElement(Tns + "Record",
+                                       new XElement(Tns + "Account", split[0].PadLeft(4, '0')),
+                                       new XElement(Tns + "Make", make.PadLeft(2, '0')),
+                                       new XElement(Tns + "Site", site.PadLeft(2, '0')),
+                                       new XElement(Tns + "Origin", split[3].PadLeft(2, '0')),
+                                       new XElement(Tns + "SalesChannel", split[4].PadLeft(2, '0')),
+                                       new XElement(Tns + "CostCarrier", split[5].PadLeft(2, '0')),
+                                       new XElement(Tns + "CostAccountingString", make.PadLeft(2, '0') + site.PadLeft(2, '0') + split[3].PadLeft(2, '0') + split[4].PadLeft(2, '0') + split[5].PadLeft(2, '0')),
+                                       new XElement(Tns + "Decimals", "2"),
+                                       new XElement(Tns + "OpeningBalance", string.Format("{0:0.}", konto.Eroeffnungsbilanz * 100)),
+                                       new XElement(Tns + "Period01", MonatFormat(konto, 1)),
+                                       new XElement(Tns + "Period02", MonatFormat(konto, 2)),
+                                       new XElement(Tns + "Period03", MonatFormat(konto, 3)),
+                                       new XElement(Tns + "Period04", MonatFormat(konto, 4)),
+                                       new XElement(Tns + "Period05", MonatFormat(konto, 5)),
+                                       new XElement(Tns + "Period06", MonatFormat(konto, 6)),
+                                       new XElement(Tns + "Period07", MonatFormat(konto, 7)),
+                                       new XElement(Tns + "Period08", MonatFormat(konto, 8)),
+                                       new XElement(Tns + "Period09", MonatFormat(konto, 9)),
+                                       new XElement(Tns + "Period10", MonatFormat(konto, 10)),
+                                       new XElement(Tns + "Period11", MonatFormat(konto, 11)),
+                                       new XElement(Tns + "Period12", MonatFormat(konto, 12)),
+                                       new XElement(Tns + "CumulatedYear", string.Format("{0:0.}", konto.Summe * 100))
+                              ));
+            return String.Empty;
+        }
+
+        private static string MonatFormat(HaendlerKonto konto, int monat)
+        {
+            return string.Format("{0:0.}", konto.Monatssumme(monat)*100);
+        }
+
+        public string AccountsHeader
+        {
+            get { return String.Empty; }
+        }
+
+        public string AccountsBody(HaendlerKonto kto)
+        {
+            return String.Empty;
+        }
+
+        public string AccountsFooter
+        {
+            get { return String.Empty; }
+        }
+
+        public string KontonummerFormatieren(HaendlerKonto konto)
+        {
+            // Konto: Account-Make-Site-Origin-SalesChannel-CostCarrier
+            var split = konto.Kontonummer.Split(new[] { '-' });
+            if (split.Count() < 6) return konto.ToString();
+            var make = (split[1] == "??") ? konto.Marke : split[1];
+            var site = (split[2] == "??") ? konto.Betrieb : split[2];
+            return split[0].PadLeft(4, '0') + "-" + make.PadLeft(2, '0') + site.PadLeft(2, '0') + split[3].PadLeft(2, '0') + split[4].PadLeft(2, '0') + split[5].PadLeft(2, '0');
+        }
+
+        public Encoding Encoding
+        {
+            get { return Encoding.Default; }
+        }
+    }
+}

+ 4 - 1
Model/Mandant/IMandant.cs

@@ -1,4 +1,5 @@
-using GCHR.Model.Konto;
+using System.Text;
+using GCHR.Model.Konto;
 
 namespace GCHR.Model.Mandant
 {
@@ -40,5 +41,7 @@ namespace GCHR.Model.Mandant
         string AccountsFooter { get; }
 
         string KontonummerFormatieren(HaendlerKonto konto);
+
+        Encoding Encoding { get; }
     }
 }

+ 84 - 2
Model/Mandant/Kia.cs

@@ -1,7 +1,89 @@
-
+using System;
+using System.Linq;
+using System.Text;
+using GCHR.Model.Konto;
+
 namespace GCHR.Model.Mandant
 {
-    class Kia : Opel
+    class Kia : IMandant
     {
+        public string BalanceBody(HaendlerKonto konto)
+        {
+            return (konto.KontoTyp == KontoTypen.ManStat) ?
+                KontonummerFormatieren(konto).PadRight(20, ' ') + String.Format("{0,18:0.00}", (konto.Summe)).Replace(',', '.') :
+                string.Join(Environment.NewLine, (from kto in konto.ZugeordneteKonten
+                          group kto by kto.Kontonummer into g
+                          orderby g.Key
+                          select (konto.Kontonummer + "-" + g.Key).PadRight(20, ' ') + string.Format("{0,18:0.00}", (g.Sum(k => k.Summe))).Replace(',', '.')).ToArray());   
+        }
+
+        public string AccountsBody(HaendlerKonto konto)
+        {
+            return KontonummerFormatieren(konto).PadRight(42, ' ') + konto.Bezeichnung;
+        }
+
+
+
+        protected Konfiguration Config = Konfiguration.GetInstance();
+
+        public bool BalanceDatei
+        {
+            get
+            {
+                return true;
+            }
+        }
+
+        public bool AccountsDatei
+        {
+            get
+            {
+                return true;
+            }
+        }
+
+        public string BalanceHeader
+        {
+            get
+            {
+                return string.Format("AA{0} {1}{2} .20EUR", Config.HaendlernummerBmCode, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
+            }
+        }
+
+        public string BalanceFooter
+        {
+            get
+            {
+                return string.Format("XX{0} {1}{2}", Config.HaendlernummerBmCode, Config.AktuellePeriode.Monat, Config.AktuellePeriode.JahrZweistellig);
+            }
+
+        }
+
+        public string AccountsHeader
+        {
+            get
+            {
+                return "Account Code".PadRight(42, ' ') + "Description";
+            }
+        }
+
+        public string AccountsFooter
+        {
+            get
+            {
+                return string.Empty;
+            }
+
+        }
+
+        public string KontonummerFormatieren(HaendlerKonto konto)
+        {
+            return konto.Kontonummer;
+        }
+
+        public Encoding Encoding
+        {
+            get { return Encoding.Default; }
+        }
     }
 }

+ 79 - 0
Model/Mandant/Landrover.cs

@@ -0,0 +1,79 @@
+using System;
+using System.Text;
+using GCHR.Model.Konto;
+
+namespace GCHR.Model.Mandant
+{
+    class Landrover : IMandant
+    {
+        protected Konfiguration Config = Konfiguration.GetInstance();
+
+        public bool BalanceDatei
+        {
+            get
+            {
+                return true;
+            }
+        }
+
+        public bool AccountsDatei
+        {
+            get
+            {
+                return false;
+            }
+        }
+
+        public string BalanceHeader
+        {
+            get
+            {
+                return String.Format("{0};{1};{2}", Config.HaendlernummerBmCode, Config.AktuellePeriode.Monat, Config.AktuellePeriode.Jahr);
+            }
+        }
+
+        public string BalanceFooter
+        {
+            get { return String.Empty; }
+
+        }
+
+        public string BalanceBody(HaendlerKonto konto)
+        {
+            return KontonummerFormatieren(konto) + ";" + String.Format("{0:0.00}", konto.Summe) + ";" + konto.Bezeichnung.Replace(';', ',');
+        }
+
+
+        public string AccountsHeader
+        {
+            get
+            {
+                return String.Empty;
+            }
+        }
+
+        public string AccountsBody(HaendlerKonto konto)
+        {
+            return String.Empty;
+        }
+
+        public string AccountsFooter
+        {
+            get
+            {
+                return String.Empty;
+            }
+
+        }
+
+        public string KontonummerFormatieren(HaendlerKonto konto)
+        {
+            return konto.Kontonummer + "_" + konto.Marke + konto.Betrieb;
+        }
+
+        public Encoding Encoding
+        {
+            get { return Encoding.GetEncoding(858); }
+        }
+    }
+}

+ 9 - 1
Model/Mandant/MandantFactory.cs

@@ -7,6 +7,8 @@
         {
             switch (mandanten)
             {
+                case Mandanten.Csv:
+                    return new Csv();
                 case Mandanten.Citroen:
                     return new Citroen();
                 case Mandanten.Fiat:
@@ -15,20 +17,26 @@
                     return new Ford();
                 case Mandanten.Honda:
                     return new Honda();
+                case Mandanten.Hyundai:
+                    return new Hyundai();
                 case Mandanten.Kia:
                     return new Kia();
+                case Mandanten.Landrover:
+                    return new Landrover();
                 case Mandanten.Opel:
                     return new Opel();
                 case Mandanten.Peugeot:
                     return new Peugeot();
                 case Mandanten.Renault:
                     return new Renault();
+                case Mandanten.Seat:
+                    return new Volkswagen { MandantHauptmarke = Volkswagen.Hauptmarke.S };
                 case Mandanten.Volkswagen:
                     return new Volkswagen();
                 case Mandanten.Volvo:
                     return new Volvo();
             }
-            return new Test();
+            return new Csv();
         }
     }
 }

+ 1 - 1
Model/Mandant/Mandanten.cs

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

+ 6 - 0
Model/Mandant/Opel.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Text;
 using GCHR.Model.Konto;
 
 namespace GCHR.Model.Mandant
@@ -72,5 +73,10 @@ namespace GCHR.Model.Mandant
         {
             return konto.Marke + konto.Betrieb + konto.Kontonummer;
         }
+
+        public Encoding Encoding
+        {
+            get { return Encoding.Default; }
+        }
     }
 }

+ 7 - 1
Model/Mandant/Peugeot.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Text;
 using System.Text.RegularExpressions;
 using GCHR.Model.Konto;
 
@@ -71,7 +72,12 @@ namespace GCHR.Model.Mandant
 
         public string KontonummerFormatieren(HaendlerKonto konto)
         {
-            return konto.Marke + konto.Betrieb + konto.Kontonummer;
+            return konto.Kontonummer;
+        }
+
+        public Encoding Encoding
+        {
+            get { return Encoding.Default; }
         }
     }
 }

+ 32 - 5
Model/Mandant/Volkswagen.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Text;
 using System.Xml.Linq;
 using GCHR.Model.Konto;
 
@@ -16,7 +17,7 @@ namespace GCHR.Model.Mandant
         /// E = Bentley,
         /// L = Lamborghini
         /// </summary>
-        enum Hauptmarke { V, A, S, C, E, L };
+        internal enum Hauptmarke { V, A, S, C, E, L };
 
         /// <summary>
         /// 1 = Istdaten,
@@ -37,6 +38,8 @@ namespace GCHR.Model.Mandant
 
         private readonly Konfiguration _config = Konfiguration.GetInstance();
 
+        internal Hauptmarke MandantHauptmarke = Hauptmarke.V;
+
         public bool BalanceDatei
         {
             get
@@ -62,7 +65,7 @@ namespace GCHR.Model.Mandant
                                     // new XAttribute(xsi + "schemaLocation", "http://xmldefs.volkswagenag.com/Retail/AccountBalanceDTS/V1 AccountBalanceDTS.xsd"),
                                     new XElement(Tns + "PartnerKey",
                                         new XElement(Tns + "Country", Country),
-                                        new XElement(Tns + "Brand", Hauptmarke.V),
+                                        new XElement(Tns + "Brand", MandantHauptmarke),
                                         new XElement(Tns + "PartnerNumber", _config.HaendlernummerBmCode)
                                     ),
                                     new XElement(Tns + "IsCumulative", "true"),
@@ -131,13 +134,32 @@ namespace GCHR.Model.Mandant
 
         private static Dictionary<string, string> AccountKeyDict(HaendlerKonto konto)
         {
-            var marke = konto.Marke.PadRight(6, '?');
+            // Konto: Account-Make-Site-Origin-SalesChannel-CostCarrier
+            var split = konto.Kontonummer.Split(new[] { '-' });
+            if (split.Count() == 6)
+            {
+                var marke = (split[1].Contains("?")) ? konto.Marke : split[1];
+                marke = marke.PadLeft(6, '0');
+                var betrieb = (split[2] == "??") ? konto.Betrieb : split[2];
+                return new Dictionary<string, string>
+                {
+                    {"Brand", marke.Substring(0, 2)},
+                    {"ModelCode", marke.Substring(2)},
+                    {"Account", split[0].PadLeft(4, '0')},
+                    {"CostCentre", split[3].PadLeft(2, '0')},
+                    {"TradeChannel", split[4].PadLeft(2, '0')},
+                    {"CostUnit", split[5].PadLeft(2, '0')},
+                    {"Location", betrieb.PadLeft(2, '0')},
+                    {"TaxCode", "000"}
+                };
+            }
+            var marke2 = konto.Marke.PadRight(6, '?');
             var kontonummer = konto.Kontonummer.PadRight(10, '?');
 
             return new Dictionary<string, string>
                 {
-                    {"Brand", marke.Substring(0, 2)},
-                    {"ModelCode", marke.Substring(2)},
+                    {"Brand", marke2.Substring(0, 2)},
+                    {"ModelCode", marke2.Substring(2)},
                     {"Account", kontonummer.Substring(0, 4)},
                     {"CostCentre", kontonummer.Substring(4, 2)},
                     {"TradeChannel", kontonummer.Substring(6, 2)},
@@ -183,5 +205,10 @@ namespace GCHR.Model.Mandant
         {
             return String.Join("", AccountKeyDict(konto).Values.ToArray());
         }
+
+        public Encoding Encoding
+        {
+            get { return Encoding.Default; }
+        }
     }
 }

+ 6 - 0
Model/Mandant/Volvo.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Text;
 using GCHR.Model.Konto;
 
 namespace GCHR.Model.Mandant
@@ -72,5 +73,10 @@ namespace GCHR.Model.Mandant
         {
             return konto.Marke + konto.Betrieb + konto.Kontonummer;
         }
+
+        public Encoding Encoding
+        {
+            get { return Encoding.Default; }
+        }
     }
 }

+ 5 - 0
Model/Periode.cs

@@ -89,6 +89,11 @@ namespace GCHR.Model
         public Periode Vorgaenger { get { return new Periode(Vormonat(1)); } }
         public Periode Nachfolger { get { return new Periode(Vormonat(-1)); } }
 
+        public string MonatDesJahres(int abJahresbeginn)
+        {
+            return Jahresbeginn.Vormonat(1 - abJahresbeginn);
+        }
+
         public override string ToString()
         {
             return (Jahr + Monat);

+ 59 - 0
View/EnterKeyTraversal.cs

@@ -0,0 +1,59 @@
+using System.Windows;
+using System.Windows.Input;
+
+namespace GCHR.View
+{
+    public class EnterKeyTraversal
+    {
+        public static bool GetIsEnabled(DependencyObject obj)
+        {
+            return (bool)obj.GetValue(IsEnabledProperty);
+        }
+
+        public static void SetIsEnabled(DependencyObject obj, bool value)
+        {
+            obj.SetValue(IsEnabledProperty, value);
+        }
+
+        static void ue_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
+        {
+            var ue = e.OriginalSource as FrameworkElement;
+
+            if (e.Key == Key.Enter)
+            {
+                e.Handled = true;
+                ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
+            }
+        }
+
+        private static void ue_Unloaded(object sender, RoutedEventArgs e)
+        {
+            var ue = sender as FrameworkElement;
+            if (ue == null) return;
+
+            ue.Unloaded -= ue_Unloaded;
+            ue.PreviewKeyDown -= ue_PreviewKeyDown;
+        }
+
+        public static readonly DependencyProperty IsEnabledProperty =
+            DependencyProperty.RegisterAttached("IsEnabled", typeof(bool),
+
+            typeof(EnterKeyTraversal), new UIPropertyMetadata(false, IsEnabledChanged));
+
+        static void IsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+        {
+            var ue = d as FrameworkElement;
+            if (ue == null) return;
+
+            if ((bool)e.NewValue)
+            {
+                ue.Unloaded += ue_Unloaded;
+                ue.PreviewKeyDown += ue_PreviewKeyDown;
+            }
+            else
+            {
+                ue.PreviewKeyDown -= ue_PreviewKeyDown;
+            }
+        }
+    }
+}

+ 4 - 5
View/ManuelleKontenBearbeiten.xaml

@@ -2,7 +2,7 @@
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
-        xmlns:konto="clr-namespace:GCHR.Model.Konto" mc:Ignorable="d"
+        xmlns:konto="clr-namespace:GCHR.Model.Konto" xmlns:view="clr-namespace:GCHR.View" mc:Ignorable="d"
         x:Name="Root"
     Title="Manuelle Konten bearbeiten" Height="480" Width="780">
 
@@ -15,7 +15,7 @@
         </Grid.Background>
         <Label Margin="12,12,12,0" VerticalAlignment="Top" Foreground="White">Bitte geben Sie die aktuellen Werte für die manuellen Konten ein:</Label>
 
-        <ListView Name="LvManuelle" Opacity="1.0" Margin="12,36,12,42" Focusable="True" KeyboardNavigation.TabNavigation="Continue" HorizontalContentAlignment="Stretch">
+        <ListView Name="LvManuelle" Opacity="1.0" Margin="12,36,12,42" Focusable="True" KeyboardNavigation.TabNavigation="Continue" HorizontalContentAlignment="Stretch" view:EnterKeyTraversal.IsEnabled="True">
             <ListView.ItemContainerStyle>
                 <Style TargetType="{x:Type ListViewItem}">
                     <Setter Property="IsTabStop" Value="False" />
@@ -76,9 +76,8 @@
         </ListView>
 
         <WrapPanel VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="12,0,12,6">
-            <Button Margin="3" Width="80" Height="24" Template="{DynamicResource GlassButton}" Click="BtnManuelleDruckenClick"  Foreground="White" Name="BtnManuelleDrucken">Drucken</Button>
-            <Button Margin="3" Width="80" Height="24" Template="{DynamicResource GlassButton}" Click="BtnManuelleAusblendenClick" Foreground="White" Name="BtnManuelleAusblenden">Ausblenden</Button>
-            <Button Margin="3" Width="80" Height="24" Template="{DynamicResource GlassButton}" Click="BtnManuelleIgnorierenClick" Foreground="White" Name="BtnManuelleIgnorieren">Ignorieren</Button>
+            <Button IsTabStop="False" Margin="3" Width="80" Height="24" Template="{DynamicResource GlassButton}" Click="BtnManuelleDruckenClick"  Foreground="White" Name="BtnManuelleDrucken">Drucken</Button>
+            <Button IsTabStop="False" Margin="3" Width="80" Height="24" Template="{DynamicResource GlassButton}" Click="BtnManuelleIgnorierenClick" Foreground="White" Name="BtnManuelleIgnorieren">Ignorieren</Button>
             <Button Margin="3" Width="80" Height="24" Template="{DynamicResource GlassButton}" Click="BtnManuelleSpeichernClick" Name="BtnManuelleSpeichern" Foreground="White">Speichern</Button>
         </WrapPanel>
     </Grid>

+ 2 - 0
View/ManuelleKontenBearbeiten.xaml.cs

@@ -2,6 +2,7 @@
 using System.Linq;
 using System.Windows;
 using System.Windows.Controls;
+using System.Windows.Input;
 using GCHR.Control.Printing;
 using GCHR.Model;
 using GCHR.Model.Konto;
@@ -100,5 +101,6 @@ namespace GCHR.View
         {
             MessageBox.Show(((TextBox)sender).Text);
         }
+
     }
 }