Kleinunternehmer Mode

This commit is contained in:
Andre Beging
2024-11-21 15:28:04 +01:00
parent 1211b789bc
commit c21e1f0978
4 changed files with 103 additions and 18 deletions

View File

@@ -1,5 +1,6 @@
@page "/" @page "/"
@page "/invoices" @page "/invoices"
@using Server.Data
@using Server.Model @using Server.Model
@rendermode InteractiveServer @rendermode InteractiveServer
@@ -18,7 +19,18 @@
<p class="card-text"> <p class="card-text">
@invoice.Customer?.Name<br /> @invoice.Customer?.Name<br />
@invoice.Items.Count Artikel<br /> @invoice.Items.Count Artikel<br />
@($"{invoice.TotalNetto:N2} €") Netto<br /> @if (SettingsData.Instance.Kleinunternehmer)
{
@($"{invoice.TotalNetto:N2} €")<br />
}
else
{
<div>
@($"{invoice.TotalNetto:N2} €") Netto<br />
@($"{invoice.TotalBrutto:N2} €") Brutto<br />
</div>
}
</p> </p>
<a href="@($"edit/{invoice.InvoiceId}")" class="btn btn-sm btn-primary">Bearbeiten</a> <a href="@($"edit/{invoice.InvoiceId}")" class="btn btn-sm btn-primary">Bearbeiten</a>
<button class="btn btn-sm btn-info" @onclick="() => GenerateDocumentAsync(invoice)"><i class="fas fa-file-pdf"></i></button> <button class="btn btn-sm btn-info" @onclick="() => GenerateDocumentAsync(invoice)"><i class="fas fa-file-pdf"></i></button>

View File

@@ -1,4 +1,5 @@
@page "/edit/{InvoiceId}" @page "/edit/{InvoiceId}"
@using QuestPDF
@using Server.Data @using Server.Data
@using Server.Model @using Server.Model
@rendermode InteractiveServer @rendermode InteractiveServer
@@ -85,18 +86,21 @@
<InputNumber TValue="double" class="form-control" @bind-Value="@item.Quantity"></InputNumber> <InputNumber TValue="double" class="form-control" @bind-Value="@item.Quantity"></InputNumber>
</div> </div>
<div class="col-sm"> <div class="col-sm">
<label class="form-label mb-0">Price (Netto)</label> <label class="form-label mb-0">Price @(SettingsData.Instance.Kleinunternehmer ? string.Empty : "(Netto)")</label>
<InputNumber TValue="double" class="form-control" @bind-Value="@item.PriceNetto"></InputNumber> <InputNumber TValue="double" class="form-control" @bind-Value="@item.PriceNetto"></InputNumber>
</div> </div>
<div class="col-sm"> @if (!SettingsData.Instance.Kleinunternehmer)
<label class="form-label mb-0">Tax Type</label> {
<InputSelect @bind-Value="@item.TaxType" class="form-select"> <div class="col-sm">
@foreach (var taxType in Enum.GetValues(typeof(TaxType))) <label class="form-label mb-0">Tax Type</label>
{ <InputSelect @bind-Value="@item.TaxType" class="form-select">
<option value="@taxType">@taxType</option> @foreach (var taxType in Enum.GetValues(typeof(TaxType)))
} {
</InputSelect> <option value="@taxType">@taxType</option>
</div> }
</InputSelect>
</div>
}
</div> </div>
<div class="mb-1 mt-2"> <div class="mb-1 mt-2">

View File

@@ -1,5 +1,6 @@
using System.Globalization; using System.Globalization;
using System.Net.Mime; using System.Net.Mime;
using QuestPDF;
using QuestPDF.Drawing; using QuestPDF.Drawing;
using QuestPDF.Fluent; using QuestPDF.Fluent;
using QuestPDF.Helpers; using QuestPDF.Helpers;
@@ -39,7 +40,16 @@ namespace Server.Model
{ {
container.PaddingVertical(40).Column(outerColumn => container.PaddingVertical(40).Column(outerColumn =>
{ {
outerColumn.Item().Element(ComposeItemTable); if (SettingsData.Instance.Kleinunternehmer)
{
outerColumn.Item().Element(ComposeItemTableKleinunternehmer);
outerColumn.Item().PaddingTop(10).Text("Im Sinne der Kleinunternehmerregelung nach § 19 UStG. enthält der ausgewiesene Betrag keine Umsatzsteuer.");
}
else
{
outerColumn.Item().Element(ComposeItemTable);
}
outerColumn.Item().Row(row => outerColumn.Item().Row(row =>
{ {
@@ -49,10 +59,14 @@ namespace Server.Model
col.Item().PaddingTop(25).Element(ComposeComments); col.Item().PaddingTop(25).Element(ComposeComments);
}); });
row.AutoItem().Column(col => if (!SettingsData.Instance.Kleinunternehmer)
{ {
col.Item().Element(ComposeTaxTable); row.AutoItem().Column(col =>
}); {
col.Item().Element(ComposeTaxTable);
});
}
}); });
outerColumn.Spacing(5); outerColumn.Spacing(5);
@@ -122,6 +136,61 @@ namespace Server.Model
}); });
} }
private void ComposeItemTableKleinunternehmer(IContainer container)
{
container.Table(table =>
{
// Define columns
table.ColumnsDefinition(columns =>
{
columns.RelativeColumn(3); // Beschreibung
columns.ConstantColumn(20, Unit.Millimetre); // Menge
columns.ConstantColumn(24, Unit.Millimetre); // Einzelpreis
columns.ConstantColumn(24, Unit.Millimetre); // Gesamtpreis
});
// Describe header
table.Header(header =>
{
header.Cell().Element(CellStyle).Text("Beschreibung").SemiBold();
header.Cell().Element(CellStyle).AlignCenter().Text("Menge").SemiBold();
header.Cell().Element(CellStyle).AlignRight().Text("Einzelpreis").SemiBold();
header.Cell().Element(CellStyle).AlignRight().Text("Gesamtpreis").SemiBold();
static IContainer CellStyle(IContainer container)
{
return container.DefaultTextStyle(x => x.SemiBold()).BorderBottom(1).BorderColor(Colors.Black);
}
});
// Describe content
foreach (var item in Model.Items ?? [])
{
// Beschreibung
table.Cell().Element(CellStyle).Column(column =>
{
column.Item().Text(item.Name);
if(!string.IsNullOrWhiteSpace(item.Description))
column.Item().TextSmall(item.Description);
});
table.Cell().Element(CellStyle).AlignCenter().Text(txt => txt.Span($"{item.Quantity:N2}"));
// string as currency format
table.Cell().Element(CellStyle).AlignRight().Text($"{item.PriceNetto:N2} €");
table.Cell().Element(CellStyle).AlignRight().Text($"{item.PriceNetto * item.Quantity:N2} €");
}
table.Cell().ColumnSpan(3).Element(CellStyle).PaddingTop(10).Text("Rechnungsbetrag").Medium();
table.Cell().Element(CellStyle).PaddingTop(10).AlignRight().Text($"{Model.Items.Sum(x=> x.PriceNetto*x.Quantity):N2} €").Medium();
return;
static IContainer CellStyle(IContainer container) => container.BorderBottom(1).BorderColor(Colors.Grey.Lighten2).PaddingVertical(5);
});
}
private void ComposeItemTable(IContainer container) private void ComposeItemTable(IContainer container)
{ {
container.Table(table => container.Table(table =>
@@ -141,7 +210,6 @@ namespace Server.Model
// Describe header // Describe header
table.Header(header => table.Header(header =>
{ {
header.Cell().Text("").SemiBold(); header.Cell().Text("").SemiBold();
header.Cell().Text("").SemiBold(); header.Cell().Text("").SemiBold();
header.Cell().AlignRight().Text("Einzelpreis").SemiBold(); header.Cell().AlignRight().Text("Einzelpreis").SemiBold();
@@ -260,7 +328,7 @@ namespace Server.Model
row.RelativeItem().AlignMiddle().PaddingRight(10, Unit.Millimetre).Background(Colors.Red.Medium).Column(col => row.RelativeItem().AlignMiddle().PaddingRight(10, Unit.Millimetre).Background(Colors.Red.Medium).Column(col =>
{ {
col.Item().AlignRight().Text("www.example.com"); //col.Item().AlignRight().Text("www.example.com");
}); });
}); });

View File

@@ -16,6 +16,7 @@
public PaymentData? PaymentData { get; set; } public PaymentData? PaymentData { get; set; }
public double TotalNetto => Items?.Sum(x => x.PriceNetto*x.Quantity) ?? 0d; public double TotalNetto => Items?.Sum(x => x.PriceNetto*x.Quantity) ?? 0d;
public double TotalBrutto => Items?.Sum(x => x.PriceBrutto*x.Quantity) ?? 0d;
} }
public class PaymentData public class PaymentData