diff --git a/ReportImp/HshCologne/HshCologne.csproj b/ReportImp/HshCologne/HshCologne.csproj index 4ef6e9bce..75d9295c5 100644 --- a/ReportImp/HshCologne/HshCologne.csproj +++ b/ReportImp/HshCologne/HshCologne.csproj @@ -57,6 +57,7 @@ + Component @@ -102,6 +103,8 @@ ServiceInvoiceReport.cs + + diff --git a/ReportImp/HshCologne/Invoicing/CustomInvoiceCreation.cs b/ReportImp/HshCologne/Invoicing/CustomInvoiceCreation.cs index 117a7b852..23a151742 100644 --- a/ReportImp/HshCologne/Invoicing/CustomInvoiceCreation.cs +++ b/ReportImp/HshCologne/Invoicing/CustomInvoiceCreation.cs @@ -68,20 +68,88 @@ namespace HshCologne.Invoicing base.SetInvoiceBaseData(invoiceCounter, invoice, costBearer, invoicePeriod, supportConceptList); } + public override IList CreateInvoiceItems(List serviceRecordsInPeriod, DateTimeSpan invoicePeriod, SupportConceptApprovalPeriod scap, Calculations calc) { - var list = base.CreateInvoiceItems(serviceRecordsInPeriod, invoicePeriod, scap, calc); - var fitem = CreateFahrkostenInvoiceItem(serviceRecordsInPeriod, scap, calc); - if (fitem != null) - list.Add(fitem); + // normale Items + 2 verschiedene Sorten Fahrtpauschalen + besondere Logik im Fall von Leistungskategorie FAM (Tagespauschale pro Tag mit Leistungskategorie) + var list = new List(); + foreach (ServiceRecordDC iServiceRecord in serviceRecordsInPeriod) + { + // Für alle Leistungskategorien normal, außer für FAM - da wird pro geleistetem Tag abgerechnet + if (iServiceRecord.ServiceDescription.Category.IsBillable) + { + if (!iServiceRecord.AlreadyAccounted) + { + InvoiceItem invoiceItem = CreateInvoiceItem(iServiceRecord, scap, calc); + if (invoiceItem != null) + { + list.Add(invoiceItem); + } + iServiceRecord.AlreadyAccounted = true; + } + } + } + if (serviceRecordsInPeriod != null && serviceRecordsInPeriod.Count > 0) + { + // Fahrtkosten aus eingetragenen Kilometern + int km = 0; + decimal custKm = 0; + foreach (var sr in serviceRecordsInPeriod) + { + if (sr.DistanceInMeter.HasValue) + km += sr.DistanceInMeter.Value; + } + if (km > 0) + { + custKm = Convert.ToDecimal(km); + var fitem = CreateFahrkostenInvoiceItem(serviceRecordsInPeriod, scap, calc, custKm); + if (fitem != null) + { + list.Add(fitem); + } + } + // Fahrtkosten bei bestimmten Leistungen, wenn Wert bei Customer.Healthinsurance eingetragen wurde + else + { + var c = DAOFactory.GenericDAO.LoadByID(serviceRecordsInPeriod[0].Customer.CustomerOid); + if (c.HealthInsurance.IsNotNullOrEmpty() && decimal.TryParse(c.HealthInsurance, out custKm)) + { + var leistungen = new List { "HPG", "Hausbesuch", "Abholung und Begleitung", "Einsatz HPG", "Fachgespräch"}; - return list; + int count = serviceRecordsInPeriod.Count(sr => leistungen.Contains(sr.ServiceDescription.Name)); + custKm = custKm * count; + var fitem = CreateFahrkostenInvoiceItem(serviceRecordsInPeriod, scap, calc, custKm); + if (fitem != null) + { + list.Add(fitem); + } + } + } + + if (serviceRecordsInPeriod.Any(s => s.ServiceDescription.CategoryName == "FAM")) + { + var famItem = CreateFAMInvoiceItem(serviceRecordsInPeriod, scap, calc); + if (famItem != null) + { + list.Add(famItem); + } + } + } + + return CreateSummaryInvoiceItems(list, invoicePeriod, scap, calc); } + public override InvoiceItem CreateInvoiceItem(ServiceRecordDC iServiceRecord, SupportConceptApprovalPeriod scap, Calculations calc) { var ii = base.CreateInvoiceItem(iServiceRecord, scap, calc); ii.UnitDescription = "Fachkraft"; + //if (iServiceRecord.CostBearer.Name.Contains("Erftstadt")) // brauchen explizite Zeitangaben, aber Einheit sind 45 min + //{ + // ii.UnitCount = Math.Round((decimal)(ii.UnitCount / 45 * 60), 2, MidpointRounding.AwayFromZero); + // ii.AmountTotal = ii.AmountPerUnit * ii.UnitCount; + // ii.GrossAmountTotal = ii.AmountPerUnit * ii.UnitCount; + //} if (iServiceRecord.GroupOid.HasValue) { ii.Notice = "x"; @@ -90,13 +158,21 @@ namespace HshCologne.Invoicing // Da diverse Kostenträger liegen deren Stundensätze unter Preise // Während Wesseling und Geilenkirchen für ALLES nur einen Stundensatz haben // Und Erftstadt macht sowieso ALLES anders :D - //if ( iServiceRecord.CostBearer.Name.Contains("Wesseling") || iServiceRecord.CostBearer.Name.Contains("Geilenkirchen") - // || iServiceRecord.CostBearer.Name.Contains("Erftstadt") || iServiceRecord.ServiceDescription.Category.Abbreviation.ToLower().Contains("sb") ) - //{ decimal stundensatz = 0; - if (iServiceRecord.CostBearer.Name.Contains("Wesseling") || iServiceRecord.CostBearer.Name.Contains("Geilenkirchen")) + if (iServiceRecord.ServiceDescription.CategoryName == "FAM") + { + ii.UnitCount = 0; + ii.UnitDescription = "FAM-Eintrag"; + ii.AmountTotal = 0; + ii.GrossAmountTotal = 0; + } + else if (iServiceRecord.CostBearer.Name.Contains("Wesseling") || iServiceRecord.CostBearer.Name.Contains("Geilenkirchen")) { stundensatz = GetStundensatz(scap.CostBearer2SupportConcept, null, iServiceRecord.Start); + if (iServiceRecord.CostBearer.Name.Contains("Geilenkirchen")) + { + ii.UnitDescription = "Assistenzkraft mit 2 jähriger BE"; + } } else if (iServiceRecord.Employee.ValueListEntries != null) { @@ -168,33 +244,48 @@ namespace HshCologne.Invoicing return 0; } - private InvoiceItem CreateFahrkostenInvoiceItem(List serviceRecordsInPeriod, SupportConceptApprovalPeriod scap, Calculations calc) + private InvoiceItem CreateFahrkostenInvoiceItem(List serviceRecordsInPeriod, SupportConceptApprovalPeriod scap, Calculations calc, decimal km) { - int km = 0; - foreach (var sr in serviceRecordsInPeriod) - { - if (sr.DistanceInMeter.HasValue) - km += sr.DistanceInMeter.Value; - } + var pauschVar = base.GetPreis("Kilometerpauschale", (DateTime)accountingPeriodStart); + if (pauschVar != 0) + AMOUNT_PER_KM = pauschVar; - if (km > 0) - { - var pauschVar = base.GetPreis("Kilometerpauschale", (DateTime)accountingPeriodStart); - if (pauschVar != 0) - AMOUNT_PER_KM = pauschVar; + var invoiceItem = new InvoiceItem(); + invoiceItem.AmountPerUnit = AMOUNT_PER_KM; + invoiceItem.UnitCount = km; + invoiceItem.AmountTotal = invoiceItem.UnitCount * invoiceItem.AmountPerUnit; + invoiceItem.ItemPeriodStart = accountingPeriodStart; + invoiceItem.ItemPeriodEnd = accountingPeriodEnd; + invoiceItem.GrossAmountTotal = invoiceItem.AmountTotal; + invoiceItem.UnitDescription = String.Format("Fahrtkosten"); + if (scap != null) + invoiceItem.SupportConceptApprovalPeriodOid = scap.Oid; - var invoiceItem = new InvoiceItem(); - invoiceItem.AmountPerUnit = AMOUNT_PER_KM; - invoiceItem.UnitCount = km; - invoiceItem.AmountTotal = invoiceItem.UnitCount * invoiceItem.AmountPerUnit; - invoiceItem.ItemPeriodStart = accountingPeriodStart; - invoiceItem.ItemPeriodEnd = accountingPeriodEnd; - invoiceItem.GrossAmountTotal = invoiceItem.AmountTotal; - invoiceItem.UnitDescription = String.Format("Fahrtkosten"); - if (scap != null) - invoiceItem.SupportConceptApprovalPeriodOid = scap.Oid; + return invoiceItem; + } - return invoiceItem; + private InvoiceItem CreateFAMInvoiceItem(List serviceRecordsInPeriod, SupportConceptApprovalPeriod scap, Calculations calc) + { + var days = serviceRecordsInPeriod.Where(r => r.ServiceDescription.CategoryName == "FAM").GroupBy(r => r.Start.Value.Date).Count(); + if (days > 0) + { + InvoiceItem interimsItem = CreateInvoiceItem(serviceRecordsInPeriod.Where(r => r.ServiceDescription.CategoryName == "FAM").FirstOrDefault(), scap, calc); + if (interimsItem != null) + { + var invoiceItem = new InvoiceItem(); + invoiceItem.AmountPerUnit = interimsItem.AmountPerUnit; + invoiceItem.UnitCount = days; + invoiceItem.AmountTotal = days * invoiceItem.AmountPerUnit; + invoiceItem.ItemPeriodStart = interimsItem.ItemPeriodStart; + invoiceItem.ItemPeriodEnd = interimsItem.ItemPeriodEnd; + invoiceItem.RateFactor = null; + invoiceItem.GrossAmountTotal = invoiceItem.AmountTotal; + invoiceItem.UnitDescription = "Tagessatz"; + if (scap != null) + invoiceItem.SupportConceptApprovalPeriodOid = scap.Oid; + + return invoiceItem; + } } return null; } diff --git a/ReportImp/HshCologne/ServiceInvoiceReport.cs b/ReportImp/HshCologne/ServiceInvoiceReport.cs index bcb68aeec..a4007f791 100644 --- a/ReportImp/HshCologne/ServiceInvoiceReport.cs +++ b/ReportImp/HshCologne/ServiceInvoiceReport.cs @@ -172,10 +172,10 @@ namespace HshCologne { sb.AppendLine(pRO.RecipientOrganisation); } - //if (!String.IsNullOrEmpty(pRO.RecipientAddressLine1)) - //{ - // sb.AppendLine(pRO.RecipientAddressLine1); - //} + if (!String.IsNullOrEmpty(pRO.RecipientAddressLine1)) + { + sb.AppendLine(pRO.RecipientAddressLine1); + } if (!String.IsNullOrEmpty(pRO.RecipientContactPerson) && !String.IsNullOrEmpty(pRO.RecipientOrganisation) && pRO.RecipientOrganisation.ToLower().Contains("köln")) { sb.AppendLine(pRO.RecipientContactPerson); diff --git a/ReportImp/HshCologne/ServiceInvoiceReportFLS.cs b/ReportImp/HshCologne/ServiceInvoiceReportFLS.cs index f43f74a59..4ff24309c 100644 --- a/ReportImp/HshCologne/ServiceInvoiceReportFLS.cs +++ b/ReportImp/HshCologne/ServiceInvoiceReportFLS.cs @@ -45,7 +45,11 @@ namespace HshCologne { if (sip.ServiceInvoiceItems.Any(ii => ii.UnitDescription == "Fahrtkosten")) { - sip.ServiceInvoiceItems = sip.ServiceInvoiceItems.Where(ii => ii.UnitDescription != "Fahrtkosten").ToList(); + sip.ServiceInvoiceItems = sip.ServiceInvoiceItems.Where(ii => ii.UnitDescription != "Fahrtkosten" && ii.UnitDescription != "Tagessatz").ToList(); + } + if (sip.ServiceInvoiceItems.Any(ii => ii.ServiceDescription == "Tagessatz")) + { + sip.ServiceInvoiceItems = sip.ServiceInvoiceItems.Where(ii => ii.UnitDescription != "Tagessatz").ToList(); } foreach (var ii in sip.ServiceInvoiceItems) { @@ -54,11 +58,18 @@ namespace HshCologne { ii.UnitCountString = String.Format("{0:HH:mm}-{1:HH:mm}", ii.ServiceRecord.Start.Value, ii.ServiceRecord.End.Value); } - ii.Duration = String.Format("{0:ddd}./{0:dd.MM}", ii.ServiceRecord.Start.Value); - - if (ii.ServiceRecord.DistanceInMeter.HasValue) + if (ii.ServiceRecord != null) { - ii.RateFactor = ii.ServiceRecord.DistanceInMeter.Value.ToString("n2"); + ii.Duration = String.Format("{0:ddd}./{0:dd.MM}", ii.ServiceRecord.Start.Value); + if (ii.Hours == 0 && ii.ServiceRecord.RoundedDuration != 0) + { + ii.Hours = Math.Round(ii.ServiceRecord.RoundedDuration / 60, 2, MidpointRounding.AwayFromZero); + } + + if (ii.ServiceRecord.DistanceInMeter.HasValue) + { + ii.RateFactor = ii.ServiceRecord.DistanceInMeter.Value.ToString("n2"); + } } } }