MainWindow: Add individual commitments to Area Commitment export
Test / Run tests (push) Successful in 2m37s
Test / Run tests (push) Successful in 2m37s
This commit is contained in:
@@ -69,7 +69,8 @@ namespace Elwig.Helpers {
|
|||||||
public DbSet<OverUnderDeliveryRow> OverUnderDeliveryRows { get; private set; }
|
public DbSet<OverUnderDeliveryRow> OverUnderDeliveryRows { get; private set; }
|
||||||
public DbSet<AreaComUnderDeliveryRowSingle> AreaComUnderDeliveryRows { get; private set; }
|
public DbSet<AreaComUnderDeliveryRowSingle> AreaComUnderDeliveryRows { get; private set; }
|
||||||
public DbSet<MemberDeliveryPerVarietyRowSingle> MemberDeliveryPerVariantRows { get; private set; }
|
public DbSet<MemberDeliveryPerVarietyRowSingle> MemberDeliveryPerVariantRows { get; private set; }
|
||||||
public DbSet<MemberAreaComsRowSingle> MemberAreaComsRows { get; private set; }
|
public DbSet<MemberAreaComTotalsRowSingle> MemberAreaComTotalsRows { get; private set; }
|
||||||
|
public DbSet<MemberAreaComsRow> MemberAreaComsRows { get; private set; }
|
||||||
public DbSet<CreditNoteDeliveryRowSingle> CreditNoteDeliveryRows { get; private set; }
|
public DbSet<CreditNoteDeliveryRowSingle> CreditNoteDeliveryRows { get; private set; }
|
||||||
public DbSet<CreditNoteRowSingle> CreditNoteRows { get; private set; }
|
public DbSet<CreditNoteRowSingle> CreditNoteRows { get; private set; }
|
||||||
public DbSet<WeightBreakdownRow> WeightBreakDownRows { get; private set; }
|
public DbSet<WeightBreakdownRow> WeightBreakDownRows { get; private set; }
|
||||||
|
|||||||
@@ -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<MemberAreaComTotalsRow> {
|
||||||
|
|
||||||
|
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<MemberAreaComTotalsRow> rows, int year) :
|
||||||
|
base($"Gebundene Fläche", $"Gebundene Fläche pro Mitglied {year}", rows, FieldNames) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<MemberAreaComTotalsData> ForSeason(DbSet<MemberAreaComTotalsRowSingle> table, int year) {
|
||||||
|
return new MemberAreaComTotalsData(
|
||||||
|
(await FromDbSet(table, year)).GroupBy(
|
||||||
|
r => r.MgNr,
|
||||||
|
(k, g) => new MemberAreaComTotalsRow(g)
|
||||||
|
), year);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task<IEnumerable<MemberAreaComTotalsRowSingle>> FromDbSet(DbSet<MemberAreaComTotalsRowSingle> 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<MemberAreaComTotalsRowSingle> 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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,73 +14,49 @@ namespace Elwig.Models.Dtos {
|
|||||||
("Address", "Adresse", null, 60),
|
("Address", "Adresse", null, 60),
|
||||||
("Plz", "PLZ", null, 10),
|
("Plz", "PLZ", null, 10),
|
||||||
("Locality", "Ort", null, 60),
|
("Locality", "Ort", null, 60),
|
||||||
("SortIds", "Sorte", null, 12),
|
("SortId", "Sorte", null, 12),
|
||||||
("AttrIds", "Attribut", null, 16),
|
("AttrId", "Attribut", null, 16),
|
||||||
("Areas", "Fläche", "m²", 22),
|
("CultId", "Bewirt.", null, 16),
|
||||||
("DeliveryObligations", "Lieferpflicht", "kg", 22),
|
("GstNr", "Parzelle(n)", null, 25),
|
||||||
("DeliveryRights", "Lieferrecht", "kg", 22),
|
("Area", "Fläche", "m²", 22),
|
||||||
|
("MinKg", "Lieferpflicht", "kg", 22),
|
||||||
|
("MaxKg", "Lieferrecht", "kg", 22),
|
||||||
];
|
];
|
||||||
|
|
||||||
public MemberAreaComsData(IEnumerable<MemberAreaComsRow> rows, int year) :
|
public MemberAreaComsData(IEnumerable<MemberAreaComsRow> rows, int year) :
|
||||||
base($"Flächenbindungen", $"Flächenbindungen pro Mitglied {year}", rows, FieldNames) {
|
base($"Flächenbindungen", $"Flächenbindungen pro Mitglied {year}", rows, FieldNames) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<MemberAreaComsData> ForSeason(DbSet<MemberAreaComsRowSingle> table, int year) {
|
public static async Task<MemberAreaComsData> ForSeason(DbSet<MemberAreaComsRow> table, int year) {
|
||||||
return new MemberAreaComsData(
|
return new MemberAreaComsData(await FromDbSet(table, year), year);
|
||||||
(await FromDbSet(table, year)).GroupBy(
|
|
||||||
r => r.MgNr,
|
|
||||||
(k, g) => new MemberAreaComsRow(g)
|
|
||||||
), year);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<IEnumerable<MemberAreaComsRowSingle>> FromDbSet(DbSet<MemberAreaComsRowSingle> table, int year) {
|
private static async Task<IEnumerable<MemberAreaComsRow>> FromDbSet(DbSet<MemberAreaComsRow> table, int year) {
|
||||||
return await table.FromSql($"""
|
return await table.FromSql($"""
|
||||||
SELECT m.mgnr, m.name AS name_1,
|
SELECT m.mgnr, m.name AS name_1,
|
||||||
COALESCE(m.prefix || ' ', '') || m.given_name ||
|
COALESCE(m.prefix || ' ', '') || m.given_name ||
|
||||||
COALESCE(' ' || m.middle_names, '') || COALESCE(' ' || m.suffix, '') AS name_2,
|
COALESCE(' ' || m.middle_names, '') || COALESCE(' ' || m.suffix, '') AS name_2,
|
||||||
p.plz, o.name AS ort, m.address,
|
p.plz, o.name AS ort, m.address,
|
||||||
c.bucket, c.area, c.min_kg, c.max_kg
|
t.sortid, t.attrid, c.cultid,
|
||||||
FROM v_area_commitment_bucket_strict c
|
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 member m ON m.mgnr = c.mgnr
|
||||||
LEFT JOIN AT_plz_dest p ON p.id = m.postal_dest
|
LEFT JOIN AT_plz_dest p ON p.id = m.postal_dest
|
||||||
LEFT JOIN AT_ort o ON o.okz = p.okz
|
LEFT JOIN AT_ort o ON o.okz = p.okz
|
||||||
WHERE c.year = {year}
|
WHERE s.year = {year} AND
|
||||||
ORDER BY m.mgnr, c.bucket
|
(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();
|
""").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<MemberAreaComsRowSingle> 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]
|
[Keyless]
|
||||||
public class MemberAreaComsRowSingle {
|
public class MemberAreaComsRow {
|
||||||
[Column("mgnr")]
|
[Column("mgnr")]
|
||||||
public int MgNr { get; set; }
|
public int MgNr { get; set; }
|
||||||
[Column("name_1")]
|
[Column("name_1")]
|
||||||
@@ -93,8 +69,14 @@ namespace Elwig.Models.Dtos {
|
|||||||
public int Plz { get; set; }
|
public int Plz { get; set; }
|
||||||
[Column("ort")]
|
[Column("ort")]
|
||||||
public required string Locality { get; set; }
|
public required string Locality { get; set; }
|
||||||
[Column("bucket")]
|
[Column("sortid")]
|
||||||
public required string VtrgId { get; set; }
|
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")]
|
[Column("area")]
|
||||||
public int Area { get; set; }
|
public int Area { get; set; }
|
||||||
[Column("min_kg")]
|
[Column("min_kg")]
|
||||||
|
|||||||
@@ -538,9 +538,11 @@ namespace Elwig.Windows {
|
|||||||
App.HintContextChange();
|
App.HintContextChange();
|
||||||
|
|
||||||
using var ctx = new AppDbContext();
|
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);
|
using var ods = new OdsFile(filename);
|
||||||
await ods.AddTable(tbl);
|
await ods.AddTable(tbl1);
|
||||||
|
await ods.AddTable(tbl2);
|
||||||
} catch (Exception exc) {
|
} catch (Exception exc) {
|
||||||
InteractionService.ShowException(exc);
|
InteractionService.ShowException(exc);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user