HaendlerKonto.cs 9.6 KB

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