Skip to content

Commit

Permalink
Add calculation for the expected next sending
Browse files Browse the repository at this point in the history
  • Loading branch information
markusrt committed Jun 21, 2024
1 parent 11e9a65 commit efa619c
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 9 deletions.
3 changes: 3 additions & 0 deletions NRZMyk.Client/NRZMyk.Client.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RunAnalyzersDuringBuild>False</RunAnalyzersDuringBuild>
<EnableNETAnalyzers>False</EnableNETAnalyzers>
<RunAnalyzersDuringLiveAnalysis>False</RunAnalyzersDuringLiveAnalysis>
</PropertyGroup>

<ItemGroup>
Expand Down
2 changes: 2 additions & 0 deletions NRZMyk.Components/NRZMyk.Components.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
<ImplicitUsings>enable</ImplicitUsings>
<AddRazorSupportForMvc>true</AddRazorSupportForMvc>
<VersionPrefix>1.0.$([System.DateTime]::UtcNow.ToString(`yyMM`)).$([System.DateTime]::UtcNow.ToString(`ddHH`))</VersionPrefix>
<RunAnalyzersDuringBuild>False</RunAnalyzersDuringBuild>
<EnableNETAnalyzers>False</EnableNETAnalyzers>
</PropertyGroup>

<ItemGroup>
Expand Down
66 changes: 57 additions & 9 deletions NRZMyk.Services.Tests/Data/OrganizationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -11,38 +13,84 @@ 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 = "[email protected]";
org.DispatchMonth = MonthToDispatch.January;
org.LatestDataEntryDate = new DateTime(2022, 1, 1);
org.LatestStrainArrivalDate = new DateTime(2022, 1, 15);

var emailService = Substitute.For<IEmailNotificationService>();

// Act
org.CheckDataAndSendReminders(emailService);

// Assert
emailService.Received(1).SendEmail("[email protected]", "No data was entered during the last 12 months.");
}

[Test]
public void CheckDataAndSendReminders_DataEntered_NoStrainArrived_SendEmail()
{
// Arrange
Organization org = new Organization();
org.Email = "[email protected]";
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<IEmailNotificationService>();

// Act
org.CheckDataAndSendReminders(emailService);

// Assert
emailService.Received(1).SendEmail("[email protected]", "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<RemoteAccount>(),
Email = "[email protected]",
DispatchMonth = MonthToDispatch.None,
};
}
}
27 changes: 27 additions & 0 deletions NRZMyk.Services/Data/Entities/Organization.cs
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions NRZMyk.Services/NRZMyk.Services.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
<PackageReference Include="Ardalis.Specification.EntityFrameworkCore" Version="8.0.0" />
<PackageReference Include="AutoMapper" Version="12.0.1" />
<PackageReference Include="EPPlus" Version="7.0.7" />
<PackageReference Include="Humanizer.Core" Version="2.14.1" />
<PackageReference Include="Humanizer.Core.de" Version="2.14.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.3" />
<PackageReference Include="Ardalis.Specification" Version="8.0.0" />
<PackageReference Include="SendGrid" Version="9.29.1" />
Expand Down

0 comments on commit efa619c

Please sign in to comment.