From 69b83c83806da901d2f77e037e8ca776aa157434 Mon Sep 17 00:00:00 2001 From: fede Date: Mon, 13 Jan 2025 01:08:02 -0300 Subject: [PATCH] falta testear --- Aspnet/Controllers/ContratoController.cs | 83 ++++++++++++++++--- Aspnet/Program.cs | 6 ++ Aspnet/settings.json | 4 + Entidades/Dto/AceptarContratoDto.cs | 5 ++ Entidades/Dto/RechazarContratoDto.cs | 5 ++ .../ModalVeryAceptarContrato.svelte | 10 ++- Front/src/paginas/Notificaciones.svelte | 73 +++++++++++++++- Modelo/RepositorioContratos.cs | 39 ++++++++- 8 files changed, 208 insertions(+), 17 deletions(-) create mode 100644 Aspnet/settings.json create mode 100644 Entidades/Dto/AceptarContratoDto.cs create mode 100644 Entidades/Dto/RechazarContratoDto.cs diff --git a/Aspnet/Controllers/ContratoController.cs b/Aspnet/Controllers/ContratoController.cs index f871284..7b21e4c 100644 --- a/Aspnet/Controllers/ContratoController.cs +++ b/Aspnet/Controllers/ContratoController.cs @@ -275,7 +275,7 @@ public class ContratoController: ControllerBase { } [HttpGet("api/contrato/getdocumento")] - public async Task ObtenerContrato([FromHeader(Name = "Auth")]string Auth, [FromQuery]long idcontrato) { + 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(); @@ -291,23 +291,23 @@ public class ContratoController: ControllerBase { string nuevoNombreArchivo = $"id:{contr.Id}-inq:{contr.Dniinquilino}-propi:{contr.Dnipropietario}-idprop:{contr.Idpropiedad}.pdf"; try{ - using( var memstream = new MemoryStream()){ + var memstream = new MemoryStream(); var goa = new GetObjectArgs() .WithBucket("alquilafacil") .WithObject(nuevoNombreArchivo) - .WithCallbackStream(async stream => { + .WithCallbackStream(stream => { memstream.Position=0; - await stream.CopyToAsync(memstream); + stream.CopyTo(memstream); }); - await mc.GetObjectAsync(goa); + mc.GetObjectAsync(goa).Wait(); memstream.Position = 0; if (memstream.Length == 0) return BadRequest(new { message = "El archivo está vacío" }); - - return File(memstream.ToArray(), "application/pdf", nuevoNombreArchivo); - } + + return File(memstream, "application/pdf", nuevoNombreArchivo); + } catch (Exception e){ Console.Error.WriteLine(e); return BadRequest(new { message = "Fallo al intentar obtener el archivo del almacenamiento o este no existe"}); @@ -316,12 +316,75 @@ public class ContratoController: ControllerBase { } [HttpPost("api/contratos/aceptarContrato")] - public IActionResult AceptarContrato([FromHeader(Name = "Auth")]string Auth){ + public IActionResult AceptarContrato([FromHeader(Name = "Auth")]string Auth, [FromBody] AceptarContratoDto dto){ + if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + if (validacion1 == false) return Unauthorized(); + + if (dto.Idcontrato <= 0) return BadRequest(new {message = "La id no puede ser igual o menor a 0"}); + + Contrato? contr = RepositorioContratos.Singleton.ObtenerPreContratoPorId(dto.Idcontrato); + if (contr == null || contr.Dniinquilino == 0) return BadRequest(new { message = "No hay un precontrato 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) return BadRequest(new { message = "El token no corresponde con el del inquilino"}); + + bool ret = RepositorioContratos.Singleton.AceptarContrato(dto.Idcontrato); + if (ret == false) return BadRequest(new { message ="fallo al aceptar el contrato"}); + + RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, dto.Fecha); + + var noti = new NotificacioneBuilder() + .SetDniremitente(cli.Dni) + .SetIdpropiedad(contr.Idpropiedad??0) + .SetDnicliente(contr.Dnipropietario??0) + .SetAccion("Aceptado Contrato") + .SetMensaje($"Se inicio el alquiler") + .SetFecha(DateTime.Now) + .SetLeido(false) + .Build(); + + ret = RepositorioNotificaciones.Singleton.AltaNotificacion(noti); + return ret ? + Ok(new { message = "Se acepto el contrato y se crearon los Canons a ser pagados"}) : + BadRequest(new { message = "No se pudo aceptar el contrato"}); + + } + + [HttpPut("api/contratos/rechazarPreContrato")] + public IActionResult CancelarContrato([FromHeader(Name = "Auth")]string Auth, [FromBody] RechazarPreContrato dto ) { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(); var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); if (validacion1 == false) return Unauthorized(); - return Ok(); + if (dto.Idcontrato <= 0) return BadRequest(new {message = "La id no puede ser igual o menor a 0"}); + + Contrato? contr = RepositorioContratos.Singleton.ObtenerPreContratoPorId(dto.Idcontrato); + if (contr == null || contr.Dniinquilino == 0) return BadRequest(new { message = "No hay un precontrato 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) return BadRequest(new { message = "El token no corresponde con el del inquilino"}); + + var ret = RepositorioContratos.Singleton.CancelarPrecontrato(dto.Idcontrato); + if (ret == false) return BadRequest(new {message = "Fallo al intentar cancelar el precontrato"}); + + RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, dto.Fecha); + var noti = new NotificacioneBuilder() + .SetDniremitente(cli.Dni) + .SetIdpropiedad(contr.Idpropiedad??0) + .SetDnicliente(contr.Dnipropietario??0) + .SetAccion("Rechazo Contrato") + .SetMensaje($"Se cancelo el proceso para alquilar de: {cli.Nombre}") + .SetFecha(DateTime.Now) + .SetLeido(false) + .Build(); + ret = RepositorioNotificaciones.Singleton.AltaNotificacion(noti); + + return ret? + Ok(new { message = "Se cancelo el proceso para iniciar el alquiler"}): + BadRequest(new { message = "No se pudo cancelar"}); } private async Task subirContrato(IFormFile f, string flname) { diff --git a/Aspnet/Program.cs b/Aspnet/Program.cs index c132418..4ad5df2 100644 --- a/Aspnet/Program.cs +++ b/Aspnet/Program.cs @@ -2,6 +2,7 @@ using System.Text.Json; using Minio; using AlquilaFacil.Config; +using Microsoft.AspNetCore.Http.Features; var builder = WebApplication.CreateBuilder(args); @@ -19,6 +20,11 @@ builder.Services.AddMinio(options => options .WithSSL(false) .Build()); +builder.Services.Configure(options => +{ + options.MultipartBodyLengthLimit = 50 * 1024 * 1024; // 50 MB +}); + builder.Services.AddCors(options => { options.AddPolicy("AllowSvelteApp", diff --git a/Aspnet/settings.json b/Aspnet/settings.json new file mode 100644 index 0000000..a595e0c --- /dev/null +++ b/Aspnet/settings.json @@ -0,0 +1,4 @@ +{ + "usr":"aVO9C3PqeK1hiPCyqZCj", + "scrt":"szj58kceWG3GcRZ8P1QCQiv5tSjMI7iD5zfjneTT" +} \ No newline at end of file diff --git a/Entidades/Dto/AceptarContratoDto.cs b/Entidades/Dto/AceptarContratoDto.cs new file mode 100644 index 0000000..35ba502 --- /dev/null +++ b/Entidades/Dto/AceptarContratoDto.cs @@ -0,0 +1,5 @@ +namespace Entidades.Dto; +public class AceptarContratoDto { + public long Idcontrato { get; set; } + public DateTime Fecha { get; set; } +} \ No newline at end of file diff --git a/Entidades/Dto/RechazarContratoDto.cs b/Entidades/Dto/RechazarContratoDto.cs new file mode 100644 index 0000000..6e735fb --- /dev/null +++ b/Entidades/Dto/RechazarContratoDto.cs @@ -0,0 +1,5 @@ +namespace Entidades.Dto; +public class RechazarPreContrato { + public long Idcontrato { get; set; } + public DateTime Fecha { get; set; } +} \ No newline at end of file diff --git a/Front/src/Componentes/ModalVeryAceptarContrato.svelte b/Front/src/Componentes/ModalVeryAceptarContrato.svelte index adc677c..5c5c493 100644 --- a/Front/src/Componentes/ModalVeryAceptarContrato.svelte +++ b/Front/src/Componentes/ModalVeryAceptarContrato.svelte @@ -4,8 +4,8 @@ let {getContrato, onConfirm, onCancel, onClose, men } : { getContrato:(idcontrato:number)=>void, - onConfirm:()=>void, - onCancel:()=>void, + onConfirm:(idcontrato:number)=>void, + onCancel:(idcontrato:number)=>void, onClose:()=>void, men: MensajeDto } = $props(); @@ -21,13 +21,15 @@ function confirmar() { if (leiContrato) { - onConfirm(); + let idcontrato = Number(men.mensaje.split(" ").reverse()[0]); + onConfirm(idcontrato); } } function rechazar() { if (leiContrato) { - onCancel(); + let idcontrato = Number(men.mensaje.split(" ").reverse()[0]); + onCancel(idcontrato); } } diff --git a/Front/src/paginas/Notificaciones.svelte b/Front/src/paginas/Notificaciones.svelte index 2ea4b27..a3f3eed 100644 --- a/Front/src/paginas/Notificaciones.svelte +++ b/Front/src/paginas/Notificaciones.svelte @@ -12,6 +12,7 @@ import { self } from "svelte/legacy"; import ModalVeryAceptarContrato from "../Componentes/ModalVeryAceptarContrato.svelte"; import { getRequest } from "@sveltejs/kit/node"; + import { json } from "@sveltejs/kit"; const token = sessionStorage.getItem("token"); let mensajes: MensajeDto[] = $state([]); @@ -320,7 +321,7 @@ return; } - let blob = await Blob(responce.body()); + let blob = await responce.blob(); const blobUrl = URL.createObjectURL(blob); window.open(blobUrl, '_blank'); setTimeout(() => URL.revokeObjectURL(blobUrl), 100000); @@ -328,7 +329,75 @@ modaldata = "Fallo al intentar conectarse al servidor"; } } + + async function handlerechazarcontrato(idcontrato:number) { + if (idcontrato<=0){ + modaldata="La idcontrato da 0 o menos comunicate con el administrador"; + return; + } + try { + let rq = { + idcontrato:idcontrato, + fecha:Selmens.fecha, + } + const responce = await fetch($urlG+"/api/contratos/aceptarContrato", { + method: "POST", + headers: { + "Auth": String(token), + }, + body: JSON.stringify(rq), + }); + if (responce.ok){ + let data = await responce.json(); + modaldata = data.message; + if (mostrarleidos) { + Leidos(); + } else { + SinLeer(); + } + return; + } + let data = await responce.json(); + modaldata = data.message; + return; + } catch { + modaldata = "Fallo la request"; + return; + } + } + + async function handleAceptarContrato(idcontrato:number) { + if (idcontrato<=0){ + modaldata="La idcontrato da 0 o menos comunicate con el administrador"; + return; + } + try { + const responce = await fetch($urlG+"/api/contratos/rechazarPreContrato?idcontrato="+idcontrato, { + method: "PUT", + headers: { + "Auth": String(token), + } + }); + if (responce.ok){ + let data = await responce.json(); + modaldata = data.message; + if (mostrarleidos) { + Leidos(); + } else { + SinLeer(); + } + return; + } + + let data = await responce.json(); + modaldata = data.message; + return; + } catch { + modaldata = "Fallo la request"; + return; + } + } @@ -344,7 +413,7 @@ {:else if Selmens.accion == "Check y Contrato"} (Selmens.accion = "")} onConfirm={handleEnviarmensaje4}/> {:else if Selmens.accion == "Aceptar Contrato"} - (Selmens.accion = "")} onConfirm={()=> ""} onCancel={()=>""} getContrato={ObtenerContrato} men={Selmens}/> + (Selmens.accion = "")} onConfirm={handleAceptarContrato} onCancel={handleCancelPrecontrato} getContrato={ObtenerContrato} men={Selmens}/> {/if}
diff --git a/Modelo/RepositorioContratos.cs b/Modelo/RepositorioContratos.cs index 328c0ea..6ce0719 100644 --- a/Modelo/RepositorioContratos.cs +++ b/Modelo/RepositorioContratos.cs @@ -81,8 +81,9 @@ public class RepositorioContratos: RepositorioBase { x.Habilitado == 0 && x.Cancelado == 0); - if (contr == null) return false; + if (contr == null || contr.IdpropiedadNavigation == null) return false; contr.Cancelado = 1; + contr.IdpropiedadNavigation.Idestado = 1; return Guardar(con); } @@ -105,4 +106,40 @@ public class RepositorioContratos: RepositorioBase { contrato.UrlContrato = nuevoNombreArchivo; return Guardar(con); } + + public bool AceptarContrato(long idcontrato) { + var con = Context; + Contrato? cont = con.Contratos + .Include(x=>x.Idcanons) + .Include(x=>x.Idpropiedad) + .FirstOrDefault(x=>x.Id ==idcontrato && + x.Habilitado ==0 && + x.Cancelado == 0); + + if (cont == null || cont.IdpropiedadNavigation==null) return false; + + cont.Habilitado = 1; + var fecha = cont.Fechainicio; + + for (int i = 0; i < cont.MesesHastaAumento; i++) { + Canon can = new Canon{ + Fecha = fecha.AddMonths(i), + Monto = cont.IdpropiedadNavigation.Monto, + Pagado = 0 + }; + can.Id = (con.Canons.Any()? con.Canons.Max(x=>x.Id) :0)+1; + + cont.Idcanons.Add(can); + } + return Guardar(con); + } + + public bool CancelarPrecontrato(long idcontrato) { + var con = Context; + Contrato? cont = con.Contratos.Include(x=>x.Idpropiedad).FirstOrDefault(x=>x.Id ==idcontrato && x.Habilitado ==0); + if (cont == null|| cont.IdpropiedadNavigation==null) return false; + cont.Cancelado = 1; + cont.IdpropiedadNavigation.Idestado = 1; + return Guardar(con); + } }