44 lines
1.9 KiB
C#
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
|
|
})
|
|
};
|
|
}
|
|
}
|
|
} |