From 9a088a37b2255897ccf9efc36e4455aa4addfdb8 Mon Sep 17 00:00:00 2001 From: fede Date: Fri, 17 Jan 2025 16:05:31 -0300 Subject: [PATCH] Avances hasta las 16 --- Aspnet/Controllers/ContratoController.cs | 121 ++++++++- Entidades/Dto/MarcarPagoDto.cs | 6 + Front/.prettierrc | 4 + Front/src/paginas/ContratoInquilino.svelte | 233 +++++++++++++++++- Front/src/paginas/ContratosPropietario.svelte | 48 +++- Modelo/RepositorioCanons.cs | 31 +++ Modelo/RepositorioContratos.cs | 2 +- 7 files changed, 428 insertions(+), 17 deletions(-) create mode 100644 Entidades/Dto/MarcarPagoDto.cs create mode 100644 Front/.prettierrc diff --git a/Aspnet/Controllers/ContratoController.cs b/Aspnet/Controllers/ContratoController.cs index bc42c4b..c5828f3 100644 --- a/Aspnet/Controllers/ContratoController.cs +++ b/Aspnet/Controllers/ContratoController.cs @@ -16,6 +16,71 @@ namespace AlquilaFacil.Controllers; [ApiController] public class ContratoController: ControllerBase { + [HttpPost("api/contratos/marcarPago")] + public IActionResult marcarPago([FromHeader(Name="Auth")]string Auth, MarcarPagoDto dto) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false)return Unauthorized(); + if (dto.Idcontrato<=0) return BadRequest(new { message = "No puede existir un contrato con id 0 o menor"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null)return Unauthorized(); + + Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(dto.Idcontrato); + if (cont == null) return BadRequest(new { message = "No hay un contrato por esa id"}); + + if (cli.Dni != cont.Dnipropietario) return BadRequest(new {message = "No sos propietario o intenta volviendote a logear"}); + + Canon? c = RepositorioCanons.Singleton.ObtenerCanonContrato(dto.fecha, dto.Idcontrato); + if (c == null) return BadRequest(new { message = "no hay un canon por esa id"}); + + Recibo re = new Recibo{ + Monto = c.Monto, + Fecha = c.Fecha, + }; + + bool ret = RepositorioCanons.Singleton.SetRecibo(c, re); + return ret ? + Ok(new { message = "Se guardo correctamente"}):BadRequest(new { message = "No se pudo guardar"}); + + } + + [HttpPost("api/contratos/realizarPago")] + public IActionResult realizarPago([FromHeader(Name="Auth")]string Auth, MarcarPagoDto dto) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + if (validacion1 == false) return Unauthorized(); + if (dto.Idcontrato<=0) return BadRequest(new { message = "No puede existir un contrato con id 0 o menor"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null)return Unauthorized(); + + Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(dto.Idcontrato); + if (cont == null) return BadRequest(new { message = "No hay un contrato por esa id"}); + + if (cli.Dni != cont.Dniinquilino) return BadRequest(new {message = "No sos inquilino o intenta volviendote a logear"}); + + Canon? c = RepositorioCanons.Singleton.ObtenerCanonContrato(dto.fecha, dto.Idcontrato); + if (c == null) return BadRequest(new { message = "no hay un canon por esa id"}); + + Recibo re = new Recibo{ + Monto = c.Monto, + Fecha = c.Fecha, + }; + + bool ret = RepositorioCanons.Singleton.SetRecibo(c, re); + return ret ? + Ok(new { message = "Se guardo correctamente"}):BadRequest(new { message = "No se pudo guardar"}); + } + + [HttpPost("api/contratos/crearcanons")] //WIP + public IActionResult crearCanons([FromHeader(Name="Auth")]string Auth){ + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false)return Unauthorized(); + + } + [HttpGet("api/contratos/canon")] public ActionResult getCanons([FromHeader(Name="Auth")]string Auth, int id = 0) { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); @@ -26,12 +91,16 @@ public class ContratoController: ControllerBase { return Unauthorized(); } } + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if(cli == null) return Unauthorized(); + + var cont = RepositorioContratos.Singleton.ObtenerContratoPorId(id); + if (cont == null) return BadRequest(new { message = "No existe el contrato"}); + if ( cont.Dnipropietario != cli.Dni && cont.Dniinquilino != cli.Dni) return Unauthorized(); var list = RepositorioCanons.Singleton.ObtenerCanonsPorContrato(id); if (list == null) return BadRequest(new { message = "No hay contrato por esa id"}); - var cont = RepositorioContratos.Singleton.ObtenerContratoPorId(id); - if (cont == null) return BadRequest(new { message = ""}); string divisa =""; if (cont.Iddivisa == 0) divisa = "AR$"; else if (cont.Iddivisa == 1) divisa = "US$"; @@ -125,7 +194,7 @@ public class ContratoController: ControllerBase { if (cli==null) return Unauthorized(); var list = RepositorioContratos.Singleton.ObtenerContratosDeInquilino(cli.Dni); - + List dtos = new(); foreach (var i in list) { if (i.DniinquilinoNavigation == null || i.IdpropiedadNavigation == null @@ -431,12 +500,56 @@ public class ContratoController: ControllerBase { Ok(new { message = "se notifico al futuro inquilino"}): BadRequest(new { message = "No se pudo enviar la notificacion"}); } + [HttpGet("api/contrato/DocumentoFinal")] + public IActionResult ObtenerContratoFinal ([FromHeader(Name = "Auth")]string Auth, [FromQuery]long idcontrato) { + if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + if (validacion1 == false){ + validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false) return Unauthorized(); + } + + if (idcontrato <= 0) return BadRequest(new {message = "La id no puede ser igual o menor a 0"}); + + Contrato? contr = RepositorioContratos.Singleton.ObtenerContratoPorId(idcontrato); + if (contr == null || contr.Dniinquilino == 0) return BadRequest(new { message = "No hay un contrato por esa id"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay un cliente por ese token"}); + if (cli.Dni != contr.Dniinquilino && cli.Dni != contr.Dnipropietario) return BadRequest(new { message = "El token no corresponde con el del inquilino"}); + + try{ + var memstream = new MemoryStream(); + + var goa = new GetObjectArgs() + .WithBucket("alquilafacil") + .WithObject(contr.UrlContrato) + .WithCallbackStream(stream => { + memstream.Position=0; + stream.CopyTo(memstream); + }); + + mc.GetObjectAsync(goa).Wait(); + memstream.Position = 0; + + if (memstream.Length == 0) return BadRequest(new { message = "El archivo está vacío" }); + + return File(memstream, "application/pdf", contr.UrlContrato); + + } catch (Exception e){ + Console.Error.WriteLine(e); + return BadRequest(new { message = "Fallo al intentar obtener el archivo del almacenamiento o este no existe"}); + } + } [HttpGet("api/contrato/getdocumento")] public IActionResult ObtenerContrato([FromHeader(Name = "Auth")]string Auth, [FromQuery]long idcontrato) { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); - if (validacion1 == false) return Unauthorized(); + if (validacion1 == false){ + validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false) return Unauthorized(); + } if (idcontrato <= 0) return BadRequest(new {message = "La id no puede ser igual o menor a 0"}); diff --git a/Entidades/Dto/MarcarPagoDto.cs b/Entidades/Dto/MarcarPagoDto.cs new file mode 100644 index 0000000..789fd6e --- /dev/null +++ b/Entidades/Dto/MarcarPagoDto.cs @@ -0,0 +1,6 @@ +namespace Entidades.Dto; +public class MarcarPagoDto { + public long Idcontrato { get; set; } + public DateTime fecha { get; set; } + +} \ No newline at end of file diff --git a/Front/.prettierrc b/Front/.prettierrc new file mode 100644 index 0000000..5a938ce --- /dev/null +++ b/Front/.prettierrc @@ -0,0 +1,4 @@ +{ + "tabWidth": 4, + "useTabs": false +} diff --git a/Front/src/paginas/ContratoInquilino.svelte b/Front/src/paginas/ContratoInquilino.svelte index e260581..9c6cac3 100644 --- a/Front/src/paginas/ContratoInquilino.svelte +++ b/Front/src/paginas/ContratoInquilino.svelte @@ -1,7 +1,238 @@ - \ No newline at end of file + + +{#if modaldata} + !!(modaldata = "")}/> +{/if} +
+
+
+
Propiedad
+
+

Tipo: {prop.tipoPropiedad}

+

Ubicación: {prop.ubicacion}

+

Propietario: {prop.propietario}

+

Inquilino: {prop.inquilino}

+

Habitaciones: {prop.habitaciones}

+

Piso: {prop.piso}

+

Letra: {prop.letra}

+

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

+

Estado: {prop.estado}

+ +
+ +
+
+ +
+
+
+

+ +

+
+
+ + + + + + + + + + + + + {#each garantes as g} + + + + + + + + + {/each} + +
DniNombreApellidoDomicilioDom. LaboralCelular
{g.dni}{g.nombre}{g.apellido}{g.domicilio}{g.domiciliolaboral}{g.celular}
+
+
+
+
+

+ +

+
+
+
+ {#each canons as canon} +
+
+
+ {canon.mesNum}/{prop.mesesDuracion} +
+
+

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

+

Monto: {canon.monto}

+

Divisa: {canon.divisa}

+

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

+
+ +
+
+ {/each} +
+
+
+
+
+
+
diff --git a/Front/src/paginas/ContratosPropietario.svelte b/Front/src/paginas/ContratosPropietario.svelte index e0ef15f..0ecff7d 100644 --- a/Front/src/paginas/ContratosPropietario.svelte +++ b/Front/src/paginas/ContratosPropietario.svelte @@ -4,6 +4,7 @@ import ModalEstatico from "../Componentes/ModalEstatico.svelte"; import {urlG} from "../stores/urlStore"; import type { CanonDto, ContratoDto, ContratoPropiedadDto, GaranteDto2 } from "../types"; + import ModalConfirm from "../Componentes/ModalConfirm.svelte"; let token:string = sessionStorage.getItem("token")||""; @@ -74,10 +75,37 @@ contratoid = par.get("id")||""; } - - function submitnuevosCanones() { + function submitnuevosCanones() { - } + } + + 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), + } + }); + + if (!resp.ok) { + let blob = await resp.json(); + modaldata=blob.message; + return; + } + + let blob = await resp.blob(); + const blobUrl = URL.createObjectURL(blob); + window.open(blobUrl, '_blank'); + setTimeout(() => URL.revokeObjectURL(blobUrl), 100000); + } catch { + modaldata= "fallo intentar hacer la request"; + } + } @@ -85,8 +113,9 @@ {#if modaldata} !!(modaldata = "")}/> {/if} + +
-
Propiedad
@@ -100,16 +129,17 @@

Letra: {prop.letra}

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

Estado: {prop.estado}

+
-
-

@@ -234,9 +264,5 @@

- - - - diff --git a/Modelo/RepositorioCanons.cs b/Modelo/RepositorioCanons.cs index e4083f5..e6794de 100644 --- a/Modelo/RepositorioCanons.cs +++ b/Modelo/RepositorioCanons.cs @@ -10,5 +10,36 @@ public class RepositorioCanons: RepositorioBase { if (l == null) return null; return l.Idcanons; } + public Canon? ObtenerCanonContrato(DateTime f, long idcont) { + var con = Context; + Canon? cc = null; + var c = con.Canons.FirstOrDefault(x => x.Idrecibo == null && + x.Fecha == f ); + if (c == null) return null; + //no deberia de tener que usar un foreach pero entity por algun motivo mapeo + //la entidad como muchos a muchos. no hay forma de que un canon tenga multiples + //contratos por como lo codifique pero igualmente + foreach (var i in c.Idcontratos) { + foreach (var j in i.Idcanons) { + if (j.Fecha == f) { + cc = j; + } + } + } + return cc; + } + + public bool SetRecibo(Canon c, Recibo re) { + var con = Context; + var cc = con.Canons.FirstOrDefault(x=>x.Id == c.Id); + if (cc == null) return false; + + re.Id = (con.Recibos.Any()?con.Recibos.Max(x=>x.Id):0)+1; + con.Recibos.Add(re); + cc.Idrecibo = re.Id; + cc.Pagado = 1; + + return Guardar(con); + } } \ No newline at end of file diff --git a/Modelo/RepositorioContratos.cs b/Modelo/RepositorioContratos.cs index e06f355..3ae44dd 100644 --- a/Modelo/RepositorioContratos.cs +++ b/Modelo/RepositorioContratos.cs @@ -185,7 +185,7 @@ public class RepositorioContratos: RepositorioBase { return l; } - public Contrato? ObtenerContratoPorId(int idcontrato) { + public Contrato? ObtenerContratoPorId(long idcontrato) { var con = Context; var l = con.Contratos .Include(x=>x.Idgarantes)