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 =$""" + + + + + + +
+
+
+ AlquilaFácil +
+
+
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 @@ + + +
+
+
+ + + + {n}/100 + +
+ + +
+ $ + +
+ +
+
+ + +
+
+ + +
+
+ +
+ + +
+ + +
+
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 @@ +
+ + +
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} - - + + {#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 @@ +
+
Moneda
+
+ + +
+
+ + +
+
Servicios
{#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} + +
+
+
+
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} +
+
+
+
+
+

+ +

+
+
+
+
+ Notificar Defecto en Propiedad +
+
+ +
+ +
+
+ + + + + + + + + + + + {#if defectos.length == 0} + + + + {:else} + {#each defectos as defecto} + + + + + + + + {/each} + {/if} + +
DescripciónCostoEstadoPaga InquilinoDivisa
No hay defectos que mostrar
{defecto.descripcion}{defecto.costo}{defecto.estado}{defecto.pagainquilino}{defecto.divisa}
+
+
+
+
+
+
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} + +
+
+
+
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} + {#if max < prop.mesesDuracion} + {$inspect(max)} +
+
+ Definir el interés para los siguientes Canones +
+
+
+
+ + % +
+
+ +
+
+
+ {/if} +
+
+
+
+
+

+ +

+
+
+ + + + + + + + + + + + + {#if defectos.length == 0} + + + + {:else} + {#each defectos as defecto} + + + + + + + + + {/each} + {/if} + +
DescripciónCostoEstadoPaga InquilinoDivisa
No hay defectos que mostrar
{defecto.descripcion}{defecto.costo}{defecto.estado}{defecto.pagainquilino}{defecto.divisa} + {#if defecto.estado !== "Pagado"} + + + {/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.tipoPropiedad}
+
+
+
{alquiler.ubicacion}
+

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

+
+ +
+
+ +
+
+ {/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.tipoPropiedad}
+
+
+
{alquiler.ubicacion}
+

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

+
+ +
+
+ +
+
+ {/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} + + + +
+
+ +
+
+

+ +

+
+
+
+
+ + +
+ + + + + + + + + + {#each aldata as al} + + + + + + {/each} + +
#UbicacionDivisa
{al.id}{al.ubicacion}{al.divisa}
+
+
+ {#if cdata} + + {/if} +
+
+
+
+
+

+ +

+
+
+
+

Objetivo: Mide la longitud de los contratos en meses y cuantos hay por cada longitud. por lo menos 2.

+ + + + + + + + + + {#each tablaMesesDuracion as mes} + + + + + + {/each} + +
Cantidad de mesesRepeticionesSemaforización
{mes.meses}{mes.repes}{mes.semaforizacion}
+
+
+ {#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} 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 @@ />
+ +
+
Moneda
+
+ + +
+
+ + +
+
+