55 lines
1.8 KiB
C#
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()
|
|
};
|
|
}
|
|
} |