From 374540a4247bb075a16257be2d3c71c87ee3d1b8 Mon Sep 17 00:00:00 2001 From: fede Date: Sat, 24 May 2025 01:11:17 -0300 Subject: [PATCH] qa --- Aspnet/Controllers/ContratoController.cs | 18 +- Aspnet/Controllers/VentaController.cs | 2 - Front/src/paginas/AdminGrupos.svelte | 3 +- Front/src/paginas/ContratoInquilino.svelte | 623 ++++++++++++--------- 4 files changed, 382 insertions(+), 264 deletions(-) diff --git a/Aspnet/Controllers/ContratoController.cs b/Aspnet/Controllers/ContratoController.cs index cf2c30a..aacb1ae 100644 --- a/Aspnet/Controllers/ContratoController.cs +++ b/Aspnet/Controllers/ContratoController.cs @@ -813,15 +813,25 @@ public class ContratoController : ControllerBase public IActionResult ObtenerGarantes([FromHeader(Name = "Auth")] string Auth, int idcontrato) { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(); - if (idcontrato <= 0) return BadRequest(); + if (idcontrato <= 0) return BadRequest(new { message = "No puede ser un contrato id menor a 0" }); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli == null) return BadRequest(); + if (cli == null) return BadRequest(new { message = "No existe el cliente para el token" }); Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(idcontrato); - if (cont == null) return BadRequest(); + if (cont == null) return BadRequest(new { message = "El contrato no existe" }); - if ((cont.Dniinquilino != cli.Dni && cont.Dnipropietario != cli.Dni) || !RepositorioPermisos.Singleton.CheckPermisos(Auth, 14)) return BadRequest(); + bool esInquilinoOPropietario = (cont.Dniinquilino ?? 0) == cli.Dni || (cont.Dnipropietario ?? 0) == cli.Dni; + bool tienePermiso = RepositorioPermisos.Singleton.CheckPermisos(Auth, 14); + + if (esInquilinoOPropietario == false) + { + return BadRequest(new { message = "No tiene acceso a este path" }); + } + else if (tienePermiso == false && esInquilinoOPropietario == false) + { + return BadRequest(new { message = "No tiene acceso a este path de admin" }); + } var list = cont.Idgarantes; List l = new(); diff --git a/Aspnet/Controllers/VentaController.cs b/Aspnet/Controllers/VentaController.cs index 6f3f34c..3e16478 100644 --- a/Aspnet/Controllers/VentaController.cs +++ b/Aspnet/Controllers/VentaController.cs @@ -1,5 +1,3 @@ -using System.Configuration; -using System.Formats.Asn1; using System.Text.Json; using AlquilaFacil.Builder; using AlquilaFacil.Config; diff --git a/Front/src/paginas/AdminGrupos.svelte b/Front/src/paginas/AdminGrupos.svelte index dc58059..7009f42 100644 --- a/Front/src/paginas/AdminGrupos.svelte +++ b/Front/src/paginas/AdminGrupos.svelte @@ -39,6 +39,7 @@ let selgru: GrupoDto = $state({ gruposIncluidos: [], idgrupo: 0, + habilitado: false, nombre: "", permisos: [], }); @@ -153,7 +154,6 @@ {:else} - (showmodaladd = true)} /> {#if showmodaladd} (showmodaladd = false)} @@ -242,5 +242,6 @@ {/each} + (showmodaladd = true)} /> {/if} diff --git a/Front/src/paginas/ContratoInquilino.svelte b/Front/src/paginas/ContratoInquilino.svelte index fbd5438..726bf36 100644 --- a/Front/src/paginas/ContratoInquilino.svelte +++ b/Front/src/paginas/ContratoInquilino.svelte @@ -2,41 +2,55 @@ import NavBarAutocompletable from "../Componentes/NavBarAutocompletable.svelte"; import { onMount } from "svelte"; import ModalEstatico from "../Componentes/ModalEstatico.svelte"; - import {urlG} from "../stores/urlStore"; - import type { AltaDefectoDto, CanonDto, ContratoDto, ContratoPropiedadDto, DefectoDto, GaranteDto2, OpcionVentaDto } from "../types"; + import { urlG } from "../stores/urlStore"; + import type { + AltaDefectoDto, + CanonDto, + ContratoDto, + ContratoPropiedadDto, + DefectoDto, + GaranteDto2, + OpcionVentaDto, + } from "../types"; import ModalPedirDoc from "../Componentes/ModalPedirDoc.svelte"; import FormAltaDefecto from "../Componentes/FormAltaDefecto.svelte"; import { navigate } from "svelte-routing"; - - let token:string = sessionStorage.getItem("token")||""; - let selMod:any =$state(); - let showmodal:boolean = $state(false); - let canons:CanonDto[] = $state([]); + let token: string = sessionStorage.getItem("token") || ""; + + let selMod: any = $state(); + let showmodal: boolean = $state(false); + let canons: CanonDto[] = $state([]); let garantes: GaranteDto2[] = $state([]); - let prop:ContratoPropiedadDto = $state({ - estado:"", - fechainicio:"", - id:0, - inquilino:"", - propietario:"", - tipoPropiedad:"", - ubicacion:"", - habitaciones:0, - piso:0, - letra:"", - mesesAumento:0, - mesesDuracion:0, + let prop: ContratoPropiedadDto = $state({ + estado: "", + fechainicio: "", + id: 0, + inquilino: "", + propietario: "", + tipoPropiedad: "", + ubicacion: "", + habitaciones: 0, + piso: 0, + letra: "", + mesesAumento: 0, + mesesDuracion: 0, }); - let defectos:DefectoDto[] = $state([]); + let defectos: DefectoDto[] = $state([]); - let TieneOpcionVenta:boolean =$state(false); - let dtoVenta:OpcionVentaDto =$state({divisa:"", id:0, monto:0, enOrden:false, fueEjercido:false}); + let TieneOpcionVenta: boolean = $state(false); + let dtoVenta: OpcionVentaDto = $state({ + divisa: "", + id: 0, + monto: 0, + enOrden: false, + fueEjercido: false, + }); - let modaldata:string = $state(""); - let contratoid:string = $state(""); + let modaldata: string = $state(""); + let contratoid: string = $state(""); - onMount(()=>{ + onMount(() => { getparams(); obtenerDatosACargar(); opcionVenta(); @@ -44,16 +58,21 @@ async function opcionVenta() { try { - const r = await fetch($urlG+"/api/contrato/tieneopcionventa?idcontrato="+contratoid, { - method: "GET", - headers: { - "Auth": String(token), - } - }); - if (r.ok){ + const r = await fetch( + $urlG + + "/api/contrato/tieneopcionventa?idcontrato=" + + contratoid, + { + method: "GET", + headers: { + Auth: String(token), + }, + }, + ); + if (r.ok) { let data = await r.json(); TieneOpcionVenta = data.message; - if (TieneOpcionVenta){ + if (TieneOpcionVenta) { ObtenerOpcionVentaDto(); } return; @@ -61,58 +80,79 @@ let data = await r.json(); modaldata = data.message; return; - }catch { + } catch { modaldata = "Fallo hacer la request"; } } async function ObtenerOpcionVentaDto() { - try{ - const r = await fetch($urlG+"/api/opcionventa?idcontrato="+contratoid, { - method: "GET", - headers: { - "Auth": String(token), - } - }); + try { + const r = await fetch( + $urlG + "/api/opcionventa?idcontrato=" + contratoid, + { + method: "GET", + headers: { + Auth: String(token), + }, + }, + ); if (r.ok) { let data = await r.json(); dtoVenta = data; - return + return; } let data = await r.json(); modaldata = data.message; - }catch{ + } catch { modaldata = "Fallo hacer la request"; } } async function obtenerDatosACargar() { try { - const respPropiedad = fetch($urlG+"/api/contrato/inquilino?id="+contratoid, { - method: "GET", - headers: { - "Auth": String(token), - } - }); - const respgarantes = fetch($urlG+"/api/contratos/garantes?idcontrato="+contratoid, { - method: "GET", - headers: { - "Auth": String(token), - } - }); - const respCanons = fetch($urlG+"/api/contratos/canon?id="+contratoid, { - method: "GET", - headers: { - "Auth": String(token), - } - }); - const respoDefect = fetch($urlG+"/api/defectos?Idcontrato="+contratoid, { - method: "GET", - headers: { - "Auth": token, - } - }); - const [p, g, c, d] = await Promise.all([respPropiedad, respgarantes, respCanons, respoDefect]); + const respPropiedad = fetch( + $urlG + "/api/contrato/inquilino?id=" + contratoid, + { + method: "GET", + headers: { + Auth: String(token), + }, + }, + ); + const respgarantes = fetch( + $urlG + "/api/contratos/garantes?idcontrato=" + contratoid, + { + method: "GET", + headers: { + Auth: String(token), + "Content-Type": "application/json", + }, + }, + ); + const respCanons = fetch( + $urlG + "/api/contratos/canon?id=" + contratoid, + { + method: "GET", + headers: { + Auth: String(token), + }, + }, + ); + const respoDefect = fetch( + $urlG + "/api/defectos?Idcontrato=" + contratoid, + { + method: "GET", + headers: { + Auth: token, + }, + }, + ); + const [p, g, c, d] = await Promise.all([ + respPropiedad, + respgarantes, + respCanons, + respoDefect, + ]); const datosPropiedad = await p.json(); const datosGarantes = await g.json(); @@ -123,27 +163,29 @@ garantes = datosGarantes; canons = datosCanons; defectos = datosDefect; - } catch { modaldata = "Fallo hacer las request"; } } - function getparams(){ + function getparams() { const qs = window.location.search; const par = new URLSearchParams(qs); - contratoid = par.get("id")||""; - } - + contratoid = par.get("id") || ""; + } + async function refreshCanon() { try { - const ret = await fetch($urlG+"/api/contratos/canon?id="+contratoid, { - method: "GET", - headers: { - "Auth": String(token), - } - }); - if (!ret.ok){ + const ret = await fetch( + $urlG + "/api/contratos/canon?id=" + contratoid, + { + method: "GET", + headers: { + Auth: String(token), + }, + }, + ); + if (!ret.ok) { let data = await ret.json(); modaldata = data.message; return; @@ -155,94 +197,102 @@ modaldata = "No se pudo obtener la lista de canones actualizada"; } } - + async function verContrato() { if (prop.id <= 0) { modaldata = "no hay contratos con id 0 o menor"; return; } try { - const resp = await fetch ($urlG+"/api/contrato/DocumentoFinal?idcontrato="+prop.id, { - method: "GET", - headers: { - "Auth": String(token), - } - }); + const resp = await fetch( + $urlG + "/api/contrato/DocumentoFinal?idcontrato=" + prop.id, + { + method: "GET", + headers: { + Auth: String(token), + }, + }, + ); if (!resp.ok) { let blob = await resp.json(); - modaldata=blob.message; + modaldata = blob.message; return; } let blob = await resp.blob(); - const blobUrl = URL.createObjectURL(blob); - window.open(blobUrl, '_blank'); - setTimeout(() => URL.revokeObjectURL(blobUrl), 100000); + const blobUrl = URL.createObjectURL(blob); + window.open(blobUrl, "_blank"); + setTimeout(() => URL.revokeObjectURL(blobUrl), 100000); } catch { - modaldata= "fallo intentar hacer la request"; + modaldata = "fallo intentar hacer la request"; } } async function realizarpago(mes: Date) { try { - const ret = await fetch($urlG+"/api/contratos/realizarPago", { + const ret = await fetch($urlG + "/api/contratos/realizarPago", { method: "POST", headers: { - "Auth": String(token), + Auth: String(token), "Content-Type": "application/json", }, - body: JSON.stringify({idcontrato:contratoid, fecha:mes}), + body: JSON.stringify({ idcontrato: contratoid, fecha: mes }), }); let data = await ret.json(); modaldata = data.message; - if (ret.ok){ - refreshCanon() + if (ret.ok) { + refreshCanon(); return; } } catch { modaldata = "Fallo al intentar hacer la request"; - } - } - - - function generarTiket(mod:any) { - selMod = mod; - showmodal =true; - } - - async function pedirdocumento(op:boolean) { - try { - const ret = await fetch($urlG+"/api/contrato/GenerarRecibo?html="+op, { - method: "POST", - headers: { - "Auth": String(token), - "Content-Type": "application/json", - }, - - body: JSON.stringify({fecha: selMod.mes, idcontrato: contratoid}) - }); - if (!ret.ok) { - let blob = await ret.json(); - modaldata=blob.message; - return; - } - let blob = await ret.blob(); - const blobUrl = URL.createObjectURL(blob); - window.open(blobUrl, '_blank'); - setTimeout(() => URL.revokeObjectURL(blobUrl), 100000); - } catch { - modaldata = "Fallo al intentar hacer la request"; } - } + } + + function generarTiket(mod: any) { + selMod = mod; + showmodal = true; + } + + async function pedirdocumento(op: boolean) { + try { + const ret = await fetch( + $urlG + "/api/contrato/GenerarRecibo?html=" + op, + { + method: "POST", + headers: { + Auth: String(token), + "Content-Type": "application/json", + }, + + body: JSON.stringify({ + fecha: selMod.mes, + idcontrato: contratoid, + }), + }, + ); + if (!ret.ok) { + let blob = await ret.json(); + modaldata = blob.message; + return; + } + let blob = await ret.blob(); + const blobUrl = URL.createObjectURL(blob); + window.open(blobUrl, "_blank"); + setTimeout(() => URL.revokeObjectURL(blobUrl), 100000); + } catch { + modaldata = "Fallo al intentar hacer la request"; + } + } async function cargarDefecto(data: AltaDefectoDto) { - if(data.idcontrato ==0) data.idcontrato = prop.id; + if (data.idcontrato == 0) data.idcontrato = prop.id; try { - const r = await fetch($urlG+"/api/defecto", { + const r = await fetch($urlG + "/api/defecto", { method: "POST", headers: { - "Auth": String(token), + Auth: String(token), "Content-Type": "application/json", }, body: JSON.stringify(data), @@ -252,38 +302,45 @@ if (r.ok) { refreshDefectos(); } - }catch{ + } catch { modaldata = "Fallo al intentar hacer la request"; } } async function refreshDefectos() { try { - const r = await fetch($urlG+"/api/defectos?Idcontrato="+contratoid, { - method: "GET", - headers: { - "Auth": token, - } - }); - let rr =await r.json(); + const r = await fetch( + $urlG + "/api/defectos?Idcontrato=" + contratoid, + { + method: "GET", + headers: { + Auth: token, + }, + }, + ); + let rr = await r.json(); defectos = rr; } catch { - modaldata ="No se pudo pedir la lista de Defectos"; + modaldata = "No se pudo pedir la lista de Defectos"; } - } async function ejercerOpcionVenta() { try { - const r = await fetch($urlG+"/api/ventas/ejercerOpcionVenta?idcontrato="+contratoid, { - method: "POST", - headers: { - "Auth": token, - } - }); + const r = await fetch( + $urlG + + "/api/ventas/ejercerOpcionVenta?idcontrato=" + + contratoid, + { + method: "POST", + headers: { + Auth: token, + }, + }, + ); let data = await r.json(); - modaldata =data.message; - if(r.ok){ + modaldata = data.message; + if (r.ok) { opcionVenta(); return; } @@ -293,14 +350,17 @@ } - + {#if modaldata} - !!(modaldata = "")}/> + !!(modaldata = "")} /> {/if} {#if showmodal} - showmodal=false} onSubmit={pedirdocumento} /> + (showmodal = false)} + onSubmit={pedirdocumento} + /> {/if}
@@ -315,7 +375,10 @@

Habitaciones: {prop.habitaciones}

Piso: {prop.piso}

Letra: {prop.letra}

-

Fecha Inicio: {String(prop.fechainicio).split("T")[0]}

+

+ Fecha Inicio: + {String(prop.fechainicio).split("T")[0]} +

Estado: {prop.estado}

- +
+
+
+ {canon.mesNum}/{prop.mesesDuracion} +
+
+

+ Mes: + {String(canon.mes).split( + "T", + )[0]} +

+

+ Monto: + {canon.monto} +

+

+ Divisa: + {canon.divisa} +

+

+ Pago: + {canon.pago ? "Sí" : "No"} +

+
+
-
{/each} @@ -442,102 +531,122 @@ class="accordion-collapse collapse" aria-labelledby="ht" data-bs-parent="#accordionExample" - > - + >
{#if prop.estado != "Terminado"} -
-
- Notificar Defecto en Propiedad +
+
+ Notificar Defecto en Propiedad +
+
+ +
+
-
- -
- -
-
+
{/if} - - - - - - - + + + + + + + - {#if defectos.length == 0} - - - - {:else} - {#each defectos as defecto} - - - - - - - - {/each} - {/if} + {#if defectos.length == 0} + + + + {:else} + {#each defectos as defecto} + + + + + + + + {/each} + {/if} -
DescripciónCostoEstadoPaga InquilinoDivisa
DescripciónCostoEstadoPaga InquilinoDivisa
No hay defectos que mostrar
{defecto.descripcion}{defecto.costo}{defecto.estado}{defecto.pagainquilino}{defecto.divisa}
No hay defectos que mostrar
{defecto.descripcion}{defecto.costo}{defecto.estado}{defecto.pagainquilino}{defecto.divisa}
+
{#if TieneOpcionVenta} - -
-

- +

+
- Opcion Venta - - -
-
-
-
- Datos Opcion Venta -
-
- Monto: {dtoVenta.divisa} {dtoVenta.monto}. +
+
+
+ Datos Opcion Venta +
+
+ Monto: {dtoVenta.divisa} + {dtoVenta.monto}. -

- Para poder ejercer la opcion de venta necesitas estar en el mismo mes que el ultimo pago y haber pagado todos los canones -

-
- - {#if dtoVenta.fueEjercido} - - {/if} + {#if dtoVenta.fueEjercido} + + {/if} +
+
+
-
-
{/if}