HaendlerKonto.cs 9.5 KB

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