MH: SKM Aachen Differenzrechnung Sammelrechnung

This commit is contained in:
2025-01-08 14:16:02 +01:00
parent 73ebe969e6
commit 90aa042699
2 changed files with 111 additions and 0 deletions

View File

@@ -93,6 +93,7 @@
<Compile Include="RechnungBeWo67.Designer.cs">
<DependentUpon>RechnungBeWo67.cs</DependentUpon>
</Compile>
<Compile Include="Service\CustomAccountingService.cs" />
<Compile Include="Service\CustomCustomerService.cs" />
<Compile Include="Teamstundenkonto.cs">
<SubType>Component</SubType>

View File

@@ -0,0 +1,110 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using SKMAachen.Invoicing;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Plugins;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
namespace SKMAachen.Service
{
public class CustomAccountingService : AccountingService
{
protected override ServiceInvoiceDC ErstelleDifferenzRechnung(DifferenzRechnungCheck item)
{
ServiceInvoiceDC diffRechnung = null;
var alterBetrag = item.VorhandeneRechungen.Sum(i => i.ClaimSum ?? 0);
if (item.NeueRechnung.ClaimSum == alterBetrag)
{
diffRechnung = item.NeueRechnung;
diffRechnung.InvoiceBase.NeuErstellen = false;
diffRechnung.InvoiceBase.Hinweise = String.Format("Rechnung wurde bereits erstellt");
}
else
{
diffRechnung = new ServiceInvoiceDC();
diffRechnung.OriginalZurDifferenz = item.NeueRechnung;
diffRechnung.InvoiceBase = new InvoiceBaseDC();
CopyInvoiceBaseDC(item.NeueRechnung.InvoiceBase, diffRechnung);
var items = new List<InvoiceItemDC>();
// Alte Items negativ setzen und hinzufügen
string rechnungsnummern = string.Join(", ", item.VorhandeneRechungen.Select(r => r.InvoiceBase.InvoiceNumber));
foreach (var inv in item.VorhandeneRechungen)
{
foreach (var sip in inv.ServiceInvoicePeriods)
{
foreach (var iitem in sip.InvoiceItems)
{
InvoiceItemDC newDiffItem = new InvoiceItemDC();
newDiffItem.AmountTotal = iitem.AmountTotal * -1;
newDiffItem.GrossAmountTotal = iitem.GrossAmountTotal * -1;
newDiffItem.AmountPerUnit = iitem.AmountPerUnit * -1;
newDiffItem.ItemDescription = !rechnungsnummern.IsNullOrEmpty() ? "In Rechnungsnummer(n) " + rechnungsnummern + " bereits berechnet wurde" : "Bereits berechnet wurde";
newDiffItem.ItemPeriodStart = iitem.ItemPeriodStart;
newDiffItem.ItemPeriodEnd = iitem.ItemPeriodEnd;
newDiffItem.UnitCount = iitem.UnitCount;
newDiffItem.UnitDescription = iitem.UnitDescription;
newDiffItem.RateFactor = iitem.RateFactor;
items.Add(newDiffItem);
}
}
}
// Neue Items hinzufügen zur Gegenüberstellung
foreach (var sip in item.NeueRechnung.ServiceInvoicePeriods)
{
foreach (var iitem in sip.InvoiceItems)
{
InvoiceItemDC newDiffItem = new InvoiceItemDC();
newDiffItem.AmountTotal = iitem.AmountTotal;
newDiffItem.GrossAmountTotal = iitem.GrossAmountTotal;
newDiffItem.AmountPerUnit = iitem.AmountPerUnit;
newDiffItem.ItemDescription = iitem.ItemDescription;
newDiffItem.ItemPeriodStart = iitem.ItemPeriodStart;
newDiffItem.ItemPeriodEnd = iitem.ItemPeriodEnd;
newDiffItem.RateFactor = iitem.RateFactor;
newDiffItem.UnitCount = iitem.UnitCount;
newDiffItem.UnitDescription = iitem.UnitDescription;
items.Add(newDiffItem);
}
}
items = items.OrderBy(i => i.ItemPeriodStart).ThenBy(i => i.GrossAmountTotal).ToList();
var newItem = new InvoiceItemDC();
newItem.ItemPeriodStart = item.NeueRechnung.InvoiceBase.AccountingPeriodStart;
newItem.ItemPeriodEnd = item.NeueRechnung.InvoiceBase.AccountingPeriodEnd;
newItem.UnitCount = 1;
newItem.AmountPerUnit = item.NeueRechnung.ClaimSum - alterBetrag;
newItem.AmountTotal = newItem.AmountPerUnit;
newItem.GrossAmountTotal = newItem.AmountTotal;
newItem.ItemDescription = String.Format("Rechnungsdifferenz zu Rechnung {0} in Höhe von {1:c}", item.VorhandeneRechungen[0].InvoiceBase.InvoiceNumber, alterBetrag);
diffRechnung.InvoiceBase.Hinweise = String.Format("Rechnungsdifferenz zu Rechnung {0} in Höhe von {1:c}", item.VorhandeneRechungen[0].InvoiceBase.InvoiceNumber, alterBetrag);
diffRechnung.InvoiceBase.InvoiceTypeText = "Differenzrechnung";
// ServiceInvoicePeriod bekommt den Betrag für die Anzeige zugewiesen, ein neues
var newSip = new ServiceInvoicePeriodDC();
newSip.Claim = newItem.AmountTotal;
newSip.Start = item.NeueRechnung.InvoiceBase.AccountingPeriodStart;
newSip.End = item.NeueRechnung.InvoiceBase.AccountingPeriodEnd;
diffRechnung.ServiceInvoicePeriods = new List<ServiceInvoicePeriodDC>();
diffRechnung.ServiceInvoicePeriods.Add(newSip);
newSip.InvoiceItems = new List<InvoiceItemDC>();
newSip.InvoiceItems.AddRange(items);
//newSip.InvoiceItems.Add(newItem);
}
return diffRechnung;
}
}
}