Files
BeWoPlaner/Service/Invoicing/LWLDiggaSettlementInvoiceCreation.cs

107 lines
4.9 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.Plugins;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
using BS.Shared.Services;
namespace BeWo.Service.Invoicing
{
[IDSpecificClass(Identifier = "LWLDigga")]
public class LWLDiggaSettlementInvoiceCreation : SettlementInvoiceCreation
{
// AB, 20.1.0.2025: wird in jedem Kundenprojekt einzeln überschrieben
//public override DateTime? Umstellungsdatum()
//{
// // letzter Tag mit alter Rundung (Variante 1) in Zeitervassung
// return new DateTime(2025, 08, 31);
//}
public override bool CanCreateInvoiceTheOldWay(Settlement2DC si, CostBearer2SupportConcept c2s)
{
return false;
}
public override void CreateInvoiceDetails(Settlement2DC si, CostBearer2SupportConcept cb2sc, DateTime? BewilligtStart, DateTime? BewilligtEnde)
{
// die gesamte Berechnung ist für Anhang zum Budgetnachweis und für die Berechnung der Rechnung identisch, daher in Extraklasse LWLDiggaBerechnnung gelagert
LWLDiggaBerechnung lwlCore = new LWLDiggaBerechnung();
lwlCore.CreateLWLDiggaBerechnung(si, cb2sc, BewilligtStart, BewilligtEnde);
var calc = PluginLoader.FindClass<Calculations>(_SpecificID) ?? Calculations.GetInstance(_SpecificID);
var relDC = cb2sc.MapToNewDC();
CalculateSettlementInvoiceApprovedAmounts(si, relDC, calc);
var span = new DateTimeSpan();
span.StartDateTime = si.AccountingPeriodStart.Value;
span.EndDateTime = si.AccountingPeriodEnd.Value.AddDays(1).AddTicks(-1);
si.InvoiceItems = CreateInvoiceItemsForEntgeltzeitraeume(lwlCore.Entgeltzeitraeume);
CalculateAdvancedPayments(si, cb2sc);
CalculateEquityContribution(si, cb2sc.SupportConcept, BewilligtStart, BewilligtEnde);
CalculateSettlementInvoiceAmounts(si);
}
private List<InvoiceItemDC> CreateInvoiceItemsForEntgeltzeitraeume(List<EntgeltzeitraumDigga> Entgeltzeitraeume)
{
Dictionary<long, SupportConceptApprovalPeriodDC> oid2Scap = new Dictionary<long, SupportConceptApprovalPeriodDC>();
List<InvoiceItemDC> invoiceItems = new List<InvoiceItemDC>();
foreach (var e in Entgeltzeitraeume)
{
var iiList = CreateInvoiceItemsForAccountingPeriod(e);
invoiceItems.AddRange(iiList);
}
return invoiceItems;
}
private IList<InvoiceItemDC> CreateInvoiceItemsForAccountingPeriod(EntgeltzeitraumDigga e)
{
List<InvoiceItemDC> list = new List<InvoiceItemDC>();
if (e.SummeFLStunden > 0)
{
InvoiceItemDC ii = new InvoiceItemDC();
//ii.AccountingInterval = accountingPeriod.AccountingInterval;
ii.ItemPeriodStart = e.Start;
ii.ItemPeriodEnd = e.Ende;
ii.RateFactor = e.RateFactor;
ii.AmountPerUnit = e.CostRatePeriod.CostRateValue;
ii.ItemDescription = "Fachleistungsstunden";
ii.UnitCount = e.SummeFLStunden;
ii.AmountTotal = Math.Round(ii.UnitCount.Value * ii.AmountPerUnit.Value, 2, MidpointRounding.AwayFromZero);
ii.GrossAmountTotal = ii.AmountTotal;
//ii.MaxApprovedAmount = accountingPeriod.MaxApprovedAmount;
//ii.MaxApprovedUnitCount = accountingPeriod.MaxApprovedUnitCount;
//ii.ApprovedPerUnit = accountingPeriod.ApprovedPerUnit;
//ii.ApprovalUnit = accountingPeriod.ApprovalUnit;
list.Add(ii);
}
if (e.SummeFehlkontakteStunden > 0)
{
InvoiceItemDC iiF = new InvoiceItemDC();
//ii.AccountingInterval = accountingPeriod.AccountingInterval;
iiF.ItemPeriodStart = e.Start;
iiF.ItemPeriodEnd = e.Ende;
iiF.RateFactor = e.RateFactor;
iiF.AmountPerUnit = Math.Round(e.CostRatePeriod.CostRateValue.Value * 0.8m, 2, MidpointRounding.AwayFromZero); // Check auf Rundung
iiF.ItemDescription = "Fehlkontakte";
iiF.UnitCount = e.SummeFehlkontakteStunden;
iiF.AmountTotal = Math.Round(iiF.UnitCount.Value * iiF.AmountPerUnit.Value, 2, MidpointRounding.AwayFromZero);
iiF.GrossAmountTotal = iiF.AmountTotal;
//ii.MaxApprovedAmount = accountingPeriod.MaxApprovedAmount;
//ii.MaxApprovedUnitCount = accountingPeriod.MaxApprovedUnitCount;
//ii.ApprovedPerUnit = accountingPeriod.ApprovedPerUnit;
//ii.ApprovalUnit = accountingPeriod.ApprovalUnit;
list.Add(iiF);
}
return list;
}
}
}