using BeWo.Data.Access; using BeWo.Data.Entities; using BeWo.Service.Invoicing; using BS.Shared.Core; using BS.Shared.DataContracts; using BS.Shared.Extensions; using BS.Shared.Services; using System; using System.Collections.Generic; using System.Linq; namespace ProIntegra.Invoicing { public class CustomInvoiceCreation : InvoiceCreation { public override void SetInvoiceId(ServiceInvoice invoice) { base.SetInvoiceId(invoice); } public override InvoiceItem CreateInvoiceItem(ServiceRecordDC iServiceRecord, SupportConceptApprovalPeriod scap, Calculations calc) { var invoiceItem = base.CreateInvoiceItem(iServiceRecord, scap, calc); var crp = scap.CostBearer2SupportConcept.CostBearer.CostRatePeriods; if (crp != null && crp.Count > 0) { var minutesPerServiceUnit = crp.FirstOrDefault(c => c.CostRateType == BS.Shared.CostRatePeriodType.MinutesPerServiceUnit); var minsProFLS = minutesPerServiceUnit != null ? minutesPerServiceUnit.CostRateValue : 60; //invoiceItem.UnitCount = invoiceItem.UnitCount * 60 / minsProFLS; invoiceItem.GrossAmountTotal = invoiceItem.GrossAmountTotal * 60 / minsProFLS; invoiceItem.AmountTotal = invoiceItem.AmountTotal * 60 / minsProFLS; } return invoiceItem; } public override IList CreateInvoiceItems(List serviceRecordsInPeriod, DateTimeSpan invoicePeriod, SupportConceptApprovalPeriod scap, BS.Shared.Services.Calculations calc) { var list = base.CreateInvoiceItems(serviceRecordsInPeriod, invoicePeriod, scap, calc); var crp = scap.CostBearer2SupportConcept.CostBearer.CostRatePeriods; decimal minsProFLS = 60; if (crp != null && crp.Count > 0) { var minutesPerServiceUnit = crp.FirstOrDefault(c => c.CostRateType == BS.Shared.CostRatePeriodType.MinutesPerServiceUnit); minsProFLS = minutesPerServiceUnit.CostRateValue.Value; } if (scap.CostBearer2SupportConcept.CostBearer.Organisation.Name.ToLower().Contains("neu")) { List toAdd = new List(); foreach (var item in list) { item.UnitCount *= 60 / minsProFLS; if (item.ItemDescription.ToLower().Contains("face to face") || item.ItemDescription.ToLower().Contains("face to face")) { var count = serviceRecordsInPeriod.Where(sr => sr.ServiceDescription.Name.ToLower().Contains("face to face") || sr.ServiceDescription.Name.ToLower().Contains("face to face")).ToList().Count; toAdd.Add(CreateKontaktpauschalenItem(count, item.ItemPeriodStart, item.ItemPeriodEnd)); } } if (toAdd.Count > 0) list.AddRange(toAdd); } return list; } public override void BerechneSummaryItemsSummen(List newlist, bool addRateFactorToUnitCount) { // Rausfinden, ob FLS 50 statt 60 Minuten gehen // var oid = newlist.FirstOrDefault(i => i.SupportConceptApprovalPeriodOid != null).SupportConceptApprovalPeriodOid; SupportConceptApprovalPeriod ap = new SupportConceptApprovalPeriod(); if (oid != null) ap = DAOFactory.GenericDAO.GetByID(oid.Value); List crp = null; if (ap != null) crp = ap.CostBearer2SupportConcept.CostBearer.CostRatePeriods.ToList(); if (crp != null && crp.Count > 0) { var minutesPerServiceUnit = crp.FirstOrDefault(c => c.CostRateType == BS.Shared.CostRatePeriodType.MinutesPerServiceUnit); var minsProFLS = minutesPerServiceUnit != null ? minutesPerServiceUnit.CostRateValue : 60; foreach (InvoiceItem invoiceItem in newlist) { if (!invoiceItem.AmountPerUnit.HasValue) { invoiceItem.AmountPerUnit = 0; } invoiceItem.AmountPerUnit = Math.Round(invoiceItem.AmountPerUnit.Value, 2, MidpointRounding.AwayFromZero); if (!invoiceItem.UnitCount.HasValue) { invoiceItem.UnitCount = 0; } if (addRateFactorToUnitCount && invoiceItem.RateFactor.HasValue) { invoiceItem.UnitCount = (invoiceItem.UnitCount ?? 0) * ((invoiceItem.RateFactor + 100) / 100); } invoiceItem.UnitCount = Math.Round(invoiceItem.UnitCount.Value, 2, MidpointRounding.AwayFromZero); // Änderung: Eine FLS hat 50 statt 60 Minuten invoiceItem.AmountTotal = invoiceItem.AmountPerUnit * (invoiceItem.UnitCount * 60 / minsProFLS); invoiceItem.AmountTotal = Math.Round(invoiceItem.AmountTotal.Value, 2, MidpointRounding.AwayFromZero); invoiceItem.GrossAmountTotal = invoiceItem.AmountTotal; if (!addRateFactorToUnitCount && invoiceItem.RateFactor.HasValue) { invoiceItem.GrossAmountTotal *= (invoiceItem.RateFactor + 100) / 100; } } } } private InvoiceItem CreateKontaktpauschalenItem(decimal? unitCount, DateTime? itemPeriodStart, DateTime? itemPeriodEnd) { var ii = new InvoiceItem() { UnitCount = unitCount, ItemDescription = "Kontaktpauschale", UnitDescription = "Pauschale pro direktem Kontakt", AmountPerUnit = PauschalenHelper.PAUSCHALE, AmountTotal = PauschalenHelper.PAUSCHALE * unitCount, GrossAmountTotal = PauschalenHelper.PAUSCHALE * unitCount, ItemPeriodStart = itemPeriodStart, ItemPeriodEnd = itemPeriodEnd }; return ii; } } }