añadido nuevo crear grupo

This commit is contained in:
2025-06-21 01:33:23 -03:00
parent f6dc641508
commit 98dbc8c865
5 changed files with 258 additions and 0 deletions

View File

@@ -126,4 +126,52 @@ public class UsuarioController : ControllerBase
return Ok(new { token = cli.Token });
}
public record Crearusuario(long Dni, string Nombre, string Apellido, string Domicilio, string Celular,
string Email, string Contraseña, string? EmailRecuperacion, List<int> grupos);
[HttpPost("api/crearusuario")]
public IActionResult CrearUsuario([FromHeader(Name ="Auth")] string Auth, [FromBody] Crearusuario cu)
{
var ret = RepositorioPermisos.Singleton.CheckPermisos(Auth, 19);
if (!ret) return BadRequest(new { message = "No tienes permisos para Crear un usuario" });
Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth);
if (cli == null) return BadRequest(new { message = "No hay un usuario por ese token" });
string rett = "";
if (cu.Dni <= 0)
rett += "No puede haber un documento con numero menor o igual a 0";
if (cu.Apellido.Length > 20)
rett += "Apellido excede los 20 caracteres. ";
if (cu.Nombre.Length > 20)
rett += "Nombre excede los 20 caracteres. ";
if (cu.Celular.Length > 40)
rett += "Celular excede los 40 caracteres. ";
if (cu.Domicilio.Length > 40)
rett += "Domicilio excede los 40 caracteres. ";
if (cu.Email.Length > 50)
rett += "Email excede los 50 caracteres. ";
if (cu.EmailRecuperacion?.Length > 50)
rett += "Email de recuperación excede los 50 caracteres. ";
if (rett != "") return BadRequest(new { message = rett });
Cliente clii = new Cliente
{
Habilitado = 1,
Dni = cu.Dni,
Nombre = cu.Nombre,
Apellido = cu.Apellido,
Celular = cu.Celular,
Email = cu.Email,
EmailRecuperacion = ((cu.EmailRecuperacion ?? "").Length == 0) ? cu.Email : cu.EmailRecuperacion,
Domicilio = cu.Domicilio
};
var rettt = RepositorioUsuarios.Singleton.AltaUsuario(cli.Dni, clii, cu.Contraseña, cu.grupos);
return rettt
? Ok(new { message = "Usuario creado exitosamente." })
: BadRequest(new { message = "Hubo un error al crear el usuario." }); }
}

View File

@@ -34,6 +34,7 @@
import OtroG from "./paginas/grupos/OtroG.svelte";
import GestionPemisos from "./paginas/GestionPemisos.svelte";
import UsuarioPanel from "./paginas/UsuarioPanel.svelte";
import CrearUsuario from "./paginas/CrearUsuario.svelte";
</script>
<Router>
@@ -141,6 +142,12 @@
<ProteRoute componente={AdminGrupos} />
</Route>
<!-- Crear Usuario -->
<Route path="/accion/19">
<ProteRoute componente={CrearUsuario} />
</Route>
<!-- Pagina Ventas -->
<Route path="/Ventas">
<ProteRoute componente={Ventas} />

View File

@@ -0,0 +1,173 @@
<script lang="ts">
import { onMount } from "svelte";
import BarraHorizontalConTexto from "../Componentes/BarraHorizontalConTexto.svelte";
import ModalEstatico from "../Componentes/ModalEstatico.svelte";
import NavBarAutocompletable from "../Componentes/NavBarAutocompletable.svelte";
import { urlG } from "../stores/urlStore";
import type { CrearUsuario, Grupo, GrupoDto } from "../types";
let formData: CrearUsuario = $state({
Dni: 0,
Nombre: '',
Apellido: '',
Domicilio: '',
Celular: '',
Email: '',
Contraseña: '',
EmailRecuperacion: null,
grupos: []
});
let token = sessionStorage.getItem("token");
let grupos: GrupoDto[] = $state([]);
let modaldata: string = $state("");
onMount(async ()=>{
obtenerGrupos();
});
async function obtenerGrupos(){
try {
const req = await fetch($urlG+ "/api/admin/grupos", {
method: "GET",
headers: {
"Auth": token,
}
});
let data = await req.json();
if (req.ok){
grupos= data;
} else{
modaldata = data.message;
}
} catch{
modaldata = "Fallo al hacer la request";
}
}
const resetForm = () => {
formData = {
Dni: 0,
Nombre: '',
Apellido: '',
Domicilio: '',
Celular: '',
Email: '',
Contraseña: '',
EmailRecuperacion: null,
grupos: []
};
};
async function handleSubmit(e:Event){
e.preventDefault();
try{
const req = await fetch($urlG +"/api/crearusuario", {
method: "POST",
headers: {
"Auth": token,
"Content-Type": "Application/json"
},
body: JSON.stringify(formData)
});
let data = await req.json();
modaldata = data.message;
if (req.ok){
resetForm();
}
}catch {
modaldata = "Fallo al hacer la request";
}
}
const toggleGrupo = (id: number) => {
const index = formData.grupos.indexOf(id);
if (index === -1) {
formData.grupos = [...formData.grupos, id];
} else {
formData.grupos = formData.grupos.filter(g => g !== id);
}
};
</script>
{#if modaldata}
<ModalEstatico payload={modaldata} close={()=>!!(modaldata="")}/>
{/if}
<NavBarAutocompletable/>
<div class="container mt-4">
<BarraHorizontalConTexto text="Crear Usuario" />
<form onsubmit={(e)=>handleSubmit(e)} class="row g-3 mt-2" id="formcrearusu">
<!-- DNI -->
<div class="col-md-6">
<label for="dni" class="form-label">DNI</label>
<input type="number" min="0" max="99999999" id="dni" bind:value={formData.Dni} class="form-control" required />
</div>
<!-- Nombre -->
<div class="col-md-6">
<label for="nombre" class="form-label">Nombre</label>
<input type="text" id="nombre" bind:value={formData.Nombre} class="form-control" maxlength="20" required/>
</div>
<!-- Apellido -->
<div class="col-md-6">
<label for="apellido" class="form-label">Apellido</label>
<input type="text" id="apellido" bind:value={formData.Apellido} class="form-control" maxlength="20" required/>
</div>
<!-- Domicilio -->
<div class="col-md-6">
<label for="domicilio" class="form-label">Domicilio</label>
<input type="text" id="domicilio" bind:value={formData.Domicilio} class="form-control" maxlength="40" required/>
</div>
<!-- Celular -->
<div class="col-md-6">
<label for="celular" class="form-label">Celular</label>
<input type="tel" id="celular" bind:value={formData.Celular} class="form-control" maxlength="40" required/>
</div>
<!-- Email -->
<div class="col-md-6">
<label for="email" class="form-label">Email</label>
<input type="email" id="email" bind:value={formData.Email} class="form-control" maxlength="50" required/>
</div>
<!-- Email Recuperación -->
<div class="col-md-6">
<label for="recuperacion" class="form-label">Email de Recuperación</label>
<input type="email" id="recuperacion" bind:value={formData.EmailRecuperacion} class="form-control" maxlength="50" />
</div>
<!-- Contraseña -->
<div class="col-md-6">
<label for="contrasena" class="form-label">Contraseña</label>
<input type="password" id="contrasena" bind:value={formData.Contraseña} class="form-control" required minlength="8"/>
</div>
<!-- Grupos -->
<div class="col-md-6">
<label class="form-label">Selecciona Grupos</label>
<div class="d-flex flex-wrap gap-2">
{#each grupos as grupo}
<button
type="button"
class="btn {formData.grupos.includes(grupo.idgrupo) ? 'btn-primary' : 'btn-outline-secondary'}"
onclick={() => toggleGrupo(grupo.idgrupo)}
>
{grupo.nombre}
</button>
{/each}
</div>
</div>
<!-- Botón -->
<div class="col-12 mt-3">
<button type="submit" class="btn btn-success">Crear Usuario</button>
</div>
</form>
</div>

12
Front/src/types.d.ts vendored
View File

@@ -249,3 +249,15 @@ export type IngresosDto = {
atrasados:number,
sin_realizar:number
}
export type CrearUsuario = {
Dni: number;
Nombre: string;
Apellido: string;
Domicilio: string;
Celular: string;
Email: string;
Contraseña: string;
EmailRecuperacion?: string | null;
grupos: number[];
}

View File

@@ -11,6 +11,24 @@ namespace Modelo;
public class RepositorioUsuarios : RepositorioBase<RepositorioUsuarios>
{
public bool AltaUsuario(long Dni, Cliente clii, string Contraseña, List<int> grupos)
{
var con = Context;
foreach (int i in grupos)
{
var g = con.Grupos.FirstOrDefault(x => x.Id == i);
clii.Idgrupos.Add(g);
}
clii.Contraseña = Encoding.UTF8.GetBytes(HacerHash(Contraseña));
con.Clientes.Add(clii);
base.GenerarLog(con, Dni, "Creacion de usuario");
return Guardar(con);
}
public (bool, long) Check2fa(string Email, string Pin)
{
var con = Context;