faturas_4docs/Compliance/Services/ValidationRules/ReadingPeriodValidationRule.cs

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);
}
}