215 lines
8.0 KiB
C#
215 lines
8.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using BeWo.Data.Access;
|
|
using BeWo.Data.Entities;
|
|
using BeWo.Service.DCEntityMapper;
|
|
using BeWo.Service.Invoicing;
|
|
using BS.Shared.Core;
|
|
using BS.Shared.DataContracts;
|
|
using BS.Shared.DataContracts.Compact;
|
|
using BS.Shared.Services;
|
|
|
|
namespace Hiba
|
|
{
|
|
public class HibaDefaultInvoiceCreation : InvoiceCreation
|
|
{
|
|
private const decimal ZONE1FAHRTKOSTEN = 3.5m;
|
|
private const decimal ZONE2FAHRTKOSTEN = 9m;
|
|
private const decimal ZONE3FAHRTKOSTEN = 13m;
|
|
private const decimal ZONE4FAHRTKOSTEN = 24m;
|
|
|
|
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 SetInvoiceId(ServiceInvoice invoice)
|
|
//{
|
|
// invoice.InvoiceBase.InvoiceId = "fed";
|
|
//}
|
|
|
|
public override IList<InvoiceItem> CreateInvoiceItems(List<ServiceRecordDC> serviceRecordsInPeriod, DateTimeSpan invoicePeriod, SupportConceptApprovalPeriod scap, Calculations calc)
|
|
{
|
|
var list = base.CreateInvoiceItems(serviceRecordsInPeriod, invoicePeriod, scap, calc);
|
|
foreach (var invoiceItem in list)
|
|
{
|
|
invoiceItem.ItemDescription = "geleistete Päd.-Stunden";
|
|
invoiceItem.UnitDescription = "Stundensatz";
|
|
}
|
|
InvoiceItem ttii = CreateFahrkostenInvoiceItem(serviceRecordsInPeriod, scap, calc);
|
|
if (ttii != null)
|
|
list.Add(ttii);
|
|
return list;
|
|
}
|
|
|
|
public override IList<InvoiceItem> CreateSummaryInvoiceItems(IList<InvoiceItem> itemList,
|
|
DateTimeSpan invoicePeriod, SupportConceptApprovalPeriod scap, Calculations calc, bool summaryPerMonth)
|
|
{
|
|
//Fasse InvoiceItems mit gleichem Stundensatz zusammen:
|
|
|
|
var newlist = new List<InvoiceItem>();
|
|
|
|
var rateToItem = new Dictionary<String, InvoiceItem>();
|
|
foreach (InvoiceItem iitem in itemList)
|
|
{
|
|
InvoiceItem item;
|
|
String key = String.Format("{0}_{1}", iitem.AmountPerUnit, iitem.RateFactor);
|
|
if (summaryPerMonth)
|
|
{
|
|
key = String.Format("{0}_{1}_{2:yyyyMM}", iitem.AmountPerUnit, iitem.RateFactor, iitem.ItemPeriodStart);
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
|
|
foreach (InvoiceItem invoiceItem in newlist)
|
|
{
|
|
|
|
if (invoiceItem.RateFactor.HasValue)
|
|
{
|
|
invoiceItem.UnitCount = (invoiceItem.UnitCount ?? 0) * ((invoiceItem.RateFactor + 100) / 100);
|
|
}
|
|
invoiceItem.UnitCount = Math.Round(invoiceItem.UnitCount ?? 0, 2, MidpointRounding.AwayFromZero);
|
|
|
|
invoiceItem.AmountTotal = invoiceItem.AmountPerUnit * invoiceItem.UnitCount;
|
|
invoiceItem.AmountTotal = Math.Round(invoiceItem.AmountTotal.Value, 2, MidpointRounding.AwayFromZero);
|
|
|
|
invoiceItem.GrossAmountTotal = invoiceItem.AmountTotal;
|
|
}
|
|
return newlist;
|
|
}
|
|
|
|
private InvoiceItem CreateFahrkostenInvoiceItem(List<ServiceRecordDC> serviceRecordsInPeriod, SupportConceptApprovalPeriod scap, Calculations calc)
|
|
{
|
|
int anzahlFahrtkosten = 0;
|
|
|
|
if (!accountingPeriodStart.HasValue)
|
|
accountingPeriodStart = scap.StartDate;
|
|
if (!accountingPeriodEnd.HasValue)
|
|
accountingPeriodEnd = scap.EndDate;
|
|
|
|
foreach (var sr in serviceRecordsInPeriod)
|
|
{
|
|
if (sr.DistanceInMeter.HasValue && sr.DistanceInMeter.Value > 0)
|
|
{
|
|
anzahlFahrtkosten++;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
var customer = scap.CostBearer2SupportConcept.SupportConcept.Customer;
|
|
if (anzahlFahrtkosten > 0)
|
|
{
|
|
var invoiceItem = new InvoiceItem();
|
|
invoiceItem.AmountPerUnit = GetFahrtkosten(customer);
|
|
invoiceItem.UnitCount = anzahlFahrtkosten;
|
|
invoiceItem.AmountTotal = invoiceItem.UnitCount * invoiceItem.AmountPerUnit;
|
|
invoiceItem.RateFactor = null;
|
|
invoiceItem.ItemPeriodStart = accountingPeriodStart;
|
|
invoiceItem.ItemPeriodEnd = accountingPeriodEnd;
|
|
invoiceItem.GrossAmountTotal = invoiceItem.AmountTotal;
|
|
invoiceItem.ItemDescription = String.Format("Wegezeitenpauschale");
|
|
invoiceItem.UnitDescription = String.Format("Pauschalsatz");
|
|
if (scap != null)
|
|
invoiceItem.SupportConceptApprovalPeriodOid = scap.Oid;
|
|
|
|
|
|
|
|
return invoiceItem;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private decimal GetFahrtkosten(Customer customer)
|
|
{
|
|
foreach (var vf in customer.VarFieldValueList)
|
|
{
|
|
if (!String.IsNullOrEmpty(vf.SerializedValue))
|
|
{
|
|
if (vf.SerializedValue.Contains("Zone 1"))
|
|
{
|
|
return ZONE1FAHRTKOSTEN;
|
|
}
|
|
else if (vf.SerializedValue.Contains("Zone 2"))
|
|
{
|
|
return ZONE2FAHRTKOSTEN;
|
|
}
|
|
else if (vf.SerializedValue.Contains("Zone 3"))
|
|
{
|
|
return ZONE3FAHRTKOSTEN;
|
|
}
|
|
else if (vf.SerializedValue.Contains("Zone 4"))
|
|
{
|
|
return ZONE4FAHRTKOSTEN;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
}
|