automated dev commit
This commit is contained in:
commit
7551b4d824
18 changed files with 870 additions and 0 deletions
11
Services/IWsServicioDeInformacion.cs
Normal file
11
Services/IWsServicioDeInformacion.cs
Normal file
|
@ -0,0 +1,11 @@
|
|||
using SoapService.Models;
|
||||
using System.ServiceModel;
|
||||
|
||||
namespace SoapService.Services;
|
||||
|
||||
[ServiceContract(Namespace = "http://dnic.gub.uy/")]
|
||||
public interface IWsServicioDeInformacion
|
||||
{
|
||||
[OperationContract]
|
||||
ResultObtDocDigitalizado ObtDocDigitalizado(ParamObtDocDigitalizado param);
|
||||
}
|
250
Services/WsServicioDeInformacion.cs
Normal file
250
Services/WsServicioDeInformacion.cs
Normal file
|
@ -0,0 +1,250 @@
|
|||
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
|
||||
};
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue