diff --git a/ReportImp/AsbRheinErftDuerenSBD/Invoicing/CustomInvoiceCreationAldenhoven.cs b/ReportImp/AsbRheinErftDuerenSBD/Invoicing/CustomInvoiceCreationAldenhoven.cs index c9c119a1f..c494f2154 100644 --- a/ReportImp/AsbRheinErftDuerenSBD/Invoicing/CustomInvoiceCreationAldenhoven.cs +++ b/ReportImp/AsbRheinErftDuerenSBD/Invoicing/CustomInvoiceCreationAldenhoven.cs @@ -64,5 +64,149 @@ namespace AsbRheinErftDuerenSBD.Invoicing }); ; } } + public override IList CreateInvoiceItems(List serviceRecordsInPeriod, DateTimeSpan invoicePeriod, SupportConceptApprovalPeriod scap, Calculations calc) + { + IList result = new List(); + + var list = new List(); + foreach (ServiceRecordDC iServiceRecord in serviceRecordsInPeriod) + { + if (iServiceRecord.ServiceDescription.Category.IsBillable) + { + if (!iServiceRecord.AlreadyAccounted) + { + InvoiceItem invoiceItem = CreateInvoiceItem(iServiceRecord, scap, calc); + + if (invoiceItem != null) + { + invoiceItem.ItemDescription = String.Format("{0} {1}", iServiceRecord.Employee.FirstName, iServiceRecord.Employee.LastName); + if (iServiceRecord.ServiceDescription.Category.Name.Contains("Sonstige")) + { + invoiceItem.ItemDescription += "\n" + iServiceRecord.ServiceDescription.Name; + } + list.Add(invoiceItem); + } + iServiceRecord.AlreadyAccounted = true; + } + } + } + + Dictionary dayDict = new Dictionary(); + foreach (var item in list) + { + String key = String.Format("{0:dd.MM.yyyy}", item.ItemPeriodStart); + + if (!dayDict.ContainsKey(key)) + { + dayDict.Add(key, true); + } + + result.Add(item); + } + + var newList = result.Where(i => i.UnitCount.HasValue && i.UnitCount.Value > 0).OrderBy(i => i.ItemPeriodStart).ToList(); + + return CreateSummaryInvoiceItems(newList, invoicePeriod, scap, calc); + } + + // Claude: Der Stundensatz richtet sich nach der Qualifikation des dokumentierenden Mitarbeiters. + // Vorbild: TeamPfeil/Invoicing/CustomInvoiceCreation.cs (ohne Korridor-Logik). + public override InvoiceItem CreateInvoiceItem(ServiceRecordDC iServiceRecord, SupportConceptApprovalPeriod scap, Calculations calc) + { + var invoiceItem = new InvoiceItem(); + + // Standardabrechnungsdaten des ServiceRecords. Diese berücksichtigen bereits die normale + // CostRatePeriod des Kostenträgers, ggf. überschrieben durch die CostRatePeriods der + // ServiceDescription bzw. ServiceCategory. Sie dienen als Fallback, wenn keine + // (passende) Mitarbeiterqualifikation gefunden wird. + BillingData bd = calc.GetBillingData(iServiceRecord); + + decimal stundensatz = 0; + + // Claude: Qualifikation des Mitarbeiters ermitteln. + var qualifikation = iServiceRecord.Employee.ValueListEntries + .FirstOrDefault(v => v.Value == ValueListEntryType.StaffQualificationsType); + long qualiOid = qualifikation.Key; + + // Claude: Für diese Qualifikationen (OID 70/71) gibt es eigene Stundensätze im Kostenträger. + if (qualiOid == 70) // Fachkraft + { + stundensatz = GetStundensatz(scap.CostBearer2SupportConcept, qualiOid, iServiceRecord.Start); + invoiceItem.ItemDescription = "Fachkraft"; + } + else if (qualiOid == 71) // Hilfskraft + { + stundensatz = GetStundensatz(scap.CostBearer2SupportConcept, qualiOid, iServiceRecord.Start); + invoiceItem.ItemDescription = "Hilfskraft"; + } + + // Gibt es Stundensätze für Leistung oder Leistungskategorie, müssen die natürlich überschreiben + if (iServiceRecord.ServiceDescription.CostRatePeriods != null && iServiceRecord.ServiceDescription.CostRatePeriods.Count > 0) + { + var crp = iServiceRecord.ServiceDescription.CostRatePeriods.GetCostRatePeriodForDate(CostRatePeriodType.AmountOfMoney, iServiceRecord.Start.Value); + if (crp != null && crp.CostRateValue != null && crp.CostRateValue > 0) + { + stundensatz = crp.CostRateValue.Value; + } + } + else if (iServiceRecord.ServiceDescription.Category.CostRatePeriods != null && iServiceRecord.ServiceDescription.Category.CostRatePeriods.Count > 0) + { + var crp = iServiceRecord.ServiceDescription.Category.CostRatePeriods.GetCostRatePeriodForDate(CostRatePeriodType.AmountOfMoney, iServiceRecord.Start.Value); + if (crp != null && crp.CostRateValue != null && crp.CostRateValue > 0) + { + stundensatz = crp.CostRateValue.Value; + } + } + + + if (stundensatz != 0) + { + // Claude: Qualifikationsabhängiger Stundensatz gefunden -> diesen verwenden. + invoiceItem.AmountPerUnit = stundensatz; + invoiceItem.AmountTotal = stundensatz * bd.UnitCount; + invoiceItem.GrossAmountTotal = stundensatz * bd.UnitCount; + } + else + { + // Claude: Keine (passende) Qualifikation -> Standardabrechnung wie in InvoiceCreation. + invoiceItem.AmountPerUnit = bd.AmountPerUnit; + invoiceItem.AmountTotal = bd.AmountTotal; + invoiceItem.GrossAmountTotal = bd.GrossAmountTotal; + invoiceItem.ItemDescription = iServiceRecord.ServiceDescription.Name; + } + + + + invoiceItem.UnitCount = bd.UnitCount; + invoiceItem.ItemPeriodStart = bd.BillingPeriodStart; + invoiceItem.ItemPeriodEnd = bd.BillingPeriodEnd; + invoiceItem.RateFactor = bd.RateFactor; + invoiceItem.AccountingInterval = bd.AccountingInterval; + invoiceItem.ServiceRecord = DAOFactory.GenericDAO.LoadByID(iServiceRecord.ServiceRecordOid.Value); + if (scap != null) + invoiceItem.SupportConceptApprovalPeriodOid = scap.Oid; + + return invoiceItem; + } + + // Claude: Liefert den qualifikationsabhängigen Stundensatz (HourlyRate) des Kostenträgers, sonst 0. + private decimal GetStundensatz(CostBearer2SupportConcept c2s, long vleOid, DateTime? date) + { + if (c2s.CostBearer.CostRatePeriods != null) + { + // ValueListEntryOid: + // 70 Fachkraft + // 71 Hilfskraft + var crpList = MapperFactory.CostRatePeriodDC_CostRatePeriod.MapToNewDCs(c2s.CostBearer.CostRatePeriods); + var cp = crpList.GetCostRatePeriodForDate(CostRatePeriodType.HourlyRate, (DateTime)date, vleOid); + + if (cp != null && cp.CostRateValue.HasValue) + { + return cp.CostRateValue.Value; + } + } + + return 0; + } } } diff --git a/ReportImp/AsbRheinErftDuerenSBD/Invoicing/CustomInvoiceCreationNew.cs b/ReportImp/AsbRheinErftDuerenSBD/Invoicing/CustomInvoiceCreationNew.cs index f0f1175fb..4995ef6ba 100644 --- a/ReportImp/AsbRheinErftDuerenSBD/Invoicing/CustomInvoiceCreationNew.cs +++ b/ReportImp/AsbRheinErftDuerenSBD/Invoicing/CustomInvoiceCreationNew.cs @@ -134,7 +134,7 @@ namespace AsbRheinErftDuerenSBD.Invoicing - invoiceItem.UnitCount = bd.UnitCount; + invoiceItem.UnitCount = bd.UnitCount; invoiceItem.ItemPeriodStart = bd.BillingPeriodStart; invoiceItem.ItemPeriodEnd = bd.BillingPeriodEnd; invoiceItem.RateFactor = bd.RateFactor;