faturas_4docs/Compliance/Services/BillComplianceService.cs

44 lines
1.9 KiB
C#

using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;
using Compliance.DTOs;
using Compliance.Domain.Models;
using Compliance.Infrastructure.Repositories;
using Compliance.Services.ValidationRules;
namespace Compliance.Services
{
public class BillComplianceService(
IDistributorRepository distributorRepository,
IClientRepository clientRepository,
IValidationRuleFactory validationRuleFactory) : IBillComplianceService
{
private readonly IDistributorRepository _distributorRepository = distributorRepository;
private readonly IClientRepository _clientRepository = clientRepository;
private readonly IValidationRuleFactory _validationRuleFactory = validationRuleFactory;
public async Task<BillComplianceResponse> ValidateBillAsync(BillComplianceRequest request)
{
var distributorInfo = await _distributorRepository.GetDistributorInformationAsync(
request.DistributorName,
request.Month) ?? throw new InvalidOperationException("Distributor information not found");
var clientInfo = await _clientRepository.GetClientInformationAsync(
request.SmartCode) ?? throw new InvalidOperationException("Client information not found");
var rules = _validationRuleFactory.CreateRules();
var validationResults = await Task.WhenAll(
rules.Select(rule => rule.ValidateAsync(request, distributorInfo, clientInfo)));
return new BillComplianceResponse
{
IsValid = validationResults.All(r => r.IsValid),
ValidationResults = validationResults.Select(r => new ValidationResult
{
IsValid = r.IsValid,
RuleName = r.RuleName,
Message = r.Message
})
};
}
}
}