BilllingVariant: Allow for credits with negative value
This commit is contained in:
@@ -98,7 +98,7 @@ namespace Elwig.Helpers.Billing {
|
|||||||
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)
|
LEFT JOIN payment_custom x ON (x.year, x.mgnr) = (s.year, m.mgnr)
|
||||||
WHERE s.year = {Year} AND v.avnr = {AvNr} AND p.amount > COALESCE(lp.amount, 0);
|
WHERE s.year = {Year} AND v.avnr = {AvNr} AND p.amount != COALESCE(lp.amount, 0);
|
||||||
""");
|
""");
|
||||||
await cnx.ExecuteBatch($"""
|
await cnx.ExecuteBatch($"""
|
||||||
UPDATE payment_variant SET test_variant = FALSE WHERE (year, avnr) = ({Year}, {AvNr});
|
UPDATE payment_variant SET test_variant = FALSE WHERE (year, avnr) = ({Year}, {AvNr});
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using Elwig.ViewModels;
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -142,7 +143,7 @@ namespace Elwig.Services {
|
|||||||
});
|
});
|
||||||
|
|
||||||
var credits = ctx.Credits.Where(c => c.Year == v.Year && c.AvNr == v.AvNr);
|
var credits = ctx.Credits.Where(c => c.Year == v.Year && c.AvNr == v.AvNr);
|
||||||
if (!credits.Any()) {
|
if (!(await credits.AnyAsync())) {
|
||||||
long lastTotalSum = 0;
|
long lastTotalSum = 0;
|
||||||
decimal vatSum = 0;
|
decimal vatSum = 0;
|
||||||
var currentPayments = await ctx.MemberPayments
|
var currentPayments = await ctx.MemberPayments
|
||||||
@@ -150,8 +151,7 @@ namespace Elwig.Services {
|
|||||||
.ToDictionaryAsync(p => p.MgNr);
|
.ToDictionaryAsync(p => p.MgNr);
|
||||||
var lastV = await ctx.PaymentVariants
|
var lastV = await ctx.PaymentVariants
|
||||||
.Where(l => l.Year == v.Year && !l.TestVariant)
|
.Where(l => l.Year == v.Year && !l.TestVariant)
|
||||||
.OrderByDescending(l => l.TransferDateString ?? l.DateString)
|
.OrderByDescending(l => l.TransferDateString ?? l.DateString).ThenByDescending(l => l.AvNr)
|
||||||
.ThenByDescending(l => l.AvNr)
|
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
if (lastV != null) {
|
if (lastV != null) {
|
||||||
var lastPayments = await ctx.MemberPayments
|
var lastPayments = await ctx.MemberPayments
|
||||||
@@ -160,8 +160,8 @@ namespace Elwig.Services {
|
|||||||
lastTotalSum = lastPayments.Sum(e => e.Value.AmountValue);
|
lastTotalSum = lastPayments.Sum(e => e.Value.AmountValue);
|
||||||
foreach (int mgnr in currentPayments.Keys) {
|
foreach (int mgnr in currentPayments.Keys) {
|
||||||
var c = currentPayments[mgnr];
|
var c = currentPayments[mgnr];
|
||||||
var l = lastPayments[mgnr];
|
var l = lastPayments.GetValueOrDefault(mgnr);
|
||||||
vatSum += (c.Amount - l.Amount) * (decimal)(c.Member.IsBuchführend ? v.Season.VatNormal : v.Season.VatFlatrate);
|
vatSum += (c.Amount - (l?.Amount ?? 0)) * (decimal)(c.Member.IsBuchführend ? v.Season.VatNormal : v.Season.VatFlatrate);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
vatSum = currentPayments.Sum(e => e.Value.Amount * (decimal)(e.Value.Member.IsBuchführend ? v.Season.VatNormal : v.Season.VatFlatrate));
|
vatSum = currentPayments.Sum(e => e.Value.Amount * (decimal)(e.Value.Member.IsBuchführend ? v.Season.VatNormal : v.Season.VatFlatrate));
|
||||||
@@ -369,10 +369,42 @@ namespace Elwig.Services {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static async Task Commit(int year, int avnr) {
|
public static async Task Commit(int year, int avnr) {
|
||||||
|
List<Member> membersLess = [];
|
||||||
|
using (var ctx = new AppDbContext()) {
|
||||||
|
var lastAvNr = await ctx.PaymentVariants
|
||||||
|
.Where(v => v.Year == year && !v.TestVariant)
|
||||||
|
.OrderByDescending(v => v.TransferDateString ?? v.DateString).ThenByDescending(v => v.AvNr)
|
||||||
|
.Select(v => v.AvNr)
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
if (lastAvNr != 0) {
|
||||||
|
var cur = await ctx.MemberPayments.Include(p => p.Member).Where(p => p.Year == year && p.AvNr == avnr).ToDictionaryAsync(p => p.Member.MgNr, p => p);
|
||||||
|
var last = await ctx.MemberPayments.Include(p => p.Member).Where(p => p.Year == year && p.AvNr == lastAvNr).ToDictionaryAsync(p => p.Member.MgNr, p => p);
|
||||||
|
membersLess = [.. last.Where(p => (cur.TryGetValue(p.Key, out var c) ? c.Amount : 0) < p.Value.Amount).Select(p => p.Value.Member)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (membersLess.Count > 0) {
|
||||||
|
var res = MessageBox.Show($"Achtung: Bei {membersLess.Count:N0} Mitglied(ern) ist der Soll-Betrag der Auszahlung (\"Gesamtbetrag\") kleiner als bei der letzten Auszahlung. Das sollte nicht vorkommen!\n\n" +
|
||||||
|
$"{string.Join(", ", membersLess.Select(m => $"{m.AdministrativeName} ({m.MgNr})"))}\n\n" +
|
||||||
|
"Soll trotzdem forgefahren werden?",
|
||||||
|
"Kleinerer Gesamtbetrag", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel);
|
||||||
|
if (res != MessageBoxResult.OK)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
await Task.Run(async () => {
|
await Task.Run(async () => {
|
||||||
var b = await BillingVariant.Create(year, avnr);
|
var b = await BillingVariant.Create(year, avnr);
|
||||||
await b.Commit();
|
await b.Commit();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
List<Member> membersNeg = [];
|
||||||
|
using (var ctx = new AppDbContext()) {
|
||||||
|
membersNeg = await ctx.Credits.Where(c => c.Year == year && c.AvNr == avnr && c.AmountValue < 0).Select(c => c.Member).ToListAsync();
|
||||||
|
}
|
||||||
|
if (membersNeg.Count > 0) {
|
||||||
|
var res = MessageBox.Show($"Achtung: Bei {membersNeg.Count:N0} Mitglied(ern) ist der Auszahlungsbetrag negativ!\n\n" +
|
||||||
|
$"{string.Join(", ", membersNeg.Select(m => $"{m.AdministrativeName} ({m.MgNr})"))}",
|
||||||
|
"Negativer Auszahlungsbetrag", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task Revert(int year, int avnr) {
|
public static async Task Revert(int year, int avnr) {
|
||||||
|
|||||||
Reference in New Issue
Block a user