opencand/OpenCand.ETL/Services/CandidatoService.cs
Jose Henrique a3d67198af
All checks were successful
API and ETL Build / build_etl (push) Successful in 17s
API and ETL Build / build_api (push) Successful in 9s
partido + melhorias
2025-05-31 20:46:48 -03:00

101 lines
4.4 KiB
C#

using OpenCand.Core.Models;
using OpenCand.ETL.Repository;
using OpenCand.Repository;
namespace OpenCand.Services
{
public class CandidatoService
{
private readonly CandidatoRepository candidatoRepository;
private readonly PartidoRepository partidoRepository;
public CandidatoService(CandidatoRepository candidatoRepository, PartidoRepository partidoRepository)
{
this.candidatoRepository = candidatoRepository;
this.partidoRepository = partidoRepository;
}
public async Task AddCandidatoAsync(Candidato candidato)
{
if (candidato == null)
{
throw new ArgumentNullException(nameof(candidato), "Candidato cannot be null");
}
if (candidato.Eleicoes == null || candidato.Eleicoes.Count == 0)
{
throw new ArgumentException("Candidato must have at least one mapping", nameof(candidato));
}
var candidatoMapping = candidato.Eleicoes.First();
// Add partido data
if (candidatoMapping.Partido != null)
{
await partidoRepository.AddPartidoAsync(candidatoMapping.Partido);
}
List<CandidatoMapping>? mappings = null;
CandidatoMapping? existingMapping = null;
if (candidato.Cpf == null || candidato.Cpf.Length != 11)
{
// If CPF is not provided or invalid, we STRICTLY search by name and other properties
mappings = await candidatoRepository.GetCandidatoMappingByNome(candidato.Nome,
candidato.SqCandidato,
candidatoMapping.Ano,
candidatoMapping.SiglaUF,
candidatoMapping.NomeUE,
candidatoMapping.NrCandidato);
}
else
{
mappings = await candidatoRepository.GetCandidatoMappingByCpf(candidato.Cpf);
}
// Check if exists
if (mappings != null && mappings.Count > 0)
{
existingMapping = mappings.FirstOrDefault(m => m.Ano == candidatoMapping.Ano &&
m.Cargo == candidatoMapping.Cargo &&
m.SiglaUF == candidatoMapping.SiglaUF &&
m.NomeUE == candidatoMapping.NomeUE &&
m.NrCandidato == candidatoMapping.NrCandidato &&
m.Resultado == candidatoMapping.Resultado);
// Already exists one for the current election
if (existingMapping != null)
{
candidato.IdCandidato = existingMapping.IdCandidato;
candidato.Cpf = existingMapping.Cpf;
await candidatoRepository.AddCandidatoAsync(candidato);
return;
}
// If exists (but not for the current election), we take the existing idcandidato
// and create a new mapping for the current election
else
{
existingMapping = mappings.First();
candidato.IdCandidato = existingMapping.IdCandidato;
candidato.Cpf = existingMapping.Cpf;
}
}
else
{
// No current mapping, we create a new one
// and create a new mapping for the current election
candidato.IdCandidato = Guid.NewGuid();
}
// Set the mapping properties
candidatoMapping.IdCandidato = candidato.IdCandidato;
candidatoMapping.Cpf = candidato.Cpf;
candidatoMapping.Nome = candidato.Nome;
await candidatoRepository.AddCandidatoAsync(candidato);
await candidatoRepository.AddCandidatoMappingAsync(candidatoMapping);
}
}
}