Files
BeWoPlaner/ReportImp/VaroSozialagentur/Invoicing/CustomInvoiceCreation.cs

372 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
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 VaroSozialagentur.Invoicing
{
public class CustomInvoiceCreation : InvoiceCreation
{
private const decimal AMOUNT_PER_KM_DEFAULT = 0.3m;
//private const decimal AMOUNT_PER_KM_FAR = 0.35m;
private BeWo.Data.Entities.ServiceCategory fahrtkostenServiceCategory = null;
private DateTime? accountingPeriodStart = null;
private DateTime? accountingPeriodEnd = null;
public override void SetInvoiceBaseData(int invoiceCounter, ServiceInvoice invoice, CostBearer costBearer, DateTimeSpan invoicePeriod,
IList<CompactSupportConceptDC> supportConceptList)
{
if (invoicePeriod != null)
{
accountingPeriodStart = invoicePeriod.StartDate;
accountingPeriodEnd = invoicePeriod.EndDate;
}
base.SetInvoiceBaseData(invoiceCounter, invoice, costBearer, invoicePeriod, supportConceptList);
}
public override void SetServiceInvoicePeriods(ServiceInvoice invoice, CostBearer2SupportConcept costBearer2SupportConcept, DateTimeSpan invoicePeriod, List<ServiceRecordDC> serviceRecords)
{
base.SetServiceInvoicePeriods(invoice, costBearer2SupportConcept, invoicePeriod, serviceRecords);
if (invoice.ServiceInvoicePeriodList != null && invoice.ServiceInvoicePeriodList.Count > 1)
{
//Fasse Fahrkosten über mehrere InvoicePeriods zusammen
ServiceInvoicePeriod newPeriod = invoice.ServiceInvoicePeriodList[0];
List<InvoiceItem> alleNichtFahrtkosten = new List<InvoiceItem>();
List<InvoiceItem> alleFahrtkosten = new List<InvoiceItem>();
foreach (var ip in invoice.ServiceInvoicePeriodList)
{
foreach (var item in ip.InvoiceItemList)
{
if (item.ItemDescription.Contains("Fahrtkosten"))
{
alleFahrtkosten.Add(item);
}
else
{
alleNichtFahrtkosten.Add(item);
}
}
}
newPeriod.InvoiceItemList.Clear();
newPeriod.InvoiceItemList.AddRange(alleNichtFahrtkosten);
if (alleFahrtkosten.Count > 0)
{
var summeFahrtkosten = CreateSummaryInvoiceItems(alleFahrtkosten, invoicePeriod, newPeriod.SupportConceptApprovalPeriod, null, false, false);
newPeriod.InvoiceItemList.AddRange(summeFahrtkosten);
}
invoice.ServiceInvoicePeriodList = new List<ServiceInvoicePeriod>();
invoice.ServiceInvoicePeriodList.Add(newPeriod);
}
}
public override void SetInvoiceItems(ServiceInvoice invoice,
ServiceInvoicePeriod serviceInvoicePeriod,
SupportConceptApprovalPeriodDC supportConceptApprovalPeriod,
CostBearer2SupportConcept cb2sc,
DateTimeSpan invoicePeriod,
List<ServiceRecordDC> serviceRecords)
{
Calculations calc = PluginLoader.FindClass<Calculations>(_SpecificID) ?? Calculations.GetInstance(_SpecificID);
List<ServiceRecordDC> serviceRecordsInPeriod = serviceRecords.Where(
i =>
{
bool valid = i.Start.Value.InBetween(serviceInvoicePeriod.Start.Value,
serviceInvoicePeriod.End.Value, true);
if (valid && serviceInvoicePeriod.SupportConceptApprovalPeriod != null &&
serviceInvoicePeriod.SupportConceptApprovalPeriod.ServiceCategory != null)
valid = serviceInvoicePeriod.SupportConceptApprovalPeriod.ServiceCategory.Oid ==
i.ServiceDescription.Category.ServiceCategoryOid;
return valid;
}).ToList();
if (serviceRecordsInPeriod.Count > 0)
{
var itemList = CreateInvoiceItems(serviceRecordsInPeriod, invoicePeriod, serviceInvoicePeriod.SupportConceptApprovalPeriod, calc);
serviceInvoicePeriod.InvoiceItemList.AddRange(itemList);
}
}
public override IList<InvoiceItem> CreateInvoiceItems(List<ServiceRecordDC> serviceRecordsInPeriod, DateTimeSpan invoicePeriod, SupportConceptApprovalPeriod scap,
BS.Shared.Services.Calculations calc)
{
var list = base.CreateInvoiceItems(serviceRecordsInPeriod, invoicePeriod, scap, calc);
var fitem = CreateFahrtkostenZoneItem(serviceRecordsInPeriod, invoicePeriod, scap);
if (fitem != null)
list.Add(fitem);
fitem = CreateFahrtkostenItem(serviceRecordsInPeriod, scap);
if (fitem != null)
list.Add(fitem);
//fitem = CreateFahrtkostenFarItem(serviceRecordsInPeriod, scap);
//if (fitem != null)
// list.Add(fitem);
return list;
}
private InvoiceItem CreateFahrtkostenZoneItem(List<ServiceRecordDC> serviceRecordsInPeriod, DateTimeSpan invoicePeriod, SupportConceptApprovalPeriod scap)
{
foreach (var sa in scap.CostBearer2SupportConcept.SupportConcept.ServiceAccountings)
{
if (sa.ServiceDescription != null && sa.ServiceDescription.Name.Contains("Zone") || sa.ServiceDescription != null && sa.ServiceDescription.Name.ToLower().Contains("wegzeitenpauschale"))
{
var crlist = MapperFactory.CostRatePeriodDC_CostRatePeriod.MapToNewDCs(sa.ServiceDescription.CostRatePeriods);
var crp = crlist.GetCostRatePeriodForDate(CostRatePeriodType.AmountOfMoney, invoicePeriod.StartDate);
if (crp != null && crp.CostRateValue.HasValue)
{
int count = 0;
foreach (var sr in serviceRecordsInPeriod)
{
if (sr.ServiceDescription.Name.Contains("face to face"))
{
count++;
}
}
var ii = new InvoiceItem();
ii.UnitCount = count;
ii.ItemDescription = sa.ServiceDescription.Name;
if (!ii.ItemDescription.Contains("Fahrtkosten"))
{
ii.ItemDescription = "Fahrtkosten " + sa.ServiceDescription.Name;
}
ii.UnitDescription = "Kostenpauschale (je Kontakt)";
ii.AmountPerUnit = crp.CostRateValue.Value;
ii.ItemPeriodStart = accountingPeriodStart;
ii.ItemPeriodEnd = accountingPeriodEnd;
ii.AmountTotal = Math.Round(ii.AmountPerUnit.Value * ii.UnitCount.Value, 2, MidpointRounding.AwayFromZero);
ii.GrossAmountTotal = ii.AmountTotal;
return ii;
}
}
}
return null;
}
public override IList<InvoiceItem> CreateSummaryInvoiceItems(IList<InvoiceItem> itemList,
DateTimeSpan invoicePeriod, SupportConceptApprovalPeriod scap, Calculations calc, bool summaryPerMonth, bool addRateFactorToUnitCount)
{
//Fasse InvoiceItems mit gleichem Stundensatz zusammen:
var newlist = new List<InvoiceItem>();
var rateToItem = new Dictionary<String, InvoiceItem>();
foreach (InvoiceItem iitem in itemList)
{
InvoiceItem item;
var key = GetSummaryItemKey(null, iitem, summaryPerMonth);
if (rateToItem.ContainsKey(key))
item = rateToItem[key];
else
{
item = new InvoiceItem();
newlist.Add(item);
item.AmountPerUnit = iitem.AmountPerUnit;
if (invoicePeriod != null)
{
item.ItemPeriodStart = invoicePeriod.StartDate;
item.ItemPeriodEnd = invoicePeriod.EndDate;
}
else
{
item.ItemPeriodStart = scap.StartDate;
item.ItemPeriodEnd = scap.EndDate;
}
if (summaryPerMonth && iitem.ItemPeriodStart.HasValue)
{
DateTime start = new DateTime(iitem.ItemPeriodStart.Value.Year, iitem.ItemPeriodStart.Value.Month, 1);
DateTime end = start.AddMonths(1).AddDays(-1);
if (item.ItemPeriodStart < start)
{
item.ItemPeriodStart = start;
}
if (item.ItemPeriodEnd > end)
{
item.ItemPeriodEnd = end;
}
}
item.RateFactor = iitem.RateFactor;
item.AccountingInterval = iitem.AccountingInterval;
item.ItemDescription = iitem.ItemDescription;
item.UnitDescription = iitem.UnitDescription;
item.SupportConceptApprovalPeriodOid = scap.Oid;
rateToItem[key] = item;
}
if (!item.UnitCount.HasValue)
{
item.UnitCount = 0;
}
item.UnitCount += iitem.UnitCount ?? 0;
}
BerechneSummaryItemsSummen(newlist, addRateFactorToUnitCount);
return newlist;
}
public override InvoiceItem CreateInvoiceItem(ServiceRecordDC iServiceRecord, SupportConceptApprovalPeriod scap, Calculations calc)
{
var invoiceItem = base.CreateInvoiceItem(iServiceRecord, scap, calc);
if (iServiceRecord.CostBearer.Name.Contains("Hannover") || iServiceRecord.CostBearer.Name.Contains("Landkreis Hildesheim") || iServiceRecord.CostBearer.Name.Contains("Stadt Hildesheim")
|| iServiceRecord.CostBearer.Name.Contains("Landkreis Northeim"))
{
invoiceItem.UnitCount = 120 * invoiceItem.UnitCount / 100;
invoiceItem.GrossAmountTotal = 120 * invoiceItem.GrossAmountTotal / 100;
}
if (iServiceRecord != null)
{
var cat = iServiceRecord.ServiceDescription.CategoryName;
var desc = iServiceRecord.ServiceDescription.Name;
if (cat.Contains("Fachleistungsstunde"))
{
invoiceItem.ItemDescription = desc;
invoiceItem.UnitDescription = "Fachleistungsstunde (FLS)";
}
else if (cat == "Fahrtkosten")
{
return null;
if (desc.Contains("Zone"))
{
invoiceItem.ItemDescription = "Fahrtkosten " + desc;
invoiceItem.UnitDescription = "Kostenpauschale (je Kontakt)";
}
else
{
invoiceItem.ItemDescription = "Fahrtkosten";
invoiceItem.UnitDescription = "Kilometerpauschale (je km)";
}
}
else
{
invoiceItem.ItemDescription = desc;
invoiceItem.UnitDescription = "Stunde";
}
}
// var rate = calc.GetHourlyRatePeriodForServiceRecord(iServiceRecord);
//if (rate != null && rate.CostRateValue.HasValue)
//{
// invoiceItem.AmountPerUnit = rate.CostRateValue.Value;
// ;
// invoiceItem.UnitCount = calc.GetBillableDurationInMinutes(iServiceRecord) / 60;
// invoiceItem.AmountTotal = invoiceItem.UnitCount * invoiceItem.AmountPerUnit;
// invoiceItem.GrossAmountTotal = invoiceItem.AmountTotal;
//}
return invoiceItem;
}
private InvoiceItem CreateFahrtkostenItem(List<ServiceRecordDC> serviceRecords, SupportConceptApprovalPeriod scap)
{
decimal amountPerKm = AMOUNT_PER_KM_DEFAULT;
InvoiceItem ii = null;
foreach (var sr in serviceRecords)
{
if (sr.DistanceInMeter.HasValue && sr.DistanceInMeter > 0) // && sr.DistanceInMeter < 21)
{
//String ma = sr.Employee.LastName;
if (ii == null)
{
ii = new InvoiceItem();
ii.UnitCount = 0;
ii.ItemDescription = "Fahrtkosten";
ii.UnitDescription = "Kilometerpauschale (je km)";
//ii.UnitDescription = ma;
ii.AmountPerUnit = amountPerKm;
ii.ItemPeriodStart = accountingPeriodStart;
ii.ItemPeriodEnd = accountingPeriodEnd;
}
ii.UnitCount += sr.DistanceInMeter;
}
}
if (ii != null)
{
if (ii.UnitCount.HasValue)
{
ii.AmountTotal = Math.Round(ii.AmountPerUnit.Value * ii.UnitCount.Value, 2, MidpointRounding.AwayFromZero);
ii.GrossAmountTotal = ii.AmountTotal;
}
}
return ii;
}
//private InvoiceItem CreateFahrtkostenFarItem(List<ServiceRecordDC> serviceRecords, SupportConceptApprovalPeriod scap)
//{
// decimal amountPerKm = AMOUNT_PER_KM_FAR;
// InvoiceItem ii = null;
// foreach (var sr in serviceRecords)
// {
// if (sr.DistanceInMeter.HasValue && sr.DistanceInMeter > 0 && sr.DistanceInMeter > 20)
// {
// //String ma = sr.Employee.LastName;
// if (ii == null)
// {
// ii = new InvoiceItem();
// ii.UnitCount = 0;
// ii.ItemDescription = "Fahrtkosten";
// ii.UnitDescription = "Kilometerpauschale (je km)";
// //ii.UnitDescription = ma;
// ii.AmountPerUnit = amountPerKm;
// ii.ItemPeriodStart = accountingPeriodStart;
// ii.ItemPeriodEnd = accountingPeriodEnd;
// }
// ii.UnitCount += sr.DistanceInMeter;
// }
// }
// if (ii != null)
// {
// if (ii.UnitCount.HasValue)
// {
// ii.AmountTotal = Math.Round(ii.AmountPerUnit.Value * ii.UnitCount.Value, 2, MidpointRounding.AwayFromZero);
// ii.GrossAmountTotal = ii.AmountTotal;
// }
// }
// return ii;
//}
public override void CheckMaxApprovedAmount(ServiceInvoice invoice, ServiceInvoicePeriod sip, SupportConceptApprovalPeriodDC scap,
CostBearer2SupportConcept costBearer2SupportConcept, DateTimeSpan invoicePeriod, List<ServiceRecordDC> serviceRecords)
{
//do nothing
}
public override string GetSummaryItemKey(SupportConceptApprovalPeriod scap, InvoiceItem iitem, bool summaryPerMonth)
{
return String.Format("{0}_{1}_{2:yyyyMM}_{3}", iitem.AmountPerUnit, iitem.RateFactor, iitem.ItemPeriodStart, iitem.ItemDescription);
}
}
}