diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index c37f981..2c8aa22 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -12,7 +12,7 @@ on: jobs: build: - runs-on: windows-2022 + runs-on: windows-latest steps: - uses: actions/setup-java@v2 @@ -25,7 +25,7 @@ jobs: uses: actions/setup-dotnet@v3 with: dotnet-version: 8.0.x - + - name: Restore workload run: dotnet workload restore diff --git a/docs/roadmap.drawio b/docs/roadmap.drawio index 943783d..4093039 100644 --- a/docs/roadmap.drawio +++ b/docs/roadmap.drawio @@ -1,6 +1,6 @@ - + @@ -163,9 +163,12 @@ - + + + + diff --git a/docs/roadmap.png b/docs/roadmap.png index 8be35d4..3eecdfe 100644 Binary files a/docs/roadmap.png and b/docs/roadmap.png differ diff --git a/subtrack.MAUI/Services/Android/NotifyDueSubscriptionsJob.cs b/subtrack.MAUI/Services/Android/NotifyDueSubscriptionsJob.cs index 1077f17..a54ceca 100644 --- a/subtrack.MAUI/Services/Android/NotifyDueSubscriptionsJob.cs +++ b/subtrack.MAUI/Services/Android/NotifyDueSubscriptionsJob.cs @@ -49,7 +49,12 @@ public async Task Run(JobInfo jobInfo, CancellationToken cancellationToken) if (lastSubscriptionReminderTimeStamp.Value?.Date != today) { - await NotifyDueSubscriptionsJob.RunInternal(serviceProvider, today); + var subscriptionService = serviceProvider.GetRequiredService(); + var subscriptionsCalculator = serviceProvider.GetRequiredService(); + + var subscriptions = await subscriptionService.GetAllAsync(); + await NotifyUpcomingPayments(subscriptions, today, subscriptionsCalculator); + await NotifyMissedPaymentsAsync(subscriptions, subscriptionsCalculator, today); lastSubscriptionReminderTimeStamp.Value = now; await settingsService.UpdateAsync(lastSubscriptionReminderTimeStamp); @@ -62,12 +67,8 @@ public async Task Run(JobInfo jobInfo, CancellationToken cancellationToken) } } - private static async Task RunInternal(IServiceProvider serviceProvider, DateTime today) + private static async Task NotifyUpcomingPayments(IEnumerable subscriptions, DateTime today, ISubscriptionsCalculator subscriptionsCalculator) { - var subscriptionService = serviceProvider.GetRequiredService(); - var subscriptionsCalculator = serviceProvider.GetRequiredService(); - - var subscriptions = await subscriptionService.GetAllAsync(); var subscriptionsWithNotificationsEnabled = subscriptions.Where(x => x.NotificationDays.HasValue).ToList(); if (!subscriptionsWithNotificationsEnabled.Any()) { @@ -76,7 +77,7 @@ private static async Task RunInternal(IServiceProvider serviceProvider, DateTime await NotificationsUtil.EnsureNotificationsAreEnabled(); - var notificationGroup = today.Day.ToString(); + var notificationGroup = $"upcoming {today.Day}"; subscriptionsWithNotificationsEnabled.ForEach(sub => { var dueDate = subscriptionsCalculator.GetNextPaymentDate(sub); @@ -90,6 +91,23 @@ private static async Task RunInternal(IServiceProvider serviceProvider, DateTime }); } + private static async Task NotifyMissedPaymentsAsync(IEnumerable subscriptions, ISubscriptionsCalculator subscriptionsCalculator, DateTime today) + { + if (!await NotificationsUtil.HasEnabledNotifications()) + { + return; + } + + foreach (var sub in subscriptions) + { + var dueDate = subscriptionsCalculator.GetNextPaymentDate(sub); + if (dueDate.IsPastDate(today)) + { + SendNotification(sub.Id, $"Missed payment for {sub.Name}", $"missed {today.Day}"); + } + } + } + private static string GetDueDaysText(int dueDays) { return dueDays switch diff --git a/subtrack.MAUI/Utilities/DateTimeExtensions.cs b/subtrack.MAUI/Utilities/DateTimeExtensions.cs index 33f1354..c9d6d7b 100644 --- a/subtrack.MAUI/Utilities/DateTimeExtensions.cs +++ b/subtrack.MAUI/Utilities/DateTimeExtensions.cs @@ -6,7 +6,8 @@ public static class DateTimeExtensions { public static TimeSpan TimeRemainingFromToday(this DateTime date, IDateProvider dateTimeProvider) => date.Subtract(dateTimeProvider.Today); - public static bool IsPastDate(this DateTime date, IDateProvider dateTimeProvider) => date < dateTimeProvider.Today; + public static bool IsPastDate(this DateTime date, IDateProvider dateTimeProvider) => IsPastDate(date, dateTimeProvider.Today); + public static bool IsPastDate(this DateTime date, DateTime today) => date < today; public static DateTime AddWeeks(this DateTime date, int weeks) => date.AddDays(weeks * 7); diff --git a/subtrack.MAUI/Utilities/NotificationsUtil.cs b/subtrack.MAUI/Utilities/NotificationsUtil.cs index 007a4ac..3f8f4cf 100644 --- a/subtrack.MAUI/Utilities/NotificationsUtil.cs +++ b/subtrack.MAUI/Utilities/NotificationsUtil.cs @@ -11,4 +11,6 @@ public static async Task EnsureNotificationsAreEnabled() await LocalNotificationCenter.Current.RequestNotificationPermission(); } } + + public static async Task HasEnabledNotifications() => await LocalNotificationCenter.Current.AreNotificationsEnabled(); }