Elwig: Rename AreaCom to AreaCmt
This commit is contained in:
+3
-3
@@ -673,7 +673,7 @@ Changelog
|
|||||||
* Im Auszahlungsvarianten-Fenster (`PaymentVariantsWindow`) wird der Auszahlungsbetrag für nicht-festgesetzte Varianten nun überschlagsmäßig angezeigt. (913129f155)
|
* Im Auszahlungsvarianten-Fenster (`PaymentVariantsWindow`) wird der Auszahlungsbetrag für nicht-festgesetzte Varianten nun überschlagsmäßig angezeigt. (913129f155)
|
||||||
* Wenn eine Variante im Auszahlungsvariante-Fenster (`ChartWindow`) gespeichert wird, wird sie nun automatisch auch berechnet. (c6c8fd9b68)
|
* Wenn eine Variante im Auszahlungsvariante-Fenster (`ChartWindow`) gespeichert wird, wird sie nun automatisch auch berechnet. (c6c8fd9b68)
|
||||||
* Überall wo Weinsorten vorkommen werden diese jetzt rot oder grün eingefärbt angezeigt. ([#61][i61])
|
* Überall wo Weinsorten vorkommen werden diese jetzt rot oder grün eingefärbt angezeigt. ([#61][i61])
|
||||||
* Das Flächenbindungs-Fenster (`AreaComAdminWindow`) wurde überarbeitet. (53d82604a1, 267aa3d47c, [#64][i64])
|
* Das Flächenbindungs-Fenster (`AreaCmtAdminWindow`) wurde überarbeitet. (53d82604a1, 267aa3d47c, [#64][i64])
|
||||||
* Auf allen Dokumenten wird der Bio-Kontrollstellen-Code in der Fußzeile angeführt (sofern dieser in den Stammdaten gesetzt wurde). (fad1e28c06)
|
* Auf allen Dokumenten wird der Bio-Kontrollstellen-Code in der Fußzeile angeführt (sofern dieser in den Stammdaten gesetzt wurde). (fad1e28c06)
|
||||||
|
|
||||||
### Behobene Fehler {#v1.0.0.0-bugfixes}
|
### Behobene Fehler {#v1.0.0.0-bugfixes}
|
||||||
@@ -821,7 +821,7 @@ Changelog
|
|||||||
|
|
||||||
* In allen Fenstern an passenden Stellen Symbole/Icons hinzugefügt. (f4fa549130)
|
* In allen Fenstern an passenden Stellen Symbole/Icons hinzugefügt. (f4fa549130)
|
||||||
* Im Mitglieder-Fenster (`MemberAdminWindow`) Filter `Flächenbindung` (Mitglieder mit irgendeiner aktiven Flächenbindung) hinzugefügt. (a1d84dd988)
|
* Im Mitglieder-Fenster (`MemberAdminWindow`) Filter `Flächenbindung` (Mitglieder mit irgendeiner aktiven Flächenbindung) hinzugefügt. (a1d84dd988)
|
||||||
* Im Flächenbindungen-Fenster (`AreaComAdminWindow`) Filter für explizite Saisons hinzugefügt. (6718ad4c8d)
|
* Im Flächenbindungen-Fenster (`AreaCmtAdminWindow`) Filter für explizite Saisons hinzugefügt. (6718ad4c8d)
|
||||||
|
|
||||||
[v0.13.3]: https://git.necronda.net/winzer/elwig/releases/tag/v0.13.3
|
[v0.13.3]: https://git.necronda.net/winzer/elwig/releases/tag/v0.13.3
|
||||||
|
|
||||||
@@ -1064,7 +1064,7 @@ Changelog
|
|||||||
|
|
||||||
### Behobene Fehler {#v0.10.6-bugfixes}
|
### Behobene Fehler {#v0.10.6-bugfixes}
|
||||||
|
|
||||||
* Der Titel des Flächenbindungen-Fensters (`AreaComAdminWindow`) ist jetzt _Flächenbindungen_, nicht mehr _Lieferungen_. (ee1315929c)
|
* Der Titel des Flächenbindungen-Fensters (`AreaCmtAdminWindow`) ist jetzt _Flächenbindungen_, nicht mehr _Lieferungen_. (ee1315929c)
|
||||||
* Im Auszahlungsvariante-Fenster (`ChartWindow`) einen Skalierungs-Fehler behoben. ([#33][i33])
|
* Im Auszahlungsvariante-Fenster (`ChartWindow`) einen Skalierungs-Fehler behoben. ([#33][i33])
|
||||||
* Versuch: Fehler bei automatischer Daten-Erneuerung bei längerer Benutzung. (8c8c0a8c2b)
|
* Versuch: Fehler bei automatischer Daten-Erneuerung bei längerer Benutzung. (8c8c0a8c2b)
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -394,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 AreaComAdminWindow FocusMemberAreaComs(int mgnr) {
|
public static AreaCmtAdminWindow FocusMemberAreaCmts(int mgnr) {
|
||||||
return FocusWindow<AreaComAdminWindow>(() => new(mgnr), w => w.ViewModel.FilterMember.MgNr == mgnr);
|
return FocusWindow<AreaCmtAdminWindow>(() => 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 FocusBaseDataAreaComType() {
|
public static BaseDataWindow FocusBaseDataAreaCmtType() {
|
||||||
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.AreaComModifyDialog"
|
<Window x:Class="Elwig.Dialogs.AreaCmtModifyDialog"
|
||||||
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"
|
||||||
+2
-2
@@ -4,7 +4,7 @@ using System.Windows;
|
|||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
|
|
||||||
namespace Elwig.Dialogs {
|
namespace Elwig.Dialogs {
|
||||||
public partial class AreaComModifyDialog : Window {
|
public partial class AreaCmtModifyDialog : 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 AreaComModifyDialog(int? yearFrom, int? yearTo, int area, bool delete, bool forceRetroactive = false) {
|
public AreaCmtModifyDialog(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.AreaComTransferDialog"
|
<Window x:Class="Elwig.Dialogs.AreaCmtTransferDialog"
|
||||||
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 AreaComNum}"/> FB, <Run Text="{Binding Area}"/> m²)
|
übernommen werden? (<Run Text="{Binding AreaCmtNum}"/> 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 AreaComNum}"/> FB, <Run Text="{Binding Area}"/> m²)
|
Sollen die aktiven Flächenbindungen gekündigt werden? (<Run Text="{Binding AreaCmtNum}"/> 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"
|
||||||
+6
-6
@@ -3,17 +3,17 @@ using System.Windows;
|
|||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
|
|
||||||
namespace Elwig.Dialogs {
|
namespace Elwig.Dialogs {
|
||||||
public partial class AreaComTransferDialog : Window {
|
public partial class AreaCmtTransferDialog : Window {
|
||||||
|
|
||||||
public int CancelSeason => SuccessorSeason - 1;
|
public int CancelSeason => SuccessorSeason - 1;
|
||||||
public int SuccessorSeason { get; set; }
|
public int SuccessorSeason { get; set; }
|
||||||
|
|
||||||
public string AreaComNum { get; set; }
|
public string AreaCmtNum { get; set; }
|
||||||
public string Area { get; set; }
|
public string Area { get; set; }
|
||||||
|
|
||||||
public AreaComTransferDialog(string name, int areaComNum, int area) {
|
public AreaCmtTransferDialog(string name, int areaCmtNum, int area) {
|
||||||
SuccessorSeason = Utils.FollowingSeason;
|
SuccessorSeason = Utils.FollowingSeason;
|
||||||
AreaComNum = $"{areaComNum:N0}";
|
AreaCmtNum = $"{areaCmtNum: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 AreaComTransferDialog(string name, string successorName, int areaComNum, int area) {
|
public AreaCmtTransferDialog(string name, string successorName, int areaCmtNum, int area) {
|
||||||
SuccessorSeason = Utils.FollowingSeason;
|
SuccessorSeason = Utils.FollowingSeason;
|
||||||
AreaComNum = $"{areaComNum:N0}";
|
AreaCmtNum = $"{areaCmtNum:N0}";
|
||||||
Area = $"{area:N0}";
|
Area = $"{area:N0}";
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
SeasonInput.Text = $"{SuccessorSeason}";
|
SeasonInput.Text = $"{SuccessorSeason}";
|
||||||
@@ -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="AreaComInput" Content="Flächenbindungen" Margin="40,145,0,0"
|
<CheckBox x:Name="AreaCmtInput" Content="Flächenbindungen" Margin="40,145,0,0"
|
||||||
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
|
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
|
||||||
IsChecked="{Binding DeleteAreaComs}"/>
|
IsChecked="{Binding DeleteAreaCmts}"/>
|
||||||
<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}"/>
|
||||||
|
|||||||
@@ -8,16 +8,16 @@ namespace Elwig.Dialogs {
|
|||||||
|
|
||||||
protected string[] NameParts;
|
protected string[] NameParts;
|
||||||
|
|
||||||
public bool DeleteAreaComs { get; set; }
|
public bool DeleteAreaCmts { 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 numAreaComs, int numDeliveries, int numCredits) {
|
public DeleteMemberDialog(int mgnr, string name, int numAreaCmts, 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;
|
||||||
AreaComInput.IsEnabled = numAreaComs != 0;
|
AreaCmtInput.IsEnabled = numAreaCmts != 0;
|
||||||
AreaComInput.Content += $" ({numAreaComs:N0})";
|
AreaCmtInput.Content += $" ({numAreaCmts: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(AreaComInput);
|
UpdateCheckBox(AreaCmtInput);
|
||||||
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 =
|
||||||
(!AreaComInput.IsEnabled || DeleteAreaComs) &&
|
(!AreaCmtInput.IsEnabled || DeleteAreaCmts) &&
|
||||||
(!DeliveryInput.IsEnabled || DeleteDeliveries) &&
|
(!DeliveryInput.IsEnabled || DeleteDeliveries) &&
|
||||||
(!PaymentInput.IsEnabled || DeletePaymentData) &&
|
(!PaymentInput.IsEnabled || DeletePaymentData) &&
|
||||||
nameValid;
|
nameValid;
|
||||||
|
|||||||
@@ -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<AreaCom> ActiveAreaCommitments = [];
|
public List<AreaCmt> 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,7 +68,7 @@ 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(NewAreaComTable(ActiveAreaCommitments));
|
doc.Add(NewAreaCmtTable(ActiveAreaCommitments));
|
||||||
}
|
}
|
||||||
if (App.Client.EnableMemberHistory) {
|
if (App.Client.EnableMemberHistory) {
|
||||||
bool firstOnPage = false;
|
bool firstOnPage = false;
|
||||||
@@ -177,10 +177,10 @@ namespace Elwig.Documents {
|
|||||||
return tbl;
|
return tbl;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Table NewAreaComTable(IEnumerable<AreaCom> activeAreaComs) {
|
protected Table NewAreaCmtTable(IEnumerable<AreaCmt> activeAreaCmts) {
|
||||||
var areaComs = activeAreaComs.GroupBy(a => a.AreaComType).Select(group => new {
|
var areaCmts = activeAreaCmts.GroupBy(a => a.AreaCmtType).Select(group => new {
|
||||||
Type = group.Key,
|
Type = group.Key,
|
||||||
AreaComs = group.OrderBy(c => c.Contract.Kg.AtKg.Name).ToList(),
|
AreaCmts = 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 areaComs) {
|
foreach (var contractType in areaCmts) {
|
||||||
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 areaCom in contractType.AreaComs) {
|
foreach (var areaCmt in contractType.AreaCmts) {
|
||||||
var c = areaCom.Contract;
|
var c = areaCmt.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(areaCom.GstNr.Replace(",", ", ").Replace("-", "\u2013"), @"\s+", " "), 10))
|
.AddCell(NewTd(Regex.Replace(areaCmt.GstNr.Replace(",", ", ").Replace("-", "\u2013"), @"\s+", " "), 10))
|
||||||
.AddCell(NewTd($"{areaCom.Area:N0}", right: true))
|
.AddCell(NewTd($"{areaCmt.Area:N0}", right: true))
|
||||||
.AddCell(NewTd(areaCom.WineCult?.Name, center: true))
|
.AddCell(NewTd(areaCmt.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($"{activeAreaComs.Sum(a => a.Area):N0}", 12, colspan: 2, right: true, 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(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;
|
||||||
|
|||||||
@@ -16,14 +16,14 @@ namespace Elwig.Documents {
|
|||||||
public string Filter;
|
public string Filter;
|
||||||
public List<MemberListRow> Members;
|
public List<MemberListRow> Members;
|
||||||
|
|
||||||
public string[] AreaComFilters;
|
public string[] AreaCmtFilters;
|
||||||
public bool FilterAreaComs => AreaComFilters.Length > 0;
|
public bool FilterAreaCmts => AreaCmtFilters.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];
|
||||||
AreaComFilters = [..members
|
AreaCmtFilters = [..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(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)
|
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)
|
||||||
.SetWidth(UnitValue.CreatePercentValue(100)).SetFixedLayout()
|
.SetWidth(UnitValue.CreatePercentValue(100)).SetFixedLayout()
|
||||||
.SetBorderCollapse(BorderCollapsePropertyValue.COLLAPSE);
|
.SetBorderCollapse(BorderCollapsePropertyValue.COLLAPSE);
|
||||||
|
|
||||||
var headerSpan = FilterAreaComs ? 3 : 2;
|
var headerSpan = FilterAreaCmts ? 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: FilterAreaComs ? AreaComFilters.Length : 1));
|
.AddHeaderCell(NewTh("Geb. Fl.", colspan: FilterAreaCmts ? AreaCmtFilters.Length : 1));
|
||||||
if (FilterAreaComs) {
|
if (FilterAreaCmts) {
|
||||||
foreach (var vtrgId in AreaComFilters) {
|
foreach (var vtrgId in AreaCmtFilters) {
|
||||||
tbl.AddHeaderCell(NewTh(vtrgId));
|
tbl.AddHeaderCell(NewTh(vtrgId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int i = 0; i < (FilterAreaComs ? AreaComFilters.Length : 1); i++) {
|
for (int i = 0; i < (FilterAreaCmts ? AreaCmtFilters.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(AreaComFilters.Length, 1)).SetHeightMM(5).SetKeepWithNext(true));
|
tbl.AddCell(NewCell(colspan: 8 + Math.Max(AreaCmtFilters.Length, 1)).SetHeightMM(5).SetKeepWithNext(true));
|
||||||
tbl.AddCell(NewCell(new KernedParagraph(m.Branch ?? "", 16).SetFont(BF), colspan: 8 + Math.Max(AreaComFilters.Length, 1))
|
tbl.AddCell(NewCell(new KernedParagraph(m.Branch ?? "", 16).SetFont(BF), colspan: 8 + Math.Max(AreaCmtFilters.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 (AreaComFilters.Length > 0) {
|
if (AreaCmtFilters.Length > 0) {
|
||||||
foreach (var v in AreaComFilters) {
|
foreach (var v in AreaCmtFilters) {
|
||||||
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(AreaComFilters.Length, 1)));
|
.AddCell(NewTd(colspan: 3 + Math.Max(AreaCmtFilters.Length, 1)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,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 AreaComBucket(int Area, int Obligation, int Right);
|
public record struct AreaCmtBucket(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);
|
||||||
@@ -43,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<AreaComType> AreaCommitmentTypes { get; private set; }
|
public DbSet<AreaCmtType> 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<AreaComContract> AreaCommitmentContracts { get; private set; }
|
public DbSet<AreaCmtContract> AreaCommitmentContracts { get; private set; }
|
||||||
public DbSet<AreaCom> AreaCommitments { get; private set; }
|
public DbSet<AreaCmt> 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; }
|
||||||
@@ -67,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<AreaComUnderDeliveryRowSingle> AreaComUnderDeliveryRows { get; private set; }
|
public DbSet<AreaCmtUnderDeliveryRowSingle> AreaCmtUnderDeliveryRows { get; private set; }
|
||||||
public DbSet<MemberDeliveryPerVarietyRowSingle> MemberDeliveryPerVariantRows { get; private set; }
|
public DbSet<MemberDeliveryPerVarietyRowSingle> MemberDeliveryPerVariantRows { get; private set; }
|
||||||
public DbSet<MemberAreaComTotalsRowSingle> MemberAreaComTotalsRows { get; private set; }
|
public DbSet<MemberAreaCmtTotalsRowSingle> MemberAreaCmtTotalsRows { get; private set; }
|
||||||
public DbSet<MemberAreaComsRow> MemberAreaComsRows { get; private set; }
|
public DbSet<MemberAreaCmtsRow> MemberAreaCmtsRows { 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; }
|
||||||
@@ -132,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<AreaCom>> _compiledQueryAreaCommitments =
|
private static readonly Func<AppDbContext, int?, IAsyncEnumerable<AreaCmt>> _compiledQueryAreaCommitments =
|
||||||
EF.CompileAsyncQuery<AppDbContext, int?, AreaCom>((ctx, fbnr) => ctx.AreaCommitments
|
EF.CompileAsyncQuery<AppDbContext, int?, AreaCmt>((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));
|
||||||
|
|
||||||
@@ -149,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, AreaComBucket>>> _memberAreaCommitmentBuckets = [];
|
private readonly Dictionary<int, Dictionary<int, Dictionary<string, AreaCmtBucket>>> _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 = [];
|
||||||
@@ -229,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<AreaComContract>().Navigation(c => c.Kg).AutoInclude();
|
modelBuilder.Entity<AreaCmtContract>().Navigation(c => c.Kg).AutoInclude();
|
||||||
modelBuilder.Entity<AreaComContract>().Navigation(c => c.Rd).AutoInclude();
|
modelBuilder.Entity<AreaCmtContract>().Navigation(c => c.Rd).AutoInclude();
|
||||||
modelBuilder.Entity<AreaCom>().Navigation(c => c.Contract).AutoInclude();
|
modelBuilder.Entity<AreaCmt>().Navigation(c => c.Contract).AutoInclude();
|
||||||
modelBuilder.Entity<AreaCom>().Navigation(c => c.WineCult).AutoInclude();
|
modelBuilder.Entity<AreaCmt>().Navigation(c => c.WineCult).AutoInclude();
|
||||||
modelBuilder.Entity<AreaCom>().Navigation(c => c.AreaComType).AutoInclude();
|
modelBuilder.Entity<AreaCmt>().Navigation(c => c.AreaCmtType).AutoInclude();
|
||||||
modelBuilder.Entity<AreaComType>().Navigation(c => c.WineVar).AutoInclude();
|
modelBuilder.Entity<AreaCmtType>().Navigation(c => c.WineVar).AutoInclude();
|
||||||
modelBuilder.Entity<AreaComType>().Navigation(c => c.WineAttr).AutoInclude();
|
modelBuilder.Entity<AreaCmtType>().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();
|
||||||
@@ -438,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, AreaComBucket>>();
|
var buckets = new Dictionary<int, Dictionary<string, AreaCmtBucket>>();
|
||||||
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();
|
||||||
@@ -531,7 +531,7 @@ namespace Elwig.Helpers {
|
|||||||
return _memberHistory[year].GetValueOrDefault(mgnr, new());
|
return _memberHistory[year].GetValueOrDefault(mgnr, new());
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Dictionary<string, AreaComBucket>> GetMemberAreaCommitmentBuckets(int year, int mgnr, SqliteConnection? cnx = null) {
|
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, []);
|
||||||
|
|||||||
@@ -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?)> AreaComTypes;
|
protected readonly Dictionary<string, (string, string?, string?, int?, decimal?)> AreaCmtTypes;
|
||||||
|
|
||||||
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?)> areaComTypes
|
Dictionary<string, (string, string?, string?, int?, decimal?)> areaCmtTypes
|
||||||
) {
|
) {
|
||||||
Year = year;
|
Year = year;
|
||||||
Season = season;
|
Season = season;
|
||||||
Attributes = attributes;
|
Attributes = attributes;
|
||||||
Modifiers = modifiers;
|
Modifiers = modifiers;
|
||||||
AreaComTypes = areaComTypes;
|
AreaCmtTypes = areaCmtTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
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 areaComTypes = ctx.AreaCommitmentTypes.ToDictionary(v => v.VtrgId, v => (v.SortId, v.AttrId, v.Discriminator, v.MinKgPerHa, v.PenaltyAmount));
|
var areaCmtTypes = ctx.AreaCommitmentTypes.ToDictionary(v => v.VtrgId, v => (v.SortId, v.AttrId, v.Discriminator, v.MinKgPerHa, v.PenaltyAmount));
|
||||||
return (season, attributes, modifiers, areaComTypes);
|
return (season, attributes, modifiers, areaCmtTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
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, areaComTypes) = await LoadData(ctx, year);
|
var (season, attributes, modifiers, areaCmtTypes) = await LoadData(ctx, year);
|
||||||
return new Billing(year, season, attributes, modifiers, areaComTypes);
|
return new Billing(year, season, attributes, modifiers, areaCmtTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task FinishSeason() {
|
public async Task FinishSeason() {
|
||||||
@@ -115,7 +115,7 @@ namespace Elwig.Helpers.Billing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int lastMgNr = 0;
|
int lastMgNr = 0;
|
||||||
Dictionary<string, AreaComBucket>? rightsAndObligations = null;
|
Dictionary<string, AreaCmtBucket>? 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, contracted) in deliveries) {
|
||||||
if (lastMgNr != mgnr) {
|
if (lastMgNr != mgnr) {
|
||||||
@@ -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 AreaComBucket value)) {
|
if (rightsAndObligations.TryGetValue(key, out AreaCmtBucket 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));
|
||||||
|
|||||||
@@ -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?)> areaComTypes,
|
Dictionary<string, (string, string?, string?, int?, decimal?)> areaCmtTypes,
|
||||||
PaymentVar paymentVar, PaymentBillingData data) :
|
PaymentVar paymentVar, PaymentBillingData data) :
|
||||||
base(year, season, attributes, modifiers, areaComTypes) {
|
base(year, season, attributes, modifiers, areaCmtTypes) {
|
||||||
AvNr = avnr;
|
AvNr = avnr;
|
||||||
PaymentVariant = paymentVar;
|
PaymentVariant = paymentVar;
|
||||||
Data = data;
|
Data = data;
|
||||||
@@ -32,9 +32,9 @@ 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, areaComTypes) = await LoadData(ctx, year);
|
var (season, attributes, modifiers, areaCmtTypes) = 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, areaComTypes, paymentVar, data);
|
return new BillingVariant(year, avnr, season, attributes, modifiers, areaCmtTypes, 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? honorContracted = null, bool? allowAttrsIntoLower = null, bool? avoidUnderDeliveries = null) {
|
||||||
@@ -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 AttrAreaCom)>();
|
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)>();
|
||||||
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)
|
||||||
@@ -197,8 +197,8 @@ namespace Elwig.Helpers.Billing {
|
|||||||
continue;
|
continue;
|
||||||
var unctrd = part.Discr == "_";
|
var unctrd = part.Discr == "_";
|
||||||
var payAttrId = (part.Discr is "" or "_") ? null : part.Discr;
|
var payAttrId = (part.Discr is "" or "_") ? null : part.Discr;
|
||||||
var attrId = part.AttrAreaCom ? payAttrId : part.AttrId;
|
var attrId = part.AttrAreaCmt ? payAttrId : part.AttrId;
|
||||||
var ctrd = !unctrd && (payAttrId == attrId || !part.AttrAreaCom);
|
var ctrd = !unctrd && (payAttrId == attrId || !part.AttrAreaCmt);
|
||||||
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, ctrd, part.Oe, part.Kmw);
|
||||||
|
|||||||
@@ -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<AreaCom> AreaCommitments,
|
List<AreaCmt> AreaCommitments,
|
||||||
List<AreaComContract> Contracts,
|
List<AreaCmtContract> 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? AreaComNum, string? AreaComFilters,
|
int? AreaCmtNum, string? AreaCmtFilters,
|
||||||
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 areaComCount = meta!["area_commitment_contracts"]?["count"]?.AsValue().GetValue<int>();
|
var areaCmtCount = meta!["area_commitment_contracts"]?["count"]?.AsValue().GetValue<int>();
|
||||||
var areaComFilters = meta!["area_commitment_contracts"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
|
var areaCmtFilters = 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,
|
||||||
areaComCount, areaComFilters != null ? string.Join(" / ", areaComFilters) : null,
|
areaCmtCount, areaCmtFilters != null ? string.Join(" / ", areaCmtFilters) : 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 areaComsJson = zip.GetEntry("area_commitments.json");
|
var areaCmtsJson = zip.GetEntry("area_commitments.json");
|
||||||
if (areaComsJson != null) {
|
if (areaCmtsJson != null) {
|
||||||
using var reader = new StreamReader(areaComsJson.Open(), Utils.UTF8);
|
using var reader = new StreamReader(areaCmtsJson.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, areaCom, wbrd, timestamps) = obj.ToAreaCom(kgs, currentWbKgs, currentWbRde);
|
var (contract, areaCmt, wbrd, timestamps) = obj.ToAreaCmt(kgs, currentWbKgs, currentWbRde);
|
||||||
r.Contracts.Add(contract);
|
r.Contracts.Add(contract);
|
||||||
r.AreaCommitments.Add(areaCom);
|
r.AreaCommitments.Add(areaCmt);
|
||||||
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((areaCom.FbNr, areaCom.RevNr, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt));
|
r.Timestamps["area_commitment"].Add((areaCmt.FbNr, areaCmt.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, areaComs, wbrd, timestamps) = obj.ToAreaComContract(kgs, currentWbKgs, currentWbRde);
|
var (contract, areaCmts, wbrd, timestamps) = obj.ToAreaCmtContract(kgs, currentWbKgs, currentWbRde);
|
||||||
r.Contracts.Add(contract);
|
r.Contracts.Add(contract);
|
||||||
r.AreaCommitments.AddRange(areaComs.Select(v => v.Item1));
|
r.AreaCommitments.AddRange(areaCmts.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 (areaCom, ts) in areaComs) {
|
foreach (var (areaCmt, ts) in areaCmts) {
|
||||||
if (!ts.HasValue) continue;
|
if (!ts.HasValue) continue;
|
||||||
r.Timestamps["area_commitment"].Add((areaCom.FbNr, areaCom.RevNr, 0, ts.Value.CreatedAt, ts.Value.ModifiedAt));
|
r.Timestamps["area_commitment"].Add((areaCmt.FbNr, areaCmt.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 importedAreaComs = 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 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;
|
||||||
importedAreaComs.Add((meta.FileName, meta.ZwstId, meta.Device, n, o, contracts.Count - n - o, meta.AreaComFilters));
|
importedAreaCmts.Add((meta.FileName, meta.ZwstId, meta.Device, n, o, contracts.Count - n - o, meta.AreaCmtFilters));
|
||||||
}
|
}
|
||||||
|
|
||||||
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: {importedAreaComs.Sum(d => d.New + d.Overwritten)}",
|
$"Flächenbindungen: {importedAreaCmts.Sum(d => d.New + d.Overwritten)}",
|
||||||
..importedAreaComs.Select(d =>
|
..importedAreaCmts.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<AreaComContract> areaComs, IEnumerable<WbKg> wbKgs, IEnumerable<string> filters) {
|
public static Task Export(string filename, IEnumerable<Member> members, IEnumerable<MemberHistory> history, IEnumerable<AreaCmtContract> areaCmts, 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"]),
|
||||||
AreaComs = (areaComs, ["von exportierten Mitgliedern"]),
|
AreaCmts = (areaCmts, ["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<AreaComContract> AreaComs, IEnumerable<string> Filters)? AreaComs { get; set; }
|
public (IEnumerable<AreaCmtContract> AreaCmts, IEnumerable<string> Filters)? AreaCmts { 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 (AreaComs != null)
|
if (AreaCmts != null)
|
||||||
obj["area_commitment_contracts"] = new JsonObject {
|
obj["area_commitment_contracts"] = new JsonObject {
|
||||||
["count"] = AreaComs.Value.AreaComs.Count(),
|
["count"] = AreaCmts.Value.AreaCmts.Count(),
|
||||||
["revisions"] = AreaComs.Value.AreaComs.Sum(c => c.Revisions.Count),
|
["revisions"] = AreaCmts.Value.AreaCmts.Sum(c => c.Revisions.Count),
|
||||||
["filters"] = new JsonArray(AreaComs.Value.Filters.Select(f => (JsonNode)f).ToArray()),
|
["filters"] = new JsonArray(AreaCmts.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 (AreaComs != null) {
|
if (AreaCmts != 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 AreaComs.Value.AreaComs) {
|
foreach (var c in AreaCmts.Value.AreaCmts) {
|
||||||
await writer.WriteLineAsync(c.ToJson().ToJsonString(Utils.JsonOpts));
|
await writer.WriteLineAsync(c.ToJson().ToJsonString(Utils.JsonOpts));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -796,7 +796,7 @@ namespace Elwig.Helpers.Export {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JsonObject ToJson(this AreaComContract c) {
|
public static JsonObject ToJson(this AreaCmtContract 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 AreaCom c) {
|
private static JsonObject ToJson(this AreaCmt 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 (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) {
|
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) {
|
||||||
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 AreaComContract {
|
return (new AreaCmtContract {
|
||||||
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, (AreaCom, (DateTime, DateTime)?)>(r => {
|
}, [.. json["revisions"]!.AsArray().Select(r => r!.AsObject()).Select<JsonObject, (AreaCmt, (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 AreaCom {
|
return (new AreaCmt {
|
||||||
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 (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) {
|
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) {
|
||||||
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 AreaComContract {
|
return (new AreaCmtContract {
|
||||||
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 AreaCom {
|
}, new AreaCmt {
|
||||||
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>(),
|
||||||
|
|||||||
@@ -662,16 +662,16 @@ namespace Elwig.Helpers {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Expression<Func<AreaCom, bool>> ActiveAreaCommitments() => ActiveAreaCommitments(CurrentYear);
|
public static Expression<Func<AreaCmt, bool>> ActiveAreaCommitments() => ActiveAreaCommitments(CurrentYear);
|
||||||
public static Expression<Func<AreaCom, bool>> ActiveAreaCommitments(int year) =>
|
public static Expression<Func<AreaCmt, 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<AreaCom> ActiveAreaCommitments(IQueryable<AreaCom> query) => ActiveAreaCommitments(query, CurrentYear);
|
public static IQueryable<AreaCmt> ActiveAreaCommitments(IQueryable<AreaCmt> query) => ActiveAreaCommitments(query, CurrentYear);
|
||||||
public static IQueryable<AreaCom> ActiveAreaCommitments(IQueryable<AreaCom> query, int year) =>
|
public static IQueryable<AreaCmt> ActiveAreaCommitments(IQueryable<AreaCmt> query, int year) =>
|
||||||
query.Where(ActiveAreaCommitments(year));
|
query.Where(ActiveAreaCommitments(year));
|
||||||
|
|
||||||
public static IEnumerable<AreaCom> ActiveAreaCommitments(IEnumerable<AreaCom> query) => ActiveAreaCommitments(query, CurrentYear);
|
public static IEnumerable<AreaCmt> ActiveAreaCommitments(IEnumerable<AreaCmt> query) => ActiveAreaCommitments(query, CurrentYear);
|
||||||
public static IEnumerable<AreaCom> ActiveAreaCommitments(IEnumerable<AreaCom> query, int year) =>
|
public static IEnumerable<AreaCmt> ActiveAreaCommitments(IEnumerable<AreaCmt> 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) {
|
||||||
|
|||||||
@@ -577,7 +577,7 @@ namespace Elwig.Helpers {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ValidationResult CheckFbNr(TextBox input, bool required, AreaComContract? c) {
|
public static ValidationResult CheckFbNr(TextBox input, bool required, AreaCmtContract? c) {
|
||||||
var res = CheckInteger(input, required);
|
var res = CheckInteger(input, required);
|
||||||
if (!res.IsValid) {
|
if (!res.IsValid) {
|
||||||
return res;
|
return res;
|
||||||
|
|||||||
+9
-9
@@ -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 AreaComUnderDeliveryData : DataTable<AreaComUnderDeliveryRow> {
|
public class AreaCmtUnderDeliveryData : DataTable<AreaCmtUnderDeliveryRow> {
|
||||||
|
|
||||||
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 AreaComUnderDeliveryData(IEnumerable<AreaComUnderDeliveryRow> rows, int year) :
|
public AreaCmtUnderDeliveryData(IEnumerable<AreaCmtUnderDeliveryRow> 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<AreaComUnderDeliveryData> ForSeason(DbSet<AreaComUnderDeliveryRowSingle> table, int year) {
|
public static async Task<AreaCmtUnderDeliveryData> ForSeason(DbSet<AreaCmtUnderDeliveryRowSingle> table, int year) {
|
||||||
return new AreaComUnderDeliveryData(
|
return new AreaCmtUnderDeliveryData(
|
||||||
(await FromDbSet(table, year)).GroupBy(
|
(await FromDbSet(table, year)).GroupBy(
|
||||||
r => r.MgNr,
|
r => r.MgNr,
|
||||||
(k, g) => new AreaComUnderDeliveryRow(g)
|
(k, g) => new AreaCmtUnderDeliveryRow(g)
|
||||||
), year);
|
), year);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<IEnumerable<AreaComUnderDeliveryRowSingle>> FromDbSet(DbSet<AreaComUnderDeliveryRowSingle> table, int year) {
|
private static async Task<IEnumerable<AreaCmtUnderDeliveryRowSingle>> FromDbSet(DbSet<AreaCmtUnderDeliveryRowSingle> 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 AreaComUnderDeliveryRow {
|
public class AreaCmtUnderDeliveryRow {
|
||||||
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 AreaComUnderDeliveryRow(IEnumerable<AreaComUnderDeliveryRowSingle> rows) {
|
public AreaCmtUnderDeliveryRow(IEnumerable<AreaCmtUnderDeliveryRowSingle> 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 AreaComUnderDeliveryRowSingle {
|
public class AreaCmtUnderDeliveryRowSingle {
|
||||||
[Column("mgnr")]
|
[Column("mgnr")]
|
||||||
public int MgNr { get; set; }
|
public int MgNr { get; set; }
|
||||||
[Column("name_1")]
|
[Column("name_1")]
|
||||||
+9
-9
@@ -5,7 +5,7 @@ using System.Linq;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Elwig.Models.Dtos {
|
namespace Elwig.Models.Dtos {
|
||||||
class MemberAreaComTotalsData : DataTable<MemberAreaComTotalsRow> {
|
class MemberAreaCmtTotalsData : DataTable<MemberAreaCmtTotalsRow> {
|
||||||
|
|
||||||
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 MemberAreaComTotalsData(IEnumerable<MemberAreaComTotalsRow> rows, int year) :
|
public MemberAreaCmtTotalsData(IEnumerable<MemberAreaCmtTotalsRow> 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<MemberAreaComTotalsData> ForSeason(DbSet<MemberAreaComTotalsRowSingle> table, int year) {
|
public static async Task<MemberAreaCmtTotalsData> ForSeason(DbSet<MemberAreaCmtTotalsRowSingle> table, int year) {
|
||||||
return new MemberAreaComTotalsData(
|
return new MemberAreaCmtTotalsData(
|
||||||
(await FromDbSet(table, year)).GroupBy(
|
(await FromDbSet(table, year)).GroupBy(
|
||||||
r => r.MgNr,
|
r => r.MgNr,
|
||||||
(k, g) => new MemberAreaComTotalsRow(g)
|
(k, g) => new MemberAreaCmtTotalsRow(g)
|
||||||
), year);
|
), year);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<IEnumerable<MemberAreaComTotalsRowSingle>> FromDbSet(DbSet<MemberAreaComTotalsRowSingle> table, int year) {
|
private static async Task<IEnumerable<MemberAreaCmtTotalsRowSingle>> FromDbSet(DbSet<MemberAreaCmtTotalsRowSingle> 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 MemberAreaComTotalsRow {
|
public class MemberAreaCmtTotalsRow {
|
||||||
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 MemberAreaComTotalsRow(IEnumerable<MemberAreaComTotalsRowSingle> rows) {
|
public MemberAreaCmtTotalsRow(IEnumerable<MemberAreaCmtTotalsRowSingle> 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 MemberAreaComTotalsRowSingle {
|
public class MemberAreaCmtTotalsRowSingle {
|
||||||
[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 MemberAreaComsData : DataTable<MemberAreaComsRow> {
|
class MemberAreaCmtsData : DataTable<MemberAreaCmtsRow> {
|
||||||
|
|
||||||
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 MemberAreaComsData(IEnumerable<MemberAreaComsRow> rows, int year) :
|
public MemberAreaCmtsData(IEnumerable<MemberAreaCmtsRow> rows, int year) :
|
||||||
base($"Flächenbindungen", $"Flächenbindungen pro Mitglied {year}", rows, FieldNames) {
|
base($"Flächenbindungen", $"Flächenbindungen pro Mitglied {year}", rows, FieldNames) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<MemberAreaComsData> ForSeason(DbSet<MemberAreaComsRow> table, int year) {
|
public static async Task<MemberAreaCmtsData> ForSeason(DbSet<MemberAreaCmtsRow> table, int year) {
|
||||||
return new MemberAreaComsData(await FromDbSet(table, year), year);
|
return new MemberAreaCmtsData(await FromDbSet(table, year), year);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<IEnumerable<MemberAreaComsRow>> FromDbSet(DbSet<MemberAreaComsRow> table, int year) {
|
private static async Task<IEnumerable<MemberAreaCmtsRow>> FromDbSet(DbSet<MemberAreaCmtsRow> 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 MemberAreaComsRow {
|
public class MemberAreaCmtsRow {
|
||||||
[Column("mgnr")]
|
[Column("mgnr")]
|
||||||
public int MgNr { get; set; }
|
public int MgNr { get; set; }
|
||||||
[Column("name_1")]
|
[Column("name_1")]
|
||||||
@@ -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> filterAreaCom) {
|
public static async Task<MemberListData> FromQuery(IQueryable<Member> query, List<string> filterNames, IEnumerable<string> filterAreaCmt) {
|
||||||
var areaComs = await query.Include(m => m.AreaCommitments).ToDictionaryAsync(m => m.MgNr, m => Utils.ActiveAreaCommitments(m.AreaCommitments));
|
var areaCmts = 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,
|
||||||
areaComs[m.MgNr].Sum(c => c.Area),
|
areaCmts[m.MgNr].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)))),
|
areaCmts[m.MgNr].Where(c => filterAreaCmt.Contains(c.VtrgId)).GroupBy(c => c.VtrgId).ToDictionary(g => g.Key, g => g.Sum(c => c.Area)))),
|
||||||
filterNames);
|
filterNames);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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? areaCom = null, Dictionary<string, int>? filtered = null) {
|
public MemberListRow(Member m, int? areaCmt = null, Dictionary<string, int>? filtered = null) {
|
||||||
MgNr = m.MgNr;
|
MgNr = m.MgNr;
|
||||||
Name1 = m.Name;
|
Name1 = m.Name;
|
||||||
AdminName1 = m.AdministrativeName1;
|
AdminName1 = m.AdministrativeName1;
|
||||||
@@ -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 = areaCom == 0 ? null : areaCom;
|
AreaCommitment = areaCmt == 0 ? null : areaCmt;
|
||||||
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() : [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 AreaCom {
|
public class AreaCmt {
|
||||||
[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 AreaComContract Contract { get; private set; } = null!;
|
public virtual AreaCmtContract 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 AreaComType AreaComType { get; private set; } = null!;
|
public virtual AreaCmtType AreaCmtType { 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 AreaComContract {
|
public class AreaCmtContract {
|
||||||
[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(AreaCom.Contract))]
|
[InverseProperty(nameof(AreaCmt.Contract))]
|
||||||
public virtual ICollection<AreaCom> Revisions { get; private set; } = null!;
|
public virtual ICollection<AreaCmt> Revisions { get; private set; } = null!;
|
||||||
|
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
public AreaCom? Latest => Revisions.OrderBy(r => r.RevNr).LastOrDefault();
|
public AreaCmt? 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 AreaComType {
|
public class AreaCmtType {
|
||||||
[Column("vtrgid")]
|
[Column("vtrgid")]
|
||||||
public required string VtrgId { get; set; }
|
public required string VtrgId { 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(AreaCom.Member))]
|
[InverseProperty(nameof(AreaCmt.Member))]
|
||||||
public virtual ICollection<AreaCom> AreaCommitments { get; private set; } = null!;
|
public virtual ICollection<AreaCmt> AreaCommitments { get; private set; } = null!;
|
||||||
|
|
||||||
public IQueryable<AreaCom> ActiveAreaCommitments(AppDbContext ctx, int? year = null) {
|
public IQueryable<AreaCmt> 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 AreaComService {
|
public static class AreaCmtService {
|
||||||
|
|
||||||
public static async Task InitInputs(this AreaComAdminViewModel vm) {
|
public static async Task InitInputs(this AreaCmtAdminViewModel 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 AreaComAdminViewModel vm) {
|
public static void ClearInputs(this AreaCmtAdminViewModel vm) {
|
||||||
vm.Period = null;
|
vm.Period = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void FillInputs(this AreaComAdminViewModel vm, AreaComContract c) {
|
public static void FillInputs(this AreaCmtAdminViewModel vm, AreaCmtContract 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 AreaComAdminViewModel vm, AreaCom a) {
|
public static void FillInputs(this AreaCmtAdminViewModel vm, AreaCmt 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.AreaComType = ControlUtils.GetItemFromSourceWithPk(vm.AreaComTypeSource, a.VtrgId) as AreaComType;
|
vm.AreaCmtType = ControlUtils.GetItemFromSourceWithPk(vm.AreaCmtTypeSource, a.VtrgId) as AreaCmtType;
|
||||||
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<AreaComContract>, IQueryable<AreaCom>, List<string>)> GetFilters(this AreaComAdminViewModel vm, AppDbContext ctx) {
|
public static async Task<(List<string>, IQueryable<AreaCmtContract>, IQueryable<AreaCmt>, List<string>)> GetFilters(this AreaCmtAdminViewModel vm, AppDbContext ctx) {
|
||||||
List<string> filterNames = [];
|
List<string> filterNames = [];
|
||||||
IQueryable<AreaCom> areaComQuery = ctx.AreaCommitments.Where(a => a.MgNr == vm.FilterMember.MgNr).OrderBy(a => a.FbNr);
|
IQueryable<AreaCmt> areaCmtQuery = 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) {
|
||||||
areaComQuery = Utils.ActiveAreaCommitments(areaComQuery, season);
|
areaCmtQuery = Utils.ActiveAreaCommitments(areaCmtQuery, season);
|
||||||
filterNames.Add($"laufend {season}");
|
filterNames.Add($"laufend {season}");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,37 +96,37 @@ namespace Elwig.Services {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filterVar.Count > 0) areaComQuery = areaComQuery.Where(a => filterVar.Contains(a.AreaComType.WineVar.SortId));
|
if (filterVar.Count > 0) areaCmtQuery = areaCmtQuery.Where(a => filterVar.Contains(a.AreaCmtType.WineVar.SortId));
|
||||||
if (filterNotVar.Count > 0) areaComQuery = areaComQuery.Where(a => !filterNotVar.Contains(a.AreaComType.WineVar.SortId));
|
if (filterNotVar.Count > 0) areaCmtQuery = areaCmtQuery.Where(a => !filterNotVar.Contains(a.AreaCmtType.WineVar.SortId));
|
||||||
if (filterAttr.Count > 0) areaComQuery = areaComQuery.Where(a => a.AreaComType.WineAttr!.AttrId != null && filterAttr.Contains(a.AreaComType.WineAttr.AttrId));
|
if (filterAttr.Count > 0) areaCmtQuery = areaCmtQuery.Where(a => a.AreaCmtType.WineAttr!.AttrId != null && filterAttr.Contains(a.AreaCmtType.WineAttr.AttrId));
|
||||||
if (filterNotAttr.Count > 0) areaComQuery = areaComQuery.Where(a => a.AreaComType.WineAttr!.AttrId == null || !filterNotAttr.Contains(a.AreaComType.WineAttr.AttrId));
|
if (filterNotAttr.Count > 0) areaCmtQuery = areaCmtQuery.Where(a => a.AreaCmtType.WineAttr!.AttrId == null || !filterNotAttr.Contains(a.AreaCmtType.WineAttr.AttrId));
|
||||||
}
|
}
|
||||||
|
|
||||||
IQueryable<AreaComContract> contracts = areaComQuery
|
IQueryable<AreaCmtContract> contracts = areaCmtQuery
|
||||||
.Select(c => c.Contract).Distinct()
|
.Select(c => c.Contract).Distinct()
|
||||||
.OrderBy(c => c.FbNr);
|
.OrderBy(c => c.FbNr);
|
||||||
|
|
||||||
return (filterNames, contracts, areaComQuery, filter);
|
return (filterNames, contracts, areaCmtQuery, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<(int FbNr, int RevNr)> UpdateAreaCommitment(this AreaComAdminViewModel vm, int? oldFbNr, int? revNr) {
|
public static async Task<(int FbNr, int RevNr)> UpdateAreaCommitment(this AreaCmtAdminViewModel 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 AreaComContract {
|
var c = new AreaCmtContract {
|
||||||
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 AreaCom {
|
var a = new AreaCmt {
|
||||||
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.AreaComType!.VtrgId,
|
VtrgId = vm.AreaCmtType!.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<AreaCom> areaComs, int maxKgPerHa) {
|
public static async Task<(string, (string?, string?, int, int?, int?)[])> GenerateToolTipData(IQueryable<AreaCmt> areaCmts, 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 areaComs.SumAsync(p => p.Area);
|
var area = await areaCmts.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 areaComs.AnyAsync()) {
|
if (await areaCmts.AnyAsync()) {
|
||||||
var attrGroups = await areaComs
|
var attrGroups = await areaCmts
|
||||||
.Where(c => c.AreaComType.WineAttr != null)
|
.Where(c => c.AreaCmtType.WineAttr != null)
|
||||||
.GroupBy(c => c.AreaComType.WineAttr!.Name)
|
.GroupBy(c => c.AreaCmtType.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.AreaComType.MinKgPerHa ?? 0) / 10_000),
|
Min = g.Sum(c => c.Area * (c.AreaCmtType.MinKgPerHa ?? 0) / 10_000),
|
||||||
Max = g.Sum(c => c.Area * (c.AreaComType.WineAttr!.MaxKgPerHa ?? maxKgPerHa) / 10_000),
|
Max = g.Sum(c => c.Area * (c.AreaCmtType.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 areaComs
|
var groups = await areaCmts
|
||||||
.Where(c => c.AreaComType.WineAttr != null)
|
.Where(c => c.AreaCmtType.WineAttr != null)
|
||||||
.GroupBy(c => new {
|
.GroupBy(c => new {
|
||||||
Attr = c.AreaComType.WineAttr!.Name,
|
Attr = c.AreaCmtType.WineAttr!.Name,
|
||||||
c.AreaComType.SortId,
|
c.AreaCmtType.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.AreaComType.MinKgPerHa ?? 0) / 10_000),
|
Min = g.Sum(c => c.Area * (c.AreaCmtType.MinKgPerHa ?? 0) / 10_000),
|
||||||
Max = g.Sum(c => c.Area * (c.AreaComType.WineAttr!.MaxKgPerHa ?? maxKgPerHa) / 10_000),
|
Max = g.Sum(c => c.Area * (c.AreaCmtType.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 areaComs
|
var noAttr = await areaCmts
|
||||||
.Where(c => c.AreaComType.WineAttr == null || !c.AreaComType.WineAttr.IsStrict)
|
.Where(c => c.AreaCmtType.WineAttr == null || !c.AreaCmtType.WineAttr.IsStrict)
|
||||||
.GroupBy(c => c.AreaComType.SortId)
|
.GroupBy(c => c.AreaCmtType.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.AreaComType.MinKgPerHa ?? 0) / 10_000),
|
Min = g.Sum(c => c.Area * (c.AreaCmtType.MinKgPerHa ?? 0) / 10_000),
|
||||||
Max = g.Sum(c => c.Area * (c.AreaComType.WineAttr!.MaxKgPerHa ?? maxKgPerHa) / 10_000),
|
Max = g.Sum(c => c.Area * (c.AreaCmtType.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 DeleteAreaCom(int fbnr) {
|
public static async Task DeleteAreaCmt(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 DeleteAreaComRevision(int fbnr, int revnr) {
|
public static async Task DeleteAreaCmtRevision(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))!;
|
||||||
@@ -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 AreaComService.GenerateToolTipData(c, maxKgPerHa);
|
var (text, gridData) = await AreaCmtService.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 = AreaComService.GenerateToolTip(gridData);
|
var grid = AreaCmtService.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 filterAreaCom = new List<string>();
|
var filterAreaCmt = new List<string>();
|
||||||
var filterNotAreaCom = new List<string>();
|
var filterNotAreaCmt = 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 areaComs = await ctx.AreaCommitmentTypes.ToDictionaryAsync(t => $"{t.SortId}{t.AttrId}", t => t);
|
var areaCmts = 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];
|
||||||
@@ -434,19 +434,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)) {
|
||||||
filterAreaCom.AddRange(areaComs.Keys);
|
filterAreaCmt.AddRange(areaCmts.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)) {
|
||||||
filterNotAreaCom.AddRange(areaComs.Keys);
|
filterNotAreaCmt.AddRange(areaCmts.Keys);
|
||||||
filter.RemoveAt(i--);
|
filter.RemoveAt(i--);
|
||||||
filterNames.Add($"keine Flächenbindung");
|
filterNames.Add($"keine Flächenbindung");
|
||||||
} else if (areaComs.ContainsKey(e.ToUpper())) {
|
} else if (areaCmts.ContainsKey(e.ToUpper())) {
|
||||||
filterAreaCom.Add(e.ToUpper());
|
filterAreaCmt.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] == '!' && areaComs.ContainsKey(e[1..].ToUpper())) {
|
} else if (e.Length >= 3 && e[0] == '!' && areaCmts.ContainsKey(e[1..].ToUpper())) {
|
||||||
filterNotAreaCom.Add(e[1..].ToUpper());
|
filterNotAreaCmt.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 +467,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 (filterAreaCom.Count > 0) memberQuery = memberQuery.Where(m => m.AreaCommitments.AsQueryable().Where(Utils.ActiveAreaCommitments(Utils.CurrentLastSeason)).Any(c => filterAreaCom.Contains(c.VtrgId)));
|
if (filterAreaCmt.Count > 0) memberQuery = memberQuery.Where(m => m.AreaCommitments.AsQueryable().Where(Utils.ActiveAreaCommitments(Utils.CurrentLastSeason)).Any(c => filterAreaCmt.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 (filterNotAreaCmt.Count > 0) memberQuery = memberQuery.Where(m => !m.AreaCommitments.AsQueryable().Where(Utils.ActiveAreaCommitments(Utils.CurrentLastSeason)).All(c => filterNotAreaCmt.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 +585,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 areaComs = await query
|
var areaCmts = 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 +593,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(areaComs.Select(c => c.Kg))
|
.Union(areaCmts.Select(c => c.Kg))
|
||||||
.Distinct()
|
.Distinct()
|
||||||
.OrderBy(k => k.KgNr)
|
.OrderBy(k => k.KgNr)
|
||||||
.ToList();
|
.ToList();
|
||||||
await ElwigData.Export(filename, members, history, areaComs, wbKgs, filterNames);
|
await ElwigData.Export(filename, members, history, areaCmts, wbKgs, filterNames);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else if (mode == ExportMode.Upload && App.Config.SyncUrl != null) {
|
} else if (mode == ExportMode.Upload && App.Config.SyncUrl != null) {
|
||||||
@@ -700,12 +700,12 @@ namespace Elwig.Services {
|
|||||||
|
|
||||||
await ctx.SaveChangesAsync();
|
await ctx.SaveChangesAsync();
|
||||||
|
|
||||||
if (vm.TransferPredecessorAreaComs is int year && m.PredecessorMgNr is int predecessor) {
|
if (vm.TransferPredecessorAreaCmts is int year && m.PredecessorMgNr is int predecessor) {
|
||||||
var areaComs = await ctx.AreaCommitments
|
var areaCmts = 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(areaComs.Select(async (c, i) => new AreaCom {
|
ctx.AddRange(await Task.WhenAll(areaCmts.Select(async (c, i) => new AreaCmt {
|
||||||
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 +717,24 @@ namespace Elwig.Services {
|
|||||||
YearTo = c.YearTo,
|
YearTo = c.YearTo,
|
||||||
})));
|
})));
|
||||||
|
|
||||||
foreach (var ac in areaComs)
|
foreach (var ac in areaCmts)
|
||||||
ac.YearTo = year - 1;
|
ac.YearTo = year - 1;
|
||||||
ctx.UpdateRange(areaComs);
|
ctx.UpdateRange(areaCmts);
|
||||||
await ctx.SaveChangesAsync();
|
await ctx.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
vm.TransferPredecessorAreaComs = null;
|
vm.TransferPredecessorAreaCmts = null;
|
||||||
|
|
||||||
if (vm.CancelAreaComs is int yearTo) {
|
if (vm.CancelAreaCmts is int yearTo) {
|
||||||
var areaComs = await ctx.AreaCommitments
|
var areaCmts = 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 areaComs)
|
foreach (var ac in areaCmts)
|
||||||
ac.YearTo = yearTo;
|
ac.YearTo = yearTo;
|
||||||
ctx.UpdateRange(areaComs);
|
ctx.UpdateRange(areaCmts);
|
||||||
await ctx.SaveChangesAsync();
|
await ctx.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
vm.CancelAreaComs = null;
|
vm.CancelAreaCmts = 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 +744,7 @@ namespace Elwig.Services {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task DeleteMember(int mgnr, bool deletePaymentData, bool deleteDeliveries, bool deleteAreaComs) {
|
public static async Task DeleteMember(int mgnr, bool deletePaymentData, bool deleteDeliveries, bool deleteAreaCmts) {
|
||||||
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 +755,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 (deleteAreaComs) {
|
if (deleteAreaCmts) {
|
||||||
await ctx.AreaCommitments.Where(c => c.MgNr == mgnr).ExecuteDeleteAsync();
|
await ctx.AreaCommitments.Where(c => c.MgNr == mgnr).ExecuteDeleteAsync();
|
||||||
}
|
}
|
||||||
ctx.Remove(l);
|
ctx.Remove(l);
|
||||||
|
|||||||
@@ -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<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<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<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 areaComs = await query
|
var areaCmts = 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(areaComs.Select(c => c.Kg))
|
.Union(areaCmts.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, areaComs, wbKgs, filterNames);
|
await ElwigData.Export(path, members, history, areaCmts, wbKgs, filterNames);
|
||||||
await Utils.UploadExportData(path, url, username, password);
|
await Utils.UploadExportData(path, url, username, password);
|
||||||
await UpdateExportedAt(members, areaComs, [], exportedAt);
|
await UpdateExportedAt(members, areaCmts, [], 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<AreaComContract> areaComs;
|
List<AreaCmtContract> areaCmts;
|
||||||
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();
|
||||||
areaComs = await ctx.AreaCommitmentContracts
|
areaCmts = await ctx.AreaCommitmentContracts
|
||||||
.Where(ChangedAreaComContracts)
|
.Where(ChangedAreaCmtContracts)
|
||||||
.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(areaComs.Select(c => c.Kg))
|
.Union(areaCmts.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"]),
|
||||||
AreaComs = (areaComs, ["geändert seit letztem Export"]),
|
AreaCmts = (areaCmts, ["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, areaComs, deliveries, exportedAt);
|
await UpdateExportedAt(members, areaCmts, deliveries, exportedAt);
|
||||||
InteractionService.ShowInformation("Mitglieder und Lieferungen hochladen", $"Hochladen von {members.Count:N0} Mitgliedern, {areaComs.Count:N0} Flächenbindungsverträgen, und {deliveries.Count:N0} Lieferungen erfolgreich!");
|
InteractionService.ShowInformation("Mitglieder und Lieferungen hochladen", $"Hochladen von {members.Count:N0} Mitgliedern, {areaCmts.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<AreaComContract> contracts, IEnumerable<Delivery> deliveries, DateTime dateTime) {
|
private static async Task UpdateExportedAt(IEnumerable<Member> member, IEnumerable<AreaCmtContract> 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(ChangedAreaComContracts).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(ChangedAreaCmtContracts).AnyAsync() || await ctx.Deliveries.Where(ChangedDeliveries).AnyAsync() || (Utils.HasInternetConnectivity() && (await GetFilesToImport(url, username, password)).Count > 0);
|
||||||
} catch {
|
} catch {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -5,7 +5,7 @@ using System.Linq;
|
|||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
|
|
||||||
namespace Elwig.ViewModels {
|
namespace Elwig.ViewModels {
|
||||||
public partial class AreaComAdminViewModel : ObservableObject {
|
public partial class AreaCmtAdminViewModel : 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 AreaComType? AreaComType { get; set; }
|
public partial AreaCmtType? AreaCmtType { get; set; }
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public partial IEnumerable<AreaComType> AreaComTypeSource { get; set; } = [];
|
public partial IEnumerable<AreaCmtType> AreaCmtTypeSource { get; set; } = [];
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public partial object? WineCultObj { get; set; }
|
public partial object? WineCultObj { get; set; }
|
||||||
public WineCult? WineCult {
|
public WineCult? WineCult {
|
||||||
@@ -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? TransferPredecessorAreaComs { get; set; } = null;
|
public int? TransferPredecessorAreaCmts { get; set; } = null;
|
||||||
public int? CancelAreaComs { get; set; } = null;
|
public int? CancelAreaCmts { 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);
|
||||||
|
|
||||||
|
|||||||
@@ -608,8 +608,8 @@ namespace Elwig.Windows {
|
|||||||
InputLostFocus((TextBox)sender, Validator.CheckUpperCase);
|
InputLostFocus((TextBox)sender, Validator.CheckUpperCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void AreaComTypeDetailsButton_Click(object sender, RoutedEventArgs? evt) {
|
protected void AreaCmtTypeDetailsButton_Click(object sender, RoutedEventArgs? evt) {
|
||||||
App.FocusBaseDataAreaComType();
|
App.FocusBaseDataAreaCmtType();
|
||||||
}
|
}
|
||||||
|
|
||||||
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.AreaComAdminWindow"
|
x:Class="Elwig.Windows.AreaCmtAdminWindow"
|
||||||
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:AreaComAdminViewModel/>
|
<vm:AreaCmtAdminViewModel/>
|
||||||
</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.AreaComType.VtrgId}" Width="50">
|
<DataGridTextColumn Header="Sorte" Binding="{Binding Latest.AreaCmtType.VtrgId}" Width="50">
|
||||||
<DataGridTextColumn.CellStyle>
|
<DataGridTextColumn.CellStyle>
|
||||||
<Style>
|
<Style>
|
||||||
<Setter Property="TextBlock.Foreground" Value="{Binding Latest.AreaComType.WineVar.Color}"/>
|
<Setter Property="TextBlock.Foreground" Value="{Binding Latest.AreaCmtType.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="–" TextAlignment="Center" Margin="0,0,0,0"/>
|
<TextBlock Text="–" 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 AreaComType.WineVar.Color}"/>
|
<TextBlock Text="{Binding VtrgId}" Width="40" TextAlignment="Center" Foreground="{Binding AreaCmtType.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="AreaComTypeInput" SelectedItem="{Binding AreaComType, Mode=TwoWay}" ItemsSource="{Binding AreaComTypeSource, Mode=TwoWay}"
|
<ComboBox x:Name="AreaCmtTypeInput" SelectedItem="{Binding AreaCmtType, Mode=TwoWay}" ItemsSource="{Binding AreaCmtTypeSource, 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="AreaComTypeDetailsButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0"
|
<Button x:Name="AreaCmtTypeDetailsButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0"
|
||||||
Click="AreaComTypeDetailsButton_Click"
|
Click="AreaCmtTypeDetailsButton_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"/>
|
||||||
+38
-38
@@ -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 AreaComAdminWindow : AdministrationWindow {
|
public partial class AreaCmtAdminWindow : AdministrationWindow {
|
||||||
|
|
||||||
public AreaComAdminViewModel ViewModel => (AreaComAdminViewModel)DataContext;
|
public AreaCmtAdminViewModel ViewModel => (AreaCmtAdminViewModel)DataContext;
|
||||||
|
|
||||||
private readonly RoutedCommand CtrlF = new("CtrlF", typeof(AreaComAdminWindow), [new KeyGesture(Key.F, ModifierKeys.Control)]);
|
private readonly RoutedCommand CtrlF = new("CtrlF", typeof(AreaCmtAdminWindow), [new KeyGesture(Key.F, ModifierKeys.Control)]);
|
||||||
|
|
||||||
public AreaComAdminWindow(int mgnr) {
|
public AreaCmtAdminWindow(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, AreaComTypeInput, WineCultivationInput
|
GstNrInput, AreaInput, AreaCmtTypeInput, 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, areaComs, areaComCount, stat) = await Task.Run(async () => {
|
var (filterNames, filter, contracts, areaCmts, areaCmtCount, stat) = await Task.Run(async () => {
|
||||||
using var ctx = new AppDbContext();
|
using var ctx = new AppDbContext();
|
||||||
var (filterNames, contractQuery, areaComQuery, filter) = await vm.GetFilters(ctx);
|
var (filterNames, contractQuery, areaCmtQuery, 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 areaComs = await areaComQuery.ToListAsync();
|
var areaCmts = await areaCmtQuery.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 areaComCount = await areaComQuery.CountAsync();
|
var areaCmtCount = await areaCmtQuery.CountAsync();
|
||||||
var season = await ctx.FetchSeasons().FirstOrDefaultAsync();
|
var season = await ctx.FetchSeasons().FirstOrDefaultAsync();
|
||||||
var stat = await AreaComService.GenerateToolTipData(areaComQuery, season?.MaxKgPerHa ?? 10_000);
|
var stat = await AreaCmtService.GenerateToolTipData(areaCmtQuery, season?.MaxKgPerHa ?? 10_000);
|
||||||
|
|
||||||
return (filterNames, filter, contracts, areaComs, areaComCount, stat);
|
return (filterNames, filter, contracts, areaCmts, areaCmtCount, 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 = $"{areaComCount:N0}";
|
ViewModel.StatusAreaCommitments = $"{areaCmtCount:N0}";
|
||||||
var (text, gridData) = stat;
|
var (text, gridData) = stat;
|
||||||
ViewModel.StatusArea = text;
|
ViewModel.StatusArea = text;
|
||||||
ViewModel.StatusAreaToolTip = AreaComService.GenerateToolTip(gridData);
|
ViewModel.StatusAreaToolTip = AreaCmtService.GenerateToolTip(gridData);
|
||||||
} else {
|
} else {
|
||||||
ViewModel.StatusAreaCommitments = $"{contracts.Count:N0}";
|
ViewModel.StatusAreaCommitments = $"{contracts.Count:N0}";
|
||||||
ViewModel.StatusArea = $"{areaComs.Sum(a => a.Area):N0} m²";
|
ViewModel.StatusArea = $"{areaCmts.Sum(a => a.Area):N0} m²";
|
||||||
ViewModel.StatusAreaToolTip = null;
|
ViewModel.StatusAreaToolTip = null;
|
||||||
}
|
}
|
||||||
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();
|
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();
|
||||||
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 AreaComContract c) {
|
if (AreaCommitmentList.SelectedItem is AreaCmtContract 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 AreaCom a) {
|
if (RevisionList.SelectedItem is AreaCmt a) {
|
||||||
EditAreaCommitmentButton.IsEnabled = true;
|
EditAreaCommitmentButton.IsEnabled = true;
|
||||||
DeleteAreaCommitmentButton.IsEnabled = true;
|
DeleteAreaCommitmentButton.IsEnabled = true;
|
||||||
FillInputs(a);
|
FillInputs(a);
|
||||||
} else if (AreaCommitmentList.SelectedItem is AreaComContract c) {
|
} else if (AreaCommitmentList.SelectedItem is AreaCmtContract 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(AreaComContract c) {
|
private void FillInputs(AreaCmtContract c) {
|
||||||
ClearOriginalValues();
|
ClearOriginalValues();
|
||||||
ClearDefaultValues();
|
ClearDefaultValues();
|
||||||
ViewModel.FillInputs(c);
|
ViewModel.FillInputs(c);
|
||||||
FinishInputFilling();
|
FinishInputFilling();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FillInputs(AreaCom a) {
|
private void FillInputs(AreaCmt 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(AreaComTypeInput, await ctx.AreaCommitmentTypes
|
ControlUtils.RenewItemsSource(AreaCmtTypeInput, 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 AreaCom a)
|
if (RevisionList.SelectedItem is not AreaCmt a)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, true, RevisionList.ItemsSource.Cast<object>().FirstOrDefault() != a);
|
var d = new AreaCmtModifyDialog(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 AreaComService.DeleteAreaCom(a.FbNr);
|
await AreaCmtService.DeleteAreaCmt(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(AreaComTypeInput) || InputHasChanged(MgNrInput)) {
|
if (InputHasChanged(AreaInput) || InputHasChanged(AreaCmtTypeInput) || InputHasChanged(MgNrInput)) {
|
||||||
var a = (RevisionList.SelectedItem as AreaCom)!;
|
var a = (RevisionList.SelectedItem as AreaCmt)!;
|
||||||
var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, false, RevisionList.ItemsSource.Cast<object>().FirstOrDefault() != a);
|
var d = new AreaCmtModifyDialog(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 {
|
||||||
AreaCom? temp = null;
|
AreaCmt? temp = null;
|
||||||
if (yearTo != null && (!ViewModel.YearTo.HasValue || yearTo < ViewModel.YearTo)) {
|
if (yearTo != null && (!ViewModel.YearTo.HasValue || yearTo < ViewModel.YearTo)) {
|
||||||
temp = new AreaCom {
|
temp = new AreaCmt {
|
||||||
MgNr = ViewModel.MgNr!.Value,
|
MgNr = ViewModel.MgNr!.Value,
|
||||||
YearFrom = ViewModel.YearFrom,
|
YearFrom = ViewModel.YearFrom,
|
||||||
YearTo = ViewModel.YearTo,
|
YearTo = ViewModel.YearTo,
|
||||||
VtrgId = ViewModel.AreaComType!.VtrgId,
|
VtrgId = ViewModel.AreaCmtType!.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 AreaComContract)?.FbNr, (RevisionList.SelectedItem as AreaCom)?.RevNr);
|
(fbnr, revnr) = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaCmtContract)?.FbNr, (RevisionList.SelectedItem as AreaCmt)?.RevNr);
|
||||||
if (temp is AreaCom t) {
|
if (temp is AreaCmt t) {
|
||||||
t.YearFrom = yearTo + 1;
|
t.YearFrom = yearTo + 1;
|
||||||
ViewModel.FillInputs(t);
|
ViewModel.FillInputs(t);
|
||||||
(fbnr, revnr) = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaComContract)?.FbNr, null);
|
(fbnr, revnr) = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaCmtContract)?.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 AreaCom c) {
|
if (RevisionList.SelectedItem is AreaCmt 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, AreaComContract?, ValidationResult> checker) {
|
protected void InputTextChanged(TextBox input, Func<TextBox, bool, AreaCmtContract?, ValidationResult> checker) {
|
||||||
InputTextChanged(input, checker(input, SenderIsRequired(input), (AreaComContract)AreaCommitmentList.SelectedItem));
|
InputTextChanged(input, checker(input, SenderIsRequired(input), (AreaCmtContract)AreaCommitmentList.SelectedItem));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void InputLostFocus(TextBox input, Func<TextBox, bool, AreaComContract?, ValidationResult> checker, string? msg = null) {
|
protected void InputLostFocus(TextBox input, Func<TextBox, bool, AreaCmtContract?, ValidationResult> checker, string? msg = null) {
|
||||||
InputLostFocus(input, checker(input, SenderIsRequired(input), (AreaComContract)AreaCommitmentList.SelectedItem), msg);
|
InputLostFocus(input, checker(input, SenderIsRequired(input), (AreaCmtContract)AreaCommitmentList.SelectedItem), msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FbNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void FbNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
@@ -566,7 +566,7 @@
|
|||||||
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"/>
|
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
<GroupBox x:Name="ParameterAreaComGroup" Header="Berechnung Flächenbindungen (aktuelle Saison)" Margin="10,10,10,0" VerticalAlignment="Top">
|
<GroupBox x:Name="ParameterAreaCmtGroup" 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) "schlechtere" Flächenbindungen aufzuteilen"
|
<CheckBox x:Name="ParameterAllowAttrIntoLowerInput" Content="Erlauben Lieferungen auch auf (konfigurierte) "schlechtere" Flächenbindungen aufzuteilen"
|
||||||
VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,10,10,10"
|
VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,10,10,10"
|
||||||
|
|||||||
@@ -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<AreaComType, string>? _actIds = null;
|
private Dictionary<AreaCmtType, string>? _actIds = null;
|
||||||
private ObservableCollection<AreaComType>? _actList = null;
|
private ObservableCollection<AreaCmtType>? _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 AreaComType type) {
|
if (AreaCommitmentTypeList.SelectedItem is AreaCmtType 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 AreaComType { VtrgId = "", SortId = "" };
|
var item = new AreaCmtType { 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 AreaComType attr || _acts == null || _actIds == null) return;
|
if (_actUpdate || (!IsEditing && !IsCreating) || AreaCommitmentTypeList.SelectedItem is not AreaCmtType attr || _acts == null || _actIds == null) return;
|
||||||
_actChanged = true;
|
_actChanged = true;
|
||||||
|
|
||||||
var v = AreaCommitmentTypeWineVariantInput.SelectedItem as WineVar;
|
var v = AreaCommitmentTypeWineVariantInput.SelectedItem as WineVar;
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace Elwig.Windows {
|
|||||||
];
|
];
|
||||||
WineAttributeFillLowerInput.Visibility = Visibility.Hidden;
|
WineAttributeFillLowerInput.Visibility = Visibility.Hidden;
|
||||||
WineAttributeFillLowerLabel.Visibility = Visibility.Hidden;
|
WineAttributeFillLowerLabel.Visibility = Visibility.Hidden;
|
||||||
ParameterAreaComGroup.Header = ParameterAreaComGroup.Header.ToString()!.Split('(')[0] + $"({Utils.CurrentLastSeason})";
|
ParameterAreaCmtGroup.Header = ParameterAreaCmtGroup.Header.ToString()!.Split('(')[0] + $"({Utils.CurrentLastSeason})";
|
||||||
LockInputs();
|
LockInputs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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="RecipientsAreaComMembersInput" Content="Mitglieder mit Flächenbindung"
|
<RadioButton GroupName="Recipients" x:Name="RecipientsAreaCmtMembersInput" 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"
|
||||||
@@ -178,8 +178,8 @@
|
|||||||
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="MemberAreaComLabel" Margin="10,280,0,10"/>
|
<Label Content="Vtrg.:" x:Name="MemberAreaCmtLabel" Margin="10,280,0,10"/>
|
||||||
<ctrl:CheckComboBox x:Name="MemberAreaComInput" AllItemsSelectedContent="Alle Vertragsarten" Delimiter=", " DisplayMemberPath="VtrgId"
|
<ctrl:CheckComboBox x:Name="MemberAreaCmtInput" 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"/>
|
||||||
|
|||||||
@@ -181,13 +181,13 @@ namespace Elwig.Windows {
|
|||||||
MemberKgInput.SelectAll();
|
MemberKgInput.SelectAll();
|
||||||
MemberKgInput.SelectionChanged += MemberInput_SelectionChanged;
|
MemberKgInput.SelectionChanged += MemberInput_SelectionChanged;
|
||||||
}
|
}
|
||||||
ControlUtils.RenewItemsSource(MemberAreaComInput, await ctx.AreaCommitmentTypes
|
ControlUtils.RenewItemsSource(MemberAreaCmtInput, await ctx.AreaCommitmentTypes
|
||||||
.OrderBy(a => a.VtrgId)
|
.OrderBy(a => a.VtrgId)
|
||||||
.ToListAsync(), MemberInput_SelectionChanged);
|
.ToListAsync(), MemberInput_SelectionChanged);
|
||||||
if (MemberAreaComInput.SelectedItems.Count == 0) {
|
if (MemberAreaCmtInput.SelectedItems.Count == 0) {
|
||||||
MemberAreaComInput.SelectionChanged -= MemberInput_SelectionChanged;
|
MemberAreaCmtInput.SelectionChanged -= MemberInput_SelectionChanged;
|
||||||
MemberAreaComInput.SelectAll();
|
MemberAreaCmtInput.SelectAll();
|
||||||
MemberAreaComInput.SelectionChanged += MemberInput_SelectionChanged;
|
MemberAreaCmtInput.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)
|
||||||
@@ -412,8 +412,8 @@ namespace Elwig.Windows {
|
|||||||
MemberOfficerYesInput.Visibility = vis;
|
MemberOfficerYesInput.Visibility = vis;
|
||||||
MemberOfficerNoInput.Visibility = vis;
|
MemberOfficerNoInput.Visibility = vis;
|
||||||
MemberOfficerIndifferentInput.Visibility = vis;
|
MemberOfficerIndifferentInput.Visibility = vis;
|
||||||
MemberAreaComInput.Visibility = RecipientsAreaComMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden;
|
MemberAreaCmtInput.Visibility = RecipientsAreaCmtMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden;
|
||||||
MemberAreaComLabel.Visibility = RecipientsAreaComMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden;
|
MemberAreaCmtLabel.Visibility = RecipientsAreaCmtMembersInput.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;
|
||||||
@@ -465,8 +465,8 @@ namespace Elwig.Windows {
|
|||||||
query = query.Where(m => !m.IsOfficer);
|
query = query.Where(m => !m.IsOfficer);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RecipientsAreaComMembersInput.IsChecked == true) {
|
if (RecipientsAreaCmtMembersInput.IsChecked == true) {
|
||||||
var vtrg = MemberAreaComInput.SelectedItems.Cast<AreaComType>().Select(a => a.VtrgId).ToList();
|
var vtrg = MemberAreaCmtInput.SelectedItems.Cast<AreaCmtType>().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();
|
||||||
|
|||||||
@@ -414,11 +414,11 @@ namespace Elwig.Windows {
|
|||||||
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 areaComs = Utils.ActiveAreaCommitments(ctx.AreaCommitments, year!.Value);
|
var areaCmts = Utils.ActiveAreaCommitments(ctx.AreaCommitments, year!.Value);
|
||||||
var membersCtrd = await areaComs.Select(c => c.Member).Distinct().CountAsync();
|
var membersCtrd = await areaCmts.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 ctrdWeight = await ctx.DeliveryPartBuckets.Where(b => b.Year == year && b.Discr != "_").SumAsync(b => b.Value);
|
||||||
var area = await areaComs.SumAsync(c => c.Area);
|
var area = await areaCmts.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}";
|
||||||
@@ -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 AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, year);
|
var tbl2 = await AreaCmtUnderDeliveryData.ForSeason(ctx.AreaCmtUnderDeliveryRows, 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 MemberAreaComTotalsData.ForSeason(ctx.MemberAreaComTotalsRows, year);
|
var tbl1 = await MemberAreaCmtTotalsData.ForSeason(ctx.MemberAreaCmtTotalsRows, year);
|
||||||
var tbl2 = await MemberAreaComsData.ForSeason(ctx.MemberAreaComsRows, year);
|
var tbl2 = await MemberAreaCmtsData.ForSeason(ctx.MemberAreaCmtsRows, 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);
|
||||||
|
|||||||
@@ -474,8 +474,8 @@ namespace Elwig.Windows {
|
|||||||
IsCreating = true;
|
IsCreating = true;
|
||||||
MemberList.IsEnabled = false;
|
MemberList.IsEnabled = false;
|
||||||
ViewModel.SelectedMember = null;
|
ViewModel.SelectedMember = null;
|
||||||
ViewModel.TransferPredecessorAreaComs = null;
|
ViewModel.TransferPredecessorAreaCmts = null;
|
||||||
ViewModel.CancelAreaComs = null;
|
ViewModel.CancelAreaCmts = null;
|
||||||
HideNewEditDeleteButtons();
|
HideNewEditDeleteButtons();
|
||||||
ShowSaveResetCancelButtons();
|
ShowSaveResetCancelButtons();
|
||||||
UnlockInputs();
|
UnlockInputs();
|
||||||
@@ -495,8 +495,8 @@ namespace Elwig.Windows {
|
|||||||
|
|
||||||
IsEditing = true;
|
IsEditing = true;
|
||||||
MemberList.IsEnabled = false;
|
MemberList.IsEnabled = false;
|
||||||
ViewModel.TransferPredecessorAreaComs = null;
|
ViewModel.TransferPredecessorAreaCmts = null;
|
||||||
ViewModel.CancelAreaComs = null;
|
ViewModel.CancelAreaCmts = null;
|
||||||
|
|
||||||
HideNewEditDeleteButtons();
|
HideNewEditDeleteButtons();
|
||||||
ShowSaveResetCancelButtons();
|
ShowSaveResetCancelButtons();
|
||||||
@@ -517,17 +517,17 @@ namespace Elwig.Windows {
|
|||||||
if (ViewModel.SelectedMember is not Member m)
|
if (ViewModel.SelectedMember is not Member m)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int areaComs = 0, deliveries = 0, credits = 0;
|
int areaCmts = 0, deliveries = 0, credits = 0;
|
||||||
using (var ctx = new AppDbContext()) {
|
using (var ctx = new AppDbContext()) {
|
||||||
areaComs = await ctx.AreaCommitments.Where(c => c.MgNr == m.MgNr).CountAsync();
|
areaCmts = 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, areaComs, deliveries, credits);
|
var d = new DeleteMemberDialog(m.MgNr, m.AdministrativeName, areaCmts, 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.DeleteAreaComs);
|
await MemberService.DeleteMember(m.MgNr, d.DeletePaymentData, d.DeleteDeliveries, d.DeleteAreaCmts);
|
||||||
App.HintContextChange();
|
App.HintContextChange();
|
||||||
} catch (Exception exc) {
|
} catch (Exception exc) {
|
||||||
InteractionService.ShowDbException("Mitglied löschen", exc);
|
InteractionService.ShowDbException("Mitglied löschen", exc);
|
||||||
@@ -580,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.TransferPredecessorAreaComs = null;
|
ViewModel.TransferPredecessorAreaCmts = null;
|
||||||
ViewModel.CancelAreaComs = null;
|
ViewModel.CancelAreaCmts = null;
|
||||||
if (IsEditing) {
|
if (IsEditing) {
|
||||||
RefreshInputs();
|
RefreshInputs();
|
||||||
} else if (IsCreating) {
|
} else if (IsCreating) {
|
||||||
@@ -595,8 +595,8 @@ namespace Elwig.Windows {
|
|||||||
IsEditing = false;
|
IsEditing = false;
|
||||||
IsCreating = false;
|
IsCreating = false;
|
||||||
MemberList.IsEnabled = true;
|
MemberList.IsEnabled = true;
|
||||||
ViewModel.TransferPredecessorAreaComs = null;
|
ViewModel.TransferPredecessorAreaCmts = null;
|
||||||
ViewModel.CancelAreaComs = null;
|
ViewModel.CancelAreaCmts = null;
|
||||||
HideSaveResetCancelButtons();
|
HideSaveResetCancelButtons();
|
||||||
ShowNewEditDeleteButtons();
|
ShowNewEditDeleteButtons();
|
||||||
RefreshInputs();
|
RefreshInputs();
|
||||||
@@ -610,7 +610,7 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void AreaCommitmentButton_Click(object sender, RoutedEventArgs evt) {
|
private void AreaCommitmentButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
App.FocusMemberAreaComs(ViewModel.SelectedMember!.MgNr);
|
App.FocusMemberAreaCmts(ViewModel.SelectedMember!.MgNr);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeliveryButton_Click(object sender, RoutedEventArgs evt) {
|
private void DeliveryButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
@@ -920,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 areaComs = await ctx.AreaCommitments
|
var areaCmts = 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 (areaComs.Count == 0)
|
if (areaCmts.Count == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var oldMember = await ctx.FetchMembers(mgnr).SingleAsync();
|
var oldMember = await ctx.FetchMembers(mgnr).SingleAsync();
|
||||||
@@ -931,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 AreaComTransferDialog(oldMember.AdministrativeName, newName, areaComs.Count, areaComs.Sum(c => c.Area));
|
var d = new AreaCmtTransferDialog(oldMember.AdministrativeName, newName, areaCmts.Count, areaCmts.Sum(c => c.Area));
|
||||||
if (d.ShowDialog() != true)
|
if (d.ShowDialog() != true)
|
||||||
return;
|
return;
|
||||||
ViewModel.TransferPredecessorAreaComs = d.SuccessorSeason;
|
ViewModel.TransferPredecessorAreaCmts = 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();
|
||||||
@@ -979,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 areaComs = await ctx.AreaCommitments
|
var areaCmts = 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 (areaComs.Count > 0) {
|
if (areaCmts.Count > 0) {
|
||||||
var d = new AreaComTransferDialog(m.AdministrativeName, areaComs.Count, areaComs.Sum(c => c.Area));
|
var d = new AreaCmtTransferDialog(m.AdministrativeName, areaCmts.Count, areaCmts.Sum(c => c.Area));
|
||||||
if (d.ShowDialog() == true) {
|
if (d.ShowDialog() == true) {
|
||||||
ViewModel.CancelAreaComs = d.CancelSeason;
|
ViewModel.CancelAreaCmts = d.CancelSeason;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 activeAreaComs = await Utils.ActiveAreaCommitments(ctx.AreaCommitments.Where(c => c.Contract.KgNr == k.KgNr), year).CountAsync();
|
var activeAreaCmts = await Utils.ActiveAreaCommitments(ctx.AreaCommitments.Where(c => c.Contract.KgNr == k.KgNr), year).CountAsync();
|
||||||
var allAreaComs = await ctx.AreaCommitments.Where(c => c.Contract.KgNr == k.KgNr).CountAsync();
|
var allAreaCmts = await ctx.AreaCommitments.Where(c => c.Contract.KgNr == k.KgNr).CountAsync();
|
||||||
StatusAreaCommitments.Text += $"{activeAreaComs:N0} ({allAreaComs:N0})";
|
StatusAreaCommitments.Text += $"{activeAreaCmts:N0} ({allAreaCmts: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 AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, Year);
|
var tbl2 = await AreaCmtUnderDeliveryData.ForSeason(ctx.AreaCmtUnderDeliveryRows, Year);
|
||||||
var weight = tbl1.Rows.ToDictionary(r => r.MgNr, r => r.WeightTotal);
|
var weight = tbl1.Rows.ToDictionary(r => r.MgNr, r => r.WeightTotal);
|
||||||
var areaComs = tbl2.Rows.ToDictionary(r => r.MgNr, r => r.VtrgIds.Zip(r.UnderDeliveries).ToDictionary(r => r.First, r => r.Second));
|
var areaCmts = 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 = areaComs.TryGetValue(m.MgNr, out var c) ? c.Select(r => {
|
PenaltyAc = areaCmts.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,
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ namespace Tests.UnitTests.HelperTests {
|
|||||||
""");
|
""");
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task<Dictionary<string, AreaComBucket>> GetMemberAreaCommitmentBuckets(int year, int mgnr) {
|
private Task<Dictionary<string, AreaCmtBucket>> 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_NoActiveAreaComs() {
|
public async Task Test_01_NoActiveAreaCmts() {
|
||||||
int mgnr = MgNr1, year = Year1;
|
int mgnr = MgNr1, year = Year1;
|
||||||
|
|
||||||
var areaCom = await GetMemberAreaCommitmentBuckets(year, mgnr);
|
var areaCmt = await GetMemberAreaCommitmentBuckets(year, mgnr);
|
||||||
Assert.That(areaCom, Is.Empty);
|
Assert.That(areaCmt, 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));
|
||||||
@@ -163,13 +163,13 @@ namespace Tests.UnitTests.HelperTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public async Task Test_02_SimpleNotStrictAreaComs() {
|
public async Task Test_02_SimpleNotStrictAreaCmts() {
|
||||||
int mgnr = MgNr1, year = Year2;
|
int mgnr = MgNr1, year = Year2;
|
||||||
|
|
||||||
var areaCom = await GetMemberAreaCommitmentBuckets(year, mgnr);
|
var areaCmt = await GetMemberAreaCommitmentBuckets(year, mgnr);
|
||||||
using (Assert.EnterMultipleScope()) {
|
using (Assert.EnterMultipleScope()) {
|
||||||
Assert.That(areaCom, Has.Count.EqualTo(1));
|
Assert.That(areaCmt, Has.Count.EqualTo(1));
|
||||||
Assert.That(areaCom["GV"], Is.EqualTo(new AreaComBucket(10_000, 5_000, 10_000)));
|
Assert.That(areaCmt["GV"], Is.EqualTo(new AreaCmtBucket(10_000, 5_000, 10_000)));
|
||||||
}
|
}
|
||||||
var delivery = await GetMemberDeliveryBuckets(year, mgnr);
|
var delivery = await GetMemberDeliveryBuckets(year, mgnr);
|
||||||
using (Assert.EnterMultipleScope()) {
|
using (Assert.EnterMultipleScope()) {
|
||||||
@@ -209,13 +209,13 @@ namespace Tests.UnitTests.HelperTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public async Task Test_03_SimpleNotStrictAreaComs_HonorContracted() {
|
public async Task Test_03_SimpleNotStrictAreaCmts_HonorContracted() {
|
||||||
int mgnr = MgNr1, year = Year2;
|
int mgnr = MgNr1, year = Year2;
|
||||||
|
|
||||||
var areaCom = await GetMemberAreaCommitmentBuckets(year, mgnr);
|
var areaCmt = await GetMemberAreaCommitmentBuckets(year, mgnr);
|
||||||
using (Assert.EnterMultipleScope()) {
|
using (Assert.EnterMultipleScope()) {
|
||||||
Assert.That(areaCom, Has.Count.EqualTo(1));
|
Assert.That(areaCmt, Has.Count.EqualTo(1));
|
||||||
Assert.That(areaCom["GV"], Is.EqualTo(new AreaComBucket(10_000, 5_000, 10_000)));
|
Assert.That(areaCmt["GV"], Is.EqualTo(new AreaCmtBucket(10_000, 5_000, 10_000)));
|
||||||
}
|
}
|
||||||
var delivery = await GetMemberDeliveryBuckets(year, mgnr);
|
var delivery = await GetMemberDeliveryBuckets(year, mgnr);
|
||||||
using (Assert.EnterMultipleScope()) {
|
using (Assert.EnterMultipleScope()) {
|
||||||
@@ -255,56 +255,56 @@ namespace Tests.UnitTests.HelperTests {
|
|||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Ignore("Not implemented yet")]
|
[Ignore("Not implemented yet")]
|
||||||
public Task Test_04_ComplexNotStrictAreaComs() {
|
public Task Test_04_ComplexNotStrictAreaCmts() {
|
||||||
// TODO
|
// TODO
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Ignore("Not implemented yet")]
|
[Ignore("Not implemented yet")]
|
||||||
public Task Test_05_ComplexNotStrictAreaComs_HonorContracted() {
|
public Task Test_05_ComplexNotStrictAreaCmts_HonorContracted() {
|
||||||
// TODO
|
// TODO
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Ignore("Not implemented yet")]
|
[Ignore("Not implemented yet")]
|
||||||
public Task Test_06_StrictAreaComs_NoFillLower_NotAllowed() {
|
public Task Test_06_StrictAreaCmts_NoFillLower_NotAllowed() {
|
||||||
// TODO
|
// TODO
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Ignore("Not implemented yet")]
|
[Ignore("Not implemented yet")]
|
||||||
public Task Test_07_StrictAreaComs_NoFillLower_Allowed() {
|
public Task Test_07_StrictAreaCmts_NoFillLower_Allowed() {
|
||||||
// TODO
|
// TODO
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Ignore("Not implemented yet")]
|
[Ignore("Not implemented yet")]
|
||||||
public Task Test_08_StrictAreaComs_NoFillLower_Allowed_AvoidUnderDeliveries() {
|
public Task Test_08_StrictAreaCmts_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_StrictAreaComs_FillLowerUntilObligation_NotAllowed() {
|
public Task Test_09_StrictAreaCmts_FillLowerUntilObligation_NotAllowed() {
|
||||||
// TODO
|
// TODO
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Ignore("Not implemented yet")]
|
[Ignore("Not implemented yet")]
|
||||||
public Task Test_10_StrictAreaComs_FillLowerUntilObligation_Allowed() {
|
public Task Test_10_StrictAreaCmts_FillLowerUntilObligation_Allowed() {
|
||||||
// TODO
|
// TODO
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Ignore("Not implemented yet")]
|
[Ignore("Not implemented yet")]
|
||||||
public Task Test_11_StrictAreaComs_FillLowerUntilObligation_Allowed_AvoidUnderDeliveries() {
|
public Task Test_11_StrictAreaCmts_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_StrictAreaComs_FillLowerUntilObligation_NotAllowed() {
|
public Task Test_12_StrictAreaCmts_FillLowerUntilObligation_NotAllowed() {
|
||||||
// TODO
|
// TODO
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Ignore("Not implemented yet")]
|
[Ignore("Not implemented yet")]
|
||||||
public Task Test_13_StrictAreaComs_FillLowerUntilObligation_Allowed() {
|
public Task Test_13_StrictAreaCmts_FillLowerUntilObligation_Allowed() {
|
||||||
// TODO
|
// TODO
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Ignore("Not implemented yet")]
|
[Ignore("Not implemented yet")]
|
||||||
public Task Test_14_StrictAreaComs_FillLowerUntilObligation_Allowed_AvoidUnderDeliveries() {
|
public Task Test_14_StrictAreaCmts_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_StrictAreaComs_FillLowerUntilRight_NotAllowed() {
|
public Task Test_15_StrictAreaCmts_FillLowerUntilRight_NotAllowed() {
|
||||||
// TODO
|
// TODO
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Ignore("Not implemented yet")]
|
[Ignore("Not implemented yet")]
|
||||||
public Task Test_16_StrictAreaComs_FillLowerUntilRight_Allowed() {
|
public Task Test_16_StrictAreaCmts_FillLowerUntilRight_Allowed() {
|
||||||
// TODO
|
// TODO
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Ignore("Not implemented yet")]
|
[Ignore("Not implemented yet")]
|
||||||
public Task Test_17_StrictAreaComs_FillLowerUntilRight_Allowed_AvoidUnderDeliveries() {
|
public Task Test_17_StrictAreaCmts_FillLowerUntilRight_Allowed_AvoidUnderDeliveries() {
|
||||||
// TODO
|
// TODO
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user