diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..4361744
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,4 @@
+[*.cs]
+
+# CS8602: Dereference of a possibly null reference.
+dotnet_diagnostic.CS8602.severity = suggestion
diff --git a/.gitignore b/.gitignore
index baab4fc..cfe669c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,5 @@
/Entidades/obj/
/Aspnet/obj/
/Modelo/bin/
+Aspnet/bin/
+node_modules/
\ No newline at end of file
diff --git a/Aspnet/AlquilaFacil.csproj b/Aspnet/AlquilaFacil.csproj
index a513915..91ae823 100644
--- a/Aspnet/AlquilaFacil.csproj
+++ b/Aspnet/AlquilaFacil.csproj
@@ -10,6 +10,7 @@
+
diff --git a/Aspnet/Builder/DtoBuilder/CanonDtoBuilder.cs b/Aspnet/Builder/DtoBuilder/CanonDtoBuilder.cs
new file mode 100644
index 0000000..1c0538a
--- /dev/null
+++ b/Aspnet/Builder/DtoBuilder/CanonDtoBuilder.cs
@@ -0,0 +1,35 @@
+using Entidades.Dto;
+
+namespace AlquilaFacil.Builder;
+
+public class CanonDtoBuilder : Builder{
+ public CanonDtoBuilder SetId(long id) {
+ data.Id = id;
+ return this;
+ }
+
+ public CanonDtoBuilder SetMesNum(int mesNum) {
+ data.MesNum = mesNum;
+ return this;
+ }
+
+ public CanonDtoBuilder SetMes(DateTime d){
+ data.Mes = d;
+ return this;
+ }
+
+ public CanonDtoBuilder SetMonto(Decimal monto) {
+ data.Monto = monto;
+ return this;
+ }
+
+ public CanonDtoBuilder SetDivisa(string divisa) {
+ data.Divisa = divisa;
+ return this;
+ }
+
+ public CanonDtoBuilder SetPago(bool p) {
+ data.Pago = p;
+ return this;
+ }
+}
\ No newline at end of file
diff --git a/Aspnet/Builder/DtoBuilder/ContratoDtoBuilder.cs b/Aspnet/Builder/DtoBuilder/ContratoDtoBuilder.cs
new file mode 100644
index 0000000..5a3d4a0
--- /dev/null
+++ b/Aspnet/Builder/DtoBuilder/ContratoDtoBuilder.cs
@@ -0,0 +1,50 @@
+using Entidades.Dto;
+
+namespace AlquilaFacil.Builder;
+public class ContratoDtoBuilder: Builder {
+ public ContratoDtoBuilder SetId(long id ){
+ data.id = id;
+ return this;
+ }
+
+ public ContratoDtoBuilder SetUbicacion(string ub){
+ data.Ubicacion = ub;
+ return this;
+ }
+
+ public ContratoDtoBuilder SetTipo(string tipo){
+ data.TipoPropiedad = tipo;
+ return this;
+ }
+
+ public ContratoDtoBuilder SetFechaInicio(DateTime fec) {
+ data.Fechainicio = fec;
+ return this;
+ }
+
+ public ContratoDtoBuilder SetInquilino(string inquilino){
+ data.Inquilino = inquilino;
+ return this;
+ }
+
+ public ContratoDtoBuilder SetPropietario(string propietario){
+ data.Propietario = propietario;
+ return this;
+ }
+
+ public ContratoDtoBuilder SetEstado(ulong habilitado, ulong cancelado) {
+ bool Habilitado = habilitado == 0?false:true;
+ bool Cancelado = cancelado == 0?false:true;
+
+ if (Habilitado == true && Cancelado == false){
+ data.Estado = "Alquiler Iniciado";
+ } else if (Cancelado == true && Habilitado == false) {
+ data.Estado = "Nunca Empezo Esta Cancelado";
+ } else if (Habilitado == false && Cancelado ==false){
+ data.Estado = "Esta en Proceso";
+ } else if (Habilitado == true && Cancelado == true){
+ data.Estado = "Terminado";
+ }
+ return this;
+ }
+}
\ No newline at end of file
diff --git a/Aspnet/Builder/DtoBuilder/ContratoPropiedadDtoBuilder.cs b/Aspnet/Builder/DtoBuilder/ContratoPropiedadDtoBuilder.cs
new file mode 100644
index 0000000..ab8a5e5
--- /dev/null
+++ b/Aspnet/Builder/DtoBuilder/ContratoPropiedadDtoBuilder.cs
@@ -0,0 +1,75 @@
+using Entidades.Dto;
+
+namespace AlquilaFacil.Builder;
+public class ContratoPropiedadDtoBuilder : Builder{
+ public ContratoPropiedadDtoBuilder SetId(long id ){
+ data.id = id;
+ return this;
+ }
+
+ public ContratoPropiedadDtoBuilder SetUbicacion(string ub){
+ data.Ubicacion = ub;
+ return this;
+ }
+
+ public ContratoPropiedadDtoBuilder SetTipo(string tipo){
+ data.TipoPropiedad = tipo;
+ return this;
+ }
+
+ public ContratoPropiedadDtoBuilder SetFechaInicio(DateTime fec) {
+ data.Fechainicio = fec;
+ return this;
+ }
+
+ public ContratoPropiedadDtoBuilder SetInquilino(string inquilino){
+ data.Inquilino = inquilino;
+ return this;
+ }
+
+ public ContratoPropiedadDtoBuilder SetPropietario(string propietario){
+ data.Propietario = propietario;
+ return this;
+ }
+
+ public ContratoPropiedadDtoBuilder SetEstado(ulong habilitado, ulong cancelado) {
+ bool Habilitado = habilitado == 0?false:true;
+ bool Cancelado = cancelado == 0?false:true;
+
+ if (Habilitado == true && Cancelado == false){
+ data.Estado = "Alquiler Iniciado";
+ } else if (Cancelado == true && Habilitado == false) {
+ data.Estado = "Nunca Empezo Esta Cancelado";
+ } else if (Habilitado == false && Cancelado ==false){
+ data.Estado = "Esta en Proceso";
+ } else if (Habilitado == true && Cancelado == true){
+ data.Estado = "Terminado";
+ }
+ return this;
+ }
+
+ public ContratoPropiedadDtoBuilder SetHabitaciones(int habitaciones){
+ data.Habitaciones = habitaciones;
+ return this;
+ }
+
+ public ContratoPropiedadDtoBuilder SetPiso(int piso){
+ data.Piso = piso;
+ return this;
+ }
+
+ public ContratoPropiedadDtoBuilder SetLetra(string letra){
+ data.Letra = letra;
+ return this;
+ }
+
+ public ContratoPropiedadDtoBuilder SetMesesAumento(int mesesAumento){
+ data.MesesAumento = mesesAumento;
+ return this;
+ }
+
+ public ContratoPropiedadDtoBuilder SetMesesDuracion(int mesesDurationContrato) {
+ data.MesesDuracion = mesesDurationContrato;
+ return this;
+ }
+}
diff --git a/Aspnet/Builder/DtoBuilder/DefectoDtoBuilder.cs b/Aspnet/Builder/DtoBuilder/DefectoDtoBuilder.cs
new file mode 100644
index 0000000..c8e415b
--- /dev/null
+++ b/Aspnet/Builder/DtoBuilder/DefectoDtoBuilder.cs
@@ -0,0 +1,34 @@
+using Entidades.Dto;
+
+namespace AlquilaFacil.Builder;
+public class DefectoDtoBuilder: Builder {
+ public DefectoDtoBuilder SetId(long id) {
+ data.Id = id;
+ return this;
+ }
+ public DefectoDtoBuilder SetDesc(string Descripcion){
+ data.Descripcion = Descripcion;
+ return this;
+ }
+ public DefectoDtoBuilder SetCosto(Decimal Costo){
+ data.Costo = Costo;
+ return this;
+ }
+ public DefectoDtoBuilder SetEstado(string estado){
+ data.Estado = estado;
+ return this;
+ }
+ public DefectoDtoBuilder SetIdContrato(long id){
+ data.Idcontrato = id;
+ return this;
+
+ }
+ public DefectoDtoBuilder SetPagaInquilino(ulong pag){
+ data.Pagainquilino=pag==1?"Si":"No";
+ return this;
+ }
+ public DefectoDtoBuilder SetDivisa(string divisa){
+ data.Divisa = divisa;
+ return this;
+ }
+}
\ No newline at end of file
diff --git a/Aspnet/Builder/DtoBuilder/InformeAlquilerBuilder.cs b/Aspnet/Builder/DtoBuilder/InformeAlquilerBuilder.cs
new file mode 100644
index 0000000..a0020ef
--- /dev/null
+++ b/Aspnet/Builder/DtoBuilder/InformeAlquilerBuilder.cs
@@ -0,0 +1,17 @@
+using Entidades.Informes;
+
+namespace AlquilaFacil.Builder;
+public class InformesAlquilerBuilder: Builder{
+ public InformesAlquilerBuilder SetId(long id){
+ data.Id = id;
+ return this;
+ }
+ public InformesAlquilerBuilder SetUbicacion(string Ubicacion){
+ data.Ubicacion = Ubicacion;
+ return this;
+ }
+ public InformesAlquilerBuilder SetDivisa(string Divisa){
+ data.Divisa = Divisa;
+ return this;
+ }
+}
\ No newline at end of file
diff --git a/Aspnet/Builder/PrecontratoBuilder.cs b/Aspnet/Builder/PrecontratoBuilder.cs
index a51b1c0..5e58b57 100644
--- a/Aspnet/Builder/PrecontratoBuilder.cs
+++ b/Aspnet/Builder/PrecontratoBuilder.cs
@@ -42,4 +42,9 @@ public class PrecontratoBuilder : Builder {
data.Fechainicio = fechaprimernotificacion;
return this;
}
+
+ public PrecontratoBuilder SetMesesDuracion(int mesesDuracionContrato){
+ data.MesesDurationContrato = mesesDuracionContrato;
+ return this;
+ }
}
\ No newline at end of file
diff --git a/Aspnet/Controllers/ContratoController.cs b/Aspnet/Controllers/ContratoController.cs
index 7b21e4c..fa6c146 100644
--- a/Aspnet/Controllers/ContratoController.cs
+++ b/Aspnet/Controllers/ContratoController.cs
@@ -2,6 +2,7 @@ using System.Net;
using System.Text.Json;
using AlquilaFacil.Builder;
using AlquilaFacil.Config;
+using AlquilaFacil.Facade;
using Entidades;
using Entidades.Dto;
using Microsoft.AspNetCore.Mvc;
@@ -16,11 +17,293 @@ namespace AlquilaFacil.Controllers;
[ApiController]
public class ContratoController: ControllerBase {
- [HttpGet("api/contratos")] //WIP
- public IActionResult ObtenerContratosPorUsuario([FromHeader(Name="Auth")]string Auth) {
- return Ok();
+ [HttpPost("api/contrato/GenerarRecibo")]
+ public ActionResult GenerarRecibo([FromHeader(Name="Auth")]string Auth, MarcarPagoDto dto, bool html= true) {
+ if (String.IsNullOrEmpty(Auth)) return Unauthorized();
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario");
+ if (validacion1 == false){
+ validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino");
+ if (validacion1 == false) {
+ return Unauthorized();
+ }
+ }
+
+ if (dto.Idcontrato <= 0) return BadRequest(new { message = "No puede tener un contrato con id 0 o menor"});
+
+ Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(dto.Idcontrato);
+ if (cont == null) return BadRequest(new { message = "No hay un contrato por ese id"});
+
+ if (cont.DniinquilinoNavigation == null || cont.DnipropietarioNavigation == null || cont.IdpropiedadNavigation == null ||
+ cont.IdpropiedadNavigation.IdtipropiedadNavigation == null) return BadRequest(new { message = "comunicate con el admin esta mal cargado el contratod de alguina forma"});
+
+ Canon? can = RepositorioCanons.Singleton.ObtenerCanonContrato(dto.fecha, dto.Idcontrato);
+ if (can == null) return BadRequest(new { message = "no hay un canon para ese contrato con esa fecha"});
+ if (can.IdreciboNavigation == null) return BadRequest(new { message = "No hay un recibo para ese canon"});
+
+ var cdb = new ContratoDtoBuilder()
+ .SetInquilino($"{cont.DniinquilinoNavigation.Nombre} {cont.DniinquilinoNavigation.Apellido}")
+ .SetUbicacion(cont.IdpropiedadNavigation.Ubicacion)
+ .SetPropietario($"{cont.DnipropietarioNavigation.Nombre} {cont.DnipropietarioNavigation.Apellido}")
+ .SetId(cont.Id)
+ .SetTipo(cont.IdpropiedadNavigation.IdtipropiedadNavigation.Descripcion)
+ .SetFechaInicio(cont.Fechainicio)
+ .SetEstado(cont.Habilitado, cont.Cancelado)
+ .Build();
+
+ var dof = new DocumentoFacade();
+ MemoryStream? memstr = new();
+ if (html){
+ dof.GenerarHtml(cdb, can.IdreciboNavigation, memstr);
+ return File(memstr, "text/html", "Recibo.html");
+ } else {
+ dof.GenerarPdf (cdb, can.IdreciboNavigation, memstr);
+ return File(memstr, "application/pdf", "Recibo.pdf");
+ }
+
}
+ [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")]
+ public IActionResult crearCanons([FromHeader(Name="Auth")]string Auth, CrearCanonsDto dto){
+ if (String.IsNullOrEmpty(Auth)) return Unauthorized();
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario");
+ if (validacion1 == false)return Unauthorized();
+ Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth);
+ if (cli == null) return Unauthorized();
+
+ if (dto.idcontrato <=0) return BadRequest(new { message ="estan mal cargados los datos"});
+
+ 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 el propietario o intenta volviendote a logear"});
+
+ var ret = RepositorioCanons.Singleton.CrearCanons(dto.aumento, dto.idcontrato);
+ return ret ?
+ Ok(new { message = "Se crearon los canons correctamente"}):BadRequest(new { message = "No se pudo guardar"});
+ }
+
+ [HttpGet("api/contratos/canon")]
+ public ActionResult getCanons([FromHeader(Name="Auth")]string Auth, int id = 0) {
+ if (String.IsNullOrEmpty(Auth)) return Unauthorized();
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario");
+ if (validacion1 == false){
+ validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino");
+ if (validacion1 == false) {
+ 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"});
+
+ 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);
+ }
+
+ [HttpGet("api/contratos/propietario")]
+ public IActionResult ObtenerContratosPorPropietario([FromHeader(Name="Auth")]string Auth) {
+ if (String.IsNullOrEmpty(Auth)) return Unauthorized();
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario");
+ if (validacion1 == false) return Unauthorized();
+
+ Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth);
+ if (cli==null) return Unauthorized();
+
+ var list = RepositorioContratos.Singleton.ObtenerContratosDePropietario(cli.Dni);
+
+ List dtos = new();
+ foreach (var i in list) {
+ 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)
+ .SetId(i.Id)
+ .SetPropietario($"{i.DnipropietarioNavigation.Nombre} {i.DnipropietarioNavigation.Apellido}")
+ .SetTipo(i.IdpropiedadNavigation.IdtipropiedadNavigation.Descripcion)
+ .SetFechaInicio(i.Fechainicio)
+ .SetEstado(i.Habilitado, i.Cancelado)
+ .Build();
+ dtos.Add(cont);
+ }
+ return Ok(dtos);
+ }
+
+ [HttpGet("api/contrato/propietario")]
+ public IActionResult ObtenerContratoPorPropietarioPorId([FromHeader(Name="Auth")]string Auth, int id=0) {
+ if (String.IsNullOrEmpty(Auth)) return Unauthorized();
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario");
+ if (validacion1 == false) return Unauthorized();
+
+ Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth);
+ if (cli==null) 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"});
+ if (cli.Dni != i.Dnipropietario) return BadRequest(new { message = "No sos el propietario"});
+
+ 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);
+ }
+
+ [HttpGet("api/contratos/inquilino")]
+ public IActionResult ObtenerContratosPorInquilino([FromHeader(Name="Auth")]string Auth) {
+ if (String.IsNullOrEmpty(Auth)) return Unauthorized();
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino");
+ if (validacion1 == false) return Unauthorized();
+
+ Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth);
+ 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
+ || 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/contrato/inquilino")]
+ public IActionResult ObtenerContratoPorInquilinoPorId([FromHeader(Name="Auth")]string Auth, int id=0) {
+ if (String.IsNullOrEmpty(Auth)) return Unauthorized();
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino");
+ if (validacion1 == false) return Unauthorized();
+
+ Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth);
+ if (cli==null) 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"});
+ if (cli.Dni != i.Dniinquilino) return BadRequest(new { message = "No sos el inquilino"});
+
+ 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);
+ }
+
[HttpPost("api/contratos/precontrato")]
public IActionResult IniciarPrecontrato([FromHeader(Name = "Auth")]string Auth, [FromBody] PrecontratoDto dto) {
if (String.IsNullOrEmpty(Auth)) return Unauthorized();
@@ -52,6 +335,7 @@ public class ContratoController: ControllerBase {
.SetMesesHastaAumento(dto.MesesHastaAumento)
.SetPropiedad(p.Id)
.SetFecha(DateTime.Parse(dto.fechaprimernotificacion))
+ .SetMesesDuracion(dto.MesesDuracionContrato)
.Build();
@@ -273,12 +557,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"});
@@ -414,6 +742,34 @@ public class ContratoController: ControllerBase {
}
}
+ [HttpGet("api/contratos/garantes")]
+ public IActionResult ObtenerGarantes([FromHeader(Name ="Auth")] string Auth, int idcontrato) {
+ if (String.IsNullOrWhiteSpace(Auth)) return BadRequest();
+ if(idcontrato <= 0) return BadRequest();
+
+ Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth);
+ if (cli == null) return BadRequest();
+
+ Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(idcontrato);
+ if (cont == null) return BadRequest();
+
+ if (cont.Dniinquilino != cli.Dni && cont.Dnipropietario != cli.Dni) return BadRequest();
+
+ var list = cont.Idgarantes;
+ List l = new();
+ foreach (var i in list) {
+ l.Add(new GaranteDtoBuilder()
+ .SetCelular(i.Celular)
+ .SetDni(i.Dni)
+ .SetDomicilio(i.Domicilio)
+ .SetDomicilioLaboral(i.Domiciliolaboral)
+ .SetNombre(i.Nombre)
+ .SetApellido(i.Apellido)
+ .Build());
+ }
+ return Ok(l);
+ }
+
private string ValidarCancelarDto(CancelarPrecontratoDto dto) {
if (dto == null) return "dto nulo";
string ret = "";
@@ -458,7 +814,8 @@ public class ContratoController: ControllerBase {
if (dto.EmailPropietario == "") ret += "el email del propietario no puede estar vacio\n";
if (dto.IdPropiedad <= 0) ret += "la id de propiedad no puede ser igual o menor a 0\n";
if (dto.MesesHastaAumento <= 0) ret += "No puede tener 0 o menos meses hasta el aumento\n";
-
+ if (dto.MesesDuracionContrato <= 0) ret += "No puede tener 0 o menos meses de duracion\n";
+ if (dto.MesesDuracionContrato < dto.MesesHastaAumento) ret += "el tiempo hasta aumento no puede ser mayor de \n";
return ret;
}
diff --git a/Aspnet/Controllers/DefectoController.cs b/Aspnet/Controllers/DefectoController.cs
new file mode 100644
index 0000000..a7f9fef
--- /dev/null
+++ b/Aspnet/Controllers/DefectoController.cs
@@ -0,0 +1,95 @@
+using AlquilaFacil.Builder;
+using Entidades;
+using Entidades.Dto;
+using Microsoft.AspNetCore.Mvc;
+using Modelo;
+
+namespace AlquilaFacil.Controllers;
+
+[ApiController]
+public class DefectoController: ControllerBase {
+
+ [HttpGet("api/defectos")]
+ public IActionResult ObtenerDefectosEnContrato([FromHeader(Name = "Auth")] string Auth, long Idcontrato = 0) {
+ if (Idcontrato <= 0) return BadRequest( new { message = "La id de contrato no puede ser menor o igual a 0"});
+
+ if (String.IsNullOrEmpty(Auth)) return Unauthorized();
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario");
+ if (validacion1 == false){
+ validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino");
+ if (validacion1 == false) {
+ return Unauthorized();
+ }
+ }
+
+ Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth);
+ if (cli == null) return Unauthorized();
+
+ Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(Idcontrato);
+ if (cont == null) return BadRequest(new { message = "No hay contrato por esa id"});
+
+ if (cont.Dniinquilino != cli.Dni && cont.Dnipropietario != cli.Dni) return BadRequest(new { message = "no deberias tener acceso a esto"});
+
+ var l = RepositorioDefectos.Singleton.ObtenerDefectosPorIdContrato(Idcontrato);
+ List ll = new();
+ foreach (var i in l){
+ var n = new DefectoDtoBuilder()
+ .SetId(i.Id)
+ .SetDesc(i.Descripcion)
+ .SetCosto(i.Costo)
+ .SetEstado(i.IdestadoNavigation.Descipcion)
+ .SetIdContrato(i.Idcontrato??0)
+ .SetPagaInquilino(i.Pagainquilino)
+ .SetDivisa(i.IddivisaNavigation.Signo)
+ .Build();
+ ll.Add(n);
+ }
+ return Ok(ll);
+ }
+
+ [HttpPost("api/defecto")]
+ public IActionResult AltaDefecto([FromHeader(Name = "Auth")] string Auth, AltaDefectoDto data) {
+ if (String.IsNullOrEmpty(Auth)) return Unauthorized();
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino");
+ if (validacion1 == false) return Unauthorized();
+
+ string r = ValidarDto(data);
+ if (r != "") return BadRequest(new { message = r });
+
+ Defecto defecto = new Defecto{
+ Costo = data.Costo,
+ Descripcion = data.Descripcion,
+ Idcontrato = data.Idcontrato,
+ Iddivisa = data.Iddivisa,
+ Pagainquilino = data.Pagainquilino==0?0Lu:1Lu,
+ Idestado = 1,
+
+ };
+ var b = RepositorioDefectos.Singleton.AltaDefecto(defecto);
+ return b ?Ok(new { message = "Se cargo el Defecto en el sistema"}):BadRequest(new { message ="No se pudo cargar el defecto en el sistema"});
+ }
+
+ private string ValidarDto(AltaDefectoDto d){
+ string ret ="";
+
+ if (d == null) return "Dto nulo";
+ if (d.Iddivisa <0 || d.Iddivisa>1) ret +="No son divisas validas\n";
+ if (d.Descripcion == "") ret+="La descripcion no puede estar vacia\n";
+ if (d.Idcontrato<=0)ret += "No puede haber un id de contrato igual o menor a 0\n";
+
+ return ret;
+ }
+
+ [HttpPut("api/defecto/marcarpago")]
+ public IActionResult MarcarPago([FromHeader(Name = "Auth")] string Auth, long iddefecto = 0) {
+ if (String.IsNullOrEmpty(Auth)) return Unauthorized();
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario");
+ if (validacion1 == false) return Unauthorized();
+
+ if (iddefecto<=0) return BadRequest(new { message = "No hay canones con id 0 o menor"});
+ bool ret = RepositorioDefectos.Singleton.MarcarPago(iddefecto);
+
+ return ret ?
+ Ok(new { message = "Se marco como pagado" }):BadRequest(new { message = "Fallo el acceso a la base de datos o no se encontro el defecto" });
+ }
+}
diff --git a/Aspnet/Controllers/EstadisticaController.cs b/Aspnet/Controllers/EstadisticaController.cs
new file mode 100644
index 0000000..93db4df
--- /dev/null
+++ b/Aspnet/Controllers/EstadisticaController.cs
@@ -0,0 +1,60 @@
+using AlquilaFacil.Builder;
+using Entidades.Informes;
+using Microsoft.AspNetCore.Mvc;
+using Modelo;
+
+namespace AlquilaFacil.Controllers;
+[ApiController]
+public class EstadisticaController: ControllerBase {
+ [HttpGet("api/stats/alquileresIniciados")]
+ public IActionResult alquileresIniciadosEsteAño([FromHeader(Name ="Auth")]string Auth, int year) {
+ if (String.IsNullOrWhiteSpace(Auth)) return BadRequest("");
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Informes");
+ if (validacion1 == false) return Unauthorized();
+
+ var validacion2 = RepositorioContratos.Singleton.HayContratosEnAño(year);
+ if (validacion2 == false) return BadRequest(new { message = "No hay contratos en ese año"});
+ var a = RepositorioEstadisticas.Singleton.ObtenerDataIniciadosPorAño(year);
+ return Ok(a);
+ }
+ [HttpGet("api/tabla/alquileresIniciados")]
+ public IActionResult tablaalquileresIniciadosEsteAño([FromHeader(Name ="Auth")]string Auth, int year) {
+ if (String.IsNullOrWhiteSpace(Auth)) return BadRequest("");
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Informes");
+ if (validacion1 == false) return Unauthorized();
+
+ var validacion2 = RepositorioContratos.Singleton.HayContratosEnAño(year);
+ if (validacion2 == false) return BadRequest(new { message = "No hay contratos en ese año"});
+ var a = RepositorioEstadisticas.Singleton.TablaObtenerContratosIniciadosPorAño(year);
+ if (a == null) return BadRequest(new { message = "Fallo al obtener el contrato"});
+
+ List informe =new();
+ foreach (var i in a) {
+ var d = new InformesAlquilerBuilder()
+ .SetId(i.Id).SetUbicacion(i.IdpropiedadNavigation.Ubicacion)
+ .SetDivisa(i.IddivisaNavigation.Signo)
+ .Build();
+ informe.Add(d);
+ }
+ return Ok(informe);
+ }
+ [HttpGet("api/stats/duracionContrato")]
+ public IActionResult DuracionContrato([FromHeader(Name ="Auth")]string Auth) {
+ if (String.IsNullOrWhiteSpace(Auth)) return BadRequest("");
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Informes");
+ if (validacion1 == false) return Unauthorized();
+
+ var a = RepositorioEstadisticas.Singleton.ObtenerDataDuracionContratos();
+ return Ok(a);
+ }
+
+ [HttpGet("api/tabla/duracionContrato")]
+ public IActionResult TablaDuracionContrato([FromHeader(Name ="Auth")]string Auth) {
+ if (String.IsNullOrWhiteSpace(Auth)) return BadRequest("");
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Informes");
+ if (validacion1 == false) return Unauthorized();
+
+ var a = RepositorioEstadisticas.Singleton.TablaObtenerDataDuracionContratos();
+ return Ok(a);
+ }
+}
\ No newline at end of file
diff --git a/Aspnet/Controllers/NotificacionesController.cs b/Aspnet/Controllers/NotificacionesController.cs
index fa8a141..3fadadd 100644
--- a/Aspnet/Controllers/NotificacionesController.cs
+++ b/Aspnet/Controllers/NotificacionesController.cs
@@ -15,22 +15,25 @@ public class NotificacionesController: ControllerBase {
var cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth);
if (cli == null) return BadRequest(new {message = "Fallo al intentar encontrar tu usuario (puede que te hayas logeado desde otro dispositivo?)"});
-
IQueryable notificaciones = RepositorioNotificaciones.Singleton.ObtenerNotificacionesDeUsuario(cli.Dni)
.Where(x=>x.Leido == leido);
+
+
List noti = new();
- Parallel.ForEach(notificaciones, i => {
+ foreach (Notificacione i in notificaciones) {
+ if(i.DniclienteNavigation == null || i.DniremitenteNavigation==null) return BadRequest(new { message = "Esta mal cargado el precontrato"});
var dto = new NotificacionDtoBuilder()
- .SetRemitente(i.DniremitenteNavigation.Email)
- .SetAccion(i.Accion)
- .SetMensaje(i.Mensaje)
+ .SetRemitente(i.DniremitenteNavigation.Email??"")
+ .SetAccion(i.Accion??"")
+ .SetMensaje(i.Mensaje??"")
.SetFecha(i.Fecha)
- .SetPropiedad(i.IdpropiedadNavigation.Id.ToString())
- .SetReceptor(i.DniclienteNavigation.Email)
+ .SetPropiedad(i.Idpropiedad.ToString()??"")
+ .SetReceptor(i.DniclienteNavigation.Email??"")
.Build();
noti.Add(dto);
- });
+ }
+
return Ok(noti);
}
@@ -92,4 +95,30 @@ public class NotificacionesController: ControllerBase {
return ret?
Ok(new {message = "Se envio la notificacion"}):BadRequest(new {message = "Fallo al intentar guardar la notificacion"});
}
+
+ [HttpPost("api/notificarInquilino")]
+ public IActionResult NotificarInq([FromHeader(Name ="Auth")]string Auth, [FromBody] AvisoInquilinoDto data) {
+ if (String.IsNullOrWhiteSpace(Auth)) return Unauthorized();
+ var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario");
+ if (validacion1 == false)return Unauthorized();
+
+ if (data.Mensaje == "") return BadRequest(new {message = "El campo Mensaje esta vacio"});
+ if (data.Idpropiedad <= 0) return BadRequest(new {message = "La id de propiedad no puede ser 0 o menor"});
+
+ Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(data.Idpropiedad);
+ if (cont == null || cont.DniinquilinoNavigation == null || cont.DnipropietarioNavigation == null || cont.IdpropiedadNavigation == null) return BadRequest(new { message = "no hay un contrato 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);
+ return ret?
+ Ok(new { message = "se envio el aviso" }):BadRequest(new { message = "Fallo al intentar enviar el aviso" });
+ }
}
\ No newline at end of file
diff --git a/Aspnet/Controllers/PropiedadesController.cs b/Aspnet/Controllers/PropiedadesController.cs
index 0da73b7..26f34b6 100644
--- a/Aspnet/Controllers/PropiedadesController.cs
+++ b/Aspnet/Controllers/PropiedadesController.cs
@@ -109,6 +109,7 @@ public class PropiedadesController: ControllerBase {
Letra = propiedad.Letra ?? null,
Piso = propiedad.Piso ?? null,
Monto = propiedad.Monto,
+ Iddivisa = propiedad.Iddivisa,
};
var ret = RepositorioPropiedades.Singleton.AñadirPropiedad(Prop);
@@ -141,7 +142,8 @@ public class PropiedadesController: ControllerBase {
Letra = propiedad.Letra ?? null,
Piso = propiedad.Piso ?? null,
IdServicios = servs,
- Monto = propiedad.Monto
+ Monto = propiedad.Monto,
+ Iddivisa = propiedad.Iddivisa,
};
bool ret = RepositorioPropiedades.Singleton.PatchPropiedad(Prop);
@@ -225,6 +227,9 @@ public class PropiedadesController: ControllerBase {
if (String.IsNullOrEmpty(prop.Ubicacion)) ret += "Tiene que definir la ubicacion de la propiedad\n";
if (prop.Monto<=1) ret += "El monto tiene que ser como minimo mayor a 0";
+
+ if (prop.Iddivisa<0 || prop.Iddivisa>1) ret += "se tiene que elejir entre AR$ y US$";
+
return ret;
}
@@ -244,6 +249,9 @@ public class PropiedadesController: ControllerBase {
if (String.IsNullOrEmpty(prop.Ubicacion)) ret += "Tiene que definir la ubicacion de la propiedad\n";
if (prop.Monto<=1) ret += "El monto tiene que ser como minimo mayor a 0";
+
+ if (prop.Iddivisa<0 || prop.Iddivisa>1) ret += "se tiene que elejir entre AR$ y US$";
+
return ret;
}
diff --git a/Aspnet/Controllers/ServiciosController.cs b/Aspnet/Controllers/ServiciosController.cs
deleted file mode 100644
index fea5d8b..0000000
--- a/Aspnet/Controllers/ServiciosController.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using Entidades;
-using Entidades.Dto;
-using Microsoft.AspNetCore.Http.HttpResults;
-using Microsoft.AspNetCore.Mvc;
-using Modelo;
-
-namespace AlquilaFacil.Controllers;
-
-[ApiController]
-public class ServiciosController: ControllerBase {
-
-}
\ No newline at end of file
diff --git a/Aspnet/Facade/DocumentoFacade.cs b/Aspnet/Facade/DocumentoFacade.cs
new file mode 100644
index 0000000..71f3d64
--- /dev/null
+++ b/Aspnet/Facade/DocumentoFacade.cs
@@ -0,0 +1,24 @@
+using System.Runtime;
+using System.Text;
+using Entidades;
+using Entidades.Dto;
+
+namespace AlquilaFacil.Facade;
+
+public class DocumentoFacade {
+ private readonly DocumentoGeneradorHtml d1 = new();
+ private readonly DocumentoGeneradorPdf d2 = new();
+
+ public void GenerarHtml(ContratoDto cd, Recibo r, MemoryStream memoryStream) {
+ string str = d1.GenerarHTML(cd, r);
+ StreamWriter writer = new StreamWriter(memoryStream, Encoding.UTF8);
+ writer.WriteAsync(str).Wait();
+ writer.FlushAsync().Wait();
+ memoryStream.Position = 0;
+ }
+ public void GenerarPdf(ContratoDto cd, Recibo r, MemoryStream memoryStream) {
+ var mem = d2.GenerarPdf(cd, r);
+ mem.CopyToAsync(memoryStream).Wait();
+ memoryStream.Position = 0;
+ }
+}
\ No newline at end of file
diff --git a/Aspnet/Facade/DocumentoGeneradorHtml.cs b/Aspnet/Facade/DocumentoGeneradorHtml.cs
new file mode 100644
index 0000000..f6ff529
--- /dev/null
+++ b/Aspnet/Facade/DocumentoGeneradorHtml.cs
@@ -0,0 +1,45 @@
+using Entidades;
+using Entidades.Dto;
+using Microsoft.AspNetCore.Routing.Template;
+
+namespace AlquilaFacil.Facade;
+public class DocumentoGeneradorHtml {
+ public string GenerarHTML(ContratoDto cd, Recibo r) {
+ string tmpl =$"""
+
+
+
+
+
+
+
+
+
+
+
Detalles
+
+ ID: {cd.id}
+ Ubicación: {cd.Ubicacion}
+ Tipo de Propiedad: {cd.TipoPropiedad}
+ Fecha de Inicio: {cd.Fechainicio}
+ Inquilino: {cd.Inquilino}
+ Propietario: {cd.Propietario}
+
+
+
Detalles del Recibo
+
+ ID del Recibo: {r.Id}
+ Fecha: {r.Fecha}
+ Monto: {r.Monto}
+
PAGO
+
+
+
+
+
+
+ """; return tmpl;
+ }
+ }
diff --git a/Aspnet/Facade/DocumentoGeneradorPdf.cs b/Aspnet/Facade/DocumentoGeneradorPdf.cs
new file mode 100644
index 0000000..e1e8279
--- /dev/null
+++ b/Aspnet/Facade/DocumentoGeneradorPdf.cs
@@ -0,0 +1,67 @@
+using Entidades;
+using Entidades.Dto;
+using QuestPDF.Fluent;
+using QuestPDF.Helpers;
+using QuestPDF.Infrastructure;
+using System.IO;
+
+namespace AlquilaFacil.Facade;
+public class DocumentoGeneradorPdf {
+ public MemoryStream GenerarPdf(ContratoDto cd, Recibo r)
+ {
+ var pdfStream = new MemoryStream();
+ QuestPDF.Settings.License = LicenseType.Community;
+ Document.Create(container =>
+ {
+ container.Page(page =>
+ {
+ page.Size(PageSizes.A4);
+ page.Margin(2, Unit.Centimetre);
+ page.Header().Text("AlquilaFácil").FontSize(20).SemiBold().FontColor(Colors.White);
+ page.Content().Column(column =>
+ {
+ column.Spacing(10);
+
+ column.Item().Border(1).Padding(10).Column(card =>
+ {
+ card.Item().Row(row =>
+ {
+ row.RelativeItem().Text("Detalles").FontSize(16).SemiBold();
+ });
+
+ card.Item().Column(body =>
+ {
+ body.Spacing(5);
+ body.Item().Text($"ID: {cd.id}").FontSize(12).Bold();
+ body.Item().Text($"Ubicación: {cd.Ubicacion}").FontSize(12);
+ body.Item().Text($"Tipo de Propiedad: {cd.TipoPropiedad}").FontSize(12);
+ body.Item().Text($"Fecha de Inicio: {cd.Fechainicio}").FontSize(12);
+ body.Item().Text($"Inquilino: {cd.Inquilino}").FontSize(12);
+ body.Item().Text($"Propietario: {cd.Propietario}").FontSize(12);
+ });
+ });
+
+ column.Item().Border(1).Padding(10).Column(card =>
+ {
+ card.Item().Row(row =>
+ {
+ row.RelativeItem().Text("Detalles del Recibo").FontSize(16).SemiBold();
+ });
+
+ card.Item().Column(body =>
+ {
+ body.Spacing(5);
+ body.Item().Text($"ID del Recibo: {r.Id}").FontSize(12).Bold();
+ body.Item().Text($"Fecha: {r.Fecha}").FontSize(12);
+ body.Item().Text($"Monto: {r.Monto}").FontSize(12);
+ body.Item().AlignCenter().Text("PAGO").FontSize(20).Bold();
+ });
+ });
+ });
+ });
+ }).GeneratePdf(pdfStream);
+
+ pdfStream.Position = 0;
+ return pdfStream;
+ }
+}
\ No newline at end of file
diff --git a/Entidades/Admin/PropiedadesAdmin.cs b/Entidades/Admin/PropiedadesAdmin.cs
index 25274e5..38149b7 100644
--- a/Entidades/Admin/PropiedadesAdmin.cs
+++ b/Entidades/Admin/PropiedadesAdmin.cs
@@ -9,4 +9,5 @@ public class PropiedadesAdmin {
public string? Servicios {get;set;} = "";
public int Monto { get; set; }
public string Estado { get; set; } = "";
+ public int Iddivisa { get; set; }
}
diff --git a/Entidades/Alquilafacilcontext.cs b/Entidades/Alquilafacilcontext.cs
index 8199acb..afd29c8 100644
--- a/Entidades/Alquilafacilcontext.cs
+++ b/Entidades/Alquilafacilcontext.cs
@@ -23,6 +23,8 @@ public partial class AlquilaFacilContext : DbContext
public virtual DbSet Defectos { get; set; }
+ public virtual DbSet Divisas { get; set; }
+
public virtual DbSet EstadoPropiedads { get; set; }
public virtual DbSet Estadodefectos { get; set; }
@@ -153,6 +155,8 @@ public partial class AlquilaFacilContext : DbContext
entity.HasIndex(e => e.Idventa, "FK_CON_VEN");
+ entity.HasIndex(e => e.Iddivisa, "FK_contdiv");
+
entity.Property(e => e.Id)
.HasColumnType("bigint(20)")
.HasColumnName("id");
@@ -174,6 +178,9 @@ public partial class AlquilaFacilContext : DbContext
entity.Property(e => e.Habilitado)
.HasColumnType("bit(1)")
.HasColumnName("habilitado");
+ entity.Property(e => e.Iddivisa)
+ .HasColumnType("int(11)")
+ .HasColumnName("iddivisa");
entity.Property(e => e.Idpropiedad)
.HasColumnType("int(11)")
.HasColumnName("idpropiedad");
@@ -183,6 +190,7 @@ public partial class AlquilaFacilContext : DbContext
entity.Property(e => e.Indiceactualizacion)
.HasPrecision(8)
.HasColumnName("indiceactualizacion");
+ entity.Property(e => e.MesesDurationContrato).HasColumnType("int(11)");
entity.Property(e => e.MesesHastaAumento).HasColumnType("int(11)");
entity.Property(e => e.Monto)
.HasPrecision(12)
@@ -204,6 +212,11 @@ public partial class AlquilaFacilContext : DbContext
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK_CON_PROPI");
+ entity.HasOne(d => d.IddivisaNavigation).WithMany(p => p.Contratos)
+ .HasForeignKey(d => d.Iddivisa)
+ .OnDelete(DeleteBehavior.Restrict)
+ .HasConstraintName("FK_contdiv");
+
entity.HasOne(d => d.IdpropiedadNavigation).WithMany(p => p.Contratos)
.HasForeignKey(d => d.Idpropiedad)
.OnDelete(DeleteBehavior.Restrict)
@@ -249,6 +262,8 @@ public partial class AlquilaFacilContext : DbContext
entity.HasIndex(e => e.Idestado, "FK_DEF_EST");
+ entity.HasIndex(e => e.Iddivisa, "FK_defdiv");
+
entity.Property(e => e.Id)
.HasColumnType("bigint(20)")
.HasColumnName("id");
@@ -256,11 +271,14 @@ public partial class AlquilaFacilContext : DbContext
.HasPrecision(12)
.HasColumnName("costo");
entity.Property(e => e.Descripcion)
- .HasMaxLength(40)
+ .HasMaxLength(100)
.HasColumnName("descripcion");
entity.Property(e => e.Idcontrato)
.HasColumnType("bigint(20)")
.HasColumnName("idcontrato");
+ entity.Property(e => e.Iddivisa)
+ .HasColumnType("int(11)")
+ .HasColumnName("iddivisa");
entity.Property(e => e.Idestado)
.HasColumnType("int(11)")
.HasColumnName("idestado");
@@ -273,12 +291,29 @@ public partial class AlquilaFacilContext : DbContext
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK_DEF_CON");
+ entity.HasOne(d => d.IddivisaNavigation).WithMany(p => p.Defectos)
+ .HasForeignKey(d => d.Iddivisa)
+ .OnDelete(DeleteBehavior.Restrict)
+ .HasConstraintName("FK_defdiv");
+
entity.HasOne(d => d.IdestadoNavigation).WithMany(p => p.Defectos)
.HasForeignKey(d => d.Idestado)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK_DEF_EST");
});
+ modelBuilder.Entity(entity =>
+ {
+ entity.HasKey(e => e.Id).HasName("PRIMARY");
+
+ entity.Property(e => e.Id)
+ .HasColumnType("int(11)")
+ .HasColumnName("id");
+ entity.Property(e => e.Signo)
+ .HasMaxLength(3)
+ .HasColumnName("signo");
+ });
+
modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
@@ -472,6 +507,8 @@ public partial class AlquilaFacilContext : DbContext
entity.HasIndex(e => e.Idtipropiedad, "FK_PROP_TIPO");
+ entity.HasIndex(e => e.Iddivisa, "FK_propdiv");
+
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("id");
@@ -481,6 +518,9 @@ public partial class AlquilaFacilContext : DbContext
entity.Property(e => e.Dnipropietario)
.HasColumnType("bigint(20)")
.HasColumnName("dnipropietario");
+ entity.Property(e => e.Iddivisa)
+ .HasColumnType("int(11)")
+ .HasColumnName("iddivisa");
entity.Property(e => e.Idestado)
.HasColumnType("int(11)")
.HasColumnName("idestado");
@@ -506,6 +546,11 @@ public partial class AlquilaFacilContext : DbContext
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK_PROP_PROPI");
+ entity.HasOne(d => d.IddivisaNavigation).WithMany(p => p.Propiedades)
+ .HasForeignKey(d => d.Iddivisa)
+ .OnDelete(DeleteBehavior.Restrict)
+ .HasConstraintName("FK_propdiv");
+
entity.HasOne(d => d.IdestadoNavigation).WithMany(p => p.Propiedades)
.HasForeignKey(d => d.Idestado)
.OnDelete(DeleteBehavior.Restrict)
@@ -596,6 +641,8 @@ public partial class AlquilaFacilContext : DbContext
entity.HasIndex(e => e.Idpropiedad, "FK_VEN_PROP");
+ entity.HasIndex(e => e.Iddivisa, "FK_ventdiv");
+
entity.Property(e => e.Id)
.HasColumnType("bigint(20)")
.HasColumnName("id");
@@ -611,6 +658,9 @@ public partial class AlquilaFacilContext : DbContext
entity.Property(e => e.IdVendedor)
.HasColumnType("bigint(20)")
.HasColumnName("idVendedor");
+ entity.Property(e => e.Iddivisa)
+ .HasColumnType("int(11)")
+ .HasColumnName("iddivisa");
entity.Property(e => e.Idestado)
.HasColumnType("int(11)")
.HasColumnName("idestado");
@@ -631,6 +681,11 @@ public partial class AlquilaFacilContext : DbContext
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK_VEN_PROL");
+ entity.HasOne(d => d.IddivisaNavigation).WithMany(p => p.Venta)
+ .HasForeignKey(d => d.Iddivisa)
+ .OnDelete(DeleteBehavior.Restrict)
+ .HasConstraintName("FK_ventdiv");
+
entity.HasOne(d => d.IdestadoNavigation).WithMany(p => p.Venta)
.HasForeignKey(d => d.Idestado)
.OnDelete(DeleteBehavior.Restrict)
diff --git a/Entidades/Contrato.cs b/Entidades/Contrato.cs
index fb566fd..bf539d2 100644
--- a/Entidades/Contrato.cs
+++ b/Entidades/Contrato.cs
@@ -33,12 +33,18 @@ public partial class Contrato
public ulong Cancelado { get; set; }
+ public int Iddivisa { get; set; }
+
+ public int MesesDurationContrato { get; set; }
+
public virtual ICollection Defectos { get; set; } = new List();
public virtual Cliente? DniinquilinoNavigation { get; set; }
public virtual Cliente? DnipropietarioNavigation { get; set; }
+ public virtual Divisa IddivisaNavigation { get; set; } = null!;
+
public virtual Propiedade? IdpropiedadNavigation { get; set; }
public virtual Venta? IdventaNavigation { get; set; }
diff --git a/Entidades/Defecto.cs b/Entidades/Defecto.cs
index 1147a55..6cc2269 100644
--- a/Entidades/Defecto.cs
+++ b/Entidades/Defecto.cs
@@ -17,7 +17,11 @@ public partial class Defecto
public ulong Pagainquilino { get; set; }
+ public int Iddivisa { get; set; }
+
public virtual Contrato? IdcontratoNavigation { get; set; }
+ public virtual Divisa IddivisaNavigation { get; set; } = null!;
+
public virtual Estadodefecto? IdestadoNavigation { get; set; }
}
diff --git a/Entidades/Divisa.cs b/Entidades/Divisa.cs
new file mode 100644
index 0000000..f9a5cb1
--- /dev/null
+++ b/Entidades/Divisa.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+
+namespace Entidades;
+
+public partial class Divisa
+{
+ public int Id { get; set; }
+
+ public string Signo { get; set; } = null!;
+
+ public virtual ICollection Contratos { get; set; } = new List();
+
+ public virtual ICollection Defectos { get; set; } = new List();
+
+ public virtual ICollection Propiedades { get; set; } = new List();
+
+ public virtual ICollection Venta { get; set; } = new List();
+}
diff --git a/Entidades/Dto/AltaDefectoDto.cs b/Entidades/Dto/AltaDefectoDto.cs
new file mode 100644
index 0000000..c8105ac
--- /dev/null
+++ b/Entidades/Dto/AltaDefectoDto.cs
@@ -0,0 +1,8 @@
+namespace Entidades.Dto;
+public class AltaDefectoDto {
+ public string Descripcion { get; set; } ="";
+ public Decimal Costo { get; set; }
+ public ulong Pagainquilino { get; set; }
+ public int Iddivisa { get; set; }
+ public long Idcontrato { get; set; }
+}
\ No newline at end of file
diff --git a/Entidades/Dto/AltaPropiedadDto.cs b/Entidades/Dto/AltaPropiedadDto.cs
index a549463..8517bd2 100644
--- a/Entidades/Dto/AltaPropiedadDto.cs
+++ b/Entidades/Dto/AltaPropiedadDto.cs
@@ -7,4 +7,5 @@ public class AltaPropiedadDto {
public string Email { get; set; } = string.Empty;
public int Idtipropiedad { get; set; }
public int Monto { get; set; }
+ public int Iddivisa { get; set; }
}
\ No newline at end of file
diff --git a/Entidades/Dto/AvisoInquilinoDto.cs b/Entidades/Dto/AvisoInquilinoDto.cs
new file mode 100644
index 0000000..eb5b886
--- /dev/null
+++ b/Entidades/Dto/AvisoInquilinoDto.cs
@@ -0,0 +1,5 @@
+namespace Entidades.Dto;
+public class AvisoInquilinoDto {
+ public string Mensaje { get; set; } ="";
+ public long Idpropiedad { get; set; }
+}
\ No newline at end of file
diff --git a/Entidades/Dto/CanonDto.cs b/Entidades/Dto/CanonDto.cs
new file mode 100644
index 0000000..21f7f59
--- /dev/null
+++ b/Entidades/Dto/CanonDto.cs
@@ -0,0 +1,10 @@
+namespace Entidades.Dto;
+public class CanonDto{
+ public long Id { get; set;}
+ public int MesNum { get; set;}
+ public DateTime Mes { get; set;}
+ public Decimal Monto { get; set;}
+ public string Divisa { get; set;} = "";
+ public bool Pago { get; set;}
+
+}
\ No newline at end of file
diff --git a/Entidades/Dto/Chart/Chartjs.cs b/Entidades/Dto/Chart/Chartjs.cs
new file mode 100644
index 0000000..c208dd5
--- /dev/null
+++ b/Entidades/Dto/Chart/Chartjs.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+public class ChartData
+{
+ [JsonPropertyName("labels")]
+ public List Labels { get; set; }=new();
+
+ [JsonPropertyName("datasets")]
+ public List Datasets { get; set; }=new();
+}
+
+public class Dataset
+{
+ [JsonPropertyName("label")]
+ public string Label { get; set; } ="";
+
+ [JsonPropertyName("data")]
+ public List Data { get; set; }= new();
+
+ [JsonPropertyName("borderWidth")]
+ public int BorderWidth { get; set; }=1;
+}
diff --git a/Entidades/Dto/ContratoDto.cs b/Entidades/Dto/ContratoDto.cs
new file mode 100644
index 0000000..5cd9cac
--- /dev/null
+++ b/Entidades/Dto/ContratoDto.cs
@@ -0,0 +1,11 @@
+namespace Entidades.Dto;
+public class ContratoDto {
+ public long id { get; set; }
+ public string Ubicacion { get; set; }="";
+ public string TipoPropiedad { get; set; }="";
+ public DateTime Fechainicio { get; set; }
+ public string Inquilino { get; set; }="";
+ public string Propietario { get; set; }="";
+ public string Estado {get; set;}="";
+
+}
\ No newline at end of file
diff --git a/Entidades/Dto/ContratoPropiedadDto.cs b/Entidades/Dto/ContratoPropiedadDto.cs
new file mode 100644
index 0000000..e19e368
--- /dev/null
+++ b/Entidades/Dto/ContratoPropiedadDto.cs
@@ -0,0 +1,8 @@
+namespace Entidades.Dto;
+public class ContratoPropiedadDto : ContratoDto {
+ public int Habitaciones { get; set; }
+ public int Piso { get; set;}
+ public string Letra { get; set; } = "";
+ public int MesesAumento { get; set; }
+ public int MesesDuracion { get; set; }
+}
\ No newline at end of file
diff --git a/Entidades/Dto/CrearCanonsDto.cs b/Entidades/Dto/CrearCanonsDto.cs
new file mode 100644
index 0000000..6d2fabc
--- /dev/null
+++ b/Entidades/Dto/CrearCanonsDto.cs
@@ -0,0 +1,6 @@
+namespace Entidades.Dto;
+
+public class CrearCanonsDto {
+ public long idcontrato{ get; set; }
+ public decimal aumento{ get; set; }
+}
\ No newline at end of file
diff --git a/Entidades/Dto/DefectoDto.cs b/Entidades/Dto/DefectoDto.cs
new file mode 100644
index 0000000..d28ea26
--- /dev/null
+++ b/Entidades/Dto/DefectoDto.cs
@@ -0,0 +1,10 @@
+namespace Entidades.Dto;
+public class DefectoDto {
+ public long Id { get; set;}
+ public string Descripcion { get; set;} ="";
+ public Decimal Costo { get; set;}
+ public string Estado { get; set;} ="";
+ public long Idcontrato { get; set;}
+ public string Pagainquilino { get; set;} ="";
+ public string Divisa { get; set;} ="";
+}
\ No newline at end of file
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/Entidades/Dto/PatchPropiedadDto.cs b/Entidades/Dto/PatchPropiedadDto.cs
index f7a01d5..3c2ec20 100644
--- a/Entidades/Dto/PatchPropiedadDto.cs
+++ b/Entidades/Dto/PatchPropiedadDto.cs
@@ -1,3 +1,3 @@
namespace Entidades.Dto;
-public record PatchPropiedadDto(int id, string Ubicacion, int Canthabitaciones, int? Piso, string? Letra, string Email, int tipo, List Servicios, int Monto);
+public record PatchPropiedadDto(int id, string Ubicacion, int Canthabitaciones, int? Piso, string? Letra, string Email, int tipo, List Servicios, int Monto, int Iddivisa);
diff --git a/Entidades/Dto/PrecontratoDto.cs b/Entidades/Dto/PrecontratoDto.cs
index 206889e..650e075 100644
--- a/Entidades/Dto/PrecontratoDto.cs
+++ b/Entidades/Dto/PrecontratoDto.cs
@@ -6,5 +6,6 @@ public class PrecontratoDto {
public int CantidadGarantes { get; set; }
public int MesesHastaAumento { get; set; }
public bool TieneOpcionVenta { get; set; }
- public string fechaprimernotificacion { get; set; }
+ public string fechaprimernotificacion { get; set; } = "";
+ public int MesesDuracionContrato { get; set; }
}
\ No newline at end of file
diff --git a/Entidades/Dto/PropiedadesDto.cs b/Entidades/Dto/PropiedadesDto.cs
index 274206f..d5e2c13 100644
--- a/Entidades/Dto/PropiedadesDto.cs
+++ b/Entidades/Dto/PropiedadesDto.cs
@@ -8,4 +8,5 @@ public class PropiedadesDto {
public string Tipo { get; set; } = "";
public string? Servicios {get;set;} = "";
public int Monto { get; set; }
+ public int Iddivisa { get; set; }
}
diff --git a/Entidades/Informes/InfomesAlquiler.cs b/Entidades/Informes/InfomesAlquiler.cs
new file mode 100644
index 0000000..a5900ff
--- /dev/null
+++ b/Entidades/Informes/InfomesAlquiler.cs
@@ -0,0 +1,6 @@
+namespace Entidades.Informes;
+public class InformesAlquiler {
+ public long Id { get; set; }
+ public string Ubicacion { get; set; }="";
+ public string Divisa { get; set; }="";
+}
\ No newline at end of file
diff --git a/Entidades/Informes/InformeMeses.cs b/Entidades/Informes/InformeMeses.cs
new file mode 100644
index 0000000..7442417
--- /dev/null
+++ b/Entidades/Informes/InformeMeses.cs
@@ -0,0 +1,17 @@
+namespace Entidades.Informes;
+public class InformesMeses {
+ public int Meses { get; set; }
+ public int Repes{ get; set; }
+ public string Semaforizacion {get {
+ switch(Repes.CompareTo(2)){
+ case 1:
+ return "🟢";
+ case 0:
+ return "🟡";
+ case -1:
+ return "🔴";
+ default:
+ return "";
+ }
+ }}
+}
\ No newline at end of file
diff --git a/Entidades/Permiso.cs b/Entidades/Permiso.cs
index ffaa3cb..e8da1b5 100644
--- a/Entidades/Permiso.cs
+++ b/Entidades/Permiso.cs
@@ -8,7 +8,7 @@ public partial class Permiso
{
public int Id { get; set; }
- public string? Descripcion { get; set; }
+ public string Descripcion { get; set; } = null!;
[JsonIgnore]
public virtual ICollection Idgrupos { get; set; } = new List();
diff --git a/Entidades/Propiedade.cs b/Entidades/Propiedade.cs
index 4a4812c..268fa3d 100644
--- a/Entidades/Propiedade.cs
+++ b/Entidades/Propiedade.cs
@@ -23,10 +23,14 @@ public partial class Propiedade
public decimal Monto { get; set; }
+ public int Iddivisa { get; set; }
+
public virtual ICollection Contratos { get; set; } = new List();
public virtual Cliente? DnipropietarioNavigation { get; set; }
+ public virtual Divisa IddivisaNavigation { get; set; } = null!;
+
public virtual EstadoPropiedad? IdestadoNavigation { get; set; }
public virtual TipoPropiedad IdtipropiedadNavigation { get; set; } = null!;
diff --git a/Entidades/Venta.cs b/Entidades/Venta.cs
index 4620380..200b45c 100644
--- a/Entidades/Venta.cs
+++ b/Entidades/Venta.cs
@@ -21,12 +21,16 @@ public partial class Venta
public DateTime? Fechafinal { get; set; }
+ public int Iddivisa { get; set; }
+
public virtual ICollection Contratos { get; set; } = new List();
public virtual Cliente? IdCompradorNavigation { get; set; }
public virtual Cliente? IdVendedorNavigation { get; set; }
+ public virtual Divisa IddivisaNavigation { get; set; } = null!;
+
public virtual Estadoventa? IdestadoNavigation { get; set; }
public virtual Propiedade? IdpropiedadNavigation { get; set; }
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/bun.lockb b/Front/bun.lockb
index 502d03b..dba69aa 100755
Binary files a/Front/bun.lockb and b/Front/bun.lockb differ
diff --git a/Front/index.html b/Front/index.html
index a051eac..89c9c3f 100644
--- a/Front/index.html
+++ b/Front/index.html
@@ -5,6 +5,7 @@
+
@@ -60,6 +65,11 @@
+
+
+
+
+
@@ -74,8 +84,16 @@
-
+
+
+
+
+
+
+
+
+
@@ -96,6 +114,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/Front/src/Componentes/AdminPropiedad.svelte b/Front/src/Componentes/AdminPropiedad.svelte
index a4f478b..bb1ce56 100644
--- a/Front/src/Componentes/AdminPropiedad.svelte
+++ b/Front/src/Componentes/AdminPropiedad.svelte
@@ -43,7 +43,13 @@
Piso: {prop.piso || "N/A"}
Letra: {prop.letra || "N/A"}
Servicios: {prop.servicios || "Sin servicios especificados"}
- Monto: ${prop.monto}
+ Monto:
+ {#if prop.iddivisa == 0}
+ AR$
+ {:else}
+ US$
+ {/if}
+ {prop.monto}
Estado: {prop.estado}
{#if prop.estado == "Disponible"}
diff --git a/Front/src/Componentes/Estadisticas/fChart.svelte b/Front/src/Componentes/Estadisticas/fChart.svelte
new file mode 100644
index 0000000..a57ec3c
--- /dev/null
+++ b/Front/src/Componentes/Estadisticas/fChart.svelte
@@ -0,0 +1,59 @@
+
+
+
+
+
+
diff --git a/Front/src/Componentes/FormAltaDefecto.svelte b/Front/src/Componentes/FormAltaDefecto.svelte
new file mode 100644
index 0000000..2cf9067
--- /dev/null
+++ b/Front/src/Componentes/FormAltaDefecto.svelte
@@ -0,0 +1,94 @@
+
+
+
diff --git a/Front/src/Componentes/ModalNotificacion.svelte b/Front/src/Componentes/ModalNotificacion.svelte
new file mode 100644
index 0000000..3c1ca23
--- /dev/null
+++ b/Front/src/Componentes/ModalNotificacion.svelte
@@ -0,0 +1,56 @@
+
+
+
+
diff --git a/Front/src/Componentes/ModalPedirDoc.svelte b/Front/src/Componentes/ModalPedirDoc.svelte
new file mode 100644
index 0000000..1615f74
--- /dev/null
+++ b/Front/src/Componentes/ModalPedirDoc.svelte
@@ -0,0 +1,44 @@
+
+
+
+
\ No newline at end of file
diff --git a/Front/src/Componentes/ModalPrecontrato.svelte b/Front/src/Componentes/ModalPrecontrato.svelte
index d3d5dd4..6f04d38 100644
--- a/Front/src/Componentes/ModalPrecontrato.svelte
+++ b/Front/src/Componentes/ModalPrecontrato.svelte
@@ -1,16 +1,16 @@
@@ -39,6 +39,10 @@
Meses Hasta Aumento
+
+ Meses Duracion Contrato
+
+
diff --git a/Front/src/Componentes/RowPropiedad.svelte b/Front/src/Componentes/RowPropiedad.svelte
index c9cdb15..d94093d 100644
--- a/Front/src/Componentes/RowPropiedad.svelte
+++ b/Front/src/Componentes/RowPropiedad.svelte
@@ -3,7 +3,7 @@
import ModalEstatico from "./ModalEstatico.svelte";
import ModificarPropiedadForm from "./modificarPropiedadForm.svelte";
- let { id, ubicacion, tipo, letra, piso,canthabitaciones, servicios, btnbaja = "Baja", monto } = $props();
+ let { id, ubicacion, tipo, letra, piso,canthabitaciones, servicios, btnbaja = "Baja", monto, iddivisa = 0 } = $props();
import { urlG } from "../stores/urlStore";
@@ -45,10 +45,17 @@
{piso}
{tipo}
{servicios}
+
+ {#if iddivisa == 0}
+ AR$
+ {:else}
+ US$
+ {/if}
+
{monto}
- setmod()}>Modificar
- BajaPropiedad()}>{btnbaja}
+ setmod()}>Modificar
+ BajaPropiedad()}>{btnbaja}
{#if modal}
@@ -57,7 +64,7 @@
{#if modificar}
-
+
{/if}
diff --git a/Front/src/Componentes/modificarPropiedadForm.svelte b/Front/src/Componentes/modificarPropiedadForm.svelte
index 709ec9b..4911810 100644
--- a/Front/src/Componentes/modificarPropiedadForm.svelte
+++ b/Front/src/Componentes/modificarPropiedadForm.svelte
@@ -2,7 +2,7 @@
import { urlG } from "../stores/urlStore";
import { onMount } from "svelte";
- let { canthabitaciones, id, letra, piso, tipo, ubicacion, servicios, monto } = $props();
+ let { canthabitaciones, id, letra, piso, tipo, ubicacion, servicios, monto, iddivisa} = $props();
let serviciosSeleccionados: string[] = $state([]);
const serviciosDisponibles = ["Gas", "Internet", "Telefono", "Luz"];
@@ -53,7 +53,8 @@
ubicacion,
email,
servicios: serviciosSeleccionados,
- monto
+ monto,
+ iddivisa
}),
});
if (response.ok) {
@@ -151,6 +152,29 @@
Tipo de propiedad
+
{#each serviciosDisponibles as servicio}
diff --git a/Front/src/paginas/ContratoInquilino.svelte b/Front/src/paginas/ContratoInquilino.svelte
new file mode 100644
index 0000000..9c297c1
--- /dev/null
+++ b/Front/src/paginas/ContratoInquilino.svelte
@@ -0,0 +1,424 @@
+
+
+
+
+{#if modaldata}
+
!!(modaldata = "")}/>
+{/if}
+
+{#if showmodal}
+ showmodal=false} onSubmit={pedirdocumento} />
+{/if}
+
+
+
+
+
+
+
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}
+
+ Ver Contrato
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dni
+ Nombre
+ Apellido
+ Domicilio
+ Dom. Laboral
+ Celular
+
+
+
+ {#each garantes as g}
+
+ {g.dni}
+ {g.nombre}
+ {g.apellido}
+ {g.domicilio}
+ {g.domiciliolaboral}
+ {g.celular}
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
+ {#each canons as canon}
+
+
+
+
+
Mes: {String(canon.mes).split("T")[0]}
+
Monto: {canon.monto}
+
Divisa: {canon.divisa}
+
Pago: {canon.pago ? "Sí" : "No"}
+
+
+
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Descripción
+ Costo
+ Estado
+ Paga Inquilino
+ Divisa
+
+
+
+ {#if defectos.length == 0}
+
+ No hay defectos que mostrar
+
+ {:else}
+ {#each defectos as defecto}
+
+ {defecto.descripcion}
+ {defecto.costo}
+ {defecto.estado}
+ {defecto.pagainquilino}
+ {defecto.divisa}
+
+ {/each}
+ {/if}
+
+
+
+
+
+
+
+
diff --git a/Front/src/paginas/ContratosPropietario.svelte b/Front/src/paginas/ContratosPropietario.svelte
new file mode 100644
index 0000000..012960b
--- /dev/null
+++ b/Front/src/paginas/ContratosPropietario.svelte
@@ -0,0 +1,516 @@
+
+
+
+
+{#if modaldata}
+ !!(modaldata = "")}/>
+{/if}
+
+{#if showmodal}
+ showmodal=false} onSubmit={pedirdocumento} />
+{/if}
+
+{#if shownotif}
+ shownotif = false} onConfirm={EscribirNotificacion}/>
+{/if}
+
+
+
+
+
+
+
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}
+
+
+ Ver Contrato
+
+
+ Enviar Notificacion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dni
+ Nombre
+ Apellido
+ Domicilio
+ Dom. Laboral
+ Celular
+
+
+
+ {#each garantes as g}
+
+ {g.dni}
+ {g.nombre}
+ {g.apellido}
+ {g.domicilio}
+ {g.domiciliolaboral}
+ {g.celular}
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
+ {#each canons as canon}
+
+
+
+
+
Mes: {String(canon.mes).split("T")[0]}
+
Monto: {canon.monto}
+
Divisa: {canon.divisa}
+
Pago: {canon.pago ? "Sí" : "No"}
+
+
+
+
+ {/each}
+ {#if max < prop.mesesDuracion}
+ {$inspect(max)}
+
+ {/if}
+
+
+
+
+
+
+
+
+
+
+
+ Descripción
+ Costo
+ Estado
+ Paga Inquilino
+ Divisa
+
+
+
+
+ {#if defectos.length == 0}
+
+ No hay defectos que mostrar
+
+ {:else}
+ {#each defectos as defecto}
+
+ {defecto.descripcion}
+ {defecto.costo}
+ {defecto.estado}
+ {defecto.pagainquilino}
+ {defecto.divisa}
+
+ {#if defecto.estado !== "Pagado"}
+ marcarDefectoPago(defecto)}>Marcar Pago
+
+ {/if}
+
+
+ {/each}
+ {/if}
+
+
+
+
+
+
+
+
diff --git a/Front/src/paginas/ControlAlquileresInquilino.svelte b/Front/src/paginas/ControlAlquileresInquilino.svelte
new file mode 100644
index 0000000..f6b6fe3
--- /dev/null
+++ b/Front/src/paginas/ControlAlquileresInquilino.svelte
@@ -0,0 +1,93 @@
+
+
+
+
+{#if modaldata }
+ !!(modaldata="")}/>
+{/if}
+
+
+
+
+
+ {#each alquileres as alquiler}
+
+
+
+
+
{alquiler.ubicacion}
+
+ Fecha de inicio: {new Date(alquiler.fechainicio).toLocaleDateString()}
+ Inquilino: {alquiler.inquilino}
+ Propietario: {alquiler.propietario}
+ Id Propiedad: {alquiler.id}
+
+
+ navigate("/inquilino/contratos?id="+alquiler.id)}>
+ Ver
+
+
+
+
+
+
+ {/each}
+
+
+{#if showButton }
+
+
+
+{/if}
\ No newline at end of file
diff --git a/Front/src/paginas/ControlAlquileresPropietario.svelte b/Front/src/paginas/ControlAlquileresPropietario.svelte
new file mode 100644
index 0000000..61bb251
--- /dev/null
+++ b/Front/src/paginas/ControlAlquileresPropietario.svelte
@@ -0,0 +1,93 @@
+
+
+
+
+{#if modaldata }
+ !!(modaldata="")}/>
+{/if}
+
+
+
+
+
+ {#each alquileres as alquiler}
+
+
+
+
+
{alquiler.ubicacion}
+
+ Fecha de inicio: {new Date(alquiler.fechainicio).toLocaleDateString()}
+ Inquilino: {alquiler.inquilino}
+ Propietario: {alquiler.propietario}
+ Id Propiedad: {alquiler.id}
+
+
+ navigate("/propietario/contratos?id="+alquiler.id)}>
+ Ver
+
+
+
+
+
+
+ {/each}
+
+
+{#if showButton }
+
+
+
+{/if}
\ No newline at end of file
diff --git a/Front/src/paginas/Informes.svelte b/Front/src/paginas/Informes.svelte
new file mode 100644
index 0000000..0802bd7
--- /dev/null
+++ b/Front/src/paginas/Informes.svelte
@@ -0,0 +1,186 @@
+
+
+{#if modaldata}
+ !!(modaldata = "")} />
+{/if}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #
+ Ubicacion
+ Divisa
+
+
+
+ {#each aldata as al}
+
+ {al.id}
+ {al.ubicacion}
+ {al.divisa}
+
+ {/each}
+
+
+
+
+ {#if cdata}
+
+ {/if}
+
+
+
+
+
+
+
+
+
+
Objetivo: Mide la longitud de los contratos en meses y cuantos hay por cada longitud. por lo menos 2.
+
+
+
+ Cantidad de meses
+ Repeticiones
+ Semaforización
+
+
+
+ {#each tablaMesesDuracion as mes}
+
+ {mes.meses}
+ {mes.repes}
+ {mes.semaforizacion}
+
+ {/each}
+
+
+
+
+ {#if chartMesesDuracion}
+
+ {/if}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Front/src/paginas/MisPropiedades.svelte b/Front/src/paginas/MisPropiedades.svelte
index 5f903a4..0f89e29 100644
--- a/Front/src/paginas/MisPropiedades.svelte
+++ b/Front/src/paginas/MisPropiedades.svelte
@@ -52,13 +52,16 @@
Piso
Tipo
Servicios
+ Divisa
Monto
{#each $propiedades as propiedad}
-
+
{/each}
diff --git a/Front/src/paginas/MisPropiedadesDeBaja.svelte b/Front/src/paginas/MisPropiedadesDeBaja.svelte
index 8c8424e..b3c8e6a 100644
--- a/Front/src/paginas/MisPropiedadesDeBaja.svelte
+++ b/Front/src/paginas/MisPropiedadesDeBaja.svelte
@@ -53,13 +53,14 @@
Piso
Tipo
Servicios
+ Divisa
Monto
{#each $propiedades as propiedad}
-
+
{/each}
diff --git a/Front/src/paginas/Notificaciones.svelte b/Front/src/paginas/Notificaciones.svelte
index 9ed6947..73ed655 100644
--- a/Front/src/paginas/Notificaciones.svelte
+++ b/Front/src/paginas/Notificaciones.svelte
@@ -130,6 +130,11 @@
Selmens = {...mensaje};
return;
}
+
+ if (mensaje.accion === "Notificacion Inquilino") {
+ Selmens = {...mensaje};
+ return;
+ }
}
async function obtenerListaGarantes(idcontrato: number) {
@@ -156,8 +161,8 @@
}
}
- async function handleEnviarmensaje2(data: {opcionVenta:boolean, cantGarantes:number, mesesHastaAumento:number}) {
- if (data.opcionVenta == null || data.cantGarantes <=0 || data.mesesHastaAumento<=0) {
+ async function handleEnviarmensaje2(data: {opcionVenta:boolean, cantGarantes:number, mesesHastaAumento:number, mesesDuracionContrato:number}) {
+ if (data.opcionVenta == null || data.cantGarantes <=0 || data.mesesHastaAumento<=0 || data.mesesDuracionContrato <=0) {
modaldata = "Estan mal cargados los datos del form";
return;
}
@@ -170,8 +175,9 @@
cantidadGarantes: data.cantGarantes,
idPropiedad: Selmens.propiedad,
fechaprimernotificacion: fecha,
- emailInquilino: localStorage.getItem("email"),
+ emailInquilino: Selmens.remitente,
emailPropietario: Selmens.receptor,
+ mesesDuracionContrato: data.mesesDuracionContrato
};
let responce = await fetch($urlG+"/api/contratos/precontrato", {
@@ -421,6 +427,8 @@
(Selmens.accion = "")} onConfirm={handleEnviarmensaje4}/>
{:else if Selmens.accion == "Aceptar Contrato"}
(Selmens.accion = "")} onConfirm={handleAceptarContrato} onCancel={handlerechazarcontrato} getContrato={ObtenerContrato} men={Selmens}/>
+{:else if Selmens.accion == "Notificacion Inquilino"}
+ !!(Selmens.accion = "") }/>
{/if}
@@ -459,7 +467,7 @@
{#if mensajes.length <= 0}
-
+
No hay Mensajes para leer
@@ -481,10 +489,11 @@
Expandir
{/if}
- {#if men.accion === "ContratoCancelado" || men.accion === "Rechazo Contrato" ||
- men.accion === "Aceptado Contrato"}
+ {#if (men.accion === "ContratoCancelado" || men.accion === "Rechazo Contrato" ||
+ men.accion === "Aceptado Contrato" || men.accion === "Notificacion Inquilino"
+ ) && mostrarleidos == false}
marcarleido(men.fecha, localStorage.getItem("email")|| "", men)}>
Marcar Leido
diff --git a/Front/src/paginas/PublicarPropiedad.svelte b/Front/src/paginas/PublicarPropiedad.svelte
index 34fc13b..cf507f0 100644
--- a/Front/src/paginas/PublicarPropiedad.svelte
+++ b/Front/src/paginas/PublicarPropiedad.svelte
@@ -5,15 +5,16 @@
import type { Propiedad } from "../types";
import { urlG } from "../stores/urlStore";
- let propiedad: Propiedad = {
+ let propiedad = $state({
ubicacion: "",
canthabitaciones: 1,
piso: 0,
letra: "",
email: localStorage.getItem("email") || "",
idtipropiedad: 1,
+ iddivisa:0,
monto: 1,
- };
+ });
let token = sessionStorage.getItem("token");
let mostrarModal = $state(false);
@@ -116,6 +117,31 @@
/>
Letra
+
+
+