Files
BeWoPlaner/ReportImp/PariSozial/Invoicing/CustomSettlementInvoiceCreation.cs
2024-06-19 16:13:56 +02:00

96 lines
2.6 KiB
C#

using BeWo.Data.Entities;
using BeWo.Service.Invoicing;
using BS.Shared.DataContracts;
using System;
using System.Linq;
namespace PariSozial.Invoicing
{
public class CustomSettlementInvoiceCreation : SettlementInvoiceCreation
{
public override bool IsServiceRecordBillable(ServiceRecord iRecord)
{
if (iRecord.ServiceDescription.ServiceCategory.Name.Contains("Assistenz"))
{
return false;
}
return true;
}
public override void CreateRecipientInformation(Settlement2DC settlementInvoice, CostBearer2SupportConcept c2s)
{
base.CreateRecipientInformation(settlementInvoice, c2s);
if (c2s.CostBearer != null && c2s.CostBearer.Organisation != null)
{
if (c2s.CostBearer.Organisation.InvoiceAddress != null)
{
settlementInvoice.RecipientPostCode = c2s.CostBearer.Organisation.InvoiceAddress.PostalCode;
settlementInvoice.RecipientStreet = c2s.CostBearer.Organisation.InvoiceAddress.Street;
settlementInvoice.RecipientTown = c2s.CostBearer.Organisation.InvoiceAddress.Town;
}
}
}
public override bool CanCreateInvoiceTheOldWay(Settlement2DC si, CostBearer2SupportConcept c2s)
{
return false;
}
public override void CalculateInvoiceItemAmounts(Settlement2DC si)
{
decimal maxApprovedFls = si.ApprovedFLS ?? 0;
foreach (var ii in si.InvoiceItems)
{
if (ii.UnitCount.HasValue)
{
ii.UnitCount = Math.Round(ii.UnitCount.Value, 2, MidpointRounding.AwayFromZero);
if (maxApprovedFls < ii.UnitCount.Value)
ii.UnitCount = maxApprovedFls;
maxApprovedFls -= ii.UnitCount.Value;
if (ii.AmountPerUnit.HasValue)
{
ii.AmountTotal = Math.Round(ii.UnitCount.Value * ii.AmountPerUnit.Value, 2, MidpointRounding.AwayFromZero);
ii.GrossAmountTotal = ii.AmountTotal;
}
if (ii.MaxApprovedUnitCount < ii.UnitCount)
{
ii.MaxApprovedUnitCount = ii.UnitCount;
}
}
}
}
public override void CalculateSettlementInvoiceAmounts(Settlement2DC si)
{
decimal totalAmount = 0;
decimal rateFactor = 1;
if (si.InvoiceItems != null)
{
foreach (var ii in si.InvoiceItems)
{
totalAmount += ii.AmountTotal ?? 0;
if (ii.RateFactor.HasValue && ii.RateFactor.Value != 0)
{
rateFactor = ((100m + ii.RateFactor.Value) / 100m);
}
}
}
si.AmountBillableTotal = Math.Round(totalAmount * rateFactor, 2, MidpointRounding.AwayFromZero);
si.Claim = si.AmountBillableTotal - (si.AmountAdvancedPayments ?? 0) - (si.EquityContribution ?? 0);
}
}
}