diff --git a/Aspnet/Controllers/AdminController.cs b/Aspnet/Controllers/AdminController.cs index 1941782..b699e9c 100644 --- a/Aspnet/Controllers/AdminController.cs +++ b/Aspnet/Controllers/AdminController.cs @@ -106,4 +106,44 @@ public class AdminController: ControllerBase var ret = RepositorioUsuarios.Singleton.BajaCliente(Dni); return Ok(ret); } + + [HttpDelete("api/admin/propiedad")] + public IActionResult BajaPropiedad([FromHeader(Name = "Auth")] string Auth, int id = 0) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 10); + if (validacion1 == false) return Unauthorized(); + + if (id <= 0) return BadRequest(new { message = "Falto indicar id Propiedad"}); + + var ret = RepositorioPropiedades.Singleton.BajaPropiedad(id); + return ret ? + Ok(new {message = "Se cambio el estado de la propiedad"}): BadRequest(new { message = "No se pudo dar de baja"}); + } + + [HttpGet("api/admin/busqueda/paginada")] + public IActionResult FiltroPropiedadesPaginado([FromHeader(Name = "Auth")]string Auth, int cantidadHabitaciones = 0, int tipoPropiedad = 0, [FromQuery]string servicios = "", int pag = 1) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 10); + if (validacion1 == false) return Unauthorized(); + + IQueryable? props = null; + pag -= 1; + + var clave = $"{(cantidadHabitaciones != 0 ? "1" : "0")}{(tipoPropiedad != 0 ? "1" : "0")}{(!string.IsNullOrEmpty(servicios) ? "1" : "0")}"; + var gen = AdminBusquedaContext.Singleton; + var estrategia = gen.ObtenerEstrategia(clave); + props = estrategia.Filtrar(servicios, cantidadHabitaciones, tipoPropiedad, pag); + + return Ok(props); + } + + [HttpGet("api/admin/busqueda/cantPag")] + public IActionResult CantidadPaginas([FromHeader(Name = "Auth")]string Auth, int cantidadHabitaciones = 0, int tipoPropiedad = 0, [FromQuery]string servicios = "") { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 10); + if (validacion1 == false) return Unauthorized(); + + int ret = RepositorioPropiedades.Singleton.CuantasPaginasBusqueda(cantidadHabitaciones, servicios, tipoPropiedad, 0); + return Ok(new { message = ret}); + } } \ No newline at end of file diff --git a/Aspnet/Controllers/BusquedaControler.cs b/Aspnet/Controllers/BusquedaControler.cs index 71a1aae..5321f3d 100644 --- a/Aspnet/Controllers/BusquedaControler.cs +++ b/Aspnet/Controllers/BusquedaControler.cs @@ -35,4 +35,15 @@ public class BusquedaController: ControllerBase { return Ok(props); } + + [HttpGet("api/busqueda/cantPag")] + public IActionResult GetCantPag([FromHeader(Name = "Auth")]string Auth, int cantidadHabitaciones = 0, int tipoPropiedad = 0, [FromQuery]string servicios = "") { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 3); + if (validacion1 == false) return Unauthorized(); + + int ret = RepositorioPropiedades.Singleton.CuantasPaginasBusqueda(cantidadHabitaciones, servicios, tipoPropiedad, 1); + return Ok(new { message = ret}); + + } } diff --git a/Front/src/App.svelte b/Front/src/App.svelte index 2c8e293..03d0ecd 100644 --- a/Front/src/App.svelte +++ b/Front/src/App.svelte @@ -14,7 +14,9 @@ import FrontPropietario from "./paginas/grupos/PropietarioG.svelte"; import PublicarPropiedad from "./paginas/PublicarPropiedad.svelte"; import BusquedaPropiedades from "./paginas/BusquedaPropiedades.svelte"; - import ControlUsuarios from "./paginas/ControlUsuarios.svelte"; + import ControlUsuarios from "./paginas/AdminUsuarios.svelte"; + import ControlPropiedades from "./paginas/AdminPropiedades.svelte"; + import Notificaciones from "./paginas/Notificaciones.svelte"; @@ -82,6 +84,10 @@ + + + + diff --git a/Front/src/Componentes/NavBarAutocompletable.svelte b/Front/src/Componentes/NavBarAutocompletable.svelte index 4250159..76ce643 100644 --- a/Front/src/Componentes/NavBarAutocompletable.svelte +++ b/Front/src/Componentes/NavBarAutocompletable.svelte @@ -63,13 +63,16 @@ Volver al MenĂº - + (isOpen = !isOpen)} /> diff --git a/Front/src/paginas/Notificaciones.svelte b/Front/src/paginas/Notificaciones.svelte new file mode 100644 index 0000000..e260581 --- /dev/null +++ b/Front/src/paginas/Notificaciones.svelte @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/Modelo/RepositorioPropiedades.cs b/Modelo/RepositorioPropiedades.cs index 7bc44de..02a2b22 100644 --- a/Modelo/RepositorioPropiedades.cs +++ b/Modelo/RepositorioPropiedades.cs @@ -341,4 +341,246 @@ public class RepositorioPropiedades: RepositorioBase { } return Guardar(con); } + + public IQueryable ListarPropiedadesPorPagina(int pag) { + FormattableString sqlq = $""" + SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, + GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto + FROM Propiedades p + JOIN EstadoPropiedad ep ON p.idestado = 1 + JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id + JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad + JOIN Servicios s on sp.idServicio =s.id + GROUP BY p.id + LIMIT 10 OFFSET {pag*10} + """; + + var ret = Context.Database.SqlQuery(sqlq); + return ret; + } + ///////////////ADMIN + public IQueryable ListarPropiedadesPorPaginaAdmin(int pag) { + FormattableString sqlq = $""" + SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, + GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado + FROM Propiedades p + JOIN EstadoPropiedad ep ON p.idestado = ep.id + JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id + JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad + JOIN Servicios s on sp.idServicio =s.id + GROUP BY p.id + LIMIT 10 OFFSET {pag*10} + """; + + var ret = Singleton.Context.Database.SqlQuery(sqlq); + return ret; + } + + + public IQueryable ObtenerPropiedesPorHabitacionesPaginado(int cantidadHabitaciones, int pag) { + FormattableString sqlq = $""" + SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, + GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado + FROM Propiedades p + JOIN EstadoPropiedad ep ON p.idestado = ep.id + JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id + JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad + JOIN Servicios s on sp.idServicio =s.id + WHERE p.canthabitaciones = {cantidadHabitaciones} + GROUP BY p.id + LIMIT 10 OFFSET {pag*10} + """; + + var ret = Singleton.Context.Database.SqlQuery(sqlq); + return ret; + } + + public IQueryable ObtenerPropiedesPorTipoPaginado(int tipoPropiedad, int pag) { + FormattableString sqlq = $""" + SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, + GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado + FROM Propiedades p + JOIN EstadoPropiedad ep ON p.idestado = ep.id + JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id + JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad + JOIN Servicios s on sp.idServicio =s.id + WHERE p.idtipropiedad = {tipoPropiedad} + GROUP BY p.id + LIMIT 10 OFFSET {pag*10} + """; + + var ret = Singleton.Context.Database.SqlQuery(sqlq); + return ret; + } + + public IQueryable ObtenerPropiedesPorHabitaciones_TipoPaginado(int cantidadHabitaciones, int tipoPropiedad, int pag) { + FormattableString sqlq = $""" + SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, + GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado + FROM Propiedades p + JOIN EstadoPropiedad ep ON p.idestado = ep.id + JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id + JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad + JOIN Servicios s on sp.idServicio =s.id + WHERE p.canthabitaciones = {cantidadHabitaciones} AND p.idtipropiedad = {tipoPropiedad} + GROUP BY p.id + LIMIT 10 OFFSET {pag*10} + """; + + var ret = Singleton.Context.Database.SqlQuery(sqlq); + return ret; + } + + public IQueryable ObtenerPropiedesPorServiciosPaginado(string servicios, int pag) { + string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); + + FormattableString sqlq = $""" + SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, + GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado + FROM Propiedades p + JOIN EstadoPropiedad ep ON p.idestado = ep.id + JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id + JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad + JOIN Servicios s on sp.idServicio =s.id + WHERE EXISTS ( + SELECT 1 + FROM Servicio_Propiedad sp2 + JOIN Servicios s2 ON sp2.idServicio = s2.id + WHERE sp2.idPropiedad = p.id + AND FIND_IN_SET(s2.descripcion, {serviciosEscapados}) + ) + GROUP BY p.id + LIMIT 10 OFFSET {pag*10} + """; + + var ret = Singleton.Context.Database.SqlQuery(sqlq); + return ret; + } + + public IQueryable ObtenerPropiedesPorHabitaciones_Servicios_Paginado(int cantidadHabitaciones, string servicios, int pag) { + string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); + FormattableString sqlq = $""" + SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, + GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado + FROM Propiedades p + JOIN EstadoPropiedad ep ON p.idestado = ep.id + JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id + JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad + JOIN Servicios s on sp.idServicio =s.id + WHERE p.canthabitaciones = {cantidadHabitaciones} + AND EXISTS ( + SELECT 1 + FROM Servicio_Propiedad sp2 + JOIN Servicios s2 ON sp2.idServicio = s2.id + WHERE sp2.idPropiedad = p.id + AND FIND_IN_SET(s2.descripcion, {serviciosEscapados}) + ) + GROUP BY p.id + LIMIT 10 OFFSET {pag*10} + """; + + var ret = Singleton.Context.Database.SqlQuery(sqlq); + return ret; + } + + public IQueryable ObtenerPropiedesPorTipo_Servicios_Paginado(int tipoPropiedad, string servicios, int pag) { + string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); + FormattableString sqlq = $""" + SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, + GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado + FROM Propiedades p + JOIN EstadoPropiedad ep ON p.idestado = ep.id + JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id + JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad + JOIN Servicios s on sp.idServicio =s.id + WHERE p.idtipropiedad = {tipoPropiedad} + AND EXISTS ( + SELECT 1 + FROM Servicio_Propiedad sp2 + JOIN Servicios s2 ON sp2.idServicio = s2.id + WHERE sp2.idPropiedad = p.id + AND FIND_IN_SET(s2.descripcion, {serviciosEscapados}) + ) + GROUP BY p.id + LIMIT 10 OFFSET {pag*10} + """; + + var ret = Singleton.Context.Database.SqlQuery(sqlq); + return ret; + } + + public IQueryable ObtenerPropiedesPorHabitaciones_Tipo_Servicios_Paginado(int habitaciones, int tipo, string servicios, int pag) { + string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); + FormattableString sqlq = $""" + SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, + GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado + FROM Propiedades p + JOIN EstadoPropiedad ep ON p.idestado = ep.id + JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id + JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad + JOIN Servicios s on sp.idServicio =s.id + WHERE p.canthabitaciones = {habitaciones} AND p.idtipropiedad = {tipo} + AND EXISTS ( + SELECT 1 + FROM Servicio_Propiedad sp2 + JOIN Servicios s2 ON sp2.idServicio = s2.id + WHERE sp2.idPropiedad = p.id + AND FIND_IN_SET(s2.descripcion, {serviciosEscapados}) + ) + GROUP BY p.id + LIMIT 10 OFFSET {pag*10} + """; + + var ret = Singleton.Context.Database.SqlQuery(sqlq); + return ret; + } + + public int CuantasPaginas(int estado = 0) { + var con = Context; + double inter; + int ret; + + if (estado == 0){ + inter = con.Propiedades.Count()/10.0; + } else { + inter = con.Propiedades.Where(x=>x.Idestado == estado).Count(); + } + if (inter == 0.00) return 0; + ret = (int)Math.Ceiling(inter); + + return ret; + } + + public int CuantasPaginasBusqueda(int habitaciones, string servicios, int tipoPropiedad, int estado) { + int registrosPorPagina = 10; + + var query = Context.Propiedades + .Include(p => p.IdestadoNavigation) + .Include(p => p.IdtipropiedadNavigation) + .Include(p => p.IdServicios) + .AsQueryable(); + + if (habitaciones > 0) { + query = query.Where(p => p.Canthabitaciones == habitaciones); + } + + if (estado > 0){ + query = query.Where(x=>x.Idestado == estado); + } + + if (tipoPropiedad > 0) { + query = query.Where(p => p.Idtipropiedad == tipoPropiedad); + } + + if (!string.IsNullOrWhiteSpace(servicios)) { + var listaServicios = servicios.Split(',').Select(s => s.Trim()).ToList(); + query = query.Where(p => + p.IdServicios.Any(sp => + listaServicios.Contains(sp.Descripcion))); + } + + int totalRegistros = query.Distinct().Count(); + + return (int)Math.Ceiling((double)totalRegistros / registrosPorPagina); + } } \ No newline at end of file