Compare commits

...

17 Commits

Author SHA1 Message Date
cadb5515ea Bump version to 0.11.0
All checks were successful
Deploy / Build and Deploy (push) Successful in 2m9s
2024-09-16 11:17:23 +02:00
d8a10152b3 DeliveryScheduleAdminWindow: Add Attribute, Cultivation and IsCancelled
All checks were successful
Test / Run tests (push) Successful in 1m37s
2024-09-16 10:10:31 +02:00
f09c43c1bd App: Make HintContextChange() synchronous by using MainDispatcher
All checks were successful
Test / Run tests (push) Successful in 2m37s
2024-09-12 11:40:32 +02:00
5c08f61963 MailWindow: Add feature to address members with ancmts on specific day
All checks were successful
Test / Run tests (push) Successful in 2m28s
2024-09-08 15:55:10 +02:00
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
40 changed files with 552 additions and 253 deletions

View File

@ -3,6 +3,63 @@ Changelog
========= =========
[v0.11.0][v0.11.0] (2024-09-16) {#v0.11.0}
------------------------------------------
### Neue Funktionen {#v0.11.0-features}
* Im Rundschreiben-Fenster (`MailWindow`) können jetzt auch Funktionäre, Bio-Betriebe oder angemeldete Mitglieder für einen Leseplan adressiert werden. (5c08f61963)
* Im Leseplan-Fenster (`DeliveryScheduleAdminWindow`) können nun auch Attribut, Bewirtschaftungsart, und ob der Leseplan abgesagt ist angegeben werden. (d8a10152b3)
### Sonstiges {#v0.11.0-misc}
* `App.HintContextChange()` ist synchron und fügt Arbeitsaufträge dem Dispatcher hinzu. (f09c43c1bd)
[v0.11.0]: https://git.necronda.net/winzer/elwig/releases/tag/v0.11.0
[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);
@ -79,7 +79,7 @@ namespace Elwig {
} }
private static void OnContextChanged() { private static void OnContextChanged() {
MainDispatcher.BeginInvoke(async () => await HintContextChange()); MainDispatcher.BeginInvoke(HintContextChange);
} }
private static void OverrideCulture() { private static void OverrideCulture() {
@ -201,11 +201,13 @@ namespace Elwig {
BranchMobileNr = entry.Item8; BranchMobileNr = entry.Item8;
} }
public static async Task HintContextChange() { public static void 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(); MainDispatcher.BeginInvoke(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.11.0</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

@ -9,7 +9,7 @@ namespace Elwig.Helpers {
public static class AppDbUpdater { public static class AppDbUpdater {
// Don't forget to update value in Tests/fetch-resources.bat! // Don't forget to update value in Tests/fetch-resources.bat!
public static readonly int RequiredSchemaVersion = 28; public static readonly int RequiredSchemaVersion = 29;
private static int VersionOffset = 0; private static int VersionOffset = 0;

View File

@ -274,7 +274,7 @@ namespace Elwig.Helpers.Export {
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
await AddImportedFiles(Path.GetFileName(meta.FileName)); await AddImportedFiles(Path.GetFileName(meta.FileName));
} }
await App.HintContextChange(); App.HintContextChange();
MessageBox.Show( MessageBox.Show(
$"Das importieren der Daten war erfolgreich!\n" + $"Das importieren der Daten war erfolgreich!\n" +

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

@ -29,6 +29,15 @@ namespace Elwig.Models.Entities {
[Column("description")] [Column("description")]
public required string Description { get; set; } public required string Description { get; set; }
[NotMapped]
public string Identifier => $"{Date:dd.MM.} - {ZwstId} - {Description}";
[Column("attrid")]
public string? AttrId { get; set; }
[Column("cultid")]
public string? CultId { get; set; }
[Column("max_weight")] [Column("max_weight")]
public int? MaxWeight { get; set; } public int? MaxWeight { get; set; }
[NotMapped] [NotMapped]
@ -36,6 +45,9 @@ namespace Elwig.Models.Entities {
[NotMapped] [NotMapped]
public double? Percent => (double)AnnouncedWeight / MaxWeight * 100; public double? Percent => (double)AnnouncedWeight / MaxWeight * 100;
[Column("cancelled")]
public bool IsCancelled { get; set; }
[Column("ancmt_from")] [Column("ancmt_from")]
public long? AncmtFromUnix { get; set; } public long? AncmtFromUnix { get; set; }
[NotMapped] [NotMapped]
@ -58,6 +70,12 @@ namespace Elwig.Models.Entities {
[ForeignKey("ZwstId")] [ForeignKey("ZwstId")]
public virtual Branch Branch { get; private set; } = null!; public virtual Branch Branch { get; private set; } = null!;
[ForeignKey("AttrId")]
public virtual WineAttr? Attribute { get; private set; }
[ForeignKey("CultId")]
public virtual WineCult? Cultivation { get; private set; }
[InverseProperty(nameof(DeliveryScheduleWineVar.Schedule))] [InverseProperty(nameof(DeliveryScheduleWineVar.Schedule))]
public virtual ICollection<DeliveryScheduleWineVar> Varieties { get; private set; } = null!; public virtual ICollection<DeliveryScheduleWineVar> Varieties { get; private set; } = null!;

View File

@ -167,6 +167,9 @@ namespace Elwig.Models.Entities {
[InverseProperty(nameof(BillingAddr.Member))] [InverseProperty(nameof(BillingAddr.Member))]
public virtual BillingAddr? BillingAddress { get; private set; } public virtual BillingAddr? BillingAddress { get; private set; }
[InverseProperty(nameof(Delivery.Member))]
public virtual ICollection<DeliveryAncmt> Announcements { get; private set; } = null!;
[InverseProperty(nameof(Delivery.Member))] [InverseProperty(nameof(Delivery.Member))]
public virtual ICollection<Delivery> Deliveries { get; private set; } = null!; public virtual ICollection<Delivery> Deliveries { get; private set; } = null!;

View File

@ -0,0 +1,23 @@
-- schema version 28 to 29
ALTER TABLE delivery_schedule ADD COLUMN attrid TEXT DEFAULT NULL;
ALTER TABLE delivery_schedule ADD COLUMN cultid TEXT DEFAULT NULL;
ALTER TABLE delivery_schedule ADD COLUMN cancelled INTEGER NOT NULL CHECK (cancelled IN (TRUE, FALSE)) DEFAULT FALSE;
UPDATE delivery_schedule SET cultid = 'B' WHERE UPPER(description) LIKE '%BIO%';
UPDATE delivery_schedule SET cancelled = TRUE WHERE zwstid = 'M' AND date IN ('2024-09-14', '2024-09-16');
PRAGMA writable_schema = ON;
UPDATE sqlite_schema SET sql = REPLACE(sql, '
) STRICT', ',
CONSTRAINT fk_delivery_schedule_wine_attribute FOREIGN KEY (attrid) REFERENCES wine_attribute (attrid)
ON UPDATE CASCADE
ON DELETE RESTRICT,
CONSTRAINT fk_delivery_schedule_wine_cultivation FOREIGN KEY (cultid) REFERENCES wine_cultivation (cultid)
ON UPDATE CASCADE
ON DELETE RESTRICT
) STRICT')
WHERE type = 'table' AND name = 'delivery_schedule';
PRAGMA schema_version = 2801;
PRAGMA writable_schema = OFF;

View File

@ -100,42 +100,43 @@ 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) {
ctx.Update(a);
} else {
ctx.Add(a);
}
await ctx.SaveChangesAsync();
if (newFbNr != a.FbNr) {
await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment SET fbnr = {newFbNr} WHERE fbnr = {oldFbNr}");
}
} }
if (oldFbNr != null) { App.HintContextChange();
ctx.Update(a);
} else {
ctx.Add(a);
}
await ctx.SaveChangesAsync();
if (newFbNr != a.FbNr) {
await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment SET fbnr = {newFbNr} WHERE fbnr = {oldFbNr}");
}
await App.HintContextChange();
return newFbNr; return newFbNr;
} }

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}");
} }
@ -125,7 +125,7 @@ namespace Elwig.Services {
} }
} }
await App.HintContextChange(); App.HintContextChange();
return (year, dsnr, newMgNr, newSortId); return (year, dsnr, newMgNr, newSortId);
} }

View File

@ -26,6 +26,7 @@ namespace Elwig.Services {
vm.Branch = (Branch?)ControlUtils.GetItemFromSourceWithPk(vm.BranchSource, s.ZwstId); vm.Branch = (Branch?)ControlUtils.GetItemFromSourceWithPk(vm.BranchSource, s.ZwstId);
vm.Description = s.Description; vm.Description = s.Description;
vm.MaxWeight = s.MaxWeight; vm.MaxWeight = s.MaxWeight;
vm.IsCancelled = s.IsCancelled;
vm.MainVarieties.Clear(); vm.MainVarieties.Clear();
foreach (var v in s.Varieties.Where(v => v.Priority == 1)) { foreach (var v in s.Varieties.Where(v => v.Priority == 1)) {
vm.MainVarieties.Add((WineVar)ControlUtils.GetItemFromSourceWithPk(vm.MainVarietiesSource, v.SortId)!); vm.MainVarieties.Add((WineVar)ControlUtils.GetItemFromSourceWithPk(vm.MainVarietiesSource, v.SortId)!);
@ -34,6 +35,8 @@ namespace Elwig.Services {
foreach (var v in s.Varieties.Where(v => v.Priority != 1)) { foreach (var v in s.Varieties.Where(v => v.Priority != 1)) {
vm.OtherVarieties.Add((WineVar)ControlUtils.GetItemFromSourceWithPk(vm.OtherVarietiesSource, v.SortId)!); vm.OtherVarieties.Add((WineVar)ControlUtils.GetItemFromSourceWithPk(vm.OtherVarietiesSource, v.SortId)!);
} }
vm.Attribute = ControlUtils.GetItemFromSourceWithPk(vm.AttributeSource, s.AttrId) as WineAttr;
vm.Cultivation = ControlUtils.GetItemFromSourceWithPk(vm.CultivationSource, s.CultId) as WineCult;
vm.AncmtFrom = s.AncmtFrom; vm.AncmtFrom = s.AncmtFrom;
vm.AncmtTo = s.AncmtTo?.AddSeconds(-1); vm.AncmtTo = s.AncmtTo?.AddSeconds(-1);
} }
@ -156,7 +159,10 @@ namespace Elwig.Services {
DateString = $"{vm.Date:yyyy-MM-dd}", DateString = $"{vm.Date:yyyy-MM-dd}",
ZwstId = vm.Branch!.ZwstId, ZwstId = vm.Branch!.ZwstId,
Description = vm.Description, Description = vm.Description,
AttrId = vm.Attribute?.AttrId,
CultId = vm.Cultivation?.CultId,
MaxWeight = vm.MaxWeight, MaxWeight = vm.MaxWeight,
IsCancelled = vm.IsCancelled,
AncmtFrom = vm.AncmtFrom, AncmtFrom = vm.AncmtFrom,
AncmtTo = vm.AncmtTo?.AddMinutes(1), AncmtTo = vm.AncmtTo?.AddMinutes(1),
}; };
@ -177,7 +183,7 @@ namespace Elwig.Services {
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
} }
await App.HintContextChange(); App.HintContextChange();
} }
} }
} }

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

@ -338,7 +338,7 @@ namespace Elwig.Services {
var b = new Billing(year); var b = new Billing(year);
await b.FinishSeason(); await b.FinishSeason();
await b.CalculateBuckets(); await b.CalculateBuckets();
await App.HintContextChange(); App.HintContextChange();
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
var data = await DeliveryConfirmationDeliveryData.ForMember(ctx.DeliveryParts, year, m); var data = await DeliveryConfirmationDeliveryData.ForMember(ctx.DeliveryParts, year, m);
@ -502,129 +502,131 @@ 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(); App.HintContextChange();
return newMgNr; return newMgNr;
} }

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

@ -47,12 +47,30 @@ namespace Elwig.ViewModels {
get => int.TryParse(MaxWeightString, out var w) ? w : null; get => int.TryParse(MaxWeightString, out var w) ? w : null;
set => MaxWeightString = $"{value}"; set => MaxWeightString = $"{value}";
} }
[ObservableProperty]
private bool _isCancelled;
public ObservableCollection<WineVar> MainVarieties { get; set; } = []; public ObservableCollection<WineVar> MainVarieties { get; set; } = [];
[ObservableProperty] [ObservableProperty]
private IEnumerable<WineVar> _mainVarietiesSource = []; private IEnumerable<WineVar> _mainVarietiesSource = [];
public ObservableCollection<WineVar> OtherVarieties { get; set; } = []; public ObservableCollection<WineVar> OtherVarieties { get; set; } = [];
[ObservableProperty] [ObservableProperty]
private IEnumerable<WineVar> _otherVarietiesSource = []; private IEnumerable<WineVar> _otherVarietiesSource = [];
[ObservableProperty]
private IEnumerable<object> _attributeSource = [];
[ObservableProperty]
private object? _attributeObj;
public WineAttr? Attribute {
get => AttributeObj as WineAttr;
set => AttributeObj = value ?? AttributeSource.FirstOrDefault();
}
[ObservableProperty]
private IEnumerable<object> _cultivationSource = [];
[ObservableProperty]
private object? _cultivationObj;
public WineCult? Cultivation {
get => CultivationObj as WineCult;
set => CultivationObj = value ?? CultivationSource.FirstOrDefault();
}
[ObservableProperty] [ObservableProperty]
private string _ancmtFromDateString = ""; private string _ancmtFromDateString = "";

View File

@ -209,7 +209,7 @@ namespace Elwig.Windows {
ctx.Remove(a); ctx.Remove(a);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
} }
await App.HintContextChange(); 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;
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;

View File

@ -196,7 +196,7 @@ namespace Elwig.Windows {
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
MessageBox.Show(str, "Saison anlegen", MessageBoxButton.OK, MessageBoxImage.Error); MessageBox.Show(str, "Saison anlegen", MessageBoxButton.OK, MessageBoxImage.Error);
} }
await App.HintContextChange(); App.HintContextChange();
Mouse.OverrideCursor = null; Mouse.OverrideCursor = null;
SeasonList.SelectedIndex = 0; SeasonList.SelectedIndex = 0;
} }
@ -219,7 +219,7 @@ namespace Elwig.Windows {
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
MessageBox.Show(str, "Saison löschen", MessageBoxButton.OK, MessageBoxImage.Error); MessageBox.Show(str, "Saison löschen", MessageBoxButton.OK, MessageBoxImage.Error);
} }
await App.HintContextChange(); App.HintContextChange();
Mouse.OverrideCursor = null; Mouse.OverrideCursor = null;
} }
} }

View File

@ -340,7 +340,7 @@ namespace Elwig.Windows {
LockInputs(); LockInputs();
} }
await App.HintContextChange(); App.HintContextChange();
} }
private void FillInputs(ClientParameters p, Season? s) { private void FillInputs(ClientParameters p, Season? s) {

View File

@ -662,16 +662,17 @@ 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(); App.HintContextChange();
} catch (Exception exc) { } catch (Exception exc) {
var str = "Der Eintrag konnte nicht in der Datenbank gespeichert werden!\n\n" + exc.Message; var str = "Der Eintrag konnte nicht in der Datenbank gespeichert werden!\n\n" + exc.Message;
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;

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;
} }
@ -296,7 +313,7 @@ namespace Elwig.Windows {
ctx.Remove(a); ctx.Remove(a);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
} }
await App.HintContextChange(); 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;
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
@ -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

@ -195,29 +195,34 @@
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="110"/> <ColumnDefinition Width="110"/>
<ColumnDefinition/> <ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Label Content="Datum/Zwst.:" Margin="10,10,0,10"/> <Label Content="Datum/Zwst.:" Margin="10,10,0,10"/>
<TextBox x:Name="DateInput" Text="{Binding DateString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" <TextBox x:Name="DateInput" Text="{Binding DateString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Margin="0,10,10,10" Width="77" Grid.Column="1" HorizontalAlignment="Left" TextAlignment="Right" Margin="0,10,10,10" Width="77" Grid.Column="1" Grid.ColumnSpan="2" HorizontalAlignment="Left" TextAlignment="Right"
TextChanged="ScheduleDateInput_TextChanged" LostFocus="DateInput_LostFocus"/> TextChanged="ScheduleDateInput_TextChanged" LostFocus="DateInput_LostFocus"/>
<ComboBox x:Name="BranchInput" SelectedItem="{Binding Branch, Mode=TwoWay}" ItemsSource="{Binding BranchSource, Mode=TwoWay}" <ComboBox x:Name="BranchInput" SelectedItem="{Binding Branch, Mode=TwoWay}" ItemsSource="{Binding BranchSource, Mode=TwoWay}"
DisplayMemberPath="Name" TextSearch.TextPath="Name" DisplayMemberPath="Name" TextSearch.TextPath="Name"
Margin="82,10,10,10" Width="150" Grid.Column="1" HorizontalAlignment="Left"/> Margin="82,10,10,10" Width="150" Grid.Column="1" Grid.ColumnSpan="2" HorizontalAlignment="Left"/>
<Label Content="Beschreibung:" Margin="10,40,0,10"/> <Label Content="Beschreibung:" Margin="10,40,0,10"/>
<TextBox x:Name="DescriptionInput" Text="{Binding Description, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" <TextBox x:Name="DescriptionInput" Text="{Binding Description, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Margin="0,40,10,10" Grid.Column="1" Margin="0,40,10,10" Grid.Column="1" Grid.ColumnSpan="2"
TextChanged="TextBox_TextChanged"/> TextChanged="TextBox_TextChanged"/>
<Label Content="Max. Gewicht:" Margin="10,70,0,10"/> <Label Content="Max. Gewicht:" Margin="10,70,0,10"/>
<ctrl:UnitTextBox x:Name="MaxWeightInput" Unit="kg" Text="{Binding MaxWeightString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" <ctrl:UnitTextBox x:Name="MaxWeightInput" Unit="kg" Text="{Binding MaxWeightString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Margin="0,70,10,10" Grid.Column="1" Width="68" HorizontalAlignment="Left" Margin="0,70,10,10" Grid.Column="1" Grid.ColumnSpan="2" Width="68" HorizontalAlignment="Left"
TextChanged="MaxWeightInput_TextChanged"/> TextChanged="MaxWeightInput_TextChanged"/>
<CheckBox x:Name="CancelledInput" Content="Abgesagt" IsChecked="{Binding IsCancelled, Mode=TwoWay}"
Grid.Column="1" Grid.ColumnSpan="2" Margin="80,75,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"/>
<Label Content="Sorten:" Margin="10,100,0,10"/> <Label Content="Sorten:" Margin="10,100,0,10"/>
<ctrl:CheckComboBox x:Name="MainWineVarietiesInput" SelectedItems="{Binding MainVarieties}" ItemsSource="{Binding MainVarietiesSource, Mode=TwoWay}" <ctrl:CheckComboBox x:Name="MainWineVarietiesInput" SelectedItems="{Binding MainVarieties}" ItemsSource="{Binding MainVarietiesSource, Mode=TwoWay}"
Grid.Column="1" Margin="0,100,10,10" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,100,10,10"
Delimiter=", " AllItemsSelectedContent="Alle Sorten" ListDisplayMemberPath="SortId" TextSearch.TextPath="Name"> Delimiter=", " AllItemsSelectedContent="Alle Sorten" ListDisplayMemberPath="SortId" TextSearch.TextPath="Name">
<ctrl:CheckComboBox.ItemTemplateSelector> <ctrl:CheckComboBox.ItemTemplateSelector>
<ctrl:WineVarietyTemplateSelector/> <ctrl:WineVarietyTemplateSelector/>
@ -226,12 +231,20 @@
<Label Content="Weitere Sorten:" Margin="10,130,0,10"/> <Label Content="Weitere Sorten:" Margin="10,130,0,10"/>
<ctrl:CheckComboBox x:Name="OtherWineVarietiesInput" SelectedItems="{Binding OtherVarieties}" ItemsSource="{Binding OtherVarietiesSource, Mode=TwoWay}" <ctrl:CheckComboBox x:Name="OtherWineVarietiesInput" SelectedItems="{Binding OtherVarieties}" ItemsSource="{Binding OtherVarietiesSource, Mode=TwoWay}"
Grid.Column="1" Margin="0,130,10,10" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,130,10,10"
Delimiter=", " AllItemsSelectedContent="Alle Sorten" ListDisplayMemberPath="SortId" TextSearch.TextPath="Name"> Delimiter=", " AllItemsSelectedContent="Alle Sorten" ListDisplayMemberPath="SortId" TextSearch.TextPath="Name">
<ctrl:CheckComboBox.ItemTemplateSelector> <ctrl:CheckComboBox.ItemTemplateSelector>
<ctrl:WineVarietyTemplateSelector/> <ctrl:WineVarietyTemplateSelector/>
</ctrl:CheckComboBox.ItemTemplateSelector> </ctrl:CheckComboBox.ItemTemplateSelector>
</ctrl:CheckComboBox> </ctrl:CheckComboBox>
<Label Content="Attribut/Bewirt.:" Margin="10,160,0,10"/>
<ComboBox x:Name="AttributeInput" SelectedItem="{Binding AttributeObj, Mode=TwoWay}" ItemsSource="{Binding AttributeSource, Mode=TwoWay}"
Grid.Column="1" Margin="0,160,5,10"
DisplayMemberPath="Name"/>
<ComboBox x:Name="CultivationInput" SelectedItem="{Binding CultivationObj, Mode=TwoWay}" ItemsSource="{Binding CultivationSource, Mode=TwoWay}"
Grid.Column="2" Margin="0,160,10,10"
DisplayMemberPath="Name"/>
</Grid> </Grid>
</GroupBox> </GroupBox>

View File

@ -103,6 +103,12 @@ namespace Elwig.Windows {
var varieties = await ctx.WineVarieties.OrderBy(v => v.Name).ToListAsync(); var varieties = await ctx.WineVarieties.OrderBy(v => v.Name).ToListAsync();
ControlUtils.RenewItemsSource(MainWineVarietiesInput, varieties); ControlUtils.RenewItemsSource(MainWineVarietiesInput, varieties);
ControlUtils.RenewItemsSource(OtherWineVarietiesInput, varieties); ControlUtils.RenewItemsSource(OtherWineVarietiesInput, varieties);
var attrList = await ctx.WineAttributes.OrderBy(a => a.Name).Cast<object>().ToListAsync();
attrList.Insert(0, new NullItem("- Keine Angabe -"));
ControlUtils.RenewItemsSource(AttributeInput, attrList, null, ControlUtils.RenewSourceDefault.First);
var cultList = await ctx.WineCultivations.OrderBy(a => a.Name).Cast<object>().ToListAsync();
cultList.Insert(0, new NullItem("- Kein Angabe -"));
ControlUtils.RenewItemsSource(CultivationInput, cultList, null, ControlUtils.RenewSourceDefault.First);
await RefreshList(); await RefreshList();
} }
@ -177,7 +183,7 @@ namespace Elwig.Windows {
ctx.Remove(s); ctx.Remove(s);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
} }
await App.HintContextChange(); 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;
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;

View File

@ -108,36 +108,67 @@
<RadioButton GroupName="Recipients" x:Name="RecipientsAreaComMembersInput" Content="Mitglieder mit Flächenbindung" <RadioButton GroupName="Recipients" x:Name="RecipientsAreaComMembersInput" Content="Mitglieder mit Flächenbindung"
Margin="10,30,10,10" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,30,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/> Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/>
<RadioButton GroupName="Recipients" x:Name="RecipientsDeliveryMembersInput" Content="Lieferanten der Saison" <RadioButton GroupName="Recipients" x:Name="RecipientsDeliveryAncmtMembersInput" Content="Mitglieder mit Anmeldung"
Margin="10,50,10,10" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,50,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/> Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/>
<RadioButton GroupName="Recipients" x:Name="RecipientsNonDeliveryMembersInput" Content="Nicht-Lieferanten der Saison" <RadioButton GroupName="Recipients" x:Name="RecipientsDeliveryMembersInput" Content="Lieferanten der Saison"
Margin="10,70,10,10" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,70,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/> Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/>
<RadioButton GroupName="Recipients" x:Name="RecipientsCustomInput" Content="Benutzerdefiniert" <RadioButton GroupName="Recipients" x:Name="RecipientsNonDeliveryMembersInput" Content="Nicht-Lieferanten der Saison"
Margin="10,90,10,10" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,90,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/> Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/>
<RadioButton GroupName="Recipients" x:Name="RecipientsCustomInput" Content="Benutzerdefiniert"
Margin="10,110,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="RecipientsInput_Changed" Unchecked="RecipientsInput_Changed"/>
<Label Content="Zwst.:" x:Name="MemberBranchLabel" Margin="10,120,0,10"/> <Label Content="Zwst.:" x:Name="MemberBranchLabel" Margin="10,140,0,10"/>
<ctrl:CheckComboBox x:Name="MemberBranchInput" AllItemsSelectedContent="Alle Stammzweigstellen" Delimiter=", " DisplayMemberPath="Name" <ctrl:CheckComboBox x:Name="MemberBranchInput" AllItemsSelectedContent="Alle Stammzweigstellen" Delimiter=", " DisplayMemberPath="Name"
Margin="50,120,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25" Margin="50,140,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
SelectionChanged="MemberInput_SelectionChanged"/> SelectionChanged="MemberInput_SelectionChanged"/>
<Label Content="Gem.:" x:Name="MemberKgLabel" Margin="10,150,0,10"/> <Label Content="Gem.:" x:Name="MemberKgLabel" Margin="10,170,0,10"/>
<ctrl:CheckComboBox x:Name="MemberKgInput" AllItemsSelectedContent="Alle Stammgemeinden" Delimiter=", " DisplayMemberPath="Name" <ctrl:CheckComboBox x:Name="MemberKgInput" AllItemsSelectedContent="Alle Stammgemeinden" Delimiter=", " DisplayMemberPath="Name"
IsSelectAllActive="True" SelectAllContent="Alle Stammgemeinden" IsSelectAllActive="True" SelectAllContent="Alle Stammgemeinden"
Margin="50,150,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25" Margin="50,170,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
SelectionChanged="MemberInput_SelectionChanged"/> SelectionChanged="MemberInput_SelectionChanged"/>
<Label Content="Vtrg.:" x:Name="MemberAreaComLabel" Margin="10,180,0,10"/> <Label Content="Bio-Betrieb:" x:Name="MemberOrganicLabel" Margin="10,200,0,10"/>
<RadioButton x:Name="MemberOrganicYesInput" Content="Ja" GroupName="MemberOrganic"
Margin="80,205,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="MemberInput_Checked"/>
<RadioButton x:Name="MemberOrganicNoInput" Content="Nein" GroupName="MemberOrganic"
Margin="125,205,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="MemberInput_Checked"/>
<RadioButton x:Name="MemberOrganicIndifferentInput" Content="Egal" GroupName="MemberOrganic"
Margin="180,205,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="MemberInput_Checked"/>
<Label Content="Funktionär:" x:Name="MemberFunktionärLabel" Margin="10,230,0,10"/>
<RadioButton x:Name="MemberFunktionärYesInput" Content="Ja" GroupName="MemberFunktionär"
Margin="80,235,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="MemberInput_Checked"/>
<RadioButton x:Name="MemberFunktionärNoInput" Content="Nein" GroupName="MemberFunktionär"
Margin="125,235,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="MemberInput_Checked"/>
<RadioButton x:Name="MemberFunktionärIndifferentInput" Content="Egal" GroupName="MemberFunktionär"
Margin="180,235,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"
Checked="MemberInput_Checked"/>
<Label Content="Vtrg.:" x:Name="MemberAreaComLabel" Margin="10,260,0,10"/>
<ctrl:CheckComboBox x:Name="MemberAreaComInput" AllItemsSelectedContent="Alle Vertragsarten" Delimiter=", " DisplayMemberPath="VtrgId" <ctrl:CheckComboBox x:Name="MemberAreaComInput" AllItemsSelectedContent="Alle Vertragsarten" Delimiter=", " DisplayMemberPath="VtrgId"
IsSelectAllActive="True" SelectAllContent="Alle Vertragsarten" IsSelectAllActive="True" SelectAllContent="Alle Vertragsarten"
Margin="50,180,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25" Margin="50,260,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
SelectionChanged="MemberInput_SelectionChanged"/>
<Label Content="Tag:" x:Name="MemberDeliveryAncmtLabel" Margin="10,260,0,10"/>
<ctrl:CheckComboBox x:Name="MemberDeliveryAncmtInput" AllItemsSelectedContent="Alle Lesepläne" Delimiter=", " DisplayMemberPath="Identifier"
IsSelectAllActive="True" SelectAllContent="Alle Lesepläne"
Margin="50,260,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
SelectionChanged="MemberInput_SelectionChanged"/> SelectionChanged="MemberInput_SelectionChanged"/>
<ctrl:CheckComboBox x:Name="MemberCustomInput" AllItemsSelectedContent="Alle Mitglieder" Delimiter=", " DisplayMemberPath="AdministrativeName" <ctrl:CheckComboBox x:Name="MemberCustomInput" AllItemsSelectedContent="Alle Mitglieder" Delimiter=", " DisplayMemberPath="AdministrativeName"
IsSelectAllActive="True" SelectAllContent="Alle Mitglieder" IsSelectAllActive="True" SelectAllContent="Alle Mitglieder"
Margin="10,120,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25" Margin="10,140,10,10" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="25"
SelectionChanged="MemberInput_SelectionChanged"/> SelectionChanged="MemberInput_SelectionChanged"/>
</Grid> </Grid>
</GroupBox> </GroupBox>

View File

@ -116,6 +116,9 @@ namespace Elwig.Windows {
CreditNoteFooterInput.Visibility = Visibility.Hidden; CreditNoteFooterInput.Visibility = Visibility.Hidden;
RecipientsActiveMembersInput.IsChecked = true; RecipientsActiveMembersInput.IsChecked = true;
MemberOrganicIndifferentInput.IsChecked = true;
MemberFunktionärIndifferentInput.IsChecked = true;
DeliveryConfirmationFooterInput.Text = App.Client.TextDeliveryConfirmation; DeliveryConfirmationFooterInput.Text = App.Client.TextDeliveryConfirmation;
CreditNoteFooterInput.Text = App.Client.TextCreditNote; CreditNoteFooterInput.Text = App.Client.TextCreditNote;
@ -164,6 +167,17 @@ namespace Elwig.Windows {
MemberAreaComInput.SelectAll(); MemberAreaComInput.SelectAll();
MemberAreaComInput.SelectionChanged += MemberInput_SelectionChanged; MemberAreaComInput.SelectionChanged += MemberInput_SelectionChanged;
} }
ControlUtils.RenewItemsSource(MemberDeliveryAncmtInput, await ctx.DeliverySchedules
.Where(s => s.Year == Year)
.OrderBy(s => s.DateString)
.ThenBy(s => s.Branch.Name)
.ThenBy(s => s.Description)
.ToListAsync(), MemberInput_SelectionChanged);
if (MemberDeliveryAncmtInput.SelectedItems.Count == 0) {
MemberDeliveryAncmtInput.SelectionChanged -= MemberInput_SelectionChanged;
MemberDeliveryAncmtInput.SelectAll();
MemberDeliveryAncmtInput.SelectionChanged += MemberInput_SelectionChanged;
}
ControlUtils.RenewItemsSource(MemberCustomInput, await ctx.Members ControlUtils.RenewItemsSource(MemberCustomInput, await ctx.Members
.Where(m => m.IsActive) .Where(m => m.IsActive)
.OrderBy(m => m.Name) .OrderBy(m => m.Name)
@ -291,8 +305,18 @@ namespace Elwig.Windows {
MemberBranchInput.Visibility = vis; MemberBranchInput.Visibility = vis;
MemberKgLabel.Visibility = vis; MemberKgLabel.Visibility = vis;
MemberKgInput.Visibility = vis; MemberKgInput.Visibility = vis;
MemberOrganicLabel.Visibility = vis;
MemberOrganicYesInput.Visibility = vis;
MemberOrganicNoInput.Visibility = vis;
MemberOrganicIndifferentInput.Visibility = vis;
MemberFunktionärLabel.Visibility = vis;
MemberFunktionärYesInput.Visibility = vis;
MemberFunktionärNoInput.Visibility = vis;
MemberFunktionärIndifferentInput.Visibility = vis;
MemberAreaComInput.Visibility = RecipientsAreaComMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden; MemberAreaComInput.Visibility = RecipientsAreaComMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden;
MemberAreaComLabel.Visibility = RecipientsAreaComMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden; MemberAreaComLabel.Visibility = RecipientsAreaComMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden;
MemberDeliveryAncmtInput.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;
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
await UpdateRecipients(ctx); await UpdateRecipients(ctx);
@ -303,6 +327,11 @@ namespace Elwig.Windows {
await UpdateRecipients(ctx); await UpdateRecipients(ctx);
} }
private async void MemberInput_Checked(object sender, RoutedEventArgs evt) {
using var ctx = new AppDbContext();
await UpdateRecipients(ctx);
}
private void Date_TextChanged(object sender, RoutedEventArgs evt) { private void Date_TextChanged(object sender, RoutedEventArgs evt) {
Validator.CheckDate((TextBox)sender, true); Validator.CheckDate((TextBox)sender, true);
} }
@ -325,10 +354,23 @@ namespace Elwig.Windows {
var kgs = MemberKgInput.SelectedItems.Cast<AT_Kg>().Select(k => k.KgNr).ToList(); var kgs = MemberKgInput.SelectedItems.Cast<AT_Kg>().Select(k => k.KgNr).ToList();
query = query.Where(m => kgs.Contains((int)m.DefaultKgNr!)); query = query.Where(m => kgs.Contains((int)m.DefaultKgNr!));
} }
if (MemberOrganicYesInput.IsChecked == true) {
query = query.Where(m => m.IsOrganic);
} else if (MemberOrganicNoInput.IsChecked == true) {
query = query.Where(m => !m.IsOrganic);
}
if (MemberFunktionärYesInput.IsChecked == true) {
query = query.Where(m => m.IsFunktionär);
} else if (MemberFunktionärNoInput.IsChecked == true) {
query = query.Where(m => !m.IsFunktionär);
}
if (RecipientsAreaComMembersInput.IsChecked == true) { if (RecipientsAreaComMembersInput.IsChecked == true) {
var vtrg = MemberAreaComInput.SelectedItems.Cast<AreaComType>().Select(a => a.VtrgId).ToList(); var vtrg = MemberAreaComInput.SelectedItems.Cast<AreaComType>().Select(a => a.VtrgId).ToList();
query = query.Where(m => m.IsActive && m.AreaCommitments.AsQueryable().Where(Utils.ActiveAreaCommitments(Year)).Any(c => vtrg.Contains(c.VtrgId))); query = query.Where(m => m.IsActive && m.AreaCommitments.AsQueryable().Where(Utils.ActiveAreaCommitments(Year)).Any(c => vtrg.Contains(c.VtrgId)));
} else if (RecipientsDeliveryAncmtMembersInput.IsChecked == true) {
var dsnrs = MemberDeliveryAncmtInput.SelectedItems.Cast<DeliverySchedule>().Select(s => s.DsNr).ToList();
query = query.Where(m => m.Announcements.Any(a => a.Year == Year && dsnrs.Contains(a.DsNr)));
} else if (RecipientsDeliveryMembersInput.IsChecked == true) { } else if (RecipientsDeliveryMembersInput.IsChecked == true) {
query = query.Where(m => m.Deliveries.Any(d => d.Year == Year)); query = query.Where(m => m.Deliveries.Any(d => d.Year == Year));
} else if (RecipientsNonDeliveryMembersInput.IsChecked == true) { } else if (RecipientsNonDeliveryMembersInput.IsChecked == true) {
@ -473,7 +515,7 @@ namespace Elwig.Windows {
var b = new Billing(year); var b = new Billing(year);
await b.FinishSeason(); await b.FinishSeason();
await b.CalculateBuckets(); await b.CalculateBuckets();
await App.HintContextChange(); App.HintContextChange();
dcData[year] = await DeliveryConfirmationDeliveryData.ForSeason(ctx.DeliveryParts, year); dcData[year] = await DeliveryConfirmationDeliveryData.ForSeason(ctx.DeliveryParts, year);
} catch (Exception exc) { } catch (Exception exc) {

View File

@ -287,7 +287,7 @@ namespace Elwig.Windows {
var b = new Billing(year); var b = new Billing(year);
await b.FinishSeason(); await b.FinishSeason();
await b.CalculateBuckets(); await b.CalculateBuckets();
await App.HintContextChange(); App.HintContextChange();
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);
@ -326,7 +326,7 @@ namespace Elwig.Windows {
var b = new Billing(year); var b = new Billing(year);
await b.FinishSeason(); await b.FinishSeason();
await b.CalculateBuckets(); await b.CalculateBuckets();
await App.HintContextChange(); App.HintContextChange();
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
using var ods = new OdsFile(d.FileName); using var ods = new OdsFile(d.FileName);

View File

@ -374,7 +374,7 @@ namespace Elwig.Windows {
ctx.Remove(l); ctx.Remove(l);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
} }
await App.HintContextChange(); 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;
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;

View File

@ -191,7 +191,7 @@ namespace Elwig.Windows {
} }
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
} }
await App.HintContextChange(); App.HintContextChange();
ControlUtils.SelectItemWithPk(WbGlKgs, k.KgNr); ControlUtils.SelectItemWithPk(WbGlKgs, k.KgNr);
} 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;
@ -211,7 +211,7 @@ namespace Elwig.Windows {
ctx.Remove(k.WbKg); ctx.Remove(k.WbKg);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
} }
await App.HintContextChange(); App.HintContextChange();
ControlUtils.SelectItemWithPk(WbKgs, k.KgNr); ControlUtils.SelectItemWithPk(WbKgs, k.KgNr);
} catch (Exception exc) { } catch (Exception exc) {
await HintContextChange(); await HintContextChange();

View File

@ -173,7 +173,7 @@ namespace Elwig.Windows {
var b = new Billing(Year); var b = new Billing(Year);
await b.AutoAdjustBusinessShares(new DateOnly(Year, 11, 30), kg ?? default, bs ?? default, kgPerBs ?? default, percent / 100.0 ?? default, minBs ?? default); await b.AutoAdjustBusinessShares(new DateOnly(Year, 11, 30), kg ?? default, bs ?? default, kgPerBs ?? default, percent / 100.0 ?? default, minBs ?? default);
await App.HintContextChange(); 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;
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
@ -187,7 +187,7 @@ namespace Elwig.Windows {
try { try {
var b = new Billing(Year); var b = new Billing(Year);
await b.UnAdjustBusinessShares(); await b.UnAdjustBusinessShares();
await App.HintContextChange(); 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;
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
@ -309,7 +309,7 @@ namespace Elwig.Windows {
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
MessageBox.Show(str, "Benutzerdefinierten Zu-/Abschlag speichern", MessageBoxButton.OK, MessageBoxImage.Error); MessageBox.Show(str, "Benutzerdefinierten Zu-/Abschlag speichern", MessageBoxButton.OK, MessageBoxImage.Error);
} }
await App.HintContextChange(); App.HintContextChange();
Mouse.OverrideCursor = null; Mouse.OverrideCursor = null;
} }
} }

View File

@ -225,19 +225,22 @@ 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); ctx.Add(v);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
await App.HintContextChange(); }
App.HintContextChange();
ControlUtils.SelectItem(PaymentVariantList, v); ControlUtils.SelectItem(PaymentVariantList, v);
} catch (Exception exc) { } catch (Exception exc) {
@ -250,19 +253,22 @@ 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); ctx.Add(n);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
await App.HintContextChange(); }
App.HintContextChange();
ControlUtils.SelectItem(PaymentVariantList, n); ControlUtils.SelectItem(PaymentVariantList, n);
} catch (Exception exc) { } catch (Exception exc) {
@ -275,10 +281,11 @@ 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(); }
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;
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
@ -297,7 +304,7 @@ namespace Elwig.Windows {
} catch (Exception exc) { } catch (Exception exc) {
MessageBox.Show(exc.Message, "Berechnungsfehler", MessageBoxButton.OK, MessageBoxImage.Error); MessageBox.Show(exc.Message, "Berechnungsfehler", MessageBoxButton.OK, MessageBoxImage.Error);
} }
await App.HintContextChange(); App.HintContextChange();
Mouse.OverrideCursor = null; Mouse.OverrideCursor = null;
CalculateButton.IsEnabled = true; CalculateButton.IsEnabled = true;
} }
@ -392,7 +399,7 @@ namespace Elwig.Windows {
} }
Mouse.OverrideCursor = null; Mouse.OverrideCursor = null;
RevertButton.IsEnabled = true; RevertButton.IsEnabled = true;
await App.HintContextChange(); App.HintContextChange();
} }
private async void RevertButton_Click(object sender, RoutedEventArgs evt) { private async void RevertButton_Click(object sender, RoutedEventArgs evt) {
@ -408,7 +415,7 @@ namespace Elwig.Windows {
Mouse.OverrideCursor = Cursors.AppStarting; Mouse.OverrideCursor = Cursors.AppStarting;
var b = new BillingVariant(v.Year, v.AvNr); var b = new BillingVariant(v.Year, v.AvNr);
await b.Revert(); await b.Revert();
await App.HintContextChange(); App.HintContextChange();
Mouse.OverrideCursor = null; Mouse.OverrideCursor = null;
CommitButton.IsEnabled = true; CommitButton.IsEnabled = true;
} }
@ -500,7 +507,7 @@ namespace Elwig.Windows {
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
} }
await App.HintContextChange(); App.HintContextChange();
CommentInput_TextChanged(null, null); CommentInput_TextChanged(null, null);
ConsiderModifiersInput_Changed(null, null); ConsiderModifiersInput_Changed(null, null);
ConsiderPenaltiesInput_Changed(null, null); ConsiderPenaltiesInput_Changed(null, null);

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);
} }

View File

@ -1 +1 @@
curl --fail -s -L "https://elwig.at/files/create.sql?v=28" -u "elwig:ganzGeheim123!" -o "Resources\Sql\Create.sql" curl --fail -s -L "https://elwig.at/files/create.sql?v=29" -u "elwig:ganzGeheim123!" -o "Resources\Sql\Create.sql"