From efa619c6c8eed3bfe0ddf3773c4e2369a1e16485 Mon Sep 17 00:00:00 2001 From: Markus Reinhardt Date: Fri, 21 Jun 2024 09:03:50 +0200 Subject: [PATCH] Add calculation for the expected next sending --- NRZMyk.Client/NRZMyk.Client.csproj | 3 + NRZMyk.Components/NRZMyk.Components.csproj | 2 + .../Data/OrganizationTests.cs | 66 ++++++++++++++++--- NRZMyk.Services/Data/Entities/Organization.cs | 27 ++++++++ NRZMyk.Services/NRZMyk.Services.csproj | 2 + 5 files changed, 91 insertions(+), 9 deletions(-) diff --git a/NRZMyk.Client/NRZMyk.Client.csproj b/NRZMyk.Client/NRZMyk.Client.csproj index 0592491..fd3394d 100644 --- a/NRZMyk.Client/NRZMyk.Client.csproj +++ b/NRZMyk.Client/NRZMyk.Client.csproj @@ -4,6 +4,9 @@ net6.0 enable enable + False + False + False diff --git a/NRZMyk.Components/NRZMyk.Components.csproj b/NRZMyk.Components/NRZMyk.Components.csproj index 94dcbd0..cceca07 100644 --- a/NRZMyk.Components/NRZMyk.Components.csproj +++ b/NRZMyk.Components/NRZMyk.Components.csproj @@ -6,6 +6,8 @@ enable true 1.0.$([System.DateTime]::UtcNow.ToString(`yyMM`)).$([System.DateTime]::UtcNow.ToString(`ddHH`)) + False + False diff --git a/NRZMyk.Services.Tests/Data/OrganizationTests.cs b/NRZMyk.Services.Tests/Data/OrganizationTests.cs index af4dd30..2685c38 100644 --- a/NRZMyk.Services.Tests/Data/OrganizationTests.cs +++ b/NRZMyk.Services.Tests/Data/OrganizationTests.cs @@ -2,6 +2,8 @@ using NSubstitute; using NUnit.Framework; using System; +using System.Collections.Generic; +using FluentAssertions; using NRZMyk.Services.Services; namespace NRZMyk.Services.Tests.Data; @@ -11,8 +13,16 @@ public class OrganizationTests [Test] public void CheckDataAndSendReminders_NoDataEntered_Last12Months_SendEmail() { - // Arrange - Organization org = new Organization(); + var org = new Organization + { + Id = 0, + Name = null, + Members = null, + Email = null, + DispatchMonth = MonthToDispatch.None, + LatestDataEntryDate = default, + LatestStrainArrivalDate = default + }; org.Email = "example@example.com"; org.DispatchMonth = MonthToDispatch.January; org.LatestDataEntryDate = new DateTime(2022, 1, 1); @@ -20,29 +30,67 @@ public void CheckDataAndSendReminders_NoDataEntered_Last12Months_SendEmail() var emailService = Substitute.For(); - // Act org.CheckDataAndSendReminders(emailService); - // Assert emailService.Received(1).SendEmail("example@example.com", "No data was entered during the last 12 months."); } [Test] public void CheckDataAndSendReminders_DataEntered_NoStrainArrived_SendEmail() { - // Arrange - Organization org = new Organization(); - org.Email = "example@example.com"; + var org = CreateOrganization(); org.DispatchMonth = MonthToDispatch.January; org.LatestDataEntryDate = new DateTime(2023, 1, 5); org.LatestStrainArrivalDate = new DateTime(2022, 12, 20); var emailService = Substitute.For(); - // Act org.CheckDataAndSendReminders(emailService); - // Assert emailService.Received(1).SendEmail("example@example.com", "Data was entered, but no strain has arrived yet."); } + + [Test] + public void WhenExpectedNextSendingIsThisMonth_ShowsHumanReadableInformation() + { + var org = CreateOrganization(); + var today = DateTime.Today; + org.DispatchMonth = (MonthToDispatch)today.Month; + org.LatestStrainArrivalDate = today.Subtract(TimeSpan.FromDays(200)); + + org.ExpectedNextSending.Should().Be("diesen Monat"); + } + + [TestCase(1, 6, "in 5 Monaten")] + [TestCase(2, 6, "in 5 Monaten")] + [TestCase(3, 6, "in 5 Monaten")] + [TestCase(4, 6, "in 5 Monaten")] + [TestCase(5, 6, "in 5 Monaten")] + [TestCase(6, 6, "in 5 Monaten")] + [TestCase(7, 6, "vor 6 Monaten")] + [TestCase(8, 6, "vor 6 Monaten")] + [TestCase(18, 6, "vor einem Jahr")] + [TestCase(48, 6, "vor 3 Jahren")] + [TestCase(10, 2, "in einem Monat")] + public void WhenExpectedNextSendingIsChecked_ShowsHumanReadableInformation(int monthSinceLatestStrainArrival, int monthUntilNextArrival, string expectedNextSending) + { + var org = CreateOrganization(); + var todayInSixMonths = DateTime.Today.AddMonths(monthUntilNextArrival); + org.DispatchMonth = (MonthToDispatch)todayInSixMonths.Month; + org.LatestStrainArrivalDate = DateTime.Today.AddMonths(-1*monthSinceLatestStrainArrival); + + org.ExpectedNextSending.Should().Be(expectedNextSending); + } + + private static Organization CreateOrganization() + { + return new Organization + { + Id = 1, + Name = "Example", + Members = new List(), + Email = "example@example.com", + DispatchMonth = MonthToDispatch.None, + }; + } } \ No newline at end of file diff --git a/NRZMyk.Services/Data/Entities/Organization.cs b/NRZMyk.Services/Data/Entities/Organization.cs index 99690a4..6128342 100644 --- a/NRZMyk.Services/Data/Entities/Organization.cs +++ b/NRZMyk.Services/Data/Entities/Organization.cs @@ -1,6 +1,9 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Globalization; using System.Text.Json.Serialization; +using Humanizer; using NRZMyk.Services.Interfaces; using NRZMyk.Services.Services; @@ -17,6 +20,30 @@ public class Organization : BaseEntity, IAggregateRoot public DateTime LatestDataEntryDate { get; set; } public DateTime LatestStrainArrivalDate { get; set; } + [Display(Name = "Nächste Einsendung erwarted")] + public string ExpectedNextSending => CalculateExpectedNextSending(); + + private string CalculateExpectedNextSending() + { + var today = DateTime.Today; + var expectedArrival = new DateTime(today.Year, (int)DispatchMonth, 15); + var timeSinceLastArrival = expectedArrival.Subtract(LatestStrainArrivalDate); + + if (timeSinceLastArrival.TotalDays < 365) + { + if (DispatchMonth == (MonthToDispatch)today.Month) + { + return "diesen Monat"; + } + } + else + { + expectedArrival = new DateTime(Math.Min(today.Year - 1, LatestStrainArrivalDate.Year), (int)DispatchMonth, 21); + } + + return expectedArrival.Humanize(culture: CultureInfo.GetCultureInfo("de-de")); + } + public void CheckDataAndSendReminders(IEmailNotificationService emailService) { var currentDate = DateTime.Now; diff --git a/NRZMyk.Services/NRZMyk.Services.csproj b/NRZMyk.Services/NRZMyk.Services.csproj index 1fc6984..6e0db20 100644 --- a/NRZMyk.Services/NRZMyk.Services.csproj +++ b/NRZMyk.Services/NRZMyk.Services.csproj @@ -13,6 +13,8 @@ + +