using System; using System.Collections.Generic; using System.Linq; using BeWo.Data.Entities; using BS.Shared; using BS.Shared.DataContracts; namespace BeWo.Report.ReportObjects { public class KassenbuchRO : AbstractBeWoReportObject { public List Transaktionen { get; set; } public decimal Anfangsbestand { get; set; } public string Kassenname { get; set; } public string Beguenstigter { get; set; } public string ReportTitle { get; set; } public DateTime StartZeitraum { get; set; } public DateTime EndZeitraum { get; set; } public static KassenbuchRO Create(DateTime pZeitraum, BargeldkassenDC pBargeldkasse, BeWoEntityBase pBeguenstigter) { DateTime start = new DateTime(pZeitraum.Year, pZeitraum.Month, 1); return Create(start, start.AddMonths(1), pBargeldkasse, pBeguenstigter); } public static KassenbuchRO Create(DateTime start, DateTime end, BargeldkassenDC pBargeldkasse, BeWoEntityBase pBeguenstigter) { var beguenstigter = string.Empty; if (pBeguenstigter is Customer) { var customer = (Customer)pBeguenstigter; beguenstigter = customer.Person.FirstNameLastName; } var transkationenDiesenMonat = pBargeldkasse.Bargeldtransaktionen.Where(w => w.Zahlungsdatum != null && w.Zahlungsdatum.Value >= start && w.Zahlungsdatum.Value <= end).OrderBy(o => o.Zahlungsdatum).Select(tDC => new ZeilenObjekt { Einzahlung = tDC.Zahlungstyp == Zahlungstyp.Einzahlung && tDC.Betrag != null ? tDC.Betrag.Value : 0, Auszahlung = tDC.Zahlungstyp == Zahlungstyp.Auszahlung && tDC.Betrag != null ? tDC.Betrag.Value : 0, Belegdatum = tDC.Zahlungsdatum.Value, Belegnummer = tDC.Belegnummer, Notiz = tDC.Notice }).ToList(); var transkationenVorDiesenMonat = pBargeldkasse.Bargeldtransaktionen.Where(w => w.Zahlungsdatum != null && w.Zahlungsdatum.Value < start).ToList(); //var ersteTransaktion = pBargeldkasse.Bargeldtransaktionen.OrderBy(o => o.Zahlungsdatum).ToList()[0]; var kb = new KassenbuchRO { Kassenname = pBargeldkasse.Kassenname, Beguenstigter = beguenstigter, StartZeitraum = start, EndZeitraum = end, Transaktionen = transkationenDiesenMonat, Anfangsbestand = transkationenVorDiesenMonat.Sum(t => (t.Betrag ?? 0) * (t.Zahlungstyp == Zahlungstyp.Einzahlung ? 1 : -1)) + (pBargeldkasse.Anfangsbestand ?? 0), }; if (start.Month == end.Month && start.Year == end.Year && start.Day == 1 && end.Day == DateTime.DaysInMonth(end.Year, end.Month)) { kb.ReportTitle = string.Format("Kassenbuch \"{0}\" {1}{2}", pBargeldkasse.Kassenname, start.ToString("MMMM yyyy"), (pBeguenstigter == null ? string.Empty : string.Format(" von {0}", beguenstigter))); } else { kb.ReportTitle = string.Format("Kassenbuch \"{0}\" {1} bis {2} {3}", pBargeldkasse.Kassenname, start.ToString("dd.MM.yyyy"), end.ToString("dd.MM.yyyy"), (pBeguenstigter == null ? string.Empty : string.Format(" von {0}", beguenstigter))); } decimal bestand = kb.Anfangsbestand; foreach (var ta in transkationenDiesenMonat) { bestand = bestand + ta.Einzahlung - ta.Auszahlung; ta.Bestand = bestand; } return kb; } } public class ZeilenObjekt { public decimal Einzahlung { get; set; } public decimal Auszahlung { get; set; } public decimal Bestand { get; set; } public DateTime? Belegdatum { get; set; } public string Belegnummer { get; set; } public string Notiz { get; set; } } }