using System; using System.Collections.Generic; using System.Linq; using BeWo.Data.Access; using BeWo.Data.Entities; using BeWo.Service.DCEntityMapper; using BeWo.Service.ServiceImplementations; using BS.Shared.DataContracts; using BS.Shared.Extensions; using BS.Shared; using BeWo.Service.Invoicing; using BeWo.Data; using BeWo.Service.Plugins; using BS.Shared.Core; using BS.Shared.DataContracts.Compact; using BS.Shared.Services; using System.Text; using System.Diagnostics; namespace BeWo.Report.ReportObjects { public class FinanceRO : AbstractBeWoReportObject { public DateTime? ReportStartDate { get; set; } public DateTime? ReportEndDate { get; set; } public decimal? RateFactor { get; set; } public bool GruppierungLeistungskategorie { get; set; } public IList SupportConceptFinanceList { get; set; } [DebuggerDisplay("{CustomerName} {SupportConceptTimeSpanString} {AmountTotal} ")] public class SupportConceptFinanceRO { public string CustomerName { get; set; } public string SupportConceptTimeSpanString { get; set; } public string CostBearerName { get; set; } public decimal AmountTotal { get; set; } public decimal AmountPaid { get; set; } public decimal AmountPaidInReportTimeSpan { get; set; } public decimal OpenAmount { get; set; } public decimal ApprovedHours { get; set; } public decimal BillableHours { get; set; } public decimal StundenNichtFehlkontakte { get; set; } public decimal StundenFehlkontakte { get; set; } public decimal ApprovedHoursInReportTimeSpan { get; set; } public decimal ApprovedAmountInReportTimeSpan { get; set; } public decimal BillableHoursInReportTimeSpan { get; set; } public decimal BillableHoursInReportTimeSpanWithFactor { get; set; } public decimal StundenNichtFehlkontakteInReportTimeSpan { get; set; } public decimal StundenFehlkontakteInReportTimeSpan { get; set; } public decimal BillableAmountInReportTimeSpan { get; set; } public decimal BillableAmountUntilNow { get; set; } public decimal? RateFactor { get; set; } public decimal? HourlyRate { get; set; } public decimal? AmountInReportTimeSpan { get; set; } public decimal? AmountNichtFehlkontakteInReportTimeSpan { get; set; } public decimal? AmountFehlkontakteInReportTimeSpan { get; set; } public List ServiceRecords { get; set; } public bool IsApproved { get; set; } public SupportConceptCostBearerRelDC Costbearer2Supportconcept { get; set; } public SupportConceptApprovalPeriodDC SupportConceptApprovalPeriod { get; set; } public String Leistungskategorie { get; set; } public String GruppierungsKategorie { get; set; } public string Custom1 { get; set; } public string Custom2 { get; set; } public string Custom3 { get; set; } public string Custom4 { get; set; } public string Custom5 { get; set; } } public static FinanceRO Create(DateTime? start, DateTime? end) { return Create(start, end, false); } public static FinanceRO Create(DateTime? start, DateTime? end, bool onlyNotApproved) { return Create(start, end, false, onlyNotApproved); } public static FinanceRO Create(DateTime? start, DateTime? end, bool splitByServiceCategory, bool onlyNotApproved) { var result = new FinanceRO(); result.ReportStartDate = start; result.ReportEndDate = end; result.GruppierungLeistungskategorie = splitByServiceCategory; result.SupportConceptFinanceList = new List(); var service = new AnalysisServiceImp(); var financeList = service.GetOutstandingReceivables(false, false, start, end); foreach (var item in financeList) { if (item.SupportConcept != null && item.SupportConcept.ActivationType != ActivationTypeId.Deleted) { var cb2sc = DAOFactory.GenericDAO.LoadByID(item.CostBearer.CostBearer2SupportConceptOid); var relDC = MapperFactory.SupportConceptCostBearerRelDC_CostBearer2SupportConcept.MapToNewDC(cb2sc); bool istBewilligt = (relDC.ApprovedEndDate.HasValue || relDC.ApprovedStartDate.HasValue); if (onlyNotApproved && istBewilligt) { continue; // Überspringen, wenn nur die NICHT bewilligten angezeigt werden sollen. } if (splitByServiceCategory) { var financeRO = new FinanceRO(); financeRO.AddByServiceCategory(result, item, cb2sc, relDC); } else { var ro = CreateSupportConceptFinanceRO(item, relDC, null); // 2. result.SupportConceptFinanceList.Add(ro); } } } StringBuilder oidList = new StringBuilder(); foreach (var ro in result.SupportConceptFinanceList) { if (oidList.Length > 0) { oidList.Append(","); } oidList.Append(ro.Costbearer2Supportconcept.CostBearer2SupportConceptOid); } var allServiceDescs = DAOFactory.GenericDAO.GetAll(); Dictionary serviceDict = new Dictionary(); foreach (var item in allServiceDescs) { serviceDict.Add(item.Oid.Value, MapperFactory.ServiceDescriptionDC_ServiceDescription.MapToNewDC(item)); } var cs2ServiceRecords = new Dictionary>(); if (oidList.Length > 0) { String sql = "SELECT Oid, Version, StartDate, EndDate, DistanceInMeter, CostBearer2SupportConceptOid, Betrag, ServiceDescriptionOid, RoundedDuration, GroupEmployeeCount, GroupPersonCount, GroupRoundedDuration, GroupOid FROM servicerecord"; if (oidList.Length > 0) { sql += String.Format(" WHERE CostBearer2SupportConceptOid in ({0})", oidList.ToString()); } else { sql += " WHERE CostBearer2SupportConceptOid is not null"; } var sqlresult = DAOFactory.SearchDAO.GetSqlResult(sql); // //update customer set debitornumber = '5' + debitornumber where debitornumber is not null foreach (object[] srRow in sqlresult) { var sr = CreateServiceRecordDC(srRow, serviceDict); if (sr.CostBearer2SupportConceptOid.HasValue) { if (!cs2ServiceRecords.ContainsKey(sr.CostBearer2SupportConceptOid.Value)) { cs2ServiceRecords.Add(sr.CostBearer2SupportConceptOid.Value, new List()); } cs2ServiceRecords[sr.CostBearer2SupportConceptOid.Value].Add(sr); } } } foreach (var ro in result.SupportConceptFinanceList) { var cb2sc = ro.Costbearer2Supportconcept; var costRateDcs = cb2sc.CostBearer.CostRatePeriods; var calc = Calculations.GetInstance(cb2sc.CostBearer.CostBearerID); List records = null; if (cs2ServiceRecords.ContainsKey(cb2sc.CostBearer2SupportConceptOid.Value)) { records = cs2ServiceRecords[cb2sc.CostBearer2SupportConceptOid.Value]; } else { records = new List(); } // AB, 22.04.2026: Bugfix wenn Betreuung beendet und ein Zeitraum über Ende hinweg gewählt wird var terminationDate = ro.Costbearer2Supportconcept.SupportConcept.Customer.TerminationDate; DateTime? effectiveEnd = end; if (terminationDate.HasValue && (!effectiveEnd.HasValue || terminationDate.Value < effectiveEnd.Value)) { effectiveEnd = terminationDate.Value; } //1. if (ro.SupportConceptApprovalPeriod != null && ro.SupportConceptApprovalPeriod.ServiceCategory != null) { ro.Leistungskategorie = ro.SupportConceptApprovalPeriod.ServiceCategory.Name; ro.ServiceRecords = records.Where(sr => sr.ServiceDescription.Category.ServiceCategoryOid == ro.SupportConceptApprovalPeriod.ServiceCategory.ServiceCategoryOid).ToList(); } else { ro.ServiceRecords = records; } var fkRecords = new List(); var flsRecords = new List(); foreach (var sr in ro.ServiceRecords) { sr.Employee = new CompactEmployeeDC { ValueListEntries = new Dictionary() }; // hack, damit später bei der Berechnung des Betrags in der InvoiceCreation kein Fehler kommt sr.CostBearer = cb2sc.CostBearer; sr.SupportConcept = ro.Costbearer2Supportconcept.SupportConcept; sr.Customer = sr.SupportConcept.Customer; if (sr.ServiceDescription.Name.ToLower().Contains("fehlkontakt") || sr.ServiceDescription.Category.Name.ToLower().Contains("fehlkontakt") || (sr.ServiceDescription.ProzentAbrechnung.HasValue && sr.ServiceDescription.ProzentAbrechnung.Value < 100)) { fkRecords.Add(sr); } else { flsRecords.Add(sr); } } if (ro.Costbearer2Supportconcept.SupportConcept.Customer.LastName == "Akbulut") { int test = 0; } //Fehlkontakte if (end.HasValue && end < DateTime.MaxValue.AddDays(-1)) { if (ro.SupportConceptApprovalPeriod != null) { ro.ApprovedHours = calc.GetApprovedHoursTillNow(ro.SupportConceptApprovalPeriod, costRateDcs, end.Value, true) ?? 0; } else { ro.ApprovedHours = calc.GetApprovedHoursTillNow(ro.Costbearer2Supportconcept, effectiveEnd.Value) ?? 0; } ro.StundenNichtFehlkontakte = calc.GetBillableDurationInMinutes(flsRecords.Where(sr => sr.Start.Value.Date < end.Value.AddDays(1)).ToList()) / 60; ro.StundenFehlkontakte = calc.GetBillableDurationInMinutes(fkRecords.Where(sr => sr.Start.Value.Date < end.Value.AddDays(1)).ToList()) / 60; } else { if (ro.SupportConceptApprovalPeriod != null) { ro.ApprovedHours = calc.GetApprovedHoursTillNow(ro.SupportConceptApprovalPeriod, costRateDcs, null, true) ?? 0; } else { ro.ApprovedHours = calc.GetApprovedHoursTillNow(ro.Costbearer2Supportconcept, null) ?? 0; } ro.StundenNichtFehlkontakte = calc.GetBillableDurationInMinutes(flsRecords) / 60; ro.StundenFehlkontakte = calc.GetBillableDurationInMinutes(fkRecords) / 60; } ro.BillableHours = ro.StundenNichtFehlkontakte + ro.StundenFehlkontakte; if (start.HasValue && end.HasValue) { var rfcrEnd = costRateDcs.GetCostRatePeriodForDate(CostRatePeriodType.RateFactor, end.Value); if (rfcrEnd != null && rfcrEnd.CostRateValue.HasValue) { ro.RateFactor = (rfcrEnd.CostRateValue.Value + 100m) / 100m; if (!result.RateFactor.HasValue) { result.RateFactor = ro.RateFactor; } } var hcrEnd = costRateDcs.GetCostRatePeriodForDate(CostRatePeriodType.HourlyRate, end.Value); if (hcrEnd != null && hcrEnd.CostRateValue.HasValue) { ro.HourlyRate = hcrEnd.CostRateValue.Value; } if (ro.SupportConceptApprovalPeriod != null) { var periodStart = start; if (ro.SupportConceptApprovalPeriod.StartDate.HasValue && (!periodStart.HasValue || ro.SupportConceptApprovalPeriod.StartDate.Value > periodStart.Value)) periodStart = ro.SupportConceptApprovalPeriod.StartDate; var periodEnd = effectiveEnd; if (ro.SupportConceptApprovalPeriod.EndDate.HasValue && (!periodEnd.HasValue || ro.SupportConceptApprovalPeriod.EndDate.Value < periodEnd.Value)) periodEnd = ro.SupportConceptApprovalPeriod.EndDate; ro.ApprovedHoursInReportTimeSpan = calc.GetApprovedHoursForPeriod(ro.SupportConceptApprovalPeriod, costRateDcs, periodStart, periodEnd) ?? 0; } else { ro.ApprovedHoursInReportTimeSpan = calc.GetApprovedHoursForPeriod(ro.Costbearer2Supportconcept, start.Value, effectiveEnd.Value); } if (splitByServiceCategory && ro.SupportConceptApprovalPeriod != null) { ro.ApprovedAmountInReportTimeSpan = (decimal)calc.GetApprovedAmountForPeriod(ro.Costbearer2Supportconcept, start.Value, effectiveEnd.Value, ro.SupportConceptApprovalPeriod.ServiceCategory); } else { ro.ApprovedAmountInReportTimeSpan = (decimal)calc.GetApprovedAmountForPeriod(ro.Costbearer2Supportconcept, start.Value, effectiveEnd.Value, null); } ro.AmountInReportTimeSpan = 0; ro.AmountNichtFehlkontakteInReportTimeSpan = 0; ro.AmountFehlkontakteInReportTimeSpan = 0; foreach (var srDc in flsRecords) { if (srDc.Start >= start && srDc.Start.Value.Date <= end.Value.Date) { var billable = calc.GetBillableDurationInMinutes(srDc, false) / 60; ro.StundenNichtFehlkontakteInReportTimeSpan += billable; var rfcr = costRateDcs.GetCostRatePeriodForDate(CostRatePeriodType.RateFactor, srDc.Start.Value); if (rfcr != null && rfcr.CostRateValue.HasValue) { var billableRateFactor = billable * (rfcr.CostRateValue.Value + 100m) / 100m; ro.BillableHoursInReportTimeSpanWithFactor += billableRateFactor; billable = billableRateFactor; } decimal stundensatz = 0; var hcr = costRateDcs.GetCostRatePeriodForDate(CostRatePeriodType.HourlyRate, srDc.Start.Value); if (hcr != null && hcr.CostRateValue.HasValue) { stundensatz = hcr.CostRateValue.Value; } var betrag = billable * stundensatz; ro.AmountNichtFehlkontakteInReportTimeSpan += betrag; } } //Fehlkontakte foreach (var srDc in fkRecords) { if (srDc.Start >= start && srDc.Start.Value.Date <= end.Value.Date) { var billable = calc.GetBillableDurationInMinutes(srDc, false) / 60; ro.StundenFehlkontakteInReportTimeSpan += billable; decimal stundensatz = 0; var hcr = costRateDcs.GetCostRatePeriodForDate(CostRatePeriodType.HourlyRate, srDc.Start.Value); if (hcr != null && hcr.CostRateValue.HasValue) { stundensatz = hcr.CostRateValue.Value; } if (srDc.ServiceDescription.ProzentAbrechnung.HasValue && srDc.ServiceDescription.ProzentAbrechnung.Value < 100) { stundensatz *= (srDc.ServiceDescription.ProzentAbrechnung.Value / 100); } var betrag = billable * stundensatz; ro.AmountFehlkontakteInReportTimeSpan += betrag; } } ro.BillableHoursInReportTimeSpan = ro.StundenNichtFehlkontakteInReportTimeSpan + ro.StundenFehlkontakteInReportTimeSpan; ro.AmountInReportTimeSpan = (ro.AmountNichtFehlkontakteInReportTimeSpan ?? 0) + (ro.AmountFehlkontakteInReportTimeSpan ?? 0); } } return result; } private static ServiceRecordDC CreateServiceRecordDC(object[] sqlRow, Dictionary serviceDict) { try { var dc = new ServiceRecordDC(); //DAOFactory.SearchDAO.GetSqlResult("SELECT Oid, Version, Start, End, DistanceInMeter, CostBearer2SupportConceptOid, Betrag, ServiceDescriptionOid, RoundedDuration, GroupEmployeeCount, GroupPersonCount, GroupRoundedDuration, GroupOid FROM servicerecord"); dc.ServiceRecordOid = (long?)sqlRow[0]; dc.ServiceRecordVersion = (long?)sqlRow[1]; dc.Start = (DateTime?)sqlRow[2]; dc.End = (DateTime?)sqlRow[3]; var test = sqlRow[4]; if (test != null) { decimal meter = 0; if (Decimal.TryParse(test.ToString(), out meter)) { dc.DistanceInMeterDecimal = meter; } } if (dc.DistanceInMeterDecimal.HasValue) { dc.DistanceInMeter = (int)dc.DistanceInMeterDecimal; } dc.CostBearer2SupportConceptOid = (long?)sqlRow[5]; dc.Betrag = (decimal?)sqlRow[6]; long? sdOid = (long?)sqlRow[7]; if (sdOid.HasValue && serviceDict.ContainsKey(sdOid.Value)) { dc.ServiceDescription = serviceDict[sdOid.Value]; } dc.RoundedDuration = (decimal)sqlRow[8]; dc.GroupEmployeeCount = (int?)sqlRow[9]; dc.GroupPersonCount = (int?)sqlRow[10]; dc.GroupRoundedDuration = (decimal?)sqlRow[11]; dc.GroupOid = (long?)sqlRow[12]; return dc; } catch (Exception e) { throw; } } public static SupportConceptFinanceRO CreateSupportConceptFinanceRO(FinanceOverviewItemDC item, SupportConceptCostBearerRelDC relDc, SupportConceptApprovalPeriodDC scapDc, bool SplitServiceCategory = false) { var ro = new SupportConceptFinanceRO(); ro.CustomerName = item.CustomerName; ro.SupportConceptTimeSpanString = item.SupportConceptTimeSpanString; ro.CostBearerName = item.CostBearerName; if (SplitServiceCategory) { ro.AmountPaid = 0; ro.OpenAmount = ro.AmountTotal; } else { ro.AmountTotal = item.AmountTotal; ro.AmountPaid = item.AmountPaid; ro.OpenAmount = item.OpenAmount; } ro.Costbearer2Supportconcept = relDc; ro.SupportConceptApprovalPeriod = scapDc; ro.IsApproved = (relDc.ApprovedEndDate.HasValue || relDc.ApprovedStartDate.HasValue); return ro; } public virtual void AddByServiceCategory(FinanceRO result, FinanceOverviewItemDC item, CostBearer2SupportConcept cb2sc, SupportConceptCostBearerRelDC relDC) { if (cb2sc.ApprovalPeriodList.Count > 1) // komplexer Ablauf nur, wenn mehr als eine Bewilligung vorliegt { Dictionary key2Value = new Dictionary(); var SmallList = new List(); SupportConceptFinanceRO ro; var baseRo = CreateSupportConceptFinanceRO(item, relDC, null); foreach (var scap in cb2sc.ApprovalPeriodList) { var scapDC = MapperFactory.SupportConceptApprovalPeriodDC_SupportConceptApprovalPeriod.MapToNewDC(scap); var calc = PluginLoader.FindClass(relDC.CostBearer.CostBearerID) ?? Calculations.GetInstance(relDC.CostBearer.CostBearerID); ro = CreateSupportConceptFinanceRO(item, relDC, scapDC, true); // statt dem auskommentierten Bereich var amountTotal = calc.GetApprovedAmount(scapDC, relDC.CostBearer.CostRatePeriods) ?? 0; ro.AmountTotal = amountTotal; ro.OpenAmount = amountTotal; //var approvedAmountInTimeSpan = calc.GetApprovedAmountInTimeSpan(relDC, result.ReportStartDate, result.ReportEndDate) ?? 0; SmallList.Add(ro); //string key = ""; //if (scap.ServiceCategory != null) //{ // key = scap.ServiceCategory.Name; //} //if (key2Value.ContainsKey(key)) // 1. Summenbildung von Gesamtbewilligung pro ServiceKategorie //{ // key2Value[key] += AmountTotal; // foreach (var r in SmallList) // { // if (key == "" && r.SupportConceptApprovalPeriod.ServiceCategory == null) // { // r.AmountTotal = key2Value[key]; // } // else if (key != "" && r.SupportConceptApprovalPeriod.ServiceCategory != null && r.SupportConceptApprovalPeriod.ServiceCategory.Name == key) // { // r.AmountTotal = key2Value[key]; // } // } //} //else //{ // key2Value.Add(key, AmountTotal); // ro.AmountTotal = AmountTotal; // SmallList.Add(ro); //} } var flsEntry = SmallList.OrderByDescending(e => e.AmountTotal).FirstOrDefault(); // 2. Zuordnung der Abschlagszahlungen zur betragsmäßig größten Bewilligung flsEntry.AmountPaid = baseRo.AmountPaid; flsEntry.OpenAmount = flsEntry.AmountTotal - flsEntry.AmountPaid; result.SupportConceptFinanceList.AddRange(SmallList); } else { var ro = CreateSupportConceptFinanceRO(item, relDC, null); result.SupportConceptFinanceList.Add(ro); } } public void CalculateBillableAmountInReportTimeSpan() { CalculateBillableAmountInReportTimeSpan("Finanzauswertung"); } public void CalculateBillableAmountInReportTimeSpan(String invoiceCreatorId) { if (this.SupportConceptFinanceList != null) { foreach (var scRo in SupportConceptFinanceList) { if (scRo.Costbearer2Supportconcept != null) { CalculateBillableAmountInReportTimeSpan(scRo, invoiceCreatorId); } } } } public void CalculateBillableAmountInTimeSpan() { CalculateBillableAmountInTimeSpan("Finanzauswertung"); } public void CalculateBillableAmountInTimeSpan(String invoiceCreatorId) { if (this.SupportConceptFinanceList != null) { foreach (var scRo in SupportConceptFinanceList) { if (scRo.Costbearer2Supportconcept != null) { CalculateBillableAmountInTimeSpan(scRo, scRo.Costbearer2Supportconcept.StartDate, ReportEndDate, true, invoiceCreatorId); } } } } private void CalculateBillableAmountInReportTimeSpan(SupportConceptFinanceRO scRo, String invoiceCreatorId) { CalculateBillableAmountInTimeSpan(scRo, ReportStartDate, ReportEndDate, false, invoiceCreatorId); } private void CalculateBillableAmountInTimeSpan(SupportConceptFinanceRO scRo, DateTime? start, DateTime? end, bool totalOrReportTimeSpan, String invoiceCreatorId) { String tenant = null; if (MultitenancyOperationContextExt.Current != null) tenant = MultitenancyOperationContextExt.Current.Tenant; else tenant = SessionFacade.Tenant; var factory = PluginLoader.FindClass(tenant); if (factory == null) { factory = InvoiceFactory.GetInstance(tenant); } Dictionary> dict = new Dictionary>(); CompactSupportConceptDC sc = CreateCompactSupportConcept(scRo.Costbearer2Supportconcept); if (scRo.ServiceRecords != null) { foreach (var sr in scRo.ServiceRecords) { sr.AlreadyAccounted = false; } } else { scRo.ServiceRecords = new List(); } dict.Add(sc, scRo.ServiceRecords); var creator = factory.CreateInvoiceCreator(invoiceCreatorId, tenant, dict); //String text = String.Format("Tenant={0}, Context=Null? {1}, Factory = {2}", tenant, // MultitenancyOperationContextExt.Current == null, factory); DateTimeSpan span = null; if (start.HasValue && end.HasValue) { span = new DateTimeSpan(); span.StartDate = start.Value; span.EndDate = end.Value; } if (scRo.CustomerName.Contains("Löb")) { int test = 0; } var invoices = creator.GenerateServiceInvoices(scRo.Costbearer2Supportconcept.CostBearer.CostBearerOid.Value, span, dict); if (invoices != null && invoices.Count == 1) { //var i = invoices[0]; if (totalOrReportTimeSpan) { scRo.BillableAmountUntilNow = invoices[0].ClaimSum ?? 0; } else { scRo.BillableAmountInReportTimeSpan = invoices[0].ClaimSum ?? 0; } } } private CompactSupportConceptDC CreateCompactSupportConcept(SupportConceptCostBearerRelDC c2s) { var dc = new CompactSupportConceptDC(); dc.SupportConceptOid = c2s.SupportConcept.SupportConceptOid; dc.CostBearerRelOids = new List(); dc.CostBearerRelOids.Add(c2s.CostBearer2SupportConceptOid.Value); //dc.IsApproved = c2s.ApprovedStartDate.HasValue && c2s.ApprovedEndDate.HasValue; dc.IsApproved = true; return dc; } public void CalculatePaidAmountInReportTimeSpan() { if (this.SupportConceptFinanceList != null) { foreach (var scRo in SupportConceptFinanceList) { if (scRo.Costbearer2Supportconcept != null) { CalculatePaidAmountInReportTimeSpan(scRo, this.ReportStartDate ?? DateTime.MinValue, this.ReportEndDate ?? DateTime.MaxValue); } } } } // Mittlerweile kann man Rechnungen in der Rechnungsübersicht als "bezahlt" markieren. Zuvor wurden alle geschriebene Rechnungen in AmountPaidInReportTimeSpan // reingerechnet. Als Option kann man mit nurAlsBezahltMarkierte ausschließlich als "bezahlt" markierte mit einrechnen lassen public void CalculatePaidAmountInReportTimeSpan(bool nurAlsBezahltMarkierte) { if (this.SupportConceptFinanceList != null) { foreach (var scRo in SupportConceptFinanceList) { if (scRo.Costbearer2Supportconcept != null) { CalculatePaidAmountInReportTimeSpan(scRo, this.ReportStartDate ?? DateTime.MinValue, this.ReportEndDate ?? DateTime.MaxValue, nurAlsBezahltMarkierte); } } } } private void CalculatePaidAmountInReportTimeSpan(SupportConceptFinanceRO scRo, DateTime start, DateTime end) { CalculatePaidAmountInReportTimeSpan(scRo, start, end, false); } // Mittlerweile kann man Rechnungen in der Rechnungsübersicht als "bezahlt" markieren. Zuvor wurden alle geschriebene Rechnungen in AmountPaidInReportTimeSpan // reingerechnet. Als Option kann man mit nurAlsBezahltMarkierte ausschließlich als "bezahlt" markierte mit einrechnen lassen private void CalculatePaidAmountInReportTimeSpan(SupportConceptFinanceRO scRo, DateTime start, DateTime end, bool nurAlsBezahltMarkierte) { var c2s = DAOFactory.GenericDAO.LoadByID(scRo.Costbearer2Supportconcept .CostBearer2SupportConceptOid.Value); var bookingList = c2s.AccountingTransactions; bookingList = bookingList.Where(i => i.GueltigkeitsDatum.HasValue && i.GueltigkeitsDatum.Value.Date <= end && i.GueltigkeitsDatum >= start).ToList(); decimal abschlZahlungen = 0; foreach (var item in bookingList) { abschlZahlungen += item.Amount; } DateTimeSpan span = new DateTimeSpan(); span.StartDateTime = start; span.EndDateTime = end.AddDays(1).AddTicks(-1); decimal rechnungsBetrag = 0; //if (c2s.SupportConcept.Customer.Person.LastName.StartsWith("Art")) //{ // int test = 0; //} var invoices = DAOFactory.SearchDAO.GetServiceInvoices(c2s.Oid.Value, span); foreach (var i in invoices) { if (!nurAlsBezahltMarkierte) { foreach (var sip in i.ServiceInvoicePeriodList) { rechnungsBetrag += sip.Claim ?? 0; } } else { if (i.InvoiceBase.IsPaid) { foreach (var sip in i.ServiceInvoicePeriodList) { rechnungsBetrag += sip.Claim ?? 0; } } } } scRo.AmountPaidInReportTimeSpan = abschlZahlungen + rechnungsBetrag; } } }