Skip to content

Commit 7562e42

Browse files
committed
Feat: Properly print multiple Rechnungen
1 parent 862a525 commit 7562e42

8 files changed

Lines changed: 100 additions & 33 deletions

File tree

Deeplex.Saverwalter.BetriebskostenabrechnungService/Heizkostenberechnung.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ namespace Deeplex.Saverwalter.BetriebskostenabrechnungService
1919
{
2020
public sealed class Heizkostenberechnung
2121
{
22+
public int UmlageId { get; }
2223
public double GesamtBetrag { get; }
2324
public double PauschalBetrag { get; }
2425

@@ -50,6 +51,7 @@ public Heizkostenberechnung(
5051
Zeitraum zeitraum,
5152
List<Note> notes)
5253
{
54+
UmlageId = rechnung.Rechnung?.Umlage.UmlageId ?? 0;
5355
var lRechnung = rechnung.Rechnung;
5456
if (lRechnung == null)
5557
{

Deeplex.Saverwalter.BetriebskostenabrechnungService/Verbrauchanteil.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public VerbrauchAnteil(Umlage umlage, Wohnung wohnung, Zeitraum zeitraum, List<N
7676
{
7777
var verbrauchMieter = new Verbrauch(zaehler, zeitraum.Nutzungsbeginn, zeitraum.Nutzungsende, notes);
7878
DieseZaehler[unit].Add(verbrauchMieter);
79-
DieseVerbrauch[unit] += verbrauch.Delta;
79+
DieseVerbrauch[unit] += verbrauchMieter.Delta;
8080
}
8181
}
8282

Deeplex.Saverwalter.PrintService/DocxPrint.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,22 @@ DocumentFormat.OpenXml.Math.Fraction frac(string num, string den)
175175

176176
var p = new Paragraph(Font(), new Run(Font(), new Break(), new Text("Davon der Warmwasseranteil nach HeizkostenV §9(2):"), new Break(), new Break()));
177177

178+
List<int> umlageIds = [];
178179
foreach (var hk in abrechnungseinheit.Heizkostenberechnungen)
179180
{
180-
p.Append(new DocumentFormat.OpenXml.Math.Paragraph(justifyLeft(),
181-
new DocumentFormat.OpenXml.Math.OfficeMath(
182-
t("2,5 ×"), frac("V", "Q"), t(" × ("), tw(), t("-10°C)"), units(), t(" ⟹ "),
183-
t("2,5 ×"), frac(Utils.Unit(hk.V, "m³"), Utils.Unit(hk.Q, "kWh")), t(" × ("), t(Utils.Celsius((int)hk.tw)), t("-10°C)"), units(), t(" = "), t(Utils.Prozent(hk.Para9_2)))));
181+
if (hk.UmlageId == 0)
182+
{
183+
continue;
184+
}
185+
186+
if (!umlageIds.Contains(hk.UmlageId))
187+
{
188+
p.Append(new DocumentFormat.OpenXml.Math.Paragraph(justifyLeft(),
189+
new DocumentFormat.OpenXml.Math.OfficeMath(
190+
t("2,5 ×"), frac("V", "Q"), t(" × ("), tw(), t("-10°C)"), units(), t(" ⟹ "),
191+
t("2,5 ×"), frac(Utils.Unit(hk.V, "m³"), Utils.Unit(hk.Q, "kWh")), t(" × ("), t(Utils.Celsius((int)hk.tw)), t("-10°C)"), units(), t(" = "), t(Utils.Prozent(hk.Para9_2)))));
192+
umlageIds.Add(hk.UmlageId);
193+
}
184194
}
185195
p.Append(new Break(), new Break(),
186196
new Run(Font(), r("Wobei "), om("V"), r(" die Menge des Warmwassers, die im Abrechnungszeitraum gemessen wurde, "),

Deeplex.Saverwalter.PrintService/TPrint.cs

Lines changed: 73 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -700,7 +700,6 @@ private static void ErmittlungWarmeEinheiten(Betriebskostenabrechnung abrechnung
700700
underlined.Add(false);
701701

702702
var verbrauchAnteile = abrechnungseinheit.VerbrauchAnteile;
703-
// Kalte Betriebskosten are equal / warme are odd
704703
var warmeAnteile = verbrauchAnteile.Where(verbrauch => verbrauch.Umlage.HKVO != null);
705704
foreach (var verbrauchAnteil in warmeAnteile)
706705
{
@@ -737,6 +736,22 @@ private static void ErmittlungWarmeEinheiten(Betriebskostenabrechnung abrechnung
737736

738737
p.Table(widths, justification, bold.ToArray(), underlined.ToArray(), cols);
739738
}
739+
740+
private class WarmAnteilEntry
741+
{
742+
public double NFZeitanteil;
743+
public double HeizkostenVerbrauchAnteil;
744+
public double WarmwasserVerbrauchAnteil;
745+
public double WaermeAnteilNF;
746+
public double WaermeAnteilVerb;
747+
public double WarmwasserAnteilNF;
748+
public double WarmwasserAnteilVerb;
749+
public double Para9_2;
750+
public double Para7;
751+
public double Para8;
752+
public double PauschalBetrag;
753+
}
754+
740755
private static void ErmittlungWarmanteil(Betriebskostenabrechnung abrechnung, Abrechnungseinheit abrechnungseinheit, IPrint<T> p)
741756
{
742757
var widths = new int[] { 24, 13, 9, 14, 14, 13, 13 };
@@ -752,45 +767,81 @@ private static void ErmittlungWarmanteil(Betriebskostenabrechnung abrechnung, Ab
752767

753768
var wohnung = abrechnung.Vertrag.Wohnung;
754769

755-
foreach (var heizkostenberechnung in abrechnungseinheit.Heizkostenberechnungen)
770+
Dictionary<int, WarmAnteilEntry> warmAnteile = [];
771+
foreach (var r in abrechnungseinheit.Heizkostenberechnungen)
772+
{
773+
if (r.UmlageId == 0)
774+
{
775+
continue;
776+
}
777+
778+
if (!warmAnteile.ContainsKey(r.UmlageId))
779+
{
780+
warmAnteile[r.UmlageId] = new WarmAnteilEntry()
781+
{
782+
PauschalBetrag = r.PauschalBetrag,
783+
Para9_2 = r.Para9_2,
784+
Para7 = r.Para7,
785+
Para8 = r.Para8,
786+
NFZeitanteil = r.NFZeitanteil,
787+
HeizkostenVerbrauchAnteil = r.HeizkostenVerbrauchAnteil,
788+
WarmwasserVerbrauchAnteil = r.WarmwasserVerbrauchAnteil,
789+
WaermeAnteilNF = r.WaermeAnteilNF,
790+
WaermeAnteilVerb = r.WaermeAnteilVerb,
791+
WarmwasserAnteilNF = r.WarmwasserAnteilNF,
792+
WarmwasserAnteilVerb = r.WarmwasserAnteilVerb
793+
};
794+
}
795+
else
796+
{
797+
warmAnteile[r.UmlageId].PauschalBetrag += r.PauschalBetrag;
798+
warmAnteile[r.UmlageId].WaermeAnteilNF += r.WaermeAnteilNF;
799+
warmAnteile[r.UmlageId].WaermeAnteilVerb += r.WaermeAnteilVerb;
800+
warmAnteile[r.UmlageId].WarmwasserAnteilNF += r.WarmwasserAnteilNF;
801+
warmAnteile[r.UmlageId].WarmwasserAnteilVerb += r.WarmwasserAnteilVerb;
802+
}
803+
}
804+
805+
foreach (var warmAnteil in warmAnteile.Values)
756806
{
807+
757808
col1.Add("Heizung");
758809
col2.Add(Umlageschluessel.NachNutzflaeche.ToDescriptionString());
759-
col3.Add(Euro(heizkostenberechnung.PauschalBetrag));
760-
col4.Add(Prozent(1 - heizkostenberechnung.Para9_2));
761-
col5.Add(Prozent(1 - heizkostenberechnung.Para7));
762-
col6.Add(Prozent(heizkostenberechnung.NFZeitanteil));
763-
col7.Add(Euro(heizkostenberechnung.WaermeAnteilNF));
810+
col3.Add(Euro(warmAnteil.PauschalBetrag));
811+
col4.Add(Prozent(1 - warmAnteil.Para9_2));
812+
col5.Add(Prozent(1 - warmAnteil.Para7));
813+
col6.Add(Prozent(warmAnteil.NFZeitanteil));
814+
col7.Add(Euro(warmAnteil.WaermeAnteilNF));
764815
bold.Add(false);
765816
underlined.Add(true);
766817

767818
col1.Add("Heizung");
768819
col2.Add(Umlageschluessel.NachVerbrauch.ToDescriptionString());
769-
col3.Add(Euro(heizkostenberechnung.PauschalBetrag));
770-
col4.Add(Prozent(1 - heizkostenberechnung.Para9_2));
771-
col5.Add(Prozent(heizkostenberechnung.Para7));
772-
col6.Add(Prozent(heizkostenberechnung.HeizkostenVerbrauchAnteil));
773-
col7.Add(Euro(heizkostenberechnung.WaermeAnteilVerb));
820+
col3.Add(Euro(warmAnteil.PauschalBetrag));
821+
col4.Add(Prozent(1 - warmAnteil.Para9_2));
822+
col5.Add(Prozent(warmAnteil.Para7));
823+
col6.Add(Prozent(warmAnteil.HeizkostenVerbrauchAnteil));
824+
col7.Add(Euro(warmAnteil.WaermeAnteilVerb));
774825
bold.Add(false);
775826
underlined.Add(true);
776827

777828
col1.Add("Warmwasser");
778829
col2.Add(Umlageschluessel.NachNutzflaeche.ToDescriptionString());
779-
col3.Add(Euro(heizkostenberechnung.PauschalBetrag));
780-
col4.Add(Prozent(heizkostenberechnung.Para9_2));
781-
col5.Add(Prozent(heizkostenberechnung.Para8));
782-
col6.Add(Prozent(heizkostenberechnung.NFZeitanteil));
783-
col7.Add(Euro(heizkostenberechnung.WarmwasserAnteilNF));
830+
col3.Add(Euro(warmAnteil.PauschalBetrag));
831+
col4.Add(Prozent(warmAnteil.Para9_2));
832+
col5.Add(Prozent(warmAnteil.Para8));
833+
col6.Add(Prozent(warmAnteil.NFZeitanteil));
834+
col7.Add(Euro(warmAnteil.WarmwasserAnteilNF));
784835
bold.Add(false);
785836
underlined.Add(true);
786837

787838
col1.Add("Warmwasser");
788839
col2.Add(Umlageschluessel.NachVerbrauch.ToDescriptionString());
789-
col3.Add(Euro(heizkostenberechnung.PauschalBetrag));
790-
col4.Add(Prozent(heizkostenberechnung.Para9_2));
791-
col5.Add(Prozent(heizkostenberechnung.Para8));
792-
col6.Add(Prozent(heizkostenberechnung.WarmwasserVerbrauchAnteil));
793-
col7.Add(Euro(heizkostenberechnung.WarmwasserAnteilVerb));
840+
col3.Add(Euro(warmAnteil.PauschalBetrag));
841+
col4.Add(Prozent(warmAnteil.Para9_2));
842+
col5.Add(Prozent(warmAnteil.Para8));
843+
col6.Add(Prozent(warmAnteil.WarmwasserVerbrauchAnteil));
844+
col7.Add(Euro(warmAnteil.WarmwasserAnteilVerb));
794845
bold.Add(false);
795846
underlined.Add(true);
796847

Deeplex.Saverwalter.WebAPI/Controllers/Utils/BetriebskostenabrechnungController.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public VerbrauchAnteilEntry(VerbrauchAnteil anteil)
8888

8989
public class RechnungEntry
9090
{
91-
public int Id { get; }
91+
public int UmlageId { get; }
9292
public int RechnungId { get; }
9393
public string Typ { get; }
9494
public int TypId { get; }
@@ -101,7 +101,7 @@ public class RechnungEntry
101101

102102
public RechnungEntry(Umlage umlage, BetriebskostenrechnungEntry rechnung, Abrechnungseinheit einheit, int year)
103103
{
104-
Id = umlage.UmlageId;
104+
UmlageId = umlage.UmlageId;
105105
RechnungId = rechnung.Rechnung?.BetriebskostenrechnungId ?? 0;
106106
Typ = umlage.Typ.Bezeichnung;
107107
TypId = umlage.Typ.UmlagetypId;

Deeplex.Saverwalter.WebAPI/svelte/src/components/abrechnung/WalterAbrechnungGruppe.svelte

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,24 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
4848
betreffendesJahr: year,
4949
datum: convertDateCanadian(new Date()),
5050
typ: { id: `${rechnung.typId}`, text: rechnung.typ },
51-
umlage: { id: `${rechnung.id}`, text: rechnung.typ },
51+
umlage: { id: `${rechnung.umlageId}`, text: rechnung.typ },
5252
id: rechnung.rechnungId || undefined
5353
};
5454
5555
open = true;
5656
}
5757
5858
const rowsAdd = rows.map((row) => ({
59+
id: `${row.umlageId}-${row.rechnungId}`,
5960
...row,
6061
button: row.rechnungId ? 'disabled' : (e: CustomEvent) => add(e, row)
6162
}));
6263
6364
const on_click_row = (e: CustomEvent<DataTableRow>) => {
64-
goto_or_create_rechnung(e.detail as WalterRechnungEntry, year);
65+
goto_or_create_rechnung(
66+
e.detail as unknown as WalterRechnungEntry,
67+
year
68+
);
6569
};
6670
6771
let open = false;

Deeplex.Saverwalter.WebAPI/svelte/src/components/abrechnung/WalterAbrechnungGruppe.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export function goto_or_create_rechnung(
2525
} else {
2626
const searchParams = new URLSearchParams();
2727
searchParams.set('typ', `${punkt.typId}`);
28-
searchParams.set('umlage', `${punkt.id}`);
28+
searchParams.set('umlage', `${punkt.umlageId}`);
2929
searchParams.set('jahr', `${year}`);
3030
// TODO betrag
3131

Deeplex.Saverwalter.WebAPI/svelte/src/types/WalterBetriebskostenabrechnung.type.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ export type WalterPersonenZeitanteil = {
105105
};
106106

107107
export type WalterRechnungEntry = {
108-
id: number;
108+
umlageId: number;
109109
rechnungId: number;
110110
typ: string;
111111
typId: number;

0 commit comments

Comments
 (0)