HaendlerKonto.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Xml.Serialization;
  5. namespace GCHR.Model.Konto
  6. {
  7. [XmlRoot("Konto")]
  8. public class HaendlerKonto : IKonto
  9. {
  10. internal static Periode AktuellePeriode = new Periode("200001");
  11. private static int _markeLength = 1;
  12. private static int _betriebLength = 2;
  13. public HaendlerKonto()
  14. : this(KontoTypen.ManStat)
  15. {
  16. }
  17. public HaendlerKonto(KontoTypen typ)
  18. {
  19. KontoTyp = typ;
  20. if (typ != KontoTypen.Debug) return;
  21. Marke = new string('0', _markeLength);
  22. Betrieb = new string('0', _betriebLength);
  23. }
  24. public static HaendlerKonto ManStatNeu(string kontonummer)
  25. {
  26. var kto = new HaendlerKonto(KontoTypen.ManStat) {DepartmentImport = "000", Kontonummer = kontonummer};
  27. return kto;
  28. }
  29. #region KontoXml-Umwandlung
  30. [XmlAttribute("kontonummer")]
  31. public string KontonummerAlt
  32. {
  33. set { Kontonummer = value; }
  34. get { return null; }
  35. }
  36. [XmlElement("periode")]
  37. public List<Saldo> Periode;
  38. #endregion
  39. [XmlAttribute("Konto_Nr")]
  40. public string Kontonummer { get; set; }
  41. [XmlAttribute("Konto_Bezeichnung")]
  42. public string Bezeichnung { get; set; }
  43. [XmlAttribute("Konto_Typ")]
  44. public KontoTypen KontoTyp { get; set; }
  45. [XmlIgnore]
  46. public string DepartmentImport { get; set; }
  47. [XmlAttribute("Konto_Marke")]
  48. public string Marke { get; set; }
  49. [XmlAttribute("Konto_Betrieb")]
  50. public string Betrieb { get; set; }
  51. [XmlAttribute("Ebene1")]
  52. public string Ebene1 { get; set; }
  53. [XmlAttribute("Konto_Case")]
  54. public string Case { get; set; }
  55. [XmlIgnore]
  56. public decimal Faktor { get { return (Case != null && Case.Contains("-")) ? -1m : 1m; } }
  57. [XmlAttribute("Soll")]
  58. public decimal Soll
  59. {
  60. get
  61. {
  62. return (KontoTyp == KontoTypen.ManStat)
  63. ? SaldoVon(AktuellePeriode.ToString())
  64. : Math.Round(
  65. Faktor*
  66. (_soll + ZugeordneteKonten.Sum(kto => kto.Soll) +
  67. ZugeordneteSaldi.Sum(saldo => saldo.Soll)), 2);
  68. }
  69. set
  70. {
  71. _soll = value;
  72. }
  73. }
  74. private decimal _soll;
  75. [XmlAttribute("Haben")]
  76. public decimal Haben
  77. {
  78. get
  79. {
  80. return (KontoTyp == KontoTypen.ManStat)
  81. ? 0m
  82. : Math.Round(
  83. Faktor*
  84. (_haben + ZugeordneteKonten.Sum(kto => kto.Haben) +
  85. ZugeordneteSaldi.Sum(saldo => saldo.Haben)), 2);
  86. }
  87. set
  88. {
  89. _haben = value;
  90. }
  91. }
  92. private decimal _haben;
  93. [XmlIgnore]
  94. public decimal Summe
  95. {
  96. get
  97. {
  98. if (KontoTyp == KontoTypen.Debug) return 0m;
  99. return Soll + Haben;
  100. }
  101. }
  102. [XmlIgnore]
  103. public decimal SummeOhneFaktor
  104. {
  105. get
  106. {
  107. return (KontoTyp == KontoTypen.ManStat)
  108. ? 0m
  109. : Math.Round(
  110. (_soll + _haben) + ZugeordneteKonten.Sum(kto => (kto.SummeOhneFaktor)) +
  111. ZugeordneteSaldi.Sum(saldo => (saldo.Soll + saldo.Haben)), 2);
  112. }
  113. }
  114. public override string ToString()
  115. {
  116. return Marke + Betrieb + Kontonummer;
  117. }
  118. [XmlElement("Konto")]
  119. public List<HaendlerKonto> ZugeordneteKonten = new List<HaendlerKonto>();
  120. public bool KontoZuordnen(HaendlerKonto kto)
  121. {
  122. if (KontoTyp != KontoTypen.Debug && KontoTyp != kto.KontoTyp) return false;
  123. ZugeordneteKonten.Add(kto);
  124. ZugeordneteKonten.Sort((k1, k2) => k1.Kontonummer.CompareTo(k2.Kontonummer));
  125. return true;
  126. }
  127. [XmlElement("Saldo")]
  128. public List<Saldo> ZugeordneteSaldi = new List<Saldo>();
  129. public void SaldoZuordnen(string periode, Decimal soll, Decimal haben)
  130. {
  131. ZugeordneteSaldi.Add(new Saldo { Periode = periode, Soll = soll, Haben = haben });
  132. ZugeordneteSaldi.Sort((s1, s2) => s1.Periode.CompareTo(s2.Periode));
  133. }
  134. [XmlIgnore]
  135. public List<string> KontoCsv
  136. {
  137. get
  138. {
  139. if (ZugeordneteKonten.Count > 0)
  140. {
  141. var liste = new List<string>();
  142. var csv = Kontonummer + ";" +
  143. Marke + ";" +
  144. Betrieb;
  145. foreach (var kto in ZugeordneteKonten)
  146. {
  147. liste.Add(kto.KontoCsv[0] + ";" + csv);
  148. }
  149. return liste;
  150. }
  151. return new List<string>
  152. {
  153. Kontonummer + ";" +
  154. KontoTypKuerzel(KontoTyp) + Minus + ";" +
  155. Marke + ";" +
  156. Betrieb
  157. };
  158. }
  159. }
  160. private string Minus { get { return (Faktor < 0) ? "-" : ""; } }
  161. private string KontoTypKuerzel(KontoTypen kontoTyp)
  162. {
  163. switch(kontoTyp)
  164. {
  165. case KontoTypen.SuSa:
  166. return "A";
  167. case KontoTypen.Stat:
  168. return "Q";
  169. case KontoTypen.ManStat:
  170. return "M";
  171. case KontoTypen.Debug:
  172. return "D";
  173. }
  174. return "?";
  175. }
  176. public string DebugInfo()
  177. {
  178. return String.Format("{0} (Typ: {1}, Summe: {2}, Anzahl Perioden: {3})",
  179. Kontonummer, KontoTyp, Summe, ZugeordneteSaldi.Count);
  180. }
  181. private decimal SaldoVon(string periode)
  182. {
  183. var saldo = SaldoSuchen(periode);
  184. return (saldo != null) ? saldo.Soll : 0m;
  185. }
  186. private Saldo SaldoSuchen(string periode)
  187. {
  188. var saldi = (from saldo in ZugeordneteSaldi
  189. where saldo.Periode.Equals(periode)
  190. select saldo).ToList();
  191. return (saldi.Count > 0) ? saldi.First() : null;
  192. }
  193. [XmlIgnore]
  194. public string Saldo
  195. {
  196. get
  197. {
  198. var saldo = SaldoSuchen(AktuellePeriode.ToString());
  199. if (saldo != null)
  200. return saldo.Soll.ToString(Constants.Zahlenformat);
  201. SaldoZuordnen(AktuellePeriode.ToString(), Decimal.Parse(Vormonat1, Constants.Zahlenformat), 0m);
  202. return Vormonat1;
  203. }
  204. set
  205. {
  206. var saldo = SaldoSuchen(AktuellePeriode.ToString());
  207. if (saldo != null)
  208. saldo.Soll = Decimal.Parse(value, Constants.Zahlenformat);
  209. else
  210. SaldoZuordnen(AktuellePeriode.ToString(), Decimal.Parse(value, Constants.Zahlenformat), 0m);
  211. }
  212. }
  213. [XmlIgnore]
  214. public string Vormonat1
  215. {
  216. get { return SaldoVon(AktuellePeriode.Vormonat(1)).ToString(Constants.Zahlenformat); }
  217. }
  218. [XmlIgnore]
  219. public string Vormonat2
  220. {
  221. get { return SaldoVon(AktuellePeriode.Vormonat(2)).ToString(Constants.Zahlenformat); }
  222. }
  223. [XmlIgnore]
  224. public string Vormonat3
  225. {
  226. get { return SaldoVon(AktuellePeriode.Vormonat(3)).ToString(Constants.Zahlenformat); }
  227. }
  228. [XmlIgnore]
  229. public string Vormonat4
  230. {
  231. get { return SaldoVon(AktuellePeriode.Vormonat(4)).ToString(Constants.Zahlenformat); }
  232. }
  233. [XmlIgnore]
  234. public string Vormonat5
  235. {
  236. get { return SaldoVon(AktuellePeriode.Vormonat(5)).ToString(Constants.Zahlenformat); }
  237. }
  238. private decimal Monatssumme (string periode)
  239. {
  240. if (ZugeordneteSaldi.Count > 0)
  241. {
  242. return ZugeordneteSaldi.Sum(s => (s.Periode.Equals(periode)) ? s.Summe : 0m);
  243. }
  244. return (ZugeordneteKonten.Count > 0) ? ZugeordneteKonten.Sum(k => k.Monatssumme(periode)) : 0m;
  245. }
  246. public decimal SummeAktuellePeriode { get { return Monatssumme(AktuellePeriode.ToString()); } }
  247. }
  248. }