diff --git a/ReportImp/PflegedienstWessel/Invoicing/CustomInvoiceCreation.cs b/ReportImp/PflegedienstWessel/Invoicing/CustomInvoiceCreation.cs new file mode 100644 index 000000000..b22a8e851 --- /dev/null +++ b/ReportImp/PflegedienstWessel/Invoicing/CustomInvoiceCreation.cs @@ -0,0 +1,212 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using BeWo.Data.Access; +using BeWo.Data.Entities; +using BeWo.Service.DCEntityMapper; +using BeWo.Service.Invoicing; +using BeWo.Service.Plugins; +using BS.Shared; +using BS.Shared.Core; +using BS.Shared.DataContracts; +using BS.Shared.DataContracts.Compact; +using BS.Shared.Extensions; +using BS.Shared.Services; + +namespace PflegedienstWessel.Invoicing +{ + + public class CustomAlltagsunterstuetzungsInvoiceCreation : InvoiceCreation + { + private DateTime? accountingPeriodStart = null; + private DateTime? accountingPeriodEnd = null; + + // public override void SetInvoiceId(ServiceInvoice invoice) + //{ + // invoice.InvoiceBase.InvoiceId = "Alltag"; + // invoice.InvoiceBase.InvoiceTypeText = "Alltagsunterstützung"; + //} + public override List GenerateServiceInvoices(long costBearerOid, DateTimeSpan invoicePeriod, Dictionary> supportConcepts2ServiceRecords) + { + //bei den weiteren Kostenträgern (außer Persönliches Budget 24 Stunden) wird je eine Rechnung pro Leistungskategorie benötigt + // -> es werden für jeden Kunden pro Kostenträger Rechnungen erstellt und hintereinandergefügt + var invoiceList = new List(); + var invoiceCounter = 0; + var sortedScs = supportConcepts2ServiceRecords.Keys.OrderBy(s => s.Customer.LastNameFirstName).ToList(); + + foreach (var sc in sortedScs) + { + var serviceRecords = supportConcepts2ServiceRecords[sc]; + serviceRecords = serviceRecords.Where(s => !s.ServiceDescription.CategoryName.Contains("Fachleistung")).ToList(); // die sind in Spitzabrechnung + if (sc.CostBearerList.Count > 0) + { + var costBearer = DAOFactory.GenericDAO.LoadByID(sc.CostBearerList[0].CostBearerOid); + Dictionary> srDict = new Dictionary>(); + + foreach (var sr in serviceRecords) + { + String key = sr.ServiceDescription.CategoryName; + + if (!srDict.ContainsKey(key)) + srDict.Add(key, new List()); + + srDict[key].Add(sr); + } + + foreach (var catName in srDict.Keys) + { + var list = srDict[catName]; + var invoice = CreateSingleInvoice(invoiceCounter, costBearer, invoicePeriod, sc, list); + + if (invoice != null) + { + invoice.InvoiceBase.InvoiceId = "Service"; + invoiceList.Add(invoice); + invoiceCounter++; + } + } + } + } + + var result = invoiceList.Select(item => MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(item)).ToList(); + return result; + } + + + public override ServiceInvoice CreateSingleInvoice(int invoiceCounter, CostBearer costBearer, DateTimeSpan invoicePeriod, CompactSupportConceptDC supportConcept, List serviceRecords) + { + var i = base.CreateSingleInvoice(invoiceCounter, costBearer, invoicePeriod, supportConcept, serviceRecords); + + if (i != null) + { + var claim = i.GetTotalClaim(); + + if (!claim.HasValue || claim.Value == 0) + return null; + } + + return i; + } + + public override void SetInvoiceBaseData(int invoiceCounter, ServiceInvoice invoice, CostBearer costBearer, DateTimeSpan invoicePeriod, + IList supportConceptList) + { + if (invoicePeriod != null) + { + accountingPeriodStart = invoicePeriod.StartDate; + accountingPeriodEnd = invoicePeriod.EndDate; + } + base.SetInvoiceBaseData(invoiceCounter, invoice, costBearer, invoicePeriod, supportConceptList); + } + + public override void SetRecipientInformation(ServiceInvoice serviceInvoice, CostBearer costBearer) + { + if (costBearer.Organisation.Name.ToLower().Contains("persönliches Budget")) + { + serviceInvoice.InvoiceBase.RecipientDivision = costBearer.Organisation.Name2; + serviceInvoice.InvoiceBase.RecipientOrganisationOid = costBearer.Organisation.Oid; + serviceInvoice.InvoiceBase.RecipientOrganisation = costBearer.Organisation.Name; + serviceInvoice.InvoiceBase.RecipientContacts = costBearer.Organisation.Contacts.Select(i => i.CopyToNew()).ToList(); + serviceInvoice.InvoiceBase.RecipientCostBearerOid = costBearer.Oid; + + if (serviceInvoice.InvoiceBase.CostBearer2SupportConcept != null) + { + var cust = serviceInvoice.InvoiceBase.CostBearer2SupportConcept.SupportConcept.Customer; + + if (cust.Person.InvoiceAddress != null) + { + serviceInvoice.InvoiceBase.RecipientAddress = cust.Person.InvoiceAddress.CopyToNew(); + } + else if (cust.Person.Address != null) + { + serviceInvoice.InvoiceBase.RecipientAddress = cust.Person.Address.CopyToNew(); + } + + if (cust.Person.InvoiceAddress != null && cust.Person.InvoiceAddress.AddressLine1 != null) + { + serviceInvoice.InvoiceBase.RecipientPersonFirstName = cust.Person.InvoiceAddress.AddressLine1; + serviceInvoice.InvoiceBase.RecipientPersonLastName = ""; + } + else + { + serviceInvoice.InvoiceBase.RecipientPersonFirstName = cust.Person.FirstName; + serviceInvoice.InvoiceBase.RecipientPersonLastName = cust.Person.LastName; + } + return; + } + if (costBearer.Organisation.InvoiceAddress != null) + { + serviceInvoice.InvoiceBase.RecipientAddress = costBearer.Organisation.InvoiceAddress.CopyToNew(); + } + else if (costBearer.Organisation.Address != null) + { + serviceInvoice.InvoiceBase.RecipientAddress = costBearer.Organisation.Address.CopyToNew(); + } + } + } + + public override void SetServiceInvoicePeriods(ServiceInvoice invoice, CostBearer2SupportConcept costBearer2SupportConcept, + DateTimeSpan invoicePeriod, List serviceRecords) + { + var invoiceAccountingPeriodSpan = new DateTimeSpan + { + StartDateTime = invoice.InvoiceBase.AccountingPeriodStart.Value, + EndDateTime = invoice.InvoiceBase.AccountingPeriodEnd.Value + }; + + foreach (SupportConceptApprovalPeriod iPeriod in costBearer2SupportConcept.ApprovalPeriodList) + { + SupportConceptApprovalPeriodDC approvalPeriodDC = MapperFactory.SupportConceptApprovalPeriodDC_SupportConceptApprovalPeriod.MapToNewDC(iPeriod); + + + if (approvalPeriodDC.Span.EndDateTime < invoiceAccountingPeriodSpan.StartDateTime || approvalPeriodDC.Span.StartDateTime > invoiceAccountingPeriodSpan.EndDate) + { + continue; + } + + ServiceInvoicePeriod serviceInvoicePeriod = CreateServiceInvoicePeriod(approvalPeriodDC, invoiceAccountingPeriodSpan); + serviceInvoicePeriod.SupportConceptApprovalPeriod = iPeriod; + serviceInvoicePeriod.Customer = costBearer2SupportConcept.SupportConcept.Customer; + + CostBearer costBearer = costBearer2SupportConcept.CostBearer; + List costRates = MapperFactory.CostRatePeriodDC_CostRatePeriod.MapToNewDCs(costBearer.CostRatePeriods); + + CostRatePeriodDC serviceUnit = costRates.GetCostRatePeriodForDate(CostRatePeriodType.MinutesPerServiceUnit, DateTime.Now); + serviceInvoicePeriod.ServiceUnitName = serviceUnit.UnitName; + + SetInvoiceItems(invoice, serviceInvoicePeriod, approvalPeriodDC, costBearer2SupportConcept, invoicePeriod, serviceRecords); + + if (serviceInvoicePeriod.InvoiceItemList.Count > 0) + invoice.ServiceInvoicePeriodList.Add(serviceInvoicePeriod); + } + } + + + public override InvoiceItem CreateInvoiceItem(ServiceRecordDC iServiceRecord, SupportConceptApprovalPeriod scap, Calculations calc) + { + if (iServiceRecord.ServiceDescription.CategoryName.Contains("Fachleistung")) + return null; + + var ii = base.CreateInvoiceItem(iServiceRecord, scap, calc); + DateTime start = ii.ItemPeriodStart.Value; + decimal preisLeistung = 0; + string catName = iServiceRecord.ServiceDescription.CategoryName.ToString(); + + var cat = DAOFactory.SearchDAO.FindServiceCategoryByName(catName); + if (cat != null) + { + var crps = MapperFactory.CostRatePeriodDC_CostRatePeriod.MapToNewDCs(cat.CostRatePeriods); + var cp = crps.GetCostRatePeriodForDate(CostRatePeriodType.AmountOfMoney, start); + if (cp != null && cp.CostRateValue.HasValue) + preisLeistung = (decimal)cp.CostRateValue; + ii.AmountPerUnit = preisLeistung; + ii.RateFactor = null; + ii.AmountTotal = preisLeistung * ii.UnitCount; + ii.GrossAmountTotal = preisLeistung * ii.UnitCount; + ii.ItemDescription = catName; + } + return ii; + } + } +} diff --git a/ReportImp/PflegedienstWessel/Invoicing/CustomInvoiceFactory.cs b/ReportImp/PflegedienstWessel/Invoicing/CustomInvoiceFactory.cs new file mode 100644 index 000000000..3706eaf6c --- /dev/null +++ b/ReportImp/PflegedienstWessel/Invoicing/CustomInvoiceFactory.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using BeWo.Service.Invoicing; +using BS.Shared.DataContracts; +using BS.Shared.DataContracts.Compact; + +namespace PflegedienstWessel.Invoicing +{ + public class CustomInvoiceFactory : InvoiceFactory + { + public override InvoiceCreation CreateInvoiceCreator(string specificId, string tenant, Dictionary> supportConcepts2ServiceRecords) + { + foreach (var list in supportConcepts2ServiceRecords.Values) + { + foreach (var sr in list) + { + if (sr.CostBearer.Name.ToLower().Contains("persönliches budget 24")) // nochmal checken beim deployen wie der Name der Orga ist und Faktor auf FLS in Sammelrechnung? + { + return new CustomPersBudget24InvoiceCreation(); + } + else + { + var sd = sr.ServiceDescription.Category; + var ic = GetInvoiceCreatorForCategory(sd); + if (ic != null) + return ic; + } + } + } + return base.CreateInvoiceCreator(specificId, tenant, supportConcepts2ServiceRecords); + } + + private InvoiceCreation GetInvoiceCreatorForCategory(ServiceCategoryDC sd) + { + if (sd != null && !String.IsNullOrEmpty(sd.Name)) + { + String cat = sd.Name.ToLower().Trim(); + if (!cat.Contains("fachleistung")) + { + return new CustomInvoiceCreation(); + } + } + return null; + } + } +} diff --git a/ReportImp/PflegedienstWessel/Invoicing/CustomPersBudget24InvoiceCreation.cs b/ReportImp/PflegedienstWessel/Invoicing/CustomPersBudget24InvoiceCreation.cs new file mode 100644 index 000000000..60d4b922d --- /dev/null +++ b/ReportImp/PflegedienstWessel/Invoicing/CustomPersBudget24InvoiceCreation.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using BeWo.Data.Access; +using BeWo.Data.Entities; +using BeWo.Service.DCEntityMapper; +using BeWo.Service.Invoicing; +using BS.Shared; +using BS.Shared.Core; +using BS.Shared.DataContracts; +using BS.Shared.Extensions; +using BS.Shared.Services; + +namespace PflegedienstWessel.Invoicing +{ + + public class CustomPersBudget24InvoiceCreation : InvoiceCreation + { + public override void SetInvoiceId(ServiceInvoice invoice) + { + invoice.InvoiceBase.InvoiceId = "PersBudget"; + invoice.InvoiceBase.InvoiceTypeText = "PersBudget24"; + } + + public override void SetAmountAdvancePayments(ServiceInvoice invoice) + { + //do nothing + } + + public override void SetAmountEquityContribution(ServiceInvoice invoice) + { + //do nothing + } + + public override InvoiceItem CreateInvoiceItem(ServiceRecordDC iServiceRecord, SupportConceptApprovalPeriod scap, Calculations calc) + { + // Anders als bei anderen Kostenträger zahlen die Selbstzahler im Persönlichen Budget 24 Stunden alle Leistungen monatlich aus einer Rechnung + + //if (!iServiceRecord.ServiceDescription.CategoryName.Contains("Assistenz")) + // return null; + + var ii = base.CreateInvoiceItem(iServiceRecord, scap, calc); + DateTime start = ii.ItemPeriodStart.Value; + decimal preisAssistenz = 0; + + //Achtung je nach Preisgestaltung wird jetzt bei FLS kein Faktor gezogen! + string catName = iServiceRecord.ServiceDescription.CategoryName.ToString(); + + var cat = DAOFactory.SearchDAO.FindServiceCategoryByName(catName); + if (cat != null) + { + var crps = MapperFactory.CostRatePeriodDC_CostRatePeriod.MapToNewDCs(cat.CostRatePeriods); + var cp = crps.GetCostRatePeriodForDate(CostRatePeriodType.AmountOfMoney, start); + if (cp != null && cp.CostRateValue.HasValue) + preisAssistenz = (decimal)cp.CostRateValue; + ii.AmountPerUnit = preisAssistenz; + ii.RateFactor = null; + ii.AmountTotal = preisAssistenz * ii.UnitCount; + ii.GrossAmountTotal = preisAssistenz * ii.UnitCount; + } + return ii; + } + + public override IList CreateSummaryInvoiceItems(IList itemList, DateTimeSpan invoicePeriod, SupportConceptApprovalPeriod scap, + Calculations calc, bool summaryPerMonth, bool addRateFactorToUnitCount) + { + return base.CreateSummaryInvoiceItems(itemList, invoicePeriod, scap, calc, true, true); + } + + public override void SetRecipientInformation(ServiceInvoice serviceInvoice, CostBearer costBearer) + { + serviceInvoice.InvoiceBase.RecipientDivision = costBearer.Organisation.Name2; + serviceInvoice.InvoiceBase.RecipientOrganisationOid = costBearer.Organisation.Oid; + serviceInvoice.InvoiceBase.RecipientOrganisation = costBearer.Organisation.Name; + serviceInvoice.InvoiceBase.RecipientContacts = costBearer.Organisation.Contacts.Select(i => i.CopyToNew()).ToList(); + serviceInvoice.InvoiceBase.RecipientCostBearerOid = costBearer.Oid; + + if (serviceInvoice.InvoiceBase.CostBearer2SupportConcept != null) + { + var cust = serviceInvoice.InvoiceBase.CostBearer2SupportConcept.SupportConcept.Customer; + + if (cust.Person.InvoiceAddress != null) + { + serviceInvoice.InvoiceBase.RecipientAddress = cust.Person.InvoiceAddress.CopyToNew(); + } + else if (cust.Person.Address != null) + { + serviceInvoice.InvoiceBase.RecipientAddress = cust.Person.Address.CopyToNew(); + } + + if (cust.Person.InvoiceAddress != null && cust.Person.InvoiceAddress.AddressLine1 != null) + { + serviceInvoice.InvoiceBase.RecipientPersonFirstName = cust.Person.InvoiceAddress.AddressLine1; + serviceInvoice.InvoiceBase.RecipientPersonLastName = ""; + } + else + { + serviceInvoice.InvoiceBase.RecipientPersonFirstName = cust.Person.FirstName; + serviceInvoice.InvoiceBase.RecipientPersonLastName = cust.Person.LastName; + } + return; + } + if (costBearer.Organisation.InvoiceAddress != null) + { + serviceInvoice.InvoiceBase.RecipientAddress = costBearer.Organisation.InvoiceAddress.CopyToNew(); + } + else if (costBearer.Organisation.Address != null) + { + serviceInvoice.InvoiceBase.RecipientAddress = costBearer.Organisation.Address.CopyToNew(); + } + } + } +} diff --git a/ReportImp/PflegedienstWessel/Invoicing/SettlementInvoiceCreation.cs b/ReportImp/PflegedienstWessel/Invoicing/SettlementInvoiceCreation.cs new file mode 100644 index 000000000..4cdff3744 --- /dev/null +++ b/ReportImp/PflegedienstWessel/Invoicing/SettlementInvoiceCreation.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using BeWo.Data.Entities; +using BeWo.Service.DCEntityMapper; +using BeWo.Service.Invoicing; +using BS.Shared; +using BS.Shared.Core; +using BS.Shared.DataContracts; +using BS.Shared.Extensions; +using BS.Shared.Services; + +namespace PflegedienstWessel.Invoicing +{ + + public class CustomSettlementInvoiceCreation : SettlementInvoiceCreation + { + public override bool CanCreateInvoiceTheOldWay(Settlement2DC si, CostBearer2SupportConcept c2s) + { + return false; + } + + public override bool IsServiceRecordBillable(ServiceRecord iRecord) + { + if (iRecord.ServiceDescription.ServiceCategory.Name.Contains("Fachleistung")) + { + return true; + } + return false; + } + + public override void CalculateSettlementInvoiceApprovedAmounts(Settlement2DC si, SupportConceptCostBearerRelDC relDC, Calculations calc) + { + si.ApprovedFLSWeekly = 0; + si.ApprovedFLS = 0; + foreach (var sp in relDC.ApprovalPeriodList) + { + if (sp.ServiceCategory == null || sp.ServiceCategory.Name.Contains("Fachleistung")) + { + si.ApprovedFLSWeekly += calc.GetApprovedHoursPerWeek(sp, relDC.CostBearer.CostRatePeriods) ?? 0m; + + decimal flsTotal = calc.GetApprovedHoursTotal(sp, relDC.CostBearer.CostRatePeriods) ?? 0m; + flsTotal = Math.Round(flsTotal, 2, MidpointRounding.AwayFromZero); + + si.ApprovedFLS += flsTotal; + } + } + } + + + public override IList GetBillableServiceRecords(CostBearer2SupportConcept c2s) + { + return c2s.ServiceRecords.OrderBy(s => s.Start).Where(s => s.ServiceDescription.ServiceCategory.Name.ToLower().Contains("Fachleistung")).ToList(); + } + } +} diff --git a/ReportImp/PflegedienstWessel/PflegedienstWessel.csproj b/ReportImp/PflegedienstWessel/PflegedienstWessel.csproj index 361f5331c..8c3d4965a 100644 --- a/ReportImp/PflegedienstWessel/PflegedienstWessel.csproj +++ b/ReportImp/PflegedienstWessel/PflegedienstWessel.csproj @@ -69,6 +69,10 @@ Fahrtkosten.cs + + + + Component