108 lines
4.4 KiB
C#
108 lines
4.4 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel.DataAnnotations.Schema;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Elwig.Models.Dtos {
|
|
public class AreaComUnderDeliveryData : DataTable<AreaComUnderDeliveryRow> {
|
|
|
|
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),
|
|
("VtrgIds", "Vertrag", null, 14),
|
|
("Areas", "Fläche", "m²", 16),
|
|
("DeliveryObligations", "Lieferpflicht", "kg", 22),
|
|
("Weights", "Geliefert", "kg", 22),
|
|
("UnderDeliveries", "Unterliefert", "kg|%", 34),
|
|
];
|
|
|
|
public AreaComUnderDeliveryData(IEnumerable<AreaComUnderDeliveryRow> rows, int year) :
|
|
base($"Unterlieferungen FB", $"Unterlieferungen laut Flächenbindungen {year}", rows, FieldNames) {
|
|
}
|
|
|
|
public static async Task<AreaComUnderDeliveryData> ForSeason(DbSet<AreaComUnderDeliveryRowSingle> table, int year) {
|
|
return new AreaComUnderDeliveryData(
|
|
(await FromDbSet(table, year)).GroupBy(
|
|
r => r.MgNr,
|
|
(k, g) => new AreaComUnderDeliveryRow(g)
|
|
), year);
|
|
}
|
|
|
|
private static async Task<IEnumerable<AreaComUnderDeliveryRowSingle>> FromDbSet(DbSet<AreaComUnderDeliveryRowSingle> 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, u.min_kg, u.weight
|
|
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
|
|
JOIN v_under_delivery u ON (u.mgnr, u.bucket, u.year) = (m.mgnr, c.bucket, c.year)
|
|
WHERE c.year = {year}
|
|
ORDER BY m.mgnr, c.bucket
|
|
""").ToListAsync();
|
|
}
|
|
}
|
|
|
|
public class AreaComUnderDeliveryRow {
|
|
public int MgNr;
|
|
public string Name1;
|
|
public string? Name2;
|
|
public string Address;
|
|
public int Plz;
|
|
public string Locality;
|
|
public string[] VtrgIds;
|
|
public int[] Areas;
|
|
public int[] DeliveryObligations;
|
|
public int[] Weights;
|
|
public (int? Kg, double? Percent)[] UnderDeliveries => Weights.Zip(DeliveryObligations)
|
|
.Select(v => v.First < v.Second ? ((int?, double?))(v.First - v.Second, v.First * 100.0 / v.Second - 100.0) : (null, null))
|
|
.ToArray();
|
|
|
|
public AreaComUnderDeliveryRow(IEnumerable<AreaComUnderDeliveryRowSingle> 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];
|
|
VtrgIds = rows.Select(r => r.VtrgId).ToArray();
|
|
Areas = rows.Select(r => r.Area).ToArray();
|
|
DeliveryObligations = rows.Select(r => r.DeliveryObligation).ToArray();
|
|
Weights = rows.Select(r => r.Weight).ToArray();
|
|
}
|
|
}
|
|
|
|
[Keyless]
|
|
public class AreaComUnderDeliveryRowSingle {
|
|
[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 DeliveryObligation { get; set; }
|
|
[Column("weight")]
|
|
public int Weight { get; set; }
|
|
}
|
|
}
|