372 lines
14 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|