diff --git a/Elwig/Documents/Document.cs b/Elwig/Documents/Document.cs index b0549b9..7f378b4 100644 --- a/Elwig/Documents/Document.cs +++ b/Elwig/Documents/Document.cs @@ -57,7 +57,7 @@ namespace Elwig.Documents { public Document(string title) { Title = title; Author = App.Client.NameFull; - Date = DateOnly.FromDateTime(Utils.Today); + Date = DateOnly.FromDateTime(DateTime.Today); } ~Document() { diff --git a/Elwig/Helpers/Utils.cs b/Elwig/Helpers/Utils.cs index 68fec18..c941367 100644 --- a/Elwig/Helpers/Utils.cs +++ b/Elwig/Helpers/Utils.cs @@ -45,7 +45,6 @@ namespace Elwig.Helpers { public static int CurrentNextSeason => DateTime.Now.Year - (DateTime.Now.Month <= 3 ? 1 : 0); public static int CurrentLastSeason => DateTime.Now.Year - (DateTime.Now.Month <= 6 ? 1 : 0); public static int FollowingSeason => DateTime.Now.Year + (DateTime.Now.Month >= 11 ? 1 : 0); - public static DateTime Today => (DateTime.Now.Hour >= 3) ? DateTime.Today : DateTime.Today.AddDays(-1); [GeneratedRegex("^serial://([A-Za-z0-9]+):([0-9]+)(,([5-9]),([NOEMSnoems]),(0|1|1\\.5|2|))?$", RegexOptions.Compiled)] private static partial Regex GeneratedSerialRegex(); diff --git a/Elwig/Services/DeliveryAncmtService.cs b/Elwig/Services/DeliveryAncmtService.cs index f7577cd..8c55af7 100644 --- a/Elwig/Services/DeliveryAncmtService.cs +++ b/Elwig/Services/DeliveryAncmtService.cs @@ -45,7 +45,7 @@ namespace Elwig.Services { deliveryAncmtQuery = deliveryAncmtQuery.Where(a => a.Year == s.Year && a.DsNr == s.DsNr); filterNames.Add($"{s.Date:dd.MM.yyyy} – {s.Branch.Name} – {s.Description}"); } else { - deliveryAncmtQuery = deliveryAncmtQuery.Where(a => a.Year == vm.FilterSeason && (!vm.FilterOnlyUpcoming || a.Schedule.DateString.CompareTo(Utils.Today.ToString("yyyy-MM-dd")) >= 0)); + deliveryAncmtQuery = deliveryAncmtQuery.Where(a => a.Year == vm.FilterSeason && (!vm.FilterOnlyUpcoming || a.Schedule.DateString.CompareTo(DateTime.Today.ToString("yyyy-MM-dd")) >= 0)); filterNames.Add($"{vm.FilterSeason}"); } diff --git a/Elwig/Services/DeliveryScheduleService.cs b/Elwig/Services/DeliveryScheduleService.cs index 68897df..b32098b 100644 --- a/Elwig/Services/DeliveryScheduleService.cs +++ b/Elwig/Services/DeliveryScheduleService.cs @@ -49,8 +49,8 @@ namespace Elwig.Services { filterNames.Add($"{vm.FilterSeason}"); } if (vm.FilterOnlyUpcoming) { - deliveryScheduleQuery = deliveryScheduleQuery.Where(s => s.DateString.CompareTo(Utils.Today.ToString("yyyy-MM-dd")) >= 0); - filterNames.Add($"ab {Utils.Today:dd.MM.yyyy}"); + deliveryScheduleQuery = deliveryScheduleQuery.Where(s => s.DateString.CompareTo(DateTime.Today.ToString("yyyy-MM-dd")) >= 0); + filterNames.Add($"ab {DateTime.Today:dd.MM.yyyy}"); } var filterVar = new List(); diff --git a/Elwig/Services/DeliveryService.cs b/Elwig/Services/DeliveryService.cs index b55bb6e..bea9d44 100644 --- a/Elwig/Services/DeliveryService.cs +++ b/Elwig/Services/DeliveryService.cs @@ -72,6 +72,31 @@ namespace Elwig.Services { vm.ManualWeighingReason = p.WeighingReason; } + private static async Task<(Expression>, string)> GetFilterToday(AppDbContext ctx) { + var today = DateTime.Today; + var timestamps = (await ctx.Deliveries + .Where(d => d.DateString.CompareTo(today.AddDays(-1).ToString("yyyy-MM-dd")) >= 0) + .OrderBy(d => d.DateString).ThenBy(d => d.TimeString) + .Select(d => d.DateString + " " + d.TimeString) + .ToListAsync()) + .Select(s => DateTime.TryParseExact(s, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt) ? (DateTime?)dt : null) + .Where(t => t.HasValue) + .Cast() + .ToArray(); + if (timestamps.Length > 0) { + var latest = timestamps.Last(); + var since = timestamps.Cast().Reverse().Aggregate(latest, (s, c) => s.Subtract(c).TotalHours <= 6 ? c : s); + latest += new TimeSpan(0, 1, -latest.Minute, -latest.Second, -latest.Millisecond, -latest.Microsecond); + since += new TimeSpan(0, 0, -since.Minute, -since.Second, -since.Millisecond, -since.Microsecond); + + return (d => (d.DateString == since.ToString("yyyy-MM-dd") && (d.TimeString == null || d.TimeString.CompareTo(since.ToString("HH:mm:ss")) >= 0)) || + (d.DateString.CompareTo(since.ToString("yyyy-MM-dd")) > 0), + since.Date == latest.Date ? since.ToString("dd.MM.yyyy") : $"{since:dd.MM.yyyy \\a\\b HH:mm} / {latest:dd.MM.yyyy \\b\\i\\s HH:mm}"); + } else { + return (_ => false, today.ToString("dd.MM.yyyy")); + } + } + public static async Task<(List, IQueryable, IQueryable, Predicate, List)> GetFilters(this DeliveryAdminViewModel vm, AppDbContext ctx) { List filterNames = []; IQueryable deliveryQuery = ctx.Deliveries; @@ -84,10 +109,9 @@ namespace Elwig.Services { filterNames.Add(vm.FilterMember.AdministrativeName); } if (vm.FilterTodayOnly) { - deliveryQuery = deliveryQuery - .Where(d => (d.DateString == Utils.Today.ToString("yyyy-MM-dd") && (d.TimeString == null || d.TimeString.CompareTo("03:00:00") > 0)) || - (d.DateString == Utils.Today.AddDays(1).ToString("yyyy-MM-dd") && (d.TimeString == null || d.TimeString.CompareTo("03:00:00") <= 0))); - filterNames.Add(Utils.Today.ToString("dd.MM.yyyy")); + var (pred, name) = await GetFilterToday(ctx); + deliveryQuery = deliveryQuery.Where(pred); + filterNames.Add(name); } else if (!vm.FilterAllSeasons) { deliveryQuery = deliveryQuery.Where(d => d.Year == vm.FilterSeason); filterNames.Add($"{vm.FilterSeason}"); @@ -730,10 +754,9 @@ namespace Elwig.Services { query = q; filterNames.AddRange(f); } else if (subject == ExportSubject.FromToday) { - var date = $"{Utils.Today:yyyy-MM-dd}"; - query = ctx.DeliveryParts - .Where(p => p.Delivery.DateString == date); - filterNames.Add($"{Utils.Today:dd.MM.yyyy}"); + var (pred, name) = await GetFilterToday(ctx); + query = ctx.Deliveries.Where(pred).SelectMany(d => d.Parts); + filterNames.Add(name); } else if (subject == ExportSubject.FromSeasonAndBranch) { query = ctx.DeliveryParts .Where(p => p.Year == Utils.CurrentLastSeason && p.Delivery.ZwstId == App.ZwstId); @@ -805,10 +828,9 @@ namespace Elwig.Services { query = q; filterNames.AddRange(f); } else if (subject == ExportSubject.FromToday) { - var date = $"{Utils.Today:yyyy-MM-dd}"; - query = ctx.DeliveryParts - .Where(p => p.Delivery.DateString == date); - filterNames.Add($"{Utils.Today:dd.MM.yyyy}"); + var (pred, name) = await GetFilterToday(ctx); + query = ctx.Deliveries.Where(pred).SelectMany(d => d.Parts); + filterNames.Add(name); } else { throw new ArgumentException("Invalid value for ExportSubject"); } diff --git a/Elwig/Services/MemberBusinessSharesService.cs b/Elwig/Services/MemberBusinessSharesService.cs index 180f4c4..c86996c 100644 --- a/Elwig/Services/MemberBusinessSharesService.cs +++ b/Elwig/Services/MemberBusinessSharesService.cs @@ -3,6 +3,7 @@ using Elwig.Models; using Elwig.Models.Entities; using Elwig.ViewModels; using Microsoft.EntityFrameworkCore; +using System; using System.Linq; using System.Threading.Tasks; @@ -11,7 +12,7 @@ namespace Elwig.Services { public static async Task InitInputs(this MemberBusinessSharesViewModel vm) { using var ctx = new AppDbContext(); - vm.DateNoticeString = $"{Utils.Today:dd.MM.yyyy}"; + vm.DateNoticeString = $"{DateTime.Today:dd.MM.yyyy}"; vm.ValuePerShare = (await ctx.Seasons.OrderBy(s => s.Year).LastOrDefaultAsync())?.BusinessShareValue; } diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index 10c0738..56065c4 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -685,7 +685,7 @@ namespace Elwig.Windows { private async void TodayOnlyInput_Changed(object sender, RoutedEventArgs evt) { if (!HasContextLoaded) return; if (TodayOnlyInput.IsChecked == true && AllSeasonsInput.IsChecked == false) { - ViewModel.FilterSeason = Utils.Today.Year; + ViewModel.FilterSeason = DateTime.Today.Year; ViewModel.FilterTodayOnly = true; } await RefreshList(); diff --git a/Elwig/Windows/DeliveryAncmtAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAncmtAdminWindow.xaml.cs index 5ead419..ea757ca 100644 --- a/Elwig/Windows/DeliveryAncmtAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAncmtAdminWindow.xaml.cs @@ -92,7 +92,7 @@ namespace Elwig.Windows { list.ForEach(v => v.Schedule.AnnouncedWeightOverride = v.AnnouncedWeight); var deliverySchedules = list.Select(v => v.Schedule).ToList(); ControlUtils.RenewItemsSource(DeliveryScheduleList, deliverySchedules - .Where(s => !ViewModel.FilterOnlyUpcoming || s.DateString.CompareTo(Utils.Today.ToString("yyyy-MM-dd")) >= 0) + .Where(s => !ViewModel.FilterOnlyUpcoming || s.DateString.CompareTo(DateTime.Today.ToString("yyyy-MM-dd")) >= 0) .ToList(), DeliveryScheduleList_SelectionChanged, ViewModel.FilterFromAllSchedules ? ControlUtils.RenewSourceDefault.None : ControlUtils.RenewSourceDefault.First); ControlUtils.RenewItemsSource(DeliveryScheduleInput, deliverySchedules, DeliveryScheduleInput_SelectionChanged); } diff --git a/Elwig/Windows/MailWindow.xaml.cs b/Elwig/Windows/MailWindow.xaml.cs index a7f085f..5de0b3a 100644 --- a/Elwig/Windows/MailWindow.xaml.cs +++ b/Elwig/Windows/MailWindow.xaml.cs @@ -108,7 +108,7 @@ namespace Elwig.Windows { public MailWindow(int? year = null) { InitializeComponent(); using (var ctx = new AppDbContext()) { - Year = year ?? ctx.Seasons.OrderByDescending(s => s.Year).FirstOrDefault()?.Year ?? Utils.Today.Year; + Year = year ?? ctx.Seasons.OrderByDescending(s => s.Year).FirstOrDefault()?.Year ?? DateTime.Today.Year; Title = $"Rundschreiben - Lese {Year} - Elwig"; } @@ -150,7 +150,7 @@ namespace Elwig.Windows { PostalSender1.Text = App.Client.Sender1; PostalSender2.Text = App.Client.Sender2; PostalLocation.Text = App.BranchLocation; - PostalDate.Text = $"{Utils.Today:dd.MM.yyyy}"; + PostalDate.Text = $"{DateTime.Today:dd.MM.yyyy}"; EmailSubjectInput.Text = App.Client.TextEmailSubject ?? "Rundschreiben"; EmailBodyInput.Text = App.Client.TextEmailBody ?? "Sehr geehrtes Mitglied,\n\nim Anhang finden Sie das aktuelle Rundschreiben.\n\nIhre Winzergenossenschaft\n"; } @@ -438,7 +438,7 @@ namespace Elwig.Windows { private void Date_LostFocus(object sender, RoutedEventArgs evt) { var res = Validator.CheckDate((TextBox)sender, true); - if (!res.IsValid) ((TextBox)sender).Text = $"{Utils.Today:dd.MM.yyyy}"; + if (!res.IsValid) ((TextBox)sender).Text = $"{DateTime.Today:dd.MM.yyyy}"; } private async Task UpdateRecipients(AppDbContext ctx) { diff --git a/Elwig/Windows/MainWindow.xaml.cs b/Elwig/Windows/MainWindow.xaml.cs index fe0b6ee..0ab9560 100644 --- a/Elwig/Windows/MainWindow.xaml.cs +++ b/Elwig/Windows/MainWindow.xaml.cs @@ -162,7 +162,7 @@ namespace Elwig.Windows { private async void Menu_Database_Backup_Click(object sender, RoutedEventArgs evt) { try { - var filename = InteractionService.SaveFile("Datenbank-Sicherung", $"database_{Utils.Today:yyyy-MM-dd}", "sql.zip"); + var filename = InteractionService.SaveFile("Datenbank-Sicherung", $"database_{DateTime.Today:yyyy-MM-dd}", "sql.zip"); if (filename != null) { if (!filename.EndsWith(".sql.zip")) filename += ".sql.zip"; Mouse.OverrideCursor = Cursors.Wait; diff --git a/Elwig/Windows/MemberBusinessSharesAdminWindow.xaml.cs b/Elwig/Windows/MemberBusinessSharesAdminWindow.xaml.cs index da51ae0..df1fbf6 100644 --- a/Elwig/Windows/MemberBusinessSharesAdminWindow.xaml.cs +++ b/Elwig/Windows/MemberBusinessSharesAdminWindow.xaml.cs @@ -198,7 +198,7 @@ namespace Elwig.Windows { int mgnr; try { - mgnr = await ViewModel.UpdateMemberHistory(ViewModel.SelectedHistoryEntry?.HistNr, IsEditing || ViewModel.DateNotice >= DateOnly.FromDateTime(Utils.Today).AddDays(-14)); + mgnr = await ViewModel.UpdateMemberHistory(ViewModel.SelectedHistoryEntry?.HistNr, IsEditing || ViewModel.DateNotice >= DateOnly.FromDateTime(DateTime.Today).AddDays(-14)); App.HintContextChange(); } catch (Exception exc) { InteractionService.ShowDbException("Geschäftsanteilbewegung aktualisieren", exc); diff --git a/Tests/E2ETests/MainWindowTest.cs b/Tests/E2ETests/MainWindowTest.cs index 5174e11..cf65e8d 100644 --- a/Tests/E2ETests/MainWindowTest.cs +++ b/Tests/E2ETests/MainWindowTest.cs @@ -53,7 +53,7 @@ namespace Tests.E2ETests { Session.App.FindElement(By.Name("Rundschreiben")).Click(); Thread.Sleep(Utils.WINDOW_OPEN_SLEEP); var window = Session.CreateWindowDriver("MailWindow"); - Assert.That(window.Title, Is.EqualTo($"Rundschreiben - Lese {Elwig.Helpers.Utils.Today.Year} - Elwig")); + Assert.That(window.Title, Is.EqualTo($"Rundschreiben - Lese {DateTime.Today.Year} - Elwig")); window.Close(); }); } diff --git a/Tests/UnitTests/DocumentTests/CreditNoteTest.cs b/Tests/UnitTests/DocumentTests/CreditNoteTest.cs index 9865986..8f8a1d7 100644 --- a/Tests/UnitTests/DocumentTests/CreditNoteTest.cs +++ b/Tests/UnitTests/DocumentTests/CreditNoteTest.cs @@ -16,7 +16,7 @@ namespace Tests.UnitTests.DocumentTests { """)); Assert.That(text, Contains.Substring("0123463")); // Betriebsnummer Assert.That(text, Contains.Substring("pauschaliert")); - Assert.That(text, Contains.Substring($"Wolkersdorf, am {Elwig.Helpers.Utils.Today:dd.MM.yyyy}")); + Assert.That(text, Contains.Substring($"Wolkersdorf, am {DateTime.Today:dd.MM.yyyy}")); Assert.That(text, Contains.Substring("Traubengutschrift Max Mustermann – Probevariante")); Assert.That(text, Contains.Substring("AT81 1234 5678 9012 3457")); Assert.That(text, Contains.Substring(""" diff --git a/Tests/UnitTests/DocumentTests/DeliveryConfirmationTest.cs b/Tests/UnitTests/DocumentTests/DeliveryConfirmationTest.cs index 3508316..7b1f969 100644 --- a/Tests/UnitTests/DocumentTests/DeliveryConfirmationTest.cs +++ b/Tests/UnitTests/DocumentTests/DeliveryConfirmationTest.cs @@ -21,7 +21,7 @@ namespace Tests.UnitTests.DocumentTests { """)); Assert.That(text, Contains.Substring("0123463")); // Betriebsnummer Assert.That(text, Contains.Substring("pauschaliert")); - Assert.That(text, Contains.Substring($"Wolkersdorf, am {Elwig.Helpers.Utils.Today:dd.MM.yyyy}")); + Assert.That(text, Contains.Substring($"Wolkersdorf, am {DateTime.Today:dd.MM.yyyy}")); Assert.That(text, Contains.Substring("Anlieferungsbestätigung 2020")); Assert.That(text, Contains.Substring(""" 20201001X001 1 Grüner Veltliner QUW 73 15,0 ungeb.: 3 219 3 219 ☑