107 lines
4.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|