CreditNote: Add member modifier display

This commit is contained in:
2023-12-22 20:18:48 +01:00
parent c836b45920
commit 8368caf58a
6 changed files with 133 additions and 21 deletions

View File

@ -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;
""");
}
}
}

View File

@ -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();
}