| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- 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
- };
- }
- }
|