diff --git a/Elwig/Helpers/AppDbContext.cs b/Elwig/Helpers/AppDbContext.cs index 4c76fa9..b64aeaf 100644 --- a/Elwig/Helpers/AppDbContext.cs +++ b/Elwig/Helpers/AppDbContext.cs @@ -69,7 +69,8 @@ namespace Elwig.Helpers { public DbSet OverUnderDeliveryRows { get; private set; } public DbSet AreaComUnderDeliveryRows { get; private set; } public DbSet MemberDeliveryPerVariantRows { get; private set; } - public DbSet MemberAreaComsRows { get; private set; } + public DbSet MemberAreaComTotalsRows { get; private set; } + public DbSet MemberAreaComsRows { get; private set; } public DbSet CreditNoteDeliveryRows { get; private set; } public DbSet CreditNoteRows { get; private set; } public DbSet WeightBreakDownRows { get; private set; } diff --git a/Elwig/Models/Dtos/MemberAreaComTotalsData.cs b/Elwig/Models/Dtos/MemberAreaComTotalsData.cs new file mode 100644 index 0000000..5a51d21 --- /dev/null +++ b/Elwig/Models/Dtos/MemberAreaComTotalsData.cs @@ -0,0 +1,105 @@ +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Threading.Tasks; + +namespace Elwig.Models.Dtos { + class MemberAreaComTotalsData : DataTable { + + private static readonly (string, string, string?, int)[] FieldNames = [ + ("MgNr", "MgNr.", null, 12), + ("Name1", "Name", null, 40), + ("Name2", "Vorname", null, 40), + ("Address", "Adresse", null, 60), + ("Plz", "PLZ", null, 10), + ("Locality", "Ort", null, 60), + ("SortIds", "Sorte", null, 12), + ("AttrIds", "Attribut", null, 16), + ("Areas", "Fläche", "m²", 22), + ("DeliveryObligations", "Lieferpflicht", "kg", 22), + ("DeliveryRights", "Lieferrecht", "kg", 22), + ]; + + public MemberAreaComTotalsData(IEnumerable rows, int year) : + base($"Gebundene Fläche", $"Gebundene Fläche pro Mitglied {year}", rows, FieldNames) { + } + + public static async Task ForSeason(DbSet table, int year) { + return new MemberAreaComTotalsData( + (await FromDbSet(table, year)).GroupBy( + r => r.MgNr, + (k, g) => new MemberAreaComTotalsRow(g) + ), year); + } + + private static async Task> FromDbSet(DbSet table, int year) { + return await table.FromSql($""" + SELECT m.mgnr, m.name AS name_1, + COALESCE(m.prefix || ' ', '') || m.given_name || + COALESCE(' ' || m.middle_names, '') || COALESCE(' ' || m.suffix, '') AS name_2, + p.plz, o.name AS ort, m.address, + c.bucket, c.area, c.min_kg, c.max_kg + FROM v_area_commitment_bucket_strict c + LEFT JOIN member m ON m.mgnr = c.mgnr + LEFT JOIN AT_plz_dest p ON p.id = m.postal_dest + LEFT JOIN AT_ort o ON o.okz = p.okz + WHERE c.year = {year} + ORDER BY m.mgnr, c.bucket + """).ToListAsync(); + } + } + + public class MemberAreaComTotalsRow { + public int MgNr; + public string Name1; + public string? Name2; + public string Address; + public int Plz; + public string Locality; + public string[] SortIds; + public string[] AttrIds; + public int[] Areas; + public int[] DeliveryObligations; + public int[] DeliveryRights; + + public MemberAreaComTotalsRow(IEnumerable rows) { + var f = rows.First(); + MgNr = f.MgNr; + Name1 = f.Name1; + Name2 = f.Name2; + Address = f.Address; + Plz = f.Plz; + Locality = f.Locality.Split(",")[0]; + SortIds = [.. rows.Select(r => r.VtrgId[..2])]; + AttrIds = [.. rows.Select(r => r.VtrgId[2..])]; + Areas = [.. rows.Select(r => r.Area)]; + DeliveryObligations = [.. rows.Select(r => r.MinKg)]; + DeliveryRights = [.. rows.Select(r => r.MaxKg)]; + } + } + + [Keyless] + public class MemberAreaComTotalsRowSingle { + [Column("mgnr")] + public int MgNr { get; set; } + [Column("name_1")] + public required string Name1 { get; set; } + [Column("name_2")] + public string? Name2 { get; set; } + [Column("address")] + public required string Address { get; set; } + [Column("plz")] + public int Plz { get; set; } + [Column("ort")] + public required string Locality { get; set; } + [Column("bucket")] + public required string VtrgId { get; set; } + [Column("area")] + public int Area { get; set; } + [Column("min_kg")] + public int MinKg { get; set; } + [Column("max_kg")] + public int MaxKg { get; set; } + } +} diff --git a/Elwig/Models/Dtos/MemberAreaComsData.cs b/Elwig/Models/Dtos/MemberAreaComsData.cs index 3ed7782..bca59df 100644 --- a/Elwig/Models/Dtos/MemberAreaComsData.cs +++ b/Elwig/Models/Dtos/MemberAreaComsData.cs @@ -14,73 +14,49 @@ namespace Elwig.Models.Dtos { ("Address", "Adresse", null, 60), ("Plz", "PLZ", null, 10), ("Locality", "Ort", null, 60), - ("SortIds", "Sorte", null, 12), - ("AttrIds", "Attribut", null, 16), - ("Areas", "Fläche", "m²", 22), - ("DeliveryObligations", "Lieferpflicht", "kg", 22), - ("DeliveryRights", "Lieferrecht", "kg", 22), + ("SortId", "Sorte", null, 12), + ("AttrId", "Attribut", null, 16), + ("CultId", "Bewirt.", null, 16), + ("GstNr", "Parzelle(n)", null, 25), + ("Area", "Fläche", "m²", 22), + ("MinKg", "Lieferpflicht", "kg", 22), + ("MaxKg", "Lieferrecht", "kg", 22), ]; public MemberAreaComsData(IEnumerable rows, int year) : base($"Flächenbindungen", $"Flächenbindungen pro Mitglied {year}", rows, FieldNames) { } - public static async Task ForSeason(DbSet table, int year) { - return new MemberAreaComsData( - (await FromDbSet(table, year)).GroupBy( - r => r.MgNr, - (k, g) => new MemberAreaComsRow(g) - ), year); + public static async Task ForSeason(DbSet table, int year) { + return new MemberAreaComsData(await FromDbSet(table, year), year); } - private static async Task> FromDbSet(DbSet table, int year) { + private static async Task> FromDbSet(DbSet table, int year) { return await table.FromSql($""" SELECT m.mgnr, m.name AS name_1, COALESCE(m.prefix || ' ', '') || m.given_name || COALESCE(' ' || m.middle_names, '') || COALESCE(' ' || m.suffix, '') AS name_2, p.plz, o.name AS ort, m.address, - c.bucket, c.area, c.min_kg, c.max_kg - FROM v_area_commitment_bucket_strict c + t.sortid, t.attrid, c.cultid, + c.gstnr, c.area, + CAST(ROUND(area * COALESCE(t.min_kg_per_ha, 0) / 10000.0, 0) AS INTEGER) AS min_kg, + CAST(ROUND(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 + FROM v_virtual_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 LEFT JOIN member m ON m.mgnr = c.mgnr LEFT JOIN AT_plz_dest p ON p.id = m.postal_dest LEFT JOIN AT_ort o ON o.okz = p.okz - WHERE c.year = {year} - ORDER BY m.mgnr, c.bucket + WHERE s.year = {year} AND + (year_from IS NULL OR year_from <= s.year) AND + (year_to IS NULL OR year_to >= s.year) + ORDER BY c.mgnr, t.sortid, t.attrid, c.cultid, c.gstnr; """).ToListAsync(); } } - public class MemberAreaComsRow { - public int MgNr; - public string Name1; - public string? Name2; - public string Address; - public int Plz; - public string Locality; - public string[] SortIds; - public string[] AttrIds; - public int[] Areas; - public int[] DeliveryObligations; - public int[] DeliveryRights; - - public MemberAreaComsRow(IEnumerable rows) { - var f = rows.First(); - MgNr = f.MgNr; - Name1 = f.Name1; - Name2 = f.Name2; - Address = f.Address; - Plz = f.Plz; - Locality = f.Locality.Split(",")[0]; - SortIds = rows.Select(r => r.VtrgId[..2]).ToArray(); - AttrIds = rows.Select(r => r.VtrgId[2..]).ToArray(); - Areas = rows.Select(r => r.Area).ToArray(); - DeliveryObligations = rows.Select(r => r.MinKg).ToArray(); - DeliveryRights = rows.Select(r => r.MaxKg).ToArray(); - } - } - [Keyless] - public class MemberAreaComsRowSingle { + public class MemberAreaComsRow { [Column("mgnr")] public int MgNr { get; set; } [Column("name_1")] @@ -93,8 +69,14 @@ namespace Elwig.Models.Dtos { public int Plz { get; set; } [Column("ort")] public required string Locality { get; set; } - [Column("bucket")] - public required string VtrgId { get; set; } + [Column("sortid")] + public required string SortId { get; set; } + [Column("attrid")] + public string? AttrId { get; set; } + [Column("cultid")] + public string? CultId { get; set; } + [Column("gstnr")] + public required string GstNr { get; set; } [Column("area")] public int Area { get; set; } [Column("min_kg")] diff --git a/Elwig/Windows/MainWindow.xaml.cs b/Elwig/Windows/MainWindow.xaml.cs index 1daa711..fe0b6ee 100644 --- a/Elwig/Windows/MainWindow.xaml.cs +++ b/Elwig/Windows/MainWindow.xaml.cs @@ -538,9 +538,11 @@ namespace Elwig.Windows { App.HintContextChange(); using var ctx = new AppDbContext(); - var tbl = await MemberAreaComsData.ForSeason(ctx.MemberAreaComsRows, year); + var tbl1 = await MemberAreaComTotalsData.ForSeason(ctx.MemberAreaComTotalsRows, year); + var tbl2 = await MemberAreaComsData.ForSeason(ctx.MemberAreaComsRows, year); using var ods = new OdsFile(filename); - await ods.AddTable(tbl); + await ods.AddTable(tbl1); + await ods.AddTable(tbl2); } catch (Exception exc) { InteractionService.ShowException(exc); }