From 68745cab5ec71a9fa77b51f4130bfadc894bed11 Mon Sep 17 00:00:00 2001 From: fede Date: Thu, 30 Jan 2025 23:27:47 -0300 Subject: [PATCH] =?UTF-8?q?Est=C3=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Aspnet/Controllers/AdminController.cs | 206 +++++++++++++++ Aspnet/Controllers/ContratoController.cs | 4 +- Entidades/Admin/NotificarAdmin.cs | 6 + Front/src/App.svelte | 13 +- Front/src/paginas/ContratoAdmin.svelte | 316 +++++++++++++++++++++++ Front/src/paginas/ControlPagos.svelte | 93 +++++++ Modelo/RepositorioCanons.cs | 10 +- Modelo/RepositorioContratos.cs | 13 + Modelo/RepositorioNotificaciones.cs | 5 +- 9 files changed, 660 insertions(+), 6 deletions(-) create mode 100644 Entidades/Admin/NotificarAdmin.cs create mode 100644 Front/src/paginas/ContratoAdmin.svelte create mode 100644 Front/src/paginas/ControlPagos.svelte diff --git a/Aspnet/Controllers/AdminController.cs b/Aspnet/Controllers/AdminController.cs index 04286d8..008551d 100644 --- a/Aspnet/Controllers/AdminController.cs +++ b/Aspnet/Controllers/AdminController.cs @@ -6,11 +6,217 @@ using Entidades; using System.Linq.Expressions; using AlquilaFacil.StrategyBusquedaAdmin; using System.Diagnostics; +using AlquilaFacil.Builder; +using Minio.DataModel.Args; +using Minio; +using AlquilaFacil.Config; +using System.Text.Json; namespace AlquilaFacil.Controllers; [ApiController] public class AdminController: ControllerBase { + + [HttpGet("api/contratos/controlPagos")] + public IActionResult obtenerContratosInpagos([FromHeader(Name = "Auth")] string Auth) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 14); + if (validacion1 == false) return Unauthorized(); + + var contratos = RepositorioContratos.Singleton.ObtenerContratosInpagos(); + + List dtos = new(); + foreach (var i in contratos) { + if (i.DniinquilinoNavigation == null || i.IdpropiedadNavigation == null + || i.DnipropietarioNavigation == null) continue; + + var cont = new ContratoDtoBuilder() + .SetInquilino($"{i.DniinquilinoNavigation.Nombre} {i.DniinquilinoNavigation.Apellido}") + .SetUbicacion(i.IdpropiedadNavigation.Ubicacion) + .SetPropietario($"{i.DnipropietarioNavigation.Nombre} {i.DnipropietarioNavigation.Apellido}") + .SetId(i.Id) + .SetTipo(i.IdpropiedadNavigation.IdtipropiedadNavigation.Descripcion) + .SetFechaInicio(i.Fechainicio) + .SetEstado(i.Habilitado, i.Cancelado) + .Build(); + dtos.Add(cont); + } + return Ok(dtos); + } + + [HttpGet("api/contratos/controlPagos/propiedad")] + public IActionResult obtenerPropiedad([FromHeader(Name = "Auth")] string Auth, int id = 0) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Admin"); + if (validacion1 == false) return Unauthorized(); + + if (id <= 0) return BadRequest(new { message = "No hay propiedades con id igual o menor a 0"}); + var i = RepositorioContratos.Singleton.ObtenerContratoPorId(id); + if (i == null || i.DniinquilinoNavigation == null || + i.IdpropiedadNavigation == null || i.DnipropietarioNavigation == null)return BadRequest(new { message = "Fallo la query"}); + + var cont = new ContratoPropiedadDtoBuilder() + .SetInquilino($"{i.DniinquilinoNavigation.Nombre} {i.DniinquilinoNavigation.Apellido}") + .SetUbicacion(i.IdpropiedadNavigation.Ubicacion) + .SetId(i.Id) + .SetPropietario($"{i.DnipropietarioNavigation.Nombre} {i.DnipropietarioNavigation.Apellido}") + .SetTipo(i.IdpropiedadNavigation.IdtipropiedadNavigation.Descripcion) + .SetFechaInicio(i.Fechainicio) + .SetEstado(i.Habilitado, i.Cancelado) + .SetHabitaciones(i.IdpropiedadNavigation.Canthabitaciones) + .SetPiso(i.IdpropiedadNavigation.Piso??0) + .SetLetra(i.IdpropiedadNavigation.Letra??"") + .SetMesesAumento(i.MesesHastaAumento) + .SetMesesDuracion(i.MesesDurationContrato) + .Build(); + + return Ok(cont); + } + + private readonly IMinioClient mc; + public AdminController(IMinioClient minioClient) { + mc = minioClient; + if (mc == null){ + MinioConfigcus? mcon = JsonSerializer.Deserialize(System.IO.File.ReadAllText("./settings.json"))?? null; + if (mcon == null) throw new Exception(); + + mc = new MinioClient().WithCredentials(mcon.usr, mcon.scrt) + .WithEndpoint("192.168.1.11:9000") + .WithSSL(false) + .Build(); + } + } + [HttpGet("/api/admin/contrato/verDocumento")] + public IActionResult verDocumento([FromHeader(Name = "Auth")] string Auth, int idcontrato = 0){ + if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Admin"); + 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); + + 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/admin/contrato/canons")] + public IActionResult ObtenerCanones([FromHeader(Name="Auth")]string Auth, int id = 0){ + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Admin"); + if (validacion1 == false) return Unauthorized(); + + var cont = RepositorioContratos.Singleton.ObtenerContratoPorId(id); + if (cont == null) return BadRequest(new { message = "No existe el contrato"}); + + var list = RepositorioCanons.Singleton.ObtenerCanonsPorContrato(id); + if (list == null) return BadRequest(new { message = "No hay contrato por esa id"}); + + DateTime date = DateTime.Now; + bool ret =list.Any(x=>x.Pagado ==0 && date > x.Fecha); + if (ret == true) return BadRequest(new { message = "Este contrato no tiene canones vencidos"}); + + string divisa =""; + if (cont.Iddivisa == 0) divisa = "AR$"; else if (cont.Iddivisa == 1) divisa = "US$"; + + List d = new(); + + foreach (var i in list) { + var c = new CanonDtoBuilder() + .SetId(i.Id) + .SetPago(i.Idrecibo==null?false:true) + .SetDivisa(divisa==""?"Ugh esta mal cargado la divisa en el contrato":divisa) + .SetMes(i.Fecha) + .SetMesNum(int.Parse((i.Fecha.Month - cont.Fechainicio.Month).ToString()) + 1) + .SetMonto(i.Monto) + .Build(); + d.Add(c); + } + + return Ok(d); + } + + [HttpPost("api/admin/contrato/marcarPago")] + public IActionResult realizarPago([FromHeader(Name="Auth")]string Auth, MarcarPagoDto dto) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Admin"); + 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"}); + + 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 = DateTime.Now, + }; + + bool ret = RepositorioCanons.Singleton.SetRecibo(c, re, cli.Dni, "Admin Marca Recibo Como Pago"); + return ret ? + Ok(new { message = "Se guardo correctamente"}):BadRequest(new { message = "No se pudo guardar"}); + } + + [HttpPost("api/admin/notificarInquilino")] + public IActionResult NotificarInquilino([FromHeader(Name ="Auth")]string Auth, NotificarAdmin data){ + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Admin"); + if (validacion1 == false) return Unauthorized(); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null)return Unauthorized(); + + if (data.Mensaje == "") return BadRequest(new {message = "El campo Mensaje esta vacio"}); + if (data.Idcontrato <= 0) return BadRequest(new {message = "La id de contrato no puede ser 0 o menor"}); + if (data.Idcanon <= 0) return BadRequest(new {message = "La id de contrato no puede ser 0 o menor"}); + + Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(data.Idcontrato); + if (cont == null || cont.DniinquilinoNavigation == null || cont.DnipropietarioNavigation == null || cont.IdpropiedadNavigation == null) return BadRequest(new { message = "no hay un contrato por esa id"}); + + Canon? can = RepositorioCanons.Singleton.ObtenerCanonPorId(data.Idcanon); + if (can == null)return BadRequest(new { message = "No existe un canon por esa id"}); + + var n = new NotificacioneBuilder() + .SetAccion("Notificacion Inquilino") + .SetMensaje(data.Mensaje) + .SetLeido(false) + .SetDnicliente(cont.DniinquilinoNavigation.Dni) + .SetDniremitente(cont.DnipropietarioNavigation.Dni) + .SetIdpropiedad(cont.IdpropiedadNavigation.Id) + .SetFecha(DateTime.Now) + .Build(); + var ret = RepositorioNotificaciones.Singleton.AltaNotificacion(n, cli.Dni); + return ret? + Ok(new { message = "se envio el aviso" }):BadRequest(new { message = "Fallo al intentar enviar el aviso" }); + + } + [HttpGet("api/admin/clientes")] public IActionResult GetClientes([FromHeader(Name ="Auth")]string Auth){ if (String.IsNullOrEmpty(Auth)) return Unauthorized(); diff --git a/Aspnet/Controllers/ContratoController.cs b/Aspnet/Controllers/ContratoController.cs index 23d34f7..1f45809 100644 --- a/Aspnet/Controllers/ContratoController.cs +++ b/Aspnet/Controllers/ContratoController.cs @@ -82,7 +82,7 @@ public class ContratoController: ControllerBase { Recibo re = new Recibo{ Monto = c.Monto, - Fecha = c.Fecha, + Fecha = DateTime.Now, }; bool ret = RepositorioCanons.Singleton.SetRecibo(c, re, cli.Dni); @@ -111,7 +111,7 @@ public class ContratoController: ControllerBase { Recibo re = new Recibo{ Monto = c.Monto, - Fecha = c.Fecha, + Fecha = DateTime.Now, }; bool ret = RepositorioCanons.Singleton.SetRecibo(c, re, cli.Dni); diff --git a/Entidades/Admin/NotificarAdmin.cs b/Entidades/Admin/NotificarAdmin.cs new file mode 100644 index 0000000..2205b50 --- /dev/null +++ b/Entidades/Admin/NotificarAdmin.cs @@ -0,0 +1,6 @@ +namespace Entidades.Admin; +public class NotificarAdmin { + public string Mensaje { get; set; }=""; + public long Idcontrato{get;set;} + public long Idcanon {get; set;} +} \ No newline at end of file diff --git a/Front/src/App.svelte b/Front/src/App.svelte index 430f80e..31600b2 100644 --- a/Front/src/App.svelte +++ b/Front/src/App.svelte @@ -25,6 +25,8 @@ import CompraYVentas from "./paginas/CompraYVenta.svelte"; import Ventas from "./paginas/Ventas.svelte"; import VerLogs from "./paginas/VerLogs.svelte"; + import ControlPagos from "./paginas/ControlPagos.svelte"; + import ContratoAdmin from "./paginas/ContratoAdmin.svelte"; @@ -108,6 +110,11 @@ + + + + + @@ -141,6 +148,10 @@ - + + + + + diff --git a/Front/src/paginas/ContratoAdmin.svelte b/Front/src/paginas/ContratoAdmin.svelte new file mode 100644 index 0000000..57f3e94 --- /dev/null +++ b/Front/src/paginas/ContratoAdmin.svelte @@ -0,0 +1,316 @@ + + + + +{#if modaldata} + !!(modaldata = "")}/> +{/if} + +{#if shownotif} + shownotif = false} onConfirm={EscribirNotificacion}/> +{/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} +
+
+
+
+
+
+
\ No newline at end of file diff --git a/Front/src/paginas/ControlPagos.svelte b/Front/src/paginas/ControlPagos.svelte new file mode 100644 index 0000000..9baa86e --- /dev/null +++ b/Front/src/paginas/ControlPagos.svelte @@ -0,0 +1,93 @@ + + + + +{#if modaldata } + !!(modaldata="")}/> +{/if} + +
+ +
+ Lista de contratos que tienen canones atrasados +
+
+
+ {#if alquileres == null} +
+
+ Loading... +
+
+ {:else} + {#if alquileres.length == 0} +

+ No hay Alquileres que deban meses +

+ {/if} + {#each alquileres as alquiler} +
+
+
+
{alquiler.tipoPropiedad}
+
+
+
{alquiler.ubicacion}
+

+ Fecha de inicio: {new Date(alquiler.fechainicio).toLocaleDateString()}
+ Inquilino: {alquiler.inquilino}
+ Propietario: {alquiler.propietario}
+ Id Propiedad: {alquiler.id} +

+
+ +
+
+ +
+
+ {/each} + {/if} +
+
\ No newline at end of file diff --git a/Modelo/RepositorioCanons.cs b/Modelo/RepositorioCanons.cs index ecb8ce2..584e811 100644 --- a/Modelo/RepositorioCanons.cs +++ b/Modelo/RepositorioCanons.cs @@ -27,7 +27,13 @@ public class RepositorioCanons: RepositorioBase { return cc; } - public bool SetRecibo(Canon c, Recibo re, long dni) { + public Canon? ObtenerCanonPorId(long id){ + var con = Context; + var cnn = con.Canons.FirstOrDefault(x=>x.Id == id); + return cnn; + } + + public bool SetRecibo(Canon c, Recibo re, long dni, string mensaje= "Set Recibo") { var con = Context; var cc = con.Canons .Include(x=>x.Idcontratos) @@ -51,7 +57,7 @@ public class RepositorioCanons: RepositorioBase { ccc.IdpropiedadNavigation.Idestado = 3; } - GenerarLog(con, dni, $"Set Recibo"); + GenerarLog(con, dni, mensaje); return Guardar(con); } diff --git a/Modelo/RepositorioContratos.cs b/Modelo/RepositorioContratos.cs index 8016950..5119af3 100644 --- a/Modelo/RepositorioContratos.cs +++ b/Modelo/RepositorioContratos.cs @@ -242,4 +242,17 @@ public class RepositorioContratos: RepositorioBase { return Guardar(con); } + + public IQueryable ObtenerContratosInpagos() { + var con = Context; + DateTime d = DateTime.Now; + var l = con.Contratos + .Include(x=>x.DniinquilinoNavigation) + .Include(x=>x.DnipropietarioNavigation) + .Include(x=>x.IdpropiedadNavigation) + .ThenInclude(x=>x.IdtipropiedadNavigation) + .Include(x=>x.Idcanons) + .Where(x=>x.Idcanons.Any(x=>x.Pagado ==0 && d > x.Fecha)); + return l; + } } diff --git a/Modelo/RepositorioNotificaciones.cs b/Modelo/RepositorioNotificaciones.cs index d925c9a..f10ba47 100644 --- a/Modelo/RepositorioNotificaciones.cs +++ b/Modelo/RepositorioNotificaciones.cs @@ -20,10 +20,13 @@ public class RepositorioNotificaciones : RepositorioBase