Compare commits

..
2 Commits
Author SHA1 Message Date
lorenz.stechauner 895969b6ae Test: Add PaymentVariantServiceTest
Test / Run tests (push) Successful in 2m30s
2026-09-29 22:50:08 +02:00
lorenz.stechauner 54126814f3 SystecITScale: Fix error message 2026-09-29 22:30:57 +02:00
88 changed files with 1298 additions and 1619 deletions

No files matched your search

+401 -453
View File
File diff suppressed because it is too large. Load diff
+6
View File
@@ -7,6 +7,12 @@
<ctrl:BoolToStringConverter x:Key="BoolToStarConverter" FalseValue="" TrueValue="*"/> <ctrl:BoolToStringConverter x:Key="BoolToStarConverter" FalseValue="" TrueValue="*"/>
<ctrl:WidthToMarginConverter x:Key="WidthToMarginConverter"/> <ctrl:WidthToMarginConverter x:Key="WidthToMarginConverter"/>
<DataTemplate x:Key="PostalDestTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Dest}"/>
<TextBlock Text="{Binding Ort.Name, StringFormat='{} ({0})'}"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="KgNrTemplate"> <DataTemplate x:Key="KgNrTemplate">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/> <TextBlock Text="{Binding Name}"/>
+9 -10
View File
@@ -339,21 +339,20 @@ namespace Elwig {
public static async Task CheckForUpdates(bool showAlert = false) { public static async Task CheckForUpdates(bool showAlert = false) {
if (Config.UpdateUrl == null) return; if (Config.UpdateUrl == null) return;
try {
var latest = await Utils.GetLatestInstallerUrl(Config.UpdateUrl); var latest = await Utils.GetLatestInstallerUrl(Config.UpdateUrl);
if (new Version(latest.Version) > Version) { if (latest != null && new Version(latest.Value.Version) > Version) {
await MainDispatcher.BeginInvoke(() => { await MainDispatcher.BeginInvoke(() => {
var d = new UpdateDialog(latest.Version, latest.Url, latest.Size); var d = new UpdateDialog(latest.Value.Version, latest.Value.Url, latest.Value.Size);
if (d.ShowDialog() == true) { if (d.ShowDialog() == true) {
ShutdownNow(); ShutdownNow();
} }
}); });
} else if (showAlert) { } else if (showAlert) {
InteractionService.ShowInformation("Nach Updates suchen", $"Elwig ist auf dem aktuellsten Stand! (Version: {latest.Version})"); if (latest == null) {
InteractionService.ShowError("Nach Updates suchen", "Informationen konnten nicht abgerufen werden!");
} else {
InteractionService.ShowInformation("Nach Updates suchen", $"Elwig ist auf dem aktuellsten Stand! (Version: {latest.Value.Version})");
} }
} catch (Exception exc) {
if (showAlert)
InteractionService.ShowException("Nach Updates suchen", $"Informationen konnten nicht abgerufen werden!", exc);
} }
} }
@@ -395,15 +394,15 @@ namespace Elwig {
return FocusWindow<DeliveryAdminWindow>(() => new(mgnr), w => w.ViewModel.FilterMember?.MgNr == mgnr); return FocusWindow<DeliveryAdminWindow>(() => new(mgnr), w => w.ViewModel.FilterMember?.MgNr == mgnr);
} }
public static AreaCmtAdminWindow FocusMemberAreaCmts(int mgnr) { public static AreaComAdminWindow FocusMemberAreaComs(int mgnr) {
return FocusWindow<AreaCmtAdminWindow>(() => new(mgnr), w => w.ViewModel.FilterMember.MgNr == mgnr); return FocusWindow<AreaComAdminWindow>(() => new(mgnr), w => w.ViewModel.FilterMember.MgNr == mgnr);
} }
public static BaseDataWindow FocusBaseData() { public static BaseDataWindow FocusBaseData() {
return FocusWindow<BaseDataWindow>(() => new()); return FocusWindow<BaseDataWindow>(() => new());
} }
public static BaseDataWindow FocusBaseDataAreaCmtType() { public static BaseDataWindow FocusBaseDataAreaComType() {
var w = FocusBaseData(); var w = FocusBaseData();
w.AreaCommitmentTypes.Focus(); w.AreaCommitmentTypes.Focus();
return w; return w;
@@ -1,4 +1,4 @@
<Window x:Class="Elwig.Dialogs.AreaCmtModifyDialog" <Window x:Class="Elwig.Dialogs.AreaComModifyDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
@@ -4,7 +4,7 @@ using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
namespace Elwig.Dialogs { namespace Elwig.Dialogs {
public partial class AreaCmtModifyDialog : Window { public partial class AreaComModifyDialog : Window {
public int? YearTo { get; set; } public int? YearTo { get; set; }
public bool ModifyRetroactively { get; set; } public bool ModifyRetroactively { get; set; }
@@ -13,7 +13,7 @@ namespace Elwig.Dialogs {
public string OrigYearTo { get; set; } public string OrigYearTo { get; set; }
public string Area { get; set; } public string Area { get; set; }
public AreaCmtModifyDialog(int? yearFrom, int? yearTo, int area, bool delete, bool forceRetroactive = false) { public AreaComModifyDialog(int? yearFrom, int? yearTo, int area, bool delete, bool forceRetroactive = false) {
Area = $"{area:N0}"; Area = $"{area:N0}";
OrigYearFrom = $"{yearFrom}"; OrigYearFrom = $"{yearFrom}";
OrigYearTo = $"{yearTo}"; OrigYearTo = $"{yearTo}";
@@ -1,4 +1,4 @@
<Window x:Class="Elwig.Dialogs.AreaCmtTransferDialog" <Window x:Class="Elwig.Dialogs.AreaComTransferDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
@@ -35,11 +35,11 @@
<TextBlock x:Name="QuestionBlock1" TextAlignment="Center" Margin="0,10,0,0" <TextBlock x:Name="QuestionBlock1" TextAlignment="Center" Margin="0,10,0,0"
HorizontalAlignment="Center" VerticalAlignment="Top"> HorizontalAlignment="Center" VerticalAlignment="Top">
Sollen die aktiven Flächenbindungen des angegebenen Vorgängers<LineBreak/> Sollen die aktiven Flächenbindungen des angegebenen Vorgängers<LineBreak/>
übernommen werden? (<Run Text="{Binding AreaCmtNum}"/> FB, <Run Text="{Binding Area}"/> m²) übernommen werden? (<Run Text="{Binding AreaComNum}"/> FB, <Run Text="{Binding Area}"/> m²)
</TextBlock> </TextBlock>
<TextBlock x:Name="QuestionBlock2" TextAlignment="Center" Margin="0,10,0,0" Visibility="Hidden" <TextBlock x:Name="QuestionBlock2" TextAlignment="Center" Margin="0,10,0,0" Visibility="Hidden"
HorizontalAlignment="Center" VerticalAlignment="Top"> HorizontalAlignment="Center" VerticalAlignment="Top">
Sollen die aktiven Flächenbindungen gekündigt werden? (<Run Text="{Binding AreaCmtNum}"/> FB, <Run Text="{Binding Area}"/> m²) Sollen die aktiven Flächenbindungen gekündigt werden? (<Run Text="{Binding AreaComNum}"/> FB, <Run Text="{Binding Area}"/> m²)
</TextBlock> </TextBlock>
<Label x:Name="SeasonLabel" Content="Saison:" Margin="0,50,100,0" <Label x:Name="SeasonLabel" Content="Saison:" Margin="0,50,100,0"
@@ -3,17 +3,17 @@ using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
namespace Elwig.Dialogs { namespace Elwig.Dialogs {
public partial class AreaCmtTransferDialog : Window { public partial class AreaComTransferDialog : Window {
public int CancelSeason => SuccessorSeason - 1; public int CancelSeason => SuccessorSeason - 1;
public int SuccessorSeason { get; set; } public int SuccessorSeason { get; set; }
public string AreaCmtNum { get; set; } public string AreaComNum { get; set; }
public string Area { get; set; } public string Area { get; set; }
public AreaCmtTransferDialog(string name, int areaCmtNum, int area) { public AreaComTransferDialog(string name, int areaComNum, int area) {
SuccessorSeason = Utils.FollowingSeason; SuccessorSeason = Utils.FollowingSeason;
AreaCmtNum = $"{areaCmtNum:N0}"; AreaComNum = $"{areaComNum:N0}";
Area = $"{area:N0}"; Area = $"{area:N0}";
InitializeComponent(); InitializeComponent();
SeasonInput.Text = $"{SuccessorSeason}"; SeasonInput.Text = $"{SuccessorSeason}";
@@ -28,9 +28,9 @@ namespace Elwig.Dialogs {
SeasonLabel.Margin = new(0, 40, 100, 0); SeasonLabel.Margin = new(0, 40, 100, 0);
} }
public AreaCmtTransferDialog(string name, string successorName, int areaCmtNum, int area) { public AreaComTransferDialog(string name, string successorName, int areaComNum, int area) {
SuccessorSeason = Utils.FollowingSeason; SuccessorSeason = Utils.FollowingSeason;
AreaCmtNum = $"{areaCmtNum:N0}"; AreaComNum = $"{areaComNum:N0}";
Area = $"{area:N0}"; Area = $"{area:N0}";
InitializeComponent(); InitializeComponent();
SeasonInput.Text = $"{SuccessorSeason}"; SeasonInput.Text = $"{SuccessorSeason}";
+2 -2
View File
@@ -47,9 +47,9 @@
TextChanged="NameInput_TextChanged"/> TextChanged="NameInput_TextChanged"/>
<Label Content="Beim Löschen müssen folgende Daten auch gelöscht werden:" Margin="10,120,10,10"/> <Label Content="Beim Löschen müssen folgende Daten auch gelöscht werden:" Margin="10,120,10,10"/>
<CheckBox x:Name="AreaCmtInput" Content="Flächenbindungen" Margin="40,145,0,0" <CheckBox x:Name="AreaComInput" Content="Flächenbindungen" Margin="40,145,0,0"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed" Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
IsChecked="{Binding DeleteAreaCmts}"/> IsChecked="{Binding DeleteAreaComs}"/>
<CheckBox x:Name="DeliveryInput" Content="Lieferungen" Margin="40,165,0,0" <CheckBox x:Name="DeliveryInput" Content="Lieferungen" Margin="40,165,0,0"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed" Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
IsChecked="{Binding DeleteDeliveries}"/> IsChecked="{Binding DeleteDeliveries}"/>
+6 -6
View File
@@ -8,16 +8,16 @@ namespace Elwig.Dialogs {
protected string[] NameParts; protected string[] NameParts;
public bool DeleteAreaCmts { get; set; } public bool DeleteAreaComs { get; set; }
public bool DeleteDeliveries { get; set; } public bool DeleteDeliveries { get; set; }
public bool DeletePaymentData { get; set; } public bool DeletePaymentData { get; set; }
public DeleteMemberDialog(int mgnr, string name, int numAreaCmts, int numDeliveries, int numCredits) { public DeleteMemberDialog(int mgnr, string name, int numAreaComs, int numDeliveries, int numCredits) {
NameParts = name.ToLower().Split(' ').Where(p => p.Length > 0).Append($"{mgnr}").ToArray(); NameParts = name.ToLower().Split(' ').Where(p => p.Length > 0).Append($"{mgnr}").ToArray();
InitializeComponent(); InitializeComponent();
Title += " - " + name; Title += " - " + name;
AreaCmtInput.IsEnabled = numAreaCmts != 0; AreaComInput.IsEnabled = numAreaComs != 0;
AreaCmtInput.Content += $" ({numAreaCmts:N0})"; AreaComInput.Content += $" ({numAreaComs:N0})";
DeliveryInput.IsEnabled = numDeliveries != 0; DeliveryInput.IsEnabled = numDeliveries != 0;
DeliveryInput.Content += $" ({numDeliveries:N0})"; DeliveryInput.Content += $" ({numDeliveries:N0})";
PaymentInput.IsEnabled = numCredits != 0; PaymentInput.IsEnabled = numCredits != 0;
@@ -43,7 +43,7 @@ namespace Elwig.Dialogs {
private void Update() { private void Update() {
var t = NameInput.Text.ToLower().Split(' '); var t = NameInput.Text.ToLower().Split(' ');
var nameValid = NameParts.All(t.Contains); var nameValid = NameParts.All(t.Contains);
UpdateCheckBox(AreaCmtInput); UpdateCheckBox(AreaComInput);
UpdateCheckBox(DeliveryInput); UpdateCheckBox(DeliveryInput);
UpdateCheckBox(PaymentInput); UpdateCheckBox(PaymentInput);
if (!nameValid) { if (!nameValid) {
@@ -52,7 +52,7 @@ namespace Elwig.Dialogs {
ControlUtils.ClearInputState(NameInput); ControlUtils.ClearInputState(NameInput);
} }
ConfirmButton.IsEnabled = ConfirmButton.IsEnabled =
(!AreaCmtInput.IsEnabled || DeleteAreaCmts) && (!AreaComInput.IsEnabled || DeleteAreaComs) &&
(!DeliveryInput.IsEnabled || DeleteDeliveries) && (!DeliveryInput.IsEnabled || DeleteDeliveries) &&
(!PaymentInput.IsEnabled || DeletePaymentData) && (!PaymentInput.IsEnabled || DeletePaymentData) &&
nameValid; nameValid;
+1 -1
View File
@@ -74,7 +74,7 @@
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Part.DPNr}" Width="20" TextAlignment="Right" <TextBlock Text="{Binding Part.DPNr}" Width="20" TextAlignment="Right"
VerticalAlignment="Center" Margin="0,0,5,0" FontSize="14"/> VerticalAlignment="Center" Margin="0,0,5,0" FontSize="14"/>
<TextBlock Text="{Binding Part.SortId}" Foreground="{Binding Part.Variety.Color}" Width="40" TextAlignment="Center" <TextBlock Text="{Binding Part.SortId}" Width="40" TextAlignment="Center"
VerticalAlignment="Center" Margin="0,0,0,0" FontSize="14"/> VerticalAlignment="Center" Margin="0,0,0,0" FontSize="14"/>
<TextBlock Text="{Binding Part.Kmw, StringFormat='{}{0:N1}°'}" Width="40" TextAlignment="Right" Padding="0,0,10,0" <TextBlock Text="{Binding Part.Kmw, StringFormat='{}{0:N1}°'}" Width="40" TextAlignment="Right" Padding="0,0,10,0"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
@@ -2,6 +2,7 @@ using Elwig.Helpers;
using Elwig.Models.Entities; using Elwig.Models.Entities;
using Elwig.Windows; using Elwig.Windows;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
+2 -2
View File
@@ -77,13 +77,13 @@ namespace Elwig.Documents {
.AddCell(NewAsideCell("Betr.-Nr.:", 6, isName: true)).AddCell(NewAsideCell(Member.LfbisNr ?? "-", 6, right: true, center: Member.LfbisNr == null)) .AddCell(NewAsideCell("Betr.-Nr.:", 6, isName: true)).AddCell(NewAsideCell(Member.LfbisNr ?? "-", 6, right: true, center: Member.LfbisNr == null))
.AddCell(NewAsideCell("OOC-ID:", 6, isName: true)).AddCell(NewAsideCell(Member.OrganicOperatorId ?? "-", 8, right: true, center: Member.OrganicOperatorId == null)) .AddCell(NewAsideCell("OOC-ID:", 6, isName: true)).AddCell(NewAsideCell(Member.OrganicOperatorId ?? "-", 8, right: true, center: Member.OrganicOperatorId == null))
.AddCell(NewAsideCell("UID:", 6, isName: true)).AddCell(NewAsideCell(Member.UstIdNr ?? "-", 10, right: true, center: Member.UstIdNr == null)) .AddCell(NewAsideCell("UID:", 6, isName: true)).AddCell(NewAsideCell(Member.UstIdNr ?? "-", 10, right: true, center: Member.UstIdNr == null))
.AddCell(NewAsideCell(new KernedParagraph("", 10).Add(Italic(Member.IsAccounting ? "(buchführend)" : "(pauschaliert)")), 10, center: true)); .AddCell(NewAsideCell(new KernedParagraph("", 10).Add(Italic(Member.IsBuchführend ? "(buchführend)" : "(pauschaliert)")), 10, center: true));
} else { } else {
Aside Aside
.AddCell(NewAsideCell("Mitglieds-Nr.:", 12, isName: true)).AddCell(NewAsideCell($"{Member.MgNr}", 4, right: true)).AddCell(NewAsideCell("", 10)) .AddCell(NewAsideCell("Mitglieds-Nr.:", 12, isName: true)).AddCell(NewAsideCell($"{Member.MgNr}", 4, right: true)).AddCell(NewAsideCell("", 10))
.AddCell(NewAsideCell("Betriebs-Nr.:", 10, isName: true)).AddCell(NewAsideCell(Member.LfbisNr ?? "-", 6, right: true, center: Member.LfbisNr == null)).AddCell(NewAsideCell("", 10)) .AddCell(NewAsideCell("Betriebs-Nr.:", 10, isName: true)).AddCell(NewAsideCell(Member.LfbisNr ?? "-", 6, right: true, center: Member.LfbisNr == null)).AddCell(NewAsideCell("", 10))
.AddCell(NewAsideCell("UID:", 6, isName: true)).AddCell(NewAsideCell(Member.UstIdNr ?? "-", 10, right: true, center: Member.UstIdNr == null)) .AddCell(NewAsideCell("UID:", 6, isName: true)).AddCell(NewAsideCell(Member.UstIdNr ?? "-", 10, right: true, center: Member.UstIdNr == null))
.AddCell(NewAsideCell(new KernedParagraph("", 10).Add(Italic(Member.IsAccounting ? "(buchführend)" : "(pauschaliert)")), 10, center: true)); .AddCell(NewAsideCell(new KernedParagraph("", 10).Add(Italic(Member.IsBuchführend ? "(buchführend)" : "(pauschaliert)")), 10, center: true));
} }
} }
+22 -22
View File
@@ -23,7 +23,7 @@ namespace Elwig.Documents {
public int MemberDeliveredWeightWhite; public int MemberDeliveredWeightWhite;
public List<MemberHistory> MemberHistory = []; public List<MemberHistory> MemberHistory = [];
public Dictionary<string, MemberBucket> MemberBuckets = []; public Dictionary<string, MemberBucket> MemberBuckets = [];
public List<AreaCmt> ActiveAreaCommitments = []; public List<AreaCom> ActiveAreaCommitments = [];
public MemberDataSheet(Member m) : public MemberDataSheet(Member m) :
base($"{Name} {m.AdministrativeName}", m, DateOnly.FromDateTime(m.ModifiedAt)) { base($"{Name} {m.AdministrativeName}", m, DateOnly.FromDateTime(m.ModifiedAt)) {
@@ -68,9 +68,9 @@ namespace Elwig.Documents {
firstOnPage = true; firstOnPage = true;
} }
doc.Add(new KernedParagraph(12).Add(Bold($"Flächenbindungen per {Date:dd.MM.yyyy}")).SetMargins(firstOnPage ? 0 : 24, 0, 6, 0)); doc.Add(new KernedParagraph(12).Add(Bold($"Flächenbindungen per {Date:dd.MM.yyyy}")).SetMargins(firstOnPage ? 0 : 24, 0, 6, 0));
doc.Add(NewAreaCmtTable(ActiveAreaCommitments)); doc.Add(NewAreaComTable(ActiveAreaCommitments));
} }
if (App.Client.EnableMemberHistory && App.Client.ModeMemberDataSheetShares > 0) { if (App.Client.EnableMemberHistory) {
bool firstOnPage = false; bool firstOnPage = false;
if (pdf.GetNumberOfPages() == 1) { if (pdf.GetNumberOfPages() == 1) {
doc.Add(new AreaBreak(AreaBreakType.NEXT_PAGE)); doc.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
@@ -158,8 +158,8 @@ namespace Elwig.Documents {
.AddCell(NewDataTh("Betriebs-Nr.:")).AddCell(NewTd(Member.LfbisNr)) .AddCell(NewDataTh("Betriebs-Nr.:")).AddCell(NewTd(Member.LfbisNr))
.AddCell(NewDataTh("UID:", colspan: 2)).AddCell(NewTd(Member.UstIdNr, colspan: 2)) .AddCell(NewDataTh("UID:", colspan: 2)).AddCell(NewTd(Member.UstIdNr, colspan: 2))
.AddCell(NewDataTh("Stammgemeinde:")).AddCell(NewTd(Member.DefaultKg?.Name)) .AddCell(NewDataTh("Stammgemeinde:")).AddCell(NewTd(Member.DefaultKg?.Name))
.AddCell(NewDataTh("Buchführend:", colspan: 2)).AddCell(NewTd(new KernedParagraph(Member.IsAccounting ? "Ja " : "Nein ", 10) .AddCell(NewDataTh("Buchführend:", colspan: 2)).AddCell(NewTd(new KernedParagraph(Member.IsBuchführend ? "Ja " : "Nein ", 10)
.Add(Normal($"({(Member.IsAccounting ? season.VatNormal : season.VatFlatrate) * 100:N0}% USt.)", 8)), colspan: 2)) .Add(Normal($"({(Member.IsBuchführend ? season.VatNormal : season.VatFlatrate) * 100:N0}% USt.)", 8)), colspan: 2))
.AddCell(NewDataTh("(Katastralgemeinde mit dem größten Anteil an Weinbauflächen)", 8, colspan: 2)) .AddCell(NewDataTh("(Katastralgemeinde mit dem größten Anteil an Weinbauflächen)", 8, colspan: 2))
.AddCell(NewDataTh("Bio:", colspan: 2)).AddCell(NewTd(new KernedParagraph(Member.IsOrganic ? "Ja" : "Nein", 10) .AddCell(NewDataTh("Bio:", colspan: 2)).AddCell(NewTd(new KernedParagraph(Member.IsOrganic ? "Ja" : "Nein", 10)
.Add(Normal(Member.OrganicAuthorityCode != null || Member.OrganicOperatorId != null ? $" ({Member.OrganicAuthorityCode}{(Member.OrganicAuthorityCode != null && Member.OrganicOperatorId != null ? ", " : "")}{Member.OrganicOperatorId})" : "", 8)), colspan: 2)) .Add(Normal(Member.OrganicAuthorityCode != null || Member.OrganicOperatorId != null ? $" ({Member.OrganicAuthorityCode}{(Member.OrganicAuthorityCode != null && Member.OrganicOperatorId != null ? ", " : "")}{Member.OrganicOperatorId})" : "", 8)), colspan: 2))
@@ -168,19 +168,19 @@ namespace Elwig.Documents {
.Add(Normal("(" + (Member.ExitDate != null ? $"{Member.EntryDate:dd.MM.yyyy}\u2013{Member.ExitDate:dd.MM.yyyy}" : $"seit {Member.EntryDate:dd.MM.yyyy}") + ")", 8)))) .Add(Normal("(" + (Member.ExitDate != null ? $"{Member.EntryDate:dd.MM.yyyy}\u2013{Member.ExitDate:dd.MM.yyyy}" : $"seit {Member.EntryDate:dd.MM.yyyy}") + ")", 8))))
.AddCell(NewDataTh("Geschäftsanteile:", colspan: 2)).AddCell(NewTd(shares, colspan: 2)) .AddCell(NewDataTh("Geschäftsanteile:", colspan: 2)).AddCell(NewTd(shares, colspan: 2))
.AddCell(NewDataTh("Stamm-Zweigstelle:")).AddCell(NewTd(Member.Branch?.Name)) .AddCell(NewDataTh("Stamm-Zweigstelle:")).AddCell(NewTd(Member.Branch?.Name))
.AddCell(NewDataTh("Vollablieferer:", colspan: 2)).AddCell(NewTd(Member.IsFullDelivery ? "Ja" : "Nein", colspan: 2)) .AddCell(NewDataTh("Volllieferant:", colspan: 2)).AddCell(NewTd(Member.IsVollLieferant ? "Ja" : "Nein", colspan: 2))
.AddCell(NewDataTh("Zusendungen per\u2026")).AddCell(NewTd(new KernedParagraph(10) .AddCell(NewDataTh("Zusendungen per\u2026")).AddCell(NewTd(new KernedParagraph(10)
.Add(Italic("Post:")).Add(Normal(Member.ContactViaPost ? " Ja \u2013 " : " Nein \u2013 ")) .Add(Italic("Post:")).Add(Normal(Member.ContactViaPost ? " Ja \u2013 " : " Nein \u2013 "))
.Add(Italic("E-Mail:")).Add(Normal(Member.ContactViaEmail ? " Ja" : " Nein")))) .Add(Italic("E-Mail:")).Add(Normal(Member.ContactViaEmail ? " Ja" : " Nein"))))
.AddCell(NewDataTh("Funktionär:", colspan: 2)).AddCell(NewTd(Member.IsOfficer ? "Ja" : "Nein", colspan: 2)); .AddCell(NewDataTh("Funktionär:", colspan: 2)).AddCell(NewTd(Member.IsFunktionär ? "Ja" : "Nein", colspan: 2));
return tbl; return tbl;
} }
protected Table NewAreaCmtTable(IEnumerable<AreaCmt> activeAreaCmts) { protected Table NewAreaComTable(IEnumerable<AreaCom> activeAreaComs) {
var areaCmts = activeAreaCmts.GroupBy(a => a.AreaCmtType).Select(group => new { var areaComs = activeAreaComs.GroupBy(a => a.AreaComType).Select(group => new {
Type = group.Key, Type = group.Key,
AreaCmts = group.OrderBy(c => c.Contract.Kg.AtKg.Name).ToList(), AreaComs = group.OrderBy(c => c.Contract.Kg.AtKg.Name).ToList(),
Size = group.Sum(c => c.Area) Size = group.Sum(c => c.Area)
}).OrderByDescending(a => a.Size).ToList(); }).OrderByDescending(a => a.Size).ToList();
@@ -199,7 +199,7 @@ namespace Elwig.Documents {
.AddHeaderCell(NewTh("[m²]")); .AddHeaderCell(NewTh("[m²]"));
var lastContract = ""; var lastContract = "";
foreach (var contractType in areaCmts) { foreach (var contractType in areaComs) {
tbl.AddCell(NewCell(new KernedParagraph(10).Add(BoldItalic($"{contractType.Type.WineVar.Name} {(contractType.Type.WineAttr != null ? "(" + contractType.Type.WineAttr + ")" : "")}")), colspan: 3) tbl.AddCell(NewCell(new KernedParagraph(10).Add(BoldItalic($"{contractType.Type.WineVar.Name} {(contractType.Type.WineAttr != null ? "(" + contractType.Type.WineAttr + ")" : "")}")), colspan: 3)
.SetBorderTop(contractType.Type.DisplayName != lastContract && lastContract != "" ? new SolidBorder(BorderThickness) : Border.NO_BORDER)) .SetBorderTop(contractType.Type.DisplayName != lastContract && lastContract != "" ? new SolidBorder(BorderThickness) : Border.NO_BORDER))
.AddCell(NewCell(new KernedParagraph(10).Add(Bold($"{contractType.Size:N0}")).SetTextAlignment(TextAlignment.RIGHT)) .AddCell(NewCell(new KernedParagraph(10).Add(Bold($"{contractType.Size:N0}")).SetTextAlignment(TextAlignment.RIGHT))
@@ -207,20 +207,20 @@ namespace Elwig.Documents {
.AddCell(NewCell(colspan: 2) .AddCell(NewCell(colspan: 2)
.SetBorderTop(contractType.Type.DisplayName != lastContract && lastContract != "" ? new SolidBorder(BorderThickness) : Border.NO_BORDER)); .SetBorderTop(contractType.Type.DisplayName != lastContract && lastContract != "" ? new SolidBorder(BorderThickness) : Border.NO_BORDER));
foreach (var areaCmt in contractType.AreaCmts) { foreach (var areaCom in contractType.AreaComs) {
var c = areaCmt.Contract; var c = areaCom.Contract;
tbl.AddCell(NewTd(new KernedParagraph(10).Add(Normal($"{c.Kg.AtKg.Name} ")).Add(Normal($"({c.Kg.AtKg.KgNr:00000})", 8)))) tbl.AddCell(NewTd(new KernedParagraph(10).Add(Normal($"{c.Kg.AtKg.Name} ")).Add(Normal($"({c.Kg.AtKg.KgNr:00000})", 8))))
.AddCell(NewTd(c.Rd?.Name)) .AddCell(NewTd(c.Rd?.Name))
.AddCell(NewTd(Regex.Replace(areaCmt.GstNr.Replace(",", ", ").Replace("-", "\u2013"), @"\s+", " "), 10)) .AddCell(NewTd(Regex.Replace(areaCom.GstNr.Replace(",", ", ").Replace("-", "\u2013"), @"\s+", " "), 10))
.AddCell(NewTd($"{areaCmt.Area:N0}", right: true)) .AddCell(NewTd($"{areaCom.Area:N0}", right: true))
.AddCell(NewTd(areaCmt.WineCult?.Name, center: true)) .AddCell(NewTd(areaCom.WineCult?.Name, center: true))
.AddCell(NewTd(c.YearTo == null ? (c.YearFrom == null ? "unbefristet" : $"ab {c.YearFrom}") : (c.YearFrom == null ? $"bis {c.YearTo}" : $"{c.YearFrom}–{c.YearTo}"), center: true)); .AddCell(NewTd(c.YearTo == null ? (c.YearFrom == null ? "unbefristet" : $"ab {c.YearFrom}") : (c.YearFrom == null ? $"bis {c.YearTo}" : $"{c.YearFrom}–{c.YearTo}"), center: true));
lastContract = contractType.Type.DisplayName; lastContract = contractType.Type.DisplayName;
} }
} }
tbl.AddCell(NewTd("Gesamt:", 12, colspan: 2, bold: true, borderTop: true).SetPaddingsMM(1, 1, 1, 1)); tbl.AddCell(NewTd("Gesamt:", 12, colspan: 2, bold: true, borderTop: true).SetPaddingsMM(1, 1, 1, 1));
tbl.AddCell(NewTd($"{activeAreaCmts.Sum(a => a.Area):N0}", 12, colspan: 2, right: true, bold: true, borderTop: true).SetPaddingsMM(1, 1, 1, 1)); tbl.AddCell(NewTd($"{activeAreaComs.Sum(a => a.Area):N0}", 12, colspan: 2, right: true, bold: true, borderTop: true).SetPaddingsMM(1, 1, 1, 1));
tbl.AddCell(NewTd(colspan: 2, borderTop: true).SetPaddingsMM(1, 1, 1, 1)); tbl.AddCell(NewTd(colspan: 2, borderTop: true).SetPaddingsMM(1, 1, 1, 1));
return tbl; return tbl;
@@ -275,10 +275,10 @@ namespace Elwig.Documents {
} }
var recorded = history.Aggregate(new MemberHistoryPoint(), (s, h) => new( var recorded = history.Aggregate(new MemberHistoryPoint(), (s, h) => new(
s.Shares + (h.ToMgNr == Member.MgNr && h.ToType == BusinessShareType.Normal ? h.Shares : 0) - (h.ToMgNr == h.FromMgNr && h.ToType == BusinessShareType.Normal && h.FromType == BusinessShareType.Normal ? 0 : h.FromMgNr == Member.MgNr && h.FromType == BusinessShareType.Normal ? h.Shares : 0), s.Shares + (h.ToMgNr == Member.MgNr && h.ToType == BusinessShareType.Normal ? h.Shares : 0) - (h.FromMgNr == Member.MgNr && h.FromType == BusinessShareType.Normal ? h.Shares : 0),
s.SharesRed + (h.ToMgNr == Member.MgNr && h.ToType == BusinessShareType.Red ? h.Shares : 0) - (h.ToMgNr == h.FromMgNr && h.ToType == BusinessShareType.Red && h.FromType == BusinessShareType.Red ? 0 : h.FromMgNr == Member.MgNr && h.FromType == BusinessShareType.Red ? h.Shares : 0), s.SharesRed + (h.ToMgNr == Member.MgNr && h.ToType == BusinessShareType.Red ? h.Shares : 0) - (h.FromMgNr == Member.MgNr && h.FromType == BusinessShareType.Red ? h.Shares : 0),
s.SharesWhite + (h.ToMgNr == Member.MgNr && h.ToType == BusinessShareType.White ? h.Shares : 0) - (h.ToMgNr == h.FromMgNr && h.ToType == BusinessShareType.White && h.FromType == BusinessShareType.White ? 0 : h.FromMgNr == Member.MgNr && h.FromType == BusinessShareType.White ? h.Shares : 0), s.SharesWhite + (h.ToMgNr == Member.MgNr && h.ToType == BusinessShareType.White ? h.Shares : 0) - (h.FromMgNr == Member.MgNr && h.FromType == BusinessShareType.White ? h.Shares : 0),
s.SharesDormant + (h.ToMgNr == Member.MgNr && h.ToType == BusinessShareType.Dormant ? h.Shares : 0) - (h.ToMgNr == h.FromMgNr && h.ToType == BusinessShareType.Dormant && h.FromType == BusinessShareType.Dormant ? 0 : h.FromMgNr == Member.MgNr && h.FromType == BusinessShareType.Dormant ? h.Shares : 0))); s.SharesDormant + (h.ToMgNr == Member.MgNr && h.ToType == BusinessShareType.Dormant ? h.Shares : 0) - (h.FromMgNr == Member.MgNr && h.FromType == BusinessShareType.Dormant ? h.Shares : 0)));
var cur = new MemberHistoryPoint(Member.Shares - recorded.Shares, Member.SharesRed - recorded.SharesRed, Member.SharesWhite - recorded.SharesWhite, Member.SharesDormant - recorded.SharesDormant); var cur = new MemberHistoryPoint(Member.Shares - recorded.Shares, Member.SharesRed - recorded.SharesRed, Member.SharesWhite - recorded.SharesWhite, Member.SharesDormant - recorded.SharesDormant);
if (cur.Shares != 0 || cur.SharesRed != 0 || cur.SharesWhite != 0 || cur.SharesDormant != 0) { if (cur.Shares != 0 || cur.SharesRed != 0 || cur.SharesWhite != 0 || cur.SharesDormant != 0) {
@@ -297,7 +297,7 @@ namespace Elwig.Documents {
DateOnly? lastDate = null; DateOnly? lastDate = null;
foreach (var row in history) { foreach (var row in history) {
int s = 0, r = 0, w = 0, d = 0; int s = 0, r = 0, w = 0, d = 0;
if (row.FromMgNr == Member.MgNr && !(row.FromMgNr == row.ToMgNr && row.FromType == row.ToType)) { if (row.FromMgNr == Member.MgNr) {
switch (row.FromType) { switch (row.FromType) {
case BusinessShareType.Normal: s -= row.Shares; break; case BusinessShareType.Normal: s -= row.Shares; break;
case BusinessShareType.Red: r -= row.Shares; break; case BusinessShareType.Red: r -= row.Shares; break;
+14 -14
View File
@@ -16,14 +16,14 @@ namespace Elwig.Documents {
public string Filter; public string Filter;
public List<MemberListRow> Members; public List<MemberListRow> Members;
public string[] AreaCmtFilters; public string[] AreaComFilters;
public bool FilterAreaCmts => AreaCmtFilters.Length > 0; public bool FilterAreaComs => AreaComFilters.Length > 0;
public MemberList(string filter, IEnumerable<MemberListRow> members) : public MemberList(string filter, IEnumerable<MemberListRow> members) :
base(Name) { base(Name) {
Filter = filter; Filter = filter;
Members = [.. members]; Members = [.. members];
AreaCmtFilters = [..members AreaComFilters = [..members
.SelectMany(m => m.AreaCommitmentsFiltered) .SelectMany(m => m.AreaCommitmentsFiltered)
.Select(c => c.VtrgId) .Select(c => c.VtrgId)
.Distinct() .Distinct()
@@ -46,11 +46,11 @@ namespace Elwig.Documents {
} }
protected Table NewMemberTable(List<MemberListRow> members) { protected Table NewMemberTable(List<MemberListRow> members) {
var tbl = new Table(AreaCmtFilters.Length > 1 ? ColsMM(8, 38, 36, 8, 18, 12, 5, 16, 12, 12) : ColsMM(8, 42, 40, 8, 20, 12, 5, 18, 12), true) var tbl = new Table(AreaComFilters.Length > 1 ? ColsMM(8, 38, 36, 8, 18, 12, 5, 16, 12, 12) : ColsMM(8, 42, 40, 8, 20, 12, 5, 18, 12), true)
.SetWidth(UnitValue.CreatePercentValue(100)).SetFixedLayout() .SetWidth(UnitValue.CreatePercentValue(100)).SetFixedLayout()
.SetBorderCollapse(BorderCollapsePropertyValue.COLLAPSE); .SetBorderCollapse(BorderCollapsePropertyValue.COLLAPSE);
var headerSpan = FilterAreaCmts ? 3 : 2; var headerSpan = FilterAreaComs ? 3 : 2;
tbl.AddHeaderCell(NewTh("Nr.", rowspan: headerSpan)) tbl.AddHeaderCell(NewTh("Nr.", rowspan: headerSpan))
.AddHeaderCell(NewTh("Name", rowspan: headerSpan, left: true)) .AddHeaderCell(NewTh("Name", rowspan: headerSpan, left: true))
.AddHeaderCell(NewTh("Adresse", rowspan: headerSpan, left: true)) .AddHeaderCell(NewTh("Adresse", rowspan: headerSpan, left: true))
@@ -59,21 +59,21 @@ namespace Elwig.Documents {
.AddHeaderCell(NewTh("Betr.-Nr.", rowspan: headerSpan)) .AddHeaderCell(NewTh("Betr.-Nr.", rowspan: headerSpan))
.AddHeaderCell(NewTh("GA", rowspan: headerSpan).SetPaddingLeft(0).SetPaddingRight(0)) .AddHeaderCell(NewTh("GA", rowspan: headerSpan).SetPaddingLeft(0).SetPaddingRight(0))
.AddHeaderCell(NewTh("Stamm-KG", rowspan: headerSpan, left: true)) .AddHeaderCell(NewTh("Stamm-KG", rowspan: headerSpan, left: true))
.AddHeaderCell(NewTh("Geb. Fl.", colspan: FilterAreaCmts ? AreaCmtFilters.Length : 1)); .AddHeaderCell(NewTh("Geb. Fl.", colspan: FilterAreaComs ? AreaComFilters.Length : 1));
if (FilterAreaCmts) { if (FilterAreaComs) {
foreach (var vtrgId in AreaCmtFilters) { foreach (var vtrgId in AreaComFilters) {
tbl.AddHeaderCell(NewTh(vtrgId)); tbl.AddHeaderCell(NewTh(vtrgId));
} }
} }
for (int i = 0; i < (FilterAreaCmts ? AreaCmtFilters.Length : 1); i++) { for (int i = 0; i < (FilterAreaComs ? AreaComFilters.Length : 1); i++) {
tbl.AddHeaderCell(NewTh("[m²]")); tbl.AddHeaderCell(NewTh("[m²]"));
} }
string? lastBranch = members.Select(m => m.Branch).Distinct().Count() == 1 ? null : ""; string? lastBranch = members.Select(m => m.Branch).Distinct().Count() == 1 ? null : "";
foreach (var m in members) { foreach (var m in members) {
if (lastBranch != null && m.Branch != lastBranch) { if (lastBranch != null && m.Branch != lastBranch) {
tbl.AddCell(NewCell(colspan: 8 + Math.Max(AreaCmtFilters.Length, 1)).SetHeightMM(5).SetKeepWithNext(true)); tbl.AddCell(NewCell(colspan: 8 + Math.Max(AreaComFilters.Length, 1)).SetHeightMM(5).SetKeepWithNext(true));
tbl.AddCell(NewCell(new KernedParagraph(m.Branch ?? "", 16).SetFont(BF), colspan: 8 + Math.Max(AreaCmtFilters.Length, 1)) tbl.AddCell(NewCell(new KernedParagraph(m.Branch ?? "", 16).SetFont(BF), colspan: 8 + Math.Max(AreaComFilters.Length, 1))
.SetPaddingsMM(1, 2, 1, 2) .SetPaddingsMM(1, 2, 1, 2)
.SetBorder(new SolidBorder(BorderThickness)) .SetBorder(new SolidBorder(BorderThickness))
.SetBackgroundColor(new DeviceRgb(0xe0, 0xe0, 0xe0))); .SetBackgroundColor(new DeviceRgb(0xe0, 0xe0, 0xe0)));
@@ -88,8 +88,8 @@ namespace Elwig.Documents {
.AddCell(NewTd(m.LfbisNr ?? "", 8)) .AddCell(NewTd(m.LfbisNr ?? "", 8))
.AddCell(NewTd($"{m.SharesActive:N0}", 8, right: true).SetPaddingLeft(0).SetPaddingRight(0)) .AddCell(NewTd($"{m.SharesActive:N0}", 8, right: true).SetPaddingLeft(0).SetPaddingRight(0))
.AddCell(NewTd(m.DefaultKg ?? "", 6)); .AddCell(NewTd(m.DefaultKg ?? "", 6));
if (AreaCmtFilters.Length > 0) { if (AreaComFilters.Length > 0) {
foreach (var v in AreaCmtFilters) { foreach (var v in AreaComFilters) {
tbl.AddCell(NewTd($"{m.AreaCommitmentsFiltered.FirstOrDefault(c => c.VtrgId == v).Area:N0}", 8, right: true)); tbl.AddCell(NewTd($"{m.AreaCommitmentsFiltered.FirstOrDefault(c => c.VtrgId == v).Area:N0}", 8, right: true));
} }
} else { } else {
@@ -101,7 +101,7 @@ namespace Elwig.Documents {
.AddCell(NewTd(m.BillingAddress ?? "", 8)) .AddCell(NewTd(m.BillingAddress ?? "", 8))
.AddCell(NewTd($"{m.BillingPlz}", 8)) .AddCell(NewTd($"{m.BillingPlz}", 8))
.AddCell(NewTd(m.BillingLocality ?? "", 6)) .AddCell(NewTd(m.BillingLocality ?? "", 6))
.AddCell(NewTd(colspan: 3 + Math.Max(AreaCmtFilters.Length, 1))); .AddCell(NewTd(colspan: 3 + Math.Max(AreaComFilters.Length, 1)));
} }
} }
+22 -22
View File
@@ -108,16 +108,16 @@ namespace Elwig.Documents {
var totalSum = _credits.Sum(p => p.Amount); var totalSum = _credits.Sum(p => p.Amount);
var weiRows = data.Rows.Where(r => r.QualityLevel == "Wein"); var weiRows = data.Rows.Where(r => r.QualityLevel == "Wein");
var minWei = weiRows.Min(r => r.UnCtrd.MinPrice); var minWei = weiRows.Min(r => r.Ungeb.MinPrice);
var maxWei = weiRows.Max(r => r.UnCtrd.MaxPrice); var maxWei = weiRows.Max(r => r.Ungeb.MaxPrice);
var quwRows = data.Rows.Where(r => r.QualityLevel != "Wein"); var quwRows = data.Rows.Where(r => r.QualityLevel != "Wein");
var minPrice = quwRows.Min(r => r.UnCtrd.MinPrice); var minPrice = quwRows.Min(r => r.Ungeb.MinPrice);
var maxPrice = quwRows.Max(r => r.UnCtrd.MaxPrice); var maxPrice = quwRows.Max(r => r.Ungeb.MaxPrice);
var ctrdRows = data.Rows var gebRows = data.Rows
.Where(r => r.Ctrd.MaxPrice != null && r.UnCtrd.MinPrice != null) .Where(r => r.Geb.MaxPrice != null && r.Ungeb.MinPrice != null)
.Select(r => r.Ctrd.MaxPrice - r.UnCtrd.MinPrice); .Select(r => r.Geb.MaxPrice - r.Ungeb.MinPrice);
var minCtrd = ctrdRows.Min(); var minGeb = gebRows.Min();
var maxCtrd = ctrdRows.Max(); var maxGeb = gebRows.Max();
tbl.AddCell(NewSectionHdr("Allgemein", colspan: 5)) tbl.AddCell(NewSectionHdr("Allgemein", colspan: 5))
.AddCell(NewSectionHdr("Berücksichtigt", colspan: 3, borderLeft: true)) .AddCell(NewSectionHdr("Berücksichtigt", colspan: 3, borderLeft: true))
@@ -197,7 +197,7 @@ namespace Elwig.Documents {
.AddCell(NewTd(CurrencySymbol)) .AddCell(NewTd(CurrencySymbol))
.AddCell(NewTd($"{Math.Abs(vat):N2}", right: true)) .AddCell(NewTd($"{Math.Abs(vat):N2}", right: true))
.AddCell(NewSectionTh("Gebunden-Zuschlag:", borderLeft: true)) .AddCell(NewSectionTh("Gebunden-Zuschlag:", borderLeft: true))
.AddCell(NewTd(minCtrd == null && maxCtrd == null ? "-" : minCtrd != maxCtrd ? $"{minCtrd:N4}\u2013{maxCtrd:N4} {CurrencySymbol}/kg" : minCtrd == 0 ? "-" : $"{minCtrd:N4} {CurrencySymbol}/kg", colspan: 2, center: true)) .AddCell(NewTd(minGeb == null && maxGeb == null ? "-" : minGeb != maxGeb ? $"{minGeb:N4}\u2013{maxGeb:N4} {CurrencySymbol}/kg" : minGeb == 0 ? "-" : $"{minGeb:N4} {CurrencySymbol}/kg", colspan: 2, center: true))
.AddCell(NewSectionTh("Bruttosumme:", colspan: 2)) .AddCell(NewSectionTh("Bruttosumme:", colspan: 2))
.AddCell(NewTd(borderTop: true)) .AddCell(NewTd(borderTop: true))
@@ -211,21 +211,21 @@ namespace Elwig.Documents {
.AddCell(NewTd(CurrencySymbol)) .AddCell(NewTd(CurrencySymbol))
.AddCell(NewTd($"{Math.Abs(totalMods):N2}", right: true)) .AddCell(NewTd($"{Math.Abs(totalMods):N2}", right: true))
.AddCell(NewSectionTh("Menge (ungebunden):", borderLeft: true, borderTop: true)) .AddCell(NewSectionTh("Menge (ungebunden):", borderLeft: true, borderTop: true))
.AddCell(NewTd($"{data.Rows.Sum(r => r.UnCtrd.Weight):N0} kg", colspan: 2, right: true, borderTop: true)) .AddCell(NewTd($"{data.Rows.Sum(r => r.Ungeb.Weight):N0} kg", colspan: 2, right: true, borderTop: true))
.AddCell(NewSectionTh("Bereits berücksichtigte Abzüge:", colspan: 2)) .AddCell(NewSectionTh("Bereits berücksichtigte Abzüge:", colspan: 2))
.AddCell(NewTd(Utils.GetSign(considered))) .AddCell(NewTd(Utils.GetSign(considered)))
.AddCell(NewTd(CurrencySymbol)) .AddCell(NewTd(CurrencySymbol))
.AddCell(NewTd($"{Math.Abs(considered):N2}", right: true)) .AddCell(NewTd($"{Math.Abs(considered):N2}", right: true))
.AddCell(NewSectionTh("Menge (gebunden):", borderLeft: true)) .AddCell(NewSectionTh("Menge (gebunden):", borderLeft: true))
.AddCell(NewTd($"{data.Rows.Sum(r => r.Ctrd.Weight + r.LowCtrd.Weight):N0} kg", colspan: 2, right: true)) .AddCell(NewTd($"{data.Rows.Sum(r => r.Geb.Weight + r.LowGeb.Weight):N0} kg", colspan: 2, right: true))
.AddCell(NewSectionTh("Auszahlungsbetrag:", colspan: 2)) .AddCell(NewSectionTh("Auszahlungsbetrag:", colspan: 2))
.AddCell(NewTd(borderTop: true)) .AddCell(NewTd(borderTop: true))
.AddCell(NewTd(CurrencySymbol, borderTop: true)) .AddCell(NewTd(CurrencySymbol, borderTop: true))
.AddCell(NewTd($"{totalSum:N2}", right: true, borderTop: true)) .AddCell(NewTd($"{totalSum:N2}", right: true, borderTop: true))
.AddCell(NewSectionTh("Gesamtmenge:", borderLeft: true)) .AddCell(NewSectionTh("Gesamtmenge:", borderLeft: true))
.AddCell(NewTd($"{data.Rows.Sum(r => r.UnCtrd.Weight + r.LowCtrd.Weight + r.Ctrd.Weight):N0} kg", colspan: 2, right: true, borderTop: true)); .AddCell(NewTd($"{data.Rows.Sum(r => r.Ungeb.Weight + r.LowGeb.Weight + r.Geb.Weight):N0} kg", colspan: 2, right: true, borderTop: true));
return tbl; return tbl;
} }
@@ -290,22 +290,22 @@ namespace Elwig.Documents {
.ToList(); .ToList();
var border = lastHdr != null; var border = lastHdr != null;
tbl.AddCell(NewTd(hdr, colspan: 2, bold: true, italic: true, borderTop: border)) tbl.AddCell(NewTd(hdr, colspan: 2, bold: true, italic: true, borderTop: border))
.AddCell(NewTd($"{rows.Sum(r => r.UnCtrd.Weight):N0}", right: true, bold: true, borderTop: border)) .AddCell(NewTd($"{rows.Sum(r => r.Ungeb.Weight):N0}", right: true, bold: true, borderTop: border))
.AddCell(NewTd(borderTop: border)) .AddCell(NewTd(borderTop: border))
.AddCell(NewTd($"{rows.Sum(r => r.LowCtrd.Weight):N0}", right: true, bold: true, borderTop: border)) .AddCell(NewTd($"{rows.Sum(r => r.LowGeb.Weight):N0}", right: true, bold: true, borderTop: border))
.AddCell(NewTd(borderTop: border)) .AddCell(NewTd(borderTop: border))
.AddCell(NewTd($"{rows.Sum(r => r.Ctrd.Weight):N0}", right: true, bold: true, borderTop: border)) .AddCell(NewTd($"{rows.Sum(r => r.Geb.Weight):N0}", right: true, bold: true, borderTop: border))
.AddCell(NewTd(borderTop: border)) .AddCell(NewTd(borderTop: border))
.AddCell(NewTd($"{rows.Sum(r => r.Amount):N2}", right: true, bold: true, borderTop: border)); .AddCell(NewTd($"{rows.Sum(r => r.Amount):N2}", right: true, bold: true, borderTop: border));
} }
tbl.AddCell(NewTd(row.QualityLevel)) tbl.AddCell(NewTd(row.QualityLevel))
.AddCell(NewTd($"{row.Oe:N0}", center: true)) .AddCell(NewTd($"{row.Oe:N0}", center: true))
.AddCell(NewTd(row.UnCtrd.Weight != 0 ? $"{row.UnCtrd.Weight:N0}" : "-", right: true)) .AddCell(NewTd(row.Ungeb.Weight != 0 ? $"{row.Ungeb.Weight:N0}" : "-", right: true))
.AddCell(NewTd(row.UnCtrd.MaxPrice != null ? $"{row.UnCtrd.MaxPrice:N4}" : "-", right: true)) .AddCell(NewTd(row.Ungeb.MaxPrice != null ? $"{row.Ungeb.MaxPrice:N4}" : "-", right: true))
.AddCell(NewTd(row.LowCtrd.Weight != 0 ? $"{row.LowCtrd.Weight:N0}" : "-", right: true)) .AddCell(NewTd(row.LowGeb.Weight != 0 ? $"{row.LowGeb.Weight:N0}" : "-", right: true))
.AddCell(NewTd(row.LowCtrd.MaxPrice != null ? $"{row.LowCtrd.MaxPrice:N4}" : "-", right: true)) .AddCell(NewTd(row.LowGeb.MaxPrice != null ? $"{row.LowGeb.MaxPrice:N4}" : "-", right: true))
.AddCell(NewTd(row.Ctrd.Weight != 0 ? $"{row.Ctrd.Weight:N0}" : "-", right: true)) .AddCell(NewTd(row.Geb.Weight != 0 ? $"{row.Geb.Weight:N0}" : "-", right: true))
.AddCell(NewTd(row.Ctrd.MaxPrice != null ? $"{row.Ctrd.MaxPrice:N4}" : "-", right: true)) .AddCell(NewTd(row.Geb.MaxPrice != null ? $"{row.Geb.MaxPrice:N4}" : "-", right: true))
.AddCell(NewTd($"{row.Amount:N2}", right: true)); .AddCell(NewTd($"{row.Amount:N2}", right: true));
lastHdr = hdr; lastHdr = hdr;
} }
+5 -5
View File
@@ -9,7 +9,7 @@
<UseWindowsForms>true</UseWindowsForms> <UseWindowsForms>true</UseWindowsForms>
<PreserveCompilationContext>true</PreserveCompilationContext> <PreserveCompilationContext>true</PreserveCompilationContext>
<ApplicationIcon>Resources\Images\Elwig.ico</ApplicationIcon> <ApplicationIcon>Resources\Images\Elwig.ico</ApplicationIcon>
<Version>1.2.0.1</Version> <Version>1.1.2.2</Version>
<SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages> <SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<ApplicationManifest>App.manifest</ApplicationManifest> <ApplicationManifest>App.manifest</ApplicationManifest>
@@ -23,11 +23,11 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="bblanchon.PDFium.Win32" Version="157.0.8086" /> <PackageReference Include="bblanchon.PDFium.Win32" Version="156.0.8076" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.2" /> <PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.2" />
<PackageReference Include="itext" Version="9.8.0" /> <PackageReference Include="itext" Version="9.7.0" />
<PackageReference Include="itext.bouncy-castle-adapter" Version="9.8.0" /> <PackageReference Include="itext.bouncy-castle-adapter" Version="9.7.0" />
<PackageReference Include="LinqKit" Version="1.4.0" /> <PackageReference Include="LinqKit" Version="1.3.11" />
<PackageReference Include="MailKit" Version="4.18.1" /> <PackageReference Include="MailKit" Version="4.18.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.12" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.12" />
<PackageReference Include="Microsoft.Extensions.Configuration.Ini" Version="10.0.12" /> <PackageReference Include="Microsoft.Extensions.Configuration.Ini" Version="10.0.12" />
+19 -58
View File
@@ -1,4 +1,3 @@
using Elwig.Models;
using Elwig.Models.Dtos; using Elwig.Models.Dtos;
using Elwig.Models.Entities; using Elwig.Models.Entities;
using Elwig.Services; using Elwig.Services;
@@ -16,7 +15,7 @@ using System.Threading.Tasks;
namespace Elwig.Helpers { namespace Elwig.Helpers {
public record struct MemberHistoryPoint(int Shares, int SharesRed, int SharesWhite, int SharesDormant); public record struct MemberHistoryPoint(int Shares, int SharesRed, int SharesWhite, int SharesDormant);
public record struct AreaCmtBucket(int Area, int Obligation, int Right); public record struct AreaComBucket(int Area, int Obligation, int Right);
public record struct UnderDelivery(int Weight, int Diff); public record struct UnderDelivery(int Weight, int Diff);
public record struct MemberBucket(string Name, int Area, int Obligation, int Right, int Delivery, int DeliveryStrict, int DeliveryTotal, int Payment); public record struct MemberBucket(string Name, int Area, int Obligation, int Right, int Delivery, int DeliveryStrict, int DeliveryTotal, int Payment);
public record struct MemberStat(string Variety, string Discr, int Weight); public record struct MemberStat(string Variety, string Discr, int Weight);
@@ -44,14 +43,14 @@ namespace Elwig.Helpers {
public DbSet<WineAttr> WineAttributes { get; private set; } public DbSet<WineAttr> WineAttributes { get; private set; }
public DbSet<WineCult> WineCultivations { get; private set; } public DbSet<WineCult> WineCultivations { get; private set; }
public DbSet<Branch> Branches { get; private set; } public DbSet<Branch> Branches { get; private set; }
public DbSet<AreaCmtType> AreaCommitmentTypes { get; private set; } public DbSet<AreaComType> AreaCommitmentTypes { get; private set; }
public DbSet<Member> Members { get; private set; } public DbSet<Member> Members { get; private set; }
public DbSet<BillingAddr> BillingAddresses { get; private set; } public DbSet<BillingAddr> BillingAddresses { get; private set; }
public DbSet<MemberTelNr> MemberTelephoneNrs { get; private set; } public DbSet<MemberTelNr> MemberTelephoneNrs { get; private set; }
public DbSet<MemberEmailAddr> MemberEmailAddrs { get; private set; } public DbSet<MemberEmailAddr> MemberEmailAddrs { get; private set; }
public DbSet<MemberHistory> MemberHistory { get; private set; } public DbSet<MemberHistory> MemberHistory { get; private set; }
public DbSet<AreaCmtContract> AreaCommitmentContracts { get; private set; } public DbSet<AreaComContract> AreaCommitmentContracts { get; private set; }
public DbSet<AreaCmt> AreaCommitments { get; private set; } public DbSet<AreaCom> AreaCommitments { get; private set; }
public DbSet<Season> Seasons { get; private set; } public DbSet<Season> Seasons { get; private set; }
public DbSet<DeliverySchedule> DeliverySchedules { get; private set; } public DbSet<DeliverySchedule> DeliverySchedules { get; private set; }
public DbSet<DeliveryScheduleWineVar> DeliveryScheduleWineVarieties { get; private set; } public DbSet<DeliveryScheduleWineVar> DeliveryScheduleWineVarieties { get; private set; }
@@ -68,10 +67,10 @@ namespace Elwig.Helpers {
public DbSet<DeliveryPartBucket> DeliveryPartBuckets { get; private set; } public DbSet<DeliveryPartBucket> DeliveryPartBuckets { get; private set; }
public DbSet<OverUnderDeliveryRow> OverUnderDeliveryRows { get; private set; } public DbSet<OverUnderDeliveryRow> OverUnderDeliveryRows { get; private set; }
public DbSet<AreaCmtUnderDeliveryRowSingle> AreaCmtUnderDeliveryRows { 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<MemberAreaCmtTotalsRowSingle> MemberAreaCmtTotalsRows { get; private set; } public DbSet<MemberAreaComTotalsRowSingle> MemberAreaComTotalsRows { get; private set; }
public DbSet<MemberAreaCmtsRow> MemberAreaCmtsRows { 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; }
@@ -133,8 +132,8 @@ namespace Elwig.Helpers {
.OrderBy(m => m.Name).ThenBy(m => m.GivenName).ThenBy(m => m.MgNr) .OrderBy(m => m.Name).ThenBy(m => m.GivenName).ThenBy(m => m.MgNr)
.AsSplitQuery()); .AsSplitQuery());
private static readonly Func<AppDbContext, int?, IAsyncEnumerable<AreaCmt>> _compiledQueryAreaCommitments = private static readonly Func<AppDbContext, int?, IAsyncEnumerable<AreaCom>> _compiledQueryAreaCommitments =
EF.CompileAsyncQuery<AppDbContext, int?, AreaCmt>((ctx, fbnr) => ctx.AreaCommitments EF.CompileAsyncQuery<AppDbContext, int?, AreaCom>((ctx, fbnr) => ctx.AreaCommitments
.Where(c => fbnr == null || c.FbNr == fbnr) .Where(c => fbnr == null || c.FbNr == fbnr)
.OrderBy(c => c.FbNr).ThenBy(c => c.RevNr)); .OrderBy(c => c.FbNr).ThenBy(c => c.RevNr));
@@ -150,7 +149,7 @@ namespace Elwig.Helpers {
.OrderByDescending(s => s.Year)); .OrderByDescending(s => s.Year));
private readonly Dictionary<int, Dictionary<int, MemberHistoryPoint>> _memberHistory = []; private readonly Dictionary<int, Dictionary<int, MemberHistoryPoint>> _memberHistory = [];
private readonly Dictionary<int, Dictionary<int, Dictionary<string, AreaCmtBucket>>> _memberAreaCommitmentBuckets = []; private readonly Dictionary<int, Dictionary<int, Dictionary<string, AreaComBucket>>> _memberAreaCommitmentBuckets = [];
private readonly Dictionary<int, Dictionary<int, Dictionary<string, int>>> _memberDeliveryBuckets = []; private readonly Dictionary<int, Dictionary<int, Dictionary<string, int>>> _memberDeliveryBuckets = [];
private readonly Dictionary<int, Dictionary<int, Dictionary<string, int>>> _memberDeliveryBucketsStrict = []; private readonly Dictionary<int, Dictionary<int, Dictionary<string, int>>> _memberDeliveryBucketsStrict = [];
private readonly Dictionary<int, Dictionary<int, Dictionary<string, int>>> _memberPaymentBuckets = []; private readonly Dictionary<int, Dictionary<int, Dictionary<string, int>>> _memberPaymentBuckets = [];
@@ -230,13 +229,13 @@ namespace Elwig.Helpers {
modelBuilder.Entity<DeliveryPart>().Navigation(p => p.Kg).AutoInclude(); modelBuilder.Entity<DeliveryPart>().Navigation(p => p.Kg).AutoInclude();
modelBuilder.Entity<DeliveryPart>().Navigation(p => p.Rd).AutoInclude(); modelBuilder.Entity<DeliveryPart>().Navigation(p => p.Rd).AutoInclude();
modelBuilder.Entity<DeliveryPartModifier>().Navigation(m => m.Modifier).AutoInclude(); modelBuilder.Entity<DeliveryPartModifier>().Navigation(m => m.Modifier).AutoInclude();
modelBuilder.Entity<AreaCmtContract>().Navigation(c => c.Kg).AutoInclude(); modelBuilder.Entity<AreaComContract>().Navigation(c => c.Kg).AutoInclude();
modelBuilder.Entity<AreaCmtContract>().Navigation(c => c.Rd).AutoInclude(); modelBuilder.Entity<AreaComContract>().Navigation(c => c.Rd).AutoInclude();
modelBuilder.Entity<AreaCmt>().Navigation(c => c.Contract).AutoInclude(); modelBuilder.Entity<AreaCom>().Navigation(c => c.Contract).AutoInclude();
modelBuilder.Entity<AreaCmt>().Navigation(c => c.WineCult).AutoInclude(); modelBuilder.Entity<AreaCom>().Navigation(c => c.WineCult).AutoInclude();
modelBuilder.Entity<AreaCmt>().Navigation(c => c.AreaCmtType).AutoInclude(); modelBuilder.Entity<AreaCom>().Navigation(c => c.AreaComType).AutoInclude();
modelBuilder.Entity<AreaCmtType>().Navigation(c => c.WineVar).AutoInclude(); modelBuilder.Entity<AreaComType>().Navigation(c => c.WineVar).AutoInclude();
modelBuilder.Entity<AreaCmtType>().Navigation(c => c.WineAttr).AutoInclude(); modelBuilder.Entity<AreaComType>().Navigation(c => c.WineAttr).AutoInclude();
modelBuilder.Entity<PaymentMember>().Navigation(c => c.Credit).AutoInclude(); modelBuilder.Entity<PaymentMember>().Navigation(c => c.Credit).AutoInclude();
modelBuilder.Entity<PaymentMember>().Navigation(c => c.Member).AutoInclude(); modelBuilder.Entity<PaymentMember>().Navigation(c => c.Member).AutoInclude();
modelBuilder.Entity<PaymentMember>().Navigation(c => c.Variant).AutoInclude(); modelBuilder.Entity<PaymentMember>().Navigation(c => c.Variant).AutoInclude();
@@ -439,7 +438,7 @@ namespace Elwig.Helpers {
private async Task FetchMemberAreaCommitmentBuckets(int year, SqliteConnection? cnx = null) { private async Task FetchMemberAreaCommitmentBuckets(int year, SqliteConnection? cnx = null) {
var ownCnx = cnx == null; var ownCnx = cnx == null;
cnx ??= await ConnectAsync(); cnx ??= await ConnectAsync();
var buckets = new Dictionary<int, Dictionary<string, AreaCmtBucket>>(); var buckets = new Dictionary<int, Dictionary<string, AreaComBucket>>();
using (var cmd = cnx.CreateCommand()) { using (var cmd = cnx.CreateCommand()) {
cmd.CommandText = $"SELECT mgnr, bucket, area, min_kg, max_kg FROM v_area_commitment_bucket WHERE year = {year}"; cmd.CommandText = $"SELECT mgnr, bucket, area, min_kg, max_kg FROM v_area_commitment_bucket WHERE year = {year}";
using var reader = await cmd.ExecuteReaderAsync(); using var reader = await cmd.ExecuteReaderAsync();
@@ -532,45 +531,7 @@ namespace Elwig.Helpers {
return _memberHistory[year].GetValueOrDefault(mgnr, new()); return _memberHistory[year].GetValueOrDefault(mgnr, new());
} }
public async Task<Dictionary<int, SortedDictionary<DateOnly, MemberHistoryPoint>>> GetMemberHistory() { public async Task<Dictionary<string, AreaComBucket>> GetMemberAreaCommitmentBuckets(int year, int mgnr, SqliteConnection? cnx = null) {
var today = DateOnly.FromDateTime(DateTime.Today).AddDays(1);
var history = new Dictionary<int, SortedDictionary<DateOnly, MemberHistoryPoint>>();
var members = await Members.ToListAsync();
foreach (var m in members) {
history[m.MgNr] = new() {
[today] = new(m.Shares, m.SharesRed, m.SharesWhite, m.SharesDormant),
};
}
var hist = await MemberHistory.OrderByDescending(h => h.DateNoticeString).ToListAsync();
foreach (var h in hist) {
if (h.FromMgNr is int from) {
var latest = history[from].Last().Value;
switch (h.FromType) {
case BusinessShareType.Normal: latest.Shares += h.Shares; break;
case BusinessShareType.Red: latest.SharesRed += h.Shares; break;
case BusinessShareType.White: latest.SharesWhite += h.Shares; break;
case BusinessShareType.Dormant: latest.SharesDormant += h.Shares; break;
}
history[from][h.DateNotice] = latest;
}
if (h.ToMgNr is int to) {
var latest = history[to].Last().Value;
switch (h.ToType) {
case BusinessShareType.Normal: latest.Shares -= h.Shares; break;
case BusinessShareType.Red: latest.SharesRed -= h.Shares; break;
case BusinessShareType.White: latest.SharesWhite -= h.Shares; break;
case BusinessShareType.Dormant: latest.SharesDormant -= h.Shares; break;
}
history[to][h.DateNotice] = latest;
}
}
return history;
}
public async Task<Dictionary<string, AreaCmtBucket>> GetMemberAreaCommitmentBuckets(int year, int mgnr, SqliteConnection? cnx = null) {
if (!_memberAreaCommitmentBuckets.ContainsKey(year)) if (!_memberAreaCommitmentBuckets.ContainsKey(year))
await FetchMemberAreaCommitmentBuckets(year, cnx); await FetchMemberAreaCommitmentBuckets(year, cnx);
return _memberAreaCommitmentBuckets[year].GetValueOrDefault(mgnr, []); return _memberAreaCommitmentBuckets[year].GetValueOrDefault(mgnr, []);
+15 -15
View File
@@ -13,32 +13,32 @@ namespace Elwig.Helpers.Billing {
protected readonly Season Season; protected readonly Season Season;
protected readonly Dictionary<string, string> Attributes; protected readonly Dictionary<string, string> Attributes;
protected readonly Dictionary<string, (decimal?, decimal?)> Modifiers; protected readonly Dictionary<string, (decimal?, decimal?)> Modifiers;
protected readonly Dictionary<string, (string, string?, string?, int?, decimal?)> AreaCmtTypes; protected readonly Dictionary<string, (string, string?, string?, int?, decimal?)> AreaComTypes;
protected Billing(int year, Season season, protected Billing(int year, Season season,
Dictionary<string, string> attributes, Dictionary<string, string> attributes,
Dictionary<string, (decimal?, decimal?)> modifiers, Dictionary<string, (decimal?, decimal?)> modifiers,
Dictionary<string, (string, string?, string?, int?, decimal?)> areaCmtTypes Dictionary<string, (string, string?, string?, int?, decimal?)> areaComTypes
) { ) {
Year = year; Year = year;
Season = season; Season = season;
Attributes = attributes; Attributes = attributes;
Modifiers = modifiers; Modifiers = modifiers;
AreaCmtTypes = areaCmtTypes; AreaComTypes = areaComTypes;
} }
protected static async Task<(Season, Dictionary<string, string>, Dictionary<string, (decimal?, decimal?)>, Dictionary<string, (string, string?, string?, int?, decimal?)>)> LoadData(AppDbContext ctx, int year) { protected static async Task<(Season, Dictionary<string, string>, Dictionary<string, (decimal?, decimal?)>, Dictionary<string, (string, string?, string?, int?, decimal?)>)> LoadData(AppDbContext ctx, int year) {
var season = await ctx.FetchSeasons(year).SingleOrDefaultAsync() ?? throw new ArgumentException("Invalid season"); var season = await ctx.FetchSeasons(year).SingleOrDefaultAsync() ?? throw new ArgumentException("Invalid season");
var attributes = await ctx.FetchWineAttributes().ToDictionaryAsync(a => a.AttrId, a => a.Name); var attributes = await ctx.FetchWineAttributes().ToDictionaryAsync(a => a.AttrId, a => a.Name);
var modifiers = await ctx.FetchModifiers(year).ToDictionaryAsync(m => m.ModId, m => (m.Abs, m.Rel)); var modifiers = await ctx.FetchModifiers(year).ToDictionaryAsync(m => m.ModId, m => (m.Abs, m.Rel));
var areaCmtTypes = ctx.AreaCommitmentTypes.ToDictionary(v => v.VtrgId, v => (v.SortId, v.AttrId, v.Discriminator, v.MinKgPerHa, v.PenaltyAmount)); var areaComTypes = ctx.AreaCommitmentTypes.ToDictionary(v => v.VtrgId, v => (v.SortId, v.AttrId, v.Discriminator, v.MinKgPerHa, v.PenaltyAmount));
return (season, attributes, modifiers, areaCmtTypes); return (season, attributes, modifiers, areaComTypes);
} }
public static async Task<Billing> Create(int year) { public static async Task<Billing> Create(int year) {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
var (season, attributes, modifiers, areaCmtTypes) = await LoadData(ctx, year); var (season, attributes, modifiers, areaComTypes) = await LoadData(ctx, year);
return new Billing(year, season, attributes, modifiers, areaCmtTypes); return new Billing(year, season, attributes, modifiers, areaComTypes);
} }
public async Task FinishSeason() { public async Task FinishSeason() {
@@ -77,13 +77,13 @@ namespace Elwig.Helpers.Billing {
} }
public async Task CalculateBuckets( public async Task CalculateBuckets(
bool? honorContractedField = null, bool? honorGebundenField = null,
bool? allowAttributesIntoLower = null, bool? allowAttributesIntoLower = null,
bool? avoidUnderDeliveries = null, bool? avoidUnderDeliveries = null,
SqliteConnection? cnx = null SqliteConnection? cnx = null
) { ) {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
var honorContracted = honorContractedField ?? Season.Billing_HonorContracted; var honorGebunden = honorGebundenField ?? Season.Billing_HonorGebunden;
var allowAttrsIntoLower = allowAttributesIntoLower ?? Season.Billing_AllowAttrsIntoLower; var allowAttrsIntoLower = allowAttributesIntoLower ?? Season.Billing_AllowAttrsIntoLower;
var avoidUnderDlvrs = avoidUnderDeliveries ?? Season.Billing_AvoidUnderDeliveries; var avoidUnderDlvrs = avoidUnderDeliveries ?? Season.Billing_AvoidUnderDeliveries;
var attrVals = ctx.WineAttributes.ToDictionary(a => a.AttrId, a => (a.IsStrict, a.FillLower)); var attrVals = ctx.WineAttributes.ToDictionary(a => a.AttrId, a => (a.IsStrict, a.FillLower));
@@ -96,10 +96,10 @@ namespace Elwig.Helpers.Billing {
var deliveries = new List<(int, int, int, string, int, double, string, string?, string[], bool?)>(); var deliveries = new List<(int, int, int, string, int, double, string, string?, string[], bool?)>();
using (var cmd = cnx.CreateCommand()) { using (var cmd = cnx.CreateCommand()) {
cmd.CommandText = $""" cmd.CommandText = $"""
SELECT mgnr, did, dpnr, sortid, weight, kmw, qualid, attrid, modifiers, contracted SELECT mgnr, did, dpnr, sortid, weight, kmw, qualid, attrid, modifiers, gebunden
FROM v_delivery FROM v_delivery
WHERE year = {Year} WHERE year = {Year}
ORDER BY mgnr, sortid, abgewertet ASC, {(honorContracted ? "contracted IS NOT NULL DESC, contracted DESC," : "")} ORDER BY mgnr, sortid, abgewertet ASC, {(honorGebunden ? "gebunden IS NOT NULL DESC, gebunden DESC," : "")}
attribute_prio DESC, COALESCE(attrid, '~'), kmw DESC, lsnr, dpnr attribute_prio DESC, COALESCE(attrid, '~'), kmw DESC, lsnr, dpnr
"""; """;
using var reader = await cmd.ExecuteReaderAsync(); using var reader = await cmd.ExecuteReaderAsync();
@@ -115,14 +115,14 @@ namespace Elwig.Helpers.Billing {
} }
int lastMgNr = 0; int lastMgNr = 0;
Dictionary<string, AreaCmtBucket>? rightsAndObligations = null; Dictionary<string, AreaComBucket>? rightsAndObligations = null;
Dictionary<string, int> used = []; Dictionary<string, int> used = [];
foreach (var (mgnr, did, dpnr, sortid, weight, kmw, qualid, attrid, modifiers, contracted) in deliveries) { foreach (var (mgnr, did, dpnr, sortid, weight, kmw, qualid, attrid, modifiers, gebunden) in deliveries) {
if (lastMgNr != mgnr) { if (lastMgNr != mgnr) {
rightsAndObligations = await ctx.GetMemberAreaCommitmentBuckets(Year, mgnr); rightsAndObligations = await ctx.GetMemberAreaCommitmentBuckets(Year, mgnr);
used = []; used = [];
} }
if ((honorContracted && contracted == false) || if ((honorGebunden && gebunden == false) ||
rightsAndObligations == null || rightsAndObligations.Count == 0 || rightsAndObligations == null || rightsAndObligations.Count == 0 ||
qualid == "WEI" || qualid == "RSW" || qualid == "LDW") qualid == "WEI" || qualid == "RSW" || qualid == "LDW")
{ {
@@ -140,7 +140,7 @@ namespace Elwig.Helpers.Billing {
foreach (var p in Utils.Permutate(attributes, attributes.Intersect(attrForced))) { foreach (var p in Utils.Permutate(attributes, attributes.Intersect(attrForced))) {
var c = p.Count(); var c = p.Count();
var key = sortid + string.Join("", p); var key = sortid + string.Join("", p);
if (rightsAndObligations.TryGetValue(key, out AreaCmtBucket value)) { if (rightsAndObligations.TryGetValue(key, out AreaComBucket value)) {
int i = (c == 0) ? 1 : 2; int i = (c == 0) ? 1 : 2;
var u = used.GetValueOrDefault(key, 0); var u = used.GetValueOrDefault(key, 0);
var vr = Math.Max(0, Math.Min(value.Right - u, w)); var vr = Math.Max(0, Math.Min(value.Right - u, w));
+10 -10
View File
@@ -14,7 +14,7 @@ namespace Elwig.Helpers.Billing {
public enum CalculationMode { Elwig, WgMaster } public enum CalculationMode { Elwig, WgMaster }
public enum CurveMode { Oe, Kmw } public enum CurveMode { Oe, Kmw }
public record struct Curve(CurveMode Mode, Dictionary<double, decimal> Normal, Dictionary<double, decimal>? Contracted); public record struct Curve(CurveMode Mode, Dictionary<double, decimal> Normal, Dictionary<double, decimal>? Gebunden);
public static JsonSchema? Schema { get; private set; } public static JsonSchema? Schema { get; private set; }
@@ -179,10 +179,10 @@ namespace Elwig.Helpers.Billing {
} else { } else {
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
var ctrd = obj["ctrd"] ?? obj["geb"]; var geb = obj["geb"];
if (ctrd is JsonObject) { if (geb is JsonObject) {
c2 = GetCurveData(ctrd.AsObject(), cMode); c2 = GetCurveData(geb.AsObject(), cMode);
} else if (ctrd?.AsValue().TryGetValue(out decimal v) == true) { } else if (geb?.AsValue().TryGetValue(out decimal v) == true) {
var splitVal = GetCurveValueAt(c1, quw); var splitVal = GetCurveValueAt(c1, quw);
c2 = c1.ToDictionary(e => e.Key, e => e.Value + (e.Key >= quw ? v : 0)); c2 = c1.ToDictionary(e => e.Key, e => e.Value + (e.Key >= quw ? v : 0));
c2[quw] = splitVal + v; c2[quw] = splitVal + v;
@@ -274,7 +274,7 @@ namespace Elwig.Helpers.Billing {
protected static JsonNode GraphEntryToJson(GraphEntry entry) { protected static JsonNode GraphEntryToJson(GraphEntry entry) {
try { try {
if (entry.ContractedFlatBonus == null) { if (entry.GebundenFlatBonus == null) {
return JsonValue.Create((decimal)entry.DataGraph.DataY.Distinct().Single()); return JsonValue.Create((decimal)entry.DataGraph.DataY.Distinct().Single());
} }
} catch { } } catch { }
@@ -286,10 +286,10 @@ namespace Elwig.Helpers.Billing {
curve["data"] = GraphToJson(entry.DataGraph, entry.Mode.ToString().ToLower()); curve["data"] = GraphToJson(entry.DataGraph, entry.Mode.ToString().ToLower());
if (entry.ContractedFlatBonus != null) { if (entry.GebundenFlatBonus != null) {
curve["ctrd"] = (decimal)entry.ContractedFlatBonus; curve["geb"] = (decimal)entry.GebundenFlatBonus;
} else if (entry.ContractedGraph != null) { } else if (entry.GebundenGraph != null) {
curve["ctrd"] = GraphToJson(entry.ContractedGraph, entry.Mode.ToString().ToLower()); curve["geb"] = GraphToJson(entry.GebundenGraph, entry.Mode.ToString().ToLower());
} }
return curve; return curve;
+12 -12
View File
@@ -16,9 +16,9 @@ namespace Elwig.Helpers.Billing {
protected BillingVariant(int year, int avnr, Season season, protected BillingVariant(int year, int avnr, Season season,
Dictionary<string, string> attributes, Dictionary<string, string> attributes,
Dictionary<string, (decimal?, decimal?)> modifiers, Dictionary<string, (decimal?, decimal?)> modifiers,
Dictionary<string, (string, string?, string?, int?, decimal?)> areaCmtTypes, Dictionary<string, (string, string?, string?, int?, decimal?)> areaComTypes,
PaymentVar paymentVar, PaymentBillingData data) : PaymentVar paymentVar, PaymentBillingData data) :
base(year, season, attributes, modifiers, areaCmtTypes) { base(year, season, attributes, modifiers, areaComTypes) {
AvNr = avnr; AvNr = avnr;
PaymentVariant = paymentVar; PaymentVariant = paymentVar;
Data = data; Data = data;
@@ -32,16 +32,16 @@ namespace Elwig.Helpers.Billing {
public static async Task<BillingVariant> Create(int year, int avnr) { public static async Task<BillingVariant> Create(int year, int avnr) {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
var (season, attributes, modifiers, areaCmtTypes) = await LoadData(ctx, year); var (season, attributes, modifiers, areaComTypes) = await LoadData(ctx, year);
var (paymentVar, data) = await LoadData(ctx, year, avnr); var (paymentVar, data) = await LoadData(ctx, year, avnr);
return new BillingVariant(year, avnr, season, attributes, modifiers, areaCmtTypes, paymentVar, data); return new BillingVariant(year, avnr, season, attributes, modifiers, areaComTypes, paymentVar, data);
} }
public async Task Calculate(bool strictPrices = true, bool? honorContracted = null, bool? allowAttrsIntoLower = null, bool? avoidUnderDeliveries = null) { public async Task Calculate(bool strictPrices = true, bool? honorGebunden = null, bool? allowAttrsIntoLower = null, bool? avoidUnderDeliveries = null) {
if (PaymentVariant == null || Data == null) throw new Exception("Call Load before Calculate"); if (PaymentVariant == null || Data == null) throw new Exception("Call Load before Calculate");
using var cnx = await AppDbContext.ConnectAsync(); using var cnx = await AppDbContext.ConnectAsync();
using var tx = await cnx.BeginTransactionAsync(); using var tx = await cnx.BeginTransactionAsync();
await CalculateBuckets(honorContracted, allowAttrsIntoLower, avoidUnderDeliveries, cnx); await CalculateBuckets(honorGebunden, allowAttrsIntoLower, avoidUnderDeliveries, cnx);
await DeleteInDb(cnx); await DeleteInDb(cnx);
await SetCalcTime(cnx); await SetCalcTime(cnx);
KeyNotFoundException? exception = null; KeyNotFoundException? exception = null;
@@ -73,7 +73,7 @@ namespace Elwig.Helpers.Billing {
v.avnr, v.avnr,
ROUND(p.amount / POW(10, s.precision - 2)) AS net_amount, ROUND(p.amount / POW(10, s.precision - 2)) AS net_amount,
IIF(lc.amount < 0, 0, ROUND(lp.amount / POW(10, s.precision - 2))) AS prev_net_amount, IIF(lc.amount < 0, 0, ROUND(lp.amount / POW(10, s.precision - 2))) AS prev_net_amount,
IIF(m.accounting, s.vat_normal, s.vat_flatrate) AS vat, IIF(m.buchführend, s.vat_normal, s.vat_flatrate) AS vat,
ROUND(IIF({Data.ConsiderTotalPenalty}, COALESCE(b.total_penalty, 0), 0) / POW(10, s.precision - 2)) + ROUND(IIF({Data.ConsiderTotalPenalty}, COALESCE(b.total_penalty, 0), 0) / POW(10, s.precision - 2)) +
ROUND(IIF({Data.ConsiderContractPenalties}, COALESCE(u.total_penalty, 0), 0) / POW(10, 4 - 2)) + ROUND(IIF({Data.ConsiderContractPenalties}, COALESCE(u.total_penalty, 0), 0) / POW(10, 4 - 2)) +
ROUND(IIF({Data.ConsiderAutoBusinessShares}, -COALESCE(a.total_amount, 0), 0)) + ROUND(IIF({Data.ConsiderAutoBusinessShares}, -COALESCE(a.total_amount, 0), 0)) +
@@ -170,7 +170,7 @@ namespace Elwig.Helpers.Billing {
protected async Task CalculatePrices(SqliteConnection cnx, bool strict = true) { protected async Task CalculatePrices(SqliteConnection cnx, bool strict = true) {
var invalid = new HashSet<string>(); var invalid = new HashSet<string>();
var parts = new List<(int Year, int DId, int DPNr, int BktNr, string SortId, string? AttrId, string? CultId, string Discr, int Value, double Oe, double Kmw, string QualId, bool AttrAreaCmt)>(); var parts = new List<(int Year, int DId, int DPNr, int BktNr, string SortId, string? AttrId, string? CultId, string Discr, int Value, double Oe, double Kmw, string QualId, bool AttrAreaCom)>();
using (var cmd = cnx.CreateCommand()) { using (var cmd = cnx.CreateCommand()) {
cmd.CommandText = $""" cmd.CommandText = $"""
SELECT d.year, d.did, d.dpnr, b.bktnr, d.sortid, d.attrid, d.cultid, b.discr, b.value, d.oe, d.kmw, d.qualid, COALESCE(a.area_com, TRUE) SELECT d.year, d.did, d.dpnr, b.bktnr, d.sortid, d.attrid, d.cultid, b.discr, b.value, d.oe, d.kmw, d.qualid, COALESCE(a.area_com, TRUE)
@@ -195,13 +195,13 @@ namespace Elwig.Helpers.Billing {
foreach (var part in parts) { foreach (var part in parts) {
if (part.Value == 0) if (part.Value == 0)
continue; continue;
var unctrd = part.Discr == "_"; var ungeb = part.Discr == "_";
var payAttrId = (part.Discr is "" or "_") ? null : part.Discr; var payAttrId = (part.Discr is "" or "_") ? null : part.Discr;
var attrId = part.AttrAreaCmt ? payAttrId : part.AttrId; var attrId = part.AttrAreaCom ? payAttrId : part.AttrId;
var ctrd = !unctrd && (payAttrId == attrId || !part.AttrAreaCmt); var geb = !ungeb && (payAttrId == attrId || !part.AttrAreaCom);
decimal price = 0; decimal price = 0;
try { try {
price = Data.CalculatePrice(part.SortId, attrId, part.CultId, part.QualId, ctrd, part.Oe, part.Kmw); price = Data.CalculatePrice(part.SortId, attrId, part.CultId, part.QualId, geb, part.Oe, part.Kmw);
} catch (KeyNotFoundException e) { } catch (KeyNotFoundException e) {
invalid.Add(e.Message.Split('\'')[1]); invalid.Add(e.Message.Split('\'')[1]);
} }
+17 -17
View File
@@ -7,7 +7,7 @@ namespace Elwig.Helpers.Billing {
public class GraphEntry { public class GraphEntry {
public const int MinX = 50; public const int MinX = 50;
public const int MinXCtrd = 73; public const int MinXGeb = 73;
public const int MaxX = 120; public const int MaxX = 120;
public int Id { get; set; } public int Id { get; set; }
@@ -15,11 +15,11 @@ namespace Elwig.Helpers.Billing {
public bool Abgewertet { get; set; } public bool Abgewertet { get; set; }
public Graph DataGraph { get; set; } public Graph DataGraph { get; set; }
public Graph? ContractedGraph { get; set; } public Graph? GebundenGraph { get; set; }
public double? ContractedFlatBonus { public double? GebundenFlatBonus {
get { get {
try { try {
var val = ContractedGraph?.DataX.Zip(ContractedGraph.DataY) var val = GebundenGraph?.DataX.Zip(GebundenGraph.DataY)
.Select(e => Math.Round(e.Second - DataGraph.GetPriceAtOe(e.First), Precision)) .Select(e => Math.Round(e.Second - DataGraph.GetPriceAtOe(e.First), Precision))
.Distinct() .Distinct()
.Single(); .Single();
@@ -30,10 +30,10 @@ namespace Elwig.Helpers.Billing {
} }
set { set {
if (value is not double v) return; if (value is not double v) return;
var values = Enumerable.Range(MinXCtrd, MaxX - MinXCtrd + 1) var values = Enumerable.Range(MinXGeb, MaxX - MinXGeb + 1)
.Select(i => Math.Round(DataGraph.GetPriceAtOe(i) + v, Precision)) .Select(i => Math.Round(DataGraph.GetPriceAtOe(i) + v, Precision))
.ToArray(); .ToArray();
ContractedGraph = new Graph(values, Precision, MinXCtrd, MaxX); GebundenGraph = new Graph(values, Precision, MinXGeb, MaxX);
} }
} }
@@ -52,39 +52,39 @@ namespace Elwig.Helpers.Billing {
Vaributes = []; Vaributes = [];
} }
public GraphEntry(int id, int precision, BillingData.CurveMode mode, Dictionary<double, decimal> data, Dictionary<double, decimal>? contracted) : public GraphEntry(int id, int precision, BillingData.CurveMode mode, Dictionary<double, decimal> data, Dictionary<double, decimal>? gebunden) :
this(id, precision, mode) { this(id, precision, mode) {
DataGraph = new Graph(data, precision, MinX, MaxX); DataGraph = new Graph(data, precision, MinX, MaxX);
if (contracted != null) ContractedGraph = new Graph(contracted, precision, MinXCtrd, MaxX); if (gebunden != null) GebundenGraph = new Graph(gebunden, precision, MinXGeb, MaxX);
} }
public GraphEntry(int id, int precision, BillingData.Curve curve, List<Varibute> vaributes) : public GraphEntry(int id, int precision, BillingData.Curve curve, List<Varibute> vaributes) :
this(id, precision, curve.Mode) { this(id, precision, curve.Mode) {
DataGraph = new Graph(curve.Normal, precision, MinX, MaxX); DataGraph = new Graph(curve.Normal, precision, MinX, MaxX);
if (curve.Contracted != null) if (curve.Gebunden != null)
ContractedGraph = new Graph(curve.Contracted, precision, MinXCtrd, MaxX); GebundenGraph = new Graph(curve.Gebunden, precision, MinXGeb, MaxX);
Vaributes = vaributes; Vaributes = vaributes;
} }
private GraphEntry(int id, int precision, BillingData.CurveMode mode, Graph dataGraph, Graph? contractedGraph, List<Varibute> vaributes) { private GraphEntry(int id, int precision, BillingData.CurveMode mode, Graph dataGraph, Graph? gebundenGraph, List<Varibute> vaributes) {
Id = id; Id = id;
Precision = precision; Precision = precision;
Mode = mode; Mode = mode;
DataGraph = dataGraph; DataGraph = dataGraph;
ContractedGraph = contractedGraph; GebundenGraph = gebundenGraph;
Vaributes = vaributes; Vaributes = vaributes;
} }
public void AddContractedGraph() { public void AddGebundenGraph() {
ContractedGraph ??= new Graph(Precision, MinXCtrd, MaxX); GebundenGraph ??= new Graph(Precision, MinXGeb, MaxX);
} }
public void RemoveContractedGraph() { public void RemoveGebundenGraph() {
ContractedGraph = null; GebundenGraph = null;
} }
public GraphEntry Copy(int id) { public GraphEntry Copy(int id) {
return new GraphEntry(id, Precision, Mode, (Graph)DataGraph.Clone(), (Graph?)ContractedGraph?.Clone(), []); return new GraphEntry(id, Precision, Mode, (Graph)DataGraph.Clone(), (Graph?)GebundenGraph?.Clone(), []);
} }
} }
} }
+2 -2
View File
@@ -45,9 +45,9 @@ namespace Elwig.Helpers.Billing {
return dict; return dict;
} }
public decimal CalculatePrice(string sortid, string? attrid, string? cultid, string qualid, bool contracted, double oe, double kmw) { public decimal CalculatePrice(string sortid, string? attrid, string? cultid, string qualid, bool gebunden, double oe, double kmw) {
var curve = GetQualityCurve(qualid, sortid, attrid, cultid) ?? GetCurve(sortid, attrid, cultid); var curve = GetQualityCurve(qualid, sortid, attrid, cultid) ?? GetCurve(sortid, attrid, cultid);
return GetCurveValueAt((contracted ? curve.Contracted : null) ?? curve.Normal, curve.Mode == CurveMode.Oe ? oe : kmw); return GetCurveValueAt((gebunden ? curve.Gebunden : null) ?? curve.Normal, curve.Mode == CurveMode.Oe ? oe : kmw);
} }
private Curve LookupCurve(JsonValue val) { private Curve LookupCurve(JsonValue val) {
-11
View File
@@ -61,7 +61,6 @@ namespace Elwig.Helpers {
public int ModeBusinessShares; public int ModeBusinessShares;
public bool HasRedWhite => ModeBusinessShares == 1; public bool HasRedWhite => ModeBusinessShares == 1;
public int ModeMemberDataSheetShares;
public int ModeDeliveryNoteStats; public int ModeDeliveryNoteStats;
public int ModeWineQualityStatistics; public int ModeWineQualityStatistics;
public int OrderingMemberList; public int OrderingMemberList;
@@ -128,10 +127,6 @@ namespace Elwig.Helpers {
case "SIMPLE": ModeBusinessShares = 0; break; case "SIMPLE": ModeBusinessShares = 0; break;
case "RED_WHITE": ModeBusinessShares = 1; break; case "RED_WHITE": ModeBusinessShares = 1; break;
} }
switch (parameters.GetValueOrDefault("MODE_MEMBERDATASHEET_SHARES", "FULL")?.ToUpper()) {
case "NONE": ModeMemberDataSheetShares = 0; break;
case "FULL": ModeMemberDataSheetShares = 1; break;
}
switch (parameters.GetValueOrDefault("MODE_DELIVERYNOTE_STATS", "SHORT")?.ToUpper()) { switch (parameters.GetValueOrDefault("MODE_DELIVERYNOTE_STATS", "SHORT")?.ToUpper()) {
case "NONE": ModeDeliveryNoteStats = 0; break; case "NONE": ModeDeliveryNoteStats = 0; break;
case "GA_ONLY": ModeDeliveryNoteStats = 1; break; case "GA_ONLY": ModeDeliveryNoteStats = 1; break;
@@ -214,11 +209,6 @@ namespace Elwig.Helpers {
case 0: businessShares = "SIMPLE"; break; case 0: businessShares = "SIMPLE"; break;
case 1: businessShares = "RED_WHITE"; break; case 1: businessShares = "RED_WHITE"; break;
} }
string memberDataSheetShares = "FULL";
switch (ModeMemberDataSheetShares) {
case 0: memberDataSheetShares = "NONE"; break;
case 1: memberDataSheetShares = "FULL"; break;
}
string deliveryNoteStats = "SHORT"; string deliveryNoteStats = "SHORT";
switch (ModeDeliveryNoteStats) { switch (ModeDeliveryNoteStats) {
case 0: deliveryNoteStats = "NONE"; break; case 0: deliveryNoteStats = "NONE"; break;
@@ -289,7 +279,6 @@ namespace Elwig.Helpers {
("CLIENT_ORGANIC_AUTHORITYCODE", OrganicAuthorityCode), ("CLIENT_ORGANIC_AUTHORITYCODE", OrganicAuthorityCode),
("ENABLE_MEMBERHISTORY", EnableMemberHistory ? "YES" : "NO"), ("ENABLE_MEMBERHISTORY", EnableMemberHistory ? "YES" : "NO"),
("MODE_BUSINESSSHARES", businessShares), ("MODE_BUSINESSSHARES", businessShares),
("MODE_MEMBERDATASHEET_SHARES", memberDataSheetShares),
("MODE_DELIVERYNOTE_STATS", deliveryNoteStats), ("MODE_DELIVERYNOTE_STATS", deliveryNoteStats),
("MODE_WINEQUALITYSTATISTICS", modeWineQualityStatistics), ("MODE_WINEQUALITYSTATISTICS", modeWineQualityStatistics),
("ORDERING_MEMBERLIST", orderingMemberList), ("ORDERING_MEMBERLIST", orderingMemberList),
+5 -1
View File
@@ -8,7 +8,7 @@ namespace Elwig.Helpers.Export {
using Row = Tuple<(string?, string?, string?, string?, string, int, string, bool, int), (string, int, string, string, string, int, string, double, double)>; using Row = Tuple<(string?, string?, string?, string?, string, int, string, bool, int), (string, int, string, string, string, int, string, double, double)>;
public class Bki : CsvFile<Row> { public class Bki : Csv<Row> {
private readonly string _clientData; private readonly string _clientData;
@@ -46,6 +46,10 @@ namespace Elwig.Helpers.Export {
await ExportAsync(rows); await ExportAsync(rows);
} }
public void Export(int year) {
ExportAsync(year).GetAwaiter().GetResult();
}
public override string FormatRow(Row row) { public override string FormatRow(Row row) {
var (member, delivery) = row; var (member, delivery) = row;
var (lfBisNr, familyName, name, billingName, address, plz, ort, vollablieferer, area) = member; var (lfBisNr, familyName, name, billingName, address, plz, ort, vollablieferer, area) = member;
@@ -7,7 +7,7 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Elwig.Helpers.Export { namespace Elwig.Helpers.Export {
public abstract class CsvFile<T> : IExporter<T> { public abstract class Csv<T> : IExporter<T> {
public static string FileExtension => "csv"; public static string FileExtension => "csv";
@@ -15,11 +15,11 @@ namespace Elwig.Helpers.Export {
protected readonly char Separator; protected readonly char Separator;
protected string? Header; protected string? Header;
public CsvFile(string filename, char separator = ';') : public Csv(string filename, char separator = ';') :
this(filename, separator, Utils.UTF8) { this(filename, separator, Utils.UTF8) {
} }
public CsvFile(string filename, char separator, Encoding encoding) { public Csv(string filename, char separator, Encoding encoding) {
_writer = new StreamWriter(filename, false, encoding); _writer = new StreamWriter(filename, false, encoding);
Separator = separator; Separator = separator;
} }
@@ -29,6 +29,11 @@ namespace Elwig.Helpers.Export {
_writer.Dispose(); _writer.Dispose();
} }
public ValueTask DisposeAsync() {
GC.SuppressFinalize(this);
return _writer.DisposeAsync();
}
public async Task ExportAsync(IEnumerable<T> data, IProgress<double>? progress = null) { public async Task ExportAsync(IEnumerable<T> data, IProgress<double>? progress = null) {
progress?.Report(0.0); progress?.Report(0.0);
int count = data.Count() + 2, i = 0; int count = data.Count() + 2, i = 0;
@@ -45,6 +50,10 @@ namespace Elwig.Helpers.Export {
progress?.Report(100.0); progress?.Report(100.0);
} }
public void Export(IEnumerable<T> data, IProgress<double>? progress = null) {
ExportAsync(data, progress).GetAwaiter().GetResult();
}
public string FormatRow(IEnumerable row) { public string FormatRow(IEnumerable row) {
return string.Join(Separator, row); return string.Join(Separator, row);
} }
@@ -52,7 +61,7 @@ namespace Elwig.Helpers.Export {
public abstract string FormatRow(T row); public abstract string FormatRow(T row);
} }
public class CsvSimple : CsvFile<IEnumerable<object?>> { public class CsvSimple : Csv<IEnumerable<object?>> {
public CsvSimple(string filename, char separator, Encoding encoding) : public CsvSimple(string filename, char separator, Encoding encoding) :
base(filename, separator, encoding) { base(filename, separator, encoding) {
+10 -1
View File
@@ -9,7 +9,7 @@ using System.Security;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Elwig.Helpers.Export { namespace Elwig.Helpers.Export {
public class Ebics(PaymentVar variant, string filename, int version, Ebics.AddressMode mode = Ebics.AddressMode.Full) : IExporter<Transaction> { public class Ebics(PaymentVar variant, string filename, int version, Ebics.AddressMode mode = Ebics.AddressMode.Full) : IBankingExporter {
public enum AddressMode { Omit = 0, Lines = 1, Full = 2 } public enum AddressMode { Omit = 0, Lines = 1, Full = 2 }
@@ -28,6 +28,15 @@ namespace Elwig.Helpers.Export {
Writer.Dispose(); Writer.Dispose();
} }
public ValueTask DisposeAsync() {
GC.SuppressFinalize(this);
return Writer.DisposeAsync();
}
public void Export(IEnumerable<Transaction> transactions, IProgress<double>? progress = null) {
ExportAsync(transactions, progress).GetAwaiter().GetResult();
}
public async Task ExportAsync(IEnumerable<Transaction> transactions, IProgress<double>? progress = null) { public async Task ExportAsync(IEnumerable<Transaction> transactions, IProgress<double>? progress = null) {
if (transactions.Any(tx => tx.Amount < 0)) { if (transactions.Any(tx => tx.Amount < 0)) {
throw new ArgumentException("Tranaction amount may not be negative"); throw new ArgumentException("Tranaction amount may not be negative");
+15
View File
@@ -0,0 +1,15 @@
using Elwig.Models.Dtos;
using System;
namespace Elwig.Helpers.Export {
public class Elba : Csv<Transaction>, IBankingExporter {
public static new string FileExtension => "elba";
public Elba(string filename) : base(filename) { }
public override string FormatRow(Transaction row) {
throw new NotImplementedException();
}
}
}
+46 -46
View File
@@ -63,8 +63,8 @@ namespace Elwig.Helpers.Export {
List<MemberTelNr> TelephoneNumbers, List<MemberTelNr> TelephoneNumbers,
List<MemberEmailAddr> EmailAddresses, List<MemberEmailAddr> EmailAddresses,
List<MemberHistory> MemberHistory, List<MemberHistory> MemberHistory,
List<AreaCmt> AreaCommitments, List<AreaCom> AreaCommitments,
List<AreaCmtContract> Contracts, List<AreaComContract> Contracts,
List<WbRd> Riede, List<WbRd> Riede,
List<WbKg> WbKgs, List<WbKg> WbKgs,
List<WbGl> WbGls, List<WbGl> WbGls,
@@ -75,7 +75,7 @@ namespace Elwig.Helpers.Export {
var metaData = new List<(string FileName, string ZwstId, string Device, var metaData = new List<(string FileName, string ZwstId, string Device,
int? MemberNum, string? MemberFilters, int? MemberNum, string? MemberFilters,
int? AreaCmtNum, string? AreaCmtFilters, int? AreaComNum, string? AreaComFilters,
int? DeliveryNum, string? DeliveryFilters)>(); int? DeliveryNum, string? DeliveryFilters)>();
foreach (var filename in filenames) { foreach (var filename in filenames) {
@@ -105,14 +105,14 @@ namespace Elwig.Helpers.Export {
var meta = await JsonNode.ParseAsync(metaJson!.Open()); var meta = await JsonNode.ParseAsync(metaJson!.Open());
var memberCount = meta!["members"]?["count"]?.AsValue().GetValue<int>(); var memberCount = meta!["members"]?["count"]?.AsValue().GetValue<int>();
var memberFilters = meta!["members"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray(); var memberFilters = meta!["members"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
var areaCmtCount = meta!["area_commitment_contracts"]?["count"]?.AsValue().GetValue<int>(); var areaComCount = meta!["area_commitment_contracts"]?["count"]?.AsValue().GetValue<int>();
var areaCmtFilters = meta!["area_commitment_contracts"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray(); var areaComFilters = meta!["area_commitment_contracts"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
var deliveryCount = meta!["deliveries"]?["count"]?.AsValue().GetValue<int>(); var deliveryCount = meta!["deliveries"]?["count"]?.AsValue().GetValue<int>();
var deliveryFilters = meta!["deliveries"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray(); var deliveryFilters = meta!["deliveries"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
metaData.Add((Path.GetFileName(filename), metaData.Add((Path.GetFileName(filename),
meta["zwstid"]!.AsValue().GetValue<string>(), meta["device"]!.AsValue().GetValue<string>(), meta["zwstid"]!.AsValue().GetValue<string>(), meta["device"]!.AsValue().GetValue<string>(),
memberCount, memberFilters != null ? string.Join(" / ", memberFilters) : null, memberCount, memberFilters != null ? string.Join(" / ", memberFilters) : null,
areaCmtCount, areaCmtFilters != null ? string.Join(" / ", areaCmtFilters) : null, areaComCount, areaComFilters != null ? string.Join(" / ", areaComFilters) : null,
deliveryCount, deliveryFilters != null ? string.Join(" / ", deliveryFilters) : null)); deliveryCount, deliveryFilters != null ? string.Join(" / ", deliveryFilters) : null));
var wbKgsJson = zip.GetEntry("wb_kgs.json"); var wbKgsJson = zip.GetEntry("wb_kgs.json");
@@ -159,21 +159,21 @@ namespace Elwig.Helpers.Export {
} }
// legacy area commitments // legacy area commitments
var areaCmtsJson = zip.GetEntry("area_commitments.json"); var areaComsJson = zip.GetEntry("area_commitments.json");
if (areaCmtsJson != null) { if (areaComsJson != null) {
using var reader = new StreamReader(areaCmtsJson.Open(), Utils.UTF8); using var reader = new StreamReader(areaComsJson.Open(), Utils.UTF8);
string? line; string? line;
while ((line = await reader.ReadLineAsync()) != null) { while ((line = await reader.ReadLineAsync()) != null) {
var obj = JsonNode.Parse(line)!.AsObject(); var obj = JsonNode.Parse(line)!.AsObject();
var (contract, areaCmt, wbrd, timestamps) = obj.ToAreaCmt(kgs, currentWbKgs, currentWbRde); var (contract, areaCom, wbrd, timestamps) = obj.ToAreaCom(kgs, currentWbKgs, currentWbRde);
r.Contracts.Add(contract); r.Contracts.Add(contract);
r.AreaCommitments.Add(areaCmt); r.AreaCommitments.Add(areaCom);
if (wbrd != null) { if (wbrd != null) {
r.Riede.Add(wbrd); r.Riede.Add(wbrd);
} }
if (timestamps.HasValue) { if (timestamps.HasValue) {
r.Timestamps["area_commitment_contract"].Add((contract.FbNr, 0, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt)); r.Timestamps["area_commitment_contract"].Add((contract.FbNr, 0, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt));
r.Timestamps["area_commitment"].Add((areaCmt.FbNr, areaCmt.RevNr, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt)); r.Timestamps["area_commitment"].Add((areaCom.FbNr, areaCom.RevNr, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt));
} }
} }
} }
@@ -184,17 +184,17 @@ namespace Elwig.Helpers.Export {
string? line; string? line;
while ((line = await reader.ReadLineAsync()) != null) { while ((line = await reader.ReadLineAsync()) != null) {
var obj = JsonNode.Parse(line)!.AsObject(); var obj = JsonNode.Parse(line)!.AsObject();
var (contract, areaCmts, wbrd, timestamps) = obj.ToAreaCmtContract(kgs, currentWbKgs, currentWbRde); var (contract, areaComs, wbrd, timestamps) = obj.ToAreaComContract(kgs, currentWbKgs, currentWbRde);
r.Contracts.Add(contract); r.Contracts.Add(contract);
r.AreaCommitments.AddRange(areaCmts.Select(v => v.Item1)); r.AreaCommitments.AddRange(areaComs.Select(v => v.Item1));
if (wbrd != null) { if (wbrd != null) {
r.Riede.Add(wbrd); r.Riede.Add(wbrd);
} }
if (timestamps.HasValue) if (timestamps.HasValue)
r.Timestamps["area_commitment_contract"].Add((contract.FbNr, 0, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt)); r.Timestamps["area_commitment_contract"].Add((contract.FbNr, 0, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt));
foreach (var (areaCmt, ts) in areaCmts) { foreach (var (areaCom, ts) in areaComs) {
if (!ts.HasValue) continue; if (!ts.HasValue) continue;
r.Timestamps["area_commitment"].Add((areaCmt.FbNr, areaCmt.RevNr, 0, ts.Value.CreatedAt, ts.Value.ModifiedAt)); r.Timestamps["area_commitment"].Add((areaCom.FbNr, areaCom.RevNr, 0, ts.Value.CreatedAt, ts.Value.ModifiedAt));
} }
} }
} }
@@ -235,7 +235,7 @@ namespace Elwig.Helpers.Export {
} }
var importedMembers = new List<(string FileName, string ZwstId, string Device, int New, int Overwritten, int NotImported, string? Filters)>(); var importedMembers = new List<(string FileName, string ZwstId, string Device, int New, int Overwritten, int NotImported, string? Filters)>();
var importedAreaCmts = new List<(string FileName, string ZwstId, string Device, int New, int Overwritten, int NotImported, string? Filters)>(); var importedAreaComs = new List<(string FileName, string ZwstId, string Device, int New, int Overwritten, int NotImported, string? Filters)>();
var importedDeliveries = new List<(string FileName, string ZwstId, string Device, int New, int Overwritten, int NotImported, string? Filters)>(); var importedDeliveries = new List<(string FileName, string ZwstId, string Device, int New, int Overwritten, int NotImported, string? Filters)>();
foreach (var ((members, billingAddresses, telephoneNumbers, emailAddresses, history, areaCommitments, contracts, riede, wbKgs, wbGls, deliveries, deliveryParts, modifiers, timestamps), meta) in data.Zip(metaData)) { foreach (var ((members, billingAddresses, telephoneNumbers, emailAddresses, history, areaCommitments, contracts, riede, wbKgs, wbGls, deliveries, deliveryParts, modifiers, timestamps), meta) in data.Zip(metaData)) {
@@ -365,7 +365,7 @@ namespace Elwig.Helpers.Export {
ctx.AddRange(riede); ctx.AddRange(riede);
var n = importNewContracts ? contracts.Count - duplicateFbNrs.Count : 0; var n = importNewContracts ? contracts.Count - duplicateFbNrs.Count : 0;
var o = importDuplicateContracts ? duplicateFbNrs.Count : 0; var o = importDuplicateContracts ? duplicateFbNrs.Count : 0;
importedAreaCmts.Add((meta.FileName, meta.ZwstId, meta.Device, n, o, contracts.Count - n - o, meta.AreaCmtFilters)); importedAreaComs.Add((meta.FileName, meta.ZwstId, meta.Device, n, o, contracts.Count - n - o, meta.AreaComFilters));
} }
if (allowedDuplicateLsNrs.Count > 0) { if (allowedDuplicateLsNrs.Count > 0) {
@@ -447,8 +447,8 @@ namespace Elwig.Helpers.Export {
$" ({d.New} neu, {d.Overwritten} überschrieben, {d.NotImported} nicht importiert)\n" + $" ({d.New} neu, {d.Overwritten} überschrieben, {d.NotImported} nicht importiert)\n" +
$" Zweigstelle: {branches[d.ZwstId].Name} (Gerät {d.Device})\n" + $" Zweigstelle: {branches[d.ZwstId].Name} (Gerät {d.Device})\n" +
$" Filter: {d.Filters}"), $" Filter: {d.Filters}"),
$"Flächenbindungen: {importedAreaCmts.Sum(d => d.New + d.Overwritten)}", $"Flächenbindungen: {importedAreaComs.Sum(d => d.New + d.Overwritten)}",
..importedAreaCmts.Select(d => ..importedAreaComs.Select(d =>
$" {d.FileName} ({d.New + d.Overwritten})\n" + $" {d.FileName} ({d.New + d.Overwritten})\n" +
$" ({d.New} importiert, {d.Overwritten} überschreiben, {d.NotImported} nicht importiert)\n" + $" ({d.New} importiert, {d.Overwritten} überschreiben, {d.NotImported} nicht importiert)\n" +
$" Zweigstelle: {branches[d.ZwstId].Name} (Gerät {d.Device})\n" + $" Zweigstelle: {branches[d.ZwstId].Name} (Gerät {d.Device})\n" +
@@ -481,11 +481,11 @@ namespace Elwig.Helpers.Export {
}.Export(filename); }.Export(filename);
} }
public static Task Export(string filename, IEnumerable<Member> members, IEnumerable<MemberHistory> history, IEnumerable<AreaCmtContract> areaCmts, IEnumerable<WbKg> wbKgs, IEnumerable<string> filters) { public static Task Export(string filename, IEnumerable<Member> members, IEnumerable<MemberHistory> history, IEnumerable<AreaComContract> areaComs, IEnumerable<WbKg> wbKgs, IEnumerable<string> filters) {
return new ElwigExport { return new ElwigExport {
Members = (members, filters), Members = (members, filters),
History = (history, ["von exportierten Mitgliedern"]), History = (history, ["von exportierten Mitgliedern"]),
AreaCmts = (areaCmts, ["von exportierten Mitgliedern"]), AreaComs = (areaComs, ["von exportierten Mitgliedern"]),
WbKgs = (wbKgs, ["von exportierten Mitgliedern und Flächenbindungen"]), WbKgs = (wbKgs, ["von exportierten Mitgliedern und Flächenbindungen"]),
}.Export(filename); }.Export(filename);
} }
@@ -501,7 +501,7 @@ namespace Elwig.Helpers.Export {
public (IEnumerable<WbKg> WbKgs, IEnumerable<string> Filters)? WbKgs { get; set; } public (IEnumerable<WbKg> WbKgs, IEnumerable<string> Filters)? WbKgs { get; set; }
public (IEnumerable<Member> Members, IEnumerable<string> Filters)? Members { get; set; } public (IEnumerable<Member> Members, IEnumerable<string> Filters)? Members { get; set; }
public (IEnumerable<MemberHistory> History, IEnumerable<string> Filters)? History { get; set; } public (IEnumerable<MemberHistory> History, IEnumerable<string> Filters)? History { get; set; }
public (IEnumerable<AreaCmtContract> AreaCmts, IEnumerable<string> Filters)? AreaCmts { get; set; } public (IEnumerable<AreaComContract> AreaComs, IEnumerable<string> Filters)? AreaComs { get; set; }
public (IEnumerable<Delivery> Deliveries, IEnumerable<string> Filters)? Deliveries { get; set; } public (IEnumerable<Delivery> Deliveries, IEnumerable<string> Filters)? Deliveries { get; set; }
public async Task Export(string filename) { public async Task Export(string filename) {
@@ -535,11 +535,11 @@ namespace Elwig.Helpers.Export {
["count"] = History.Value.History.Count(), ["count"] = History.Value.History.Count(),
["filters"] = new JsonArray(History.Value.Filters.Select(f => (JsonNode)f).ToArray()), ["filters"] = new JsonArray(History.Value.Filters.Select(f => (JsonNode)f).ToArray()),
}; };
if (AreaCmts != null) if (AreaComs != null)
obj["area_commitment_contracts"] = new JsonObject { obj["area_commitment_contracts"] = new JsonObject {
["count"] = AreaCmts.Value.AreaCmts.Count(), ["count"] = AreaComs.Value.AreaComs.Count(),
["revisions"] = AreaCmts.Value.AreaCmts.Sum(c => c.Revisions.Count), ["revisions"] = AreaComs.Value.AreaComs.Sum(c => c.Revisions.Count),
["filters"] = new JsonArray(AreaCmts.Value.Filters.Select(f => (JsonNode)f).ToArray()), ["filters"] = new JsonArray(AreaComs.Value.Filters.Select(f => (JsonNode)f).ToArray()),
}; };
if (Deliveries != null) if (Deliveries != null)
obj["deliveries"] = new JsonObject { obj["deliveries"] = new JsonObject {
@@ -572,10 +572,10 @@ namespace Elwig.Helpers.Export {
await writer.WriteLineAsync(h.ToJson().ToJsonString(Utils.JsonOpts)); await writer.WriteLineAsync(h.ToJson().ToJsonString(Utils.JsonOpts));
} }
} }
if (AreaCmts != null) { if (AreaComs != null) {
var json = zip.CreateEntry("area_commitment_contracts.json", CompressionLevel.SmallestSize); var json = zip.CreateEntry("area_commitment_contracts.json", CompressionLevel.SmallestSize);
using var writer = new StreamWriter(json.Open(), Utils.UTF8); using var writer = new StreamWriter(json.Open(), Utils.UTF8);
foreach (var c in AreaCmts.Value.AreaCmts) { foreach (var c in AreaComs.Value.AreaComs) {
await writer.WriteLineAsync(c.ToJson().ToJsonString(Utils.JsonOpts)); await writer.WriteLineAsync(c.ToJson().ToJsonString(Utils.JsonOpts));
} }
} }
@@ -641,10 +641,10 @@ namespace Elwig.Helpers.Export {
["ooc_id"] = m.OrganicOperatorId, ["ooc_id"] = m.OrganicOperatorId,
["org_auth_code"] = m.OrganicAuthorityCode, ["org_auth_code"] = m.OrganicAuthorityCode,
["juridical_pers"] = m.IsJuridicalPerson, ["juridical_pers"] = m.IsJuridicalPerson,
["full_delivery"] = m.IsFullDelivery, ["volllieferant"] = m.IsVollLieferant,
["accounting"] = m.IsAccounting, ["buchführend"] = m.IsBuchführend,
["organic"] = m.IsOrganic, ["organic"] = m.IsOrganic,
["officer"] = m.IsOfficer, ["funktionär"] = m.IsFunktionär,
["active"] = m.IsActive, ["active"] = m.IsActive,
["deceased"] = m.IsDeceased, ["deceased"] = m.IsDeceased,
["iban"] = m.Iban, ["iban"] = m.Iban,
@@ -715,10 +715,10 @@ namespace Elwig.Helpers.Export {
OrganicOperatorId = json["ooc_id"]?.AsValue().GetValue<string>(), OrganicOperatorId = json["ooc_id"]?.AsValue().GetValue<string>(),
OrganicAuthorityCode = json["org_auth_code"]?.AsValue().GetValue<string>(), OrganicAuthorityCode = json["org_auth_code"]?.AsValue().GetValue<string>(),
IsJuridicalPerson = json["juridical_pers"]?.AsValue().GetValue<bool>() ?? false, IsJuridicalPerson = json["juridical_pers"]?.AsValue().GetValue<bool>() ?? false,
IsFullDelivery = json["full_delivery"]?.AsValue().GetValue<bool>() ?? json["volllieferant"]?.AsValue().GetValue<bool>() ?? false, IsVollLieferant = json["volllieferant"]?.AsValue().GetValue<bool>() ?? false,
IsAccounting = json["accounting"]?.AsValue().GetValue<bool>() ?? json["buchführend"]?.AsValue().GetValue<bool>() ?? false, IsBuchführend = json["buchführend"]?.AsValue().GetValue<bool>() ?? false,
IsOrganic = json["organic"]?.AsValue().GetValue<bool>() ?? false, IsOrganic = json["organic"]?.AsValue().GetValue<bool>() ?? false,
IsOfficer = json["officer"]?.AsValue().GetValue<bool>() ?? json["funktionär"]?.AsValue().GetValue<bool>() ?? false, IsFunktionär = json["funktionär"]?.AsValue().GetValue<bool>() ?? false,
IsActive = json["active"]?.AsValue().GetValue<bool>() ?? false, IsActive = json["active"]?.AsValue().GetValue<bool>() ?? false,
IsDeceased = json["deceased"]?.AsValue().GetValue<bool>() ?? false, IsDeceased = json["deceased"]?.AsValue().GetValue<bool>() ?? false,
Iban = json["iban"]?.AsValue().GetValue<string>(), Iban = json["iban"]?.AsValue().GetValue<string>(),
@@ -796,7 +796,7 @@ namespace Elwig.Helpers.Export {
}; };
} }
public static JsonObject ToJson(this AreaCmtContract c) { public static JsonObject ToJson(this AreaComContract c) {
return new JsonObject { return new JsonObject {
["fbnr"] = c.FbNr, ["fbnr"] = c.FbNr,
["kgnr"] = c.KgNr, ["kgnr"] = c.KgNr,
@@ -808,7 +808,7 @@ namespace Elwig.Helpers.Export {
}; };
} }
private static JsonObject ToJson(this AreaCmt c) { private static JsonObject ToJson(this AreaCom c) {
return new JsonObject { return new JsonObject {
["revnr"] = c.RevNr, ["revnr"] = c.RevNr,
["mgnr"] = c.MgNr, ["mgnr"] = c.MgNr,
@@ -823,7 +823,7 @@ namespace Elwig.Helpers.Export {
}; };
} }
public static (AreaCmtContract, List<(AreaCmt, (DateTime CreatedAt, DateTime ModifiedAt)?)>, WbRd?, (DateTime CreatedAt, DateTime ModifiedAt)?) ToAreaCmtContract(this JsonNode json, Dictionary<int, AT_Kg> kgs, Dictionary<int, WbKg> currentWbKgs, Dictionary<int, List<WbRd>> riede) { public static (AreaComContract, List<(AreaCom, (DateTime CreatedAt, DateTime ModifiedAt)?)>, WbRd?, (DateTime CreatedAt, DateTime ModifiedAt)?) ToAreaComContract(this JsonNode json, Dictionary<int, AT_Kg> kgs, Dictionary<int, WbKg> currentWbKgs, Dictionary<int, List<WbRd>> riede) {
var kgnr = json["kgnr"]!.AsValue().GetValue<int>(); var kgnr = json["kgnr"]!.AsValue().GetValue<int>();
var ried = json["ried"]?.AsValue().GetValue<string>(); var ried = json["ried"]?.AsValue().GetValue<string>();
var fbnr = json["fbnr"]!.AsValue()!.GetValue<int>(); var fbnr = json["fbnr"]!.AsValue()!.GetValue<int>();
@@ -848,16 +848,16 @@ namespace Elwig.Helpers.Export {
} }
var createdAt = json["created_at"]?.AsValue().GetValue<string>(); var createdAt = json["created_at"]?.AsValue().GetValue<string>();
var modifiedAt = json["modified_at"]?.AsValue().GetValue<string>(); var modifiedAt = json["modified_at"]?.AsValue().GetValue<string>();
return (new AreaCmtContract { return (new AreaComContract {
FbNr = fbnr, FbNr = fbnr,
KgNr = kgnr, KgNr = kgnr,
RdNr = rd?.RdNr ?? json["rdnr"]?.AsValue().GetValue<int>(), RdNr = rd?.RdNr ?? json["rdnr"]?.AsValue().GetValue<int>(),
Comment = json["comment"]?.AsValue().GetValue<string>(), Comment = json["comment"]?.AsValue().GetValue<string>(),
ImportedAt = DateTime.Now, ImportedAt = DateTime.Now,
}, [.. json["revisions"]!.AsArray().Select(r => r!.AsObject()).Select<JsonObject, (AreaCmt, (DateTime, DateTime)?)>(r => { }, [.. json["revisions"]!.AsArray().Select(r => r!.AsObject()).Select<JsonObject, (AreaCom, (DateTime, DateTime)?)>(r => {
var createdAt = json["created_at"]?.AsValue().GetValue<string>(); var createdAt = json["created_at"]?.AsValue().GetValue<string>();
var modifiedAt = json["modified_at"]?.AsValue().GetValue<string>(); var modifiedAt = json["modified_at"]?.AsValue().GetValue<string>();
return (new AreaCmt { return (new AreaCom {
FbNr = fbnr, FbNr = fbnr,
RevNr = r["revnr"]!.AsValue().GetValue<int>(), RevNr = r["revnr"]!.AsValue().GetValue<int>(),
MgNr = r["mgnr"]!.AsValue().GetValue<int>(), MgNr = r["mgnr"]!.AsValue().GetValue<int>(),
@@ -877,7 +877,7 @@ namespace Elwig.Helpers.Export {
DateTime.ParseExact(modifiedAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None))); DateTime.ParseExact(modifiedAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None)));
} }
public static (AreaCmtContract, AreaCmt, WbRd?, (DateTime CreatedAt, DateTime ModifiedAt)?) ToAreaCmt(this JsonNode json, Dictionary<int, AT_Kg> kgs, Dictionary<int, WbKg> currentWbKgs, Dictionary<int, List<WbRd>> riede) { public static (AreaComContract, AreaCom, WbRd?, (DateTime CreatedAt, DateTime ModifiedAt)?) ToAreaCom(this JsonNode json, Dictionary<int, AT_Kg> kgs, Dictionary<int, WbKg> currentWbKgs, Dictionary<int, List<WbRd>> riede) {
var kgnr = json["kgnr"]!.AsValue().GetValue<int>(); var kgnr = json["kgnr"]!.AsValue().GetValue<int>();
var ried = json["ried"]?.AsValue().GetValue<string>(); var ried = json["ried"]?.AsValue().GetValue<string>();
if (!currentWbKgs.Values.Any(k => k.KgNr == kgnr)) { if (!currentWbKgs.Values.Any(k => k.KgNr == kgnr)) {
@@ -901,13 +901,13 @@ namespace Elwig.Helpers.Export {
} }
var createdAt = json["created_at"]?.AsValue().GetValue<string>(); var createdAt = json["created_at"]?.AsValue().GetValue<string>();
var modifiedAt = json["modified_at"]?.AsValue().GetValue<string>(); var modifiedAt = json["modified_at"]?.AsValue().GetValue<string>();
return (new AreaCmtContract { return (new AreaComContract {
FbNr = json["fbnr"]!.AsValue().GetValue<int>(), FbNr = json["fbnr"]!.AsValue().GetValue<int>(),
KgNr = kgnr, KgNr = kgnr,
RdNr = rd?.RdNr ?? json["rdnr"]?.AsValue().GetValue<int>(), RdNr = rd?.RdNr ?? json["rdnr"]?.AsValue().GetValue<int>(),
Comment = json["comment"]?.AsValue().GetValue<string>(), Comment = json["comment"]?.AsValue().GetValue<string>(),
ImportedAt = DateTime.Now, ImportedAt = DateTime.Now,
}, new AreaCmt { }, new AreaCom {
FbNr = json["fbnr"]!.AsValue().GetValue<int>(), FbNr = json["fbnr"]!.AsValue().GetValue<int>(),
RevNr = 1, RevNr = 1,
MgNr = json["mgnr"]!.AsValue().GetValue<int>(), MgNr = json["mgnr"]!.AsValue().GetValue<int>(),
@@ -961,7 +961,7 @@ namespace Elwig.Helpers.Export {
}; };
if (p.IsSplCheck) obj["spl_check"] = p.IsSplCheck; if (p.IsSplCheck) obj["spl_check"] = p.IsSplCheck;
if (p.IsHandPicked != null) obj["hand_picked"] = p.IsHandPicked; if (p.IsHandPicked != null) obj["hand_picked"] = p.IsHandPicked;
if (p.IsContracted != null) obj["contracted"] = p.IsContracted; if (p.IsGebunden != null) obj["gebunden"] = p.IsGebunden;
if (p.Unloading != null) obj["unloading"] = p.Unloading; if (p.Unloading != null) obj["unloading"] = p.Unloading;
if (p.Temperature != null) obj["temperature"] = p.Temperature; if (p.Temperature != null) obj["temperature"] = p.Temperature;
if (p.Acid != null) obj["acid"] = p.Acid; if (p.Acid != null) obj["acid"] = p.Acid;
@@ -1035,7 +1035,7 @@ namespace Elwig.Helpers.Export {
Comment = p["comment"]?.AsValue().GetValue<string>(), Comment = p["comment"]?.AsValue().GetValue<string>(),
IsSplCheck = p["spl_check"]?.AsValue().GetValue<bool>() ?? false, IsSplCheck = p["spl_check"]?.AsValue().GetValue<bool>() ?? false,
IsHandPicked = p["hand_picked"]?.AsValue().GetValue<bool>(), IsHandPicked = p["hand_picked"]?.AsValue().GetValue<bool>(),
IsContracted = p["contracted"]?.AsValue().GetValue<bool>() ?? p["gebunden"]?.AsValue().GetValue<bool>(), IsGebunden = p["gebunden"]?.AsValue().GetValue<bool>(),
Unloading = p["unloading"]?.AsValue().GetValue<string>() ?? ((p["lesewagen"]?.AsValue().GetValue<bool>() ?? false) ? DeliveryPart.Pumped : null), Unloading = p["unloading"]?.AsValue().GetValue<string>() ?? ((p["lesewagen"]?.AsValue().GetValue<bool>() ?? false) ? DeliveryPart.Pumped : null),
Temperature = p["temperature"]?.AsValue().GetValue<double>(), Temperature = p["temperature"]?.AsValue().GetValue<double>(),
Acid = p["acid"]?.AsValue().GetValue<double>(), Acid = p["acid"]?.AsValue().GetValue<double>(),
+8
View File
@@ -0,0 +1,8 @@
using Elwig.Models.Dtos;
namespace Elwig.Helpers.Export {
/// <summary>
/// Interface for exporting banking data
/// </summary>
public interface IBankingExporter : IExporter<Transaction> { }
}
+2 -4
View File
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Elwig.Helpers.Export { namespace Elwig.Helpers.Export {
public interface IExporter<T> : IDisposable { public interface IExporter<T> : IDisposable, IAsyncDisposable {
/// <summary> /// <summary>
/// The default file extension of the exported files to be used (whithout a preceding ".") /// The default file extension of the exported files to be used (whithout a preceding ".")
/// </summary> /// </summary>
@@ -14,9 +14,7 @@ namespace Elwig.Helpers.Export {
/// </summary> /// </summary>
/// <param name="data">The data to be exported</param> /// <param name="data">The data to be exported</param>
/// <param name="progress">The progress object to report to</param> /// <param name="progress">The progress object to report to</param>
void Export(IEnumerable<T> data, IProgress<double>? progress = null) { void Export(IEnumerable<T> data, IProgress<double>? progress = null);
ExportAsync(data, progress).GetAwaiter().GetResult();
}
/// <summary> /// <summary>
/// Asynchronosly export the given data to the given file. /// Asynchronosly export the given data to the given file.
@@ -109,13 +109,8 @@ namespace Elwig.Helpers.Export {
<style:paragraph-properties fo:text-align="center"/> <style:paragraph-properties fo:text-align="center"/>
<style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/> <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
</style:style> </style:style>
<style:style style:name="sectionheader" style:family="table-cell" style:parent-style-name="default">
<style:table-cell-properties style:text-align-source="fix" style:repeat-content="false"/>
<style:paragraph-properties fo:text-align="left"/>
<style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold" fo:font-size="14pt"/>
</style:style>
<style:style style:name="th" style:family="table-cell" style:parent-style-name="default"> <style:style style:name="th" style:family="table-cell" style:parent-style-name="default">
<style:table-cell-properties style:text-align-source="fix" style:repeat-content="false" style:vertical-align="middle" fo:wrap-option="wrap"/> <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false" style:vertical-align="middle"/>
<style:paragraph-properties fo:text-align="center"/> <style:paragraph-properties fo:text-align="center"/>
<style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/> <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
</style:style> </style:style>
@@ -216,39 +211,17 @@ namespace Elwig.Helpers.Export {
} }
} }
await Content.WriteAsync($""" await Content.WriteAsync(
<table:table-row> $" <table:table-row>\r\n" +
{FormatCell(table.FullName, colSpan: totalSpan, style: "header")} FormatCell(table.FullName, colSpan: totalSpan, style: "header") +
</table:table-row> $" </table:table-row>\r\n" +
<table:table-row> $" <table:table-row>\r\n" +
{FormatCell(table.Subtitle, colSpan: totalSpan, style: "subheader")} FormatCell(table.Subtitle, colSpan: totalSpan, style: "subheader") +
</table:table-row> $" </table:table-row>\r\n" +
<table:table-row> $" <table:table-row>\r\n" +
<table:table-cell table:number-columns-repeated="{totalSpan}"/> $" <table:table-cell table:number-columns-repeated=\"{totalSpan}\"/>\r\n" +
</table:table-row> $" </table:table-row>\r\n" +
"""); $" <table:table-row>\r\n");
var firstSection = true;
foreach (var sec in table.GetData()) {
if (!firstSection) {
await Content.WriteAsync($"""
<table:table-row>
<table:table-cell table:number-columns-repeated="{totalSpan}"/>
</table:table-row>
<table:table-row>
<table:table-cell table:number-columns-repeated="{totalSpan}"/>
</table:table-row>
""");
}
if (sec.Name != null) {
await Content.WriteAsync($"""
<table:table-row>
{FormatCell(sec.Name, colSpan: totalSpan, style: "sectionheader")}
</table:table-row>
""");
}
await Content.WriteAsync(" <table:table-row>\r\n");
foreach (var (name, span, units) in table.ColumnNames.Zip(table.ColumnSpans, table.ColumnUnits)) { foreach (var (name, span, units) in table.ColumnNames.Zip(table.ColumnSpans, table.ColumnUnits)) {
var hasUnits = units.Length > 0; var hasUnits = units.Length > 0;
await Content.WriteAsync(FormatCell(name, colSpan: span, rowSpan: hasUnits ? 1 : 2, style: "th")); await Content.WriteAsync(FormatCell(name, colSpan: span, rowSpan: hasUnits ? 1 : 2, style: "th"));
@@ -265,11 +238,9 @@ namespace Elwig.Helpers.Export {
} }
await Content.WriteAsync(" </table:table-row>\r\n"); await Content.WriteAsync(" </table:table-row>\r\n");
foreach (var row in sec.Rows) { foreach (var row in table.GetData()) {
await FormatRow(row, table.ColumnUnits, mergeSubRowCells); await FormatRow(row, table.ColumnUnits, mergeSubRowCells);
} }
firstSection = false;
}
await Content.WriteAsync(" </table:table>\r\n"); await Content.WriteAsync(" </table:table>\r\n");
} }
@@ -343,8 +314,7 @@ namespace Elwig.Helpers.Export {
} }
c = $"<{ct} office:value-type=\"float\" calcext:value-type=\"float\" office:value=\"{v.ToString(CultureInfo.InvariantCulture)}\"{add}><text:p>{data}</text:p></{ct}>"; c = $"<{ct} office:value-type=\"float\" calcext:value-type=\"float\" office:value=\"{v.ToString(CultureInfo.InvariantCulture)}\"{add}><text:p>{data}</text:p></{ct}>";
} else { } else {
var lines = string.Join("", data.ToString()?.Split('\n').Select(l => $"<text:p>{SecurityElement.Escape(l)}</text:p>") ?? []); c = $"<{ct} office:value-type=\"string\" calcext:value-type=\"string\"{add}><text:p>{SecurityElement.Escape(data.ToString())}</text:p></{ct}>";
c = $"<{ct} office:value-type=\"string\" calcext:value-type=\"string\"{add}>{lines}</{ct}>";
} }
return $" {c}\r\n" + (colSpan > 1 ? $" <table:covered-table-cell table:number-columns-repeated=\"{colSpan - 1}\"/>\r\n" : ""); return $" {c}\r\n" + (colSpan > 1 ? $" <table:covered-table-cell table:number-columns-repeated=\"{colSpan - 1}\"/>\r\n" : "");
+10 -3
View File
@@ -13,9 +13,7 @@ namespace Elwig.Helpers.Export {
private readonly StreamWriter _writer; private readonly StreamWriter _writer;
public VCard(string filename) : public VCard(string filename) : this(filename, Utils.UTF8) { }
this(filename, Utils.UTF8) {
}
public VCard(string filename, Encoding encoding) { public VCard(string filename, Encoding encoding) {
_writer = new StreamWriter(filename, false, encoding); _writer = new StreamWriter(filename, false, encoding);
@@ -26,6 +24,11 @@ namespace Elwig.Helpers.Export {
_writer.Dispose(); _writer.Dispose();
} }
public ValueTask DisposeAsync() {
GC.SuppressFinalize(this);
return _writer.DisposeAsync();
}
public async Task ExportAsync(IEnumerable<Member> data, IProgress<double>? progress = null) { public async Task ExportAsync(IEnumerable<Member> data, IProgress<double>? progress = null) {
progress?.Report(0.0); progress?.Report(0.0);
int count = data.Count() + 1, i = 0; int count = data.Count() + 1, i = 0;
@@ -55,6 +58,10 @@ namespace Elwig.Helpers.Export {
progress?.Report(100.0); progress?.Report(100.0);
} }
public void Export(IEnumerable<Member> data, IProgress<double>? progress = null) {
ExportAsync(data, progress).GetAwaiter().GetResult();
}
private static string? Escape(string? text) { private static string? Escape(string? text) {
return text?.Replace("\\", "\\\\").Replace(",", "\\,").Replace(";", "\\;").Replace("\n", "\\n").Replace("\r", ""); return text?.Replace("\\", "\\\\").Replace(",", "\\,").Replace(";", "\\;").Replace("\n", "\\n").Replace("\r", "");
} }
+14 -17
View File
@@ -483,20 +483,12 @@ namespace Elwig.Helpers {
return InternetGetConnectedState(out var _, 0); return InternetGetConnectedState(out var _, 0);
} }
public static string ReplaceUmlaute(string s) {
return s
.Replace("ä", "ae").Replace("Ä", "Ae")
.Replace("ö", "oe").Replace("Ö", "Oe")
.Replace("ü", "ue").Replace("Ü", "Ue")
.Replace("ß", "ss").Replace("ẞ", "SS");
}
public static HttpClient GetHttpClient(string? username = null, string? password = null, string? accept = null) { public static HttpClient GetHttpClient(string? username = null, string? password = null, string? accept = null) {
var client = new HttpClient() { var client = new HttpClient() {
Timeout = TimeSpan.FromSeconds(5), Timeout = TimeSpan.FromSeconds(5),
}; };
client.DefaultRequestHeaders.UserAgent.Clear(); client.DefaultRequestHeaders.UserAgent.Clear();
client.DefaultRequestHeaders.UserAgent.ParseAdd($"Elwig/{App.Version} ({App.Client?.NameToken}, {ReplaceUmlaute(App.BranchName)}, {Environment.MachineName}, {Environment.OSVersion})"); client.DefaultRequestHeaders.UserAgent.ParseAdd($"Elwig/{App.Version} ({App.Client?.NameToken}, {App.BranchName}, {Environment.MachineName}, {Environment.OSVersion})");
client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Clear();
if (accept != null) if (accept != null)
client.DefaultRequestHeaders.Accept.Add(new(accept)); client.DefaultRequestHeaders.Accept.Add(new(accept));
@@ -505,13 +497,18 @@ namespace Elwig.Helpers {
return client; return client;
} }
public static async Task<(string Version, string Url, long Size)> GetLatestInstallerUrl(string url) { public static async Task<(string Version, string Url, long Size)?> GetLatestInstallerUrl(string url) {
try {
using var client = GetHttpClient(accept: "application/json"); using var client = GetHttpClient(accept: "application/json");
using var res = await client.GetAsync(url); using var res = await client.GetAsync(url);
res.EnsureSuccessStatusCode(); if (!res.IsSuccessStatusCode)
return null;
var resJson = JsonNode.Parse(await res.Content.ReadAsStringAsync()); var resJson = JsonNode.Parse(await res.Content.ReadAsStringAsync());
var data = resJson!["data"]!.AsArray()[^1]!; var data = resJson!["data"]!.AsArray()[^1]!;
return ((string)data["version"]!, (string)data["url"]!, (long)data["size"]!); return ((string)data["version"]!, (string)data["url"]!, (long)data["size"]!);
} catch {
return null;
}
} }
public static async Task UploadExportData(string zip, string url, string username, string password) { public static async Task UploadExportData(string zip, string url, string username, string password) {
@@ -665,16 +662,16 @@ namespace Elwig.Helpers {
} }
} }
public static Expression<Func<AreaCmt, bool>> ActiveAreaCommitments() => ActiveAreaCommitments(CurrentYear); public static Expression<Func<AreaCom, bool>> ActiveAreaCommitments() => ActiveAreaCommitments(CurrentYear);
public static Expression<Func<AreaCmt, bool>> ActiveAreaCommitments(int year) => public static Expression<Func<AreaCom, bool>> ActiveAreaCommitments(int year) =>
c => (c.YearFrom == null || c.YearFrom <= year) && (c.YearTo == null || c.YearTo >= year); c => (c.YearFrom == null || c.YearFrom <= year) && (c.YearTo == null || c.YearTo >= year);
public static IQueryable<AreaCmt> ActiveAreaCommitments(IQueryable<AreaCmt> query) => ActiveAreaCommitments(query, CurrentYear); public static IQueryable<AreaCom> ActiveAreaCommitments(IQueryable<AreaCom> query) => ActiveAreaCommitments(query, CurrentYear);
public static IQueryable<AreaCmt> ActiveAreaCommitments(IQueryable<AreaCmt> query, int year) => public static IQueryable<AreaCom> ActiveAreaCommitments(IQueryable<AreaCom> query, int year) =>
query.Where(ActiveAreaCommitments(year)); query.Where(ActiveAreaCommitments(year));
public static IEnumerable<AreaCmt> ActiveAreaCommitments(IEnumerable<AreaCmt> query) => ActiveAreaCommitments(query, CurrentYear); public static IEnumerable<AreaCom> ActiveAreaCommitments(IEnumerable<AreaCom> query) => ActiveAreaCommitments(query, CurrentYear);
public static IEnumerable<AreaCmt> ActiveAreaCommitments(IEnumerable<AreaCmt> query, int year) => public static IEnumerable<AreaCom> ActiveAreaCommitments(IEnumerable<AreaCom> query, int year) =>
query.Where(c => ActiveAreaCommitments(year).Invoke(c)); query.Where(c => ActiveAreaCommitments(year).Invoke(c));
public static async Task<(DateTime DateTime, string Type, int MgNr, string Name, string[] Addresses, string Subject, string[] Attachments)[]> GetSentMails(DateOnly? fromDate = null, DateOnly? toDate = null) { public static async Task<(DateTime DateTime, string Type, int MgNr, string Name, string[] Addresses, string Subject, string[] Attachments)[]> GetSentMails(DateOnly? fromDate = null, DateOnly? toDate = null) {
+1 -1
View File
@@ -577,7 +577,7 @@ namespace Elwig.Helpers {
} }
} }
public static ValidationResult CheckFbNr(TextBox input, bool required, AreaCmtContract? c) { public static ValidationResult CheckFbNr(TextBox input, bool required, AreaComContract? c) {
var res = CheckInteger(input, required); var res = CheckInteger(input, required);
if (!res.IsValid) { if (!res.IsValid) {
return res; return res;
@@ -5,7 +5,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Elwig.Models.Dtos { namespace Elwig.Models.Dtos {
public class AreaCmtUnderDeliveryData : DataTable<AreaCmtUnderDeliveryRow> { public class AreaComUnderDeliveryData : DataTable<AreaComUnderDeliveryRow> {
private static readonly (string, string, string?, int)[] FieldNames = [ private static readonly (string, string, string?, int)[] FieldNames = [
("MgNr", "MgNr.", null, 12), ("MgNr", "MgNr.", null, 12),
@@ -21,19 +21,19 @@ namespace Elwig.Models.Dtos {
("UnderDeliveries", "Unterliefert", "kg|%", 34), ("UnderDeliveries", "Unterliefert", "kg|%", 34),
]; ];
public AreaCmtUnderDeliveryData(IEnumerable<AreaCmtUnderDeliveryRow> rows, int year) : public AreaComUnderDeliveryData(IEnumerable<AreaComUnderDeliveryRow> rows, int year) :
base($"Unterlieferungen FB", $"Unterlieferungen laut Flächenbindungen {year}", rows, FieldNames) { base($"Unterlieferungen FB", $"Unterlieferungen laut Flächenbindungen {year}", rows, FieldNames) {
} }
public static async Task<AreaCmtUnderDeliveryData> ForSeason(DbSet<AreaCmtUnderDeliveryRowSingle> table, int year) { public static async Task<AreaComUnderDeliveryData> ForSeason(DbSet<AreaComUnderDeliveryRowSingle> table, int year) {
return new AreaCmtUnderDeliveryData( return new AreaComUnderDeliveryData(
(await FromDbSet(table, year)).GroupBy( (await FromDbSet(table, year)).GroupBy(
r => r.MgNr, r => r.MgNr,
(k, g) => new AreaCmtUnderDeliveryRow(g) (k, g) => new AreaComUnderDeliveryRow(g)
), year); ), year);
} }
private static async Task<IEnumerable<AreaCmtUnderDeliveryRowSingle>> FromDbSet(DbSet<AreaCmtUnderDeliveryRowSingle> table, int year) { private static async Task<IEnumerable<AreaComUnderDeliveryRowSingle>> FromDbSet(DbSet<AreaComUnderDeliveryRowSingle> 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 ||
@@ -51,7 +51,7 @@ namespace Elwig.Models.Dtos {
} }
} }
public class AreaCmtUnderDeliveryRow { public class AreaComUnderDeliveryRow {
public int MgNr; public int MgNr;
public string Name1; public string Name1;
public string? Name2; public string? Name2;
@@ -66,7 +66,7 @@ namespace Elwig.Models.Dtos {
.Select(v => v.First < v.Second ? ((int?, double?))(v.First - v.Second, v.First * 100.0 / v.Second - 100.0) : (null, null)) .Select(v => v.First < v.Second ? ((int?, double?))(v.First - v.Second, v.First * 100.0 / v.Second - 100.0) : (null, null))
.ToArray(); .ToArray();
public AreaCmtUnderDeliveryRow(IEnumerable<AreaCmtUnderDeliveryRowSingle> rows) { public AreaComUnderDeliveryRow(IEnumerable<AreaComUnderDeliveryRowSingle> rows) {
var f = rows.First(); var f = rows.First();
MgNr = f.MgNr; MgNr = f.MgNr;
Name1 = f.Name1; Name1 = f.Name1;
@@ -82,7 +82,7 @@ namespace Elwig.Models.Dtos {
} }
[Keyless] [Keyless]
public class AreaCmtUnderDeliveryRowSingle { public class AreaComUnderDeliveryRowSingle {
[Column("mgnr")] [Column("mgnr")]
public int MgNr { get; set; } public int MgNr { get; set; }
[Column("name_1")] [Column("name_1")]
+35 -54
View File
@@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
@@ -10,14 +9,13 @@ namespace Elwig.Models.Dtos {
public string Name { get; set; } public string Name { get; set; }
public string FullName { get; set; } public string FullName { get; set; }
public string? Subtitle { get; set; } public string? Subtitle { get; set; }
public IEnumerable<(string? Name, IEnumerable<T> Rows)> Sections { get; private set; } public IEnumerable<T> Rows { get; private set; }
public IEnumerable<T> Rows => Sections.SelectMany(s => s.Rows);
public int RowNum => Rows.Count(); public int RowNum => Rows.Count();
public int ColNum => ColumnNames.Count(); public int ColNum => ColumnNames.Count();
public IEnumerable<(string Name, Type? Type)> ColumnDefs => _map.Select(m => (m.Name, m.PInfo?.PropertyType ?? m.FInfo?.FieldType)); public IEnumerable<(string, Type?)> ColumnDefs => _map.Select(m => (m.Item1, m.Item2?.PropertyType ?? m.Item3?.FieldType));
public IEnumerable<string> ColumnNames => ColumnDefs.Select(m => m.Name); public IEnumerable<string> ColumnNames => ColumnDefs.Select(m => m.Item1);
public IEnumerable<Type?> ColumnTypes => ColumnDefs.Select(m => m.Type); public IEnumerable<Type?> ColumnTypes => ColumnDefs.Select(m => m.Item2);
public IEnumerable<Type?> ColumnFlatTypes { get; private set; } public IEnumerable<Type?> ColumnFlatTypes { get; private set; }
public IEnumerable<int> ColumnSpans { get; private set; } public IEnumerable<int> ColumnSpans { get; private set; }
public IEnumerable<int?> ColumnWidths { get; private set; } public IEnumerable<int?> ColumnWidths { get; private set; }
@@ -25,87 +23,70 @@ namespace Elwig.Models.Dtos {
private readonly PropertyInfo[] _properties; private readonly PropertyInfo[] _properties;
private readonly FieldInfo[] _fields; private readonly FieldInfo[] _fields;
private readonly (string Name, PropertyInfo? PInfo, FieldInfo? FInfo)[] _map; private readonly (string, PropertyInfo?, FieldInfo?)[] _map;
public DataTable(string name, string fullName, string subtitle, IEnumerable<(string? Name, IEnumerable<T> Rows)> sections, IEnumerable<(string Property, string Name, string? Unit, int? Width)>? colNames = null) : public DataTable(string name, string fullName, string subtitle, IEnumerable<T> rows, IEnumerable<(string, string, string?, int?)>? colNames = null) :
this(name, fullName, sections, colNames) { this(name, fullName, rows, colNames) {
Subtitle = subtitle; Subtitle = subtitle;
} }
public DataTable(string name, string fullName, string subtitle, IEnumerable<T> rows, IEnumerable<(string Property, string Name, string? Unit, int? Width)>? colNames = null) : public DataTable(string name, string fullName, IEnumerable<T> rows, IEnumerable<(string, string, string?, int?)>? colNames = null) {
this(name, fullName, subtitle, [(null, rows)], colNames) {
}
public DataTable(string name, string fullName, IEnumerable<(string? Name, IEnumerable<T> Rows)> sections, IEnumerable<(string Property, string Name, string? Unit, int? Width)>? colNames = null) {
_fields = typeof(T).GetFields(); _fields = typeof(T).GetFields();
_properties = typeof(T).GetProperties(); _properties = typeof(T).GetProperties();
colNames ??= [.. _properties.Select(p => p.Name).Union(_fields.Select(f => f.Name)).Select(i => (i, i, (string?)null, (int?)null))]; colNames ??= _properties.Select(p => p.Name).Union(_fields.Select(f => f.Name)).Select(i => (i, i, (string?)null, (int?)null)).ToList();
_map = [.. colNames.Select(n => (n.Name, _properties.FirstOrDefault(p => p?.Name == n.Property, null), _fields.FirstOrDefault(f => f?.Name == n.Property, null)))]; _map = colNames.Select(n => (n.Item2, _properties.FirstOrDefault(p => p?.Name == n.Item1, null), _fields.FirstOrDefault(f => f?.Name == n.Item1, null))).ToArray();
Name = name; Name = name;
FullName = fullName; FullName = fullName;
Sections = sections; Rows = rows;
ColumnFlatTypes = [.. ColumnTypes.SelectMany(type => { ColumnFlatTypes = ColumnTypes.SelectMany(type => {
var elType = type?.GetElementType(); var elType = type?.GetElementType();
return type != null && type.IsValueType && type.Name.StartsWith("ValueTuple") ? type.GetFields().Select(f => (Type?)f.FieldType) : return type != null && type.IsValueType && type.Name.StartsWith("ValueTuple") ? type.GetFields().Select(f => f.FieldType) :
type != null && elType != null && type.IsArray && elType.IsValueType && elType.Name.StartsWith("ValueTuple") ? elType.GetFields().Select(f => (Type?)f.FieldType) : type != null && elType != null && type.IsArray && elType.IsValueType && elType.Name.StartsWith("ValueTuple") ? elType.GetFields().Select(f => f.FieldType) :
[type]; [type];
})]; }).ToList();
ColumnSpans = [.. ColumnTypes.Select(type => { ColumnSpans = ColumnTypes.Select(type => {
var elType = type?.GetElementType(); var elType = type?.GetElementType();
return type != null && type.IsValueType && type.Name.StartsWith("ValueTuple") ? type.GetFields().Length : return type != null && type.IsValueType && type.Name.StartsWith("ValueTuple") ? type.GetFields().Length :
type != null && elType != null && type.IsArray && elType.IsValueType && elType.Name.StartsWith("ValueTuple") ? elType.GetFields().Length : type != null && elType != null && type.IsArray && elType.IsValueType && elType.Name.StartsWith("ValueTuple") ? elType.GetFields().Length : 1;
1; }).ToList();
})]; ColumnWidths = colNames.Select(c => c.Item4).ToList();
ColumnWidths = [.. colNames.Select(c => c.Width)]; ColumnUnits = colNames.Select(c => c.Item3?.Split("|").Select(p => p.Length == 0 ? null : p).ToArray() ?? []).ToList();
ColumnUnits = [.. colNames.Select(c => c.Unit?.Split("|").Select(p => p.Length == 0 ? null : p).ToArray() ?? [])];
} }
public DataTable(string name, string fullName, IEnumerable<T> rows, IEnumerable<(string Property, string Name, string? Unit, int? Width)>? colNames = null) : public DataTable(string name, string fullName, IEnumerable<T> rows, IEnumerable<(string, string, string?)>? colNames = null) :
this(name, fullName, [(null, rows)], colNames) { this(name, fullName, rows, colNames?.Select(c => (c.Item1, c.Item2, c.Item3, (int?)null))) {
} }
public DataTable(string name, string fullName, IEnumerable<T> rows, IEnumerable<(string Property, string Name, string? Unit)>? colNames = null) : public DataTable(string name, IEnumerable<T> rows, IEnumerable<(string, string, string?)>? colNames = null) :
this(name, fullName, rows, colNames?.Select(c => (c.Property, c.Name, c.Unit, (int?)null))) {
}
public DataTable(string name, string fullName, IEnumerable<T> rows, IEnumerable<(string Property, string Name, string? Unit, int Width)>? colNames = null) :
this(name, fullName, rows, colNames?.Select(c => (c.Property, c.Name, c.Unit, (int?)c.Width))) {
}
public DataTable(string name, IEnumerable<T> rows, IEnumerable<(string Property, string Name, string? Unit, int? Width)>? colNames = null) :
this(name, name, rows, colNames) { this(name, name, rows, colNames) {
} }
public DataTable(string name, IEnumerable<T> rows, IEnumerable<(string Property, string Name, string? Unit)>? colNames = null) : public DataTable(string name, IEnumerable<T> rows, IEnumerable<(string, string, string?, int?)>? colNames = null) :
this(name, name, rows, colNames) { this(name, name, rows, colNames) {
} }
public DataTable(string name, IEnumerable<T> rows, IEnumerable<(string Property, string Name, string? Unit, int Width)>? colNames = null) : public DataTable(string name, IEnumerable<T> rows, IEnumerable<(string, string, string?, int)>? colNames = null) :
this(name, name, rows, colNames) { this(name, name, rows, colNames) {
} }
public DataTable(string name, string fullName, IEnumerable<(string? Name, IEnumerable<T> Rows)> sections, IEnumerable<(string Property, string Name, string? Unit)>? colNames = null) : public DataTable(string name, string fullName, IEnumerable<T> rows, IEnumerable<(string, string, string?, int)>? colNames = null) :
this(name, fullName, sections, colNames?.Select(c => (c.Property, c.Name, c.Unit, (int?)null))) { this(name, fullName, rows, colNames?.Select(c => (c.Item1, c.Item2, c.Item3, (int?)c.Item4))) {
} }
public DataTable(string name, string fullName, IEnumerable<(string? Name, IEnumerable<T> Rows)> sections, IEnumerable<(string Property, string Name, string? Unit, int Width)>? colNames = null) : protected IEnumerable<(string, object?)> GetNamedRowData(T row) {
this(name, fullName, sections, colNames?.Select(c => (c.Property, c.Name, c.Unit, (int?)c.Width))) { return _map.Select(i => (i.Item1, i.Item2?.GetValue(row) ?? i.Item3?.GetValue(row)));
} }
protected IEnumerable<(string Name, object? Value)> GetNamedRowValues(T row) { protected IEnumerable<object?> GetRowData(T row) {
return _map.Select(i => (i.Name, i.PInfo?.GetValue(row) ?? i.FInfo?.GetValue(row))); return GetNamedRowData(row).Select(i => i.Item2);
} }
protected IEnumerable<object?> GetRowValues(T row) { public IEnumerable<IEnumerable<object?>> GetData() {
return GetNamedRowValues(row).Select(i => i.Value); return Rows.Select(GetRowData);
} }
public IEnumerable<(string? Name, IEnumerable<IEnumerable<object?>> Rows)> GetData() { public IEnumerable<IEnumerable<(string, object?)>> GetNamedData() {
return Sections.Select(s => (s.Name, s.Rows.Select(GetRowValues))); return Rows.Select(GetNamedRowData);
}
public IEnumerable<(string? Name, IEnumerable<IEnumerable<(string Name, object? Value)>> Rows)> GetNamedData() {
return Sections.Select(s => (s.Name, s.Rows.Select(GetNamedRowValues)));
} }
} }
} }
@@ -5,7 +5,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Elwig.Models.Dtos { namespace Elwig.Models.Dtos {
class MemberAreaCmtTotalsData : DataTable<MemberAreaCmtTotalsRow> { class MemberAreaComTotalsData : DataTable<MemberAreaComTotalsRow> {
private static readonly (string, string, string?, int)[] FieldNames = [ private static readonly (string, string, string?, int)[] FieldNames = [
("MgNr", "MgNr.", null, 12), ("MgNr", "MgNr.", null, 12),
@@ -21,19 +21,19 @@ namespace Elwig.Models.Dtos {
("DeliveryRights", "Lieferrecht", "kg", 22), ("DeliveryRights", "Lieferrecht", "kg", 22),
]; ];
public MemberAreaCmtTotalsData(IEnumerable<MemberAreaCmtTotalsRow> rows, int year) : public MemberAreaComTotalsData(IEnumerable<MemberAreaComTotalsRow> rows, int year) :
base($"Gebundene Fläche", $"Gebundene Fläche pro Mitglied {year}", rows, FieldNames) { base($"Gebundene Fläche", $"Gebundene Fläche pro Mitglied {year}", rows, FieldNames) {
} }
public static async Task<MemberAreaCmtTotalsData> ForSeason(DbSet<MemberAreaCmtTotalsRowSingle> table, int year) { public static async Task<MemberAreaComTotalsData> ForSeason(DbSet<MemberAreaComTotalsRowSingle> table, int year) {
return new MemberAreaCmtTotalsData( return new MemberAreaComTotalsData(
(await FromDbSet(table, year)).GroupBy( (await FromDbSet(table, year)).GroupBy(
r => r.MgNr, r => r.MgNr,
(k, g) => new MemberAreaCmtTotalsRow(g) (k, g) => new MemberAreaComTotalsRow(g)
), year); ), year);
} }
private static async Task<IEnumerable<MemberAreaCmtTotalsRowSingle>> FromDbSet(DbSet<MemberAreaCmtTotalsRowSingle> table, int year) { private static async Task<IEnumerable<MemberAreaComTotalsRowSingle>> FromDbSet(DbSet<MemberAreaComTotalsRowSingle> 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 ||
@@ -50,7 +50,7 @@ namespace Elwig.Models.Dtos {
} }
} }
public class MemberAreaCmtTotalsRow { public class MemberAreaComTotalsRow {
public int MgNr; public int MgNr;
public string Name1; public string Name1;
public string? Name2; public string? Name2;
@@ -63,7 +63,7 @@ namespace Elwig.Models.Dtos {
public int[] DeliveryObligations; public int[] DeliveryObligations;
public int[] DeliveryRights; public int[] DeliveryRights;
public MemberAreaCmtTotalsRow(IEnumerable<MemberAreaCmtTotalsRowSingle> rows) { public MemberAreaComTotalsRow(IEnumerable<MemberAreaComTotalsRowSingle> rows) {
var f = rows.First(); var f = rows.First();
MgNr = f.MgNr; MgNr = f.MgNr;
Name1 = f.Name1; Name1 = f.Name1;
@@ -80,7 +80,7 @@ namespace Elwig.Models.Dtos {
} }
[Keyless] [Keyless]
public class MemberAreaCmtTotalsRowSingle { public class MemberAreaComTotalsRowSingle {
[Column("mgnr")] [Column("mgnr")]
public int MgNr { get; set; } public int MgNr { get; set; }
[Column("name_1")] [Column("name_1")]
@@ -5,7 +5,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Elwig.Models.Dtos { namespace Elwig.Models.Dtos {
class MemberAreaCmtsData : DataTable<MemberAreaCmtsRow> { class MemberAreaComsData : DataTable<MemberAreaComsRow> {
private static readonly (string, string, string?, int)[] FieldNames = [ private static readonly (string, string, string?, int)[] FieldNames = [
("MgNr", "MgNr.", null, 12), ("MgNr", "MgNr.", null, 12),
@@ -23,15 +23,15 @@ namespace Elwig.Models.Dtos {
("MaxKg", "Lieferrecht", "kg", 22), ("MaxKg", "Lieferrecht", "kg", 22),
]; ];
public MemberAreaCmtsData(IEnumerable<MemberAreaCmtsRow> 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<MemberAreaCmtsData> ForSeason(DbSet<MemberAreaCmtsRow> table, int year) { public static async Task<MemberAreaComsData> ForSeason(DbSet<MemberAreaComsRow> table, int year) {
return new MemberAreaCmtsData(await FromDbSet(table, year), year); return new MemberAreaComsData(await FromDbSet(table, year), year);
} }
private static async Task<IEnumerable<MemberAreaCmtsRow>> FromDbSet(DbSet<MemberAreaCmtsRow> 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 ||
@@ -56,7 +56,7 @@ namespace Elwig.Models.Dtos {
} }
[Keyless] [Keyless]
public class MemberAreaCmtsRow { public class MemberAreaComsRow {
[Column("mgnr")] [Column("mgnr")]
public int MgNr { get; set; } public int MgNr { get; set; }
[Column("name_1")] [Column("name_1")]
+9 -9
View File
@@ -25,7 +25,7 @@ namespace Elwig.Models.Dtos {
("BillingPlz", "PLZ", null, 10), ("BillingPlz", "PLZ", null, 10),
("BillingLocality", "Ort", null, 60), ("BillingLocality", "Ort", null, 60),
("LfbisNr", "Betr.-Nr.", null, 20), ("LfbisNr", "Betr.-Nr.", null, 20),
("IsAccounting", "buchf.", null, 15), ("IsBuchführend", "buchf.", null, 15),
("IsOrganic", "Bio", null, 15), ("IsOrganic", "Bio", null, 15),
("IsActive", "aktiv", null, 15), ("IsActive", "aktiv", null, 15),
("EntryDate", "Eintritt", null, 20), ("EntryDate", "Eintritt", null, 20),
@@ -46,15 +46,15 @@ namespace Elwig.Models.Dtos {
base(MemberList.Name, MemberList.Name, string.Join(" / ", filterNames), rows, FieldNames) { base(MemberList.Name, MemberList.Name, string.Join(" / ", filterNames), rows, FieldNames) {
} }
public static async Task<MemberListData> FromQuery(IQueryable<Member> query, List<string> filterNames, IEnumerable<string> filterAreaCmt) { public static async Task<MemberListData> FromQuery(IQueryable<Member> query, List<string> filterNames, IEnumerable<string> filterAreaCom) {
var areaCmts = await query.Include(m => m.AreaCommitments).ToDictionaryAsync(m => m.MgNr, m => Utils.ActiveAreaCommitments(m.AreaCommitments)); var areaComs = await query.Include(m => m.AreaCommitments).ToDictionaryAsync(m => m.MgNr, m => Utils.ActiveAreaCommitments(m.AreaCommitments));
return new((await query return new((await query
.Include(m => m.Branch) .Include(m => m.Branch)
.Include(m => m.TelephoneNumbers) .Include(m => m.TelephoneNumbers)
.Include(m => m.EmailAddresses) .Include(m => m.EmailAddresses)
.ToListAsync()).Select(m => new MemberListRow(m, .ToListAsync()).Select(m => new MemberListRow(m,
areaCmts[m.MgNr].Sum(c => c.Area), areaComs[m.MgNr].Sum(c => c.Area),
areaCmts[m.MgNr].Where(c => filterAreaCmt.Contains(c.VtrgId)).GroupBy(c => c.VtrgId).ToDictionary(g => g.Key, g => g.Sum(c => c.Area)))), areaComs[m.MgNr].Where(c => filterAreaCom.Contains(c.VtrgId)).GroupBy(c => c.VtrgId).ToDictionary(g => g.Key, g => g.Sum(c => c.Area)))),
filterNames); filterNames);
} }
} }
@@ -83,7 +83,7 @@ namespace Elwig.Models.Dtos {
public string? Bic; public string? Bic;
public int? AreaCommitment; public int? AreaCommitment;
public (string VtrgId, int Area)[] AreaCommitmentsFiltered; public (string VtrgId, int Area)[] AreaCommitmentsFiltered;
public bool IsAccounting; public bool IsBuchführend;
public bool IsOrganic; public bool IsOrganic;
public bool IsActive; public bool IsActive;
public DateOnly? EntryDate; public DateOnly? EntryDate;
@@ -94,7 +94,7 @@ namespace Elwig.Models.Dtos {
public string? AdditionalContact; public string? AdditionalContact;
public string? Comment; public string? Comment;
public MemberListRow(Member m, int? areaCmt = null, Dictionary<string, int>? filtered = null) { public MemberListRow(Member m, int? areaCom = null, Dictionary<string, int>? filtered = null) {
MgNr = m.MgNr; MgNr = m.MgNr;
Name1 = m.Name; Name1 = m.Name;
AdminName1 = m.AdministrativeName1; AdminName1 = m.AdministrativeName1;
@@ -118,7 +118,7 @@ namespace Elwig.Models.Dtos {
UstIdNr = m.UstIdNr; UstIdNr = m.UstIdNr;
Iban = m.Iban != null ? Utils.FormatIban(m.Iban) : null; Iban = m.Iban != null ? Utils.FormatIban(m.Iban) : null;
Bic = m.Bic; Bic = m.Bic;
IsAccounting = m.IsAccounting; IsBuchführend = m.IsBuchführend;
IsOrganic = m.IsOrganic; IsOrganic = m.IsOrganic;
IsActive = m.IsActive; IsActive = m.IsActive;
EntryDate = m.EntryDate; EntryDate = m.EntryDate;
@@ -133,7 +133,7 @@ namespace Elwig.Models.Dtos {
.Distinct() .Distinct()
.Concat(m.EmailAddresses.OrderBy(a => a.Nr).Select(a => a.Address).Except([EmailAddress]))); .Concat(m.EmailAddresses.OrderBy(a => a.Nr).Select(a => a.Address).Except([EmailAddress])));
Comment = m.Comment; Comment = m.Comment;
AreaCommitment = areaCmt == 0 ? null : areaCmt; AreaCommitment = areaCom == 0 ? null : areaCom;
AreaCommitmentsFiltered = filtered != null ? filtered.OrderBy(f => f.Key).Select(f => (f.Key, f.Value)).ToArray() : []; AreaCommitmentsFiltered = filtered != null ? filtered.OrderBy(f => f.Key).Select(f => (f.Key, f.Value)).ToArray() : [];
} }
} }
-142
View File
@@ -1,142 +0,0 @@
using Elwig.Helpers;
using Elwig.Models.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Elwig.Models.Dtos {
public class MemberMovementData : DataTable<MemberMovementDataRow> {
private static readonly (string, string, string?, int)[] FieldNames = [
("Type", "\u2026 durch", null, 30),
("MgNr", "MgNr.", null, 12),
("Name1", "Name", null, 40),
("Name2", "Vorname", null, 25),
("Address", "Adresse", null, 50),
("Plz", "PLZ", null, 10),
("Locality", "Ort", null, 50),
("Date", "Datum", null, 20),
("SharesOld", "GA\nalt", null, 10),
("SharesDiff", "GA\nDiff.", null, 10),
("SharesNew", "GA\nneu", null, 10),
("Costs", "Kosten", "€", 15),
];
private MemberMovementData(string name, IEnumerable<(string? Name, IEnumerable<MemberMovementDataRow> Rows)> sections) :
base("Mitgl.-Bewegungen", name, sections, FieldNames) {
}
public static MemberMovementData FromMemberHistory(string name, IEnumerable<MemberHistory> rows, Dictionary<int, SortedDictionary<DateOnly, MemberHistoryPoint>> history) {
(string? Name, List<MemberMovementDataRow> Rows)[] sections = [
("Beitritt", []),
("Nachzeichnung (GA)", []),
("Überschreibung", []),
("Kündigung (GA)", []),
("Austritt", []),
];
foreach (var h in rows.OrderBy(r => r.DateNotice).ThenBy(r => r.ToMgNr).ThenBy(r => r.FromMgNr)) {
int cat;
if (h.ToMgNr == h.FromMgNr) {
// Umwandlung
if (h.ToType == BusinessShareType.Dormant) {
// Kündigung (GA)
cat = 3;
} else if (h.FromType == h.ToType) {
// Überschreibung
cat = 2;
} else {
throw new NotImplementedException();
}
} else if (h.DateNotice <= h.ToMember?.EntryDate && h.DateNotice >= h.FromMember?.ExitDate) {
// Überschreibung
cat = 2;
} else if (h.DateNotice <= h.ToMember?.EntryDate) {
// Beitritt
cat = 0;
} else if (h.DateNotice >= h.FromMember?.ExitDate) {
// Austritt
cat = 4;
} else if (h.ToMember == null) {
// Auszahlung
continue;
} else {
// Nachzeichnung (GA)
cat = 1;
}
Member a;
Member? b = null;
if (h.FromMember != null && h.ToMember != null) {
if (cat <= 1) {
a = h.ToMember;
b = h.FromMember;
} else {
a = h.FromMember;
b = h.ToMember;
}
} else if (h.FromMember != null) {
a = h.FromMember;
} else if (h.ToMember != null) {
a = h.ToMember;
} else {
throw new ArgumentException();
}
var oldA = history[a.MgNr].GetValueOrDefault(h.DateNotice);
var d = new MemberMovementDataRow {
Type = [h.ReasonPretty],
MgNr = [a.MgNr],
Name1 = [a.Name],
Name2 = [a.AdministrativeName2],
Address = [a.Address],
Plz = [a.PostalDest.AtPlz!.Plz],
Locality = [a.PostalDest.AtPlz.Ort.Name],
Date = h.DateNotice,
SharesOld = [oldA.Shares + oldA.SharesRed + oldA.SharesWhite],
SharesDiff = [cat != 3 && a == h.ToMember ? h.Shares : -h.Shares],
Costs = [h.FromMember == null ? h.TotalValue : null],
};
d.SharesNew = [d.SharesOld[^1] + (h.FromMgNr == h.ToMgNr ? 0 : d.SharesDiff[^1])];
if (b != null) {
var oldB = history[b.MgNr].GetValueOrDefault(h.DateNotice);
d.Type = [..d.Type, "\u2026 " + (cat <= 1 ? "von" : "an")];
d.MgNr = [.. d.MgNr, b.MgNr];
d.Name1 = [.. d.Name1, b.Name];
d.Name2 = [.. d.Name2, b.AdministrativeName2];
d.Address = [.. d.Address, b.Address];
d.Plz = [.. d.Plz, b.PostalDest.AtPlz!.Plz];
d.Locality = [.. d.Locality, b.PostalDest.AtPlz.Ort.Name];
d.SharesOld = [.. d.SharesOld, oldB.Shares + oldB.SharesRed + oldB.SharesWhite];
d.SharesDiff = [.. d.SharesDiff, b == h.ToMember ? h.Shares : -h.Shares];
d.SharesNew = [.. d.SharesNew, d.SharesOld[^1] + d.SharesDiff[^1]];
}
sections[cat].Rows.Add(d);
}
return new MemberMovementData($"Mitglieder-Bewegungen {name}", sections.Select(s => (s.Name, (IEnumerable<MemberMovementDataRow>)s.Rows)));
}
}
public class MemberMovementDataRow {
public string[] Type = [];
public int[] MgNr = [];
public string[] Name1 = [];
public string?[] Name2 = [];
public string[] Address = [];
public int[] Plz = [];
public string[] Locality = [];
public DateOnly Date;
public int?[] SharesOld = [];
public int[] SharesDiff = [];
public int?[] SharesNew = [];
public decimal?[] Costs = [];
}
}
+36 -36
View File
@@ -18,9 +18,9 @@ namespace Elwig.Models.Dtos {
("Cultivation", "Bewirt.", null, 20), ("Cultivation", "Bewirt.", null, 20),
("QualityLevel", "Qualitätsstufe", null, 30), ("QualityLevel", "Qualitätsstufe", null, 30),
("Oe", "Gradation", "°Oe", 20), ("Oe", "Gradation", "°Oe", 20),
("UnCtrd", "ungebunden", "kg|€/kg|€/kg", 60), ("Ungeb", "ungebunden", "kg|€/kg|€/kg", 60),
("LowCtrd", "attributlos gebunden", "kg|€/kg|€/kg", 60), ("LowGeb", "attributlos gebunden", "kg|€/kg|€/kg", 60),
("Ctrd", "gebunden", "kg|€/kg|€/kg", 60), ("Geb", "gebunden", "kg|€/kg|€/kg", 60),
("Amount", "Gesamt", "€", 25), ("Amount", "Gesamt", "€", 25),
]; ];
@@ -31,9 +31,9 @@ namespace Elwig.Models.Dtos {
string? Cultivation, string? Cultivation,
string QualityLevel, string QualityLevel,
double Oe, double Oe,
(int Weight, decimal? MinPrice, decimal? MaxPrice) UnCtrd, (int Weight, decimal? MinPrice, decimal? MaxPrice) Ungeb,
(int Weight, decimal? MinPrice, decimal? MaxPrice) LowCtrd, (int Weight, decimal? MinPrice, decimal? MaxPrice) LowGeb,
(int Weight, decimal? MinPrice, decimal? MaxPrice) Ctrd, (int Weight, decimal? MinPrice, decimal? MaxPrice) Geb,
decimal Amount decimal Amount
); );
@@ -44,9 +44,9 @@ namespace Elwig.Models.Dtos {
public static async Task<PaymentVariantSummaryData> ForPaymentVariant(PaymentVar v, DbSet<PaymentVariantSummaryRow> table) { public static async Task<PaymentVariantSummaryData> ForPaymentVariant(PaymentVar v, DbSet<PaymentVariantSummaryRow> table) {
return new(v, (await FromDbSet(table, v.Year, v.AvNr)) return new(v, (await FromDbSet(table, v.Year, v.AvNr))
.Select(r => new PaymentRow(r.Type, r.Variety, r.Attribute, r.Cultivation, r.QualityLevel, r.Oe, .Select(r => new PaymentRow(r.Type, r.Variety, r.Attribute, r.Cultivation, r.QualityLevel, r.Oe,
(r.WeightUnCtrd, r.MinPriceUnCtrd != null ? Utils.DecFromDb(r.MinPriceUnCtrd.Value, v.Season.Precision) : null, r.MaxPriceUnCtrd != null ? Utils.DecFromDb(r.MaxPriceUnCtrd.Value, v.Season.Precision) : null), (r.WeightUngeb, r.MinPriceUngeb != null ? Utils.DecFromDb(r.MinPriceUngeb.Value, v.Season.Precision) : null, r.MaxPriceUngeb != null ? Utils.DecFromDb(r.MaxPriceUngeb.Value, v.Season.Precision) : null),
(r.WeightLowCtrd, r.MinPriceLowCtrd != null ? Utils.DecFromDb(r.MinPriceLowCtrd.Value, v.Season.Precision) : null, r.MaxPriceLowCtrd != null ? Utils.DecFromDb(r.MaxPriceLowCtrd.Value, v.Season.Precision) : null), (r.WeightLowGeb, r.MinPriceLowGeb != null ? Utils.DecFromDb(r.MinPriceLowGeb.Value, v.Season.Precision) : null, r.MaxPriceLowGeb != null ? Utils.DecFromDb(r.MaxPriceLowGeb.Value, v.Season.Precision) : null),
(r.WeightCtrd, r.MinPriceCtrd != null ? Utils.DecFromDb(r.MinPriceCtrd.Value, v.Season.Precision) : null, r.MaxPriceCtrd != null ? Utils.DecFromDb(r.MaxPriceCtrd.Value, v.Season.Precision) : null), (r.WeightGeb, r.MinPriceGeb != null ? Utils.DecFromDb(r.MinPriceGeb.Value, v.Season.Precision) : null, r.MaxPriceGeb != null ? Utils.DecFromDb(r.MaxPriceGeb.Value, v.Season.Precision) : null),
Utils.DecFromDb(r.Amount, v.Season.Precision))) Utils.DecFromDb(r.Amount, v.Season.Precision)))
.ToArray()); .ToArray());
} }
@@ -59,15 +59,15 @@ namespace Elwig.Models.Dtos {
c.name AS cultivation, c.name AS cultivation,
q.name AS quality_level, q.name AS quality_level,
ROUND(kmw * (4.54 + 0.022 * kmw)) AS oe, ROUND(kmw * (4.54 + 0.022 * kmw)) AS oe,
SUM(IIF(w.discr = '_', w.value, 0)) AS weight_unctrd, SUM(IIF(w.discr = '_', w.value, 0)) AS weight_ungeb,
MIN(IIF(w.discr = '_', b.price, NULL)) AS min_price_unctrd, MIN(IIF(w.discr = '_', b.price, NULL)) AS min_price_ungeb,
MAX(IIF(w.discr = '_', b.price, NULL)) AS max_price_unctrd, MAX(IIF(w.discr = '_', b.price, NULL)) AS max_price_ungeb,
SUM(IIF(w.discr NOT IN (COALESCE(p.attrid, ''), '_'), w.value, 0)) AS weight_lowctrd, SUM(IIF(w.discr NOT IN (COALESCE(p.attrid, ''), '_'), w.value, 0)) AS weight_lowgeb,
MIN(IIF(w.discr NOT IN (COALESCE(p.attrid, ''), '_'), b.price, NULL)) AS min_price_lowctrd, MIN(IIF(w.discr NOT IN (COALESCE(p.attrid, ''), '_'), b.price, NULL)) AS min_price_lowgeb,
MAX(IIF(w.discr NOT IN (COALESCE(p.attrid, ''), '_'), b.price, NULL)) AS max_price_lowctrd, MAX(IIF(w.discr NOT IN (COALESCE(p.attrid, ''), '_'), b.price, NULL)) AS max_price_lowgeb,
SUM(IIF(w.discr = COALESCE(p.attrid, ''), w.value, 0)) AS weight_ctrd, SUM(IIF(w.discr = COALESCE(p.attrid, ''), w.value, 0)) AS weight_geb,
MIN(IIF(w.discr = COALESCE(p.attrid, ''), b.price, NULL)) AS min_price_ctrd, MIN(IIF(w.discr = COALESCE(p.attrid, ''), b.price, NULL)) AS min_price_geb,
MAX(IIF(w.discr = COALESCE(p.attrid, ''), b.price, NULL)) AS max_price_ctrd, MAX(IIF(w.discr = COALESCE(p.attrid, ''), b.price, NULL)) AS max_price_geb,
SUM(b.amount) AS amount SUM(b.amount) AS amount
FROM payment_delivery_part_bucket b FROM payment_delivery_part_bucket b
LEFT JOIN delivery_part_bucket w ON (w.year, w.did, w.dpnr, w.bktnr) = (b.year, b.did, b.dpnr, b.bktnr) LEFT JOIN delivery_part_bucket w ON (w.year, w.did, w.dpnr, w.bktnr) = (b.year, b.did, b.dpnr, b.bktnr)
@@ -97,24 +97,24 @@ namespace Elwig.Models.Dtos {
public required string QualityLevel { get; set; } public required string QualityLevel { get; set; }
[Column("oe")] [Column("oe")]
public double Oe { get; set; } public double Oe { get; set; }
[Column("weight_unctrd")] [Column("weight_ungeb")]
public int WeightUnCtrd { get; set; } public int WeightUngeb { get; set; }
[Column("min_price_unctrd")] [Column("min_price_ungeb")]
public long? MinPriceUnCtrd { get; set; } public long? MinPriceUngeb { get; set; }
[Column("max_price_unctrd")] [Column("max_price_ungeb")]
public long? MaxPriceUnCtrd { get; set; } public long? MaxPriceUngeb { get; set; }
[Column("weight_lowctrd")] [Column("weight_lowgeb")]
public int WeightLowCtrd { get; set; } public int WeightLowGeb { get; set; }
[Column("min_price_lowctrd")] [Column("min_price_lowgeb")]
public long? MinPriceLowCtrd { get; set; } public long? MinPriceLowGeb { get; set; }
[Column("max_price_lowctrd")] [Column("max_price_lowgeb")]
public long? MaxPriceLowCtrd { get; set; } public long? MaxPriceLowGeb { get; set; }
[Column("weight_ctrd")] [Column("weight_geb")]
public int WeightCtrd { get; set; } public int WeightGeb { get; set; }
[Column("min_price_ctrd")] [Column("min_price_geb")]
public long? MinPriceCtrd { get; set; } public long? MinPriceGeb { get; set; }
[Column("max_price_ctrd")] [Column("max_price_geb")]
public long? MaxPriceCtrd { get; set; } public long? MaxPriceGeb { get; set; }
[Column("amount")] [Column("amount")]
public long Amount { get; set; } public long Amount { get; set; }
} }
+6 -6
View File
@@ -13,7 +13,7 @@ namespace Elwig.Models.Dtos {
("AttrId", "Attr.", null, 10), ("AttrId", "Attr.", null, 10),
("CultId", "Bewirt.", null, 15), ("CultId", "Bewirt.", null, 15),
("QualId", "Qual.", null, 15), ("QualId", "Qual.", null, 15),
("Contracted", "gebunden", null, 20), ("Geb", "gebunden", null, 20),
("Weight", "Menge", "kg", 20), ("Weight", "Menge", "kg", 20),
]; ];
@@ -28,12 +28,12 @@ namespace Elwig.Models.Dtos {
private static async Task<IEnumerable<WeightBreakdownRow>> FromDbSet(DbSet<WeightBreakdownRow> table, int year, string? zwstid) { private static async Task<IEnumerable<WeightBreakdownRow>> FromDbSet(DbSet<WeightBreakdownRow> table, int year, string? zwstid) {
zwstid = zwstid == null ? "NULL" : $"'{zwstid}'"; zwstid = zwstid == null ? "NULL" : $"'{zwstid}'";
return await table.FromSqlRaw($""" return await table.FromSqlRaw($"""
SELECT type, sortid, attrid, cultid, v.qualid, contracted, SUM(weight) AS weight SELECT type, sortid, attrid, cultid, v.qualid, geb, SUM(weight) AS weight
FROM v_stat_total v FROM v_stat_total v
LEFT JOIN wine_quality_level q ON q.qualid = v.qualid LEFT JOIN wine_quality_level q ON q.qualid = v.qualid
WHERE year = {year} AND ({zwstid} IS NULL OR zwstid = {zwstid}) WHERE year = {year} AND ({zwstid} IS NULL OR zwstid = {zwstid})
GROUP BY type, sortid, attrid, cultid, v.qualid, contracted GROUP BY type, sortid, attrid, cultid, v.qualid, geb
ORDER BY type DESC, sortid, attrid, cultid, q.min_kmw, contracted ORDER BY type DESC, sortid, attrid, cultid, q.min_kmw, geb
""").ToListAsync(); """).ToListAsync();
} }
} }
@@ -50,8 +50,8 @@ namespace Elwig.Models.Dtos {
public string? CultId { get; set; } public string? CultId { get; set; }
[Column("qualid")] [Column("qualid")]
public required string QualId { get; set; } public required string QualId { get; set; }
[Column("contracted")] [Column("geb")]
public required string Contracted { get; set; } public required string Geb { get; set; }
[Column("weight")] [Column("weight")]
public int Weight { get; set; } public int Weight { get; set; }
} }
-3
View File
@@ -20,9 +20,6 @@ namespace Elwig.Models.Entities {
[Column("dest")] [Column("dest")]
public string Dest { get; private set; } = null!; public string Dest { get; private set; } = null!;
[NotMapped]
public string FullDest => $"{Ort.Name} ({Dest})";
[ForeignKey("Plz")] [ForeignKey("Plz")]
public virtual AT_Plz AtPlz { get; private set; } = null!; public virtual AT_Plz AtPlz { get; private set; } = null!;
@@ -4,7 +4,7 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace Elwig.Models.Entities { namespace Elwig.Models.Entities {
[Table("area_commitment"), PrimaryKey("FbNr", "RevNr")] [Table("area_commitment"), PrimaryKey("FbNr", "RevNr")]
public class AreaCmt { public class AreaCom {
[Column("fbnr")] [Column("fbnr")]
public int FbNr { get; set; } public int FbNr { get; set; }
@@ -65,13 +65,13 @@ namespace Elwig.Models.Entities {
} }
[ForeignKey("FbNr")] [ForeignKey("FbNr")]
public virtual AreaCmtContract Contract { get; private set; } = null!; public virtual AreaComContract Contract { get; private set; } = null!;
[ForeignKey("MgNr")] [ForeignKey("MgNr")]
public virtual Member Member { get; private set; } = null!; public virtual Member Member { get; private set; } = null!;
[ForeignKey("VtrgId")] [ForeignKey("VtrgId")]
public virtual AreaCmtType AreaCmtType { get; private set; } = null!; public virtual AreaComType AreaComType { get; private set; } = null!;
[ForeignKey("CultId")] [ForeignKey("CultId")]
public virtual WineCult? WineCult { get; private set; } public virtual WineCult? WineCult { get; private set; }
@@ -7,7 +7,7 @@ using System.Linq;
namespace Elwig.Models.Entities { namespace Elwig.Models.Entities {
[Table("area_commitment_contract"), PrimaryKey("FbNr")] [Table("area_commitment_contract"), PrimaryKey("FbNr")]
public class AreaCmtContract { public class AreaComContract {
[Column("fbnr")] [Column("fbnr")]
public int FbNr { get; set; } public int FbNr { get; set; }
@@ -58,11 +58,11 @@ namespace Elwig.Models.Entities {
[ForeignKey("KgNr, RdNr")] [ForeignKey("KgNr, RdNr")]
public virtual WbRd? Rd { get; private set; } public virtual WbRd? Rd { get; private set; }
[InverseProperty(nameof(AreaCmt.Contract))] [InverseProperty(nameof(AreaCom.Contract))]
public virtual ICollection<AreaCmt> Revisions { get; private set; } = null!; public virtual ICollection<AreaCom> Revisions { get; private set; } = null!;
[NotMapped] [NotMapped]
public AreaCmt? Latest => Revisions.OrderBy(r => r.RevNr).LastOrDefault(); public AreaCom? Latest => Revisions.OrderBy(r => r.RevNr).LastOrDefault();
[NotMapped] [NotMapped]
public int? YearFrom => Revisions.Any(r => r.YearFrom == null) ? null : Revisions.Min(r => r.YearFrom); public int? YearFrom => Revisions.Any(r => r.YearFrom == null) ? null : Revisions.Min(r => r.YearFrom);
@@ -5,7 +5,7 @@ using IndexAttribute = Microsoft.EntityFrameworkCore.IndexAttribute;
namespace Elwig.Models.Entities { namespace Elwig.Models.Entities {
[Table("area_commitment_type"), PrimaryKey("VtrgId"), Index("SortId", "AttrId", "Discriminator", IsUnique = true)] [Table("area_commitment_type"), PrimaryKey("VtrgId"), Index("SortId", "AttrId", "Discriminator", IsUnique = true)]
public class AreaCmtType { public class AreaComType {
[Column("vtrgid")] [Column("vtrgid")]
public required string VtrgId { get; set; } public required string VtrgId { get; set; }
+2 -2
View File
@@ -91,8 +91,8 @@ namespace Elwig.Models.Entities {
[Column("hand_picked")] [Column("hand_picked")]
public bool? IsHandPicked { get; set; } public bool? IsHandPicked { get; set; }
[Column("contracted")] [Column("gebunden")]
public bool? IsContracted { get; set; } public bool? IsGebunden { get; set; }
[Column("unloading")] [Column("unloading")]
public string? Unloading { get; set; } public string? Unloading { get; set; }
+9 -9
View File
@@ -105,17 +105,17 @@ namespace Elwig.Models.Entities {
[Column("juridical_pers")] [Column("juridical_pers")]
public bool IsJuridicalPerson { get; set; } public bool IsJuridicalPerson { get; set; }
[Column("full_delivery")] [Column("volllieferant")]
public bool IsFullDelivery { get; set; } public bool IsVollLieferant { get; set; }
[Column("accounting")] [Column("buchführend")]
public bool IsAccounting { get; set; } public bool IsBuchführend { get; set; }
[Column("organic")] [Column("organic")]
public bool IsOrganic { get; set; } public bool IsOrganic { get; set; }
[Column("officer")] [Column("funktionär")]
public bool IsOfficer { get; set; } public bool IsFunktionär { get; set; }
[Column("active")] [Column("active")]
public bool IsActive { get; set; } public bool IsActive { get; set; }
@@ -199,10 +199,10 @@ namespace Elwig.Models.Entities {
[ForeignKey("ZwstId")] [ForeignKey("ZwstId")]
public virtual Branch? Branch { get; private set; } public virtual Branch? Branch { get; private set; }
[InverseProperty(nameof(AreaCmt.Member))] [InverseProperty(nameof(AreaCom.Member))]
public virtual ICollection<AreaCmt> AreaCommitments { get; private set; } = null!; public virtual ICollection<AreaCom> AreaCommitments { get; private set; } = null!;
public IQueryable<AreaCmt> ActiveAreaCommitments(AppDbContext ctx, int? year = null) { public IQueryable<AreaCom> ActiveAreaCommitments(AppDbContext ctx, int? year = null) {
return ctx.AreaCommitments.Where(c => c.MgNr == MgNr).Where(Utils.ActiveAreaCommitments(year ?? Utils.CurrentYear)); return ctx.AreaCommitments.Where(c => c.MgNr == MgNr).Where(Utils.ActiveAreaCommitments(year ?? Utils.CurrentYear));
} }
+3 -3
View File
@@ -104,10 +104,10 @@ namespace Elwig.Models.Entities {
public string FormatReasonPhrase(int mgnr) { public string FormatReasonPhrase(int mgnr) {
if (Reason == REASON_TRANSFER) { if (Reason == REASON_TRANSFER) {
if (ToMgNr == mgnr) { if (FromMgNr == mgnr) {
return $"{ReasonPretty} von {FromMember?.FullAdministrativeName ?? "Vorgänger"}" + (Comment != null ? $", {Comment}" : "");
} else if (FromMgNr == mgnr) {
return $"{ReasonPretty} an {ToMember?.FullAdministrativeName ?? "Nachfolger"}" + (Comment != null ? $", {Comment}" : ""); return $"{ReasonPretty} an {ToMember?.FullAdministrativeName ?? "Nachfolger"}" + (Comment != null ? $", {Comment}" : "");
} else if (ToMgNr == mgnr) {
return $"{ReasonPretty} von {FromMember?.FullAdministrativeName ?? "Vorgänger"}" + (Comment != null ? $", {Comment}" : "");
} }
} }
return ReasonPretty + (Comment != null ? $", {Comment}" : ""); return ReasonPretty + (Comment != null ? $", {Comment}" : "");
+1 -1
View File
@@ -107,7 +107,7 @@ namespace Elwig.Models.Entities {
[Column("calc_mode")] [Column("calc_mode")]
public int CalcMode { get; set; } public int CalcMode { get; set; }
[NotMapped] [NotMapped]
public bool Billing_HonorContracted { public bool Billing_HonorGebunden {
get => (CalcMode & 0x1) != 0; get => (CalcMode & 0x1) != 0;
set => CalcMode = value ? CalcMode | 0x1 : CalcMode & ~0x1; set => CalcMode = value ? CalcMode | 0x1 : CalcMode & ~0x1;
} }
@@ -92,12 +92,6 @@
{"$ref": "#/definitions/curve_data"} {"$ref": "#/definitions/curve_data"}
] ]
}, },
"ctrd": {
"anyOf": [
{"type": "number"},
{"$ref": "#/definitions/curve_data"}
]
},
"geb": { "geb": {
"anyOf": [ "anyOf": [
{"type": "number"}, {"type": "number"},
+2 -26
View File
@@ -9,30 +9,6 @@ ALTER TABLE member_history RENAME COLUMN signed TO signed_member;
ALTER TABLE member_history ADD COLUMN signed_company INTEGER NOT NULL CHECK (signed_company IN (TRUE, FALSE)) DEFAULT FALSE; ALTER TABLE member_history ADD COLUMN signed_company INTEGER NOT NULL CHECK (signed_company IN (TRUE, FALSE)) DEFAULT FALSE;
PRAGMA writable_schema = ON;
UPDATE sqlite_schema SET sql = REPLACE(REPLACE(REPLACE(sql, 'funktionär', 'officer '), 'buchführend', 'accounting '), 'volllieferant', 'full_delivery')
WHERE type = 'table' AND name = 'member';
UPDATE sqlite_schema SET sql = REPLACE(sql, 'gebunden', 'contracted')
WHERE type = 'table' AND name = 'delivery_part';
UPDATE sqlite_schema SET sql = REPLACE(sql, 'gebunden', 'contracted')
WHERE type = 'view' AND name = 'v_delivery';
UPDATE sqlite_schema SET sql = REPLACE(sql, 'volllieferant', 'full_delivery')
WHERE type = 'view' AND name = 'v_bki_member';
UPDATE sqlite_schema SET sql = REPLACE(sql, ' geb', ' contracted')
WHERE type = 'view' AND name = 'v_stat_total';
UPDATE sqlite_schema SET sql = REPLACE(sql, 'gebunden', 'contracted')
WHERE type = 'view' AND (name = 'v_payment_bucket_strict' OR name = 'v_payment_bucket' OR name = 'v_under_delivery_bucket');
PRAGMA schema_version = 4101;
PRAGMA writable_schema = OFF;
UPDATE client_parameter SET value = '0' WHERE param = 'ENABLE_TIME_TRIGGERS'; UPDATE client_parameter SET value = '0' WHERE param = 'ENABLE_TIME_TRIGGERS';
UPDATE member SET org_auth_code = UPPER(SUBSTR(a.name, -11, 10)) UPDATE member SET org_auth_code = UPPER(SUBSTR(a.name, -11, 10))
@@ -52,8 +28,8 @@ UPDATE client_parameter SET param = 'CLIENT_ORGANIC_AUTHORITYCODE' WHERE param =
UPDATE member_telephone_number SET comment = NULL WHERE comment = ''; UPDATE member_telephone_number SET comment = NULL WHERE comment = '';
UPDATE member_email_address SET comment = NULL WHERE comment = ''; UPDATE member_email_address SET comment = NULL WHERE comment = '';
UPDATE member SET address = CONCAT('Untere Weißgerberstraße ', SUBSTR(address, 21)) WHERE address LIKE 'U. Weißgasse Straße %'; UPDATE member SET address = 'Untere Weißgerberstraße' WHERE address = 'U. Weißgasse Straße';
UPDATE member SET address = CONCAT('Edgar-Penzig-Franz-Straße ', SUBSTR(address, 28)) WHERE address LIKE 'Edgar-Penzing-Franz-Straße %'; UPDATE member SET address = 'Edgar-Penzig-Franz-Straße' WHERE address = 'Edgar-Penzing-Franz-Straße';
UPDATE member UPDATE member
SET address = NORMALIZE_ADDRESS(address, (SELECT o.name FROM AT_plz_dest p JOIN AT_ort o ON o.okz = p.okz WHERE p.id = member.postal_dest)) SET address = NORMALIZE_ADDRESS(address, (SELECT o.name FROM AT_plz_dest p JOIN AT_ort o ON o.okz = p.okz WHERE p.id = member.postal_dest))
@@ -8,9 +8,9 @@ using System.Threading.Tasks;
using System.Windows.Controls; using System.Windows.Controls;
namespace Elwig.Services { namespace Elwig.Services {
public static class AreaCmtService { public static class AreaComService {
public static async Task InitInputs(this AreaCmtAdminViewModel vm) { public static async Task InitInputs(this AreaComAdminViewModel vm) {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
vm.FbNr = await ctx.NextFbNr(); vm.FbNr = await ctx.NextFbNr();
vm.MgNr = vm.FilterMember.MgNr; vm.MgNr = vm.FilterMember.MgNr;
@@ -18,11 +18,11 @@ namespace Elwig.Services {
vm.WineCult = null; vm.WineCult = null;
} }
public static void ClearInputs(this AreaCmtAdminViewModel vm) { public static void ClearInputs(this AreaComAdminViewModel vm) {
vm.Period = null; vm.Period = null;
} }
public static void FillInputs(this AreaCmtAdminViewModel vm, AreaCmtContract c) { public static void FillInputs(this AreaComAdminViewModel vm, AreaComContract c) {
vm.FbNr = c.FbNr; vm.FbNr = c.FbNr;
vm.Period = c.YearTo == null ? $"ab {c.YearFrom}" : $"{c.YearFrom}\u2013{c.YearTo}"; vm.Period = c.YearTo == null ? $"ab {c.YearFrom}" : $"{c.YearFrom}\u2013{c.YearTo}";
vm.Comment = c.Comment; vm.Comment = c.Comment;
@@ -30,23 +30,23 @@ namespace Elwig.Services {
vm.Rd = ControlUtils.GetItemFromSourceWithPk(vm.RdSource, c.KgNr, c.RdNr) as WbRd; vm.Rd = ControlUtils.GetItemFromSourceWithPk(vm.RdSource, c.KgNr, c.RdNr) as WbRd;
} }
public static void FillInputs(this AreaCmtAdminViewModel vm, AreaCmt a) { public static void FillInputs(this AreaComAdminViewModel vm, AreaCom a) {
vm.MgNr = a.MgNr; vm.MgNr = a.MgNr;
vm.YearFrom = a.YearFrom; vm.YearFrom = a.YearFrom;
vm.YearTo = a.YearTo; vm.YearTo = a.YearTo;
vm.AreaCmtType = ControlUtils.GetItemFromSourceWithPk(vm.AreaCmtTypeSource, a.VtrgId) as AreaCmtType; vm.AreaComType = ControlUtils.GetItemFromSourceWithPk(vm.AreaComTypeSource, a.VtrgId) as AreaComType;
vm.WineCult = ControlUtils.GetItemFromSourceWithPk(vm.WineCultSource, a.CultId) as WineCult; vm.WineCult = ControlUtils.GetItemFromSourceWithPk(vm.WineCultSource, a.CultId) as WineCult;
vm.GstNr = a.GstNr; vm.GstNr = a.GstNr;
vm.Area = a.Area; vm.Area = a.Area;
} }
public static async Task<(List<string>, IQueryable<AreaCmtContract>, IQueryable<AreaCmt>, List<string>)> GetFilters(this AreaCmtAdminViewModel vm, AppDbContext ctx) { public static async Task<(List<string>, IQueryable<AreaComContract>, IQueryable<AreaCom>, List<string>)> GetFilters(this AreaComAdminViewModel vm, AppDbContext ctx) {
List<string> filterNames = []; List<string> filterNames = [];
IQueryable<AreaCmt> areaCmtQuery = ctx.AreaCommitments.Where(a => a.MgNr == vm.FilterMember.MgNr).OrderBy(a => a.FbNr); IQueryable<AreaCom> areaComQuery = ctx.AreaCommitments.Where(a => a.MgNr == vm.FilterMember.MgNr).OrderBy(a => a.FbNr);
filterNames.Add(vm.FilterMember.AdministrativeName); filterNames.Add(vm.FilterMember.AdministrativeName);
if (vm.FilterSeason is int season) { if (vm.FilterSeason is int season) {
areaCmtQuery = Utils.ActiveAreaCommitments(areaCmtQuery, season); areaComQuery = Utils.ActiveAreaCommitments(areaComQuery, season);
filterNames.Add($"laufend {season}"); filterNames.Add($"laufend {season}");
} }
@@ -96,37 +96,37 @@ namespace Elwig.Services {
} }
} }
if (filterVar.Count > 0) areaCmtQuery = areaCmtQuery.Where(a => filterVar.Contains(a.AreaCmtType.WineVar.SortId)); if (filterVar.Count > 0) areaComQuery = areaComQuery.Where(a => filterVar.Contains(a.AreaComType.WineVar.SortId));
if (filterNotVar.Count > 0) areaCmtQuery = areaCmtQuery.Where(a => !filterNotVar.Contains(a.AreaCmtType.WineVar.SortId)); if (filterNotVar.Count > 0) areaComQuery = areaComQuery.Where(a => !filterNotVar.Contains(a.AreaComType.WineVar.SortId));
if (filterAttr.Count > 0) areaCmtQuery = areaCmtQuery.Where(a => a.AreaCmtType.WineAttr!.AttrId != null && filterAttr.Contains(a.AreaCmtType.WineAttr.AttrId)); if (filterAttr.Count > 0) areaComQuery = areaComQuery.Where(a => a.AreaComType.WineAttr!.AttrId != null && filterAttr.Contains(a.AreaComType.WineAttr.AttrId));
if (filterNotAttr.Count > 0) areaCmtQuery = areaCmtQuery.Where(a => a.AreaCmtType.WineAttr!.AttrId == null || !filterNotAttr.Contains(a.AreaCmtType.WineAttr.AttrId)); if (filterNotAttr.Count > 0) areaComQuery = areaComQuery.Where(a => a.AreaComType.WineAttr!.AttrId == null || !filterNotAttr.Contains(a.AreaComType.WineAttr.AttrId));
} }
IQueryable<AreaCmtContract> contracts = areaCmtQuery IQueryable<AreaComContract> contracts = areaComQuery
.Select(c => c.Contract).Distinct() .Select(c => c.Contract).Distinct()
.OrderBy(c => c.FbNr); .OrderBy(c => c.FbNr);
return (filterNames, contracts, areaCmtQuery, filter); return (filterNames, contracts, areaComQuery, filter);
} }
public static async Task<(int FbNr, int RevNr)> UpdateAreaCommitment(this AreaCmtAdminViewModel vm, int? oldFbNr, int? revNr) { public static async Task<(int FbNr, int RevNr)> UpdateAreaCommitment(this AreaComAdminViewModel vm, int? oldFbNr, int? revNr) {
int newFbNr = vm.FbNr!.Value; int newFbNr = vm.FbNr!.Value;
return await Task.Run(async () => { return await Task.Run(async () => {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
var c = new AreaCmtContract { var c = new AreaComContract {
FbNr = oldFbNr ?? newFbNr, FbNr = oldFbNr ?? newFbNr,
Comment = string.IsNullOrWhiteSpace(vm.Comment) ? null : vm.Comment, Comment = string.IsNullOrWhiteSpace(vm.Comment) ? null : vm.Comment,
KgNr = vm.Kg!.KgNr, KgNr = vm.Kg!.KgNr,
RdNr = vm.Rd?.RdNr, RdNr = vm.Rd?.RdNr,
}; };
var a = new AreaCmt { var a = new AreaCom {
FbNr = oldFbNr ?? newFbNr, FbNr = oldFbNr ?? newFbNr,
RevNr = revNr ?? await ctx.NextRevNr(oldFbNr ?? newFbNr), RevNr = revNr ?? await ctx.NextRevNr(oldFbNr ?? newFbNr),
MgNr = vm.MgNr!.Value, MgNr = vm.MgNr!.Value,
YearFrom = vm.YearFrom, YearFrom = vm.YearFrom,
YearTo = vm.YearTo, YearTo = vm.YearTo,
VtrgId = vm.AreaCmtType!.VtrgId, VtrgId = vm.AreaComType!.VtrgId,
CultId = vm.WineCult?.CultId, CultId = vm.WineCult?.CultId,
GstNr = vm.GstNr?.Trim() ?? "-", GstNr = vm.GstNr?.Trim() ?? "-",
Area = vm.Area!.Value, Area = vm.Area!.Value,
@@ -168,53 +168,53 @@ namespace Elwig.Services {
grid.AddToolTipCell(max == null ? "" : $"{max:N0} kg", row, 4, bold: bold, alignRight: true); grid.AddToolTipCell(max == null ? "" : $"{max:N0} kg", row, 4, bold: bold, alignRight: true);
} }
public static async Task<(string, (string?, string?, int, int?, int?)[])> GenerateToolTipData(IQueryable<AreaCmt> areaCmts, int maxKgPerHa) { public static async Task<(string, (string?, string?, int, int?, int?)[])> GenerateToolTipData(IQueryable<AreaCom> areaComs, int maxKgPerHa) {
var grid = new List<(string?, string?, int, int?, int?)>(); var grid = new List<(string?, string?, int, int?, int?)>();
var text = "-"; var text = "-";
var area = await areaCmts.SumAsync(p => p.Area); var area = await areaComs.SumAsync(p => p.Area);
text = $"{area:N0} m²"; text = $"{area:N0} m²";
grid.Add(("Geb. Fläche", null, area, null, null)); grid.Add(("Geb. Fläche", null, area, null, null));
if (await areaCmts.AnyAsync()) { if (await areaComs.AnyAsync()) {
var attrGroups = await areaCmts var attrGroups = await areaComs
.Where(c => c.AreaCmtType.WineAttr != null) .Where(c => c.AreaComType.WineAttr != null)
.GroupBy(c => c.AreaCmtType.WineAttr!.Name) .GroupBy(c => c.AreaComType.WineAttr!.Name)
.Select(g => new { .Select(g => new {
Attr = g.Key, Attr = g.Key,
Area = g.Sum(c => c.Area), Area = g.Sum(c => c.Area),
Min = g.Sum(c => c.Area * (c.AreaCmtType.MinKgPerHa ?? 0) / 10_000), Min = g.Sum(c => c.Area * (c.AreaComType.MinKgPerHa ?? 0) / 10_000),
Max = g.Sum(c => c.Area * (c.AreaCmtType.WineAttr!.MaxKgPerHa ?? maxKgPerHa) / 10_000), Max = g.Sum(c => c.Area * (c.AreaComType.WineAttr!.MaxKgPerHa ?? maxKgPerHa) / 10_000),
}) })
.OrderByDescending(g => g.Area) .OrderByDescending(g => g.Area)
.ThenBy(g => g.Attr) .ThenBy(g => g.Attr)
.ToListAsync(); .ToListAsync();
var groups = await areaCmts var groups = await areaComs
.Where(c => c.AreaCmtType.WineAttr != null) .Where(c => c.AreaComType.WineAttr != null)
.GroupBy(c => new { .GroupBy(c => new {
Attr = c.AreaCmtType.WineAttr!.Name, Attr = c.AreaComType.WineAttr!.Name,
c.AreaCmtType.SortId, c.AreaComType.SortId,
}) })
.Select(g => new { .Select(g => new {
g.Key.Attr, g.Key.Attr,
g.Key.SortId, g.Key.SortId,
Area = g.Sum(c => c.Area), Area = g.Sum(c => c.Area),
Min = g.Sum(c => c.Area * (c.AreaCmtType.MinKgPerHa ?? 0) / 10_000), Min = g.Sum(c => c.Area * (c.AreaComType.MinKgPerHa ?? 0) / 10_000),
Max = g.Sum(c => c.Area * (c.AreaCmtType.WineAttr!.MaxKgPerHa ?? maxKgPerHa) / 10_000), Max = g.Sum(c => c.Area * (c.AreaComType.WineAttr!.MaxKgPerHa ?? maxKgPerHa) / 10_000),
}) })
.OrderByDescending(g => g.Area) .OrderByDescending(g => g.Area)
.ThenBy(g => g.Attr) .ThenBy(g => g.Attr)
.ThenBy(g => g.SortId) .ThenBy(g => g.SortId)
.ToListAsync(); .ToListAsync();
var noAttr = await areaCmts var noAttr = await areaComs
.Where(c => c.AreaCmtType.WineAttr == null || !c.AreaCmtType.WineAttr.IsStrict) .Where(c => c.AreaComType.WineAttr == null || !c.AreaComType.WineAttr.IsStrict)
.GroupBy(c => c.AreaCmtType.SortId) .GroupBy(c => c.AreaComType.SortId)
.Select(g => new { .Select(g => new {
SortId = g.Key, SortId = g.Key,
Area = g.Sum(c => c.Area), Area = g.Sum(c => c.Area),
Min = g.Sum(c => c.Area * (c.AreaCmtType.MinKgPerHa ?? 0) / 10_000), Min = g.Sum(c => c.Area * (c.AreaComType.MinKgPerHa ?? 0) / 10_000),
Max = g.Sum(c => c.Area * (c.AreaCmtType.WineAttr!.MaxKgPerHa ?? maxKgPerHa) / 10_000), Max = g.Sum(c => c.Area * (c.AreaComType.WineAttr!.MaxKgPerHa ?? maxKgPerHa) / 10_000),
}) })
.OrderByDescending(g => g.Area) .OrderByDescending(g => g.Area)
.ThenBy(g => g.SortId) .ThenBy(g => g.SortId)
@@ -254,7 +254,7 @@ namespace Elwig.Services {
return grid; return grid;
} }
public static async Task DeleteAreaCmt(int fbnr) { public static async Task DeleteAreaCom(int fbnr) {
await Task.Run(async () => { await Task.Run(async () => {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
var l = (await ctx.AreaCommitmentContracts.FindAsync(fbnr))!; var l = (await ctx.AreaCommitmentContracts.FindAsync(fbnr))!;
@@ -263,7 +263,7 @@ namespace Elwig.Services {
}); });
} }
public static async Task DeleteAreaCmtRevision(int fbnr, int revnr) { public static async Task DeleteAreaComRevision(int fbnr, int revnr) {
await Task.Run(async () => { await Task.Run(async () => {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
var l = (await ctx.AreaCommitments.FindAsync(fbnr, revnr))!; var l = (await ctx.AreaCommitments.FindAsync(fbnr, revnr))!;
+6 -6
View File
@@ -75,7 +75,7 @@ namespace Elwig.Services {
vm.TemperatureString = (p.Temperature != null) ? $"{p.Temperature:N1}" : ""; vm.TemperatureString = (p.Temperature != null) ? $"{p.Temperature:N1}" : "";
vm.AcidString = (p.Acid != null) ? $"{p.Acid:N1}" : ""; vm.AcidString = (p.Acid != null) ? $"{p.Acid:N1}" : "";
vm.IsHandPicked = p.IsHandPicked; vm.IsHandPicked = p.IsHandPicked;
vm.IsContracted = p.IsContracted; vm.IsGebunden = p.IsGebunden;
vm.Unloading = p.Unloading; vm.Unloading = p.Unloading;
vm.ScaleTerminalId = p.ScaleTerminalId; vm.ScaleTerminalId = p.ScaleTerminalId;
@@ -181,19 +181,19 @@ namespace Elwig.Services {
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("Weißweinsorten"); filterNames.Add("Weißweinsorten");
} else if (e.Length >= 3 && e.Length <= 8 && "gebunden".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 3 && e.Length <= 8 && "gebunden".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
prd = prd.And(p => p.IsContracted == true); prd = prd.And(p => p.IsGebunden == true);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("gebunden"); filterNames.Add("gebunden");
} else if (e.Length >= 4 && e.Length <= 9 && "!gebunden".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 4 && e.Length <= 9 && "!gebunden".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
prd = prd.And(p => p.IsContracted != true); prd = prd.And(p => p.IsGebunden != true);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("nicht gebunden"); filterNames.Add("nicht gebunden");
} else if (e.Length >= 5 && e.Length <= 10 && "ungebunden".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 5 && e.Length <= 10 && "ungebunden".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
prd = prd.And(p => p.IsContracted == false); prd = prd.And(p => p.IsGebunden == false);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("ungebunden"); filterNames.Add("ungebunden");
} else if (e.Length >= 6 && e.Length <= 11 && "!ungebunden".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 6 && e.Length <= 11 && "!ungebunden".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
prd = prd.And(p => p.IsContracted != false); prd = prd.And(p => p.IsGebunden != false);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("nicht ungebunden"); filterNames.Add("nicht ungebunden");
} else if (e.Length >= 5 && e.Length <= 8 && "handlese".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 5 && e.Length <= 8 && "handlese".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
@@ -556,7 +556,7 @@ namespace Elwig.Services {
IsNetWeight = vm.IsNetWeight, IsNetWeight = vm.IsNetWeight,
IsHandPicked = vm.IsHandPicked, IsHandPicked = vm.IsHandPicked,
IsContracted = vm.IsContracted, IsGebunden = vm.IsGebunden,
Unloading = vm.Unloading, Unloading = vm.Unloading,
Temperature = vm.Temperature, Temperature = vm.Temperature,
Acid = vm.Acid, Acid = vm.Acid,
@@ -1,7 +1,5 @@
using Elwig.Helpers; using Elwig.Helpers;
using Elwig.Helpers.Export;
using Elwig.Models; using Elwig.Models;
using Elwig.Models.Dtos;
using Elwig.Models.Entities; using Elwig.Models.Entities;
using Elwig.ViewModels; using Elwig.ViewModels;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@@ -12,10 +10,6 @@ using System.Threading.Tasks;
namespace Elwig.Services { namespace Elwig.Services {
public static class MemberBusinessSharesService { public static class MemberBusinessSharesService {
public enum ExportSubject {
Pending,
};
public static async Task InitInputs(this MemberBusinessSharesViewModel vm) { public static async Task InitInputs(this MemberBusinessSharesViewModel vm) {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
vm.DateNoticeString = $"{DateTime.Today:dd.MM.yyyy}"; vm.DateNoticeString = $"{DateTime.Today:dd.MM.yyyy}";
@@ -103,19 +97,5 @@ namespace Elwig.Services {
await tx.CommitAsync(); await tx.CommitAsync();
}); });
} }
public static async Task GenerateMemberMovements(ExportSubject subject, ExportMode mode) {
var today = DateTime.Today;
var filename = InteractionService.SaveFile($"Ausstehende Mitgl.-Bewegungen {today:dd.MM.yyyy}", $"MitglBewegungen_{today:yyyy-MM-dd}", "ods");
if (filename == null)
return;
await Utils.RunForeground(async () => {
using var ctx = new AppDbContext();
var hist = await ctx.MemberHistory.Where(h => !h.CompanyHasSigned).ToListAsync();
var data = MemberMovementData.FromMemberHistory($"Ausstehend ({today:dd.MM.yyyy})", hist, await ctx.GetMemberHistory());
using var ods = new OdsFile(filename);
await ods.AddTable(data);
});
}
} }
} }
+45 -53
View File
@@ -116,7 +116,7 @@ namespace Elwig.Services {
vm.LfbisNr = m.LfbisNr; vm.LfbisNr = m.LfbisNr;
vm.OrganicOperatorId = m.OrganicOperatorId; vm.OrganicOperatorId = m.OrganicOperatorId;
vm.OrganicAuthorityCode = m.OrganicAuthorityCode; vm.OrganicAuthorityCode = m.OrganicAuthorityCode;
vm.IsAccounting = m.IsAccounting; vm.IsBuchführend = m.IsBuchführend;
vm.IsOrganic = m.IsOrganic; vm.IsOrganic = m.IsOrganic;
var billingAddr = m.BillingAddress; var billingAddr = m.BillingAddress;
@@ -150,8 +150,8 @@ namespace Elwig.Services {
vm.DefaultKg = (AT_Kg?)ControlUtils.GetItemFromSourceWithPk(vm.DefaultKgSource, m.DefaultKgNr); vm.DefaultKg = (AT_Kg?)ControlUtils.GetItemFromSourceWithPk(vm.DefaultKgSource, m.DefaultKgNr);
vm.Comment = m.Comment; vm.Comment = m.Comment;
vm.IsActive = m.IsActive; vm.IsActive = m.IsActive;
vm.IsFullDelivery = m.IsFullDelivery; vm.IsVollLieferant = m.IsVollLieferant;
vm.IsOfficer = m.IsOfficer; vm.IsFunktionär = m.IsFunktionär;
vm.ContactViaPost = m.ContactViaPost; vm.ContactViaPost = m.ContactViaPost;
vm.ContactViaEmail = m.ContactViaEmail; vm.ContactViaEmail = m.ContactViaEmail;
@@ -190,7 +190,7 @@ namespace Elwig.Services {
var s = await ctx.FetchSeasons().FirstOrDefaultAsync(); var s = await ctx.FetchSeasons().FirstOrDefaultAsync();
if (s != null) maxKgPerHa = s.MaxKgPerHa; if (s != null) maxKgPerHa = s.MaxKgPerHa;
} catch { } } catch { }
var (text, gridData) = await AreaCmtService.GenerateToolTipData(c, maxKgPerHa); var (text, gridData) = await AreaComService.GenerateToolTipData(c, maxKgPerHa);
var deliveries = await ctx.Deliveries var deliveries = await ctx.Deliveries
.Where(d => d.MgNr == m.MgNr) .Where(d => d.MgNr == m.MgNr)
@@ -202,7 +202,7 @@ namespace Elwig.Services {
return; return;
var (d1Grid, _) = DeliveryService.GenerateToolTip(d1GridData, []); var (d1Grid, _) = DeliveryService.GenerateToolTip(d1GridData, []);
var (d2Grid, _) = DeliveryService.GenerateToolTip(d2GridData, []); var (d2Grid, _) = DeliveryService.GenerateToolTip(d2GridData, []);
var grid = AreaCmtService.GenerateToolTip(gridData); var grid = AreaComService.GenerateToolTip(gridData);
vm.StatusDeliveriesLastSeasonInfo = $"{Utils.CurrentLastSeason - 1}"; vm.StatusDeliveriesLastSeasonInfo = $"{Utils.CurrentLastSeason - 1}";
vm.StatusDeliveriesLastSeason = textLast; vm.StatusDeliveriesLastSeason = textLast;
vm.StatusDeliveriesLastSeasonToolTip = d1Grid; vm.StatusDeliveriesLastSeasonToolTip = d1Grid;
@@ -297,15 +297,15 @@ namespace Elwig.Services {
var filterKgNr = new List<int>(); var filterKgNr = new List<int>();
var filterLfbisNr = new List<string>(); var filterLfbisNr = new List<string>();
var filterUstIdNr = new List<string>(); var filterUstIdNr = new List<string>();
var filterAreaCmt = new List<string>(); var filterAreaCom = new List<string>();
var filterNotAreaCmt = new List<string>(); var filterNotAreaCom = new List<string>();
var filter = vm.TextFilter; var filter = vm.TextFilter;
if (filter.Count > 0) { if (filter.Count > 0) {
var branches = await ctx.FetchBranches().ToListAsync(); var branches = await ctx.FetchBranches().ToListAsync();
var mgnr = await ctx.FetchMembers(includeNotActive: true).ToDictionaryAsync(m => m.MgNr.ToString(), m => m); var mgnr = await ctx.FetchMembers(includeNotActive: true).ToDictionaryAsync(m => m.MgNr.ToString(), m => m);
var kgs = await ctx.WbKgs.ToDictionaryAsync(k => k.AtKg.Name.ToLower(), k => k.AtKg); var kgs = await ctx.WbKgs.ToDictionaryAsync(k => k.AtKg.Name.ToLower(), k => k.AtKg);
var areaCmts = await ctx.AreaCommitmentTypes.ToDictionaryAsync(t => $"{t.SortId}{t.AttrId}", t => t); var areaComs = await ctx.AreaCommitmentTypes.ToDictionaryAsync(t => $"{t.SortId}{t.AttrId}", t => t);
for (int i = 0; i < filter.Count; i++) { for (int i = 0; i < filter.Count; i++) {
var e = filter[i]; var e = filter[i];
@@ -319,11 +319,11 @@ namespace Elwig.Services {
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("inaktive Mitglieder"); filterNames.Add("inaktive Mitglieder");
} else if (e.Length >= 5 && e.Length <= 10 && "funktionär".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 5 && e.Length <= 10 && "funktionär".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => m.IsOfficer); memberQuery = memberQuery.Where(m => m.IsFunktionär);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("Funktionäre"); filterNames.Add("Funktionäre");
} else if (e.Length >= 6 && e.Length <= 11 && e[0] == '!' && "funktionär".StartsWith(e[1..], StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 6 && e.Length <= 11 && e[0] == '!' && "funktionär".StartsWith(e[1..], StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => !m.IsOfficer); memberQuery = memberQuery.Where(m => !m.IsFunktionär);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("Nicht-Funktionäre"); filterNames.Add("Nicht-Funktionäre");
} else if (e.Equals("bio", StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Equals("bio", StringComparison.CurrentCultureIgnoreCase)) {
@@ -334,36 +334,28 @@ namespace Elwig.Services {
memberQuery = memberQuery.Where(m => !m.IsOrganic); memberQuery = memberQuery.Where(m => !m.IsOrganic);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("Nicht-Bio-Betriebe"); filterNames.Add("Nicht-Bio-Betriebe");
} else if (e.Length >= 4 && e.Length <= 14 && "vollablieferer".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => m.IsFullDelivery);
filter.RemoveAt(i--);
filterNames.Add("Vollablieferer");
} else if (e.Length >= 4 && e.Length <= 13 && "volllieferant".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 4 && e.Length <= 13 && "volllieferant".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => m.IsFullDelivery); memberQuery = memberQuery.Where(m => m.IsVollLieferant);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("Vollablieferer"); filterNames.Add("Volllieferanten");
} else if (e.Length >= 5 && e.Length <= 15 && e[0] == '!' && "vollablieferer".StartsWith(e[1..], StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => !m.IsFullDelivery);
filter.RemoveAt(i--);
filterNames.Add("Nicht-Vollablieferer");
} else if (e.Length >= 5 && e.Length <= 14 && e[0] == '!' && "volllieferant".StartsWith(e[1..], StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 5 && e.Length <= 14 && e[0] == '!' && "volllieferant".StartsWith(e[1..], StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => !m.IsFullDelivery); memberQuery = memberQuery.Where(m => !m.IsVollLieferant);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("Nicht-Vollablieferer"); filterNames.Add("Nicht-Vollieferanten");
} else if (e.Length >= 5 && e.Length <= 11 && "buchführend".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 5 && e.Length <= 11 && "buchführend".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => m.IsAccounting); memberQuery = memberQuery.Where(m => m.IsBuchführend);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("buchführend"); filterNames.Add("buchführend");
} else if (e.Length >= 6 && e.Length <= 12 && e[0] == '!' && "buchführend".StartsWith(e[1..], StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 6 && e.Length <= 12 && e[0] == '!' && "buchführend".StartsWith(e[1..], StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => !m.IsAccounting); memberQuery = memberQuery.Where(m => !m.IsBuchführend);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("pauschaliert"); filterNames.Add("pauschaliert");
} else if (e.Length >= 8 && e.Length <= 12 && "pauschaliert".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 8 && e.Length <= 12 && "pauschaliert".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => !m.IsAccounting); memberQuery = memberQuery.Where(m => !m.IsBuchführend);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("pauschaliert"); filterNames.Add("pauschaliert");
} else if (e.Length >= 9 && e.Length <= 13 && e[0] == '!' && "pauschaliert".StartsWith(e[1..], StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 9 && e.Length <= 13 && e[0] == '!' && "pauschaliert".StartsWith(e[1..], StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => m.IsAccounting); memberQuery = memberQuery.Where(m => m.IsBuchführend);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add("buchführend"); filterNames.Add("buchführend");
} else if (e.Equals("email", StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Equals("email", StringComparison.CurrentCultureIgnoreCase)) {
@@ -434,19 +426,19 @@ namespace Elwig.Services {
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add($"Tel.-Nr. {e}"); filterNames.Add($"Tel.-Nr. {e}");
} else if (e.Length >= 5 && e.Length <= 14 && "flächenbindung".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 5 && e.Length <= 14 && "flächenbindung".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
filterAreaCmt.AddRange(areaCmts.Keys); filterAreaCom.AddRange(areaComs.Keys);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add($"Flächenbindung"); filterNames.Add($"Flächenbindung");
} else if (e.Length >= 6 && e.Length <= 15 && "!flächenbindung".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { } else if (e.Length >= 6 && e.Length <= 15 && "!flächenbindung".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
filterNotAreaCmt.AddRange(areaCmts.Keys); filterNotAreaCom.AddRange(areaComs.Keys);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add($"keine Flächenbindung"); filterNames.Add($"keine Flächenbindung");
} else if (areaCmts.ContainsKey(e.ToUpper())) { } else if (areaComs.ContainsKey(e.ToUpper())) {
filterAreaCmt.Add(e.ToUpper()); filterAreaCom.Add(e.ToUpper());
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add($"Flächenbindung {e.ToUpper()}"); filterNames.Add($"Flächenbindung {e.ToUpper()}");
} else if (e.Length >= 3 && e[0] == '!' && areaCmts.ContainsKey(e[1..].ToUpper())) { } else if (e.Length >= 3 && e[0] == '!' && areaComs.ContainsKey(e[1..].ToUpper())) {
filterNotAreaCmt.Add(e[1..].ToUpper()); filterNotAreaCom.Add(e[1..].ToUpper());
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add($"ohne Flächenbindung {e[1..].ToUpper()}"); filterNames.Add($"ohne Flächenbindung {e[1..].ToUpper()}");
} else if (Validator.CheckLfbisNr(e)) { } else if (Validator.CheckLfbisNr(e)) {
@@ -467,8 +459,8 @@ namespace Elwig.Services {
if (filterMgNr.Count > 0) memberQuery = memberQuery.Where(m => filterMgNr.Contains(m.MgNr)); if (filterMgNr.Count > 0) memberQuery = memberQuery.Where(m => filterMgNr.Contains(m.MgNr));
if (filterKgNr.Count > 0) memberQuery = memberQuery.Where(m => m.DefaultKgNr != null && filterKgNr.Contains((int)m.DefaultKgNr)); if (filterKgNr.Count > 0) memberQuery = memberQuery.Where(m => m.DefaultKgNr != null && filterKgNr.Contains((int)m.DefaultKgNr));
if (filterZwst.Count > 0) memberQuery = memberQuery.Where(m => m.ZwstId != null && filterZwst.Contains(m.ZwstId)); if (filterZwst.Count > 0) memberQuery = memberQuery.Where(m => m.ZwstId != null && filterZwst.Contains(m.ZwstId));
if (filterAreaCmt.Count > 0) memberQuery = memberQuery.Where(m => m.AreaCommitments.AsQueryable().Where(Utils.ActiveAreaCommitments(Utils.CurrentLastSeason)).Any(c => filterAreaCmt.Contains(c.VtrgId))); if (filterAreaCom.Count > 0) memberQuery = memberQuery.Where(m => m.AreaCommitments.AsQueryable().Where(Utils.ActiveAreaCommitments(Utils.CurrentLastSeason)).Any(c => filterAreaCom.Contains(c.VtrgId)));
if (filterNotAreaCmt.Count > 0) memberQuery = memberQuery.Where(m => !m.AreaCommitments.AsQueryable().Where(Utils.ActiveAreaCommitments(Utils.CurrentLastSeason)).All(c => filterNotAreaCmt.Contains(c.VtrgId))); if (filterNotAreaCom.Count > 0) memberQuery = memberQuery.Where(m => !m.AreaCommitments.AsQueryable().Where(Utils.ActiveAreaCommitments(Utils.CurrentLastSeason)).All(c => filterNotAreaCom.Contains(c.VtrgId)));
if (filterLfbisNr.Count > 0) memberQuery = memberQuery.Where(m => m.LfbisNr != null && filterLfbisNr.Contains(m.LfbisNr)); if (filterLfbisNr.Count > 0) memberQuery = memberQuery.Where(m => m.LfbisNr != null && filterLfbisNr.Contains(m.LfbisNr));
if (filterUstIdNr.Count > 0) memberQuery = memberQuery.Where(m => m.UstIdNr != null && filterUstIdNr.Contains(m.UstIdNr)); if (filterUstIdNr.Count > 0) memberQuery = memberQuery.Where(m => m.UstIdNr != null && filterUstIdNr.Contains(m.UstIdNr));
} }
@@ -585,7 +577,7 @@ namespace Elwig.Services {
.DistinctBy(h => h.HistNr) .DistinctBy(h => h.HistNr)
.OrderBy(h => h.DateNotice).ThenBy(h => h.HistNr) .OrderBy(h => h.DateNotice).ThenBy(h => h.HistNr)
.ToList(); .ToList();
var areaCmts = await query var areaComs = await query
.SelectMany(m => m.AreaCommitments) .SelectMany(m => m.AreaCommitments)
.Select(c => c.Contract).Distinct() .Select(c => c.Contract).Distinct()
.Include(c => c.Revisions) .Include(c => c.Revisions)
@@ -593,11 +585,11 @@ namespace Elwig.Services {
var wbKgs = members var wbKgs = members
.Where(m => m.DefaultWbKg != null) .Where(m => m.DefaultWbKg != null)
.Select(m => m.DefaultWbKg!) .Select(m => m.DefaultWbKg!)
.Union(areaCmts.Select(c => c.Kg)) .Union(areaComs.Select(c => c.Kg))
.Distinct() .Distinct()
.OrderBy(k => k.KgNr) .OrderBy(k => k.KgNr)
.ToList(); .ToList();
await ElwigData.Export(filename, members, history, areaCmts, wbKgs, filterNames); await ElwigData.Export(filename, members, history, areaComs, wbKgs, filterNames);
}); });
} }
} else if (mode == ExportMode.Upload && App.Config.SyncUrl != null) { } else if (mode == ExportMode.Upload && App.Config.SyncUrl != null) {
@@ -637,7 +629,7 @@ namespace Elwig.Services {
LfbisNr = string.IsNullOrWhiteSpace(vm.LfbisNr) ? null : vm.LfbisNr, LfbisNr = string.IsNullOrWhiteSpace(vm.LfbisNr) ? null : vm.LfbisNr,
OrganicOperatorId = string.IsNullOrWhiteSpace(vm.OrganicOperatorId) ? null : vm.OrganicOperatorId, OrganicOperatorId = string.IsNullOrWhiteSpace(vm.OrganicOperatorId) ? null : vm.OrganicOperatorId,
OrganicAuthorityCode = string.IsNullOrWhiteSpace(vm.OrganicAuthorityCode) ? null : vm.OrganicAuthorityCode, OrganicAuthorityCode = string.IsNullOrWhiteSpace(vm.OrganicAuthorityCode) ? null : vm.OrganicAuthorityCode,
IsAccounting = vm.IsAccounting, IsBuchführend = vm.IsBuchführend,
IsOrganic = vm.IsOrganic, IsOrganic = vm.IsOrganic,
EntryDateString = string.IsNullOrWhiteSpace(vm.EntryDate) ? null : string.Join("-", vm.EntryDate.Split(".").Reverse()), EntryDateString = string.IsNullOrWhiteSpace(vm.EntryDate) ? null : string.Join("-", vm.EntryDate.Split(".").Reverse()),
@@ -648,8 +640,8 @@ namespace Elwig.Services {
SharesDormant = App.Client.HasRedWhite ? vm.BusinessShares3 ?? 0 : vm.BusinessShares2 ?? 0, SharesDormant = App.Client.HasRedWhite ? vm.BusinessShares3 ?? 0 : vm.BusinessShares2 ?? 0,
AccountingNr = string.IsNullOrWhiteSpace(vm.AccountingNr) ? null : vm.AccountingNr, AccountingNr = string.IsNullOrWhiteSpace(vm.AccountingNr) ? null : vm.AccountingNr,
IsActive = vm.IsActive, IsActive = vm.IsActive,
IsFullDelivery = vm.IsFullDelivery, IsVollLieferant = vm.IsVollLieferant,
IsOfficer = vm.IsOfficer, IsFunktionär = vm.IsFunktionär,
ZwstId = vm.Branch?.ZwstId, ZwstId = vm.Branch?.ZwstId,
DefaultKgNr = vm.DefaultKg?.KgNr, DefaultKgNr = vm.DefaultKg?.KgNr,
Comment = string.IsNullOrWhiteSpace(vm.Comment) ? null : vm.Comment, Comment = string.IsNullOrWhiteSpace(vm.Comment) ? null : vm.Comment,
@@ -700,12 +692,12 @@ namespace Elwig.Services {
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
if (vm.TransferPredecessorAreaCmts is int year && m.PredecessorMgNr is int predecessor) { if (vm.TransferPredecessorAreaComs is int year && m.PredecessorMgNr is int predecessor) {
var areaCmts = await ctx.AreaCommitments var areaComs = await ctx.AreaCommitments
.Where(c => c.MgNr == predecessor && (c.YearTo == null || c.YearTo >= year)) .Where(c => c.MgNr == predecessor && (c.YearTo == null || c.YearTo >= year))
.ToListAsync(); .ToListAsync();
ctx.AddRange(await Task.WhenAll(areaCmts.Select(async (c, i) => new AreaCmt { ctx.AddRange(await Task.WhenAll(areaComs.Select(async (c, i) => new AreaCom {
FbNr = c.FbNr, FbNr = c.FbNr,
RevNr = await ctx.NextRevNr(c.FbNr), RevNr = await ctx.NextRevNr(c.FbNr),
MgNr = m.MgNr, MgNr = m.MgNr,
@@ -717,24 +709,24 @@ namespace Elwig.Services {
YearTo = c.YearTo, YearTo = c.YearTo,
}))); })));
foreach (var ac in areaCmts) foreach (var ac in areaComs)
ac.YearTo = year - 1; ac.YearTo = year - 1;
ctx.UpdateRange(areaCmts); ctx.UpdateRange(areaComs);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
} }
vm.TransferPredecessorAreaCmts = null; vm.TransferPredecessorAreaComs = null;
if (vm.CancelAreaCmts is int yearTo) { if (vm.CancelAreaComs is int yearTo) {
var areaCmts = await ctx.AreaCommitments var areaComs = await ctx.AreaCommitments
.Where(c => c.MgNr == m.MgNr && (c.YearTo == null || c.YearTo > yearTo)) .Where(c => c.MgNr == m.MgNr && (c.YearTo == null || c.YearTo > yearTo))
.ToListAsync(); .ToListAsync();
foreach (var ac in areaCmts) foreach (var ac in areaComs)
ac.YearTo = yearTo; ac.YearTo = yearTo;
ctx.UpdateRange(areaCmts); ctx.UpdateRange(areaComs);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
} }
vm.CancelAreaCmts = null; vm.CancelAreaComs = null;
if (newMgNr != m.MgNr) { if (newMgNr != m.MgNr) {
await ctx.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {oldMgNr}"); await ctx.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {oldMgNr}");
@@ -744,7 +736,7 @@ namespace Elwig.Services {
}); });
} }
public static async Task DeleteMember(int mgnr, bool deletePaymentData, bool deleteDeliveries, bool deleteAreaCmts) { public static async Task DeleteMember(int mgnr, bool deletePaymentData, bool deleteDeliveries, bool deleteAreaComs) {
await Task.Run(async () => { await Task.Run(async () => {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
using var tx = await ctx.Database.BeginTransactionAsync(); using var tx = await ctx.Database.BeginTransactionAsync();
@@ -755,7 +747,7 @@ namespace Elwig.Services {
if (deleteDeliveries) { if (deleteDeliveries) {
await ctx.Deliveries.Where(c => c.MgNr == mgnr).ExecuteDeleteAsync(); await ctx.Deliveries.Where(c => c.MgNr == mgnr).ExecuteDeleteAsync();
} }
if (deleteAreaCmts) { if (deleteAreaComs) {
await ctx.AreaCommitments.Where(c => c.MgNr == mgnr).ExecuteDeleteAsync(); await ctx.AreaCommitments.Where(c => c.MgNr == mgnr).ExecuteDeleteAsync();
} }
ctx.Remove(l); ctx.Remove(l);
+1 -2
View File
@@ -1,7 +1,6 @@
using Elwig.Helpers; using Elwig.Helpers;
using Elwig.Models.Entities; using Elwig.Models.Entities;
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
@@ -48,7 +47,7 @@ namespace Elwig.Services {
(CategoriesOfProduct.Contains(TracesCategoryOfProduct.UNPROCESSED_PLANT_PRODUCTS_INCLUDING_SEEDS) || CategoriesOfProduct.Contains(TracesCategoryOfProduct.WINE)); (CategoriesOfProduct.Contains(TracesCategoryOfProduct.UNPROCESSED_PLANT_PRODUCTS_INCLUDING_SEEDS) || CategoriesOfProduct.Contains(TracesCategoryOfProduct.WINE));
} }
private static readonly ConcurrentDictionary<int, (DateTime Timestamp, TracesCertificate[] Certificates)> _memberCerts = []; private static readonly Dictionary<int, (DateTime Timestamp, TracesCertificate[] Certificates)> _memberCerts = [];
public async static Task<TracesCertificate[]> GetTracesCertificates(Member m, bool? tryNameAndAddress = null) { public async static Task<TracesCertificate[]> GetTracesCertificates(Member m, bool? tryNameAndAddress = null) {
if (_memberCerts.TryGetValue(m.MgNr, out var entry) && entry.Timestamp >= DateTime.Now.AddDays(-1)) if (_memberCerts.TryGetValue(m.MgNr, out var entry) && entry.Timestamp >= DateTime.Now.AddDays(-1))
+2 -2
View File
@@ -159,10 +159,10 @@ namespace Elwig.Services {
foreach (int mgnr in currentPayments.Keys) { foreach (int mgnr in currentPayments.Keys) {
var c = currentPayments[mgnr]; var c = currentPayments[mgnr];
var l = lastPayments.GetValueOrDefault(mgnr); var l = lastPayments.GetValueOrDefault(mgnr);
vatSum += (c.Amount - (l?.Amount ?? 0)) * (decimal)(c.Member.IsAccounting ? v.Season.VatNormal : v.Season.VatFlatrate); vatSum += (c.Amount - (l?.Amount ?? 0)) * (decimal)(c.Member.IsBuchführend ? v.Season.VatNormal : v.Season.VatFlatrate);
} }
} else { } else {
vatSum = currentPayments.Sum(e => e.Value.Amount * (decimal)(e.Value.Member.IsAccounting ? v.Season.VatNormal : v.Season.VatFlatrate)); vatSum = currentPayments.Sum(e => e.Value.Amount * (decimal)(e.Value.Member.IsBuchführend ? v.Season.VatNormal : v.Season.VatFlatrate));
} }
vatText = $"~{vatSum:N2} {sym}"; vatText = $"~{vatSum:N2} {sym}";
deductionText = $"- {sym}"; deductionText = $"- {sym}";
+14 -14
View File
@@ -15,7 +15,7 @@ namespace Elwig.Services {
public static class SyncService { public static class SyncService {
public static readonly Expression<Func<Member, bool>> ChangedMembers = (m) => ((m.XTime == null && m.MTime > 1751328000) || m.MTime > m.XTime) && (m.ITime == null || m.MTime > m.ITime); public static readonly Expression<Func<Member, bool>> ChangedMembers = (m) => ((m.XTime == null && m.MTime > 1751328000) || m.MTime > m.XTime) && (m.ITime == null || m.MTime > m.ITime);
public static readonly Expression<Func<AreaCmtContract, bool>> ChangedAreaCmtContracts = (c) => ((c.XTime == null && c.MTime > 1751328000) || c.MTime > c.XTime) && (c.ITime == null || c.MTime > c.ITime); public static readonly Expression<Func<AreaComContract, bool>> ChangedAreaComContracts = (c) => ((c.XTime == null && c.MTime > 1751328000) || c.MTime > c.XTime) && (c.ITime == null || c.MTime > c.ITime);
public static readonly Expression<Func<Delivery, bool>> ChangedDeliveries = (d) => ((d.XTime == null && d.MTime > 1751328000) || d.MTime > d.XTime) && (d.ITime == null || d.MTime > d.ITime); public static readonly Expression<Func<Delivery, bool>> ChangedDeliveries = (d) => ((d.XTime == null && d.MTime > 1751328000) || d.MTime > d.XTime) && (d.ITime == null || d.MTime > d.ITime);
public static async Task Upload(string url, string username, string password, IQueryable<Member> query, IEnumerable<string> filterNames) { public static async Task Upload(string url, string username, string password, IQueryable<Member> query, IEnumerable<string> filterNames) {
@@ -37,7 +37,7 @@ namespace Elwig.Services {
.DistinctBy(h => h.HistNr) .DistinctBy(h => h.HistNr)
.OrderBy(h => h.DateNotice).ThenBy(h => h.HistNr) .OrderBy(h => h.DateNotice).ThenBy(h => h.HistNr)
.ToList(); .ToList();
var areaCmts = await query var areaComs = await query
.SelectMany(m => m.AreaCommitments) .SelectMany(m => m.AreaCommitments)
.Select(c => c.Contract).Distinct() .Select(c => c.Contract).Distinct()
.OrderBy(c => c.FbNr) .OrderBy(c => c.FbNr)
@@ -46,7 +46,7 @@ namespace Elwig.Services {
var wbKgs = members var wbKgs = members
.Where(m => m.DefaultWbKg != null) .Where(m => m.DefaultWbKg != null)
.Select(m => m.DefaultWbKg!) .Select(m => m.DefaultWbKg!)
.Union(areaCmts.Select(c => c.Kg)) .Union(areaComs.Select(c => c.Kg))
.Distinct() .Distinct()
.OrderBy(k => k.KgNr) .OrderBy(k => k.KgNr)
.ToList(); .ToList();
@@ -54,9 +54,9 @@ namespace Elwig.Services {
InteractionService.ShowError("Mitglieder hochladen", "Es wurden keine Mitglieder zum Hochladen ausgewählt!"); InteractionService.ShowError("Mitglieder hochladen", "Es wurden keine Mitglieder zum Hochladen ausgewählt!");
} else { } else {
var exportedAt = DateTime.Now; var exportedAt = DateTime.Now;
await ElwigData.Export(path, members, history, areaCmts, wbKgs, filterNames); await ElwigData.Export(path, members, history, areaComs, wbKgs, filterNames);
await Utils.UploadExportData(path, url, username, password); await Utils.UploadExportData(path, url, username, password);
await UpdateExportedAt(members, areaCmts, [], exportedAt); await UpdateExportedAt(members, areaComs, [], exportedAt);
InteractionService.ShowInformation("Mitglieder hochgeladen", $"Hochladen von {members.Count:N0} Mitgliedern erfolgreich!"); InteractionService.ShowInformation("Mitglieder hochgeladen", $"Hochladen von {members.Count:N0} Mitgliedern erfolgreich!");
} }
} catch (HttpRequestException exc) { } catch (HttpRequestException exc) {
@@ -106,7 +106,7 @@ namespace Elwig.Services {
try { try {
var path = Path.Combine(App.TempPath, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip"); var path = Path.Combine(App.TempPath, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip");
List<Member> members; List<Member> members;
List<AreaCmtContract> areaCmts; List<AreaComContract> areaComs;
List<Delivery> deliveries; List<Delivery> deliveries;
using (var ctx = new AppDbContext()) { using (var ctx = new AppDbContext()) {
members = await ctx.Members members = await ctx.Members
@@ -115,8 +115,8 @@ namespace Elwig.Services {
.Include(m => m.EmailAddresses) .Include(m => m.EmailAddresses)
.OrderBy(m => m.MgNr) .OrderBy(m => m.MgNr)
.ToListAsync(); .ToListAsync();
areaCmts = await ctx.AreaCommitmentContracts areaComs = await ctx.AreaCommitmentContracts
.Where(ChangedAreaCmtContracts) .Where(ChangedAreaComContracts)
.Include(c => c.Revisions) .Include(c => c.Revisions)
.OrderBy(c => c.FbNr) .OrderBy(c => c.FbNr)
.ToListAsync(); .ToListAsync();
@@ -129,7 +129,7 @@ namespace Elwig.Services {
var wbKgs = members var wbKgs = members
.Where(m => m.DefaultWbKg != null) .Where(m => m.DefaultWbKg != null)
.Select(m => m.DefaultWbKg!) .Select(m => m.DefaultWbKg!)
.Union(areaCmts.Select(c => c.Kg)) .Union(areaComs.Select(c => c.Kg))
.Union(deliveries.SelectMany(d => d.Parts) .Union(deliveries.SelectMany(d => d.Parts)
.Where(p => p.Kg != null) .Where(p => p.Kg != null)
.Select(p => p.Kg!)) .Select(p => p.Kg!))
@@ -142,13 +142,13 @@ namespace Elwig.Services {
var exportedAt = DateTime.Now; var exportedAt = DateTime.Now;
await (new ElwigData.ElwigExport { await (new ElwigData.ElwigExport {
Members = (members, ["geändert seit letztem Export"]), Members = (members, ["geändert seit letztem Export"]),
AreaCmts = (areaCmts, ["geändert seit letztem Export"]), AreaComs = (areaComs, ["geändert seit letztem Export"]),
Deliveries = (deliveries, ["geändert seit letzem Export"]), Deliveries = (deliveries, ["geändert seit letzem Export"]),
WbKgs = (wbKgs, ["von exportierten Mitgliedern, Flächenbindungen und Lieferungen"]), WbKgs = (wbKgs, ["von exportierten Mitgliedern, Flächenbindungen und Lieferungen"]),
}).Export(path); }).Export(path);
await Utils.UploadExportData(path, url, username, password); await Utils.UploadExportData(path, url, username, password);
await UpdateExportedAt(members, areaCmts, deliveries, exportedAt); await UpdateExportedAt(members, areaComs, deliveries, exportedAt);
InteractionService.ShowInformation("Mitglieder und Lieferungen hochladen", $"Hochladen von {members.Count:N0} Mitgliedern, {areaCmts.Count:N0} Flächenbindungsverträgen, und {deliveries.Count:N0} Lieferungen erfolgreich!"); InteractionService.ShowInformation("Mitglieder und Lieferungen hochladen", $"Hochladen von {members.Count:N0} Mitgliedern, {areaComs.Count:N0} Flächenbindungsverträgen, und {deliveries.Count:N0} Lieferungen erfolgreich!");
} }
} catch (HttpRequestException exc) { } catch (HttpRequestException exc) {
InteractionService.ShowException("Mitglieder und Lieferungen hochladen", "Eventuell Internetverbindung prüfen!", exc); InteractionService.ShowException("Mitglieder und Lieferungen hochladen", "Eventuell Internetverbindung prüfen!", exc);
@@ -236,7 +236,7 @@ namespace Elwig.Services {
} }
} }
private static async Task UpdateExportedAt(IEnumerable<Member> member, IEnumerable<AreaCmtContract> contracts, IEnumerable<Delivery> deliveries, DateTime dateTime) { private static async Task UpdateExportedAt(IEnumerable<Member> member, IEnumerable<AreaComContract> contracts, IEnumerable<Delivery> deliveries, DateTime dateTime) {
var timestamp = ((DateTimeOffset)dateTime.ToUniversalTime()).ToUnixTimeSeconds(); var timestamp = ((DateTimeOffset)dateTime.ToUniversalTime()).ToUnixTimeSeconds();
var mgnrs = string.Join(",", member.Select(m => $"{m.MgNr}").Append("0")); var mgnrs = string.Join(",", member.Select(m => $"{m.MgNr}").Append("0"));
var fbnrs = string.Join(",", contracts.Select(c => $"{c.FbNr}").Append("0")); var fbnrs = string.Join(",", contracts.Select(c => $"{c.FbNr}").Append("0"));
@@ -259,7 +259,7 @@ namespace Elwig.Services {
public static async Task<bool> ChangesAvailable(AppDbContext ctx, string url, string username, string password) { public static async Task<bool> ChangesAvailable(AppDbContext ctx, string url, string username, string password) {
try { try {
return await ctx.Members.Where(ChangedMembers).AnyAsync() || await ctx.AreaCommitmentContracts.Where(ChangedAreaCmtContracts).AnyAsync() || await ctx.Deliveries.Where(ChangedDeliveries).AnyAsync() || (Utils.HasInternetConnectivity() && (await GetFilesToImport(url, username, password)).Count > 0); return await ctx.Members.Where(ChangedMembers).AnyAsync() || await ctx.AreaCommitmentContracts.Where(ChangedAreaComContracts).AnyAsync() || await ctx.Deliveries.Where(ChangedDeliveries).AnyAsync() || (Utils.HasInternetConnectivity() && (await GetFilesToImport(url, username, password)).Count > 0);
} catch { } catch {
return false; return false;
} }
@@ -5,7 +5,7 @@ using System.Linq;
using System.Windows.Controls; using System.Windows.Controls;
namespace Elwig.ViewModels { namespace Elwig.ViewModels {
public partial class AreaCmtAdminViewModel : ObservableObject { public partial class AreaComAdminViewModel : ObservableObject {
[ObservableProperty] [ObservableProperty]
public partial string Title { get; set; } = "Flächenbindungen - Elwig"; public partial string Title { get; set; } = "Flächenbindungen - Elwig";
@@ -54,9 +54,9 @@ namespace Elwig.ViewModels {
public partial string? Period { get; set; } public partial string? Period { get; set; }
[ObservableProperty] [ObservableProperty]
public partial AreaCmtType? AreaCmtType { get; set; } public partial AreaComType? AreaComType { get; set; }
[ObservableProperty] [ObservableProperty]
public partial IEnumerable<AreaCmtType> AreaCmtTypeSource { get; set; } = []; public partial IEnumerable<AreaComType> AreaComTypeSource { get; set; } = [];
[ObservableProperty] [ObservableProperty]
public partial object? WineCultObj { get; set; } public partial object? WineCultObj { get; set; }
public WineCult? WineCult { public WineCult? WineCult {
+2 -2
View File
@@ -117,7 +117,7 @@ namespace Elwig.ViewModels {
public partial string? WeightString { get; set; } public partial string? WeightString { get; set; }
public int? Weight { public int? Weight {
get => int.TryParse(WeightString?.Replace(Utils.GroupSeparator, ""), out var w) ? w : null; get => int.TryParse(WeightString?.Replace(Utils.GroupSeparator, ""), out var w) ? w : null;
set => WeightString = value > 0 ? $"{value:N0}" : null; set => WeightString = $"{value:N0}";
} }
[ObservableProperty] [ObservableProperty]
public partial string? TareString { get; set; } = "-"; public partial string? TareString { get; set; } = "-";
@@ -157,7 +157,7 @@ namespace Elwig.ViewModels {
[ObservableProperty] [ObservableProperty]
public partial IEnumerable<object> WineRdSource { get; set; } = []; public partial IEnumerable<object> WineRdSource { get; set; } = [];
[ObservableProperty] [ObservableProperty]
public partial bool? IsContracted { get; set; } public partial bool? IsGebunden { get; set; }
public ObservableCollection<Modifier> Modifiers { get; set; } = []; public ObservableCollection<Modifier> Modifiers { get; set; } = [];
[ObservableProperty] [ObservableProperty]
+5 -5
View File
@@ -14,8 +14,8 @@ namespace Elwig.ViewModels {
[ObservableProperty] [ObservableProperty]
public partial string Title { get; set; } = "Mitglieder - Elwig"; public partial string Title { get; set; } = "Mitglieder - Elwig";
public int? TransferPredecessorAreaCmts { get; set; } = null; public int? TransferPredecessorAreaComs { get; set; } = null;
public int? CancelAreaCmts { get; set; } = null; public int? CancelAreaComs { get; set; } = null;
public ObservableCollection<KeyValuePair<string, string>> PhoneNrTypes { get; set; } = new(Utils.PhoneNrTypes); public ObservableCollection<KeyValuePair<string, string>> PhoneNrTypes { get; set; } = new(Utils.PhoneNrTypes);
@@ -125,7 +125,7 @@ namespace Elwig.ViewModels {
[ObservableProperty] [ObservableProperty]
public partial string? OrganicAuthorityCode { get; set; } public partial string? OrganicAuthorityCode { get; set; }
[ObservableProperty] [ObservableProperty]
public partial bool IsAccounting { get; set; } public partial bool IsBuchführend { get; set; }
[ObservableProperty] [ObservableProperty]
public partial bool IsOrganic { get; set; } public partial bool IsOrganic { get; set; }
@@ -165,9 +165,9 @@ namespace Elwig.ViewModels {
[ObservableProperty] [ObservableProperty]
public partial bool IsActive { get; set; } public partial bool IsActive { get; set; }
[ObservableProperty] [ObservableProperty]
public partial bool IsFullDelivery { get; set; } public partial bool IsVollLieferant { get; set; }
[ObservableProperty] [ObservableProperty]
public partial bool IsOfficer { get; set; } public partial bool IsFunktionär { get; set; }
[ObservableProperty] [ObservableProperty]
public partial Branch? Branch { get; set; } public partial Branch? Branch { get; set; }
[ObservableProperty] [ObservableProperty]
+2 -2
View File
@@ -608,8 +608,8 @@ namespace Elwig.Windows {
InputLostFocus((TextBox)sender, Validator.CheckUpperCase); InputLostFocus((TextBox)sender, Validator.CheckUpperCase);
} }
protected void AreaCmtTypeDetailsButton_Click(object sender, RoutedEventArgs? evt) { protected void AreaComTypeDetailsButton_Click(object sender, RoutedEventArgs? evt) {
App.FocusBaseDataAreaCmtType(); App.FocusBaseDataAreaComType();
} }
protected void AddressInput_TextChanged(object sender, TextChangedEventArgs? evt) { protected void AddressInput_TextChanged(object sender, TextChangedEventArgs? evt) {
@@ -1,5 +1,5 @@
<local:AdministrationWindow <local:AdministrationWindow
x:Class="Elwig.Windows.AreaCmtAdminWindow" x:Class="Elwig.Windows.AreaComAdminWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
@@ -9,7 +9,7 @@
xmlns:vm="clr-namespace:Elwig.ViewModels" xmlns:vm="clr-namespace:Elwig.ViewModels"
Title="{Binding Title}" Height="600" MinHeight="550" Width="1000" MinWidth="860"> Title="{Binding Title}" Height="600" MinHeight="550" Width="1000" MinWidth="860">
<Window.DataContext> <Window.DataContext>
<vm:AreaCmtAdminViewModel/> <vm:AreaComAdminViewModel/>
</Window.DataContext> </Window.DataContext>
<Window.Resources> <Window.Resources>
<Style TargetType="Label"> <Style TargetType="Label">
@@ -110,10 +110,10 @@
</DataGridTextColumn.CellStyle> </DataGridTextColumn.CellStyle>
</DataGridTextColumn> </DataGridTextColumn>
<DataGridTextColumn Header="Katastralgemeinde" Binding="{Binding Kg.AtKg.Name}" Width="130"/> <DataGridTextColumn Header="Katastralgemeinde" Binding="{Binding Kg.AtKg.Name}" Width="130"/>
<DataGridTextColumn Header="Sorte" Binding="{Binding Latest.AreaCmtType.VtrgId}" Width="50"> <DataGridTextColumn Header="Sorte" Binding="{Binding Latest.AreaComType.VtrgId}" Width="50">
<DataGridTextColumn.CellStyle> <DataGridTextColumn.CellStyle>
<Style> <Style>
<Setter Property="TextBlock.Foreground" Value="{Binding Latest.AreaCmtType.WineVar.Color}"/> <Setter Property="TextBlock.Foreground" Value="{Binding Latest.AreaComType.WineVar.Color}"/>
<Setter Property="TextBlock.TextAlignment" Value="Center"/> <Setter Property="TextBlock.TextAlignment" Value="Center"/>
</Style> </Style>
</DataGridTextColumn.CellStyle> </DataGridTextColumn.CellStyle>
@@ -229,7 +229,7 @@
<TextBlock Text="{Binding YearFrom}" Width="28" TextAlignment="Right" Margin="0,0,0,0"/> <TextBlock Text="{Binding YearFrom}" Width="28" TextAlignment="Right" Margin="0,0,0,0"/>
<TextBlock Text="&#x2013;" TextAlignment="Center" Margin="0,0,0,0"/> <TextBlock Text="&#x2013;" TextAlignment="Center" Margin="0,0,0,0"/>
<TextBlock Text="{Binding YearTo}" Width="28" TextAlignment="Left" Margin="0,0,0,0"/> <TextBlock Text="{Binding YearTo}" Width="28" TextAlignment="Left" Margin="0,0,0,0"/>
<TextBlock Text="{Binding VtrgId}" Width="40" TextAlignment="Center" Foreground="{Binding AreaCmtType.WineVar.Color}"/> <TextBlock Text="{Binding VtrgId}" Width="40" TextAlignment="Center" Foreground="{Binding AreaComType.WineVar.Color}"/>
<TextBlock Text="{Binding Area, StringFormat='{}{0:N0} m²'}" Width="60" TextAlignment="Right" Padding="0,0,10,0"/> <TextBlock Text="{Binding Area, StringFormat='{}{0:N0} m²'}" Width="60" TextAlignment="Right" Padding="0,0,10,0"/>
<TextBlock Text="{Binding Member.AdministrativeName}"/> <TextBlock Text="{Binding Member.AdministrativeName}"/>
</StackPanel> </StackPanel>
@@ -268,11 +268,11 @@
TextChanged="IntegerInput_TextChanged"/> TextChanged="IntegerInput_TextChanged"/>
<Label Content="Vertragsart:" Margin="10,70,0,0" Grid.Column="0"/> <Label Content="Vertragsart:" Margin="10,70,0,0" Grid.Column="0"/>
<ComboBox x:Name="AreaCmtTypeInput" SelectedItem="{Binding AreaCmtType, Mode=TwoWay}" ItemsSource="{Binding AreaCmtTypeSource, Mode=TwoWay}" <ComboBox x:Name="AreaComTypeInput" SelectedItem="{Binding AreaComType, Mode=TwoWay}" ItemsSource="{Binding AreaComTypeSource, Mode=TwoWay}"
ItemTemplate="{StaticResource AreaCommitmentTypeTemplate}" TextSearch.TextPath="DisplayName" ItemTemplate="{StaticResource AreaCommitmentTypeTemplate}" TextSearch.TextPath="DisplayName"
HorizontalAlignment="Stretch" Margin="0,70,40,10" Grid.Column="1"/> HorizontalAlignment="Stretch" Margin="0,70,40,10" Grid.Column="1"/>
<Button x:Name="AreaCmtTypeDetailsButton" Content="&#xE712;" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0" <Button x:Name="AreaComTypeDetailsButton" Content="&#xE712;" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0"
Click="AreaCmtTypeDetailsButton_Click" Click="AreaComTypeDetailsButton_Click"
Grid.Column="3" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,70,10,10"/> Grid.Column="3" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,70,10,10"/>
<Label Content="Bewirt.-Art:" Margin="10,100,0,0" Grid.Column="0"/> <Label Content="Bewirt.-Art:" Margin="10,100,0,0" Grid.Column="0"/>
@@ -12,13 +12,13 @@ using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
namespace Elwig.Windows { namespace Elwig.Windows {
public partial class AreaCmtAdminWindow : AdministrationWindow { public partial class AreaComAdminWindow : AdministrationWindow {
public AreaCmtAdminViewModel ViewModel => (AreaCmtAdminViewModel)DataContext; public AreaComAdminViewModel ViewModel => (AreaComAdminViewModel)DataContext;
private readonly RoutedCommand CtrlF = new("CtrlF", typeof(AreaCmtAdminWindow), [new KeyGesture(Key.F, ModifierKeys.Control)]); private readonly RoutedCommand CtrlF = new("CtrlF", typeof(AreaComAdminWindow), [new KeyGesture(Key.F, ModifierKeys.Control)]);
public AreaCmtAdminWindow(int mgnr) { public AreaComAdminWindow(int mgnr) {
InitializeComponent(); InitializeComponent();
CommandBindings.Add(new CommandBinding(CtrlF, FocusSearchInput)); CommandBindings.Add(new CommandBinding(CtrlF, FocusSearchInput));
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
@@ -30,7 +30,7 @@ namespace Elwig.Windows {
]; ];
RequiredInputs = [ RequiredInputs = [
FbNrInput, MgNrInput, MemberInput, YearFromInput, KgInput, RdInput, FbNrInput, MgNrInput, MemberInput, YearFromInput, KgInput, RdInput,
GstNrInput, AreaInput, AreaCmtTypeInput, WineCultivationInput GstNrInput, AreaInput, AreaComTypeInput, WineCultivationInput
]; ];
ControlUtils.InitializeDelayTimer(SearchInput, SearchInput_TextChanged); ControlUtils.InitializeDelayTimer(SearchInput, SearchInput_TextChanged);
@@ -50,13 +50,13 @@ namespace Elwig.Windows {
var cursor = Mouse.OverrideCursor != null; var cursor = Mouse.OverrideCursor != null;
if (!cursor) Mouse.OverrideCursor = Cursors.Wait; if (!cursor) Mouse.OverrideCursor = Cursors.Wait;
var query = (vm.SearchQuery, vm.FilterSeason); var query = (vm.SearchQuery, vm.FilterSeason);
var (filterNames, filter, contracts, areaCmts, areaCmtCount, stat) = await Task.Run(async () => { var (filterNames, filter, contracts, areaComs, areaComCount, stat) = await Task.Run(async () => {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
var (filterNames, contractQuery, areaCmtQuery, filter) = await vm.GetFilters(ctx); var (filterNames, contractQuery, areaComQuery, filter) = await vm.GetFilters(ctx);
var contracts = await contractQuery var contracts = await contractQuery
.Include(c => c.Revisions).ThenInclude(a => a.Member) .Include(c => c.Revisions).ThenInclude(a => a.Member)
.ToListAsync(); .ToListAsync();
var areaCmts = await areaCmtQuery.ToListAsync(); var areaComs = await areaComQuery.ToListAsync();
if (filter.Count > 0 && contracts.Count > 0) { if (filter.Count > 0 && contracts.Count > 0) {
var dict = contracts.AsParallel() var dict = contracts.AsParallel()
@@ -68,11 +68,11 @@ namespace Elwig.Windows {
.Select(a => a.Key)]; .Select(a => a.Key)];
} }
var areaCmtCount = await areaCmtQuery.CountAsync(); var areaComCount = await areaComQuery.CountAsync();
var season = await ctx.FetchSeasons().FirstOrDefaultAsync(); var season = await ctx.FetchSeasons().FirstOrDefaultAsync();
var stat = await AreaCmtService.GenerateToolTipData(areaCmtQuery, season?.MaxKgPerHa ?? 10_000); var stat = await AreaComService.GenerateToolTipData(areaComQuery, season?.MaxKgPerHa ?? 10_000);
return (filterNames, filter, contracts, areaCmts, areaCmtCount, stat); return (filterNames, filter, contracts, areaComs, areaComCount, stat);
}); });
if (!cursor) Mouse.OverrideCursor = null; if (!cursor) Mouse.OverrideCursor = null;
if (query != (ViewModel.SearchQuery, ViewModel.FilterSeason)) return; if (query != (ViewModel.SearchQuery, ViewModel.FilterSeason)) return;
@@ -83,16 +83,16 @@ namespace Elwig.Windows {
RefreshInputs(); RefreshInputs();
if (filter.Count == 0) { if (filter.Count == 0) {
ViewModel.StatusAreaCommitments = $"{areaCmtCount:N0}"; ViewModel.StatusAreaCommitments = $"{areaComCount:N0}";
var (text, gridData) = stat; var (text, gridData) = stat;
ViewModel.StatusArea = text; ViewModel.StatusArea = text;
ViewModel.StatusAreaToolTip = AreaCmtService.GenerateToolTip(gridData); ViewModel.StatusAreaToolTip = AreaComService.GenerateToolTip(gridData);
} else { } else {
ViewModel.StatusAreaCommitments = $"{contracts.Count:N0}"; ViewModel.StatusAreaCommitments = $"{contracts.Count:N0}";
ViewModel.StatusArea = $"{areaCmts.Sum(a => a.Area):N0} m²"; ViewModel.StatusArea = $"{areaComs.Sum(a => a.Area):N0} m²";
ViewModel.StatusAreaToolTip = null; ViewModel.StatusAreaToolTip = null;
} }
var groups = areaCmts.GroupBy(a => $"{a.AreaCmtType.SortId}{a.AreaCmtType.AttrId}").Select(a => (a.Key, a.Sum(b => b.Area))).OrderByDescending(a => a.Item2).ToList(); var groups = areaComs.GroupBy(a => $"{a.AreaComType.SortId}{a.AreaComType.AttrId}").Select(a => (a.Key, a.Sum(b => b.Area))).OrderByDescending(a => a.Item2).ToList();
ViewModel.StatusContracts = $"{groups.Count:N0}"; ViewModel.StatusContracts = $"{groups.Count:N0}";
if (groups.Count > 0) if (groups.Count > 0)
ViewModel.StatusContracts += $" ({string.Join(", ", groups.Select(g => g.Key))})"; ViewModel.StatusContracts += $" ({string.Join(", ", groups.Select(g => g.Key))})";
@@ -100,7 +100,7 @@ namespace Elwig.Windows {
private async Task RefreshRevisions() { private async Task RefreshRevisions() {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
if (AreaCommitmentList.SelectedItem is AreaCmtContract c) { if (AreaCommitmentList.SelectedItem is AreaComContract c) {
ControlUtils.RenewItemsSource(RevisionList, c.Revisions.OrderByDescending(p => p.RevNr).ToList(), RevisionList_SelectionChanged, ControlUtils.RenewSourceDefault.First); ControlUtils.RenewItemsSource(RevisionList, c.Revisions.OrderByDescending(p => p.RevNr).ToList(), RevisionList_SelectionChanged, ControlUtils.RenewSourceDefault.First);
} else { } else {
RevisionList.ItemsSource = null; RevisionList.ItemsSource = null;
@@ -109,11 +109,11 @@ namespace Elwig.Windows {
private void RefreshInputs(bool validate = false) { private void RefreshInputs(bool validate = false) {
ClearInputStates(); ClearInputStates();
if (RevisionList.SelectedItem is AreaCmt a) { if (RevisionList.SelectedItem is AreaCom a) {
EditAreaCommitmentButton.IsEnabled = true; EditAreaCommitmentButton.IsEnabled = true;
DeleteAreaCommitmentButton.IsEnabled = true; DeleteAreaCommitmentButton.IsEnabled = true;
FillInputs(a); FillInputs(a);
} else if (AreaCommitmentList.SelectedItem is AreaCmtContract c) { } else if (AreaCommitmentList.SelectedItem is AreaComContract c) {
EditAreaCommitmentButton.IsEnabled = true; EditAreaCommitmentButton.IsEnabled = true;
DeleteAreaCommitmentButton.IsEnabled = true; DeleteAreaCommitmentButton.IsEnabled = true;
FillInputs(c); FillInputs(c);
@@ -128,14 +128,14 @@ namespace Elwig.Windows {
GC.Collect(); GC.Collect();
} }
private void FillInputs(AreaCmtContract c) { private void FillInputs(AreaComContract c) {
ClearOriginalValues(); ClearOriginalValues();
ClearDefaultValues(); ClearDefaultValues();
ViewModel.FillInputs(c); ViewModel.FillInputs(c);
FinishInputFilling(); FinishInputFilling();
} }
private void FillInputs(AreaCmt a) { private void FillInputs(AreaCom a) {
FillInputs(a.Contract); FillInputs(a.Contract);
ClearOriginalValues(); ClearOriginalValues();
ClearDefaultValues(); ClearDefaultValues();
@@ -170,7 +170,7 @@ namespace Elwig.Windows {
.Select(k => k.AtKg) .Select(k => k.AtKg)
.OrderBy(k => k.Name) .OrderBy(k => k.Name)
.ToListAsync()); .ToListAsync());
ControlUtils.RenewItemsSource(AreaCmtTypeInput, await ctx.AreaCommitmentTypes ControlUtils.RenewItemsSource(AreaComTypeInput, await ctx.AreaCommitmentTypes
.Include(c => c.WineVar) .Include(c => c.WineVar)
.Include(c => c.WineAttr) .Include(c => c.WineAttr)
.OrderBy(v => v.VtrgId) .OrderBy(v => v.VtrgId)
@@ -228,10 +228,10 @@ namespace Elwig.Windows {
} }
private async void DeleteAreaCommitmentButton_Click(object? sender, RoutedEventArgs? evt) { private async void DeleteAreaCommitmentButton_Click(object? sender, RoutedEventArgs? evt) {
if (RevisionList.SelectedItem is not AreaCmt a) if (RevisionList.SelectedItem is not AreaCom a)
return; return;
var d = new AreaCmtModifyDialog(a.YearFrom, a.YearTo, a.Area, true, RevisionList.ItemsSource.Cast<object>().FirstOrDefault() != a); var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, true, RevisionList.ItemsSource.Cast<object>().FirstOrDefault() != a);
if (d.ShowDialog() != true) if (d.ShowDialog() != true)
return; return;
@@ -241,7 +241,7 @@ namespace Elwig.Windows {
ViewModel.YearTo = yearTo; ViewModel.YearTo = yearTo;
await ViewModel.UpdateAreaCommitment(a.FbNr, a.RevNr); await ViewModel.UpdateAreaCommitment(a.FbNr, a.RevNr);
} else { } else {
await AreaCmtService.DeleteAreaCmt(a.FbNr); await AreaComService.DeleteAreaCom(a.FbNr);
} }
App.HintContextChange(); App.HintContextChange();
} catch (Exception exc) { } catch (Exception exc) {
@@ -260,9 +260,9 @@ namespace Elwig.Windows {
SaveButton.IsEnabled = false; SaveButton.IsEnabled = false;
int? yearTo = null; int? yearTo = null;
if (InputHasChanged(AreaInput) || InputHasChanged(AreaCmtTypeInput) || InputHasChanged(MgNrInput)) { if (InputHasChanged(AreaInput) || InputHasChanged(AreaComTypeInput) || InputHasChanged(MgNrInput)) {
var a = (RevisionList.SelectedItem as AreaCmt)!; var a = (RevisionList.SelectedItem as AreaCom)!;
var d = new AreaCmtModifyDialog(a.YearFrom, a.YearTo, a.Area, false, RevisionList.ItemsSource.Cast<object>().FirstOrDefault() != a); var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, false, RevisionList.ItemsSource.Cast<object>().FirstOrDefault() != a);
if (d.ShowDialog() != true) { if (d.ShowDialog() != true) {
SaveButton.IsEnabled = true; SaveButton.IsEnabled = true;
return; return;
@@ -273,13 +273,13 @@ namespace Elwig.Windows {
int fbnr, revnr; int fbnr, revnr;
Mouse.OverrideCursor = Cursors.Wait; Mouse.OverrideCursor = Cursors.Wait;
try { try {
AreaCmt? temp = null; AreaCom? temp = null;
if (yearTo != null && (!ViewModel.YearTo.HasValue || yearTo < ViewModel.YearTo)) { if (yearTo != null && (!ViewModel.YearTo.HasValue || yearTo < ViewModel.YearTo)) {
temp = new AreaCmt { temp = new AreaCom {
MgNr = ViewModel.MgNr!.Value, MgNr = ViewModel.MgNr!.Value,
YearFrom = ViewModel.YearFrom, YearFrom = ViewModel.YearFrom,
YearTo = ViewModel.YearTo, YearTo = ViewModel.YearTo,
VtrgId = ViewModel.AreaCmtType!.VtrgId, VtrgId = ViewModel.AreaComType!.VtrgId,
CultId = ViewModel.WineCult?.CultId, CultId = ViewModel.WineCult?.CultId,
GstNr = ViewModel.GstNr?.Trim() ?? "-", GstNr = ViewModel.GstNr?.Trim() ?? "-",
Area = ViewModel.Area!.Value, Area = ViewModel.Area!.Value,
@@ -287,11 +287,11 @@ namespace Elwig.Windows {
RefreshInputs(); RefreshInputs();
ViewModel.YearTo = yearTo; ViewModel.YearTo = yearTo;
} }
(fbnr, revnr) = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaCmtContract)?.FbNr, (RevisionList.SelectedItem as AreaCmt)?.RevNr); (fbnr, revnr) = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaComContract)?.FbNr, (RevisionList.SelectedItem as AreaCom)?.RevNr);
if (temp is AreaCmt t) { if (temp is AreaCom t) {
t.YearFrom = yearTo + 1; t.YearFrom = yearTo + 1;
ViewModel.FillInputs(t); ViewModel.FillInputs(t);
(fbnr, revnr) = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaCmtContract)?.FbNr, null); (fbnr, revnr) = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaComContract)?.FbNr, null);
} }
App.HintContextChange(); App.HintContextChange();
} catch (Exception exc) { } catch (Exception exc) {
@@ -415,7 +415,7 @@ namespace Elwig.Windows {
private void RevisionList_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) { private void RevisionList_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) {
RefreshInputs(); RefreshInputs();
if (RevisionList.SelectedItem is AreaCmt c) { if (RevisionList.SelectedItem is AreaCom c) {
EditAreaCommitmentButton.IsEnabled = true; EditAreaCommitmentButton.IsEnabled = true;
} else { } else {
EditAreaCommitmentButton.IsEnabled = false; EditAreaCommitmentButton.IsEnabled = false;
@@ -495,12 +495,12 @@ namespace Elwig.Windows {
RdInput.SelectedIndex = s.Count(); RdInput.SelectedIndex = s.Count();
} }
protected void InputTextChanged(TextBox input, Func<TextBox, bool, AreaCmtContract?, ValidationResult> checker) { protected void InputTextChanged(TextBox input, Func<TextBox, bool, AreaComContract?, ValidationResult> checker) {
InputTextChanged(input, checker(input, SenderIsRequired(input), (AreaCmtContract)AreaCommitmentList.SelectedItem)); InputTextChanged(input, checker(input, SenderIsRequired(input), (AreaComContract)AreaCommitmentList.SelectedItem));
} }
protected void InputLostFocus(TextBox input, Func<TextBox, bool, AreaCmtContract?, ValidationResult> checker, string? msg = null) { protected void InputLostFocus(TextBox input, Func<TextBox, bool, AreaComContract?, ValidationResult> checker, string? msg = null) {
InputLostFocus(input, checker(input, SenderIsRequired(input), (AreaCmtContract)AreaCommitmentList.SelectedItem), msg); InputLostFocus(input, checker(input, SenderIsRequired(input), (AreaComContract)AreaCommitmentList.SelectedItem), msg);
} }
private void FbNrInput_TextChanged(object sender, RoutedEventArgs evt) { private void FbNrInput_TextChanged(object sender, RoutedEventArgs evt) {
+3 -10
View File
@@ -195,7 +195,7 @@
<Label Content="PLZ/Ort:" Margin="10,70,0,10"/> <Label Content="PLZ/Ort:" Margin="10,70,0,10"/>
<TextBox x:Name="BranchPlzInput" Margin="0,70,0,0" Width="42" Grid.Column="1" HorizontalAlignment="Left" <TextBox x:Name="BranchPlzInput" Margin="0,70,0,0" Width="42" Grid.Column="1" HorizontalAlignment="Left"
TextChanged="BranchPlzInput_TextChanged" LostFocus="PlzInput_LostFocus" Tag="PLZ"/> TextChanged="BranchPlzInput_TextChanged" LostFocus="PlzInput_LostFocus" Tag="PLZ"/>
<ComboBox x:Name="BranchOrtInput" DisplayMemberPath="FullDest" TextSearch.TextPath="Ort.Name" <ComboBox x:Name="BranchOrtInput" ItemTemplate="{StaticResource PostalDestTemplate}" TextSearch.TextPath="Ort.Name"
Margin="47,70,10,0" Grid.Column="1" Grid.ColumnSpan="3" Width="253" HorizontalAlignment="Left" Margin="47,70,10,0" Grid.Column="1" Grid.ColumnSpan="3" Width="253" HorizontalAlignment="Left"
SelectionChanged="Branch_Changed"/> SelectionChanged="Branch_Changed"/>
@@ -566,7 +566,7 @@
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"/> Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"/>
</Grid> </Grid>
</GroupBox> </GroupBox>
<GroupBox x:Name="ParameterAreaCmtGroup" Header="Berechnung Flächenbindungen (aktuelle Saison)" Margin="10,10,10,0" VerticalAlignment="Top"> <GroupBox x:Name="ParameterAreaComGroup" Header="Berechnung Flächenbindungen (aktuelle Saison)" Margin="10,10,10,0" VerticalAlignment="Top">
<Grid> <Grid>
<CheckBox x:Name="ParameterAllowAttrIntoLowerInput" Content="Erlauben Lieferungen auch auf (konfigurierte) &quot;schlechtere&quot; Flächenbindungen aufzuteilen" <CheckBox x:Name="ParameterAllowAttrIntoLowerInput" Content="Erlauben Lieferungen auch auf (konfigurierte) &quot;schlechtere&quot; Flächenbindungen aufzuteilen"
VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,10,10,10" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,10,10,10"
@@ -574,7 +574,7 @@
<CheckBox x:Name="ParameterAvoidUnderDeliveriesInput" Content="Unterlieferungen durch Abzug bei &quot;besseren&quot; Flächenbindungen vermeiden" <CheckBox x:Name="ParameterAvoidUnderDeliveriesInput" Content="Unterlieferungen durch Abzug bei &quot;besseren&quot; Flächenbindungen vermeiden"
VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,30,10,10" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,30,10,10"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"/> Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"/>
<CheckBox x:Name="ParameterHonorContractedInput" Margin="10,50,10,10" VerticalAlignment="Top" <CheckBox x:Name="ParameterHonorGebundenInput" Margin="10,50,10,10" VerticalAlignment="Top"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"> Checked="CheckBox_Changed" Unchecked="CheckBox_Changed">
<TextBlock>Bei Lieferungen das Feld <Italic>Gebunden</Italic> berücksichtigen</TextBlock> <TextBlock>Bei Lieferungen das Feld <Italic>Gebunden</Italic> berücksichtigen</TextBlock>
</CheckBox> </CheckBox>
@@ -611,13 +611,6 @@
<TabItem Header="Textelemente"> <TabItem Header="Textelemente">
<ScrollViewer VerticalScrollBarVisibility="Visible"> <ScrollViewer VerticalScrollBarVisibility="Visible">
<StackPanel> <StackPanel>
<GroupBox Header="Stammdatenblatt" Margin="10,10,10,10" Height="70">
<Grid>
<CheckBox x:Name="ModeMemberDataSheetShares" Content="Verlauf der Geschäftsanteile anzeigen" Margin="15,15,10,15"
HorizontalAlignment="Left" VerticalAlignment="Top"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"/>
</Grid>
</GroupBox>
<GroupBox Header="Lieferschein" Margin="10,10,10,10" Height="180"> <GroupBox Header="Lieferschein" Margin="10,10,10,10" Height="180">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
+5 -5
View File
@@ -13,8 +13,8 @@ namespace Elwig.Windows {
public partial class BaseDataWindow { public partial class BaseDataWindow {
private Dictionary<string, string?>? _acts = null; private Dictionary<string, string?>? _acts = null;
private Dictionary<AreaCmtType, string>? _actIds = null; private Dictionary<AreaComType, string>? _actIds = null;
private ObservableCollection<AreaCmtType>? _actList = null; private ObservableCollection<AreaComType>? _actList = null;
private bool _actChanged = false; private bool _actChanged = false;
private bool _actUpdate = false; private bool _actUpdate = false;
@@ -73,7 +73,7 @@ namespace Elwig.Windows {
private void AreaCommitmentTypeList_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) { private void AreaCommitmentTypeList_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) {
UpdateButtons(); UpdateButtons();
_actUpdate = true; _actUpdate = true;
if (AreaCommitmentTypeList.SelectedItem is AreaCmtType type) { if (AreaCommitmentTypeList.SelectedItem is AreaComType type) {
AreaCommitmentTypeIdInput.Text = $"{type.SortId}{type.AttrId}"; AreaCommitmentTypeIdInput.Text = $"{type.SortId}{type.AttrId}";
ControlUtils.SelectItemWithPk(AreaCommitmentTypeWineVariantInput, type.SortId); ControlUtils.SelectItemWithPk(AreaCommitmentTypeWineVariantInput, type.SortId);
ControlUtils.SelectItemWithPk(AreaCommitmentTypeWineAttributeInput, type.AttrId); ControlUtils.SelectItemWithPk(AreaCommitmentTypeWineAttributeInput, type.AttrId);
@@ -96,7 +96,7 @@ namespace Elwig.Windows {
private void AreaCommitmentTypeAddButton_Click(object sender, RoutedEventArgs evt) { private void AreaCommitmentTypeAddButton_Click(object sender, RoutedEventArgs evt) {
if (_actList == null) return; if (_actList == null) return;
_actChanged = true; _actChanged = true;
var item = new AreaCmtType { VtrgId = "", SortId = "" }; var item = new AreaComType { VtrgId = "", SortId = "" };
_actList.Add(item); _actList.Add(item);
AreaCommitmentTypeList.SelectedItem = item; AreaCommitmentTypeList.SelectedItem = item;
UpdateButtons(); UpdateButtons();
@@ -114,7 +114,7 @@ namespace Elwig.Windows {
} }
private void AreaCommitmentType_Changed(object? sender, RoutedEventArgs? evt) { private void AreaCommitmentType_Changed(object? sender, RoutedEventArgs? evt) {
if (_actUpdate || (!IsEditing && !IsCreating) || AreaCommitmentTypeList.SelectedItem is not AreaCmtType attr || _acts == null || _actIds == null) return; if (_actUpdate || (!IsEditing && !IsCreating) || AreaCommitmentTypeList.SelectedItem is not AreaComType attr || _acts == null || _actIds == null) return;
_actChanged = true; _actChanged = true;
var v = AreaCommitmentTypeWineVariantInput.SelectedItem as WineVar; var v = AreaCommitmentTypeWineVariantInput.SelectedItem as WineVar;
+3 -5
View File
@@ -37,7 +37,7 @@ namespace Elwig.Windows {
]; ];
WineAttributeFillLowerInput.Visibility = Visibility.Hidden; WineAttributeFillLowerInput.Visibility = Visibility.Hidden;
WineAttributeFillLowerLabel.Visibility = Visibility.Hidden; WineAttributeFillLowerLabel.Visibility = Visibility.Hidden;
ParameterAreaCmtGroup.Header = ParameterAreaCmtGroup.Header.ToString()!.Split('(')[0] + $"({Utils.CurrentLastSeason})"; ParameterAreaComGroup.Header = ParameterAreaComGroup.Header.ToString()!.Split('(')[0] + $"({Utils.CurrentLastSeason})";
LockInputs(); LockInputs();
} }
@@ -338,7 +338,6 @@ namespace Elwig.Windows {
ClientEmailAddressInput.Text = p.EmailAddress; ClientEmailAddressInput.Text = p.EmailAddress;
ClientWebsiteInput.Text = p.Website; ClientWebsiteInput.Text = p.Website;
ModeMemberDataSheetShares.IsChecked = p.ModeMemberDataSheetShares > 0;
TextElementDeliveryNote.Text = p.TextDeliveryNote; TextElementDeliveryNote.Text = p.TextDeliveryNote;
switch (p.ModeDeliveryNoteStats) { switch (p.ModeDeliveryNoteStats) {
case 0: ModeDeliveryNoteNone.IsChecked = true; break; case 0: ModeDeliveryNoteNone.IsChecked = true; break;
@@ -353,7 +352,7 @@ namespace Elwig.Windows {
ParameterBusinessShareHistoryInput.IsChecked = p.EnableMemberHistory; ParameterBusinessShareHistoryInput.IsChecked = p.EnableMemberHistory;
ParameterAllowAttrIntoLowerInput.IsChecked = s?.Billing_AllowAttrsIntoLower ?? false; ParameterAllowAttrIntoLowerInput.IsChecked = s?.Billing_AllowAttrsIntoLower ?? false;
ParameterAvoidUnderDeliveriesInput.IsChecked = s?.Billing_AvoidUnderDeliveries ?? false; ParameterAvoidUnderDeliveriesInput.IsChecked = s?.Billing_AvoidUnderDeliveries ?? false;
ParameterHonorContractedInput.IsChecked = s?.Billing_HonorContracted ?? false; ParameterHonorGebundenInput.IsChecked = s?.Billing_HonorGebunden ?? false;
ParameterExportEbicsVersion.SelectedIndex = p.ExportEbicsVersion - 3; ParameterExportEbicsVersion.SelectedIndex = p.ExportEbicsVersion - 3;
ParameterExportEbicsAddress.SelectedIndex = p.ExportEbicsAddress; ParameterExportEbicsAddress.SelectedIndex = p.ExportEbicsAddress;
@@ -382,7 +381,6 @@ namespace Elwig.Windows {
p.ModeBusinessShares = ParameterBusinessShareModeInput.SelectedIndex; p.ModeBusinessShares = ParameterBusinessShareModeInput.SelectedIndex;
p.EnableMemberHistory = ParameterBusinessShareHistoryInput.IsChecked ?? false; p.EnableMemberHistory = ParameterBusinessShareHistoryInput.IsChecked ?? false;
p.ModeMemberDataSheetShares = ModeMemberDataSheetShares.IsChecked == true ? 1 : 0;
p.TextDeliveryNote = string.IsNullOrWhiteSpace(TextElementDeliveryNote.Text) ? null : TextElementDeliveryNote.Text; p.TextDeliveryNote = string.IsNullOrWhiteSpace(TextElementDeliveryNote.Text) ? null : TextElementDeliveryNote.Text;
p.ModeDeliveryNoteStats = (ModeDeliveryNoteNone.IsChecked == true) ? 0 : (ModeDeliveryNoteGaOnly.IsChecked == true) ? 1 : (ModeDeliveryNoteShort.IsChecked == true) ? 2 : (ModeDeliveryNoteFull.IsChecked == true) ? 3 : 2; p.ModeDeliveryNoteStats = (ModeDeliveryNoteNone.IsChecked == true) ? 0 : (ModeDeliveryNoteGaOnly.IsChecked == true) ? 1 : (ModeDeliveryNoteShort.IsChecked == true) ? 2 : (ModeDeliveryNoteFull.IsChecked == true) ? 3 : 2;
p.TextDeliveryConfirmation = string.IsNullOrWhiteSpace(TextElementDeliveryConfirmation.Text) ? null : TextElementDeliveryConfirmation.Text; p.TextDeliveryConfirmation = string.IsNullOrWhiteSpace(TextElementDeliveryConfirmation.Text) ? null : TextElementDeliveryConfirmation.Text;
@@ -408,7 +406,7 @@ namespace Elwig.Windows {
s.Billing_AllowAttrsIntoLower = ParameterAllowAttrIntoLowerInput.IsChecked ?? false; s.Billing_AllowAttrsIntoLower = ParameterAllowAttrIntoLowerInput.IsChecked ?? false;
s.Billing_AvoidUnderDeliveries = ParameterAvoidUnderDeliveriesInput.IsChecked ?? false; s.Billing_AvoidUnderDeliveries = ParameterAvoidUnderDeliveriesInput.IsChecked ?? false;
s.Billing_HonorContracted = ParameterHonorContractedInput.IsChecked ?? false; s.Billing_HonorGebunden = ParameterHonorGebundenInput.IsChecked ?? false;
ctx.Update(s); ctx.Update(s);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
} catch { } } catch { }
+7 -7
View File
@@ -138,9 +138,9 @@
<Label Content="Oechsle:" Margin="10,10,0,0" Grid.Column="0"/> <Label Content="Oechsle:" Margin="10,10,0,0" Grid.Column="0"/>
<ctrl:UnitTextBox x:Name="OechsleInput" Unit="°Oe" TextChanged="OechsleInput_TextChanged" IsEnabled="False" <ctrl:UnitTextBox x:Name="OechsleInput" Unit="°Oe" TextChanged="OechsleInput_TextChanged" IsEnabled="False"
Grid.Column="1" Width="52" Margin="0,10,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/> Grid.Column="1" Width="52" Margin="0,10,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<CheckBox x:Name="ContractedInput" Content="Geb." IsEnabled="False" <CheckBox x:Name="GebInput" Content="Geb." IsEnabled="False"
Grid.Column="1" Margin="0,15,10,0" HorizontalAlignment="Right" VerticalAlignment="Top" Grid.Column="1" Margin="0,15,10,0" HorizontalAlignment="Right" VerticalAlignment="Top"
Checked="ContractedInput_Changed" Unchecked="ContractedInput_Changed"/> Checked="GebInput_Changed" Unchecked="GebInput_Changed"/>
<Label Content="Preis:" Margin="10,40,0,0" Grid.Column="0"/> <Label Content="Preis:" Margin="10,40,0,0" Grid.Column="0"/>
<ctrl:UnitTextBox x:Name="PriceInput" Unit="€/kg" TextChanged="PriceInput_TextChanged" IsEnabled="False" <ctrl:UnitTextBox x:Name="PriceInput" Unit="€/kg" TextChanged="PriceInput_TextChanged" IsEnabled="False"
@@ -148,16 +148,16 @@
</Grid> </Grid>
</GroupBox> </GroupBox>
<GroupBox Header="Gebunden-Aufschlag" Grid.Row="1" Margin="0,5,5,5"> <GroupBox Header="Gebunden Aufschlag" Grid.Row="1" Margin="0,5,5,5">
<Grid> <Grid>
<StackPanel Margin="10,10,0,0"> <StackPanel Margin="10,10,0,0">
<RadioButton x:Name="ContractedTypeFixed" GroupName="ContractedType" Checked="ContractedType_Checked" IsEnabled="False">Fix</RadioButton> <RadioButton x:Name="GebundenTypeFixed" GroupName="GebundenType" Checked="GebundenType_Checked" IsEnabled="False">Fix</RadioButton>
<RadioButton x:Name="ContractedTypeGraph" GroupName="ContractedType" Checked="ContractedType_Checked" IsEnabled="False">Frei</RadioButton> <RadioButton x:Name="GebundenTypeGraph" GroupName="GebundenType" Checked="GebundenType_Checked" IsEnabled="False">Frei</RadioButton>
<RadioButton x:Name="ContractedTypeNone" GroupName="ContractedType" Checked="ContractedType_Checked" IsEnabled="False">Nein</RadioButton> <RadioButton x:Name="GebundenTypeNone" GroupName="GebundenType" Checked="GebundenType_Checked" IsEnabled="False">Nein</RadioButton>
</StackPanel> </StackPanel>
<ctrl:UnitTextBox x:Name="ContractedFlatBonus" Unit="€/kg" TextChanged="ContractedFlatBonus_TextChanged" IsEnabled="False" <ctrl:UnitTextBox x:Name="GebundenFlatBonus" Unit="€/kg" TextChanged="GebundenFlatBonus_TextChanged" IsEnabled="False"
Width="90" Margin="5,5,5,5" HorizontalAlignment="Right" VerticalAlignment="Top" Grid.Column="1"/> Width="90" Margin="5,5,5,5" HorizontalAlignment="Right" VerticalAlignment="Top" Grid.Column="1"/>
</Grid> </Grid>
</GroupBox> </GroupBox>
+91 -91
View File
@@ -15,8 +15,8 @@ using Elwig.Services;
namespace Elwig.Windows { namespace Elwig.Windows {
public partial class ChartWindow : ContextWindow { public partial class ChartWindow : ContextWindow {
public static readonly Color ColorUnContracted = Colors.Blue; public static readonly Color ColorUngebunden = Colors.Blue;
public static readonly Color ColorContracted = Colors.Gold; public static readonly Color ColorGebunden = Colors.Gold;
public readonly int Year; public readonly int Year;
public readonly int AvNr; public readonly int AvNr;
@@ -27,20 +27,20 @@ namespace Elwig.Windows {
private bool Updating = false; private bool Updating = false;
private Scatter? DataPlot; private Scatter? DataPlot;
private Scatter? ContractedPlot; private Scatter? GebundenPlot;
private Marker? HighlightedPointPlot; private Marker? HighlightedPointPlot;
private Marker? PrimaryMarkedPointPlot; private Marker? PrimaryMarkedPointPlot;
private Marker? SecondaryMarkedPointPlot; private Marker? SecondaryMarkedPointPlot;
private Text? TooltipPlot; private Text? TooltipPlot;
private static readonly LegendItem private static readonly LegendItem
UnContractedLegend = new() { UngebundenLegend = new() {
LabelText = "Ungebunden", LineWidth = 1, LineColor = ColorUnContracted, LabelText = "Ungebunden", LineWidth = 1, LineColor = ColorUngebunden,
MarkerStyle = new(MarkerShape.FilledCircle, 5, ColorUnContracted) MarkerStyle = new(MarkerShape.FilledCircle, 5, ColorUngebunden)
}, },
ContractedLegend = new() { GebundenLegend = new() {
LabelText = "Gebunden", LineWidth = 1, LineColor = ColorContracted, LabelText = "Gebunden", LineWidth = 1, LineColor = ColorGebunden,
MarkerStyle = new(MarkerShape.FilledCircle, 5, ColorContracted) MarkerStyle = new(MarkerShape.FilledCircle, 5, ColorGebunden)
}, },
LdwLegend = new() { LdwLegend = new() {
LabelText = "68 °Oe (LDW)", LineWidth = 2, LineColor = Colors.Red, MarkerStyle = MarkerStyle.None LabelText = "68 °Oe (LDW)", LineWidth = 2, LineColor = Colors.Red, MarkerStyle = MarkerStyle.None
@@ -75,7 +75,7 @@ namespace Elwig.Windows {
Season = ctx.Seasons.Find(year) ?? throw new ArgumentException("Season not found"); Season = ctx.Seasons.Find(year) ?? throw new ArgumentException("Season not found");
CurrencySymbol = Season.Currency.Symbol ?? Season.Currency.Code; CurrencySymbol = Season.Currency.Symbol ?? Season.Currency.Code;
PriceInput.Unit = $"{CurrencySymbol}/kg"; PriceInput.Unit = $"{CurrencySymbol}/kg";
ContractedFlatBonus.Unit = $"{CurrencySymbol}/kg"; GebundenFlatBonus.Unit = $"{CurrencySymbol}/kg";
PaymentVar = ctx.PaymentVariants.Find(year, avnr) ?? throw new ArgumentException("PaymentVar not found"); PaymentVar = ctx.PaymentVariants.Find(year, avnr) ?? throw new ArgumentException("PaymentVar not found");
Title = $"{PaymentVar.Name} - Lese {year} - Elwig"; Title = $"{PaymentVar.Name} - Lese {year} - Elwig";
LockContext = true; LockContext = true;
@@ -100,7 +100,7 @@ namespace Elwig.Windows {
Season = await ctx.FetchSeasons(Year).SingleOrDefaultAsync() ?? throw new ArgumentException("Season not found"); Season = await ctx.FetchSeasons(Year).SingleOrDefaultAsync() ?? throw new ArgumentException("Season not found");
CurrencySymbol = Season.Currency.Symbol ?? Season.Currency.Code; CurrencySymbol = Season.Currency.Symbol ?? Season.Currency.Code;
PriceInput.Unit = $"{CurrencySymbol}/kg"; PriceInput.Unit = $"{CurrencySymbol}/kg";
ContractedFlatBonus.Unit = $"{CurrencySymbol}/kg"; GebundenFlatBonus.Unit = $"{CurrencySymbol}/kg";
try { try {
var data = EditBillingData.FromJson(PaymentVar.Data, await Utils.GetVaributes(ctx, Year)); var data = EditBillingData.FromJson(PaymentVar.Data, await Utils.GetVaributes(ctx, Year));
@@ -148,10 +148,10 @@ namespace Elwig.Windows {
CopyButton.IsEnabled = true; CopyButton.IsEnabled = true;
DeleteButton.IsEnabled = true; DeleteButton.IsEnabled = true;
EnableTextBox(OechsleInput); EnableTextBox(OechsleInput);
ContractedInput.IsEnabled = SelectedGraphEntry?.ContractedGraph != null; GebInput.IsEnabled = SelectedGraphEntry?.GebundenGraph != null;
ContractedTypeFixed.IsEnabled = true; GebundenTypeFixed.IsEnabled = true;
ContractedTypeGraph.IsEnabled = true; GebundenTypeGraph.IsEnabled = true;
ContractedTypeNone.IsEnabled = true; GebundenTypeNone.IsEnabled = true;
VaributeInput.IsEnabled = true; VaributeInput.IsEnabled = true;
AbgewertetInput.IsEnabled = true; AbgewertetInput.IsEnabled = true;
EnableOptionButtons(); EnableOptionButtons();
@@ -160,7 +160,7 @@ namespace Elwig.Windows {
CopyButton.IsEnabled = false; CopyButton.IsEnabled = false;
DeleteButton.IsEnabled = false; DeleteButton.IsEnabled = false;
DisableTextBox(OechsleInput); DisableTextBox(OechsleInput);
ContractedInput.IsEnabled = false; GebInput.IsEnabled = false;
DisableOptionButtons(); DisableOptionButtons();
} }
if (!PaymentVar.TestVariant) { if (!PaymentVar.TestVariant) {
@@ -168,9 +168,9 @@ namespace Elwig.Windows {
CopyButton.IsEnabled = false; CopyButton.IsEnabled = false;
DeleteButton.IsEnabled = false; DeleteButton.IsEnabled = false;
DisableTextBox(PriceInput); DisableTextBox(PriceInput);
ContractedTypeFixed.IsEnabled = false; GebundenTypeFixed.IsEnabled = false;
ContractedTypeGraph.IsEnabled = false; GebundenTypeGraph.IsEnabled = false;
ContractedTypeNone.IsEnabled = false; GebundenTypeNone.IsEnabled = false;
VaributeInput.IsEnabled = false; VaributeInput.IsEnabled = false;
AbgewertetInput.IsEnabled = false; AbgewertetInput.IsEnabled = false;
} }
@@ -181,15 +181,15 @@ namespace Elwig.Windows {
FillingInputs = true; FillingInputs = true;
AbgewertetInput.IsChecked = SelectedGraphEntry?.Abgewertet; AbgewertetInput.IsChecked = SelectedGraphEntry?.Abgewertet;
if (SelectedGraphEntry?.ContractedFlatBonus is double bonus) { if (SelectedGraphEntry?.GebundenFlatBonus is double bonus) {
ContractedTypeFixed.IsChecked = true; GebundenTypeFixed.IsChecked = true;
ContractedFlatBonus.Text = $"{bonus}"; GebundenFlatBonus.Text = $"{bonus}";
} else if (SelectedGraphEntry?.ContractedGraph != null) { } else if (SelectedGraphEntry?.GebundenGraph != null) {
ContractedTypeGraph.IsChecked = true; GebundenTypeGraph.IsChecked = true;
ContractedFlatBonus.Text = ""; GebundenFlatBonus.Text = "";
} else { } else {
ContractedTypeNone.IsChecked = true; GebundenTypeNone.IsChecked = true;
ContractedFlatBonus.Text = ""; GebundenFlatBonus.Text = "";
} }
ControlUtils.SelectItems(VaributeInput, SelectedGraphEntry?.Vaributes ?? []); ControlUtils.SelectItems(VaributeInput, SelectedGraphEntry?.Vaributes ?? []);
@@ -208,21 +208,21 @@ namespace Elwig.Windows {
private void InitPlot() { private void InitPlot() {
RefreshGradationLines(); RefreshGradationLines();
if (SelectedGraphEntry?.ContractedGraph != null) { if (SelectedGraphEntry?.GebundenGraph != null) {
ContractedPlot = OechslePricePlot.Plot.Add.Scatter(SelectedGraphEntry.ContractedGraph.DataX, SelectedGraphEntry.ContractedGraph.DataY); GebundenPlot = OechslePricePlot.Plot.Add.Scatter(SelectedGraphEntry.GebundenGraph.DataX, SelectedGraphEntry.GebundenGraph.DataY);
ContractedPlot.LineStyle.Color = ColorContracted; GebundenPlot.LineStyle.Color = ColorGebunden;
ContractedPlot.Color = ColorContracted; GebundenPlot.Color = ColorGebunden;
ContractedPlot.MarkerStyle = new MarkerStyle(MarkerShape.FilledCircle, 9, ColorContracted); GebundenPlot.MarkerStyle = new MarkerStyle(MarkerShape.FilledCircle, 9, ColorGebunden);
} }
if (SelectedGraphEntry != null) { if (SelectedGraphEntry != null) {
DataPlot = OechslePricePlot.Plot.Add.Scatter(SelectedGraphEntry.DataGraph.DataX, SelectedGraphEntry.DataGraph.DataY); DataPlot = OechslePricePlot.Plot.Add.Scatter(SelectedGraphEntry.DataGraph.DataX, SelectedGraphEntry.DataGraph.DataY);
DataPlot.LineStyle.Color = ColorUnContracted; DataPlot.LineStyle.Color = ColorUngebunden;
DataPlot.Color = ColorUnContracted; DataPlot.Color = ColorUngebunden;
DataPlot.MarkerStyle = new MarkerStyle(MarkerShape.FilledCircle, 9, ColorUnContracted); DataPlot.MarkerStyle = new MarkerStyle(MarkerShape.FilledCircle, 9, ColorUngebunden);
} }
OechslePricePlot.Plot.Axes.SetLimits(Math.Min(GraphEntry.MinX, GraphEntry.MinXCtrd) - 1, GraphEntry.MaxX + 1, -0.1, 1.5); OechslePricePlot.Plot.Axes.SetLimits(Math.Min(GraphEntry.MinX, GraphEntry.MinXGeb) - 1, GraphEntry.MaxX + 1, -0.1, 1.5);
HighlightedPointPlot = OechslePricePlot.Plot.Add.Marker(0, 0, MarkerShape.OpenCircle, 10, Colors.Red); HighlightedPointPlot = OechslePricePlot.Plot.Add.Marker(0, 0, MarkerShape.OpenCircle, 10, Colors.Red);
HighlightedPointPlot.IsVisible = false; HighlightedPointPlot.IsVisible = false;
@@ -250,9 +250,9 @@ namespace Elwig.Windows {
OechslePricePlot.Plot.Remove(DataPlot); OechslePricePlot.Plot.Remove(DataPlot);
DataPlot = null; DataPlot = null;
} }
if (ContractedPlot != null) { if (GebundenPlot != null) {
OechslePricePlot.Plot.Remove(ContractedPlot); OechslePricePlot.Plot.Remove(GebundenPlot);
ContractedPlot = null; GebundenPlot = null;
} }
OechslePricePlot.Plot.Clear(); OechslePricePlot.Plot.Clear();
OechslePricePlot.Reset(); OechslePricePlot.Reset();
@@ -365,8 +365,8 @@ namespace Elwig.Windows {
OechslePricePlot.Plot.Legend.ManualItems.Add(LdwLegend); OechslePricePlot.Plot.Legend.ManualItems.Add(LdwLegend);
OechslePricePlot.Plot.Legend.ManualItems.Add(QuwLegend); OechslePricePlot.Plot.Legend.ManualItems.Add(QuwLegend);
OechslePricePlot.Plot.Legend.ManualItems.Add(KabLegend); OechslePricePlot.Plot.Legend.ManualItems.Add(KabLegend);
OechslePricePlot.Plot.Legend.ManualItems.Add(UnContractedLegend); OechslePricePlot.Plot.Legend.ManualItems.Add(UngebundenLegend);
if (SelectedGraphEntry?.ContractedGraph != null) OechslePricePlot.Plot.Legend.ManualItems.Add(ContractedLegend); if (SelectedGraphEntry?.GebundenGraph != null) OechslePricePlot.Plot.Legend.ManualItems.Add(GebundenLegend);
} }
private void HideLegend() { private void HideLegend() {
@@ -408,10 +408,10 @@ namespace Elwig.Windows {
UpdateSelectedPoint(); UpdateSelectedPoint();
} }
private void ContractedInput_Changed(object sender, RoutedEventArgs evt) { private void GebInput_Changed(object sender, RoutedEventArgs evt) {
if (Updating) if (Updating)
return; return;
var sel = ContractedInput.IsChecked == true ? SelectedGraphEntry?.ContractedGraph : SelectedGraphEntry?.DataGraph; var sel = GebInput.IsChecked == true ? SelectedGraphEntry?.GebundenGraph : SelectedGraphEntry?.DataGraph;
if (sel != ActiveGraph) ChangeActiveGraph(sel); if (sel != ActiveGraph) ChangeActiveGraph(sel);
UpdateSelectedPoint(); UpdateSelectedPoint();
} }
@@ -424,7 +424,7 @@ namespace Elwig.Windows {
PrimaryMarkedPointPlot?.Location = new Coordinates(PrimaryMarkedPointPlot.Location.X, price); PrimaryMarkedPointPlot?.Location = new Coordinates(PrimaryMarkedPointPlot.Location.X, price);
SetHasChanged(); SetHasChanged();
OechslePricePlot.Refresh(); OechslePricePlot.Refresh();
CheckContractedTypeFixed(); CheckGebundenTypeFixed();
} }
} }
} }
@@ -436,7 +436,7 @@ namespace Elwig.Windows {
ActiveGraph.FlattenGraphLeft(PrimaryMarkedPoint); ActiveGraph.FlattenGraphLeft(PrimaryMarkedPoint);
SetHasChanged(); SetHasChanged();
OechslePricePlot.Refresh(); OechslePricePlot.Refresh();
CheckContractedTypeFixed(); CheckGebundenTypeFixed();
} }
private void RightFlatButton_Click(object sender, RoutedEventArgs evt) { private void RightFlatButton_Click(object sender, RoutedEventArgs evt) {
@@ -446,7 +446,7 @@ namespace Elwig.Windows {
ActiveGraph.FlattenGraphRight(PrimaryMarkedPoint); ActiveGraph.FlattenGraphRight(PrimaryMarkedPoint);
SetHasChanged(); SetHasChanged();
OechslePricePlot.Refresh(); OechslePricePlot.Refresh();
CheckContractedTypeFixed(); CheckGebundenTypeFixed();
} }
private void InterpolateButton_Click(object sender, RoutedEventArgs evt) { private void InterpolateButton_Click(object sender, RoutedEventArgs evt) {
@@ -456,7 +456,7 @@ namespace Elwig.Windows {
ActiveGraph.InterpolateGraph(PrimaryMarkedPoint, SecondaryMarkedPoint); ActiveGraph.InterpolateGraph(PrimaryMarkedPoint, SecondaryMarkedPoint);
SetHasChanged(); SetHasChanged();
OechslePricePlot.Refresh(); OechslePricePlot.Refresh();
CheckContractedTypeFixed(); CheckGebundenTypeFixed();
} }
private void LinearIncreaseButton_Click(object sender, RoutedEventArgs e) { private void LinearIncreaseButton_Click(object sender, RoutedEventArgs e) {
@@ -470,7 +470,7 @@ namespace Elwig.Windows {
ActiveGraph.LinearIncreaseGraphToEnd(PrimaryMarkedPoint, priceIncrease.Value); ActiveGraph.LinearIncreaseGraphToEnd(PrimaryMarkedPoint, priceIncrease.Value);
SetHasChanged(); SetHasChanged();
OechslePricePlot.Refresh(); OechslePricePlot.Refresh();
CheckContractedTypeFixed(); CheckGebundenTypeFixed();
} }
private void OechslePricePlot_MouseDown(object sender, MouseEventArgs e) { private void OechslePricePlot_MouseDown(object sender, MouseEventArgs e) {
@@ -500,7 +500,7 @@ namespace Elwig.Windows {
if (Highlighted.Graph != null) { if (Highlighted.Graph != null) {
Updating = true; Updating = true;
OechsleInput.Text = Highlighted.Graph.GetOechsleAt(Highlighted.Index).ToString(); OechsleInput.Text = Highlighted.Graph.GetOechsleAt(Highlighted.Index).ToString();
ContractedInput.IsChecked = Highlighted.Graph == SelectedGraphEntry?.ContractedGraph; GebInput.IsChecked = Highlighted.Graph == SelectedGraphEntry?.GebundenGraph;
PriceInput.Text = Math.Round(Highlighted.Graph.GetPriceAt(Highlighted.Index), Season.Precision).ToString(); PriceInput.Text = Math.Round(Highlighted.Graph.GetPriceAt(Highlighted.Index), Season.Precision).ToString();
Updating = false; Updating = false;
} }
@@ -509,14 +509,14 @@ namespace Elwig.Windows {
} else { } else {
PrimaryMarkedPoint = -1; PrimaryMarkedPoint = -1;
SecondaryMarkedPoint = -1; SecondaryMarkedPoint = -1;
if (SelectedGraphEntry?.ContractedGraph != null) { if (SelectedGraphEntry?.GebundenGraph != null) {
ChangeActiveGraph(null); ChangeActiveGraph(null);
} }
ChangeMarker(PrimaryMarkedPointPlot, false); ChangeMarker(PrimaryMarkedPointPlot, false);
ChangeMarker(SecondaryMarkedPointPlot, false); ChangeMarker(SecondaryMarkedPointPlot, false);
OechsleInput.Text = ""; OechsleInput.Text = "";
ContractedInput.IsChecked = false; GebInput.IsChecked = false;
PriceInput.Text = ""; PriceInput.Text = "";
DisableTextBox(PriceInput); DisableTextBox(PriceInput);
@@ -549,7 +549,7 @@ namespace Elwig.Windows {
} }
var mouseOnData = MouseOnPlot(DataPlot, GetMouseCoordinates(e.GetPosition(OechslePricePlot))); var mouseOnData = MouseOnPlot(DataPlot, GetMouseCoordinates(e.GetPosition(OechslePricePlot)));
var mouseOnContracted = MouseOnPlot(ContractedPlot, GetMouseCoordinates(e.GetPosition(OechslePricePlot))); var mouseOnGebunden = MouseOnPlot(GebundenPlot, GetMouseCoordinates(e.GetPosition(OechslePricePlot)));
Highlighted = LastHighlighted; Highlighted = LastHighlighted;
@@ -560,13 +560,13 @@ namespace Elwig.Windows {
HoverActive = true; HoverActive = true;
if (SelectedGraphEntry?.DataGraph is Graph g) if (SelectedGraphEntry?.DataGraph is Graph g)
HandleTooltip(mouseOnData.Value.X, mouseOnData.Value.Y, mouseOnData.Value.Index, g, e.GetPosition(OechslePricePlot), e is MouseWheelEventArgs); HandleTooltip(mouseOnData.Value.X, mouseOnData.Value.Y, mouseOnData.Value.Index, g, e.GetPosition(OechslePricePlot), e is MouseWheelEventArgs);
} else if (mouseOnContracted != null) { } else if (mouseOnGebunden != null) {
ChangeMarker(HighlightedPointPlot, true, mouseOnContracted.Value.X, mouseOnContracted.Value.Y); ChangeMarker(HighlightedPointPlot, true, mouseOnGebunden.Value.X, mouseOnGebunden.Value.Y);
HighlightedPointPlot?.IsVisible = true; HighlightedPointPlot?.IsVisible = true;
HoverChanged = true ^ HoverActive; HoverChanged = true ^ HoverActive;
HoverActive = true; HoverActive = true;
if (SelectedGraphEntry?.ContractedGraph is Graph g) if (SelectedGraphEntry?.GebundenGraph is Graph g)
HandleTooltip(mouseOnContracted.Value.X, mouseOnContracted.Value.Y, mouseOnContracted.Value.Index, g, e.GetPosition(OechslePricePlot), e is MouseWheelEventArgs); HandleTooltip(mouseOnGebunden.Value.X, mouseOnGebunden.Value.Y, mouseOnGebunden.Value.Index, g, e.GetPosition(OechslePricePlot), e is MouseWheelEventArgs);
} else { } else {
ChangeMarker(HighlightedPointPlot, false); ChangeMarker(HighlightedPointPlot, false);
HoverChanged = false ^ HoverActive; HoverChanged = false ^ HoverActive;
@@ -699,25 +699,25 @@ namespace Elwig.Windows {
private void ChangeActiveGraph(Graph? g) { private void ChangeActiveGraph(Graph? g) {
if (g != null && g == SelectedGraphEntry?.DataGraph) { if (g != null && g == SelectedGraphEntry?.DataGraph) {
EnableTextBox(OechsleInput); EnableTextBox(OechsleInput);
if (SelectedGraphEntry?.ContractedGraph != null) ChangeLineWidth(DataPlot, 4); if (SelectedGraphEntry?.GebundenGraph != null) ChangeLineWidth(DataPlot, 4);
ChangeLineWidth(ContractedPlot, 1); ChangeLineWidth(GebundenPlot, 1);
ContractedInput.IsEnabled = SelectedGraphEntry?.ContractedGraph != null; GebInput.IsEnabled = SelectedGraphEntry?.GebundenGraph != null;
ContractedInput.IsChecked = false; GebInput.IsChecked = false;
} else if (g != null && g == SelectedGraphEntry?.ContractedGraph) { } else if (g != null && g == SelectedGraphEntry?.GebundenGraph) {
EnableTextBox(OechsleInput); EnableTextBox(OechsleInput);
ChangeLineWidth(ContractedPlot, 4); ChangeLineWidth(GebundenPlot, 4);
ChangeLineWidth(DataPlot, 1); ChangeLineWidth(DataPlot, 1);
ContractedInput.IsEnabled = SelectedGraphEntry?.ContractedGraph != null; GebInput.IsEnabled = SelectedGraphEntry?.GebundenGraph != null;
ContractedInput.IsChecked = true; GebInput.IsChecked = true;
} else { } else {
DisableTextBox(OechsleInput); DisableTextBox(OechsleInput);
DisableTextBox(PriceInput); DisableTextBox(PriceInput);
OechsleInput.Text = ""; OechsleInput.Text = "";
ContractedInput.IsEnabled = false; GebInput.IsEnabled = false;
ContractedInput.IsChecked = false; GebInput.IsChecked = false;
PriceInput.Text = ""; PriceInput.Text = "";
ChangeLineWidth(DataPlot, 1); ChangeLineWidth(DataPlot, 1);
ChangeLineWidth(ContractedPlot, 1); ChangeLineWidth(GebundenPlot, 1);
} }
ActiveGraph = g; ActiveGraph = g;
} }
@@ -730,11 +730,11 @@ namespace Elwig.Windows {
RefreshInputs(); RefreshInputs();
} }
private void ContractedFlatBonus_TextChanged(object sender, TextChangedEventArgs e) { private void GebundenFlatBonus_TextChanged(object sender, TextChangedEventArgs e) {
if (FillingInputs) return; if (FillingInputs) return;
var r = Validator.CheckDecimal(ContractedFlatBonus, true, 2, Season.Precision); var r = Validator.CheckDecimal(GebundenFlatBonus, true, 2, Season.Precision);
if (r.IsValid && SelectedGraphEntry != null) { if (r.IsValid && SelectedGraphEntry != null) {
SelectedGraphEntry.ContractedFlatBonus = double.Parse(ContractedFlatBonus.Text); SelectedGraphEntry.GebundenFlatBonus = double.Parse(GebundenFlatBonus.Text);
ResetPlot(); ResetPlot();
InitPlot(); InitPlot();
} }
@@ -795,37 +795,37 @@ namespace Elwig.Windows {
GraphList.Items.Refresh(); GraphList.Items.Refresh();
} }
private void ContractedType_Checked(object sender, RoutedEventArgs e) { private void GebundenType_Checked(object sender, RoutedEventArgs e) {
if (FillingInputs) return; if (FillingInputs) return;
if (SelectedGraphEntry == null) { if (SelectedGraphEntry == null) {
DisableTextBox(ContractedFlatBonus); DisableTextBox(GebundenFlatBonus);
return; return;
} }
if (ContractedTypeNone.IsChecked == true) { if (GebundenTypeNone.IsChecked == true) {
SelectedGraphEntry.RemoveContractedGraph(); SelectedGraphEntry.RemoveGebundenGraph();
DisableTextBox(ContractedFlatBonus); DisableTextBox(GebundenFlatBonus);
} else if (ContractedTypeFixed.IsChecked == true) { } else if (GebundenTypeFixed.IsChecked == true) {
SelectedGraphEntry.ContractedFlatBonus = double.TryParse(ContractedFlatBonus.Text, out var val) ? val : 0.1; SelectedGraphEntry.GebundenFlatBonus = double.TryParse(GebundenFlatBonus.Text, out var val) ? val : 0.1;
SelectedGraphEntry.AddContractedGraph(); SelectedGraphEntry.AddGebundenGraph();
EnableTextBox(ContractedFlatBonus); EnableTextBox(GebundenFlatBonus);
} else if (ContractedTypeGraph.IsChecked == true) { } else if (GebundenTypeGraph.IsChecked == true) {
SelectedGraphEntry.AddContractedGraph(); SelectedGraphEntry.AddGebundenGraph();
DisableTextBox(ContractedFlatBonus); DisableTextBox(GebundenFlatBonus);
} }
SetHasChanged(); SetHasChanged();
RefreshInputs(); RefreshInputs();
} }
private void CheckContractedTypeFixed() { private void CheckGebundenTypeFixed() {
FillingInputs = true; FillingInputs = true;
if (SelectedGraphEntry?.ContractedFlatBonus is double bonus) { if (SelectedGraphEntry?.GebundenFlatBonus is double bonus) {
ContractedTypeFixed.IsChecked = true; GebundenTypeFixed.IsChecked = true;
ContractedFlatBonus.Text = $"{bonus}"; GebundenFlatBonus.Text = $"{bonus}";
EnableTextBox(ContractedFlatBonus); EnableTextBox(GebundenFlatBonus);
} else if (SelectedGraphEntry?.ContractedGraph != null) { } else if (SelectedGraphEntry?.GebundenGraph != null) {
ContractedTypeGraph.IsChecked = true; GebundenTypeGraph.IsChecked = true;
ContractedFlatBonus.Text = ""; GebundenFlatBonus.Text = "";
DisableTextBox(ContractedFlatBonus); DisableTextBox(GebundenFlatBonus);
} }
FillingInputs = false; FillingInputs = false;
} }
+1 -1
View File
@@ -682,7 +682,7 @@
Margin="0,70,10,10" Grid.Column="1" Margin="0,70,10,10" Grid.Column="1"
DisplayMemberPath="Name"/> DisplayMemberPath="Name"/>
<CheckBox x:Name="ContractedInput" IsChecked="{Binding IsContracted, Mode=TwoWay}" <CheckBox x:Name="GebundenInput" IsChecked="{Binding IsGebunden, Mode=TwoWay}"
Content="Gebunden" Margin="10,105,0,0" Grid.Column="0" Grid.ColumnSpan="2" IsThreeState="True" Content="Gebunden" Margin="10,105,0,0" Grid.Column="0" Grid.ColumnSpan="2" IsThreeState="True"
VerticalAlignment="Top" HorizontalAlignment="Left" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed" Indeterminate="CheckBox_Changed"/> Checked="CheckBox_Changed" Unchecked="CheckBox_Changed" Indeterminate="CheckBox_Changed"/>
+7 -7
View File
@@ -356,11 +356,11 @@ namespace Elwig.Windows {
} }
if (App.Client.IsMatzen || App.Client.IsWinzerkeller || App.Client.IsBaden || App.Client.IsWeinland) { if (App.Client.IsMatzen || App.Client.IsWinzerkeller || App.Client.IsBaden || App.Client.IsWeinland) {
ContractedInput.IsEnabled = false; GebundenInput.IsEnabled = false;
SetDefaultValue(ContractedInput, null); SetDefaultValue(GebundenInput, null);
} else { } else {
ContractedInput.IsEnabled = true; GebundenInput.IsEnabled = true;
UnsetDefaultValue(ContractedInput); UnsetDefaultValue(GebundenInput);
} }
} }
@@ -376,7 +376,7 @@ namespace Elwig.Windows {
ViewModel.IsNetWeight = App.Config.WeighingMode == WeighingMode.Net; ViewModel.IsNetWeight = App.Config.WeighingMode == WeighingMode.Net;
ViewModel.IsHandPicked = App.Config.WeighingMode != WeighingMode.Net ? true : null; ViewModel.IsHandPicked = App.Config.WeighingMode != WeighingMode.Net ? true : null;
ViewModel.Unloading = null; ViewModel.Unloading = null;
ViewModel.IsContracted = null; ViewModel.IsGebunden = null;
InitialDefaultInputs(); InitialDefaultInputs();
//WineQualityLevelInput.IsEnabled = false; // disable wine quality level input in Übernahme //WineQualityLevelInput.IsEnabled = false; // disable wine quality level input in Übernahme
@@ -629,7 +629,7 @@ namespace Elwig.Windows {
var correction = Utils.ShowTareCorrectionDialog(ViewModel.ActualTare, ViewModel.TargetTare); var correction = Utils.ShowTareCorrectionDialog(ViewModel.ActualTare, ViewModel.TargetTare);
if (correction == null) return; if (correction == null) return;
ViewModel.Weight += lastCorrection - correction; ViewModel.Weight += lastCorrection - correction;
if (ViewModel.Weight != null && ViewModel.WeighingData is string s) { if (ViewModel.WeighingData is string s) {
ViewModel.TargetTare = correction == 0 ? null : (ViewModel.ActualTare ?? 0) + correction; ViewModel.TargetTare = correction == 0 ? null : (ViewModel.ActualTare ?? 0) + correction;
ViewModel.Tare = ViewModel.TargetTare ?? ViewModel.ActualTare; ViewModel.Tare = ViewModel.TargetTare ?? ViewModel.ActualTare;
var obj = JsonNode.Parse(s)!.AsObject(); var obj = JsonNode.Parse(s)!.AsObject();
@@ -1514,7 +1514,7 @@ namespace Elwig.Windows {
} }
private void WeightInput_TextChanged(object sender, TextChangedEventArgs evt) { private void WeightInput_TextChanged(object sender, TextChangedEventArgs evt) {
InputTextChanged((TextBox)sender, new ValidationResult(ViewModel.Weight > 0, null)); InputTextChanged((TextBox)sender);
} }
private void TemperatureAcidInput_TextChanged(object sender, TextChangedEventArgs evt) { private void TemperatureAcidInput_TextChanged(object sender, TextChangedEventArgs evt) {
+7 -7
View File
@@ -126,7 +126,7 @@
<RadioButton GroupName="Recipients" x:Name="RecipientsActiveMembersInput" Content="aktive Mitglieder" <RadioButton GroupName="Recipients" x:Name="RecipientsActiveMembersInput" Content="aktive Mitglieder"
Margin="10,10,10,10" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,10,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/> Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/>
<RadioButton GroupName="Recipients" x:Name="RecipientsAreaCmtMembersInput" Content="Mitglieder mit Flächenbindung" <RadioButton GroupName="Recipients" x:Name="RecipientsAreaComMembersInput" Content="Mitglieder mit Flächenbindung"
Margin="10,30,10,10" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,30,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/> Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/>
<RadioButton GroupName="Recipients" x:Name="RecipientsDeliveryAncmtMembersInput" Content="Mitglieder mit Anmeldung" <RadioButton GroupName="Recipients" x:Name="RecipientsDeliveryAncmtMembersInput" Content="Mitglieder mit Anmeldung"
@@ -167,19 +167,19 @@
Margin="180,225,10,10" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="180,225,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="MemberInput_Checked"/> Checked="MemberInput_Checked"/>
<Label Content="Funktionär:" x:Name="MemberOfficerLabel" Margin="10,250,0,10"/> <Label Content="Funktionär:" x:Name="MemberFunktionärLabel" Margin="10,250,0,10"/>
<RadioButton x:Name="MemberOfficerYesInput" Content="Ja" GroupName="MemberOfficer" <RadioButton x:Name="MemberFunktionärYesInput" Content="Ja" GroupName="MemberFunktionär"
Margin="80,255,10,10" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="80,255,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="MemberInput_Checked"/> Checked="MemberInput_Checked"/>
<RadioButton x:Name="MemberOfficerNoInput" Content="Nein" GroupName="MemberOfficer" <RadioButton x:Name="MemberFunktionärNoInput" Content="Nein" GroupName="MemberFunktionär"
Margin="125,255,10,10" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="125,255,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="MemberInput_Checked"/> Checked="MemberInput_Checked"/>
<RadioButton x:Name="MemberOfficerIndifferentInput" Content="Egal" GroupName="MemberOfficer" <RadioButton x:Name="MemberFunktionärIndifferentInput" Content="Egal" GroupName="MemberFunktionär"
Margin="180,255,10,10" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="180,255,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="MemberInput_Checked"/> Checked="MemberInput_Checked"/>
<Label Content="Vtrg.:" x:Name="MemberAreaCmtLabel" Margin="10,280,0,10"/> <Label Content="Vtrg.:" x:Name="MemberAreaComLabel" Margin="10,280,0,10"/>
<ctrl:CheckComboBox x:Name="MemberAreaCmtInput" AllItemsSelectedContent="Alle Vertragsarten" Delimiter=", " DisplayMemberPath="VtrgId" <ctrl:CheckComboBox x:Name="MemberAreaComInput" AllItemsSelectedContent="Alle Vertragsarten" Delimiter=", " DisplayMemberPath="VtrgId"
IsSelectAllActive="True" SelectAllContent="Alle Vertragsarten" IsSelectAllActive="True" SelectAllContent="Alle Vertragsarten"
Margin="50,280,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25" Margin="50,280,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
SelectionChanged="MemberInput_SelectionChanged"/> SelectionChanged="MemberInput_SelectionChanged"/>
+18 -18
View File
@@ -122,7 +122,7 @@ namespace Elwig.Windows {
RecipientsActiveMembersInput.IsChecked = true; RecipientsActiveMembersInput.IsChecked = true;
MemberOrganicIndifferentInput.IsChecked = true; MemberOrganicIndifferentInput.IsChecked = true;
MemberOfficerIndifferentInput.IsChecked = true; MemberFunktionärIndifferentInput.IsChecked = true;
DeliveryConfirmationFooterInput.Text = App.Client.TextDeliveryConfirmation; DeliveryConfirmationFooterInput.Text = App.Client.TextDeliveryConfirmation;
CreditNoteFooterInput.Text = App.Client.TextCreditNote; CreditNoteFooterInput.Text = App.Client.TextCreditNote;
@@ -181,13 +181,13 @@ namespace Elwig.Windows {
MemberKgInput.SelectAll(); MemberKgInput.SelectAll();
MemberKgInput.SelectionChanged += MemberInput_SelectionChanged; MemberKgInput.SelectionChanged += MemberInput_SelectionChanged;
} }
ControlUtils.RenewItemsSource(MemberAreaCmtInput, await ctx.AreaCommitmentTypes ControlUtils.RenewItemsSource(MemberAreaComInput, await ctx.AreaCommitmentTypes
.OrderBy(a => a.VtrgId) .OrderBy(a => a.VtrgId)
.ToListAsync(), MemberInput_SelectionChanged); .ToListAsync(), MemberInput_SelectionChanged);
if (MemberAreaCmtInput.SelectedItems.Count == 0) { if (MemberAreaComInput.SelectedItems.Count == 0) {
MemberAreaCmtInput.SelectionChanged -= MemberInput_SelectionChanged; MemberAreaComInput.SelectionChanged -= MemberInput_SelectionChanged;
MemberAreaCmtInput.SelectAll(); MemberAreaComInput.SelectAll();
MemberAreaCmtInput.SelectionChanged += MemberInput_SelectionChanged; MemberAreaComInput.SelectionChanged += MemberInput_SelectionChanged;
} }
ControlUtils.RenewItemsSource(MemberDeliveryAncmtInput, await ctx.DeliverySchedules ControlUtils.RenewItemsSource(MemberDeliveryAncmtInput, await ctx.DeliverySchedules
.Where(s => s.Year == Year) .Where(s => s.Year == Year)
@@ -408,12 +408,12 @@ namespace Elwig.Windows {
MemberOrganicYesInput.Visibility = vis; MemberOrganicYesInput.Visibility = vis;
MemberOrganicNoInput.Visibility = vis; MemberOrganicNoInput.Visibility = vis;
MemberOrganicIndifferentInput.Visibility = vis; MemberOrganicIndifferentInput.Visibility = vis;
MemberOfficerLabel.Visibility = vis; MemberFunktionärLabel.Visibility = vis;
MemberOfficerYesInput.Visibility = vis; MemberFunktionärYesInput.Visibility = vis;
MemberOfficerNoInput.Visibility = vis; MemberFunktionärNoInput.Visibility = vis;
MemberOfficerIndifferentInput.Visibility = vis; MemberFunktionärIndifferentInput.Visibility = vis;
MemberAreaCmtInput.Visibility = RecipientsAreaCmtMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden; MemberAreaComInput.Visibility = RecipientsAreaComMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden;
MemberAreaCmtLabel.Visibility = RecipientsAreaCmtMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden; MemberAreaComLabel.Visibility = RecipientsAreaComMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden;
MemberDeliveryAncmtInput.Visibility = RecipientsDeliveryAncmtMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden; MemberDeliveryAncmtInput.Visibility = RecipientsDeliveryAncmtMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden;
MemberDeliveryAncmtLabel.Visibility = RecipientsDeliveryAncmtMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden; MemberDeliveryAncmtLabel.Visibility = RecipientsDeliveryAncmtMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden;
MemberCustomInput.Visibility = RecipientsCustomInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden; MemberCustomInput.Visibility = RecipientsCustomInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden;
@@ -459,14 +459,14 @@ namespace Elwig.Windows {
} else if (MemberOrganicNoInput.IsChecked == true) { } else if (MemberOrganicNoInput.IsChecked == true) {
query = query.Where(m => !m.IsOrganic); query = query.Where(m => !m.IsOrganic);
} }
if (MemberOfficerYesInput.IsChecked == true) { if (MemberFunktionärYesInput.IsChecked == true) {
query = query.Where(m => m.IsOfficer); query = query.Where(m => m.IsFunktionär);
} else if (MemberOfficerNoInput.IsChecked == true) { } else if (MemberFunktionärNoInput.IsChecked == true) {
query = query.Where(m => !m.IsOfficer); query = query.Where(m => !m.IsFunktionär);
} }
if (RecipientsAreaCmtMembersInput.IsChecked == true) { if (RecipientsAreaComMembersInput.IsChecked == true) {
var vtrg = MemberAreaCmtInput.SelectedItems.Cast<AreaCmtType>().Select(a => a.VtrgId).ToList(); var vtrg = MemberAreaComInput.SelectedItems.Cast<AreaComType>().Select(a => a.VtrgId).ToList();
query = query.Where(m => m.IsActive && m.AreaCommitments.AsQueryable().Where(Utils.ActiveAreaCommitments(Year)).Any(c => vtrg.Contains(c.VtrgId))); query = query.Where(m => m.IsActive && m.AreaCommitments.AsQueryable().Where(Utils.ActiveAreaCommitments(Year)).Any(c => vtrg.Contains(c.VtrgId)));
} else if (RecipientsDeliveryAncmtMembersInput.IsChecked == true) { } else if (RecipientsDeliveryAncmtMembersInput.IsChecked == true) {
var dsnrs = MemberDeliveryAncmtInput.SelectedItems.Cast<DeliverySchedule>().Select(s => s.DsNr).ToList(); var dsnrs = MemberDeliveryAncmtInput.SelectedItems.Cast<DeliverySchedule>().Select(s => s.DsNr).ToList();
+3 -3
View File
@@ -301,12 +301,12 @@
<TextBlock Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2">Ungebunden:</TextBlock> <TextBlock Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2">Ungebunden:</TextBlock>
<TextBlock Grid.Row="1" Grid.Column="1" TextAlignment="Right" x:Name="SeasonStatMembersTotal">-</TextBlock> <TextBlock Grid.Row="1" Grid.Column="1" TextAlignment="Right" x:Name="SeasonStatMembersTotal">-</TextBlock>
<TextBlock Grid.Row="2" Grid.Column="1" TextAlignment="Right" x:Name="SeasonStatMembersCtrd">-</TextBlock> <TextBlock Grid.Row="2" Grid.Column="1" TextAlignment="Right" x:Name="SeasonStatMembersGeb">-</TextBlock>
<TextBlock Grid.Row="3" Grid.Column="1" TextAlignment="Right">-</TextBlock> <TextBlock Grid.Row="3" Grid.Column="1" TextAlignment="Right">-</TextBlock>
<TextBlock Grid.Row="1" Grid.Column="2" TextAlignment="Right" x:Name="SeasonStatWeightTotal">-</TextBlock> <TextBlock Grid.Row="1" Grid.Column="2" TextAlignment="Right" x:Name="SeasonStatWeightTotal">-</TextBlock>
<TextBlock Grid.Row="2" Grid.Column="2" TextAlignment="Right" x:Name="SeasonStatWeightCtrd">-</TextBlock> <TextBlock Grid.Row="2" Grid.Column="2" TextAlignment="Right" x:Name="SeasonStatWeightGeb">-</TextBlock>
<TextBlock Grid.Row="3" Grid.Column="2" TextAlignment="Right" x:Name="SeasonStatWeightUnCtrd">-</TextBlock> <TextBlock Grid.Row="3" Grid.Column="2" TextAlignment="Right" x:Name="SeasonStatWeightUngeb">-</TextBlock>
<TextBlock Grid.Row="1" Grid.Column="3" TextAlignment="Right">-</TextBlock> <TextBlock Grid.Row="1" Grid.Column="3" TextAlignment="Right">-</TextBlock>
<TextBlock Grid.Row="2" Grid.Column="3" TextAlignment="Right" x:Name="SeasonStatArea">-</TextBlock> <TextBlock Grid.Row="2" Grid.Column="3" TextAlignment="Right" x:Name="SeasonStatArea">-</TextBlock>
+13 -13
View File
@@ -406,26 +406,26 @@ namespace Elwig.Windows {
BreakdownMemberVarietyButton.IsEnabled = valid; BreakdownMemberVarietyButton.IsEnabled = valid;
SeasonStatMembersTotal.Text = "-"; SeasonStatMembersTotal.Text = "-";
SeasonStatMembersCtrd.Text = "-"; SeasonStatMembersGeb.Text = "-";
SeasonStatWeightTotal.Text = "-"; SeasonStatWeightTotal.Text = "-";
SeasonStatWeightCtrd.Text = "-"; SeasonStatWeightGeb.Text = "-";
SeasonStatWeightUnCtrd.Text = "-"; SeasonStatWeightUngeb.Text = "-";
SeasonStatArea.Text = "-"; SeasonStatArea.Text = "-";
if (valid) { if (valid) {
await Task.Run(async () => { await Task.Run(async () => {
var membersTotal = await ctx.Deliveries.Where(d => d.Year == year).Select(d => d.Member).Distinct().CountAsync(); var membersTotal = await ctx.Deliveries.Where(d => d.Year == year).Select(d => d.Member).Distinct().CountAsync();
var areaCmts = Utils.ActiveAreaCommitments(ctx.AreaCommitments, year!.Value); var areaComs = Utils.ActiveAreaCommitments(ctx.AreaCommitments, year!.Value);
var membersCtrd = await areaCmts.Select(c => c.Member).Distinct().CountAsync(); var membersGeb = await areaComs.Select(c => c.Member).Distinct().CountAsync();
var weightTotal = await ctx.DeliveryParts.Where(p => p.Year == year).SumAsync(p => p.Weight); var weightTotal = await ctx.DeliveryParts.Where(p => p.Year == year).SumAsync(p => p.Weight);
var ctrdWeight = await ctx.DeliveryPartBuckets.Where(b => b.Year == year && b.Discr != "_").SumAsync(b => b.Value); var gebWeight = await ctx.DeliveryPartBuckets.Where(b => b.Year == year && b.Discr != "_").SumAsync(b => b.Value);
var area = await areaCmts.SumAsync(c => c.Area); var area = await areaComs.SumAsync(c => c.Area);
await App.MainDispatcher.BeginInvoke(() => { await App.MainDispatcher.BeginInvoke(() => {
if (year != SeasonInput.Value) return; if (year != SeasonInput.Value) return;
SeasonStatMembersTotal.Text = $"{membersTotal:N0}"; SeasonStatMembersTotal.Text = $"{membersTotal:N0}";
SeasonStatMembersCtrd.Text = $"{membersCtrd:N0}"; SeasonStatMembersGeb.Text = $"{membersGeb:N0}";
SeasonStatWeightTotal.Text = $"{weightTotal:N0} kg"; SeasonStatWeightTotal.Text = $"{weightTotal:N0} kg";
SeasonStatWeightCtrd.Text = $"{ctrdWeight:N0} kg"; SeasonStatWeightGeb.Text = $"{gebWeight:N0} kg";
SeasonStatWeightUnCtrd.Text = $"{weightTotal - ctrdWeight:N0} kg"; SeasonStatWeightUngeb.Text = $"{weightTotal - gebWeight:N0} kg";
SeasonStatArea.Text = $"{area:N0} m²"; SeasonStatArea.Text = $"{area:N0} m²";
}); });
}); });
@@ -462,7 +462,7 @@ 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 AreaCmtUnderDeliveryData.ForSeason(ctx.AreaCmtUnderDeliveryRows, year); var tbl2 = await AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, year);
using var ods = new OdsFile(filename); using var ods = new OdsFile(filename);
if (App.Client.HasRedWhite) { if (App.Client.HasRedWhite) {
await ods.AddTable(tbl1.Red); await ods.AddTable(tbl1.Red);
@@ -524,8 +524,8 @@ namespace Elwig.Windows {
App.HintContextChange(); App.HintContextChange();
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
var tbl1 = await MemberAreaCmtTotalsData.ForSeason(ctx.MemberAreaCmtTotalsRows, year); var tbl1 = await MemberAreaComTotalsData.ForSeason(ctx.MemberAreaComTotalsRows, year);
var tbl2 = await MemberAreaCmtsData.ForSeason(ctx.MemberAreaCmtsRows, year); var tbl2 = await MemberAreaComsData.ForSeason(ctx.MemberAreaComsRows, year);
using var ods = new OdsFile(filename); using var ods = new OdsFile(filename);
await ods.AddTable(tbl1); await ods.AddTable(tbl1);
await ods.AddTable(tbl2); await ods.AddTable(tbl2);
+9 -13
View File
@@ -110,7 +110,7 @@
Click="Menu_CreditNote_Email_Click"/> Click="Menu_CreditNote_Email_Click"/>
</MenuItem> </MenuItem>
<MenuItem Header="Mitgliederliste" x:Name="Menu_List"> <MenuItem Header="Mitgliederliste" x:Name="Menu_List">
<MenuItem x:Name="Menu_List_SaveActive" Header="...mit Aktiven speichern... (Excel)" <MenuItem x:Name="Menu_List_SaveActive" Header="...mit Aktiven speichern (Excel)"
Click="Menu_List_SaveActive_Click" InputGestureText="Strg+L"/> Click="Menu_List_SaveActive_Click" InputGestureText="Strg+L"/>
<MenuItem x:Name="Menu_List_ShowActive" Header="...mit Aktiven anzeigen (PDF)" <MenuItem x:Name="Menu_List_ShowActive" Header="...mit Aktiven anzeigen (PDF)"
Click="Menu_List_ShowActive_Click" InputGestureText="Strg+O"/> Click="Menu_List_ShowActive_Click" InputGestureText="Strg+O"/>
@@ -119,7 +119,7 @@
<MenuItem x:Name="Menu_List_PrintActive" Header="...mit Aktiven drucken" <MenuItem x:Name="Menu_List_PrintActive" Header="...mit Aktiven drucken"
Click="Menu_List_PrintActive_Click" InputGestureText="Strg+Shift+O"/> Click="Menu_List_PrintActive_Click" InputGestureText="Strg+Shift+O"/>
<Separator/> <Separator/>
<MenuItem x:Name="Menu_List_SaveFilters" Header="...aus Filtern speichern... (Excel)" <MenuItem x:Name="Menu_List_SaveFilters" Header="...aus Filtern speichern (Excel)"
Click="Menu_List_SaveFilters_Click"/> Click="Menu_List_SaveFilters_Click"/>
<MenuItem x:Name="Menu_List_ShowFilters" Header="...aus Filtern anzeigen (PDF)" <MenuItem x:Name="Menu_List_ShowFilters" Header="...aus Filtern anzeigen (PDF)"
Click="Menu_List_ShowFilters_Click"/> Click="Menu_List_ShowFilters_Click"/>
@@ -128,7 +128,7 @@
<MenuItem x:Name="Menu_List_PrintFilters" Header="...aus Filtern drucken" <MenuItem x:Name="Menu_List_PrintFilters" Header="...aus Filtern drucken"
Click="Menu_List_PrintFilters_Click"/> Click="Menu_List_PrintFilters_Click"/>
<Separator/> <Separator/>
<MenuItem x:Name="Menu_List_SaveAll" Header="...mit allen speichern... (Excel)" <MenuItem x:Name="Menu_List_SaveAll" Header="...mit allen speichern (Excel)"
Click="Menu_List_SaveAll_Click"/> Click="Menu_List_SaveAll_Click"/>
<MenuItem x:Name="Menu_List_ShowAll" Header="...mit allen anzeigen (PDF)" <MenuItem x:Name="Menu_List_ShowAll" Header="...mit allen anzeigen (PDF)"
Click="Menu_List_ShowAll_Click"/> Click="Menu_List_ShowAll_Click"/>
@@ -147,10 +147,6 @@
IsCheckable="True" IsChecked="{Binding MemberListOrderByOrt, Mode=TwoWay}" IsCheckable="True" IsChecked="{Binding MemberListOrderByOrt, Mode=TwoWay}"
Click="Menu_List_Order_Click"/> Click="Menu_List_Order_Click"/>
</MenuItem> </MenuItem>
<MenuItem Header="Geschäftsanteile" x:Name="Menu_BusinessShares">
<MenuItem x:Name="Menu_BusinessShares_SavePending" Header="Ausstehende Mitlg.-Bewegungen speichern... (Excel)"
Click="Menu_BusinessShares_SavePending_Click"/>
</MenuItem>
<MenuItem Header="Export"> <MenuItem Header="Export">
<MenuItem x:Name="Menu_Export_ExportSelected" Header="...von ausgewähltem Mitglied speichern..." IsEnabled="False" <MenuItem x:Name="Menu_Export_ExportSelected" Header="...von ausgewähltem Mitglied speichern..." IsEnabled="False"
Click="Menu_Export_ExportSelected_Click"/> Click="Menu_Export_ExportSelected_Click"/>
@@ -208,7 +204,7 @@
<Bold>Aktiv</Bold>: aktiv, !Aktiv (nicht-aktiv)<LineBreak/> <Bold>Aktiv</Bold>: aktiv, !Aktiv (nicht-aktiv)<LineBreak/>
<Bold>Bio-Betrieb</Bold>: BIO, !bio (ausgenommen Bio)<LineBreak/> <Bold>Bio-Betrieb</Bold>: BIO, !bio (ausgenommen Bio)<LineBreak/>
<Bold>Buchführend</Bold>: buchf[ührend], Pauschal[iert], !buchf[ührend]<LineBreak/> <Bold>Buchführend</Bold>: buchf[ührend], Pauschal[iert], !buchf[ührend]<LineBreak/>
<Bold>Vollablieferer</Bold>: voll[ablieferer], voll[lieferant], !Voll[lieferant] (nicht-Vollablieferer)<LineBreak/> <Bold>Volllieferant</Bold>: voll[lieferant], !Voll[lieferant] (nicht-Volllieferant)<LineBreak/>
<Bold>Funktionär</Bold>: Funkt[ionär], !funkt[ionär] (nicht-Funktionär)<LineBreak/> <Bold>Funktionär</Bold>: Funkt[ionär], !funkt[ionär] (nicht-Funktionär)<LineBreak/>
<Bold>Telefon-Nr.</Bold>: z.B. +436641234, ....<LineBreak/> <Bold>Telefon-Nr.</Bold>: z.B. +436641234, ....<LineBreak/>
<Bold>Kontaktdaten</Bold>: email (mind. 1 E-Mail-Adr.), telnr (mind. 1 Tel.-Nr.), !email (keine E-Mail-Adr.), !telnr (keine Tel.-Nr.)<LineBreak/> <Bold>Kontaktdaten</Bold>: email (mind. 1 E-Mail-Adr.), telnr (mind. 1 Tel.-Nr.), !email (keine E-Mail-Adr.), !telnr (keine Tel.-Nr.)<LineBreak/>
@@ -382,7 +378,7 @@
Width="42" Grid.Column="1" HorizontalAlignment="Left" Width="42" Grid.Column="1" HorizontalAlignment="Left"
TextChanged="PlzInput_TextChanged" LostFocus="PlzInput_LostFocus" Tag="PLZ"/> TextChanged="PlzInput_TextChanged" LostFocus="PlzInput_LostFocus" Tag="PLZ"/>
<ComboBox x:Name="OrtInput" SelectedItem="{Binding Ort, Mode=TwoWay}" ItemsSource="{Binding OrtSource, Mode=TwoWay}" <ComboBox x:Name="OrtInput" SelectedItem="{Binding Ort, Mode=TwoWay}" ItemsSource="{Binding OrtSource, Mode=TwoWay}"
DisplayMemberPath="FullDest" TextSearch.TextPath="Ort.Name" ItemTemplate="{StaticResource PostalDestTemplate}" TextSearch.TextPath="Ort.Name"
SelectionChanged="OrtInput_SelectionChanged" SelectionChanged="OrtInput_SelectionChanged"
Margin="47,160,10,0" Grid.Column="1" Grid.ColumnSpan="3"/> Margin="47,160,10,0" Grid.Column="1" Grid.ColumnSpan="3"/>
</Grid> </Grid>
@@ -573,7 +569,7 @@
Checked="OrganicInput_Changed" Unchecked="OrganicInput_Changed" Checked="OrganicInput_Changed" Unchecked="OrganicInput_Changed"
Grid.Column="2" HorizontalAlignment="Left" Margin="5,15,0,0" VerticalAlignment="Top"/> Grid.Column="2" HorizontalAlignment="Left" Margin="5,15,0,0" VerticalAlignment="Top"/>
<CheckBox x:Name="AccountingInput" Content="Buchführend" IsChecked="{Binding IsAccounting, Mode=TwoWay}" IsEnabled="False" <CheckBox x:Name="BuchführendInput" Content="Buchführend" IsChecked="{Binding IsBuchführend, Mode=TwoWay}" IsEnabled="False"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed" Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
Grid.Column="2" HorizontalAlignment="Left" Margin="5,45,0,0" VerticalAlignment="Top"/> Grid.Column="2" HorizontalAlignment="Left" Margin="5,45,0,0" VerticalAlignment="Top"/>
@@ -615,7 +611,7 @@
Margin="0,70,0,0" Width="42" Grid.Column="1" HorizontalAlignment="Left" Margin="0,70,0,0" Width="42" Grid.Column="1" HorizontalAlignment="Left"
TextChanged="PlzInput_TextChanged" LostFocus="PlzInput_LostFocus" Tag="PLZ"/> TextChanged="PlzInput_TextChanged" LostFocus="PlzInput_LostFocus" Tag="PLZ"/>
<ComboBox x:Name="BillingOrtInput" SelectedItem="{Binding BillingOrt, Mode=TwoWay}" ItemsSource="{Binding BillingOrtSource, Mode=TwoWay}" <ComboBox x:Name="BillingOrtInput" SelectedItem="{Binding BillingOrt, Mode=TwoWay}" ItemsSource="{Binding BillingOrtSource, Mode=TwoWay}"
DisplayMemberPath="FullDest" TextSearch.TextPath="Ort.Name" ItemTemplate="{StaticResource PostalDestTemplate}" TextSearch.TextPath="Ort.Name"
SelectionChanged="OrtInput_SelectionChanged" SelectionChanged="OrtInput_SelectionChanged"
Margin="47,70,10,0" Grid.Column="1"/> Margin="47,70,10,0" Grid.Column="1"/>
</Grid> </Grid>
@@ -664,11 +660,11 @@
Checked="ActiveInput_Changed" Unchecked="ActiveInput_Changed" Checked="ActiveInput_Changed" Unchecked="ActiveInput_Changed"
Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" VerticalAlignment="Top"/> Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" VerticalAlignment="Top"/>
<CheckBox x:Name="FullDeliveryInput" Content="Vollablieferer" IsChecked="{Binding IsFullDelivery, Mode=TwoWay}" IsEnabled="False" <CheckBox x:Name="VollLieferantInput" Content="Volllieferant" IsChecked="{Binding IsVollLieferant, Mode=TwoWay}" IsEnabled="False"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed" Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
Grid.Column="2" HorizontalAlignment="Left" Margin="0,45,0,0" VerticalAlignment="Top"/> Grid.Column="2" HorizontalAlignment="Left" Margin="0,45,0,0" VerticalAlignment="Top"/>
<CheckBox x:Name="OfficerInput" Content="Funktionär" IsChecked="{Binding IsOfficer, Mode=TwoWay}" IsEnabled="False" <CheckBox x:Name="FunkionärInput" Content="Funktionär" IsChecked="{Binding IsFunktionär, Mode=TwoWay}" IsEnabled="False"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed" Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
Grid.Column="2" HorizontalAlignment="Left" Margin="0,75,0,0" VerticalAlignment="Top"/> Grid.Column="2" HorizontalAlignment="Left" Margin="0,75,0,0" VerticalAlignment="Top"/>
+21 -27
View File
@@ -1,7 +1,6 @@
using Elwig.Dialogs; using Elwig.Dialogs;
using Elwig.Documents; using Elwig.Documents;
using Elwig.Helpers; using Elwig.Helpers;
using Elwig.Helpers.Export;
using Elwig.Models.Entities; using Elwig.Models.Entities;
using Elwig.Services; using Elwig.Services;
using Elwig.ViewModels; using Elwig.ViewModels;
@@ -115,7 +114,6 @@ namespace Elwig.Windows {
} }
if (!App.Client.EnableMemberHistory) { if (!App.Client.EnableMemberHistory) {
Menu_BusinessShares.Visibility = Visibility.Collapsed;
BusinessSharesButton.Visibility = Visibility.Hidden; BusinessSharesButton.Visibility = Visibility.Hidden;
} }
@@ -476,8 +474,8 @@ namespace Elwig.Windows {
IsCreating = true; IsCreating = true;
MemberList.IsEnabled = false; MemberList.IsEnabled = false;
ViewModel.SelectedMember = null; ViewModel.SelectedMember = null;
ViewModel.TransferPredecessorAreaCmts = null; ViewModel.TransferPredecessorAreaComs = null;
ViewModel.CancelAreaCmts = null; ViewModel.CancelAreaComs = null;
HideNewEditDeleteButtons(); HideNewEditDeleteButtons();
ShowSaveResetCancelButtons(); ShowSaveResetCancelButtons();
UnlockInputs(); UnlockInputs();
@@ -497,8 +495,8 @@ namespace Elwig.Windows {
IsEditing = true; IsEditing = true;
MemberList.IsEnabled = false; MemberList.IsEnabled = false;
ViewModel.TransferPredecessorAreaCmts = null; ViewModel.TransferPredecessorAreaComs = null;
ViewModel.CancelAreaCmts = null; ViewModel.CancelAreaComs = null;
HideNewEditDeleteButtons(); HideNewEditDeleteButtons();
ShowSaveResetCancelButtons(); ShowSaveResetCancelButtons();
@@ -519,17 +517,17 @@ namespace Elwig.Windows {
if (ViewModel.SelectedMember is not Member m) if (ViewModel.SelectedMember is not Member m)
return; return;
int areaCmts = 0, deliveries = 0, credits = 0; int areaComs = 0, deliveries = 0, credits = 0;
using (var ctx = new AppDbContext()) { using (var ctx = new AppDbContext()) {
areaCmts = await ctx.AreaCommitments.Where(c => c.MgNr == m.MgNr).CountAsync(); areaComs = await ctx.AreaCommitments.Where(c => c.MgNr == m.MgNr).CountAsync();
deliveries = await ctx.Deliveries.Where(d => d.MgNr == m.MgNr).CountAsync(); deliveries = await ctx.Deliveries.Where(d => d.MgNr == m.MgNr).CountAsync();
credits = await ctx.Credits.Where(c => c.MgNr == m.MgNr).CountAsync(); credits = await ctx.Credits.Where(c => c.MgNr == m.MgNr).CountAsync();
} }
var d = new DeleteMemberDialog(m.MgNr, m.AdministrativeName, areaCmts, deliveries, credits); var d = new DeleteMemberDialog(m.MgNr, m.AdministrativeName, areaComs, deliveries, credits);
if (d.ShowDialog() == true) { if (d.ShowDialog() == true) {
Mouse.OverrideCursor = Cursors.Wait; Mouse.OverrideCursor = Cursors.Wait;
try { try {
await MemberService.DeleteMember(m.MgNr, d.DeletePaymentData, d.DeleteDeliveries, d.DeleteAreaCmts); await MemberService.DeleteMember(m.MgNr, d.DeletePaymentData, d.DeleteDeliveries, d.DeleteAreaComs);
App.HintContextChange(); App.HintContextChange();
} catch (Exception exc) { } catch (Exception exc) {
InteractionService.ShowDbException("Mitglied löschen", exc); InteractionService.ShowDbException("Mitglied löschen", exc);
@@ -582,8 +580,8 @@ namespace Elwig.Windows {
} }
private async void ResetButton_Click(object? sender, RoutedEventArgs? evt) { private async void ResetButton_Click(object? sender, RoutedEventArgs? evt) {
ViewModel.TransferPredecessorAreaCmts = null; ViewModel.TransferPredecessorAreaComs = null;
ViewModel.CancelAreaCmts = null; ViewModel.CancelAreaComs = null;
if (IsEditing) { if (IsEditing) {
RefreshInputs(); RefreshInputs();
} else if (IsCreating) { } else if (IsCreating) {
@@ -597,8 +595,8 @@ namespace Elwig.Windows {
IsEditing = false; IsEditing = false;
IsCreating = false; IsCreating = false;
MemberList.IsEnabled = true; MemberList.IsEnabled = true;
ViewModel.TransferPredecessorAreaCmts = null; ViewModel.TransferPredecessorAreaComs = null;
ViewModel.CancelAreaCmts = null; ViewModel.CancelAreaComs = null;
HideSaveResetCancelButtons(); HideSaveResetCancelButtons();
ShowNewEditDeleteButtons(); ShowNewEditDeleteButtons();
RefreshInputs(); RefreshInputs();
@@ -612,7 +610,7 @@ namespace Elwig.Windows {
} }
private void AreaCommitmentButton_Click(object sender, RoutedEventArgs evt) { private void AreaCommitmentButton_Click(object sender, RoutedEventArgs evt) {
App.FocusMemberAreaCmts(ViewModel.SelectedMember!.MgNr); App.FocusMemberAreaComs(ViewModel.SelectedMember!.MgNr);
} }
private void DeliveryButton_Click(object sender, RoutedEventArgs evt) { private void DeliveryButton_Click(object sender, RoutedEventArgs evt) {
@@ -811,10 +809,6 @@ namespace Elwig.Windows {
await App.Client.UpdateValues(); await App.Client.UpdateValues();
} }
private async void Menu_BusinessShares_SavePending_Click(object sender, RoutedEventArgs evt) {
await MemberBusinessSharesService.GenerateMemberMovements(MemberBusinessSharesService.ExportSubject.Pending, ExportMode.SaveList);
}
private void FocusSearchInput(object sender, RoutedEventArgs evt) { private void FocusSearchInput(object sender, RoutedEventArgs evt) {
if (!IsEditing && !IsCreating) { if (!IsEditing && !IsCreating) {
SearchInput.Focus(); SearchInput.Focus();
@@ -926,10 +920,10 @@ namespace Elwig.Windows {
if (ViewModel.MgNr == mgnr) if (ViewModel.MgNr == mgnr)
return; return;
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
var areaCmts = await ctx.AreaCommitments var areaComs = await ctx.AreaCommitments
.Where(c => c.MgNr == mgnr && (c.YearTo == null || c.YearTo >= Utils.FollowingSeason)) .Where(c => c.MgNr == mgnr && (c.YearTo == null || c.YearTo >= Utils.FollowingSeason))
.ToListAsync(); .ToListAsync();
if (areaCmts.Count == 0) if (areaComs.Count == 0)
return; return;
var oldMember = await ctx.FetchMembers(mgnr).SingleAsync(); var oldMember = await ctx.FetchMembers(mgnr).SingleAsync();
@@ -937,10 +931,10 @@ namespace Elwig.Windows {
$"{ViewModel.Prefix}{(!string.IsNullOrWhiteSpace(ViewModel.Prefix) ? " " : "")}" + $"{ViewModel.Prefix}{(!string.IsNullOrWhiteSpace(ViewModel.Prefix) ? " " : "")}" +
$"{ViewModel.GivenName}{(!string.IsNullOrWhiteSpace(ViewModel.GivenName) ? " " : "")}" + $"{ViewModel.GivenName}{(!string.IsNullOrWhiteSpace(ViewModel.GivenName) ? " " : "")}" +
$"{ViewModel.Suffix}{(!string.IsNullOrWhiteSpace(ViewModel.Suffix) ? " " : "")}"; $"{ViewModel.Suffix}{(!string.IsNullOrWhiteSpace(ViewModel.Suffix) ? " " : "")}";
var d = new AreaCmtTransferDialog(oldMember.AdministrativeName, newName, areaCmts.Count, areaCmts.Sum(c => c.Area)); var d = new AreaComTransferDialog(oldMember.AdministrativeName, newName, areaComs.Count, areaComs.Sum(c => c.Area));
if (d.ShowDialog() != true) if (d.ShowDialog() != true)
return; return;
ViewModel.TransferPredecessorAreaCmts = d.SuccessorSeason; ViewModel.TransferPredecessorAreaComs = d.SuccessorSeason;
if (IsEditing) if (IsEditing)
SetOriginalValue(PredecessorMgNrInput, -1); // hack to allow user to save SetOriginalValue(PredecessorMgNrInput, -1); // hack to allow user to save
UpdateButtons(); UpdateButtons();
@@ -985,13 +979,13 @@ namespace Elwig.Windows {
return; return;
if ((IsEditing || IsCreating) && ViewModel.IsActive == false && ViewModel.MgNr is int mgnr) { if ((IsEditing || IsCreating) && ViewModel.IsActive == false && ViewModel.MgNr is int mgnr) {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
var areaCmts = await ctx.AreaCommitments var areaComs = await ctx.AreaCommitments
.Where(c => c.MgNr == mgnr && (c.YearTo == null || c.YearTo >= Utils.FollowingSeason)) .Where(c => c.MgNr == mgnr && (c.YearTo == null || c.YearTo >= Utils.FollowingSeason))
.ToListAsync(); .ToListAsync();
if (areaCmts.Count > 0) { if (areaComs.Count > 0) {
var d = new AreaCmtTransferDialog(m.AdministrativeName, areaCmts.Count, areaCmts.Sum(c => c.Area)); var d = new AreaComTransferDialog(m.AdministrativeName, areaComs.Count, areaComs.Sum(c => c.Area));
if (d.ShowDialog() == true) { if (d.ShowDialog() == true) {
ViewModel.CancelAreaCmts = d.CancelSeason; ViewModel.CancelAreaComs = d.CancelSeason;
} }
} }
} }
+3 -3
View File
@@ -99,9 +99,9 @@ namespace Elwig.Windows {
var allMembers = await ctx.Members.Where(m => m.DefaultKgNr == k.KgNr).CountAsync(); var allMembers = await ctx.Members.Where(m => m.DefaultKgNr == k.KgNr).CountAsync();
StatusDefaultKgs.Text += $"{activeMembers:N0} ({allMembers:N0})"; StatusDefaultKgs.Text += $"{activeMembers:N0} ({allMembers:N0})";
var year = Utils.CurrentNextSeason; var year = Utils.CurrentNextSeason;
var activeAreaCmts = await Utils.ActiveAreaCommitments(ctx.AreaCommitments.Where(c => c.Contract.KgNr == k.KgNr), year).CountAsync(); var activeAreaComs = await Utils.ActiveAreaCommitments(ctx.AreaCommitments.Where(c => c.Contract.KgNr == k.KgNr), year).CountAsync();
var allAreaCmts = await ctx.AreaCommitments.Where(c => c.Contract.KgNr == k.KgNr).CountAsync(); var allAreaComs = await ctx.AreaCommitments.Where(c => c.Contract.KgNr == k.KgNr).CountAsync();
StatusAreaCommitments.Text += $"{activeAreaCmts:N0} ({allAreaCmts:N0})"; StatusAreaCommitments.Text += $"{activeAreaComs:N0} ({allAreaComs:N0})";
var deliveryParts = await ctx.DeliveryParts.Where(p => p.KgNr == k.KgNr).CountAsync(); var deliveryParts = await ctx.DeliveryParts.Where(p => p.KgNr == k.KgNr).CountAsync();
var deliveries = await ctx.Deliveries.Where(d => d.Parts.Any(p => p.KgNr == k.KgNr)).CountAsync(); var deliveries = await ctx.Deliveries.Where(d => d.Parts.Any(p => p.KgNr == k.KgNr)).CountAsync();
StatusDeliveries.Text += $"{deliveries:N0} ({deliveryParts:N0})"; StatusDeliveries.Text += $"{deliveries:N0} ({deliveryParts:N0})";
@@ -54,9 +54,9 @@ namespace Elwig.Windows {
var contracts = await ctx.AreaCommitmentTypes.ToDictionaryAsync(t => t.VtrgId, t => t); var contracts = await ctx.AreaCommitmentTypes.ToDictionaryAsync(t => t.VtrgId, t => t);
var (tbl1, _, _) = await OverUnderDeliveryData.ForSeason(ctx.OverUnderDeliveryRows, Year); var (tbl1, _, _) = await OverUnderDeliveryData.ForSeason(ctx.OverUnderDeliveryRows, Year);
var tbl2 = await AreaCmtUnderDeliveryData.ForSeason(ctx.AreaCmtUnderDeliveryRows, Year); var tbl2 = await AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, Year);
var weight = tbl1.Rows.ToDictionary(r => r.MgNr, r => r.WeightTotal); var weight = tbl1.Rows.ToDictionary(r => r.MgNr, r => r.WeightTotal);
var areaCmts = tbl2.Rows.ToDictionary(r => r.MgNr, r => r.VtrgIds.Zip(r.UnderDeliveries).ToDictionary(r => r.First, r => r.Second)); var areaComs = tbl2.Rows.ToDictionary(r => r.MgNr, r => r.VtrgIds.Zip(r.UnderDeliveries).ToDictionary(r => r.First, r => r.Second));
CustomPayments = await ctx.CustomPayments.Where(p => p.Year == Year).ToDictionaryAsync(p => p.MgNr, p => p); CustomPayments = await ctx.CustomPayments.Where(p => p.Year == Year).ToDictionaryAsync(p => p.MgNr, p => p);
var history = await ctx.MemberHistory var history = await ctx.MemberHistory
@@ -93,7 +93,7 @@ namespace Elwig.Windows {
(season.PenaltyPerShareAmount * Math.Floor(m.OverUnder / season.MinKgPerShare ?? 0m) ?? 0) + (season.PenaltyPerShareAmount * Math.Floor(m.OverUnder / season.MinKgPerShare ?? 0m) ?? 0) +
(m.Weight == 0 ? (-season.PenaltyNone ?? 0) + (-season.PenaltyPerShareNone * m.SharesActive ?? 0) : 0) (m.Weight == 0 ? (-season.PenaltyNone ?? 0) + (-season.PenaltyPerShareNone * m.SharesActive ?? 0) : 0)
: (decimal?)null, : (decimal?)null,
PenaltyAc = areaCmts.TryGetValue(m.MgNr, out var c) ? c.Select(r => { PenaltyAc = areaComs.TryGetValue(m.MgNr, out var c) ? c.Select(r => {
var con = contracts[r.Key]; var con = contracts[r.Key];
return (r.Value.Kg * con.PenaltyPerKg ?? 0) + (r.Value.Kg < 0 ? con.PenaltyAmount ?? 0 : 0) + (r.Value.Percent == -100 ? con.PenaltyNone ?? 0 : 0); return (r.Value.Kg * con.PenaltyPerKg ?? 0) + (r.Value.Kg < 0 ? con.PenaltyAmount ?? 0 : 0) + (r.Value.Percent == -100 ? con.PenaltyNone ?? 0 : 0);
}).Sum() : (decimal?)null, }).Sum() : (decimal?)null,
+2 -2
View File
@@ -13,7 +13,7 @@ About
**Product:** Elwig **Product:** Elwig
**Description:** Electronic Management for Vintners' Cooperatives **Description:** Electronic Management for Vintners' Cooperatives
**Type:** ERP system **Type:** ERP system
**Version:** 1.2.0.1 ([Changelog](./CHANGELOG.md)) **Version:** 1.1.2.2 ([Changelog](./CHANGELOG.md))
**License:** [GNU General Public License 3.0 (GPLv3)](./LICENSE) **License:** [GNU General Public License 3.0 (GPLv3)](./LICENSE)
**Website:** https://elwig.at/ **Website:** https://elwig.at/
**Source code:** https://git.necronda.net/winzer/elwig **Source code:** https://git.necronda.net/winzer/elwig
@@ -33,7 +33,7 @@ Packaging: [WiX Toolset](https://www.firegiant.com/wixtoolset/)
**Produkt:** Elwig **Produkt:** Elwig
**Beschreibung:** Elektronische Winzergenossenschaftsverwaltung **Beschreibung:** Elektronische Winzergenossenschaftsverwaltung
**Typ:** Warenwirtschaftssystem (ERP-System) **Typ:** Warenwirtschaftssystem (ERP-System)
**Version:** 1.2.0.1 ([Änderungsprotokoll](./CHANGELOG.md)) **Version:** 1.1.2.2 ([Änderungsprotokoll](./CHANGELOG.md))
**Lizenz:** [GNU General Public License 3.0 (GPLv3)](./LICENSE) **Lizenz:** [GNU General Public License 3.0 (GPLv3)](./LICENSE)
**Website:** https://elwig.at/ **Website:** https://elwig.at/
**Quellcode:** https://git.necronda.net/winzer/elwig **Quellcode:** https://git.necronda.net/winzer/elwig
+3 -3
View File
@@ -60,7 +60,7 @@ namespace Tests.E2ETests {
Window.FindElement(By.WpfId("UstIdNrInput")).SendKeys("ATU01234565"); Window.FindElement(By.WpfId("UstIdNrInput")).SendKeys("ATU01234565");
Window.FindElement(By.WpfId("LfbisNrInput")).SendKeys("0123455"); Window.FindElement(By.WpfId("LfbisNrInput")).SendKeys("0123455");
Window.FindElement(By.WpfId("AccountingInput")).Click(); Window.FindElement(By.WpfId("BuchführendInput")).Click();
Window.FindElement(By.WpfId("OrganicInput")).Click(); Window.FindElement(By.WpfId("OrganicInput")).Click();
Window.FindElement(By.WpfId("BillingNameInput")).SendKeys("Neuling KG"); Window.FindElement(By.WpfId("BillingNameInput")).SendKeys("Neuling KG");
@@ -72,8 +72,8 @@ namespace Tests.E2ETests {
Window.FindElement(By.WpfId("BranchInput")).SelectItem("Matzen"); Window.FindElement(By.WpfId("BranchInput")).SelectItem("Matzen");
Window.FindElement(By.WpfId("DefaultKgInput")).SelectItem(3); Window.FindElement(By.WpfId("DefaultKgInput")).SelectItem(3);
Window.FindElement(By.WpfId("FullDeliveryInput")).Click(); Window.FindElement(By.WpfId("VollLieferantInput")).Click();
Window.FindElement(By.WpfId("OfficerInput")).Click(); Window.FindElement(By.WpfId("FunkionärInput")).Click();
Window.FindElement(By.WpfId("CommentInput")).SendKeys("Die lieben Mustermänner und Musterfrauen!"); Window.FindElement(By.WpfId("CommentInput")).SendKeys("Die lieben Mustermänner und Musterfrauen!");
Window.FindElement(By.WpfId("ContactEmailInput")).Click(); Window.FindElement(By.WpfId("ContactEmailInput")).Click();
+1 -1
View File
@@ -60,7 +60,7 @@ INSERT INTO delivery (mgnr, year, did, date, time, zwstid, lnr) VALUES
(101, 2021, 1, '2021-10-01', NULL, 'X', 1), (101, 2021, 1, '2021-10-01', NULL, 'X', 1),
(101, 2021, 2, '2021-10-01', NULL, 'X', 2), (101, 2021, 2, '2021-10-01', NULL, 'X', 2),
(101, 2021, 3, '2021-10-01', NULL, 'X', 3); (101, 2021, 3, '2021-10-01', NULL, 'X', 3);
INSERT INTO delivery_part (year, did, dpnr, sortid, attrid, cultid, weight, kmw, qualid, hkid, kgnr, contracted, net_weight, manual_weighing, spl_check, scale_terminal, weighing_data, weighing_reason) VALUES INSERT INTO delivery_part (year, did, dpnr, sortid, attrid, cultid, weight, kmw, qualid, hkid, kgnr, gebunden, net_weight, manual_weighing, spl_check, scale_terminal, weighing_data, weighing_reason) VALUES
(2021, 1, 1, 'GV', 'K', NULL, 4000, 17, 'KAB', 'WLNO', 06109, TRUE, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2021, 1, 1, 'GV', 'K', NULL, 4000, 17, 'KAB', 'WLNO', 06109, TRUE, TRUE, FALSE, FALSE, NULL, NULL, NULL),
(2021, 1, 2, 'GV', NULL, NULL, 4000, 16, 'QUW', 'WLNO', 06109, FALSE, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2021, 1, 2, 'GV', NULL, NULL, 4000, 16, 'QUW', 'WLNO', 06109, FALSE, TRUE, FALSE, FALSE, NULL, NULL, NULL),
(2021, 2, 1, 'GV', NULL, 'B', 4000, 15, 'QUW', 'WLNO', 06109, TRUE, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2021, 2, 1, 'GV', NULL, 'B', 4000, 15, 'QUW', 'WLNO', 06109, TRUE, TRUE, FALSE, FALSE, NULL, NULL, NULL),
+1 -1
View File
@@ -66,7 +66,7 @@ INSERT INTO wb_kg (kgnr, glnr) VALUES
(15216, 2), (15216, 2),
(15224, 2); (15224, 2);
INSERT INTO member (mgnr, given_name, name, zwstid, full_delivery, accounting, country, postal_dest, address, default_kgnr, iban, lfbis_nr, ustid_nr, org_auth_code) VALUES INSERT INTO member (mgnr, given_name, name, zwstid, volllieferant, buchführend, country, postal_dest, address, default_kgnr, iban, lfbis_nr, ustid_nr, org_auth_code) VALUES
(101, 'Max', 'Mustermann', 'X', FALSE, FALSE, 40, 222303524, 'Winzerstraße 1', 06109, 'AT811234567890123457', '0123463', NULL , NULL ), (101, 'Max', 'Mustermann', 'X', FALSE, FALSE, 40, 222303524, 'Winzerstraße 1', 06109, 'AT811234567890123457', '0123463', NULL , NULL ),
(102, 'Wernhardt', 'Weinbauer', 'X', FALSE, FALSE, 40, 222303524, 'Winzerstraße 2', 06109, 'AT541234567890123458', '0123471', 'ATU12345684', NULL ), (102, 'Wernhardt', 'Weinbauer', 'X', FALSE, FALSE, 40, 222303524, 'Winzerstraße 2', 06109, 'AT541234567890123458', '0123471', 'ATU12345684', NULL ),
(103, 'Matthäus', 'Musterbauer', 'X', FALSE, FALSE, 40, 212005138, 'Brünner Straße 10', 15224, 'AT271234567890123459', '0123480', NULL , 'AT-BIO-302'), (103, 'Matthäus', 'Musterbauer', 'X', FALSE, FALSE, 40, 212005138, 'Brünner Straße 10', 15224, 'AT271234567890123459', '0123480', NULL , 'AT-BIO-302'),
+1 -1
View File
@@ -6,7 +6,7 @@ INSERT INTO wine_cultivation (cultid, name, description, organic) VALUES
INSERT INTO wine_attribute (attrid, name, active, max_kg_per_ha, strict, fill_lower) VALUES INSERT INTO wine_attribute (attrid, name, active, max_kg_per_ha, strict, fill_lower) VALUES
('K', 'Kabinett', TRUE, NULL, FALSE, 0); ('K', 'Kabinett', TRUE, NULL, FALSE, 0);
INSERT INTO member (mgnr, given_name, name, zwstid, full_delivery, accounting, country, postal_dest, address, default_kgnr, iban, lfbis_nr, ustid_nr) VALUES INSERT INTO member (mgnr, given_name, name, zwstid, volllieferant, buchführend, country, postal_dest, address, default_kgnr, iban, lfbis_nr, ustid_nr) VALUES
(201, 'Theodor', 'Testbauer', 'X', FALSE, FALSE, 40, 222303524, 'Teststraße 1', 06109, 'AT811234567890123457', '0123463', NULL ), (201, 'Theodor', 'Testbauer', 'X', FALSE, FALSE, 40, 222303524, 'Teststraße 1', 06109, 'AT811234567890123457', '0123463', NULL ),
(202, 'Thomas', 'Testmann', 'X', FALSE, FALSE, 40, 222303524, 'Teststraße 2', 06109, 'AT541234567890123458', '0123471', 'ATU12345684'), (202, 'Thomas', 'Testmann', 'X', FALSE, FALSE, 40, 222303524, 'Teststraße 2', 06109, 'AT541234567890123458', '0123471', 'ATU12345684'),
(203, 'Tina', 'Testwinzer', 'X', FALSE, FALSE, 40, 212005138, 'Teststraße 3', 15224, 'AT271234567890123459', '0123480', NULL ), (203, 'Tina', 'Testwinzer', 'X', FALSE, FALSE, 40, 212005138, 'Teststraße 3', 15224, 'AT271234567890123459', '0123480', NULL ),
+20 -20
View File
@@ -27,17 +27,17 @@ namespace Tests.UnitTests.HelperTests {
}; };
} }
private static void TestCalcOe(PaymentBillingData data, string bucket, double oe, decimal expected, string? qualid = null, bool ctrd = false) { private static void TestCalcOe(PaymentBillingData data, string bucket, double oe, decimal expected, string? qualid = null, bool geb = false) {
var (sortid, attrid, cultid) = GetSortIdAttrId(bucket); var (sortid, attrid, cultid) = GetSortIdAttrId(bucket);
var kmw = Utils.OeToKmw(oe); var kmw = Utils.OeToKmw(oe);
var v = data.CalculatePrice(sortid, attrid, cultid, qualid ?? GetQualId(kmw), ctrd, oe, kmw); var v = data.CalculatePrice(sortid, attrid, cultid, qualid ?? GetQualId(kmw), geb, oe, kmw);
Assert.That(Math.Round(v, 6), Is.EqualTo(expected)); Assert.That(Math.Round(v, 6), Is.EqualTo(expected));
} }
private static void TestCalcKmw(PaymentBillingData data, string bucket, double kmw, decimal expected, string? qualid = null, bool ctrd = false) { private static void TestCalcKmw(PaymentBillingData data, string bucket, double kmw, decimal expected, string? qualid = null, bool geb = false) {
var (sortid, attrid, cultid) = GetSortIdAttrId(bucket); var (sortid, attrid, cultid) = GetSortIdAttrId(bucket);
var oe = Utils.KmwToOe(kmw); var oe = Utils.KmwToOe(kmw);
var v = data.CalculatePrice(sortid, attrid, cultid, qualid ?? GetQualId(kmw), ctrd, oe, kmw); var v = data.CalculatePrice(sortid, attrid, cultid, qualid ?? GetQualId(kmw), geb, oe, kmw);
Assert.That(Math.Round(v, 6), Is.EqualTo(expected)); Assert.That(Math.Round(v, 6), Is.EqualTo(expected));
} }
@@ -84,11 +84,11 @@ namespace Tests.UnitTests.HelperTests {
TestCalcOe(data, "GV", 80, 0.85m); TestCalcOe(data, "GV", 80, 0.85m);
TestCalcOe(data, "GV", 83, 1.00m); TestCalcOe(data, "GV", 83, 1.00m);
TestCalcOe(data, "GV", 90, 1.00m); TestCalcOe(data, "GV", 90, 1.00m);
TestCalcOe(data, "GV", 73, 0.60m, ctrd: true); TestCalcOe(data, "GV", 73, 0.60m, geb: true);
TestCalcOe(data, "GV", 74, 0.65m, ctrd: true); TestCalcOe(data, "GV", 74, 0.65m, geb: true);
TestCalcOe(data, "GV", 80, 0.95m, ctrd: true); TestCalcOe(data, "GV", 80, 0.95m, geb: true);
TestCalcOe(data, "GV", 83, 1.10m, ctrd: true); TestCalcOe(data, "GV", 83, 1.10m, geb: true);
TestCalcOe(data, "GV", 90, 1.10m, ctrd: true); TestCalcOe(data, "GV", 90, 1.10m, geb: true);
} }
} }
@@ -298,7 +298,7 @@ namespace Tests.UnitTests.HelperTests {
"73oe": 0.5, "73oe": 0.5,
"17kmw": 0.6 "17kmw": 0.6
}, },
"ctrd": 0.1 "geb": 0.1
}, { }, {
"id": 2, "id": 2,
"mode": "kmw", "mode": "kmw",
@@ -306,7 +306,7 @@ namespace Tests.UnitTests.HelperTests {
"15kmw": 0.6, "15kmw": 0.6,
"17kmw": 0.7 "17kmw": 0.7
}, },
"ctrd": { "geb": {
"73oe": 0.65, "73oe": 0.65,
"17kmw": 0.80 "17kmw": 0.80
} }
@@ -318,21 +318,21 @@ namespace Tests.UnitTests.HelperTests {
TestCalcKmw(data, "GVS", 15.0, 0.50m); TestCalcKmw(data, "GVS", 15.0, 0.50m);
TestCalcKmw(data, "GVS", 16.0, 0.55m); TestCalcKmw(data, "GVS", 16.0, 0.55m);
TestCalcKmw(data, "GVS", 17.0, 0.60m); TestCalcKmw(data, "GVS", 17.0, 0.60m);
TestCalcKmw(data, "GVS", 15.0, 0.60m, ctrd: true); TestCalcKmw(data, "GVS", 15.0, 0.60m, geb: true);
TestCalcKmw(data, "GVS", 16.0, 0.65m, ctrd: true); TestCalcKmw(data, "GVS", 16.0, 0.65m, geb: true);
TestCalcKmw(data, "GVS", 17.0, 0.70m, ctrd: true); TestCalcKmw(data, "GVS", 17.0, 0.70m, geb: true);
TestCalcKmw(data, "GVK", 15.0, 0.60m); TestCalcKmw(data, "GVK", 15.0, 0.60m);
TestCalcKmw(data, "GVK", 16.0, 0.65m); TestCalcKmw(data, "GVK", 16.0, 0.65m);
TestCalcKmw(data, "GVK", 17.0, 0.70m); TestCalcKmw(data, "GVK", 17.0, 0.70m);
TestCalcKmw(data, "GVK", 15.0, 0.65m, ctrd: true); TestCalcKmw(data, "GVK", 15.0, 0.65m, geb: true);
TestCalcKmw(data, "GVK", 16.0, 0.725m, ctrd: true); TestCalcKmw(data, "GVK", 16.0, 0.725m, geb: true);
TestCalcKmw(data, "GVK", 17.0, 0.80m, ctrd: true); TestCalcKmw(data, "GVK", 17.0, 0.80m, geb: true);
TestCalcKmw(data, "WRS", 15.0, 0.70m); TestCalcKmw(data, "WRS", 15.0, 0.70m);
TestCalcKmw(data, "WRS", 16.0, 0.75m); TestCalcKmw(data, "WRS", 16.0, 0.75m);
TestCalcKmw(data, "WRS", 17.0, 0.80m); TestCalcKmw(data, "WRS", 17.0, 0.80m);
TestCalcKmw(data, "WRS", 15.0, 0.80m, ctrd: true); TestCalcKmw(data, "WRS", 15.0, 0.80m, geb: true);
TestCalcKmw(data, "WRS", 16.0, 0.875m, ctrd: true); TestCalcKmw(data, "WRS", 16.0, 0.875m, geb: true);
TestCalcKmw(data, "WRS", 17.0, 0.95m, ctrd: true); TestCalcKmw(data, "WRS", 17.0, 0.95m, geb: true);
} }
} }
+50 -50
View File
@@ -11,12 +11,12 @@ namespace Tests.UnitTests.HelperTests {
private const int MgNr1 = 101, MgNr2 = 102, MgNr3 = 103, MgNr4 = 104; private const int MgNr1 = 101, MgNr2 = 102, MgNr3 = 103, MgNr4 = 104;
private const decimal private const decimal
GV_unctrd = 0.50m, GV_ungeb = 0.50m,
GV_ctrd = 0.60m, GV_geb = 0.60m,
GVB_unctrd = 0.54m, GVB_ungeb = 0.54m,
GVB_ctrd = 0.64m, GVB_geb = 0.64m,
GVK_unctrd = 0.61m, GVK_ungeb = 0.61m,
GVK_ctrd = 0.71m, GVK_geb = 0.71m,
WEI = 0.10m; WEI = 0.10m;
private SqliteConnection? Connection; private SqliteConnection? Connection;
@@ -56,12 +56,12 @@ namespace Tests.UnitTests.HelperTests {
"id": 1, "id": 1,
"mode": "oe", "mode": "oe",
"data": {"15kmw": 0.54}, "data": {"15kmw": 0.54},
"ctrd": 0.1 "geb": 0.1
}, { }, {
"id": 2, "id": 2,
"mode": "oe", "mode": "oe",
"data": {"15kmw": 0.61}, "data": {"15kmw": 0.61},
"ctrd": 0.1 "geb": 0.1
}] }]
} }
"""; """;
@@ -79,7 +79,7 @@ namespace Tests.UnitTests.HelperTests {
"""); """);
} }
private Task<Dictionary<string, AreaCmtBucket>> GetMemberAreaCommitmentBuckets(int year, int mgnr) { private Task<Dictionary<string, AreaComBucket>> GetMemberAreaCommitmentBuckets(int year, int mgnr) {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
return ctx.GetMemberAreaCommitmentBuckets(year, mgnr, Connection); return ctx.GetMemberAreaCommitmentBuckets(year, mgnr, Connection);
} }
@@ -122,11 +122,11 @@ namespace Tests.UnitTests.HelperTests {
} }
[Test] [Test]
public async Task Test_01_NoActiveAreaCmts() { public async Task Test_01_NoActiveAreaComs() {
int mgnr = MgNr1, year = Year1; int mgnr = MgNr1, year = Year1;
var areaCmt = await GetMemberAreaCommitmentBuckets(year, mgnr); var areaCom = await GetMemberAreaCommitmentBuckets(year, mgnr);
Assert.That(areaCmt, Is.Empty); Assert.That(areaCom, Is.Empty);
var delivery = await GetMemberDeliveryBuckets(year, mgnr); var delivery = await GetMemberDeliveryBuckets(year, mgnr);
using (Assert.EnterMultipleScope()) { using (Assert.EnterMultipleScope()) {
Assert.That(delivery, Has.Count.EqualTo(3)); Assert.That(delivery, Has.Count.EqualTo(3));
@@ -148,28 +148,28 @@ namespace Tests.UnitTests.HelperTests {
using (Assert.EnterMultipleScope()) { using (Assert.EnterMultipleScope()) {
Assert.That(prices, Has.Count.EqualTo(6)); Assert.That(prices, Has.Count.EqualTo(6));
// Kabinett // Kabinett
Assert.That(prices[("20201001X001/1", "GV_")], Is.EqualTo((4_000, GV_unctrd))); Assert.That(prices[("20201001X001/1", "GV_")], Is.EqualTo((4_000, GV_ungeb)));
// ohne Attribut // ohne Attribut
Assert.That(prices[("20201001X001/2", "GV_")], Is.EqualTo((4_000, GV_unctrd))); Assert.That(prices[("20201001X001/2", "GV_")], Is.EqualTo((4_000, GV_ungeb)));
// Bio // Bio
Assert.That(prices[("20201001X002/1", "GV_")], Is.EqualTo((4_000, GVB_unctrd))); Assert.That(prices[("20201001X002/1", "GV_")], Is.EqualTo((4_000, GVB_ungeb)));
// Bio // Bio
Assert.That(prices[("20201001X002/2", "GV_")], Is.EqualTo((4_000, GVB_unctrd))); Assert.That(prices[("20201001X002/2", "GV_")], Is.EqualTo((4_000, GVB_ungeb)));
// ohne Attribut // ohne Attribut
Assert.That(prices[("20201001X003/1", "GV_")], Is.EqualTo(( 500, WEI))); Assert.That(prices[("20201001X003/1", "GV_")], Is.EqualTo(( 500, WEI)));
// ohne Attribut // ohne Attribut
Assert.That(prices[("20201001X003/2", "GV_")], Is.EqualTo(( 500, GV_unctrd))); Assert.That(prices[("20201001X003/2", "GV_")], Is.EqualTo(( 500, GV_ungeb)));
} }
} }
[Test] [Test]
public async Task Test_02_SimpleNotStrictAreaCmts() { public async Task Test_02_SimpleNotStrictAreaComs() {
int mgnr = MgNr1, year = Year2; int mgnr = MgNr1, year = Year2;
var areaCmt = await GetMemberAreaCommitmentBuckets(year, mgnr); var areaCom = await GetMemberAreaCommitmentBuckets(year, mgnr);
using (Assert.EnterMultipleScope()) { using (Assert.EnterMultipleScope()) {
Assert.That(areaCmt, Has.Count.EqualTo(1)); Assert.That(areaCom, Has.Count.EqualTo(1));
Assert.That(areaCmt["GV"], Is.EqualTo(new AreaCmtBucket(10_000, 5_000, 10_000))); Assert.That(areaCom["GV"], Is.EqualTo(new AreaComBucket(10_000, 5_000, 10_000)));
} }
var delivery = await GetMemberDeliveryBuckets(year, mgnr); var delivery = await GetMemberDeliveryBuckets(year, mgnr);
using (Assert.EnterMultipleScope()) { using (Assert.EnterMultipleScope()) {
@@ -193,29 +193,29 @@ namespace Tests.UnitTests.HelperTests {
using (Assert.EnterMultipleScope()) { using (Assert.EnterMultipleScope()) {
Assert.That(prices, Has.Count.EqualTo(7)); Assert.That(prices, Has.Count.EqualTo(7));
// Kabinett // Kabinett
Assert.That(prices[("20211001X001/1", "GV")] , Is.EqualTo((4_000, GV_ctrd))); Assert.That(prices[("20211001X001/1", "GV")] , Is.EqualTo((4_000, GV_geb)));
// ohne Attribut // ohne Attribut
Assert.That(prices[("20211001X001/2", "GV")], Is.EqualTo((4_000, GV_ctrd))); Assert.That(prices[("20211001X001/2", "GV")], Is.EqualTo((4_000, GV_geb)));
// Bio // Bio
Assert.That(prices[("20211001X002/1", "GV_")], Is.EqualTo((4_000, GVB_unctrd))); Assert.That(prices[("20211001X002/1", "GV_")], Is.EqualTo((4_000, GVB_ungeb)));
// Bio // Bio
Assert.That(prices[("20211001X002/2", "GV_")], Is.EqualTo((2_000, GVB_unctrd))); Assert.That(prices[("20211001X002/2", "GV_")], Is.EqualTo((2_000, GVB_ungeb)));
Assert.That(prices[("20211001X002/2", "GV")], Is.EqualTo((2_000, GVB_ctrd))); Assert.That(prices[("20211001X002/2", "GV")], Is.EqualTo((2_000, GVB_geb)));
// ohne Attribut // ohne Attribut
Assert.That(prices[("20211001X003/1", "GV_")], Is.EqualTo(( 500, WEI))); Assert.That(prices[("20211001X003/1", "GV_")], Is.EqualTo(( 500, WEI)));
// ohne Attribut // ohne Attribut
Assert.That(prices[("20211001X003/2", "GV_")], Is.EqualTo(( 500, GV_unctrd))); Assert.That(prices[("20211001X003/2", "GV_")], Is.EqualTo(( 500, GV_ungeb)));
} }
} }
[Test] [Test]
public async Task Test_03_SimpleNotStrictAreaCmts_HonorContracted() { public async Task Test_03_SimpleNotStrictAreaComs_HonorGebunden() {
int mgnr = MgNr1, year = Year2; int mgnr = MgNr1, year = Year2;
var areaCmt = await GetMemberAreaCommitmentBuckets(year, mgnr); var areaCom = await GetMemberAreaCommitmentBuckets(year, mgnr);
using (Assert.EnterMultipleScope()) { using (Assert.EnterMultipleScope()) {
Assert.That(areaCmt, Has.Count.EqualTo(1)); Assert.That(areaCom, Has.Count.EqualTo(1));
Assert.That(areaCmt["GV"], Is.EqualTo(new AreaCmtBucket(10_000, 5_000, 10_000))); Assert.That(areaCom["GV"], Is.EqualTo(new AreaComBucket(10_000, 5_000, 10_000)));
} }
var delivery = await GetMemberDeliveryBuckets(year, mgnr); var delivery = await GetMemberDeliveryBuckets(year, mgnr);
using (Assert.EnterMultipleScope()) { using (Assert.EnterMultipleScope()) {
@@ -239,72 +239,72 @@ namespace Tests.UnitTests.HelperTests {
using (Assert.EnterMultipleScope()) { using (Assert.EnterMultipleScope()) {
Assert.That(prices, Has.Count.EqualTo(6)); Assert.That(prices, Has.Count.EqualTo(6));
// Kabinett // Kabinett
Assert.That(prices[("20211001X001/1", "GV")], Is.EqualTo((4_000, GV_ctrd))); Assert.That(prices[("20211001X001/1", "GV")], Is.EqualTo((4_000, GV_geb)));
// ohne Attribut // ohne Attribut
Assert.That(prices[("20211001X001/2", "GV_")], Is.EqualTo((4_000, GV_unctrd))); Assert.That(prices[("20211001X001/2", "GV_")], Is.EqualTo((4_000, GV_ungeb)));
// Bio // Bio
Assert.That(prices[("20211001X002/1", "GV")], Is.EqualTo((4_000, GVB_ctrd))); Assert.That(prices[("20211001X002/1", "GV")], Is.EqualTo((4_000, GVB_geb)));
// Bio // Bio
Assert.That(prices[("20211001X002/2", "GV_")], Is.EqualTo((4_000, GVB_unctrd))); Assert.That(prices[("20211001X002/2", "GV_")], Is.EqualTo((4_000, GVB_ungeb)));
// ohne Attribut // ohne Attribut
Assert.That(prices[("20211001X003/1", "GV_")], Is.EqualTo(( 500, WEI))); Assert.That(prices[("20211001X003/1", "GV_")], Is.EqualTo(( 500, WEI)));
// ohne Attribut // ohne Attribut
Assert.That(prices[("20211001X003/2", "GV_")], Is.EqualTo(( 500, GV_unctrd))); Assert.That(prices[("20211001X003/2", "GV_")], Is.EqualTo(( 500, GV_ungeb)));
} }
} }
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_04_ComplexNotStrictAreaCmts() { public Task Test_04_ComplexNotStrictAreaComs() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_05_ComplexNotStrictAreaCmts_HonorContracted() { public Task Test_05_ComplexNotStrictAreaComs_HonorGebunden() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_06_StrictAreaCmts_NoFillLower_NotAllowed() { public Task Test_06_StrictAreaComs_NoFillLower_NotAllowed() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_07_StrictAreaCmts_NoFillLower_Allowed() { public Task Test_07_StrictAreaComs_NoFillLower_Allowed() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_08_StrictAreaCmts_NoFillLower_Allowed_AvoidUnderDeliveries() { public Task Test_08_StrictAreaComs_NoFillLower_Allowed_AvoidUnderDeliveries() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_09_StrictAreaCmts_FillLowerUntilObligation_NotAllowed() { public Task Test_09_StrictAreaComs_FillLowerUntilObligation_NotAllowed() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_10_StrictAreaCmts_FillLowerUntilObligation_Allowed() { public Task Test_10_StrictAreaComs_FillLowerUntilObligation_Allowed() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_11_StrictAreaCmts_FillLowerUntilObligation_Allowed_AvoidUnderDeliveries() { public Task Test_11_StrictAreaComs_FillLowerUntilObligation_Allowed_AvoidUnderDeliveries() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
@@ -312,42 +312,42 @@ namespace Tests.UnitTests.HelperTests {
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_12_StrictAreaCmts_FillLowerUntilObligation_NotAllowed() { public Task Test_12_StrictAreaComs_FillLowerUntilObligation_NotAllowed() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_13_StrictAreaCmts_FillLowerUntilObligation_Allowed() { public Task Test_13_StrictAreaComs_FillLowerUntilObligation_Allowed() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_14_StrictAreaCmts_FillLowerUntilObligation_Allowed_AvoidUnderDeliveries() { public Task Test_14_StrictAreaComs_FillLowerUntilObligation_Allowed_AvoidUnderDeliveries() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_15_StrictAreaCmts_FillLowerUntilRight_NotAllowed() { public Task Test_15_StrictAreaComs_FillLowerUntilRight_NotAllowed() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_16_StrictAreaCmts_FillLowerUntilRight_Allowed() { public Task Test_16_StrictAreaComs_FillLowerUntilRight_Allowed() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
[Test] [Test]
[Ignore("Not implemented yet")] [Ignore("Not implemented yet")]
public Task Test_17_StrictAreaCmts_FillLowerUntilRight_Allowed_AvoidUnderDeliveries() { public Task Test_17_StrictAreaComs_FillLowerUntilRight_Allowed_AvoidUnderDeliveries() {
// TODO // TODO
return Task.CompletedTask; return Task.CompletedTask;
} }
@@ -93,7 +93,7 @@ namespace Tests.UnitTests.ServiceTests {
vm.UstIdNr = "ATU12345693"; vm.UstIdNr = "ATU12345693";
vm.LfbisNr = "0123498"; vm.LfbisNr = "0123498";
vm.IsAccounting = true; vm.IsBuchführend = true;
vm.IsOrganic = true; vm.IsOrganic = true;
vm.BillingName = "Neue Holding AG"; vm.BillingName = "Neue Holding AG";
@@ -107,8 +107,8 @@ namespace Tests.UnitTests.ServiceTests {
vm.Comment = "Ich bin eine Anmerkung"; vm.Comment = "Ich bin eine Anmerkung";
vm.ContactViaPost = true; vm.ContactViaPost = true;
vm.ContactViaEmail = true; vm.ContactViaEmail = true;
vm.IsFullDelivery = true; vm.IsVollLieferant = true;
vm.IsOfficer = true; vm.IsFunktionär = true;
using (var ctx = new AppDbContext()) { using (var ctx = new AppDbContext()) {
Assert.That(await ctx.FetchMembers(999).SingleOrDefaultAsync(), Is.Null); Assert.That(await ctx.FetchMembers(999).SingleOrDefaultAsync(), Is.Null);
@@ -146,7 +146,7 @@ namespace Tests.UnitTests.ServiceTests {
Assert.That(m.UstIdNr, Is.EqualTo("ATU12345693")); Assert.That(m.UstIdNr, Is.EqualTo("ATU12345693"));
Assert.That(m.LfbisNr, Is.EqualTo("0123498")); Assert.That(m.LfbisNr, Is.EqualTo("0123498"));
Assert.That(m.IsAccounting, Is.True); Assert.That(m.IsBuchführend, Is.True);
Assert.That(m.IsOrganic, Is.True); Assert.That(m.IsOrganic, Is.True);
Assert.That(m.BillingAddress, Is.Not.Null); Assert.That(m.BillingAddress, Is.Not.Null);
@@ -161,8 +161,8 @@ namespace Tests.UnitTests.ServiceTests {
Assert.That(m.Comment, Is.EqualTo("Ich bin eine Anmerkung")); Assert.That(m.Comment, Is.EqualTo("Ich bin eine Anmerkung"));
Assert.That(m.ContactViaPost, Is.True); Assert.That(m.ContactViaPost, Is.True);
Assert.That(m.ContactViaEmail, Is.True); Assert.That(m.ContactViaEmail, Is.True);
Assert.That(m.IsFullDelivery, Is.True); Assert.That(m.IsVollLieferant, Is.True);
Assert.That(m.IsOfficer, Is.True); Assert.That(m.IsFunktionär, Is.True);
} }
vm = new MemberAdminViewModel(); vm = new MemberAdminViewModel();
@@ -194,7 +194,7 @@ namespace Tests.UnitTests.ServiceTests {
Assert.That(vm.UstIdNr, Is.EqualTo("ATU12345693")); Assert.That(vm.UstIdNr, Is.EqualTo("ATU12345693"));
Assert.That(vm.LfbisNr, Is.EqualTo("0123498")); Assert.That(vm.LfbisNr, Is.EqualTo("0123498"));
Assert.That(vm.IsAccounting, Is.True); Assert.That(vm.IsBuchführend, Is.True);
Assert.That(vm.IsOrganic, Is.True); Assert.That(vm.IsOrganic, Is.True);
Assert.That(vm.BillingName, Is.EqualTo("Neue Holding AG")); Assert.That(vm.BillingName, Is.EqualTo("Neue Holding AG"));
@@ -208,8 +208,8 @@ namespace Tests.UnitTests.ServiceTests {
Assert.That(vm.Comment, Is.EqualTo("Ich bin eine Anmerkung")); Assert.That(vm.Comment, Is.EqualTo("Ich bin eine Anmerkung"));
Assert.That(vm.ContactViaPost, Is.True); Assert.That(vm.ContactViaPost, Is.True);
Assert.That(vm.ContactViaEmail, Is.True); Assert.That(vm.ContactViaEmail, Is.True);
Assert.That(vm.IsFullDelivery, Is.True); Assert.That(vm.IsVollLieferant, Is.True);
Assert.That(vm.IsOfficer, Is.True); Assert.That(vm.IsFunktionär, Is.True);
} }
} }