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