MH: PZD Differenzrechnung

This commit is contained in:
2026-02-26 15:00:24 +01:00
parent adf2dc9ab1
commit 9c3bd3f752
3 changed files with 137 additions and 18 deletions

View File

@@ -77,7 +77,106 @@ namespace PZDDuesseldorf.Service
neu.InvoiceDate = DateTime.Now;
}
// Zusätzlich zur CustomerOID wird hier noch nach dem Abrechnungszeitraum gesucht, den die neue Rechnung hat. Die haben da bisschen Schmarn gemacht, durch den die
// Differenzrechnung sonst nicht funktioniert.
protected override ServiceInvoiceDC ErstelleDifferenzRechnung(DifferenzRechnungCheck item)
{
ServiceInvoiceDC diffRechnung = null;
var letzteRg = item.VorhandeneRechungen.OrderByDescending(r => r.ServiceInvoiceOid).FirstOrDefault();
letzteRg = item.VorhandeneRechungen.FirstOrDefault(r => item.NeueRechnung.InvoiceBase.CustomerOid == r.InvoiceBase.CustomerOid && item.NeueRechnung.InvoiceBase.PeriodString == r.InvoiceBase.PeriodString);
#region Standard
if (letzteRg != null)
{
if (item.NeueRechnung.ClaimSum == letzteRg.ClaimSum)
{
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);
ServiceInvoice counterInvoice = new ServiceInvoice();
var serviceInvoice = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(letzteRg.InvoiceBase.InvoiceBaseOid.Value);
CopyServiceInvoice(serviceInvoice, counterInvoice);
SetzeStornoInfos(counterInvoice);
SetzeRechnungspositionenServiceInvoice(diffRechnung, counterInvoice, item);
diffRechnung.InvoiceBase.NeuErstellen = true;
diffRechnung.InvoiceBase.Hinweise = String.Format("Rechnungsdifferenz zu Rechnung {0} in Höhe von {1:c}", letzteRg.InvoiceBase.InvoiceNumber, letzteRg.InvoiceBase.TotalAmount.Value);
}
}
return diffRechnung;
#endregion;
}
// Nur überschrieben, da die für die Assistenzrechnung ein angepasstes Layout haben und der Text der Differenzpositionen im Standardformat nicht klappt
public override void SetzeRechnungspositionenServiceInvoice(ServiceInvoiceDC diffRechnung, ServiceInvoice counterInvoice, DifferenzRechnungCheck item)
{
#region Standard
var siDCAlt = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(counterInvoice);
if (siDCAlt.ServiceInvoicePeriods != null && siDCAlt.ServiceInvoicePeriods.Count > 0)
{
diffRechnung.ServiceInvoicePeriods = siDCAlt.ServiceInvoicePeriods;
}
if (item.NeueRechnung.ServiceInvoicePeriods != null && item.NeueRechnung.ServiceInvoicePeriods.Count > 0)
{
if (diffRechnung.ServiceInvoicePeriods == null)
{
diffRechnung.ServiceInvoicePeriods = item.NeueRechnung.ServiceInvoicePeriods;
}
else
{
foreach (var NewSip in item.NeueRechnung.ServiceInvoicePeriods)
{
if (NewSip.InvoiceItems != null && NewSip.InvoiceItems.Count > 0)
{
if (NewSip.Customer != null && diffRechnung.ServiceInvoicePeriods.Any(s => s.Customer.CustomerOid == NewSip.Customer.CustomerOid) &&
NewSip.SupportConceptApprovalPeriod != null && NewSip.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.HasValue
&& diffRechnung.ServiceInvoicePeriods.Any(s => s.SupportConceptApprovalPeriod != null && s.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.HasValue
&& s.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value == NewSip.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value))
{
var ip = diffRechnung.ServiceInvoicePeriods.Where(s => s.SupportConceptApprovalPeriod != null && s.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value == NewSip.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value).First();
if (ip.InvoiceItems != null && ip.InvoiceItems.Count > 0)
{
ip.Claim += NewSip.Claim;
foreach (var ii in NewSip.InvoiceItems)
{
ip.InvoiceItems.Add(ii);
}
// Bei Rechnungspositionen mit negativem Betrag auf alte Rechnung verweisen
foreach (var iitem in ip.InvoiceItems)
{
if (iitem.AmountTotal < 0)
{
var vorhandeneRechnung = item.VorhandeneRechungen.FirstOrDefault(r => r.InvoiceBase != null && r.InvoiceBase.CustomerOid == ip.Customer.CustomerOid);
#endregion
if (vorhandeneRechnung != null)
iitem.ItemDescription = string.Format("{0} ({1:dd.MM.yyyy})", vorhandeneRechnung.InvoiceBase.InvoiceNumber, vorhandeneRechnung.InvoiceBase.InvoiceDate);
#region Standard
}
}
}
}
else
{
diffRechnung.ServiceInvoicePeriods.Add(NewSip);
}
}
}
}
}
#endregion
}
public override List<InvoiceBaseDC> GetInvoiceBases(DateTime? startDate, DateTime? endDate, bool filterByInvoiceDate)
{
DateTime? end = endDate;

View File

@@ -41,7 +41,6 @@ namespace PZDDuesseldorf
this.xrLabel19 = new DevExpress.XtraReports.UI.XRLabel();
this.xrLabel9 = new DevExpress.XtraReports.UI.XRLabel();
this.lblAbrechnungstext = new DevExpress.XtraReports.UI.XRLabel();
this.xrLabel1 = new DevExpress.XtraReports.UI.XRLabel();
this.xrLabel6 = new DevExpress.XtraReports.UI.XRLabel();
this.xrLabel8 = new DevExpress.XtraReports.UI.XRLabel();
this.xrTable1 = new DevExpress.XtraReports.UI.XRTable();
@@ -134,7 +133,6 @@ namespace PZDDuesseldorf
this.xrLabel19,
this.xrLabel9,
this.lblAbrechnungstext,
this.xrLabel1,
this.xrLabel6,
this.xrLabel8,
this.xrTable1,
@@ -179,20 +177,10 @@ namespace PZDDuesseldorf
this.lblAbrechnungstext.Multiline = true;
this.lblAbrechnungstext.Name = "lblAbrechnungstext";
this.lblAbrechnungstext.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.lblAbrechnungstext.SizeF = new System.Drawing.SizeF(530.5417F, 17F);
this.lblAbrechnungstext.SizeF = new System.Drawing.SizeF(641.9999F, 17F);
this.lblAbrechnungstext.StylePriority.UseFont = false;
this.lblAbrechnungstext.Text = "1 Stunden * 20,20 € = 20,20 €";
//
// xrLabel1
//
this.xrLabel1.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "InvoiceBase.InvoiceItems.GrossAmountTotal")});
this.xrLabel1.LocationFloat = new DevExpress.Utils.PointFloat(568.0007F, 404.9133F);
this.xrLabel1.Name = "xrLabel1";
this.xrLabel1.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.xrLabel1.SizeF = new System.Drawing.SizeF(100F, 23F);
this.xrLabel1.Text = "xrLabel1";
//
// xrLabel6
//
this.xrLabel6.LocationFloat = new DevExpress.Utils.PointFloat(0.000890096F, 333.2883F);
@@ -568,7 +556,7 @@ namespace PZDDuesseldorf
this.lblAdresse.Text = "[RecipientOrganisation]\r\n[RecipientContactPerson]\r\n[RecipientDivision]\r\n[Recipien" +
"tStreet]\r\n[RecipientPostCodeAndTown]";
//
// Rechnung
// RechnungAssistenz
//
this.Bands.AddRange(new DevExpress.XtraReports.UI.Band[] {
this.Detail,
@@ -635,7 +623,6 @@ namespace PZDDuesseldorf
private DevExpress.XtraReports.UI.XRTableRow xrTableRow24;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell31;
private DevExpress.XtraReports.UI.XRLabel xrLabel10;
private DevExpress.XtraReports.UI.XRLabel xrLabel1;
private DevExpress.XtraReports.UI.XRLabel xrLabel18;
private DevExpress.XtraReports.UI.XRLabel lblAbrechnungstext;
private DevExpress.XtraReports.UI.XRLabel xrLabel9;

View File

@@ -1,4 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BeWo.Data.Access;
using BeWo.Report;
@@ -28,7 +30,11 @@ namespace PZDDuesseldorf
decimal hourlyRateFk = 0;
decimal hoursFk = 0;
decimal amountFk = 0;
decimal hoursBereitsAbgerechnet = 0;
decimal amountBereitsAbgerechnet = 0;
List<string> invoicenumbersBereitsAbgerechnet = new List<string>();
bool fehlkontakt = false;
bool differenzrechnung = false;
if (pRO.ServiceInvoicePeriods != null && pRO.ServiceInvoicePeriods.Count > 0)
{
@@ -38,7 +44,24 @@ namespace PZDDuesseldorf
{
foreach (var i in p.ServiceInvoiceItems)
{
if (i.ServiceDescription.Contains("Fehlkontakt") && p.ServiceInvoiceItems.Count > 1)
if (i.NetAmount < 0)
{
differenzrechnung = true;
if (i.Hours.HasValue)
{
hoursBereitsAbgerechnet += i.Hours.Value;
}
if (i.NetAmount.HasValue)
{
amountBereitsAbgerechnet += i.NetAmount.Value;
}
if (i.ServiceDescription != null)
{
invoicenumbersBereitsAbgerechnet.Add(i.ServiceDescription);
}
}
else if (i.ServiceDescription.Contains("Fehlkontakt") && p.ServiceInvoiceItems.Count > 1)
{
fehlkontakt = true;
if (i.HourlyRate.HasValue)
@@ -74,16 +97,26 @@ namespace PZDDuesseldorf
}
}
lblAbrechnungstext.Text = "";
if (!String.IsNullOrEmpty(pRO.CustomerSalutation) && pRO.CustomerSalutation.ToLower() == "herr")
pRO.CustomerSalutation = "Herrn";
if (fehlkontakt)
{
lblAbrechnungstext.Text = String.Format("{0:0.##} Stunden x {1:c} = {2:c}", hours, hourlyRate, amount);
lblAbrechnungstext.Text += String.Format("{0:0.##} Stunden x {1:c} = {2:c}", hours, hourlyRate, amount);
lblAbrechnungstext.Text += String.Format("\n{0:0.##} Stunden Fehlkontakt x {1:c} = {2:c}", hoursFk, hourlyRateFk, amountFk);
}
else
{
lblAbrechnungstext.Text = String.Format("{0:0.##} Stunden x {1:c} = {2}", hours, hourlyRate, pRO.NetClaim);
lblAbrechnungstext.Text += String.Format("{0:0.##} Stunden x {1:c} = {2:c}", hours, hourlyRate, amount);
}
if (differenzrechnung)
{
string rechnungsnummern = string.Join(", ", invoicenumbersBereitsAbgerechnet);
lblAbrechnungstext.Text += String.Format("\nAbzüglich bereits abgerechneter Stunden in Rechnung {0}: {1:c}\n", rechnungsnummern, amountBereitsAbgerechnet);
lblAbrechnungstext.Text += String.Format("\nRestbetrag: {0}", pRO.NetClaim);
}
SetzeAdresse(pRO);