[#47] Billing: Add penalty per business share
All checks were successful
Test / Run tests (push) Successful in 2m2s

This commit is contained in:
2024-06-08 16:01:28 +02:00
parent f756220d75
commit 302870fb58
11 changed files with 117 additions and 30 deletions

View File

@ -354,6 +354,27 @@ namespace Elwig.Helpers {
_memberUnderDelivery[year] = buckets;
}
public async Task<Dictionary<int, long>> GetBusinessSharePenalties(int year) {
using var cnx = await ConnectAsync();
var dict = new Dictionary<int, long>();
using var cmd = cnx.CreateCommand();
cmd.CommandText = $"""
SELECT mgnr, ROUND((
COALESCE(-s.penalty_amount, 0) +
COALESCE(-s.penalty_per_bs_amount * CEIL(CAST(-u.diff AS REAL) / s.min_kg_per_bs), 0) +
COALESCE(u.diff * s.penalty_per_kg, 0)
) / POW(10, s.precision - 2))
FROM v_total_under_delivery u
JOIN season s ON s.year = u.year
WHERE s.year = {year} AND u.diff < 0
""";
using var reader = await cmd.ExecuteReaderAsync();
while (await reader.ReadAsync()) {
dict[reader.GetInt32(0)] = reader.GetInt64(1);
}
return dict;
}
public async Task<Dictionary<string, AreaComBucket>> GetMemberAreaCommitmentBuckets(int year, int mgnr, SqliteConnection? cnx = null) {
if (!_memberAreaCommitmentBuckets.ContainsKey(year))
await FetchMemberAreaCommitmentBuckets(year, cnx);

View File

@ -9,7 +9,7 @@ namespace Elwig.Helpers {
public static class AppDbUpdater {
// Don't forget to update value in Tests/fetch-resources.bat!
public static readonly int RequiredSchemaVersion = 19;
public static readonly int RequiredSchemaVersion = 20;
private static int VersionOffset = 0;

View File

@ -47,7 +47,6 @@ namespace Elwig.Helpers.Billing {
ROUND(lp.amount / POW(10, s.precision - 2)) AS prev_amount,
IIF(m.buchführend, s.vat_normal, s.vat_flatrate) AS vat,
ROUND(IIF({Data.ConsiderContractPenalties}, COALESCE(u.total_penalty, 0), 0) / POW(10, 4 - 2)) +
ROUND(IIF({Data.ConsiderTotalPenalty}, COALESCE(b.total_penalty, 0), 0) / POW(10, s.precision - 2)) +
ROUND(IIF({Data.ConsiderAutoBusinessShares}, -COALESCE(a.total_amount, 0), 0) / POW(10, s.precision - 2))
AS modifiers,
lc.modifiers AS prev_modifiers
@ -66,12 +65,30 @@ namespace Elwig.Helpers.Billing {
LEFT JOIN payment_member p ON (p.year, p.avnr, p.mgnr) = (v.year, v.avnr, m.mgnr)
LEFT JOIN credit lc ON (lc.year, lc.avnr, lc.mgnr) = (l.year, l.avnr, m.mgnr)
LEFT JOIN v_penalty_area_commitments u ON (u.year, u.mgnr) = (s.year, m.mgnr)
LEFT JOIN v_penalty_business_shares b ON (b.year, b.mgnr) = (s.year, m.mgnr)
LEFT JOIN v_auto_business_shares a ON (a.year, a.mgnr) = (s.year, m.mgnr)
WHERE s.year = {Year} AND v.avnr = {AvNr};
UPDATE payment_variant SET test_variant = FALSE WHERE (year, avnr) = ({Year}, {AvNr});
""");
if (Data.ConsiderTotalPenalty) {
if (App.Client.IsWinzerkeller) {
// TODO
} else {
await AppDbContext.ExecuteBatch(cnx, $"""
UPDATE credit AS c
SET modifiers = modifiers + ROUND((
COALESCE(-s.penalty_amount, 0) +
COALESCE(-s.penalty_per_bs_amount * CEIL(CAST(-u.diff AS REAL) / s.min_kg_per_bs), 0) +
COALESCE(u.diff * s.penalty_per_kg, 0)
) / POW(10, s.precision - 2))
FROM v_total_under_delivery u
JOIN season s ON s.year = u.year
WHERE c.year = {Year} AND c.avnr = {AvNr} AND (u.year, u.mgnr) = (c.year, c.mgnr) AND
u.diff < 0
""");
}
}
await AppDbContext.ExecuteBatch(cnx, $"""
UPDATE payment_variant SET test_variant = FALSE WHERE (year, avnr) = ({Year}, {AvNr});
""");
}
public async Task Revert() {