[#48] Dtos/CreditNoteData: Include custom member modifiers
All checks were successful
Test / Run tests (push) Successful in 2m28s

This commit is contained in:
2024-06-28 13:05:08 +02:00
parent 5037818997
commit 91c60018f1
3 changed files with 21 additions and 31 deletions

View File

@ -355,27 +355,6 @@ namespace Elwig.Helpers {
_memberUnderDelivery[year] = buckets; _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) { public async Task<Dictionary<string, AreaComBucket>> GetMemberAreaCommitmentBuckets(int year, int mgnr, SqliteConnection? cnx = null) {
if (!_memberAreaCommitmentBuckets.ContainsKey(year)) if (!_memberAreaCommitmentBuckets.ContainsKey(year))
await FetchMemberAreaCommitmentBuckets(year, cnx); await FetchMemberAreaCommitmentBuckets(year, cnx);

View File

@ -30,6 +30,7 @@ namespace Elwig.Models.Dtos {
("Penalties", "Pönalen FB", "€", 20), ("Penalties", "Pönalen FB", "€", 20),
("Penalty", "Unterl. GA", "€", 20), ("Penalty", "Unterl. GA", "€", 20),
("AutoBs", "GA Nachz.", "€", 20), ("AutoBs", "GA Nachz.", "€", 20),
("Custom", "Weitere", "€", 20),
("Others", "Sonstige", "€", 20), ("Others", "Sonstige", "€", 20),
("Considered", "Berückstgt.", "€", 20), ("Considered", "Berückstgt.", "€", 20),
("Amount", "Betrag", "€", 20), ("Amount", "Betrag", "€", 20),
@ -42,9 +43,8 @@ namespace Elwig.Models.Dtos {
public static async Task<CreditNoteData> ForPaymentVariant(AppDbContext ctx, int year, int avnr) { public static async Task<CreditNoteData> ForPaymentVariant(AppDbContext ctx, int year, int avnr) {
var variant = await ctx.PaymentVariants.FindAsync(year, avnr); var variant = await ctx.PaymentVariants.FindAsync(year, avnr);
var name = variant!.Name; var name = variant!.Name;
var bsPenalty = await ctx.GetBusinessSharePenalties(year);
var data = BillingData.FromJson(variant!.Data); var data = BillingData.FromJson(variant!.Data);
var rows = (await FromDbSet(ctx.CreditNoteRows, year, avnr)).Select(r => new CreditNoteRow(r, data, bsPenalty)).ToList(); var rows = (await FromDbSet(ctx.CreditNoteRows, year, avnr)).Select(r => new CreditNoteRow(r, data)).ToList();
return new CreditNoteData(rows, year, name); return new CreditNoteData(rows, year, name);
} }
@ -56,16 +56,20 @@ namespace Elwig.Models.Dtos {
p.plz, o.name AS ort, m.address, m.iban, c.tgnr, s.year, s.precision, p.plz, o.name AS ort, m.address, m.iban, c.tgnr, s.year, s.precision,
p.amount - p.net_amount AS surcharge, p.amount - p.net_amount AS surcharge,
c.net_amount, c.prev_net_amount, c.vat, c.vat_amount, c.gross_amount, c.modifiers, c.prev_modifiers, c.amount, c.net_amount, c.prev_net_amount, c.vat, c.vat_amount, c.gross_amount, c.modifiers, c.prev_modifiers, c.amount,
ROUND(COALESCE(u.total_penalty, 0) / POW(10, 4 - 2)) AS fb_penalty, ROUND(b.total_penalty / POW(10, s.precision - 2)) AS bs_penalty,
ROUND(COALESCE(a.total_amount, 0) / POW(10, s.precision - 2)) AS auto_bs ROUND(u.total_penalty / POW(10, 4 - 2)) AS fb_penalty,
ROUND(-a.total_amount / POW(10, s.precision - 2)) AS auto_bs,
x.amount AS custom_mod
FROM credit c FROM credit c
LEFT JOIN member m ON m.mgnr = c.mgnr LEFT JOIN member m ON m.mgnr = c.mgnr
LEFT JOIN payment_member p ON (p.year, p.avnr, p.mgnr) = (c.year, c.avnr, c.mgnr) LEFT JOIN payment_member p ON (p.year, p.avnr, p.mgnr) = (c.year, c.avnr, c.mgnr)
LEFT JOIN AT_plz_dest p ON p.id = m.postal_dest LEFT JOIN AT_plz_dest p ON p.id = m.postal_dest
LEFT JOIN AT_ort o ON o.okz = p.okz LEFT JOIN AT_ort o ON o.okz = p.okz
LEFT JOIN season s ON s.year = c.year LEFT JOIN season s ON s.year = c.year
LEFT JOIN v_penalty_business_shares b ON (b.year, b.mgnr) = (s.year, m.mgnr)
LEFT JOIN v_penalty_area_commitments u ON (u.year, u.mgnr) = (s.year, m.mgnr) LEFT JOIN v_penalty_area_commitments u ON (u.year, u.mgnr) = (s.year, m.mgnr)
LEFT JOIN v_auto_business_shares a ON (a.year, a.mgnr) = (s.year, m.mgnr) LEFT JOIN v_auto_business_shares a ON (a.year, a.mgnr) = (s.year, m.mgnr)
LEFT JOIN payment_custom x ON (x.year, x.mgnr) = (s.year, m.mgnr)
WHERE c.year = {year} AND c.avnr = {avnr} WHERE c.year = {year} AND c.avnr = {avnr}
ORDER BY m.mgnr ORDER BY m.mgnr
""").ToListAsync(); """).ToListAsync();
@ -91,11 +95,12 @@ namespace Elwig.Models.Dtos {
public decimal? Penalties; public decimal? Penalties;
public decimal? Penalty; public decimal? Penalty;
public decimal? AutoBs; public decimal? AutoBs;
public decimal? Custom;
public decimal? Others; public decimal? Others;
public decimal? Considered; public decimal? Considered;
public decimal Amount; public decimal Amount;
public CreditNoteRow(CreditNoteRowSingle row, BillingData data, Dictionary<int, long> bsPenalty) { public CreditNoteRow(CreditNoteRowSingle row, BillingData data) {
byte prec1 = 2, prec2 = row.Precision; byte prec1 = 2, prec2 = row.Precision;
MgNr = row.MgNr; MgNr = row.MgNr;
Name1 = row.Name1; Name1 = row.Name1;
@ -117,12 +122,14 @@ namespace Elwig.Models.Dtos {
} }
decimal mod = (row.Modifiers == null) ? 0 : Utils.DecFromDb((long)row.Modifiers, prec1); decimal mod = (row.Modifiers == null) ? 0 : Utils.DecFromDb((long)row.Modifiers, prec1);
if (data.ConsiderContractPenalties) if (data.ConsiderContractPenalties)
Penalties = (row.FbPenalty == null || row.FbPenalty == 0) ? null : Utils.DecFromDb((long)row.FbPenalty, prec1); Penalties = (row.FbPenalty == null) ? null : Utils.DecFromDb((long)row.FbPenalty, prec1);
if (data.ConsiderTotalPenalty) if (data.ConsiderTotalPenalty)
Penalty = (!bsPenalty.TryGetValue(row.MgNr, out var val) || val == 0) ? null : Utils.DecFromDb(val, prec1); Penalty = (row.BsPenalty == null) ? null : Utils.DecFromDb((long)row.BsPenalty, prec1);
if (data.ConsiderAutoBusinessShares) if (data.ConsiderAutoBusinessShares)
AutoBs = (row.AutoBs == null || row.AutoBs == 0) ? null : -Utils.DecFromDb((long)row.AutoBs, prec1); AutoBs = (row.AutoBs == null) ? null : Utils.DecFromDb((long)row.AutoBs, prec1);
mod -= (Penalties ?? 0) + (Penalty ?? 0) + (AutoBs ?? 0); if (data.ConsiderCustomModifiers)
Custom = (row.CustomMod == null) ? null : Utils.DecFromDb((long)row.CustomMod, prec1);
mod -= (Penalties ?? 0) + (Penalty ?? 0) + (AutoBs ?? 0) + (Custom ?? 0);
Others = (mod == 0) ? null : mod; Others = (mod == 0) ? null : mod;
Gross = Utils.DecFromDb(row.GrossAmount, prec1); Gross = Utils.DecFromDb(row.GrossAmount, prec1);
Considered = (row.PrevModifiers == null || row.PrevModifiers == 0) ? null : -Utils.DecFromDb((long)row.PrevModifiers, prec1); Considered = (row.PrevModifiers == null || row.PrevModifiers == 0) ? null : -Utils.DecFromDb((long)row.PrevModifiers, prec1);
@ -172,9 +179,13 @@ namespace Elwig.Models.Dtos {
public long? PrevModifiers { get; set; } public long? PrevModifiers { get; set; }
[Column("amount")] [Column("amount")]
public long Amount { get; set; } public long Amount { get; set; }
[Column("bs_penalty")]
public long? BsPenalty { get; set; }
[Column("fb_penalty")] [Column("fb_penalty")]
public long? FbPenalty { get; set; } public long? FbPenalty { get; set; }
[Column("auto_bs")] [Column("auto_bs")]
public long? AutoBs { get; set; } public long? AutoBs { get; set; }
[Column("custom_mod")]
public long? CustomMod { get; set; }
} }
} }

View File

@ -118,7 +118,7 @@
</Style> </Style>
</DataGridTextColumn.CellStyle> </DataGridTextColumn.CellStyle>
</DataGridTextColumn> </DataGridTextColumn>
<DataGridTextColumn Header="Sonst." Binding="{Binding Custom, Converter={StaticResource CurrencyConverter}, StringFormat='{}{0} '}" Width="65"> <DataGridTextColumn Header="Weitere" Binding="{Binding Custom, Converter={StaticResource CurrencyConverter}, StringFormat='{}{0} '}" Width="65">
<DataGridTextColumn.CellStyle> <DataGridTextColumn.CellStyle>
<Style> <Style>
<Setter Property="TextBlock.TextAlignment" Value="Right"/> <Setter Property="TextBlock.TextAlignment" Value="Right"/>