diff --git a/Elwig/Documents/CreditNote.cshtml b/Elwig/Documents/CreditNote.cshtml index e56f112..da19de7 100644 --- a/Elwig/Documents/CreditNote.cshtml +++ b/Elwig/Documents/CreditNote.cshtml @@ -13,11 +13,11 @@ - - + + @@ -27,21 +27,21 @@ Sorte Attribut Gradation - Zu-/Abschläge Flächenbindung Preis + Zu-/Abschläge Betrag - Abs. Rel. + Abs. [°Oe] [°KMW] + [kg] [@Model.CurrencySymbol/kg] [%] - [kg] [@Model.CurrencySymbol/kg] [@Model.CurrencySymbol] @@ -62,8 +62,6 @@ @p.Attribute @($"{p.Gradation.Oe:N0}") @($"{p.Gradation.Kmw:N1}") - @abs - @rel } @if (i > 0 && i <= p.Modifiers.Length) { @(p.Modifiers[i - 1]) @@ -79,7 +77,10 @@ } @if (first) { - @($"{1000:N2}") + @rel + @abs + + @($"{p.Buckets.Sum(b => b.Amount):N2}") first = false; } diff --git a/Elwig/Documents/CreditNote.css b/Elwig/Documents/CreditNote.css index aeeb9e1..d973d40 100644 --- a/Elwig/Documents/CreditNote.css +++ b/Elwig/Documents/CreditNote.css @@ -32,7 +32,8 @@ table.credit .dpnr { } table.credit .amount, -table.credit .weight { +table.credit .weight, +table.credit .price { text-align: right; } diff --git a/Elwig/Helpers/AppDbUpdater.cs b/Elwig/Helpers/AppDbUpdater.cs index 09f2b37..36f4f36 100644 --- a/Elwig/Helpers/AppDbUpdater.cs +++ b/Elwig/Helpers/AppDbUpdater.cs @@ -689,7 +689,7 @@ namespace Elwig.Helpers { BEGIN INSERT INTO payment_member (year, avnr, mgnr, net_amount) VALUES (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did)), NEW.amount) - ON CONFLICT DO UPDATE SET amount = amount + excluded.amount; + ON CONFLICT DO UPDATE SET net_amount = net_amount + excluded.net_amount; END; """); ExecuteNonQuery(cnx, """ diff --git a/Elwig/Helpers/Billing/Billing.cs b/Elwig/Helpers/Billing/Billing.cs index 4997c07..f277da4 100644 --- a/Elwig/Helpers/Billing/Billing.cs +++ b/Elwig/Helpers/Billing/Billing.cs @@ -1,4 +1,3 @@ -using Microsoft.Data.Sqlite; using System; using System.Collections.Generic; using System.Linq; diff --git a/Elwig/Helpers/Billing/BillingVariant.cs b/Elwig/Helpers/Billing/BillingVariant.cs index 4038e3d..6a0b477 100644 --- a/Elwig/Helpers/Billing/BillingVariant.cs +++ b/Elwig/Helpers/Billing/BillingVariant.cs @@ -1,7 +1,5 @@ -using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Elwig.Helpers.Billing { @@ -15,6 +13,10 @@ namespace Elwig.Helpers.Billing { protected async Task DeleteInDb() { using var cnx = await AppDbContext.ConnectAsync(); + using (var cmd = cnx.CreateCommand()) { + cmd.CommandText = $"DELETE FROM payment_delivery_part_bucket WHERE (year, avnr) = ({Year}, {AvNr})"; + await cmd.ExecuteNonQueryAsync(); + } using (var cmd = cnx.CreateCommand()) { cmd.CommandText = $"DELETE FROM payment_delivery_part WHERE (year, avnr) = ({Year}, {AvNr})"; await cmd.ExecuteNonQueryAsync(); @@ -27,15 +29,41 @@ namespace Elwig.Helpers.Billing { public async Task CalculatePrices() { await DeleteInDb(); - var tasks = new List(); - foreach (var mgnr in Context.Members.Select(m => m.MgNr)) { - tasks.Add(Task.Run(() => CalculateMemberPrices(mgnr))); + using var cnx = await AppDbContext.ConnectAsync(); + + var parts = new List<(int Year, int DId, int DPNr, int BktNr, string SortId, string Discr, int Value, bool MinQuw, double Oe, double Kmw)>(); + using (var cmd = cnx.CreateCommand()) { + cmd.CommandText = $""" + SELECT d.year, d.did, d.dpnr, b.bktnr, d.sortid, b.discr, b.value, d.min_quw, d.oe, d.kmw + FROM delivery_part_bucket b + JOIN v_delivery d ON (d.year, d.did, d.dpnr) = (b.year, b.did, b.dpnr) + WHERE b.year = {Year} + """; + using var reader = await cmd.ExecuteReaderAsync(); + while (await reader.ReadAsync()) { + parts.Add(( + reader.GetInt32(0), reader.GetInt32(1), reader.GetInt32(2), reader.GetInt32(3), + reader.GetString(4), reader.GetString(5), reader.GetInt32(6), + reader.GetBoolean(7), reader.GetDouble(8), reader.GetDouble(9) + )); + } } - await Task.WhenAll(tasks); - } - protected async Task CalculateMemberPrices(int mgnr) { + var inserts = new List<(int Year, int DId, int DPNr, int BktNr, long Price, long Amount)>(); + foreach (var part in parts) { + var price = !part.MinQuw ? 0.5m : ((part.BktNr == 2 ? 0.8m : (part.BktNr == 1 ? 0.7m : 0.6m)) + ((decimal)(part.Oe - 73) * 0.005m)); // TODO + var priceL = Utils.DecToDb(price, 4); + var amount = Utils.DecToDb(price * part.Value, 4); + inserts.Add((part.Year, part.DId, part.DPNr, part.BktNr, priceL, amount)); + } + using (var cmd = cnx.CreateCommand()) { + cmd.CommandText = $""" + INSERT INTO payment_delivery_part_bucket (year, did, dpnr, bktnr, avnr, price, amount) + VALUES {string.Join(",\n ", inserts.Select(i => $"({i.Year}, {i.DId}, {i.DPNr}, {i.BktNr}, {AvNr}, {i.Price}, {i.Amount})"))} + """; + await cmd.ExecuteNonQueryAsync(); + } } } } diff --git a/Elwig/Models/Dtos/CreditNoteData.cs b/Elwig/Models/Dtos/CreditNoteData.cs index fc0e8c9..addff16 100644 --- a/Elwig/Models/Dtos/CreditNoteData.cs +++ b/Elwig/Models/Dtos/CreditNoteData.cs @@ -90,9 +90,10 @@ namespace Elwig.Models.Dtos { Buckets = rows .Where(b => b.Value > 0) .OrderByDescending(b => b.BktNr) + // FIXME precision .Select(b => (b.Discr == "_" ? "ungeb." : $"geb. {f.SortId}{b.Discr}", b.Value, - b.Price != null ? (decimal?)Utils.DecFromDb((long)b.Price, 0) : null, - b.Amount != null ? (decimal?)Utils.DecFromDb((long)b.Amount, 0) : null)) + b.Price != null ? (decimal?)Utils.DecFromDb((long)b.Price, 4) : null, + b.Amount != null ? (decimal?)Utils.DecFromDb((long)b.Amount, 4) : null)) .ToArray(); } } diff --git a/Elwig/Windows/PaymentVariantsWindow.xaml.cs b/Elwig/Windows/PaymentVariantsWindow.xaml.cs index 8a82e12..ee48187 100644 --- a/Elwig/Windows/PaymentVariantsWindow.xaml.cs +++ b/Elwig/Windows/PaymentVariantsWindow.xaml.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; +using Elwig.Helpers.Billing; namespace Elwig.Windows { public partial class PaymentVariantsWindow : ContextWindow { @@ -68,8 +69,15 @@ namespace Elwig.Windows { } - private void CalculateButton_Click(object sender, RoutedEventArgs evt) { - + private async void CalculateButton_Click(object sender, RoutedEventArgs evt) { + if (PaymentVariantList.SelectedValue is not PaymentVar v) + return; + CalculateButton.IsEnabled = false; + Mouse.OverrideCursor = Cursors.AppStarting; + var b = new BillingVariant(v.Year, v.AvNr); + await b.CalculatePrices(); + Mouse.OverrideCursor = null; + CalculateButton.IsEnabled = true; } private void EditButton_Click(object sender, RoutedEventArgs evt) {