diff --git a/Elwig/Helpers/AppDbUpdater.cs b/Elwig/Helpers/AppDbUpdater.cs index d335bd1..3966c45 100644 --- a/Elwig/Helpers/AppDbUpdater.cs +++ b/Elwig/Helpers/AppDbUpdater.cs @@ -4,11 +4,12 @@ using System; namespace Elwig.Helpers { public static class AppDbUpdater { - public static readonly int RequiredSchemaVersion = 6; + public static readonly int RequiredSchemaVersion = 7; private static int _versionOffset = 0; private static readonly Action[] _updaters = new[] { - UpdateDbSchema_1_To_2, UpdateDbSchema_2_To_3, UpdateDbSchema_3_To_4, UpdateDbSchema_4_To_5, UpdateDbSchema_5_To_6 + UpdateDbSchema_1_To_2, UpdateDbSchema_2_To_3, UpdateDbSchema_3_To_4, UpdateDbSchema_4_To_5, + UpdateDbSchema_5_To_6, UpdateDBSchema_6_To_7 }; private static void ExecuteNonQuery(SqliteConnection cnx, string sql) { @@ -492,5 +493,52 @@ namespace Elwig.Helpers { ORDER BY year, mgnr, bucket; """); } + + private static void UpdateDBSchema_6_To_7(SqliteConnection cnx) { + ExecuteNonQuery(cnx, "DROP VIEW v_area_commitment_bucket_strict"); + ExecuteNonQuery(cnx, """ + CREATE VIEW v_area_commitment_bucket_strict AS + SELECT s.year, c.mgnr, c.vtrgid, + t.sortid || COALESCE(a.attrid, '') AS bucket, + t.sortid, a.attrid, + SUM(area) AS area, + CAST(ROUND(SUM(area) * COALESCE(t.min_kg_per_ha, 0) / 10000.0, 0) AS INTEGER) AS min_kg, + CAST(ROUND(SUM(area) * MIN(COALESCE(a.max_kg_per_ha, s.max_kg_per_ha), s.max_kg_per_ha) / 10000.0, 0) AS INTEGER) AS max_kg, + CAST(ROUND(SUM(area) * s.max_kg_per_ha / 10000.0, 0) AS INTEGER) AS upper_max_kg + FROM season s, area_commitment c + JOIN area_commitment_type t ON t.vtrgid = c.vtrgid + LEFT JOIN wine_attribute a ON a.attrid = t.attrid + WHERE (year_from IS NULL OR year_from <= s.year) AND + (year_to IS NULL OR year_to >= s.year) + GROUP BY s.year, c.mgnr, bucket + ORDER BY s.year, c.mgnr, bucket; + """); + + ExecuteNonQuery(cnx, """ + CREATE VIEW v_under_delivery_bucket_strict AS + SELECT c.year, c.mgnr, c.bucket, c.min_kg, COALESCE(p.weight, 0) AS weight + FROM v_area_commitment_bucket_strict c + LEFT JOIN v_payment_bucket_strict p ON (p.year, p.mgnr, p.bucket) = (c.year, c.mgnr, c.bucket) + ORDER BY c.year, c.mgnr, c.bucket; + """); + ExecuteNonQuery(cnx, """ + CREATE VIEW v_under_delivery_bucket AS + SELECT u.year, u.mgnr, u.bucket, u.min_kg, + u.weight + SUM(MAX(COALESCE(p.weight - s.min_kg, 0), 0)) AS weight + FROM v_under_delivery_bucket_strict u + LEFT JOIN v_payment_bucket_strict p ON (p.year, p.mgnr, p.sortid) = (u.year, u.mgnr, u.bucket) AND p.attrid IS NOT NULL + LEFT JOIN wine_attribute a ON a.attrid = p.attrid + LEFT JOIN v_area_commitment_bucket_strict s ON (s.year, s.mgnr, s.bucket) = (p.year, p.mgnr, p.bucket) + WHERE (p.gebunden IS NULL OR p.gebunden) AND (a.strict IS NULL OR a.strict = FALSE) + GROUP BY u.year, u.mgnr, u.bucket + ORDER BY u.year, u.mgnr, u.bucket; + """); + ExecuteNonQuery(cnx, """ + CREATE VIEW v_under_delivery AS + SELECT year, mgnr, bucket, min_kg, weight, weight - min_kg AS diff + FROM v_under_delivery_bucket + WHERE diff < 0; + """); + } } } diff --git a/Elwig/Windows/SeasonFinishWindow.xaml.cs b/Elwig/Windows/SeasonFinishWindow.xaml.cs index 172a7cd..81e4a86 100644 --- a/Elwig/Windows/SeasonFinishWindow.xaml.cs +++ b/Elwig/Windows/SeasonFinishWindow.xaml.cs @@ -112,17 +112,19 @@ namespace Elwig.Windows { await file.WriteLineAsync($";;;;;;;;;;;"); await file.WriteLineAsync($"Unterlieferungen lt. Flächenbindungen;;;;;;;;;;;"); - await file.WriteLineAsync($"MgNr;Name;Vorname;Adresse;PLZ;Ort;Vertrag;Lieferpflicht;Lieferrecht;Geliefert;Unterliefert;Prozent"); + await file.WriteLineAsync($"MgNr;Name;Vorname;Adresse;PLZ;Ort;Vertrag;Fläche;Max. Ertrag;Lieferpflicht;Geliefert;Unterliefert;Prozent"); using (var cmd = cnx.CreateCommand()) { cmd.CommandText = $""" SELECT m.mgnr, m.family_name, m.given_name, p.plz, o.name, m.address, - c.bucket, c.min_kg, c.max_kg, b.weight + c.bucket, c.area, COALESCE(a.max_kg_per_ha, s.max_kg_per_ha), u.min_kg, u.weight FROM member m + LEFT JOIN season s ON s.year = {year} LEFT JOIN AT_plz_dest p ON p.id = m.postal_dest LEFT JOIN AT_ort o ON o.okz = p.okz - JOIN v_area_commitment_bucket c ON c.mgnr = m.mgnr AND c.year = {year} - LEFT JOIN v_payment_bucket b ON (b.mgnr, b.bucket) = (m.mgnr, c.bucket) AND b.year = {year} - WHERE m.active = 1 AND b.weight < c.min_kg + LEFT JOIN v_area_commitment_bucket_strict c ON (c.mgnr, c.year) = (m.mgnr, s.year) + LEFT JOIN wine_attribute a ON a.attrid = c.attrid + JOIN v_under_delivery u ON (u.mgnr, u.bucket, u.year) = (m.mgnr, c.bucket, c.year) + WHERE m.active = 1 ORDER BY m.mgnr, c.bucket """; using var reader = await cmd.ExecuteReaderAsync(); @@ -134,10 +136,11 @@ namespace Elwig.Windows { var ort = reader.GetString(4).Split(',')[0]; var addr = reader.GetString(5); var id = reader.GetString(6); - var minKg = reader.GetInt32(7); - var maxKg = reader.GetInt32(8); - var sum = reader.GetInt32(9); - await file.WriteLineAsync($"{mgnr};{familyName};{givenName};{addr};{plz};{ort};{id};{minKg};{maxKg};{sum};{sum - minKg};{sum * 100.0 / minKg - 100.0:0.0}"); + var area = reader.GetInt32(7); + var maxKgPerHa = reader.GetInt32(8); + var minKg = reader.GetInt32(9); + var sum = reader.GetInt32(10); + await file.WriteLineAsync($"{mgnr};{familyName};{givenName};{addr};{plz};{ort};{id};{area};{maxKgPerHa};{minKg};{sum};{sum - minKg};{sum * 100.0 / minKg - 100.0:0.0}"); } }