using System.ComponentModel.DataAnnotations; using System.Text.RegularExpressions; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using MySql.Data.MySqlClient; namespace HelpDesk.Pages { public class RegistroModel : PageModel { private readonly IConfiguration _configuration; public RegistroModel(IConfiguration configuration) { _configuration = configuration; } // --- CAMPOS DEL FORMULARIO BINDPROPERTY --- [BindProperty] [Required(ErrorMessage = "El DNI es obligatorio.")] [RegularExpression(@"^\d{8}$", ErrorMessage = "El DNI debe contener exactamente 8 dígitos numéricos.")] public string Dni { get; set; } = string.Empty; [BindProperty] [Required(ErrorMessage = "Por favor, ingrese el nombre del usuario.")] public string Nombre { get; set; } = string.Empty; [BindProperty] public string Celular { get; set; } = string.Empty; [BindProperty] [Required(ErrorMessage = "Debe seleccionar una IPRESS.")] public string Ipress { get; set; } = string.Empty; [BindProperty] [Required(ErrorMessage = "Debe seleccionar una Condición.")] public string Condicion { get; set; } = string.Empty; [BindProperty] [Required(ErrorMessage = "Debe seleccionar un Nivel.")] public string Nivel { get; set; } = string.Empty; [BindProperty] [Required(ErrorMessage = "La contraseña es obligatoria.")] [StringLength(5, MinimumLength = 5, ErrorMessage = "La contraseña debe tener exactamente 5 caracteres.")] public string Password { get; set; } = string.Empty; [BindProperty] [Required(ErrorMessage = "Ingrese un correo electrónico.")] [EmailAddress(ErrorMessage = "Ingrese un correo electrónico válido.")] public string Correo { get; set; } = string.Empty; // --- LISTAS PARA DESPLEGABLES (DROPDOWNS) --- public List ListaIpress { get; set; } = new List(); public List ListaCondiciones { get; set; } = new List(); public List ListaNiveles { get; set; } = new List(); public string? MensajeRespuesta { get; set; } public bool EsExito { get; set; } public async Task OnGetAsync() { await CargarDesplegablesAsync(); } public async Task OnPostAsync() { if (!ModelState.IsValid) { await CargarDesplegablesAsync(); return Page(); } string connectionString = _configuration.GetConnectionString("MySqlHelpDesk") ?? string.Empty; try { using (var con = new MySqlConnection(connectionString)) { await con.OpenAsync(); // 1. Verificar si el DNI ya existe string checkQuery = "SELECT COUNT(*) FROM tb_usuarios WHERE dni = @dni"; using (var checkCmd = new MySqlCommand(checkQuery, con)) { checkCmd.Parameters.AddWithValue("@dni", Dni.Trim()); int existe = Convert.ToInt32(await checkCmd.ExecuteScalarAsync()); if (existe > 0) { MensajeRespuesta = "El DNI ya se encuentra registrado."; EsExito = false; await CargarDesplegablesAsync(); return Page(); } } // 2. Insertar nuevo usuario string insertQuery = @"INSERT INTO tb_usuarios (dni, nombre, celular, ipress, condicion, nivel, password, correo) VALUES (@dni, @nombre, @celular, @ipress, @condicion, @nivel, @password, @correo)"; using (var cmd = new MySqlCommand(insertQuery, con)) { cmd.Parameters.AddWithValue("@dni", Dni.Trim()); cmd.Parameters.AddWithValue("@nombre", Nombre.Trim()); cmd.Parameters.AddWithValue("@celular", Celular?.Trim() ?? string.Empty); cmd.Parameters.AddWithValue("@ipress", Ipress); cmd.Parameters.AddWithValue("@condicion", Condicion); cmd.Parameters.AddWithValue("@nivel", Nivel); cmd.Parameters.AddWithValue("@password", Password.Trim()); cmd.Parameters.AddWithValue("@correo", Correo.Trim()); await cmd.ExecuteNonQueryAsync(); } } MensajeRespuesta = "¡Usuario registrado exitosamente! Ya puede iniciar sesión."; EsExito = true; // Limpiar campos tras registro exitoso ModelState.Clear(); Dni = string.Empty; Nombre = string.Empty; Celular = string.Empty; Password = string.Empty; Correo = string.Empty; await CargarDesplegablesAsync(); return Page(); } catch (Exception ex) { MensajeRespuesta = "Error al registrar: " + ex.Message; EsExito = false; await CargarDesplegablesAsync(); return Page(); } } private async Task CargarDesplegablesAsync() { string connectionString = _configuration.GetConnectionString("MySqlHelpDesk") ?? string.Empty; using (var con = new MySqlConnection(connectionString)) { await con.OpenAsync(); // Cargar IPRESS string queryIpress = "SELECT Nombre_Establecimiento FROM maestro_his_establecimiento WHERE codigo_disa='24' AND codigo_red !='99' AND codigo_sector='7' ORDER BY Nombre_Establecimiento ASC"; using (var cmd = new MySqlCommand(queryIpress, con)) using (var dr = await cmd.ExecuteReaderAsync()) { ListaIpress = new List { new SelectListItem("-- Seleccione IPRESS --", "") }; while (await dr.ReadAsync()) { string nombreEstablecimiento = dr["Nombre_Establecimiento"].ToString() ?? string.Empty; ListaIpress.Add(new SelectListItem(nombreEstablecimiento, nombreEstablecimiento)); } } // Cargar Condiciones string queryCondiciones = "SELECT condicion FROM tb_condicion ORDER BY condicion ASC"; using (var cmd = new MySqlCommand(queryCondiciones, con)) using (var dr = await cmd.ExecuteReaderAsync()) { ListaCondiciones = new List { new SelectListItem("-- Seleccione Condición --", "") }; while (await dr.ReadAsync()) { string condicionVal = dr["condicion"].ToString() ?? string.Empty; ListaCondiciones.Add(new SelectListItem(condicionVal, condicionVal)); } } // Cargar Niveles string queryNiveles = "SELECT nivel FROM tb_nivel ORDER BY nivel ASC"; using (var cmd = new MySqlCommand(queryNiveles, con)) using (var dr = await cmd.ExecuteReaderAsync()) { ListaNiveles = new List { new SelectListItem("-- Seleccione Nivel --", "") }; while (await dr.ReadAsync()) { string nivelVal = dr["nivel"].ToString() ?? string.Empty; ListaNiveles.Add(new SelectListItem(nivelVal, nivelVal)); } } } } } }