using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Threading.Tasks; namespace Elwig.Models.Dtos { class MemberAreaComsData : 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), ("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), 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, 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 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(); } } [Keyless] public class MemberAreaComsRow { [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("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")] public int MinKg { get; set; } [Column("max_kg")] public int MaxKg { get; set; } } }