HaendlerKonto.cs 9.2 KB

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