42 lines
1.5 KiB
C#

using System;
using System.Threading.Tasks;
using Compliance.Domain.Models;
using Compliance.DTOs;
using Compliance.Infrastructure.Repositories;
using System.Text;
namespace Compliance.Services.ValidationRules
{
public class TariffValidationRule(IDistributorRepository distributorRepository) : IValidationRule
{
private readonly IDistributorRepository _distributorRepository = distributorRepository;
private const string RULE_NAME = "Tariff Validation";
private const string TUSD_ERROR = "TUSD amount doesn't match the expected value based on consumption and tariff";
public int Priority => 1;
public async Task<ValidationResult> ValidateAsync(
BillComplianceRequest request,
DistributorInformation distributorInfo,
Client clientInfo)
{
var tariffInfo = await _distributorRepository.GetTariffInformationAsync(
request.DistributorName,
request.Month) ?? throw new InvalidOperationException("Tariff information not found");
var isValid = true;
var message = new StringBuilder();
if (request.TUSDAmount != request.ConsumptionAmount * tariffInfo.TUSDValue)
{
isValid = false;
message.Append(TUSD_ERROR);
}
return new ValidationResult
{
IsValid = isValid,
RuleName = RULE_NAME,
Message = message.ToString()
};
}
}
}