Compare commits
2 Commits
b9a2893d80
...
8368caf58a
| Author | SHA1 | Date | |
|---|---|---|---|
| 8368caf58a | |||
| c836b45920 |
@@ -74,7 +74,7 @@ namespace Elwig.Documents {
|
||||
);
|
||||
var totalDict = buckets.GroupBy(b => b.Key[2..]).ToDictionary(g => g.Key, g => g.Sum(a => a.Value.DeliveryStrict));
|
||||
var totals = attributes.Select(a => totalDict.TryGetValue(a, out int value) ? value : 0);
|
||||
tbl += "<tr class=\"sum\"><td></td>" + string.Join("", totals.Select(v => $"<td class=\"number\">{v:N0}</td>")) +
|
||||
tbl += "<tr class=\"sum bold\"><td></td>" + string.Join("", totals.Select(v => $"<td class=\"number\">{v:N0}</td>")) +
|
||||
$"<td class=\"number\">{totalDict.Values.Sum():N0}</td></tr>";
|
||||
|
||||
return "<table class=\"sortenaufteilung small number cohere\">" + tbl + "</table>";
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Elwig.Helpers;
|
||||
using Elwig.Models.Dtos;
|
||||
using Elwig.Models.Entities;
|
||||
using System.Linq;
|
||||
|
||||
namespace Elwig.Documents {
|
||||
public class CreditNote : BusinessDocument {
|
||||
@@ -11,6 +12,7 @@ namespace Elwig.Documents {
|
||||
public string? Text;
|
||||
public string CurrencySymbol;
|
||||
public int Precision;
|
||||
public string MemberModifier;
|
||||
|
||||
public CreditNote(AppDbContext ctx, PaymentMember p, CreditNoteData data) :
|
||||
base($"Traubengutschrift {(p.Credit != null ? $"Nr. {p.Credit.Year}/{p.Credit.TgNr}" : p.Member.Name)} – {p.Variant.Name}", p.Member) {
|
||||
@@ -19,6 +21,13 @@ namespace Elwig.Documents {
|
||||
Data = data;
|
||||
Payment = p;
|
||||
Credit = p.Credit;
|
||||
var season = p.Variant.Season;
|
||||
var mod = App.Client.IsMatzen ? ctx.Modifiers.Where(m => m.Year == season.Year && m.Name.StartsWith("Treue")).FirstOrDefault() : null;
|
||||
if (mod != null) {
|
||||
MemberModifier = $"{mod.Name} ({mod.ValueStr})";
|
||||
} else {
|
||||
MemberModifier = "Sonstige Zu-/Abschläge";
|
||||
}
|
||||
Aside = Aside.Replace("</table>", "") +
|
||||
$"<thead><tr><th colspan='2'>Gutschrift</th></tr></thead><tbody>" +
|
||||
$"<tr><th>TG-Nr.</th><td>{(p.Credit != null ? $"{p.Credit.Year}/{p.Credit.TgNr}" : "-")}</td></tr>" +
|
||||
@@ -27,7 +36,7 @@ namespace Elwig.Documents {
|
||||
$"</tbody></table>";
|
||||
Text = App.Client.TextDeliveryNote;
|
||||
DocumentId = $"Tr.-Gutschr. " + (p.Credit != null ? $"{p.Credit.Year}/{p.Credit.TgNr}" : p.MgNr);
|
||||
CurrencySymbol = p.Variant.Season.Currency.Symbol ?? p.Variant.Season.Currency.Code;
|
||||
Precision = p.Variant.Season.Precision;
|
||||
CurrencySymbol = season.Currency.Symbol ?? season.Currency.Code;
|
||||
Precision = season.Precision;
|
||||
}
|
||||
}}
|
||||
|
||||
@@ -80,17 +80,69 @@
|
||||
}
|
||||
}
|
||||
@if (Model.Payment == null) {
|
||||
<tr class="sum">
|
||||
<td colspan="7"></td>
|
||||
<td colspan="2">Gesamt:</td>
|
||||
<td colspan="2" class="number">@($"{Model.Data.Rows.Sum(p => p.Amount):N2}")</td>
|
||||
</tr>
|
||||
<tr class="sum">
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4">Gesamt:</td>
|
||||
<td></td>
|
||||
<td colspan="2" class="number">
|
||||
<span class="fleft">@Model.CurrencySymbol</span>
|
||||
@($"{Model.Data.Rows.Sum(p => p.Amount):N2}")
|
||||
</td>
|
||||
</tr>
|
||||
} else {
|
||||
<tr class="sum">
|
||||
<td colspan="7"></td>
|
||||
<td colspan="2">Gesamt:</td>
|
||||
<td colspan="2" class="number">@($"{Model.Payment.NetAmount:N2}")</td>
|
||||
</tr>
|
||||
var totalLine = false;
|
||||
if (Model.Payment.NetAmount != Model.Payment.Amount) {
|
||||
<tr class="sum">
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4">Zwischensumme:</td>
|
||||
<td></td>
|
||||
<td colspan="2" class="number">
|
||||
<span class="fleft">@Model.CurrencySymbol</span>
|
||||
@($"{Model.Payment.NetAmount:N2}")
|
||||
</td>
|
||||
</tr>
|
||||
totalLine = true;
|
||||
<tr>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4">@Model.MemberModifier:</td>
|
||||
<td class="number large">@(Model.Payment.NetAmount > Model.Payment.Amount ? "–" : "+")</td>
|
||||
<td colspan="2" class="number large">
|
||||
<span class="fleft">@Model.CurrencySymbol</span>
|
||||
@($"{Math.Abs(Model.Payment.Amount - Model.Payment.NetAmount):N2}")
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
if (Model.Credit == null) {
|
||||
<tr class="bold large @(!totalLine ? "sum" : "")">
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4" class="@(totalLine ? "sum" : "")">Gesamtbetrag:</td>
|
||||
<td class="@(totalLine ? "sum" : "")"></td>
|
||||
<td colspan="2" class="number @(totalLine ? "sum" : "")">
|
||||
<span class="fleft">@Model.CurrencySymbol</span>
|
||||
@($"{Model.Payment.Amount:N2}")
|
||||
</td>
|
||||
</tr>
|
||||
totalLine = true;
|
||||
} else {
|
||||
<tr class="bold large @(!totalLine ? "sum" : "")">
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4" class="@(totalLine ? "sum" : "")">Nettobetrag:</td>
|
||||
<td class="@(totalLine ? "sum" : "")"></td>
|
||||
<td colspan="2" class="number @(totalLine ? "sum" : "")">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
totalLine = true;
|
||||
|
||||
<tr class="large bold">
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4">Bruttobetrag:</td>
|
||||
<td></td>
|
||||
<td colspan="2" class="number">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -17,10 +17,11 @@ table.credit tr.last td {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
table.credit tr.sum {
|
||||
table.credit .sum {
|
||||
font-size: 12pt;
|
||||
}
|
||||
|
||||
table.credit tr.sum td {
|
||||
padding-top: 1mm;
|
||||
table.credit tr.sum td,
|
||||
table.credit td.sum {
|
||||
padding-top: 1mm !important;
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
lastVariant = p.Variant;
|
||||
}
|
||||
}
|
||||
<tr class="sum">
|
||||
<tr class="sum bold">
|
||||
<td colspan="8">Gesamt:</td>
|
||||
<td colspan="2" class="number">@($"{Model.Data.Rows.Sum(p => p.Weight):N0}")</td>
|
||||
<td></td>
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
<td class="number">@($"{p.Weight:N0}")</td>
|
||||
</tr>
|
||||
}
|
||||
<tr class="sum">
|
||||
<tr class="sum bold">
|
||||
@{
|
||||
var kmw = Elwig.Helpers.Utils.AggregateDeliveryPartsKmw(Model.Deliveries);
|
||||
var oe = Elwig.Helpers.Utils.KmwToOe(kmw);
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
}
|
||||
}
|
||||
@if (Model.Delivery.Parts.Count() > 1) {
|
||||
<tr class="main sum">
|
||||
<tr class="main sum bold">
|
||||
<td colspan="6">Gesamt:</td>
|
||||
<td class="center">@($"{Model.Delivery.Oe:N0}")</td>
|
||||
<td class="center">@($"{Model.Delivery.Kmw:N1}")</td>
|
||||
|
||||
@@ -117,16 +117,19 @@ main table.number thead tr:first-child th:first-child {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
main table tr.sum td {
|
||||
main table tr.bold td {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
main table tr.sum,
|
||||
main table td.sum,
|
||||
main table tr.new,
|
||||
main table tr.border {
|
||||
border-top: 0.5pt solid black;
|
||||
}
|
||||
main table tr.sum {
|
||||
|
||||
main table tr.sum,
|
||||
main table td.sum {
|
||||
break-before: avoid;
|
||||
}
|
||||
|
||||
@@ -145,3 +148,7 @@ main table th.narrow {
|
||||
|
||||
main table .lborder {border-left: 0.5pt solid black;}
|
||||
main table .rborder {border-right: 0.5pt solid black;}
|
||||
|
||||
main table .fleft {
|
||||
float: left;
|
||||
}
|
||||
|
||||
@@ -202,7 +202,7 @@
|
||||
lastContract = contractType.AreaComType.DisplayName;
|
||||
}
|
||||
}
|
||||
<tr class="sum">
|
||||
<tr class="sum bold">
|
||||
<td colspan="3">Gesamt:</td>
|
||||
<td class="number">@($"{Model.Member.ActiveAreaCommitments.Select(a => a.Area).Sum():N0}")</td>
|
||||
<td colspan="2"></td>
|
||||
|
||||
@@ -4,14 +4,14 @@ using System;
|
||||
namespace Elwig.Helpers {
|
||||
public static class AppDbUpdater {
|
||||
|
||||
public static readonly int RequiredSchemaVersion = 11;
|
||||
public static readonly int RequiredSchemaVersion = 12;
|
||||
|
||||
private static int _versionOffset = 0;
|
||||
private static readonly Action<SqliteConnection>[] _updaters = new[] {
|
||||
private static readonly Action<SqliteConnection>[] _updaters = [
|
||||
UpdateDbSchema_1_To_2, UpdateDbSchema_2_To_3, UpdateDbSchema_3_To_4, UpdateDbSchema_4_To_5,
|
||||
UpdateDbSchema_5_To_6, UpdateDBSchema_6_To_7, UpdateDbSchema_7_To_8, UpdateDbSchema_8_To_9,
|
||||
UpdateDbSchema_9_To_10, UpdateDbSchema_10_To_11
|
||||
};
|
||||
UpdateDbSchema_9_To_10, UpdateDbSchema_10_To_11, UpdateDbSchema_11_To_12,
|
||||
];
|
||||
|
||||
private static void ExecuteNonQuery(SqliteConnection cnx, string sql) {
|
||||
using var cmd = cnx.CreateCommand();
|
||||
@@ -800,5 +800,19 @@ namespace Elwig.Helpers {
|
||||
ExecuteNonQuery(cnx, "ALTER TABLE payment_member DROP COLUMN amount");
|
||||
ExecuteNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_abs)) VIRTUAL");
|
||||
}
|
||||
|
||||
private static void UpdateDbSchema_11_To_12(SqliteConnection cnx) {
|
||||
ExecuteNonQuery(cnx, """
|
||||
CREATE VIEW v_stat_member AS
|
||||
SELECT year, mgnr,
|
||||
SUM(weight) AS sum,
|
||||
ROUND(SUM(kmw * weight) / SUM(weight), 2) AS kmw,
|
||||
ROUND(SUM(oe * weight) / SUM(weight), 1) AS oe,
|
||||
COUNT(DISTINCT did) AS lieferungen
|
||||
FROM v_delivery
|
||||
GROUP BY year, mgnr
|
||||
ORDER BY year, mgnr;
|
||||
""");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ namespace Elwig.Helpers.Billing {
|
||||
await DeleteInDb();
|
||||
await CalculatePrices();
|
||||
await CalculateModifiers();
|
||||
await CalculateMemberModifiers();
|
||||
}
|
||||
|
||||
protected async Task DeleteInDb() {
|
||||
@@ -33,6 +34,36 @@ namespace Elwig.Helpers.Billing {
|
||||
}
|
||||
}
|
||||
|
||||
protected async Task CalculateMemberModifiers() {
|
||||
using var cnx = await AppDbContext.ConnectAsync();
|
||||
if (App.Client.IsMatzen) {
|
||||
var lastYears = 3;
|
||||
var multiplier = 0.50;
|
||||
var modName = "Treue%";
|
||||
using var cmd = cnx.CreateCommand();
|
||||
cmd.CommandText = $"""
|
||||
INSERT INTO payment_member (year, avnr, mgnr, net_amount, mod_abs, mod_rel)
|
||||
SELECT c.year, {AvNr}, s.mgnr, 0,
|
||||
ROUND(s.sum * COALESCE(m.abs, 0)),
|
||||
COALESCE(m.rel, 0)
|
||||
FROM (SELECT {Year} AS year, mgnr,
|
||||
ROUND(AVG(sum) * {multiplier}) AS baseline,
|
||||
COUNT(*) = {lastYears} AND MIN(sum) > 0 AS allowed
|
||||
FROM v_stat_member
|
||||
WHERE year > {Year} - {lastYears}
|
||||
GROUP BY mgnr
|
||||
HAVING allowed) c
|
||||
JOIN v_stat_member s ON (s.year, s.mgnr) = (c.year, c.mgnr)
|
||||
LEFT JOIN modifier m ON m.year = c.year AND m.name LIKE '{modName}'
|
||||
WHERE sum >= baseline
|
||||
ON CONFLICT DO UPDATE
|
||||
SET mod_abs = mod_abs + excluded.mod_abs,
|
||||
mod_rel = mod_rel + excluded.mod_rel
|
||||
""";
|
||||
await cmd.ExecuteNonQueryAsync();
|
||||
}
|
||||
}
|
||||
|
||||
protected async Task CalculatePrices() {
|
||||
using var cnx = await AppDbContext.ConnectAsync();
|
||||
|
||||
@@ -81,7 +112,9 @@ namespace Elwig.Helpers.Billing {
|
||||
LEFT JOIN delivery_part_modifier p ON (p.year, p.did, p.dpnr) = (d.year, d.did, d.dpnr)
|
||||
LEFT JOIN modifier m ON m.modid = p.modid
|
||||
WHERE d.year = {Year}
|
||||
ON CONFLICT DO UPDATE SET mod_abs = mod_abs + excluded.mod_abs, mod_rel = mod_rel + excluded.mod_rel;
|
||||
ON CONFLICT DO UPDATE
|
||||
SET mod_abs = mod_abs + excluded.mod_abs,
|
||||
mod_rel = mod_rel + excluded.mod_rel
|
||||
""";
|
||||
await cmd.ExecuteNonQueryAsync();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user