CreditNote: Display under deliveries of area commitments
This commit is contained in:
@ -14,6 +14,7 @@ using Elwig.Models.Dtos;
|
||||
namespace Elwig.Helpers {
|
||||
|
||||
public record struct AreaComBucket(int Area, int Obligation, int Right);
|
||||
public record struct UnderDelivery(int Weight, int Diff);
|
||||
public record struct MemberBucket(string Name, int Area, int Obligation, int Right, int Delivery, int DeliveryStrict, int Payment);
|
||||
|
||||
public class AppDbContext : DbContext {
|
||||
@ -64,10 +65,11 @@ namespace Elwig.Helpers {
|
||||
|
||||
public static string ConnectionString => $"Data Source=\"{App.Config.DatabaseFile}\"; Foreign Keys=True; Mode=ReadWrite; Cache=Default";
|
||||
|
||||
private readonly Dictionary<int, Dictionary<int, Dictionary<string, AreaComBucket>>> _memberAreaCommitmentBuckets = new();
|
||||
private readonly Dictionary<int, Dictionary<int, Dictionary<string, int>>> _memberDeliveryBuckets = new();
|
||||
private readonly Dictionary<int, Dictionary<int, Dictionary<string, int>>> _memberDeliveryBucketsStrict = new();
|
||||
private readonly Dictionary<int, Dictionary<int, Dictionary<string, int>>> _memberPaymentBuckets = new();
|
||||
private readonly Dictionary<int, Dictionary<int, Dictionary<string, AreaComBucket>>> _memberAreaCommitmentBuckets = [];
|
||||
private readonly Dictionary<int, Dictionary<int, Dictionary<string, int>>> _memberDeliveryBuckets = [];
|
||||
private readonly Dictionary<int, Dictionary<int, Dictionary<string, int>>> _memberDeliveryBucketsStrict = [];
|
||||
private readonly Dictionary<int, Dictionary<int, Dictionary<string, int>>> _memberPaymentBuckets = [];
|
||||
private readonly Dictionary<int, Dictionary<int, Dictionary<string, UnderDelivery>>> _memberUnderDelivery = [];
|
||||
|
||||
public AppDbContext() {
|
||||
if (App.Config.DatabaseLog != null) {
|
||||
@ -217,7 +219,7 @@ namespace Elwig.Helpers {
|
||||
while (await reader.ReadAsync()) {
|
||||
var mgnr = reader.GetInt32(0);
|
||||
var vtrgid = reader.GetString(1);
|
||||
if (!buckets.ContainsKey(mgnr)) buckets[mgnr] = new();
|
||||
if (!buckets.ContainsKey(mgnr)) buckets[mgnr] = [];
|
||||
buckets[mgnr][vtrgid] = new(reader.GetInt32(2), reader.GetInt32(3), reader.GetInt32(4));
|
||||
}
|
||||
}
|
||||
@ -235,7 +237,7 @@ namespace Elwig.Helpers {
|
||||
while (await reader.ReadAsync()) {
|
||||
var mgnr = reader.GetInt32(0);
|
||||
var bucket = reader.GetString(1);
|
||||
if (!buckets.ContainsKey(mgnr)) buckets[mgnr] = new();
|
||||
if (!buckets.ContainsKey(mgnr)) buckets[mgnr] = [];
|
||||
buckets[mgnr][bucket] = reader.GetInt32(2);
|
||||
}
|
||||
}
|
||||
@ -253,7 +255,7 @@ namespace Elwig.Helpers {
|
||||
while (await reader.ReadAsync()) {
|
||||
var mgnr = reader.GetInt32(0);
|
||||
var bucket = reader.GetString(1);
|
||||
if (!buckets.ContainsKey(mgnr)) buckets[mgnr] = new();
|
||||
if (!buckets.ContainsKey(mgnr)) buckets[mgnr] = [];
|
||||
buckets[mgnr][bucket] = reader.GetInt32(2);
|
||||
}
|
||||
}
|
||||
@ -271,7 +273,7 @@ namespace Elwig.Helpers {
|
||||
while (await reader.ReadAsync()) {
|
||||
var mgnr = reader.GetInt32(0);
|
||||
var bucket = reader.GetString(1);
|
||||
if (!buckets.ContainsKey(mgnr)) buckets[mgnr] = new();
|
||||
if (!buckets.ContainsKey(mgnr)) buckets[mgnr] = [];
|
||||
buckets[mgnr][bucket] = reader.GetInt32(2);
|
||||
}
|
||||
}
|
||||
@ -279,28 +281,52 @@ namespace Elwig.Helpers {
|
||||
_memberPaymentBuckets[year] = buckets;
|
||||
}
|
||||
|
||||
private async Task FetchMemberUnderDelivery(int year, SqliteConnection? cnx = null) {
|
||||
var ownCnx = cnx == null;
|
||||
cnx ??= await ConnectAsync();
|
||||
var buckets = new Dictionary<int, Dictionary<string, UnderDelivery>>();
|
||||
using (var cmd = cnx.CreateCommand()) {
|
||||
cmd.CommandText = $"SELECT mgnr, bucket, weight, diff FROM v_under_delivery WHERE year = {year}";
|
||||
using var reader = await cmd.ExecuteReaderAsync();
|
||||
while (await reader.ReadAsync()) {
|
||||
var mgnr = reader.GetInt32(0);
|
||||
var bucket = reader.GetString(1);
|
||||
if (!buckets.ContainsKey(mgnr)) buckets[mgnr] = [];
|
||||
buckets[mgnr][bucket] = new(reader.GetInt32(2), reader.GetInt32(3));
|
||||
}
|
||||
}
|
||||
if (ownCnx) await cnx.DisposeAsync();
|
||||
_memberUnderDelivery[year] = buckets;
|
||||
}
|
||||
|
||||
public async Task<Dictionary<string, AreaComBucket>> GetMemberAreaCommitmentBuckets(int year, int mgnr, SqliteConnection? cnx = null) {
|
||||
if (!_memberAreaCommitmentBuckets.ContainsKey(year))
|
||||
await FetchMemberAreaCommitmentBuckets(year, cnx);
|
||||
return _memberAreaCommitmentBuckets[year].GetValueOrDefault(mgnr, new());
|
||||
return _memberAreaCommitmentBuckets[year].GetValueOrDefault(mgnr, []);
|
||||
}
|
||||
|
||||
public async Task<Dictionary<string, int>> GetMemberDeliveryBuckets(int year, int mgnr, SqliteConnection? cnx = null) {
|
||||
if (!_memberDeliveryBuckets.ContainsKey(year))
|
||||
await FetchMemberDeliveryBuckets(year, cnx);
|
||||
return _memberDeliveryBuckets[year].GetValueOrDefault(mgnr, new());
|
||||
return _memberDeliveryBuckets[year].GetValueOrDefault(mgnr, []);
|
||||
}
|
||||
|
||||
public async Task<Dictionary<string, int>> GetMemberDeliveryBucketsStrict(int year, int mgnr, SqliteConnection? cnx = null) {
|
||||
if (!_memberDeliveryBucketsStrict.ContainsKey(year))
|
||||
await FetchMemberDeliveryBucketsStrict(year, cnx);
|
||||
return _memberDeliveryBucketsStrict[year].GetValueOrDefault(mgnr, new());
|
||||
return _memberDeliveryBucketsStrict[year].GetValueOrDefault(mgnr, []);
|
||||
}
|
||||
|
||||
public async Task<Dictionary<string, int>> GetMemberPaymentBuckets(int year, int mgnr, SqliteConnection? cnx = null) {
|
||||
if (!_memberPaymentBuckets.ContainsKey(year))
|
||||
await FetchMemberPaymentBuckets(year, cnx);
|
||||
return _memberPaymentBuckets[year].GetValueOrDefault(mgnr, new());
|
||||
return _memberPaymentBuckets[year].GetValueOrDefault(mgnr, []);
|
||||
}
|
||||
|
||||
public async Task<Dictionary<string, UnderDelivery>> GetMemberUnderDelivery(int year, int mgnr, SqliteConnection? cnx = null) {
|
||||
if (!_memberUnderDelivery.ContainsKey(year))
|
||||
await FetchMemberUnderDelivery(year, cnx);
|
||||
return _memberUnderDelivery[year].GetValueOrDefault(mgnr, []);
|
||||
}
|
||||
|
||||
public async Task<Dictionary<string, MemberBucket>> GetMemberBuckets(int year, int mgnr, SqliteConnection? cnx = null) {
|
||||
|
@ -23,18 +23,17 @@ namespace Elwig.Helpers.Billing {
|
||||
await Revert();
|
||||
using var cnx = await AppDbContext.ConnectAsync();
|
||||
using (var cmd = cnx.CreateCommand()) {
|
||||
// TODO modifiers and prev_modifiers
|
||||
cmd.CommandText = $"""
|
||||
INSERT INTO credit (year, tgnr, mgnr, avnr, net_amount, prev_net_amount, vat, modifiers, prev_modifiers)
|
||||
SELECT s.year,
|
||||
COALESCE(t.tgnr, 0) + ROW_NUMBER() OVER(ORDER BY m.mgnr) AS tgnr,
|
||||
m.mgnr,
|
||||
v.avnr,
|
||||
ROUND(p.amount / POW(10, s.precision - 2)),
|
||||
ROUND(p.amount / POW(10, s.precision - 2)) AS net_amount,
|
||||
ROUND(lp.amount / POW(10, s.precision - 2)) AS prev_amount,
|
||||
IIF(m.buchführend, s.vat_normal, s.vat_flatrate) AS vat,
|
||||
NULL,
|
||||
NULL
|
||||
ROUND(COALESCE(u.total_penalty, 0) / POW(10, 4 - 2)) AS modifiers,
|
||||
lc.modifiers AS prev_modifiers
|
||||
FROM season s
|
||||
JOIN payment_variant v ON v.year = s.year
|
||||
LEFT JOIN payment_variant l ON l.year = s.year
|
||||
@ -48,6 +47,14 @@ namespace Elwig.Helpers.Billing {
|
||||
JOIN member m ON m.mgnr = d.mgnr
|
||||
LEFT JOIN payment_member lp ON (lp.year, lp.avnr, lp.mgnr) = (l.year, l.avnr, m.mgnr)
|
||||
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 (SELECT year, mgnr,
|
||||
SUM(COALESCE(IIF(u.weight = 0, -t.penalty_none, 0), 0) +
|
||||
COALESCE(IIF(u.diff < 0, -t.penalty_amount, 0), 0) +
|
||||
COALESCE(u.diff * t.penalty_per_kg, 0)) AS total_penalty
|
||||
FROM v_under_delivery u
|
||||
JOIN area_commitment_type t ON t.vtrgid = u.bucket
|
||||
GROUP BY year, mgnr) u ON (u.year, u.mgnr) = (s.year, m.mgnr)
|
||||
WHERE s.year = {Year} AND v.avnr = {AvNr}
|
||||
""";
|
||||
await cmd.ExecuteNonQueryAsync();
|
||||
|
Reference in New Issue
Block a user