123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Windows.Controls;
- using System.Windows.Input;
- using System.Xml.Serialization;
- using GCHR.Model.Mandant;
- namespace GCHR.Model.Konto
- {
- [XmlRoot("Konto")]
- public class HaendlerKonto : IKonto
- {
- private static int _markeLength = 1;
- private static int _betriebLength = 2;
- private static IMandant _mandant = new Csv();
- public static Periode AktuellePeriode = new Periode("200001");
- public HaendlerKonto()
- : this(KontoTypen.ManStat)
- {
- }
- public HaendlerKonto(KontoTypen typ)
- {
- KontoTyp = typ;
- if (typ != KontoTypen.Debug) return;
- Marke = new string('0', _markeLength);
- Betrieb = new string('0', _betriebLength);
- //ClickMeCommand = new RoutedCommand(SaldoAusAuswahl);
- }
- public static HaendlerKonto ManStatNeu(string kontonummer)
- {
- var kto = new HaendlerKonto(KontoTypen.ManStat) {DepartmentImport = "000", Kontonummer = kontonummer};
- return kto;
- }
- #region KontoXml-Umwandlung
- [XmlAttribute("kontonummer")]
- public string KontonummerAlt
- {
- set { Kontonummer = value; }
- get { return null; }
- }
- [XmlElement("periode")]
- public List<Saldo> Periode;
- #endregion
- [XmlAttribute("Konto_Nr")]
- public string Kontonummer { get; set; }
- [XmlIgnore]
- public string KontonummerFormatiert
- {
- get { return Mandant.KontonummerFormatieren(this); }
- }
- [XmlAttribute("Konto_Bezeichnung")]
- public string Bezeichnung { get; set; }
- [XmlAttribute("Konto_Typ")]
- public KontoTypen KontoTyp { get; set; }
- [XmlIgnore]
- public string DepartmentImport { get; set; }
- [XmlAttribute("Konto_Marke")]
- public string Marke { get; set; }
- [XmlAttribute("Konto_Betrieb")]
- public string Betrieb { get; set; }
- [XmlAttribute("Ebene1")]
- public string Ebene1 { get; set; }
- [XmlAttribute("Konto_Case")]
- public string Case { get; set; }
- [XmlIgnore]
- public decimal Faktor { get { return (Case != null && Case.Contains("-")) ? -1m : 1m; } }
- [XmlAttribute("Soll")]
- public decimal Soll
- {
- get
- {
- return (KontoTyp == KontoTypen.ManStat)
- ? SaldoVon(AktuellePeriode.ToString())
- : Math.Round(
- Faktor*
- (_soll + ZugeordneteKonten.Sum(kto => kto.Soll) +
- ZugeordneteSaldi.Sum(saldo => saldo.Soll)), 2);
- }
- set
- {
- _soll = value;
- }
- }
- private decimal _soll;
- [XmlAttribute("Haben")]
- public decimal Haben
- {
- get
- {
- return (KontoTyp == KontoTypen.ManStat)
- ? 0m
- : Math.Round(
- Faktor*
- (_haben + ZugeordneteKonten.Sum(kto => kto.Haben) +
- ZugeordneteSaldi.Sum(saldo => saldo.Haben)), 2);
- }
- set
- {
- _haben = value;
- }
- }
- private decimal _haben;
- [XmlIgnore]
- public decimal Summe
- {
- get
- {
- if (KontoTyp == KontoTypen.Debug) return 0m;
- return Soll + Haben;
- }
- }
- [XmlIgnore]
- public decimal SummeOhneFaktor
- {
- get
- {
- return (KontoTyp == KontoTypen.ManStat)
- ? 0m
- : Math.Round(
- (_soll + _haben) + ZugeordneteKonten.Sum(kto => (kto.SummeOhneFaktor)) +
- ZugeordneteSaldi.Sum(saldo => (saldo.Soll + saldo.Haben)), 2);
- }
- }
- public override string ToString()
- {
- if (KontoTyp == KontoTypen.ManStat)
- return Marke + Betrieb + Kontonummer;
- return Marke + "-" + Betrieb + "-" + Kontonummer;
- }
- [XmlElement("Konto")]
- public List<HaendlerKonto> ZugeordneteKonten = new List<HaendlerKonto>();
- public bool KontoZuordnen(HaendlerKonto kto)
- {
- if (KontoTyp != KontoTypen.Debug && KontoTyp != kto.KontoTyp) return false;
- ZugeordneteKonten.Add(kto);
- ZugeordneteKonten.Sort((k1, k2) => String.Compare(k1.Kontonummer, k2.Kontonummer, StringComparison.Ordinal));
- return true;
- }
- [XmlElement("Saldo")]
- public List<Saldo> ZugeordneteSaldi = new List<Saldo>();
- public void SaldoZuordnen(string periode, Decimal soll, Decimal haben)
- {
- ZugeordneteSaldi.Add(new Saldo { Periode = periode, Soll = soll, Haben = haben });
- ZugeordneteSaldi.Sort((s1, s2) => String.Compare(s1.Periode, s2.Periode, StringComparison.Ordinal));
- }
- [XmlIgnore]
- public List<string> KontoCsv
- {
- get
- {
- if (ZugeordneteKonten.Count > 0)
- {
- var csv = "'" + KontonummerFormatiert + ";" +
- Bezeichnung + ";";
- return ZugeordneteKonten.FindAll(kto => kto.Summe != 0).Select(kto => csv + kto.KontoCsv[0]).ToList();
- }
- if (KontoTyp == KontoTypen.ManStat)
- {
- return new List<string>
- {
- string.Format("'{0};{8};;{1}{2};;'{3};'{4};{5:0.00};{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};{8};'{3};'{4};{5:0.00};{6:0.00};{7:0.00}", Kontonummer,
- KontoTypKuerzel(KontoTyp), Minus, Marke, Betrieb, Soll, Haben, Summe, Kontoart)
- };
- }
- }
- private string Minus { get { return (Faktor < 0) ? "-" : ""; } }
- private string KontoTypKuerzel(KontoTypen kontoTyp)
- {
- switch(kontoTyp)
- {
- case KontoTypen.SuSa:
- return "A";
- case KontoTypen.Stat:
- return "Q";
- case KontoTypen.ManStat:
- return "M";
- case KontoTypen.Debug:
- return "D";
- }
- return "?";
- }
- public string DebugInfo()
- {
- return String.Format("{0} (Typ: {1}, Summe: {2}, Anzahl Perioden: {3})",
- Kontonummer, KontoTyp, Summe, ZugeordneteSaldi.Count);
- }
- private decimal SaldoVon(string periode)
- {
- var saldo = SaldoSuchen(periode);
- return (saldo != null) ? saldo.Soll : 0m;
- }
- private Saldo SaldoSuchen(string periode)
- {
- var saldi = (from saldo in ZugeordneteSaldi
- where saldo.Periode.Equals(periode)
- select saldo).ToList();
- return (saldi.Count > 0) ? saldi.First() : null;
- }
- [XmlIgnore]
- public string Saldo
- {
- get
- {
- var saldo = SaldoSuchen(AktuellePeriode.ToString());
- return (saldo != null) ? saldo.Soll.ToString(Constants.Zahlenformat) : (0m).ToString(Constants.Zahlenformat);
- }
- set
- {
- var saldo = SaldoSuchen(AktuellePeriode.ToString());
- if (saldo != null)
- saldo.Soll = Decimal.Parse(value, Constants.Zahlenformat);
- else
- SaldoZuordnen(AktuellePeriode.ToString(), Decimal.Parse(value, Constants.Zahlenformat), 0m);
- }
- }
- [XmlIgnore]
- public string Vormonat1
- {
- get { return SaldoVon(AktuellePeriode.Vormonat(1)).ToString(Constants.Zahlenformat); }
- }
- [XmlIgnore]
- public string Vormonat2
- {
- get { return SaldoVon(AktuellePeriode.Vormonat(2)).ToString(Constants.Zahlenformat); }
- }
- [XmlIgnore]
- public string Vormonat3
- {
- get { return SaldoVon(AktuellePeriode.Vormonat(3)).ToString(Constants.Zahlenformat); }
- }
- [XmlIgnore]
- public string Vormonat4
- {
- get { return SaldoVon(AktuellePeriode.Vormonat(4)).ToString(Constants.Zahlenformat); }
- }
- [XmlIgnore]
- public string Vormonat5
- {
- 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)
- {
- return ZugeordneteSaldi.Sum(s => (s.Periode.Equals(periode)) ? s.Summe : 0m);
- }
- 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; }
- internal static IMandant Mandant
- {
- get { return _mandant; }
- set { _mandant = value; }
- }
- internal void SaldoAusVormonat()
- {
- if (SaldoSuchen(AktuellePeriode.ToString()) != null) return;
- Saldo = (ZugeordneteSaldi.Count == 0) ? "0" : ZugeordneteSaldi.Last().Soll.ToString(Constants.Zahlenformat);
- }
- //public ICommand ClickMeCommand { get; set; }
- public void SaldoAusAuswahl(object sender)
- {
- Saldo = ((TextBox)sender).Text;
- }
- }
- }
|