MainWindow: Add 'Flächenbindungen' and 'Liefermenge/Ertrag' button
This commit is contained in:
@ -68,6 +68,7 @@ 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<MemberDeliveryPerVariantRowSingle> MemberDeliveryPerVariantRows { get; private set; }
|
public DbSet<MemberDeliveryPerVariantRowSingle> MemberDeliveryPerVariantRows { get; private set; }
|
||||||
|
public DbSet<MemberAreaComsRowSingle> 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; }
|
||||||
|
105
Elwig/Models/Dtos/MemberAreaComsData.cs
Normal file
105
Elwig/Models/Dtos/MemberAreaComsData.cs
Normal file
@ -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 MemberAreaComsData : DataTable<MemberAreaComsRow> {
|
||||||
|
|
||||||
|
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 MemberAreaComsData(IEnumerable<MemberAreaComsRow> rows, int year) :
|
||||||
|
base($"Flächenbindungen", $"Flächenbindungen pro Mitglied {year}", rows, FieldNames) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<MemberAreaComsData> ForSeason(DbSet<MemberAreaComsRowSingle> table, int year) {
|
||||||
|
return new MemberAreaComsData(
|
||||||
|
(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) {
|
||||||
|
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 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]
|
||||||
|
public class MemberAreaComsRowSingle {
|
||||||
|
[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; }
|
||||||
|
}
|
||||||
|
}
|
@ -6,7 +6,7 @@ using System.Linq;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Elwig.Models.Dtos {
|
namespace Elwig.Models.Dtos {
|
||||||
public class MemberDeliveryPerVariantData : DataTable<MemberDeliveryPerVariantRow> {
|
public class MemberDeliveryPerVarietyData : DataTable<MemberDeliveryPerVariantRow> {
|
||||||
|
|
||||||
private static readonly (string, string, string?, int)[] FieldNames = [
|
private static readonly (string, string, string?, int)[] FieldNames = [
|
||||||
("MgNr", "MgNr.", null, 12),
|
("MgNr", "MgNr.", null, 12),
|
||||||
@ -22,13 +22,12 @@ namespace Elwig.Models.Dtos {
|
|||||||
("Yields", "Ertrag", "kg/ha", 22),
|
("Yields", "Ertrag", "kg/ha", 22),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public MemberDeliveryPerVarietyData(IEnumerable<MemberDeliveryPerVariantRow> rows, int year) :
|
||||||
public MemberDeliveryPerVariantData(IEnumerable<MemberDeliveryPerVariantRow> rows, int year) :
|
|
||||||
base($"Liefermengen", $"Liefermengen pro Mitglied, Sorte und Attribut {year}", rows, FieldNames) {
|
base($"Liefermengen", $"Liefermengen pro Mitglied, Sorte und Attribut {year}", rows, FieldNames) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<MemberDeliveryPerVariantData> ForSeason(DbSet<MemberDeliveryPerVariantRowSingle> table, int year) {
|
public static async Task<MemberDeliveryPerVarietyData> ForSeason(DbSet<MemberDeliveryPerVariantRowSingle> table, int year) {
|
||||||
return new MemberDeliveryPerVariantData(
|
return new MemberDeliveryPerVarietyData(
|
||||||
(await FromDbSet(table, year)).GroupBy(
|
(await FromDbSet(table, year)).GroupBy(
|
||||||
r => r.MgNr,
|
r => r.MgNr,
|
||||||
(k, g) => new MemberDeliveryPerVariantRow(g)
|
(k, g) => new MemberDeliveryPerVariantRow(g)
|
@ -90,23 +90,59 @@
|
|||||||
Margin="0,13,0,0" VerticalAlignment="Top" HorizontalAlignment="Center"
|
Margin="0,13,0,0" VerticalAlignment="Top" HorizontalAlignment="Center"
|
||||||
TextChanged="SeasonInput_TextChanged"/>
|
TextChanged="SeasonInput_TextChanged"/>
|
||||||
|
|
||||||
<Button x:Name="OverUnderDeliveryButton" Content="Über-/Unterlieferungen"
|
|
||||||
Click="OverUnderDeliveryButton_Click"
|
|
||||||
Margin="0,50,195,10" Width="190"/>
|
|
||||||
|
|
||||||
<Button x:Name="DeliveryConfirmationButton" Content="Anlieferungsbestätigung"
|
<Button x:Name="DeliveryConfirmationButton" Content="Anlieferungsbestätigung"
|
||||||
Click="DeliveryConfirmationButton_Click"
|
Click="DeliveryConfirmationButton_Click"
|
||||||
Margin="195,50,0,10" Width="190"/>
|
Margin="0,50,195,10" Width="190"/>
|
||||||
|
|
||||||
<Button x:Name="BreakdownButton" Content="Sorten-/Qual.aufteilung"
|
|
||||||
Click="BreakdownButton_Click"
|
|
||||||
Margin="0,90,195,10" Width="190"/>
|
|
||||||
|
|
||||||
<Button x:Name="PaymentButton" Content="Auszahlung"
|
<Button x:Name="PaymentButton" Content="Auszahlung"
|
||||||
Click="PaymentButton_Click"
|
Click="PaymentButton_Click"
|
||||||
Margin="195,90,0,10" Width="190"/>
|
Margin="195,50,0,10" Width="190"/>
|
||||||
|
|
||||||
<Grid VerticalAlignment="Bottom" Margin="50,140,50,10">
|
<Button x:Name="OverUnderDeliveryButton"
|
||||||
|
Click="OverUnderDeliveryButton_Click"
|
||||||
|
Margin="0,90,195,10" Width="190" Padding="3,5,5,5"
|
||||||
|
ToolTip="Über-/Unterlieferungen laut gezeichneten Geschäftsanteilen und Unterlieferungen nach Flächenbindungen">
|
||||||
|
<Grid Width="172">
|
||||||
|
<TextBlock FontFamily="Segoe MDL2 Assets" FontSize="16" Text=""
|
||||||
|
TextAlignment="Left" HorizontalAlignment="Left" Padding="1.5,0.5,0,0"/>
|
||||||
|
<TextBlock FontSize="12" Margin="18,1,0,0" TextAlignment="Center">Über-/Unterlieferungen</TextBlock>
|
||||||
|
</Grid>
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<Button x:Name="BreakdownButton"
|
||||||
|
Click="BreakdownButton_Click"
|
||||||
|
Margin="195,90,0,10" Width="190" Padding="3,5,5,5"
|
||||||
|
ToolTip="Aufschlüsselung des Gewichts nach Zweigstelle, Mitglied, Sorte, Attribut/Bewirt., Qualitätsstufe, gebunden/ungebunden">
|
||||||
|
<Grid Width="170">
|
||||||
|
<TextBlock FontFamily="Segoe MDL2 Assets" FontSize="16" Text=""
|
||||||
|
TextAlignment="Left" HorizontalAlignment="Left" Padding="1.5,0.5,0,0"/>
|
||||||
|
<TextBlock FontSize="12" Margin="18,1,0,0" TextAlignment="Center">Sorten-/Qual.aufschlüssel.</TextBlock>
|
||||||
|
</Grid>
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<Button x:Name="AreaCommitmentsButton"
|
||||||
|
Click="AreaCommitmentsButton_Click"
|
||||||
|
Margin="0,130,195,10" Width="190" Padding="3,5,5,5"
|
||||||
|
ToolTip="Aktive Flächenbindungen der Saison pro Mitglied und Sorte/Attribut">
|
||||||
|
<Grid Width="172">
|
||||||
|
<TextBlock FontFamily="Segoe MDL2 Assets" FontSize="16" Text=""
|
||||||
|
TextAlignment="Left" HorizontalAlignment="Left" Padding="1.5,1.5,0,0"/>
|
||||||
|
<TextBlock Margin="18,0,0,0" TextAlignment="Center">Flächenbindungen</TextBlock>
|
||||||
|
</Grid>
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<Button x:Name="BreakdownMemberVarietyButton"
|
||||||
|
Click="BreakdownMemberVarietyButton_Click"
|
||||||
|
Margin="195,130,0,10" Width="190" Padding="3,5,5,5"
|
||||||
|
ToolTip="Liefermengen und Ertrag (kg/ha) pro Mitglied">
|
||||||
|
<Grid Width="170">
|
||||||
|
<TextBlock FontFamily="Segoe MDL2 Assets" FontSize="16" Text=""
|
||||||
|
TextAlignment="Left" HorizontalAlignment="Left" Padding="1.5,1.5,0,0"/>
|
||||||
|
<TextBlock Margin="18,0,0,0" TextAlignment="Center">Liefermengen/Ertrag</TextBlock>
|
||||||
|
</Grid>
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<Grid VerticalAlignment="Bottom" Margin="50,175,50,15">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="60"/>
|
<ColumnDefinition Width="60"/>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
|
@ -251,7 +251,7 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void SeasonFinish_Expanded(object sender, RoutedEventArgs evt) {
|
private void SeasonFinish_Expanded(object sender, RoutedEventArgs evt) {
|
||||||
Height = 610;
|
Height = 660;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SeasonFinish_Collapsed(object sender, RoutedEventArgs evt) {
|
private void SeasonFinish_Collapsed(object sender, RoutedEventArgs evt) {
|
||||||
@ -264,9 +264,11 @@ namespace Elwig.Windows {
|
|||||||
var s0 = await ctx.Seasons.FindAsync(year);
|
var s0 = await ctx.Seasons.FindAsync(year);
|
||||||
var valid = (s0 != null);
|
var valid = (s0 != null);
|
||||||
DeliveryConfirmationButton.IsEnabled = valid;
|
DeliveryConfirmationButton.IsEnabled = valid;
|
||||||
OverUnderDeliveryButton.IsEnabled = valid;
|
|
||||||
PaymentButton.IsEnabled = valid;
|
PaymentButton.IsEnabled = valid;
|
||||||
|
OverUnderDeliveryButton.IsEnabled = valid;
|
||||||
BreakdownButton.IsEnabled = valid;
|
BreakdownButton.IsEnabled = valid;
|
||||||
|
AreaCommitmentsButton.IsEnabled = valid;
|
||||||
|
BreakdownMemberVarietyButton.IsEnabled = valid;
|
||||||
|
|
||||||
if (valid) {
|
if (valid) {
|
||||||
var areaComs = Utils.ActiveAreaCommitments(ctx.AreaCommitments, year!.Value);
|
var areaComs = Utils.ActiveAreaCommitments(ctx.AreaCommitments, year!.Value);
|
||||||
@ -295,6 +297,12 @@ namespace Elwig.Windows {
|
|||||||
w.AddDeliveryConfirmation();
|
w.AddDeliveryConfirmation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void PaymentButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
if (SeasonInput.Value is not int year)
|
||||||
|
return;
|
||||||
|
App.FocusPaymentVariants(year);
|
||||||
|
}
|
||||||
|
|
||||||
private async void OverUnderDeliveryButton_Click(object sender, RoutedEventArgs evt) {
|
private async void OverUnderDeliveryButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
if (SeasonInput.Value is not int year)
|
if (SeasonInput.Value is not int year)
|
||||||
return;
|
return;
|
||||||
@ -317,23 +325,15 @@ namespace Elwig.Windows {
|
|||||||
using var ctx = new AppDbContext();
|
using var ctx = new AppDbContext();
|
||||||
var tbl1 = await OverUnderDeliveryData.ForSeason(ctx.OverUnderDeliveryRows, year);
|
var tbl1 = await OverUnderDeliveryData.ForSeason(ctx.OverUnderDeliveryRows, year);
|
||||||
var tbl2 = await AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, year);
|
var tbl2 = await AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, year);
|
||||||
var tbl3 = await MemberDeliveryPerVariantData.ForSeason(ctx.MemberDeliveryPerVariantRows, year);
|
|
||||||
using var ods = new OdsFile(d.FileName);
|
using var ods = new OdsFile(d.FileName);
|
||||||
await ods.AddTable(tbl1);
|
await ods.AddTable(tbl1);
|
||||||
await ods.AddTable(tbl2);
|
await ods.AddTable(tbl2);
|
||||||
await ods.AddTable(tbl3);
|
|
||||||
} catch (Exception exc) {
|
} catch (Exception exc) {
|
||||||
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
}
|
}
|
||||||
Mouse.OverrideCursor = null;
|
Mouse.OverrideCursor = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PaymentButton_Click(object sender, RoutedEventArgs evt) {
|
|
||||||
if (SeasonInput.Value is not int year)
|
|
||||||
return;
|
|
||||||
App.FocusPaymentVariants(year);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void BreakdownButton_Click(object sender, RoutedEventArgs evt) {
|
private async void BreakdownButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
if (SeasonInput.Value is not int year)
|
if (SeasonInput.Value is not int year)
|
||||||
return;
|
return;
|
||||||
@ -366,5 +366,63 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
Mouse.OverrideCursor = null;
|
Mouse.OverrideCursor = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async void AreaCommitmentsButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
if (SeasonInput.Value is not int year)
|
||||||
|
return;
|
||||||
|
var d = new SaveFileDialog() {
|
||||||
|
FileName = $"Flächenbindungen-{year}.ods",
|
||||||
|
DefaultExt = "ods",
|
||||||
|
Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods",
|
||||||
|
Title = $"Flächenbindungen {year} speichern unter - Elwig"
|
||||||
|
};
|
||||||
|
if (d.ShowDialog() == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Mouse.OverrideCursor = Cursors.AppStarting;
|
||||||
|
try {
|
||||||
|
var b = new Billing(year);
|
||||||
|
await b.FinishSeason();
|
||||||
|
await b.CalculateBuckets();
|
||||||
|
App.HintContextChange();
|
||||||
|
|
||||||
|
using var ctx = new AppDbContext();
|
||||||
|
var tbl = await MemberAreaComsData.ForSeason(ctx.MemberAreaComsRows, year);
|
||||||
|
using var ods = new OdsFile(d.FileName);
|
||||||
|
await ods.AddTable(tbl);
|
||||||
|
} catch (Exception exc) {
|
||||||
|
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
Mouse.OverrideCursor = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void BreakdownMemberVarietyButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
if (SeasonInput.Value is not int year)
|
||||||
|
return;
|
||||||
|
var d = new SaveFileDialog() {
|
||||||
|
FileName = $"Liefermengen-Ertrag-{year}.ods",
|
||||||
|
DefaultExt = "ods",
|
||||||
|
Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods",
|
||||||
|
Title = $"Liefermengen/Ertrag {year} speichern unter - Elwig"
|
||||||
|
};
|
||||||
|
if (d.ShowDialog() == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Mouse.OverrideCursor = Cursors.AppStarting;
|
||||||
|
try {
|
||||||
|
var b = new Billing(year);
|
||||||
|
await b.FinishSeason();
|
||||||
|
await b.CalculateBuckets();
|
||||||
|
App.HintContextChange();
|
||||||
|
|
||||||
|
using var ctx = new AppDbContext();
|
||||||
|
var tbl = await MemberDeliveryPerVarietyData.ForSeason(ctx.MemberDeliveryPerVariantRows, year);
|
||||||
|
using var ods = new OdsFile(d.FileName);
|
||||||
|
await ods.AddTable(tbl);
|
||||||
|
} catch (Exception exc) {
|
||||||
|
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
Mouse.OverrideCursor = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user