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) {