first commit

This commit is contained in:
2026-01-10 23:14:51 -06:00
commit 389715b4b4
503 changed files with 98244 additions and 0 deletions

View File

@@ -0,0 +1,235 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Rs_system.Data;
using Rs_system.Models;
using Rs_system.Models.ViewModels;
using BCrypt.Net;
using Microsoft.AspNetCore.Authorization;
namespace Rs_system.Controllers;
[Authorize]
public class UsuarioController : Controller
{
private readonly ApplicationDbContext _context;
public UsuarioController(ApplicationDbContext context)
{
_context = context;
}
// GET: Usuario
public async Task<IActionResult> Index()
{
var usuarios = await _context.Usuarios
.Include(u => u.Persona)
.Include(u => u.RolesUsuario)
.ThenInclude(ru => ru.Rol)
.ToListAsync();
return View(usuarios);
}
// GET: Usuario/Create
public async Task<IActionResult> Create()
{
ViewBag.Roles = await _context.RolesSistema.ToListAsync();
return View(new UsuarioViewModel());
}
// POST: Usuario/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(UsuarioViewModel model)
{
if (string.IsNullOrEmpty(model.Contrasena))
{
ModelState.AddModelError("Contrasena", "La contraseña es requerida para nuevos usuarios");
}
if (ModelState.IsValid)
{
if (await _context.Usuarios.AnyAsync(u => u.NombreUsuario == model.NombreUsuario))
{
ModelState.AddModelError("NombreUsuario", "El nombre de usuario ya está en uso");
ViewBag.Roles = await _context.RolesSistema.ToListAsync();
return View(model);
}
if (await _context.Usuarios.AnyAsync(u => u.Email == model.Email))
{
ModelState.AddModelError("Email", "El correo electrónico ya está en uso");
ViewBag.Roles = await _context.RolesSistema.ToListAsync();
return View(model);
}
using var transaction = await _context.Database.BeginTransactionAsync();
try
{
var persona = new Persona
{
Nombres = model.Nombres,
Apellidos = model.Apellidos,
Email = model.Email,
Telefono = model.Telefono,
Activo = true
};
_context.Personas.Add(persona);
await _context.SaveChangesAsync();
var usuario = new Usuario
{
PersonaId = persona.Id,
NombreUsuario = model.NombreUsuario,
Email = model.Email,
HashContrasena = BCrypt.Net.BCrypt.HashPassword(model.Contrasena),
Activo = true,
CreadoEn = DateTime.UtcNow,
ActualizadoEn = DateTime.UtcNow
};
_context.Usuarios.Add(usuario);
await _context.SaveChangesAsync();
// Assign Roles
if (model.SelectedRoles != null)
{
foreach (var roleId in model.SelectedRoles)
{
_context.RolesUsuario.Add(new RolUsuario
{
UsuarioId = usuario.Id,
RolId = roleId,
AsignadoEn = DateTime.UtcNow
});
}
await _context.SaveChangesAsync();
}
await transaction.CommitAsync();
return RedirectToAction(nameof(Index));
}
catch (Exception)
{
await transaction.RollbackAsync();
ModelState.AddModelError("", "Ocurrió un error al crear el usuario.");
}
}
ViewBag.Roles = await _context.RolesSistema.ToListAsync();
return View(model);
}
// GET: Usuario/Edit/5
public async Task<IActionResult> Edit(long? id)
{
if (id == null) return NotFound();
var usuario = await _context.Usuarios
.Include(u => u.Persona)
.Include(u => u.RolesUsuario)
.FirstOrDefaultAsync(u => u.Id == id);
if (usuario == null) return NotFound();
var model = new UsuarioViewModel
{
Id = usuario.Id,
Nombres = usuario.Persona.Nombres,
Apellidos = usuario.Persona.Apellidos,
NombreUsuario = usuario.NombreUsuario,
Email = usuario.Email,
Telefono = usuario.Persona.Telefono,
Activo = usuario.Activo,
SelectedRoles = usuario.RolesUsuario.Select(ru => ru.RolId).ToList()
};
ViewBag.Roles = await _context.RolesSistema.ToListAsync();
return View(model);
}
// POST: Usuario/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(long id, UsuarioViewModel model)
{
if (id != model.Id) return NotFound();
if (ModelState.IsValid)
{
var usuario = await _context.Usuarios
.Include(u => u.Persona)
.Include(u => u.RolesUsuario)
.FirstOrDefaultAsync(u => u.Id == id);
if (usuario == null) return NotFound();
using var transaction = await _context.Database.BeginTransactionAsync();
try
{
// Update Persona
usuario.Persona.Nombres = model.Nombres;
usuario.Persona.Apellidos = model.Apellidos;
usuario.Persona.Telefono = model.Telefono;
usuario.Persona.ActualizadoEn = DateTime.UtcNow;
// Update Usuario
usuario.NombreUsuario = model.NombreUsuario;
usuario.Email = model.Email;
usuario.Activo = model.Activo;
usuario.ActualizadoEn = DateTime.UtcNow;
if (!string.IsNullOrEmpty(model.Contrasena))
{
usuario.HashContrasena = BCrypt.Net.BCrypt.HashPassword(model.Contrasena);
}
// Update Roles
_context.RolesUsuario.RemoveRange(usuario.RolesUsuario);
if (model.SelectedRoles != null)
{
foreach (var roleId in model.SelectedRoles)
{
_context.RolesUsuario.Add(new RolUsuario
{
UsuarioId = usuario.Id,
RolId = roleId,
AsignadoEn = DateTime.UtcNow
});
}
}
await _context.SaveChangesAsync();
await transaction.CommitAsync();
return RedirectToAction(nameof(Index));
}
catch (Exception)
{
await transaction.RollbackAsync();
ModelState.AddModelError("", "Ocurrió un error al actualizar el usuario.");
}
}
ViewBag.Roles = await _context.RolesSistema.ToListAsync();
return View(model);
}
// POST: Usuario/Desactivar/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Desactivar(long id)
{
var usuario = await _context.Usuarios.FindAsync(id);
if (usuario != null)
{
usuario.Activo = false;
usuario.ActualizadoEn = DateTime.UtcNow;
await _context.SaveChangesAsync();
}
return RedirectToAction(nameof(Index));
}
private bool UsuarioExists(long id)
{
return _context.Usuarios.Any(e => e.Id == id);
}
}