WsServicioDeInformacion.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. using SoapService.Models;
  2. namespace SoapService.Services;
  3. public class WsServicioDeInformacion : IWsServicioDeInformacion
  4. {
  5. private static readonly Dictionary<string, ObjPersona> _personasGeneradas = new();
  6. private static readonly Random _random = new();
  7. // Expanded lists of Uruguayan names and surnames
  8. private static readonly string[] _nombresHombre = {
  9. "Juan", "Carlos", "Martín", "Luis", "Diego", "Marcelo", "Alejandro", "Fernando",
  10. "Matías", "Pablo", "Eduardo", "Federico", "Gonzalo", "Sergio", "Daniel",
  11. "Raúl", "Gabriel", "Andrés", "Nicolás", "Roberto", "Sebastián", "Héctor",
  12. "Gustavo", "Leonardo", "Rodrigo", "Gerardo", "Ricardo", "Santiago", "Ignacio",
  13. "Emiliano", "Dante", "Agustín", "Julio", "Mario", "Alfredo", "Bruno", "Mauricio"
  14. };
  15. private static readonly string[] _nombresMujer = {
  16. "María", "Ana", "Laura", "Sofía", "Lucía", "Valentina", "Natalia", "Andrea",
  17. "Gabriela", "Carolina", "Verónica", "Claudia", "Patricia", "Alejandra", "Victoria",
  18. "Soledad", "Carmen", "Isabel", "Cecilia", "Paula", "Florencia", "Silvia", "Leticia",
  19. "Jimena", "Romina", "Agustina", "Lorena", "Camila", "Valeria", "Daniela", "Mariana",
  20. "Eugenia", "Rosario", "Pilar", "Adriana", "Carla", "Micaela", "Magdalena", "Inés"
  21. };
  22. private static readonly string[] _segundosNombres = {
  23. "José", "Pablo", "Elena", "Inés", "Alberto", "Miguel", "Beatriz", "Javier",
  24. "Alejandro", "Antonio", "Teresa", "Francisco", "Manuel", "Mercedes", "Rosario",
  25. "Ernesto", "Juana", "Felipe", "Jaime", "Clara", "Ignacio", "Ángel", "Joaquín",
  26. "Rafael", "Susana", "Héctor", "Alicia", "Marta", "Luciana", "Mateo", "Margarita"
  27. };
  28. private static readonly string[] _apellidos = {
  29. "Rodríguez", "Fernández", "García", "Martínez", "López", "González", "Pérez",
  30. "Gómez", "Sánchez", "Romero", "Silva", "Castro", "Torres", "Álvarez", "Benítez",
  31. "Ramírez", "Flores", "Herrera", "Gutiérrez", "Suárez", "Rojas", "Vargas", "Acosta",
  32. "Morales", "Giménez", "Cardozo", "Méndez", "Delgado", "Díaz", "Pereyra", "Olivera",
  33. "Ferreira", "Núñez", "Castillo", "Aguirre", "Duarte", "Sosa", "Vázquez", "Techera",
  34. "Medina", "Hernández", "Cabrera", "Machado", "Bentancor", "Moreira", "Fagúndez", "Pintos"
  35. };
  36. public ResultObtDocDigitalizado ObtDocDigitalizado(ParamObtDocDigitalizado param)
  37. {
  38. // Validate input parameters
  39. if (string.IsNullOrEmpty(param?.NroDocumento) ||
  40. string.IsNullOrEmpty(param?.NroSerie) ||
  41. string.IsNullOrEmpty(param?.Organismo) ||
  42. string.IsNullOrEmpty(param?.ClaveAcceso1))
  43. {
  44. return CreateErrorResult(ErrorCodes.ErroresGraves.ParametrosIncorrectos,
  45. ErrorCodes.ErroresGraves.ParametrosIncorrectosMensaje);
  46. }
  47. try
  48. {
  49. int seed = GetSeedFromCI(param.NroDocumento);
  50. Random randomCI = new(seed);
  51. var (errors, warnings) = CheckErrorsAndWarnings(param.NroDocumento);
  52. if (errors.Any())
  53. {
  54. return new ResultObtDocDigitalizado { Errores = errors.ToArray() };
  55. }
  56. ObjPersona persona = GeneratePerson(param, randomCI);
  57. var images = GenerateImages(seed);
  58. return new ResultObtDocDigitalizado
  59. {
  60. Persona = persona,
  61. Imagenes = images,
  62. Warnings = warnings.Any() ? warnings.ToArray() : null
  63. };
  64. }
  65. catch (Exception ex)
  66. {
  67. return CreateErrorResult(ErrorCodes.ErroresGraves.ConsultaNoCompletada,
  68. $"Error inesperado: {ex.Message}", ex.StackTrace!);
  69. }
  70. }
  71. private (List<Mensaje> Errors, List<Mensaje> Warnings) CheckErrorsAndWarnings(string nroDocumento)
  72. {
  73. var errors = new List<Mensaje>();
  74. var warnings = new List<Mensaje>();
  75. // Extract digits for error/warning checking
  76. string digits = new string(nroDocumento.Where(char.IsDigit).ToArray());
  77. if (string.IsNullOrEmpty(digits))
  78. {
  79. errors.Add(CreateMensaje(ErrorCodes.ErroresGraves.ParametrosIncorrectos,
  80. ErrorCodes.ErroresGraves.ParametrosIncorrectosMensaje));
  81. return (errors, warnings);
  82. }
  83. string firstTwoDigits = digits.Length >= 2 ? digits.Substring(0, 2) : digits.PadRight(2, '0');
  84. switch (firstTwoDigits)
  85. {
  86. case "11": // Persona inexistente
  87. errors.Add(CreateMensaje(ErrorCodes.ErroresLeves.PersonaInexistente,
  88. ErrorCodes.ErroresLeves.PersonaInexistenteMensaje));
  89. return (errors, warnings);
  90. case "12": // Límite excedido
  91. errors.Add(CreateMensaje(ErrorCodes.ErroresLeves.LimiteConsultasExcedido,
  92. ErrorCodes.ErroresLeves.LimiteConsultasExcedidoMensaje));
  93. return (errors, warnings);
  94. case "13": // Cédula anulada
  95. errors.Add(CreateMensaje(ErrorCodes.ErroresLeves.NumeroCedulaAnulado,
  96. ErrorCodes.ErroresLeves.NumeroCedulaAnuladoMensaje));
  97. return (errors, warnings);
  98. case "14": // Regularización needed
  99. warnings.Add(CreateMensaje(ErrorCodes.Warnings.DatosPersonaRegularizar,
  100. ErrorCodes.Warnings.DatosPersonaRegularizarMensaje));
  101. break;
  102. case "15": // Documento hurtado
  103. warnings.Add(CreateMensaje(ErrorCodes.Warnings.DocumentoHurtadoExtraviado,
  104. ErrorCodes.Warnings.DocumentoHurtadoExtraviadoMensaje));
  105. break;
  106. }
  107. return (errors, warnings);
  108. }
  109. private ObjPersona GeneratePerson(ParamObtDocDigitalizado param, Random randomCI)
  110. {
  111. // Return cached person if exists
  112. if (_personasGeneradas.TryGetValue(param.NroDocumento, out var existingPerson))
  113. {
  114. return existingPerson;
  115. }
  116. // Generate deterministic person data
  117. int sexo = randomCI.Next(1, 3); // 1 = Masculino, 2 = Femenino
  118. string nombre1 = sexo == 1
  119. ? _nombresHombre[randomCI.Next(_nombresHombre.Length)]
  120. : _nombresMujer[randomCI.Next(_nombresMujer.Length)];
  121. string nombre2 = _segundosNombres[randomCI.Next(_segundosNombres.Length)];
  122. string apellido1 = _apellidos[randomCI.Next(_apellidos.Length)];
  123. string apellido2 = _apellidos[randomCI.Next(_apellidos.Length)];
  124. // Optional adoptive surnames
  125. string? apellidoAdoptivo1 = randomCI.NextDouble() < 0.1 ? _apellidos[randomCI.Next(_apellidos.Length)] : null;
  126. string? apellidoAdoptivo2 = apellidoAdoptivo1 != null && randomCI.NextDouble() < 0.5 ? _apellidos[randomCI.Next(_apellidos.Length)] : null;
  127. // Extract last two digits of document number for age
  128. string digits = new string(param.NroDocumento.Where(char.IsDigit).ToArray());
  129. string lastTwoDigits = digits.Length >= 2 ? digits[^2..] : digits.PadLeft(2, '0');
  130. int edad = int.Parse(lastTwoDigits);
  131. // Ensure age is reasonable (e.g., 0-99); adjust if needed
  132. edad = Math.Clamp(edad, 0, 99);
  133. // Generate birth date based on age
  134. DateTime fechaNacimiento = DateTime.Now.AddYears(-edad).AddDays(-randomCI.Next(0, 365));
  135. string fechaNacimientoStr = fechaNacimiento.ToString("yyyy-MM-dd");
  136. // Build full name
  137. string nombreCompleto = $"{nombre1} {nombre2} {apellido1} {apellido2}";
  138. if (apellidoAdoptivo1 != null)
  139. {
  140. nombreCompleto += $" {apellidoAdoptivo1}";
  141. if (apellidoAdoptivo2 != null)
  142. nombreCompleto += $" {apellidoAdoptivo2}";
  143. }
  144. // Create person
  145. var persona = new ObjPersona
  146. {
  147. CodTipoDocumento = param.TipoDocumento,
  148. NroDocumento = param.NroDocumento,
  149. Nombre1 = nombre1,
  150. Nombre2 = nombre2,
  151. PrimerApellido = apellido1,
  152. SegundoApellido = apellido2,
  153. ApellidoAdoptivo1 = apellidoAdoptivo1!,
  154. ApellidoAdoptivo2 = apellidoAdoptivo2!,
  155. Sexo = sexo,
  156. FechaNacimiento = fechaNacimientoStr,
  157. CodNacionalidad = randomCI.Next(1, 3), // 1 = Oriental, 2 = Extranjero
  158. NombreEnCedula = nombreCompleto,
  159. IdSolicitud = 10000 + (randomCI.Next(0, 90000)),
  160. IdRespuesta = 10000 + (randomCI.Next(0, 90000))
  161. };
  162. // Cache the person
  163. _personasGeneradas[param.NroDocumento] = persona;
  164. return persona;
  165. }
  166. private ImagenDigital[] GenerateImages(int seed)
  167. {
  168. Random randomImage = new(seed);
  169. int length1 = 100 + (randomImage.Next(0, 300)); // 100-399 bytes
  170. int length2 = 100 + (randomImage.Next(0, 300)); // 100-399 bytes
  171. return new[]
  172. {
  173. new ImagenDigital
  174. {
  175. Foto = "No Implementado...",
  176. LargoBytes = length1,
  177. TipoImagen = 1
  178. },
  179. new ImagenDigital
  180. {
  181. Foto = "No Implementado...",
  182. LargoBytes = length2,
  183. TipoImagen = 2
  184. }
  185. };
  186. }
  187. private int GetSeedFromCI(string nroDocumento)
  188. {
  189. string digits = new string(nroDocumento.Where(char.IsDigit).ToArray());
  190. if (string.IsNullOrEmpty(digits))
  191. {
  192. return 12345;
  193. }
  194. if (digits.Length > 8)
  195. {
  196. digits = digits[^8..];
  197. }
  198. return int.TryParse(digits, out int seed) ? seed : 12345;
  199. }
  200. private ResultObtDocDigitalizado CreateErrorResult(int code, string message, string extraData = "Trace")
  201. {
  202. return new ResultObtDocDigitalizado
  203. {
  204. Errores = new[] { CreateMensaje(code, message, extraData) }
  205. };
  206. }
  207. private Mensaje CreateMensaje(int code, string description, string extraData = "Trace")
  208. {
  209. return new Mensaje
  210. {
  211. CodMensaje = code,
  212. Descripcion = description,
  213. DatoExtra = extraData
  214. };
  215. }
  216. }