41 lines
1.5 KiB
C#
41 lines
1.5 KiB
C#
using System;
|
|
using System.Threading.Tasks;
|
|
using Compliance.DTOs;
|
|
using Compliance.Domain.Models;
|
|
|
|
namespace Compliance.Services.ValidationRules
|
|
{
|
|
public class ReadingPeriodValidationRule : IValidationRule
|
|
{
|
|
private const string RULE_NAME = "Reading Period Validation";
|
|
private const int MIN_READING_DAYS = 27;
|
|
private const int MAX_READING_DAYS = 33;
|
|
private const string PERIOD_ERROR_FORMAT =
|
|
"Reading period of {0} days is outside allowed range ({1}-{2} days)";
|
|
|
|
public int Priority => 1;
|
|
|
|
public Task<ValidationResult> ValidateAsync(
|
|
BillComplianceRequest request,
|
|
DistributorInformation distributorInfo,
|
|
Client clientInfo)
|
|
{
|
|
var readingPeriod = CalculateReadingPeriod(request);
|
|
var isValid = IsValidReadingPeriod(readingPeriod);
|
|
|
|
return Task.FromResult(isValid
|
|
? ValidationResult.Success(RULE_NAME)
|
|
: ValidationResult.Failure(RULE_NAME,
|
|
FormatErrorMessage(readingPeriod)));
|
|
}
|
|
|
|
private static int CalculateReadingPeriod(BillComplianceRequest request) =>
|
|
(request.CurrentReadingDate - request.PreviousReadingDate).Days;
|
|
|
|
private static bool IsValidReadingPeriod(int days) =>
|
|
days >= MIN_READING_DAYS && days <= MAX_READING_DAYS;
|
|
|
|
private static string FormatErrorMessage(int days) =>
|
|
string.Format(PERIOD_ERROR_FORMAT, days, MIN_READING_DAYS, MAX_READING_DAYS);
|
|
}
|
|
} |