Files
BeWoPlaner/ReportImp/Hiba/Invoicing/HibaDefaultInvoiceCreation.cs
Christian d78e3e4123 cb
2018-05-28 15:20:27 +02:00

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;
}
}
}