Compare commits

...

13 Commits

Author SHA1 Message Date
7a15050575 Bump version to 0.10.8
All checks were successful
Test / Run tests (push) Successful in 2m9s
Deploy / Build and Deploy (push) Successful in 2m52s
2024-09-05 23:32:23 +02:00
8d9172f91e AppDbContext: Move all calls to App.HintContextChange() outside of any AppDbContext block
All checks were successful
Test / Run tests (push) Successful in 2m44s
2024-09-05 17:21:00 +02:00
7437187630 DeliveryAncmtAdminWindow: Add date column 2024-09-05 15:28:55 +02:00
a38cdaa8af DeliveryAdminWindow: Slightly increase default width
All checks were successful
Test / Run tests (push) Successful in 2m2s
2024-09-04 18:18:19 +02:00
a5638135a3 DeliveryAncmtAdminWindow: Add option to search in all delivery schedules and init mgnr with selected
All checks were successful
Test / Run tests (push) Successful in 2m2s
2024-09-04 18:11:56 +02:00
a04c7d538e MemberDataSheet: Add VAT to 'Buchführend'
All checks were successful
Test / Run tests (push) Successful in 2m2s
2024-09-04 17:32:34 +02:00
26235f8c0a BusinessDocument: Add ':' in aside block
All checks were successful
Test / Run tests (push) Successful in 2m6s
2024-09-04 17:23:22 +02:00
f43d9c020c DeliveryAncmtList: Center 'Anmldg.' column
All checks were successful
Test / Run tests (push) Successful in 2m54s
2024-09-04 17:18:36 +02:00
22514715c1 DeliveryService: Small text fix 2024-09-04 17:16:14 +02:00
5eda25ed14 Bump version to 0.10.7
All checks were successful
Test / Run tests (push) Successful in 2m2s
Deploy / Build and Deploy (push) Successful in 3m42s
2024-09-02 23:42:00 +02:00
543185d48e DeliveryAdminWindow: Add weight filter
All checks were successful
Test / Run tests (push) Successful in 2m58s
2024-09-02 23:28:55 +02:00
141086673f DeliveryAncmtList: Add status to indicate late ancmts 2024-09-02 23:10:37 +02:00
6627ab6d12 App: Try to fix auto context renewal 2
All checks were successful
Test / Run tests (push) Successful in 2m57s
2024-09-01 11:44:38 +02:00
21 changed files with 322 additions and 200 deletions

View File

@ -3,6 +3,46 @@ Changelog
========= =========
[v0.10.8][v0.10.8] (2024-09-05) {#v0.10.8}
------------------------------------------
### Neue Funktionen {#v0.10.8-features}
* Im Anmeldungen-Fenster (`DeliveryAncmtAdminWindow`) gibt es eine neue Spalte `Datum` und es können alle Lesepläne nach z.B. einem Mitglied durchsucht werden. (a5638135a3, 7437187630)
### Behobene Fehler {#v0.10.8-bugfixes}
* Versuch 3: Fehler bei automatischer Daten-Erneuerung bei längerer Benutzung. (8d9172f91e)
### Sonstiges {#v0.10.8-misc}
* Im Lieferjournal (`DeliveryJournal`) ist die Sortierung der Filter für das Gewicht korrigiert. (22514715c1)
* In der Anmeldeliste (`DeliveryAncmtList`) wurde die Spalte `Anmldg.` zentriert. (f43d9c020c)
* In Geschäftsdokumenten (`BusinessDocument`) wurden im Informationsblock `:` hinzugefügt. (26235f8c0a)
* Im Mitgliedsstammdatenblat (`MemberDataSheet`) wird der USt.-Steuersatz zusätzlich zu _Buchführend: ja/nein_ angezeigt. (a04c7d538e)
[v0.10.8]: https://git.necronda.net/winzer/elwig/releases/tag/v0.10.8
[v0.10.7][v0.10.7] (2024-09-02) {#v0.10.7}
------------------------------------------
### Neue Funktionen {#v0.10.7-features}
* Im Anmeldungen-Fenster (`DeliveryAncmtAdminWindow`) wird der Anmeldezeitpunkt angezeigt; in der Anmeldeliste als `ok` oder `verspät.`. (141086673f)
* Im Lieferungen-Fenster (`DeliveryAdminWindow`) kann nach dem Gesamtgewicht einer Lieferung gefiltert werden (z.B. `<500kg`, `>8000kg`). (543185d48e)
### Behobene Fehler {#v0.10.7-bugfixes}
* Versuch 2: Fehler bei automatischer Daten-Erneuerung bei längerer Benutzung. (6627ab6d12)
[v0.10.7]: https://git.necronda.net/winzer/elwig/releases/tag/v0.10.7
[v0.10.6][v0.10.6] (2024-08-30) {#v0.10.6} [v0.10.6][v0.10.6] (2024-08-30) {#v0.10.6}
------------------------------------------ ------------------------------------------

View File

@ -53,7 +53,7 @@ namespace Elwig {
public static Dispatcher MainDispatcher { get; private set; } public static Dispatcher MainDispatcher { get; private set; }
private DateTime LastChanged; private DateTime LastChanged;
private static DateTime CurrentLastWrite => File.GetLastWriteTime(Config.DatabaseFile); private static DateTime CurrentLastWrite => File.GetLastWriteTime(Config.DatabaseFile);
private readonly DispatcherTimer ContextTimer = new() { Interval = TimeSpan.FromSeconds(5) }; private readonly DispatcherTimer ContextTimer = new() { Interval = TimeSpan.FromSeconds(2) };
public App() : base() { public App() : base() {
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
@ -202,7 +202,9 @@ namespace Elwig {
} }
public static async Task HintContextChange() { public static async Task HintContextChange() {
CurrentApp.LastChanged = CurrentLastWrite; var ch = CurrentLastWrite;
if (ch > CurrentApp.LastChanged)
CurrentApp.LastChanged = ch;
foreach (Window w in CurrentApp.Windows) { foreach (Window w in CurrentApp.Windows) {
if (w is not ContextWindow c) continue; if (w is not ContextWindow c) continue;
await c.HintContextChange(); await c.HintContextChange();

View File

@ -22,9 +22,9 @@ namespace Elwig.Documents {
var uid = (m.UstIdNr ?? "-") + (m.IsBuchführend ? "" : " <i>(pauschaliert)</i>"); var uid = (m.UstIdNr ?? "-") + (m.IsBuchführend ? "" : " <i>(pauschaliert)</i>");
Aside = $"<table><colgroup><col span='1' style='width: 22.5mm;'/><col span='1' style='width: 42.5mm;'/></colgroup>" + Aside = $"<table><colgroup><col span='1' style='width: 22.5mm;'/><col span='1' style='width: 42.5mm;'/></colgroup>" +
$"<thead><tr><th colspan='2'>Mitglied</th></tr></thead><tbody>" + $"<thead><tr><th colspan='2'>Mitglied</th></tr></thead><tbody>" +
$"<tr><th>Mitglieds-Nr.</th><td>{m.MgNr}</td></tr>" + $"<tr><th>Mitglieds-Nr.:</th><td>{m.MgNr}</td></tr>" +
$"<tr><th>Betriebs-Nr.</th><td>{m.LfbisNr}</td></tr>" + $"<tr><th>Betriebs-Nr.:</th><td>{m.LfbisNr}</td></tr>" +
$"<tr><th>UID</th><td>{uid}</td></tr>" + $"<tr><th>UID:</th><td>{uid}</td></tr>" +
$"</tbody></table>"; $"</tbody></table>";
} }

View File

@ -54,9 +54,9 @@ namespace Elwig.Documents {
} }
Aside = Aside.Replace("</table>", "") + Aside = Aside.Replace("</table>", "") +
$"<thead><tr><th colspan='2'>Gutschrift</th></tr></thead><tbody>" + $"<thead><tr><th colspan='2'>Gutschrift</th></tr></thead><tbody>" +
$"<tr><th>TG-Nr.</th><td>{(p.Credit != null ? $"{p.Credit.Year}/{p.Credit.TgNr:000}" : "-")}</td></tr>" + $"<tr><th>TG-Nr.:</th><td>{(p.Credit != null ? $"{p.Credit.Year}/{p.Credit.TgNr:000}" : "-")}</td></tr>" +
$"<tr><th>Datum</th><td>{p.Variant.Date:dd.MM.yyyy}</td></tr>" + $"<tr><th>Datum:</th><td>{p.Variant.Date:dd.MM.yyyy}</td></tr>" +
$"<tr><th>Überw. am</th><td>{p.Variant.TransferDate:dd.MM.yyyy}</td></tr>" + $"<tr><th>Überw. am:</th><td>{p.Variant.TransferDate:dd.MM.yyyy}</td></tr>" +
$"</tbody></table>"; $"</tbody></table>";
Text = App.Client.TextCreditNote; Text = App.Client.TextCreditNote;
DocumentId = $"Tr.-Gutschr. " + (p.Credit != null ? $"{p.Credit.Year}/{p.Credit.TgNr:000}" : p.MgNr); DocumentId = $"Tr.-Gutschr. " + (p.Credit != null ? $"{p.Credit.Year}/{p.Credit.TgNr:000}" : p.MgNr);

View File

@ -10,8 +10,9 @@
<colgroup> <colgroup>
<col style="width: 18mm;"/> <col style="width: 18mm;"/>
<col style="width: 12mm;"/> <col style="width: 12mm;"/>
<col style="width: 81mm;"/> <col style="width: 70mm;"/>
<col style="width: 40mm;"/> <col style="width: 40mm;"/>
<col style="width: 11mm;"/>
<col style="width: 14mm;"/> <col style="width: 14mm;"/>
</colgroup> </colgroup>
<thead> <thead>
@ -20,6 +21,7 @@
<th rowspan="2">MgNr.</th> <th rowspan="2">MgNr.</th>
<th rowspan="2" style="text-align: left;">Mitglied</th> <th rowspan="2" style="text-align: left;">Mitglied</th>
<th rowspan="2" style="text-align: left;">Sorte</th> <th rowspan="2" style="text-align: left;">Sorte</th>
<th rowspan="2">Anmldg.</th>
<th>Gewicht</th> <th>Gewicht</th>
</tr> </tr>
<tr> <tr>
@ -33,13 +35,14 @@
<td class="number">@a.MgNr</td> <td class="number">@a.MgNr</td>
<td>@a.AdministrativeName</td> <td>@a.AdministrativeName</td>
<td>@a.Variety</td> <td>@a.Variety</td>
<td class="small center">@(a.Status ?? "-")</td>
<td class="number">@($"{a.Weight:N0}")</td> <td class="number">@($"{a.Weight:N0}")</td>
</tr> </tr>
} }
<tr class="sum bold"> <tr class="sum bold">
<td colspan="2">Gesamt:</td> <td colspan="2">Gesamt:</td>
<td colspan="2">Anmeldungen: @($"{Model.Announcements.Count():N0}")</td> <td colspan="2">Anmeldungen: @($"{Model.Announcements.Count():N0}")</td>
<td class="number">@($"{Model.Announcements.Sum(a => a.Weight):N0}")</td> <td colspan="2" class="number">@($"{Model.Announcements.Sum(a => a.Weight):N0}")</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -23,9 +23,9 @@ namespace Elwig.Documents {
Delivery = d; Delivery = d;
Aside = Aside.Replace("</table>", "") + Aside = Aside.Replace("</table>", "") +
$"<thead><tr><th colspan='2'>Lieferung</th></tr></thead><tbody>" + $"<thead><tr><th colspan='2'>Lieferung</th></tr></thead><tbody>" +
$"<tr><th>LS-Nr.</th><td>{d.LsNr}</td></tr>" + $"<tr><th>LS-Nr.:</th><td>{d.LsNr}</td></tr>" +
$"<tr><th>Datum/Zeit</th><td>{d.Date:dd.MM.yyyy} / {d.Time:HH:mm}</td></tr>" + $"<tr><th>Datum/Zeit:</th><td>{d.Date:dd.MM.yyyy} / {d.Time:HH:mm}</td></tr>" +
$"<tr><th>Zweigstelle</th><td>{d.Branch.Name}</td></tr>" + $"<tr><th>Zweigstelle:</th><td>{d.Branch.Name}</td></tr>" +
$"</tbody></table>"; $"</tbody></table>";
Text = App.Client.TextDeliveryNote; Text = App.Client.TextDeliveryNote;
DocumentId = d.LsNr; DocumentId = d.LsNr;

View File

@ -115,7 +115,7 @@
<th>Stammgemeinde:</th> <th>Stammgemeinde:</th>
<td>@Model.Member.DefaultKg?.Name</td> <td>@Model.Member.DefaultKg?.Name</td>
<th colspan="2">Buchführend:</th> <th colspan="2">Buchführend:</th>
<td colspan="2">@(Model.Member.IsBuchführend ? "Ja" : "Nein")</td> <td colspan="2">@(Model.Member.IsBuchführend ? "Ja" : "Nein") <span class="small">(@((Model.Member.IsBuchführend ? Model.Season.VatNormal : Model.Season.VatFlatrate) * 100)% USt.)</span></td>
</tr> </tr>
<tr> <tr>
<th colspan="2" class="small">(Katastralgemeinde mit dem größten Anteil an Weinbauflächen)</th> <th colspan="2" class="small">(Katastralgemeinde mit dem größten Anteil an Weinbauflächen)</th>

View File

@ -7,7 +7,7 @@
<UseWPF>true</UseWPF> <UseWPF>true</UseWPF>
<PreserveCompilationContext>true</PreserveCompilationContext> <PreserveCompilationContext>true</PreserveCompilationContext>
<ApplicationIcon>Resources\Images\Elwig.ico</ApplicationIcon> <ApplicationIcon>Resources\Images\Elwig.ico</ApplicationIcon>
<Version>0.10.6</Version> <Version>0.10.8</Version>
<SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages> <SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<ApplicationManifest>app.manifest</ApplicationManifest> <ApplicationManifest>app.manifest</ApplicationManifest>

View File

@ -17,6 +17,9 @@ namespace Elwig.Models.Dtos {
("Name2", "Vorname", null, 40), ("Name2", "Vorname", null, 40),
("SortId", "Sorte", null, 10), ("SortId", "Sorte", null, 10),
("Weight", "Gewicht", "kg", 20), ("Weight", "Gewicht", "kg", 20),
("CreatedTimestamp", "Angemeldet", null, 35),
("ModifiedTimestamp", "Geändert", null, 35),
("Status", "Status", null, 20),
]; ];
public DeliveryAncmtListData(IEnumerable<DeliveryAncmtListRow> rows, List<string> filterNames) : public DeliveryAncmtListData(IEnumerable<DeliveryAncmtListRow> rows, List<string> filterNames) :
@ -42,7 +45,10 @@ namespace Elwig.Models.Dtos {
public string AdministrativeName; public string AdministrativeName;
public string SortId; public string SortId;
public string Variety; public string Variety;
public DateTime CreatedTimestamp;
public DateTime? ModifiedTimestamp;
public int Weight; public int Weight;
public string? Status;
public DeliveryAncmtListRow(DeliveryAncmt a) { public DeliveryAncmtListRow(DeliveryAncmt a) {
var s = a.Schedule; var s = a.Schedule;
@ -56,7 +62,10 @@ namespace Elwig.Models.Dtos {
AdministrativeName = m.AdministrativeName; AdministrativeName = m.AdministrativeName;
SortId = a.SortId; SortId = a.SortId;
Variety = a.Variety.Name; Variety = a.Variety.Name;
CreatedTimestamp = a.CreatedTimestamp;
ModifiedTimestamp = a.ModifiedTimestamp == a.CreatedTimestamp ? null : a.ModifiedTimestamp;
Weight = a.Weight; Weight = a.Weight;
Status = s.AncmtTo == null ? null : a.CreatedTimestamp >= s.AncmtTo ? "verspät." : "ok";
} }
} }
} }

View File

@ -100,39 +100,40 @@ namespace Elwig.Services {
} }
public static async Task<int> UpdateAreaCommitment(this AreaComAdminViewModel vm, int? oldFbNr) { public static async Task<int> UpdateAreaCommitment(this AreaComAdminViewModel vm, int? oldFbNr) {
using var ctx = new AppDbContext();
int newFbNr = (int)vm.FbNr!; int newFbNr = (int)vm.FbNr!;
var a = new AreaCom { using (var ctx = new AppDbContext()) {
FbNr = oldFbNr ?? newFbNr, var a = new AreaCom {
MgNr = (int)vm.MgNr!, FbNr = oldFbNr ?? newFbNr,
YearFrom = (int)vm.YearFrom!, MgNr = (int)vm.MgNr!,
YearTo = vm.YearTo, YearFrom = (int)vm.YearFrom!,
VtrgId = vm.AreaComType!.VtrgId, YearTo = vm.YearTo,
CultId = vm.WineCult?.CultId, VtrgId = vm.AreaComType!.VtrgId,
Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment, CultId = vm.WineCult?.CultId,
KgNr = vm.Kg!.KgNr, Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
RdNr = vm.Rd?.RdNr, KgNr = vm.Kg!.KgNr,
GstNr = vm.GstNr!.Trim(), RdNr = vm.Rd?.RdNr,
Area = (int)vm.Area!, GstNr = vm.GstNr!.Trim(),
}; Area = (int)vm.Area!,
};
if (vm.Rd?.RdNr == 0) { if (vm.Rd?.RdNr == 0) {
vm.Rd.RdNr = await ctx.NextRdNr(a.KgNr); vm.Rd.RdNr = await ctx.NextRdNr(a.KgNr);
a.RdNr = vm.Rd.RdNr; a.RdNr = vm.Rd.RdNr;
ctx.Add(vm.Rd); ctx.Add(vm.Rd);
} }
if (oldFbNr != null) { if (oldFbNr != null) {
ctx.Update(a); ctx.Update(a);
} else { } else {
ctx.Add(a); ctx.Add(a);
} }
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
if (newFbNr != a.FbNr) { if (newFbNr != a.FbNr) {
await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment SET fbnr = {newFbNr} WHERE fbnr = {oldFbNr}"); await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment SET fbnr = {newFbNr} WHERE fbnr = {oldFbNr}");
}
} }
await App.HintContextChange(); await App.HintContextChange();

View File

@ -46,7 +46,7 @@ namespace Elwig.Services {
deliveryAncmtQuery = deliveryAncmtQuery.Where(a => a.Year == s.Year && a.DsNr == s.DsNr); deliveryAncmtQuery = deliveryAncmtQuery.Where(a => a.Year == s.Year && a.DsNr == s.DsNr);
filterNames.Add($"{s.Date:dd.MM.yyyy} {s.Branch.Name} {s.Description}"); filterNames.Add($"{s.Date:dd.MM.yyyy} {s.Branch.Name} {s.Description}");
} else { } else {
deliveryAncmtQuery = deliveryAncmtQuery.Where(a => a.Year == vm.FilterSeason); deliveryAncmtQuery = deliveryAncmtQuery.Where(a => a.Year == vm.FilterSeason && (!vm.FilterOnlyUpcoming || a.Schedule.DateString.CompareTo(Utils.Today.ToString("yyyy-MM-dd")) >= 0));
filterNames.Add($"{vm.FilterSeason}"); filterNames.Add($"{vm.FilterSeason}");
} }

View File

@ -124,6 +124,7 @@ namespace Elwig.Services {
var filterNotCult = new List<string>(); var filterNotCult = new List<string>();
var filterDate = new List<(string?, string?)>(); var filterDate = new List<(string?, string?)>();
var filterTime = new List<(string?, string?)>(); var filterTime = new List<(string?, string?)>();
int filterWeightGt = 0, filterWeightLt = 0;
int filterYearGt = 0, filterYearLt = 0; int filterYearGt = 0, filterYearLt = 0;
double filterKmwGt = 0, filterKmwLt = 0; double filterKmwGt = 0, filterKmwLt = 0;
double filterOeGt = 0, filterOeLt = 0; double filterOeGt = 0, filterOeLt = 0;
@ -250,6 +251,15 @@ namespace Elwig.Services {
filterZwst.Add(b.ZwstId); filterZwst.Add(b.ZwstId);
filter.RemoveAt(i--); filter.RemoveAt(i--);
filterNames.Add($"Zweigstelle {b.Name}"); filterNames.Add($"Zweigstelle {b.Name}");
} else if ((e.StartsWith('>') || e.StartsWith('<')) && e.EndsWith("kg")) {
if (int.TryParse(e[1..^2], out var num)) {
switch (e[0]) {
case '>': filterWeightGt = num; break;
case '<': filterWeightLt = num; break;
}
filter.RemoveAt(i--);
}
if (e.Length == 3) filter.RemoveAt(i--);
} else if (e.StartsWith('>') || e.StartsWith('<')) { } else if (e.StartsWith('>') || e.StartsWith('<')) {
if (double.TryParse(e[1..], out var num)) { if (double.TryParse(e[1..], out var num)) {
switch ((e[0], num)) { switch ((e[0], num)) {
@ -347,6 +357,8 @@ namespace Elwig.Services {
} }
} }
if (filterWeightGt > 0) prd = prd.And(p => p.Delivery.Parts.Sum(p => p.Weight) >= filterWeightGt);
if (filterWeightLt > 0) prd = prd.And(p => p.Delivery.Parts.Sum(p => p.Weight) <= filterWeightLt);
if (filterYearGt > 0) prd = prd.And(p => p.Year >= filterYearGt); if (filterYearGt > 0) prd = prd.And(p => p.Year >= filterYearGt);
if (filterYearLt > 0) prd = prd.And(p => p.Year < filterYearLt); if (filterYearLt > 0) prd = prd.And(p => p.Year < filterYearLt);
if (filterMgNr.Count > 0) prd = prd.And(p => filterMgNr.Contains(p.Delivery.MgNr)); if (filterMgNr.Count > 0) prd = prd.And(p => filterMgNr.Contains(p.Delivery.MgNr));
@ -376,6 +388,13 @@ namespace Elwig.Services {
if (filterOeGt > 0) prd = prd.And(p => p.Kmw * (4.54 + 0.022 * p.Kmw) >= filterOeGt); if (filterOeGt > 0) prd = prd.And(p => p.Kmw * (4.54 + 0.022 * p.Kmw) >= filterOeGt);
if (filterOeLt > 0) prd = prd.And(p => p.Kmw * (4.54 + 0.022 * p.Kmw) < filterOeLt); if (filterOeLt > 0) prd = prd.And(p => p.Kmw * (4.54 + 0.022 * p.Kmw) < filterOeLt);
if (filterWeightGt > 0 && filterWeightLt > 0) {
filterNames.Add($"{filterWeightGt:N0}{filterWeightLt:N0} kg");
} else if (filterWeightGt > 0) {
filterNames.Add($"ab {filterWeightGt:N0} kg");
} else if (filterWeightLt > 0) {
filterNames.Add($"bis {filterWeightLt:N0} kg");
}
if (filterYearGt > 0 && filterYearLt > 0) { if (filterYearGt > 0 && filterYearLt > 0) {
filterNames.Insert(0, $"{filterYearGt}{filterYearLt - 1}"); filterNames.Insert(0, $"{filterYearGt}{filterYearLt - 1}");
} else if (filterYearGt > 0) { } else if (filterYearGt > 0) {

View File

@ -502,126 +502,128 @@ namespace Elwig.Services {
} }
public static async Task<int> UpdateMember(this MemberAdminViewModel vm, int? oldMgNr) { public static async Task<int> UpdateMember(this MemberAdminViewModel vm, int? oldMgNr) {
using var ctx = new AppDbContext();
var newMgNr = (int)vm.MgNr!; var newMgNr = (int)vm.MgNr!;
var m = new Member {
MgNr = oldMgNr ?? newMgNr,
PredecessorMgNr = vm.PredecessorMgNr,
IsJuridicalPerson = vm.IsJuridicalPerson,
Prefix = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.Prefix) ? null : vm.Prefix,
GivenName = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.GivenName) ? null : vm.GivenName,
Name = vm.Name!,
Suffix = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.Suffix) ? null : vm.Suffix,
ForTheAttentionOf = !vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.ForTheAttentionOf) ? null : vm.ForTheAttentionOf,
Birthday = string.IsNullOrEmpty(vm.Birthday) ? null : string.Join("-", vm.Birthday!.Split(".").Reverse()),
IsDeceased = vm.IsDeceased,
CountryNum = 40, // Austria AT AUT
PostalDestId = vm.Ort!.Id,
Address = vm.Address!,
Iban = string.IsNullOrEmpty(vm.Iban) ? null : vm.Iban?.Replace(" ", ""), using (var ctx = new AppDbContext()) {
Bic = string.IsNullOrEmpty(vm.Bic) ? null : vm.Bic, var m = new Member {
MgNr = oldMgNr ?? newMgNr,
PredecessorMgNr = vm.PredecessorMgNr,
IsJuridicalPerson = vm.IsJuridicalPerson,
Prefix = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.Prefix) ? null : vm.Prefix,
GivenName = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.GivenName) ? null : vm.GivenName,
Name = vm.Name!,
Suffix = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.Suffix) ? null : vm.Suffix,
ForTheAttentionOf = !vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.ForTheAttentionOf) ? null : vm.ForTheAttentionOf,
Birthday = string.IsNullOrEmpty(vm.Birthday) ? null : string.Join("-", vm.Birthday!.Split(".").Reverse()),
IsDeceased = vm.IsDeceased,
CountryNum = 40, // Austria AT AUT
PostalDestId = vm.Ort!.Id,
Address = vm.Address!,
UstIdNr = string.IsNullOrEmpty(vm.UstIdNr) ? null : vm.UstIdNr, Iban = string.IsNullOrEmpty(vm.Iban) ? null : vm.Iban?.Replace(" ", ""),
LfbisNr = string.IsNullOrEmpty(vm.LfbisNr) ? null : vm.LfbisNr, Bic = string.IsNullOrEmpty(vm.Bic) ? null : vm.Bic,
IsBuchführend = vm.IsBuchführend,
IsOrganic = vm.IsOrganic,
EntryDateString = string.IsNullOrEmpty(vm.EntryDate) ? null : string.Join("-", vm.EntryDate.Split(".").Reverse()), UstIdNr = string.IsNullOrEmpty(vm.UstIdNr) ? null : vm.UstIdNr,
ExitDateString = string.IsNullOrEmpty(vm.ExitDate) ? null : string.Join("-", vm.ExitDate.Split(".").Reverse()), LfbisNr = string.IsNullOrEmpty(vm.LfbisNr) ? null : vm.LfbisNr,
BusinessShares = (int)vm.BusinessShares!, IsBuchführend = vm.IsBuchführend,
AccountingNr = string.IsNullOrEmpty(vm.AccountingNr) ? null : vm.AccountingNr, IsOrganic = vm.IsOrganic,
IsActive = vm.IsActive,
IsVollLieferant = vm.IsVollLieferant,
IsFunktionär = vm.IsFunktionär,
ZwstId = vm.Branch?.ZwstId,
DefaultKgNr = vm.DefaultKg?.KgNr,
Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
ContactViaPost = vm.ContactViaPost,
ContactViaEmail = vm.ContactViaEmail,
};
if (oldMgNr != null) { EntryDateString = string.IsNullOrEmpty(vm.EntryDate) ? null : string.Join("-", vm.EntryDate.Split(".").Reverse()),
ctx.Update(m); ExitDateString = string.IsNullOrEmpty(vm.ExitDate) ? null : string.Join("-", vm.ExitDate.Split(".").Reverse()),
} else { BusinessShares = (int)vm.BusinessShares!,
ctx.Add(m); AccountingNr = string.IsNullOrEmpty(vm.AccountingNr) ? null : vm.AccountingNr,
} IsActive = vm.IsActive,
IsVollLieferant = vm.IsVollLieferant,
IsFunktionär = vm.IsFunktionär,
ZwstId = vm.Branch?.ZwstId,
DefaultKgNr = vm.DefaultKg?.KgNr,
Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
ContactViaPost = vm.ContactViaPost,
ContactViaEmail = vm.ContactViaEmail,
};
ctx.RemoveRange(ctx.BillingAddresses.Where(a => a.MgNr == oldMgNr)); if (oldMgNr != null) {
if (vm.BillingOrt != null && vm.BillingName != null) { ctx.Update(m);
var p = vm.BillingOrt; } else {
ctx.Add(new BillingAddr { ctx.Add(m);
MgNr = m.MgNr, }
FullName = vm.BillingName,
Address = vm.BillingAddress ?? "",
CountryNum = p.CountryNum,
PostalDestId = p.Id,
});
}
ctx.RemoveRange(ctx.MemberTelephoneNrs.Where(t => t.MgNr == oldMgNr)); ctx.RemoveRange(ctx.BillingAddresses.Where(a => a.MgNr == oldMgNr));
ctx.AddRange(vm.PhoneNrs if (vm.BillingOrt != null && vm.BillingName != null) {
.Where(input => input.Number != null && input.Number != "") var p = vm.BillingOrt;
.Select((input, i) => new MemberTelNr { ctx.Add(new BillingAddr {
MgNr = m.MgNr, MgNr = m.MgNr,
Nr = i + 1, FullName = vm.BillingName,
Type = input.Type == -1 ? (input.Number!.StartsWith("+43 ") && input.Number![4] == '6' ? "mobile" : "landline") : vm.PhoneNrTypes[input.Type].Key, Address = vm.BillingAddress ?? "",
Number = input.Number!, CountryNum = p.CountryNum,
Comment = input.Comment, PostalDestId = p.Id,
})); });
}
ctx.RemoveRange(ctx.MemberEmailAddrs.Where(e => e.MgNr == oldMgNr)); ctx.RemoveRange(ctx.MemberTelephoneNrs.Where(t => t.MgNr == oldMgNr));
ctx.AddRange(vm.EmailAddresses ctx.AddRange(vm.PhoneNrs
.Where(input => input != null && input != "") .Where(input => input.Number != null && input.Number != "")
.Select((input, i) => new MemberEmailAddr { .Select((input, i) => new MemberTelNr {
MgNr = m.MgNr, MgNr = m.MgNr,
Nr = i + 1, Nr = i + 1,
Address = input!, Type = input.Type == -1 ? (input.Number!.StartsWith("+43 ") && input.Number![4] == '6' ? "mobile" : "landline") : vm.PhoneNrTypes[input.Type].Key,
Comment = null, Number = input.Number!,
})); Comment = input.Comment,
}));
await ctx.SaveChangesAsync(); ctx.RemoveRange(ctx.MemberEmailAddrs.Where(e => e.MgNr == oldMgNr));
ctx.AddRange(vm.EmailAddresses
.Where(input => input != null && input != "")
.Select((input, i) => new MemberEmailAddr {
MgNr = m.MgNr,
Nr = i + 1,
Address = input!,
Comment = null,
}));
if (vm.TransferPredecessorAreaComs is int year && m.PredecessorMgNr is int predecessor) {
var areaComs = await ctx.AreaCommitments
.Where(c => c.MgNr == predecessor && (c.YearTo == null || c.YearTo >= year))
.ToListAsync();
var fbNr = await ctx.NextFbNr();
ctx.AddRange(areaComs.Select((c, i) => new AreaCom {
FbNr = fbNr + i,
MgNr = m.MgNr,
VtrgId = c.VtrgId,
CultId = c.CultId,
Area = c.Area,
KgNr = c.KgNr,
GstNr = c.GstNr,
RdNr = c.RdNr,
YearFrom = vm.MaintainAreaComYearTo ? c.YearFrom : year,
YearTo = c.YearTo,
}));
foreach (var ac in areaComs)
ac.YearTo = year - 1;
ctx.UpdateRange(areaComs);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
}
vm.TransferPredecessorAreaComs = null;
if (vm.CancelAreaComs is int yearTo) { if (vm.TransferPredecessorAreaComs is int year && m.PredecessorMgNr is int predecessor) {
var areaComs = await ctx.AreaCommitments var areaComs = await ctx.AreaCommitments
.Where(c => c.MgNr == m.MgNr && (c.YearTo == null || c.YearTo > yearTo)) .Where(c => c.MgNr == predecessor && (c.YearTo == null || c.YearTo >= year))
.ToListAsync(); .ToListAsync();
foreach (var ac in areaComs) var fbNr = await ctx.NextFbNr();
ac.YearTo = yearTo; ctx.AddRange(areaComs.Select((c, i) => new AreaCom {
ctx.UpdateRange(areaComs); FbNr = fbNr + i,
await ctx.SaveChangesAsync(); MgNr = m.MgNr,
} VtrgId = c.VtrgId,
vm.CancelAreaComs = null; CultId = c.CultId,
Area = c.Area,
KgNr = c.KgNr,
GstNr = c.GstNr,
RdNr = c.RdNr,
YearFrom = vm.MaintainAreaComYearTo ? c.YearFrom : year,
YearTo = c.YearTo,
}));
if (newMgNr != m.MgNr) { foreach (var ac in areaComs)
await ctx.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {oldMgNr}"); ac.YearTo = year - 1;
ctx.UpdateRange(areaComs);
await ctx.SaveChangesAsync();
}
vm.TransferPredecessorAreaComs = null;
if (vm.CancelAreaComs is int yearTo) {
var areaComs = await ctx.AreaCommitments
.Where(c => c.MgNr == m.MgNr && (c.YearTo == null || c.YearTo > yearTo))
.ToListAsync();
foreach (var ac in areaComs)
ac.YearTo = yearTo;
ctx.UpdateRange(areaComs);
await ctx.SaveChangesAsync();
}
vm.CancelAreaComs = null;
if (newMgNr != m.MgNr) {
await ctx.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {oldMgNr}");
}
} }
await App.HintContextChange(); await App.HintContextChange();

View File

@ -14,6 +14,8 @@ namespace Elwig.ViewModels {
[ObservableProperty] [ObservableProperty]
private bool _filterOnlyUpcoming; private bool _filterOnlyUpcoming;
[ObservableProperty] [ObservableProperty]
private bool _filterFromAllSchedules;
[ObservableProperty]
private string? _filterSeasonString; private string? _filterSeasonString;
public int? FilterSeason { public int? FilterSeason {
get => int.TryParse(FilterSeasonString, out var year) ? year : null; get => int.TryParse(FilterSeasonString, out var year) ? year : null;

View File

@ -662,14 +662,15 @@ namespace Elwig.Windows {
private async void SaveButton_Click(object sender, RoutedEventArgs e) { private async void SaveButton_Click(object sender, RoutedEventArgs e) {
try { try {
using var ctx = new AppDbContext(); using (var ctx = new AppDbContext()) {
var origData = BillingData.FromJson(PaymentVar.Data); var origData = BillingData.FromJson(PaymentVar.Data);
var data = BillingData.FromGraphEntries(GraphEntries, origData, Utils.GetVaributes(ctx, Year), var data = BillingData.FromGraphEntries(GraphEntries, origData, Utils.GetVaributes(ctx, Year),
AllVaributesAssigned, AllVaributesAssignedAbgew); AllVaributesAssigned, AllVaributesAssignedAbgew);
PaymentVar.Data = data.ToJsonString(); PaymentVar.Data = data.ToJsonString();
ctx.Update(PaymentVar); ctx.Update(PaymentVar);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
}
LockContext = false; LockContext = false;
await App.HintContextChange(); await App.HintContextChange();
} catch (Exception exc) { } catch (Exception exc) {

View File

@ -6,7 +6,7 @@
xmlns:local="clr-namespace:Elwig.Windows" xmlns:local="clr-namespace:Elwig.Windows"
xmlns:vm="clr-namespace:Elwig.ViewModels" xmlns:vm="clr-namespace:Elwig.ViewModels"
xmlns:ctrl="clr-namespace:Elwig.Controls" xmlns:ctrl="clr-namespace:Elwig.Controls"
Title="{Binding Title}" Height="720" Width="1100" MinHeight="720" MinWidth="1000" Title="{Binding Title}" Height="720" Width="1150" MinHeight="720" MinWidth="1000"
Loaded="Window_Loaded"> Loaded="Window_Loaded">
<Window.DataContext> <Window.DataContext>
<vm:DeliveryAdminViewModel/> <vm:DeliveryAdminViewModel/>
@ -176,6 +176,7 @@
<Bold>Zweigstelle</Bold>: z.B. musterort, ...<LineBreak/> <Bold>Zweigstelle</Bold>: z.B. musterort, ...<LineBreak/>
<Bold>Attribut</Bold>: z.B. kabinett, !kabinett (alle außer kabinett), ...<LineBreak/> <Bold>Attribut</Bold>: z.B. kabinett, !kabinett (alle außer kabinett), ...<LineBreak/>
<Bold>Bewirtschaftung</Bold>: z.B. bio, !kip (alle außer KIP), ...<LineBreak/> <Bold>Bewirtschaftung</Bold>: z.B. bio, !kip (alle außer KIP), ...<LineBreak/>
<Bold>Gewicht</Bold>: z.B. &lt;500kg, &gt;6000kg, ... (gilt für Gewicht der gesamten Lieferung)<LineBreak/>
<Bold>Datum</Bold>: z.B. 1.9., 15.9.-10.10., -15.10.2020, ...<LineBreak/> <Bold>Datum</Bold>: z.B. 1.9., 15.9.-10.10., -15.10.2020, ...<LineBreak/>
<Bold>Uhrzeit</Bold>: z.B. 06:00-08:00, 18:00-, ...<LineBreak/> <Bold>Uhrzeit</Bold>: z.B. 06:00-08:00, 18:00-, ...<LineBreak/>
<Bold>Handwiegung</Bold>: handw[iegung], !Handw[iegung] (alle ohne Handwiegung)<LineBreak/> <Bold>Handwiegung</Bold>: handw[iegung], !Handw[iegung] (alle ohne Handwiegung)<LineBreak/>

View File

@ -8,7 +8,7 @@
xmlns:local="clr-namespace:Elwig.Windows" xmlns:local="clr-namespace:Elwig.Windows"
xmlns:vm="clr-namespace:Elwig.ViewModels" xmlns:vm="clr-namespace:Elwig.ViewModels"
xmlns:ctrl="clr-namespace:Elwig.Controls" xmlns:ctrl="clr-namespace:Elwig.Controls"
Title="Traubenanmeldungen - Elwig" Height="700" Width="940" MinWidth="600" MinHeight="400" Title="Traubenanmeldungen - Elwig" Height="700" Width="980" MinWidth="600" MinHeight="400"
Loaded="Window_Loaded"> Loaded="Window_Loaded">
<Window.DataContext> <Window.DataContext>
<vm:DeliveryAncmtAdminViewModel/> <vm:DeliveryAncmtAdminViewModel/>
@ -81,7 +81,7 @@
<Grid Grid.Row="1" Margin="5,0,0,0"> <Grid Grid.Row="1" Margin="5,0,0,0">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="35"/> <RowDefinition Height="42"/>
<RowDefinition Height="1*" MinHeight="100"/> <RowDefinition Height="1*" MinHeight="100"/>
<RowDefinition Height="5"/> <RowDefinition Height="5"/>
<RowDefinition Height="2*" MinHeight="100"/> <RowDefinition Height="2*" MinHeight="100"/>
@ -94,7 +94,7 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBox x:Name="SearchInput" Text="{Binding SearchQuery, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding EnableSearchInputs}" <TextBox x:Name="SearchInput" Text="{Binding SearchQuery, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding EnableSearchInputs}"
Grid.ColumnSpan="3" Margin="5,5,174,0" IsReadOnly="False" Grid.ColumnSpan="3" Margin="5,10,174,0" IsReadOnly="False"
TextChanged="SearchInput_TextChanged"> TextChanged="SearchInput_TextChanged">
<TextBox.ToolTip> <TextBox.ToolTip>
<TextBlock> <TextBlock>
@ -111,11 +111,14 @@
</TextBox> </TextBox>
<ctrl:IntegerUpDown x:Name="SeasonInput" Text="{Binding FilterSeasonString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding EnableSearchInputs}" <ctrl:IntegerUpDown x:Name="SeasonInput" Text="{Binding FilterSeasonString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding EnableSearchInputs}"
Grid.ColumnSpan="3" Height="25" Width="56" FontSize="14" Minimum="1900" Maximum="9999" Grid.ColumnSpan="3" Height="25" Width="56" FontSize="14" Minimum="1900" Maximum="9999"
Margin="5,5,113,0" VerticalAlignment="Top" HorizontalAlignment="Right" Margin="5,10,113,0" VerticalAlignment="Top" HorizontalAlignment="Right"
TextChanged="SeasonInput_TextChanged"/> TextChanged="SeasonInput_TextChanged"/>
<CheckBox x:Name="OnlyUpcomingInput" Content="Nur zukünftige" IsChecked="{Binding FilterOnlyUpcoming, Mode=TwoWay}" IsEnabled="{Binding EnableSearchInputs}" <CheckBox x:Name="OnlyUpcomingInput" Content="Nur zukünftige" IsChecked="{Binding FilterOnlyUpcoming, Mode=TwoWay}" IsEnabled="{Binding EnableSearchInputs}"
HorizontalAlignment="Right" Margin="0,10,10,0" VerticalAlignment="Top" Grid.Column="0" Grid.ColumnSpan="3" HorizontalAlignment="Right" Margin="0,7,10,0" VerticalAlignment="Top" Grid.Column="0" Grid.ColumnSpan="3"
Checked="OnlyUpcomingInput_Changed" Unchecked="OnlyUpcomingInput_Changed"/> Checked="OnlyUpcomingInput_Changed" Unchecked="OnlyUpcomingInput_Changed"/>
<CheckBox x:Name="FromAllSchedulesInput" Content="Alle Lesepläne" IsChecked="{Binding FilterFromAllSchedules, Mode=TwoWay}" IsEnabled="{Binding EnableSearchInputs}"
HorizontalAlignment="Right" Margin="0,24,13.5,0" VerticalAlignment="Top" Grid.Column="0" Grid.ColumnSpan="3"
Checked="FromAllSchedulesInput_Changed" Unchecked="FromAllSchedulesInput_Changed"/>
<ListBox x:Name="DeliveryScheduleList" SelectedItem="{Binding SelectedDeliverySchedule, Mode=TwoWay}" ItemsSource="{Binding DeliverySchedules, Mode=TwoWay}" <ListBox x:Name="DeliveryScheduleList" SelectedItem="{Binding SelectedDeliverySchedule, Mode=TwoWay}" ItemsSource="{Binding DeliverySchedules, Mode=TwoWay}"
Grid.Row="1" Grid.ColumnSpan="3" Margin="5,0,5,5" VerticalAlignment="Stretch" IsEnabled="{Binding EnableSearchInputs}" Grid.Row="1" Grid.ColumnSpan="3" Margin="5,0,5,5" VerticalAlignment="Stretch" IsEnabled="{Binding EnableSearchInputs}"
@ -145,6 +148,13 @@
SelectionChanged="DeliveryAncmtList_SelectionChanged" SelectionChanged="DeliveryAncmtList_SelectionChanged"
Margin="5,5,5,0" Grid.Row="3" FontSize="14" Grid.ColumnSpan="3"> Margin="5,5,5,0" Grid.Row="3" FontSize="14" Grid.ColumnSpan="3">
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Header="Datum" Binding="{Binding Schedule.Date, StringFormat='{}{0:dd.MM.yy}'}" Width="60">
<DataGridTextColumn.CellStyle>
<Style>
<Setter Property="TextBlock.TextAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="MgNr." Binding="{Binding MgNr, StringFormat='{}{0} '}" Width="50"> <DataGridTextColumn Header="MgNr." Binding="{Binding MgNr, StringFormat='{}{0} '}" Width="50">
<DataGridTextColumn.CellStyle> <DataGridTextColumn.CellStyle>
<Style> <Style>
@ -152,7 +162,7 @@
</Style> </Style>
</DataGridTextColumn.CellStyle> </DataGridTextColumn.CellStyle>
</DataGridTextColumn> </DataGridTextColumn>
<DataGridTextColumn Header="Mitglied" Binding="{Binding Member.AdministrativeName}" Width="180"/> <DataGridTextColumn Header="Mitglied" Binding="{Binding Member.AdministrativeName}" Width="160"/>
<DataGridTextColumn Header="Sorte" Binding="{Binding SortId}" Width="50"> <DataGridTextColumn Header="Sorte" Binding="{Binding SortId}" Width="50">
<DataGridTextColumn.CellStyle> <DataGridTextColumn.CellStyle>
<Style> <Style>
@ -167,6 +177,13 @@
</Style> </Style>
</DataGridTextColumn.CellStyle> </DataGridTextColumn.CellStyle>
</DataGridTextColumn> </DataGridTextColumn>
<DataGridTextColumn Header="Angemeldet" Binding="{Binding CreatedTimestamp, StringFormat='{}{0:HH:mm, dd.MM.}'}" Width="100">
<DataGridTextColumn.CellStyle>
<Style>
<Setter Property="TextBlock.TextAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
</DataGrid.Columns> </DataGrid.Columns>
</DataGrid> </DataGrid>

View File

@ -25,7 +25,7 @@ namespace Elwig.Windows {
CommandBindings.Add(new CommandBinding(CtrlP, Menu_DeliveryAncmtList_ShowSelected_Click)); CommandBindings.Add(new CommandBinding(CtrlP, Menu_DeliveryAncmtList_ShowSelected_Click));
CommandBindings.Add(new CommandBinding(CtrlShiftP, Menu_DeliveryAncmtList_PrintSelected_Click)); CommandBindings.Add(new CommandBinding(CtrlShiftP, Menu_DeliveryAncmtList_PrintSelected_Click));
ExemptInputs = [ ExemptInputs = [
SearchInput, SeasonInput, OnlyUpcomingInput, DeliveryScheduleList, DeliveryAncmtList, SearchInput, SeasonInput, OnlyUpcomingInput, FromAllSchedulesInput, DeliveryScheduleList, DeliveryAncmtList,
]; ];
RequiredInputs = [ RequiredInputs = [
MgNrInput, MemberInput, DeliveryScheduleInput, SortIdInput, WineVarietyInput, WeightInput, MgNrInput, MemberInput, DeliveryScheduleInput, SortIdInput, WineVarietyInput, WeightInput,
@ -85,14 +85,15 @@ namespace Elwig.Windows {
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
var deliverySchedules = await ctx.DeliverySchedules var deliverySchedules = await ctx.DeliverySchedules
.Where(s => s.Year == ViewModel.FilterSeason) .Where(s => s.Year == ViewModel.FilterSeason)
.Where(s => !ViewModel.FilterOnlyUpcoming || s.DateString.CompareTo(Utils.Today.ToString("yyyy-MM-dd")) >= 0)
.Include(s => s.Branch) .Include(s => s.Branch)
.Include(s => s.Announcements) .Include(s => s.Announcements)
.OrderBy(s => s.DateString) .OrderBy(s => s.DateString)
.ThenBy(s => s.Branch.Name) .ThenBy(s => s.Branch.Name)
.ThenBy(s => s.Description) .ThenBy(s => s.Description)
.ToListAsync(); .ToListAsync();
ControlUtils.RenewItemsSource(DeliveryScheduleList, deliverySchedules, DeliveryScheduleList_SelectionChanged, ControlUtils.RenewSourceDefault.First); ControlUtils.RenewItemsSource(DeliveryScheduleList, deliverySchedules
.Where(s => !ViewModel.FilterOnlyUpcoming || s.DateString.CompareTo(Utils.Today.ToString("yyyy-MM-dd")) >= 0)
.ToList(), DeliveryScheduleList_SelectionChanged, ViewModel.FilterFromAllSchedules ? ControlUtils.RenewSourceDefault.None : ControlUtils.RenewSourceDefault.First);
ControlUtils.RenewItemsSource(DeliveryScheduleInput, deliverySchedules, DeliveryScheduleInput_SelectionChanged); ControlUtils.RenewItemsSource(DeliveryScheduleInput, deliverySchedules, DeliveryScheduleInput_SelectionChanged);
} }
@ -109,6 +110,7 @@ namespace Elwig.Windows {
var dict = deliveryAncmts.AsParallel() var dict = deliveryAncmts.AsParallel()
.ToDictionary(a => a, a => a.SearchScore(filter)) .ToDictionary(a => a, a => a.SearchScore(filter))
.OrderByDescending(a => a.Value) .OrderByDescending(a => a.Value)
.ThenBy(a => a.Key.Schedule.DateString)
.ThenBy(a => a.Key.Member.Name) .ThenBy(a => a.Key.Member.Name)
.ThenBy(a => a.Key.Member.GivenName) .ThenBy(a => a.Key.Member.GivenName)
.ThenBy(a => a.Key.Member.MgNr); .ThenBy(a => a.Key.Member.MgNr);
@ -119,7 +121,8 @@ namespace Elwig.Windows {
.ToList(); .ToList();
} else { } else {
deliveryAncmts = deliveryAncmts deliveryAncmts = deliveryAncmts
.OrderBy(a => a.Member.Name) .OrderBy(a => a.Schedule.DateString)
.ThenBy(a => a.Member.Name)
.ThenBy(a => a.Member.GivenName) .ThenBy(a => a.Member.GivenName)
.ThenBy(a => a.Member.MgNr) .ThenBy(a => a.Member.MgNr)
.ToList(); .ToList();
@ -186,11 +189,13 @@ namespace Elwig.Windows {
Menu_DeliveryAncmtList_ShowSelected.IsEnabled = !IsEditing && !IsCreating; Menu_DeliveryAncmtList_ShowSelected.IsEnabled = !IsEditing && !IsCreating;
Menu_DeliveryAncmtList_SavePdfSelected.IsEnabled = !IsEditing && !IsCreating; Menu_DeliveryAncmtList_SavePdfSelected.IsEnabled = !IsEditing && !IsCreating;
Menu_DeliveryAncmtList_PrintSelected.IsEnabled = !IsEditing && !IsCreating; Menu_DeliveryAncmtList_PrintSelected.IsEnabled = !IsEditing && !IsCreating;
ViewModel.FilterFromAllSchedules = false;
} else { } else {
Menu_DeliveryAncmtList_SaveSelected.IsEnabled = false; Menu_DeliveryAncmtList_SaveSelected.IsEnabled = false;
Menu_DeliveryAncmtList_ShowSelected.IsEnabled = false; Menu_DeliveryAncmtList_ShowSelected.IsEnabled = false;
Menu_DeliveryAncmtList_SavePdfSelected.IsEnabled = false; Menu_DeliveryAncmtList_SavePdfSelected.IsEnabled = false;
Menu_DeliveryAncmtList_PrintSelected.IsEnabled = false; Menu_DeliveryAncmtList_PrintSelected.IsEnabled = false;
ViewModel.FilterFromAllSchedules = true;
} }
} }
@ -200,6 +205,16 @@ namespace Elwig.Windows {
private async void OnlyUpcomingInput_Changed(object sender, RoutedEventArgs evt) { private async void OnlyUpcomingInput_Changed(object sender, RoutedEventArgs evt) {
await RefreshDeliveryScheduleList(); await RefreshDeliveryScheduleList();
await RefreshList(true);
}
private async void FromAllSchedulesInput_Changed(object sender, RoutedEventArgs evt) {
if (ViewModel.FilterFromAllSchedules) {
DeliveryScheduleList.SelectedItem = null;
} else if (DeliveryScheduleList.SelectedItem == null) {
ViewModel.FilterFromAllSchedules = true;
}
await RefreshList(true);
} }
private async void SearchInput_TextChanged(object sender, TextChangedEventArgs evt) { private async void SearchInput_TextChanged(object sender, TextChangedEventArgs evt) {
@ -242,6 +257,7 @@ namespace Elwig.Windows {
private async void NewDeliveryAncmtButton_Click(object? sender, RoutedEventArgs? evt) { private async void NewDeliveryAncmtButton_Click(object? sender, RoutedEventArgs? evt) {
IsCreating = true; IsCreating = true;
DeliveryAncmtList.IsEnabled = false; DeliveryAncmtList.IsEnabled = false;
var mgnr = ViewModel.MgNr;
ViewModel.SelectedDeliveryAncmt = null; ViewModel.SelectedDeliveryAncmt = null;
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
@ -258,6 +274,7 @@ namespace Elwig.Windows {
ShowSaveResetCancelButtons(); ShowSaveResetCancelButtons();
UnlockInputs(); UnlockInputs();
InitInputs(); InitInputs();
ViewModel.MgNr = mgnr;
ViewModel.EnableSearchInputs = false; ViewModel.EnableSearchInputs = false;
} }
@ -336,6 +353,7 @@ namespace Elwig.Windows {
await RefreshList(); await RefreshList();
await RefreshInputs(); await RefreshInputs();
ViewModel.SearchQuery = ""; ViewModel.SearchQuery = "";
ControlUtils.SelectItemWithPk(DeliveryScheduleList, year, dsnr);
if (sortid != null) if (sortid != null)
ControlUtils.SelectItemWithPk(DeliveryAncmtList, year, dsnr, mgnr, sortid); ControlUtils.SelectItemWithPk(DeliveryAncmtList, year, dsnr, mgnr, sortid);
} }

View File

@ -225,18 +225,21 @@ namespace Elwig.Windows {
private async void AddButton_Click(object sender, RoutedEventArgs evt) { private async void AddButton_Click(object sender, RoutedEventArgs evt) {
try { try {
using var ctx = new AppDbContext(); PaymentVar? v;
var v = new PaymentVar { using (var ctx = new AppDbContext()) {
Year = Year, v = new PaymentVar {
AvNr = await ctx.NextAvNr(Year), Year = Year,
Name = "Neue Auszahlungsvariante", AvNr = await ctx.NextAvNr(Year),
TestVariant = true, Name = "Neue Auszahlungsvariante",
DateString = $"{DateTime.Today:yyyy-MM-dd}", TestVariant = true,
Data = "{\"mode\": \"elwig\", \"version\": 1, \"payment\": {}, \"curves\": []}", DateString = $"{DateTime.Today:yyyy-MM-dd}",
}; Data = "{\"mode\": \"elwig\", \"version\": 1, \"payment\": {}, \"curves\": []}",
};
ctx.Add(v);
await ctx.SaveChangesAsync();
}
ctx.Add(v);
await ctx.SaveChangesAsync();
await App.HintContextChange(); await App.HintContextChange();
ControlUtils.SelectItem(PaymentVariantList, v); ControlUtils.SelectItem(PaymentVariantList, v);
@ -250,18 +253,21 @@ namespace Elwig.Windows {
private async void CopyButton_Click(object sender, RoutedEventArgs evt) { private async void CopyButton_Click(object sender, RoutedEventArgs evt) {
if (PaymentVariantList.SelectedItem is not PaymentVar orig) return; if (PaymentVariantList.SelectedItem is not PaymentVar orig) return;
try { try {
using var ctx = new AppDbContext(); PaymentVar? n;
var n = new PaymentVar { using (var ctx = new AppDbContext()) {
Year = orig.Year, n = new PaymentVar {
AvNr = await ctx.NextAvNr(Year), Year = orig.Year,
Name = $"{orig.Name} (Kopie)", AvNr = await ctx.NextAvNr(Year),
TestVariant = true, Name = $"{orig.Name} (Kopie)",
DateString = $"{DateTime.Today:yyyy-MM-dd}", TestVariant = true,
Data = orig.Data, DateString = $"{DateTime.Today:yyyy-MM-dd}",
}; Data = orig.Data,
};
ctx.Add(n);
await ctx.SaveChangesAsync();
}
ctx.Add(n);
await ctx.SaveChangesAsync();
await App.HintContextChange(); await App.HintContextChange();
ControlUtils.SelectItem(PaymentVariantList, n); ControlUtils.SelectItem(PaymentVariantList, n);
@ -275,9 +281,10 @@ namespace Elwig.Windows {
private async void DeleteButton_Click(object sender, RoutedEventArgs evt) { private async void DeleteButton_Click(object sender, RoutedEventArgs evt) {
if (PaymentVariantList.SelectedItem is not PaymentVar v || !v.TestVariant) return; if (PaymentVariantList.SelectedItem is not PaymentVar v || !v.TestVariant) return;
try { try {
using var ctx = new AppDbContext(); using (var ctx = new AppDbContext()) {
ctx.Remove(v); ctx.Remove(v);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
}
await App.HintContextChange(); await App.HintContextChange();
} catch (Exception exc) { } catch (Exception exc) {
var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message; var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message;

View File

@ -18,11 +18,11 @@ namespace Tests.DocumentTests {
Assert.That(text, Contains.Substring("Anmeldeliste")); Assert.That(text, Contains.Substring("Anmeldeliste"));
Assert.That(text, Contains.Substring("01.10.2020 Matzen GV Kabinettaktion")); Assert.That(text, Contains.Substring("01.10.2020 Matzen GV Kabinettaktion"));
Assert.That(table, Is.EqualTo(new string[][] { Assert.That(table, Is.EqualTo(new string[][] {
["01.10.2020", "101 MUSTERMANN Max", "Grüner Veltliner", "5 000"], ["01.10.2020", "101 MUSTERMANN Max", "Grüner Veltliner", "-", "5 000"],
["01.10.2020", "102 WEINBAUER Wernhardt", "Grüner Veltliner", "10 000"], ["01.10.2020", "102 WEINBAUER Wernhardt", "Grüner Veltliner", "-", "10 000"],
["01.10.2020", "103 MUSTERBAUER Matthäus", "Grüner Veltliner", "8 000"], ["01.10.2020", "103 MUSTERBAUER Matthäus", "Grüner Veltliner", "-", "8 000"],
["01.10.2020", "104 WINZER Waltraud", "Grüner Veltliner", "2 000"], ["01.10.2020", "104 WINZER Waltraud", "Grüner Veltliner", "-", "2 000"],
["Gesamt:", "Anmeldungen: 4", "25 000"], ["Gesamt:", "Anmeldungen: 4", "25 000"],
})); }));
}); });
} }

View File

@ -80,17 +80,17 @@ namespace Tests.HelperTests {
} }
private Task<Dictionary<string, AreaComBucket>> GetMemberAreaCommitmentBuckets(int year, int mgnr) { private Task<Dictionary<string, AreaComBucket>> GetMemberAreaCommitmentBuckets(int year, int mgnr) {
var ctx = new AppDbContext(); using var ctx = new AppDbContext();
return ctx.GetMemberAreaCommitmentBuckets(year, mgnr, Connection); return ctx.GetMemberAreaCommitmentBuckets(year, mgnr, Connection);
} }
private Task<Dictionary<string, int>> GetMemberDeliveryBuckets(int year, int mgnr) { private Task<Dictionary<string, int>> GetMemberDeliveryBuckets(int year, int mgnr) {
var ctx = new AppDbContext(); using var ctx = new AppDbContext();
return ctx.GetMemberDeliveryBuckets(year, mgnr, Connection); return ctx.GetMemberDeliveryBuckets(year, mgnr, Connection);
} }
private Task<Dictionary<string, int>> GetMemberPaymentBuckets(int year, int mgnr) { private Task<Dictionary<string, int>> GetMemberPaymentBuckets(int year, int mgnr) {
var ctx = new AppDbContext(); using var ctx = new AppDbContext();
return ctx.GetMemberPaymentBuckets(year, mgnr, Connection); return ctx.GetMemberPaymentBuckets(year, mgnr, Connection);
} }