faturas_4docs/Compliance/Services/ValidationRules/MinimumBillingValidationRule.cs

55 lines
1.8 KiB
C#

using System;
using System.Threading.Tasks;
using System.Text;
using Compliance.Domain.Models;
using Compliance.DTOs;
using Compliance.Infrastructure.Repositories;
using Compliance.Services.ValidationRules;
namespace Compliance.Services.ValidationRules;
public class MinimumBillingValidationRule : IValidationRule
{
private readonly IDistributorRepository _distributorRepository;
private const string RULE_NAME = "Minimum Billing Validation";
private const decimal TOLERANCE = 0.01m;
public int Priority => 7;
public MinimumBillingValidationRule(IDistributorRepository distributorRepository)
{
_distributorRepository = distributorRepository;
}
public async Task<ValidationResult> ValidateAsync(
BillComplianceRequest request,
DistributorInformation distributorInfo,
Client clientInfo)
{
var minBillingInfo = await _distributorRepository.GetMinimumBillingInformationAsync(
request.DistributorName,
request.ConsumerGroup,
request.Month);
var isValid = true;
var message = new StringBuilder();
// Check if consumption is below minimum
if (request.ConsumptionAmount < minBillingInfo.MinimumConsumption)
{
var expectedMinCharge = minBillingInfo.MinimumValue;
var actualCharge = request.TotalAmount;
if (Math.Abs(actualCharge - expectedMinCharge) > TOLERANCE)
{
isValid = false;
message.AppendLine($"Incorrect minimum billing charge. Expected: {expectedMinCharge:F2}, Found: {actualCharge:F2}");
}
}
return new ValidationResult
{
IsValid = isValid,
RuleName = RULE_NAME,
Message = message.ToString().TrimEnd()
};
}
}