250 lines
10 KiB
C#
250 lines
10 KiB
C#
using SoapService.Models;
|
|
|
|
namespace SoapService.Services;
|
|
|
|
public class WsServicioDeInformacion : IWsServicioDeInformacion
|
|
{
|
|
private static readonly Dictionary<string, ObjPersona> _personasGeneradas = new();
|
|
private static readonly Random _random = new();
|
|
|
|
// Expanded lists of Uruguayan names and surnames
|
|
private static readonly string[] _nombresHombre = {
|
|
"Juan", "Carlos", "Martín", "Luis", "Diego", "Marcelo", "Alejandro", "Fernando",
|
|
"Matías", "Pablo", "Eduardo", "Federico", "Gonzalo", "Sergio", "Daniel",
|
|
"Raúl", "Gabriel", "Andrés", "Nicolás", "Roberto", "Sebastián", "Héctor",
|
|
"Gustavo", "Leonardo", "Rodrigo", "Gerardo", "Ricardo", "Santiago", "Ignacio",
|
|
"Emiliano", "Dante", "Agustín", "Julio", "Mario", "Alfredo", "Bruno", "Mauricio"
|
|
};
|
|
private static readonly string[] _nombresMujer = {
|
|
"María", "Ana", "Laura", "Sofía", "Lucía", "Valentina", "Natalia", "Andrea",
|
|
"Gabriela", "Carolina", "Verónica", "Claudia", "Patricia", "Alejandra", "Victoria",
|
|
"Soledad", "Carmen", "Isabel", "Cecilia", "Paula", "Florencia", "Silvia", "Leticia",
|
|
"Jimena", "Romina", "Agustina", "Lorena", "Camila", "Valeria", "Daniela", "Mariana",
|
|
"Eugenia", "Rosario", "Pilar", "Adriana", "Carla", "Micaela", "Magdalena", "Inés"
|
|
};
|
|
private static readonly string[] _segundosNombres = {
|
|
"José", "Pablo", "Elena", "Inés", "Alberto", "Miguel", "Beatriz", "Javier",
|
|
"Alejandro", "Antonio", "Teresa", "Francisco", "Manuel", "Mercedes", "Rosario",
|
|
"Ernesto", "Juana", "Felipe", "Jaime", "Clara", "Ignacio", "Ángel", "Joaquín",
|
|
"Rafael", "Susana", "Héctor", "Alicia", "Marta", "Luciana", "Mateo", "Margarita"
|
|
};
|
|
private static readonly string[] _apellidos = {
|
|
"Rodríguez", "Fernández", "García", "Martínez", "López", "González", "Pérez",
|
|
"Gómez", "Sánchez", "Romero", "Silva", "Castro", "Torres", "Álvarez", "Benítez",
|
|
"Ramírez", "Flores", "Herrera", "Gutiérrez", "Suárez", "Rojas", "Vargas", "Acosta",
|
|
"Morales", "Giménez", "Cardozo", "Méndez", "Delgado", "Díaz", "Pereyra", "Olivera",
|
|
"Ferreira", "Núñez", "Castillo", "Aguirre", "Duarte", "Sosa", "Vázquez", "Techera",
|
|
"Medina", "Hernández", "Cabrera", "Machado", "Bentancor", "Moreira", "Fagúndez", "Pintos"
|
|
};
|
|
|
|
public ResultObtDocDigitalizado ObtDocDigitalizado(ParamObtDocDigitalizado param)
|
|
{
|
|
// Validate input parameters
|
|
if (string.IsNullOrEmpty(param?.NroDocumento) ||
|
|
string.IsNullOrEmpty(param?.NroSerie) ||
|
|
string.IsNullOrEmpty(param?.Organismo) ||
|
|
string.IsNullOrEmpty(param?.ClaveAcceso1))
|
|
{
|
|
return CreateErrorResult(ErrorCodes.ErroresGraves.ParametrosIncorrectos,
|
|
ErrorCodes.ErroresGraves.ParametrosIncorrectosMensaje);
|
|
}
|
|
|
|
try
|
|
{
|
|
int seed = GetSeedFromCI(param.NroDocumento);
|
|
Random randomCI = new(seed);
|
|
|
|
var (errors, warnings) = CheckErrorsAndWarnings(param.NroDocumento);
|
|
if (errors.Any())
|
|
{
|
|
return new ResultObtDocDigitalizado { Errores = errors.ToArray() };
|
|
}
|
|
|
|
ObjPersona persona = GeneratePerson(param, randomCI);
|
|
var images = GenerateImages(seed);
|
|
|
|
return new ResultObtDocDigitalizado
|
|
{
|
|
Persona = persona,
|
|
Imagenes = images,
|
|
Warnings = warnings.Any() ? warnings.ToArray() : null
|
|
};
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return CreateErrorResult(ErrorCodes.ErroresGraves.ConsultaNoCompletada,
|
|
$"Error inesperado: {ex.Message}", ex.StackTrace!);
|
|
}
|
|
}
|
|
|
|
private (List<Mensaje> Errors, List<Mensaje> Warnings) CheckErrorsAndWarnings(string nroDocumento)
|
|
{
|
|
var errors = new List<Mensaje>();
|
|
var warnings = new List<Mensaje>();
|
|
|
|
// Extract digits for error/warning checking
|
|
string digits = new string(nroDocumento.Where(char.IsDigit).ToArray());
|
|
if (string.IsNullOrEmpty(digits))
|
|
{
|
|
errors.Add(CreateMensaje(ErrorCodes.ErroresGraves.ParametrosIncorrectos,
|
|
ErrorCodes.ErroresGraves.ParametrosIncorrectosMensaje));
|
|
return (errors, warnings);
|
|
}
|
|
|
|
string firstTwoDigits = digits.Length >= 2 ? digits.Substring(0, 2) : digits.PadRight(2, '0');
|
|
|
|
switch (firstTwoDigits)
|
|
{
|
|
case "11": // Persona inexistente
|
|
errors.Add(CreateMensaje(ErrorCodes.ErroresLeves.PersonaInexistente,
|
|
ErrorCodes.ErroresLeves.PersonaInexistenteMensaje));
|
|
return (errors, warnings);
|
|
|
|
case "12": // Límite excedido
|
|
errors.Add(CreateMensaje(ErrorCodes.ErroresLeves.LimiteConsultasExcedido,
|
|
ErrorCodes.ErroresLeves.LimiteConsultasExcedidoMensaje));
|
|
return (errors, warnings);
|
|
|
|
case "13": // Cédula anulada
|
|
errors.Add(CreateMensaje(ErrorCodes.ErroresLeves.NumeroCedulaAnulado,
|
|
ErrorCodes.ErroresLeves.NumeroCedulaAnuladoMensaje));
|
|
return (errors, warnings);
|
|
|
|
case "14": // Regularización needed
|
|
warnings.Add(CreateMensaje(ErrorCodes.Warnings.DatosPersonaRegularizar,
|
|
ErrorCodes.Warnings.DatosPersonaRegularizarMensaje));
|
|
break;
|
|
|
|
case "15": // Documento hurtado
|
|
warnings.Add(CreateMensaje(ErrorCodes.Warnings.DocumentoHurtadoExtraviado,
|
|
ErrorCodes.Warnings.DocumentoHurtadoExtraviadoMensaje));
|
|
break;
|
|
}
|
|
|
|
return (errors, warnings);
|
|
}
|
|
|
|
private ObjPersona GeneratePerson(ParamObtDocDigitalizado param, Random randomCI)
|
|
{
|
|
// Return cached person if exists
|
|
if (_personasGeneradas.TryGetValue(param.NroDocumento, out var existingPerson))
|
|
{
|
|
return existingPerson;
|
|
}
|
|
|
|
// Generate deterministic person data
|
|
int sexo = randomCI.Next(1, 3); // 1 = Masculino, 2 = Femenino
|
|
string nombre1 = sexo == 1
|
|
? _nombresHombre[randomCI.Next(_nombresHombre.Length)]
|
|
: _nombresMujer[randomCI.Next(_nombresMujer.Length)];
|
|
|
|
string nombre2 = _segundosNombres[randomCI.Next(_segundosNombres.Length)];
|
|
string apellido1 = _apellidos[randomCI.Next(_apellidos.Length)];
|
|
string apellido2 = _apellidos[randomCI.Next(_apellidos.Length)];
|
|
|
|
// Optional adoptive surnames
|
|
string? apellidoAdoptivo1 = randomCI.NextDouble() < 0.1 ? _apellidos[randomCI.Next(_apellidos.Length)] : null;
|
|
string? apellidoAdoptivo2 = apellidoAdoptivo1 != null && randomCI.NextDouble() < 0.5 ? _apellidos[randomCI.Next(_apellidos.Length)] : null;
|
|
|
|
// Extract last two digits of document number for age
|
|
string digits = new string(param.NroDocumento.Where(char.IsDigit).ToArray());
|
|
string lastTwoDigits = digits.Length >= 2 ? digits[^2..] : digits.PadLeft(2, '0');
|
|
int edad = int.Parse(lastTwoDigits);
|
|
|
|
// Ensure age is reasonable (e.g., 0-99); adjust if needed
|
|
edad = Math.Clamp(edad, 0, 99);
|
|
|
|
// Generate birth date based on age
|
|
DateTime fechaNacimiento = DateTime.Now.AddYears(-edad).AddDays(-randomCI.Next(0, 365));
|
|
string fechaNacimientoStr = fechaNacimiento.ToString("yyyy-MM-dd");
|
|
|
|
// Build full name
|
|
string nombreCompleto = $"{nombre1} {nombre2} {apellido1} {apellido2}";
|
|
if (apellidoAdoptivo1 != null)
|
|
{
|
|
nombreCompleto += $" {apellidoAdoptivo1}";
|
|
if (apellidoAdoptivo2 != null)
|
|
nombreCompleto += $" {apellidoAdoptivo2}";
|
|
}
|
|
|
|
// Create person
|
|
var persona = new ObjPersona
|
|
{
|
|
CodTipoDocumento = param.TipoDocumento,
|
|
NroDocumento = param.NroDocumento,
|
|
Nombre1 = nombre1,
|
|
Nombre2 = nombre2,
|
|
PrimerApellido = apellido1,
|
|
SegundoApellido = apellido2,
|
|
ApellidoAdoptivo1 = apellidoAdoptivo1!,
|
|
ApellidoAdoptivo2 = apellidoAdoptivo2!,
|
|
Sexo = sexo,
|
|
FechaNacimiento = fechaNacimientoStr,
|
|
CodNacionalidad = randomCI.Next(1, 3), // 1 = Oriental, 2 = Extranjero
|
|
NombreEnCedula = nombreCompleto,
|
|
IdSolicitud = 10000 + (randomCI.Next(0, 90000)),
|
|
IdRespuesta = 10000 + (randomCI.Next(0, 90000))
|
|
};
|
|
|
|
// Cache the person
|
|
_personasGeneradas[param.NroDocumento] = persona;
|
|
return persona;
|
|
}
|
|
|
|
private ImagenDigital[] GenerateImages(int seed)
|
|
{
|
|
Random randomImage = new(seed);
|
|
int length1 = 100 + (randomImage.Next(0, 300)); // 100-399 bytes
|
|
int length2 = 100 + (randomImage.Next(0, 300)); // 100-399 bytes
|
|
|
|
return new[]
|
|
{
|
|
new ImagenDigital
|
|
{
|
|
Foto = "No Implementado...",
|
|
LargoBytes = length1,
|
|
TipoImagen = 1
|
|
},
|
|
new ImagenDigital
|
|
{
|
|
Foto = "No Implementado...",
|
|
LargoBytes = length2,
|
|
TipoImagen = 2
|
|
}
|
|
};
|
|
}
|
|
|
|
private int GetSeedFromCI(string nroDocumento)
|
|
{
|
|
string digits = new string(nroDocumento.Where(char.IsDigit).ToArray());
|
|
if (string.IsNullOrEmpty(digits))
|
|
{
|
|
return 12345;
|
|
}
|
|
|
|
if (digits.Length > 8)
|
|
{
|
|
digits = digits[^8..];
|
|
}
|
|
|
|
return int.TryParse(digits, out int seed) ? seed : 12345;
|
|
}
|
|
|
|
private ResultObtDocDigitalizado CreateErrorResult(int code, string message, string extraData = "Trace")
|
|
{
|
|
return new ResultObtDocDigitalizado
|
|
{
|
|
Errores = new[] { CreateMensaje(code, message, extraData) }
|
|
};
|
|
}
|
|
|
|
private Mensaje CreateMensaje(int code, string description, string extraData = "Trace")
|
|
{
|
|
return new Mensaje
|
|
{
|
|
CodMensaje = code,
|
|
Descripcion = description,
|
|
DatoExtra = extraData
|
|
};
|
|
}
|
|
}
|