From 0a9ac0a78772ba48f0831169719563fc5758cd8a Mon Sep 17 00:00:00 2001 From: fede Date: Fri, 3 Jan 2025 01:52:35 -0300 Subject: [PATCH 1/2] Avansamos mucho con el administracion propiedades --- Aspnet/Controllers/AdminController.cs | 45 ++++ Aspnet/Controllers/BusquedaControler.cs | 29 +- Aspnet/Controllers/PropiedadesController.cs | 34 ++- Aspnet/Strategy/Busqueda/BusquedaContext.cs | 29 ++ Aspnet/Strategy/Busqueda/Filtros.cs | 52 ++++ Aspnet/Strategy/Busqueda/IBusquedaStrategy.cs | 6 + Aspnet/Strategy/BusquedaAdmin/Filtros.cs | 52 ++++ .../BusquedaAdmin/IAdminBusquedaStrategy.cs | 6 + Entidades/Admin/PropiedadesAdmin.cs | 12 + Front/src/App.svelte | 12 +- .../src/Componentes/AdminPanelBusqueda.svelte | 86 ++++++ Front/src/Componentes/AdminPropiedad.svelte | 59 ++++ .../src/Componentes/PaginacionStepper.svelte | 35 +++ Front/src/Componentes/PanelBusqueda.svelte | 5 +- Front/src/paginas/AdminPropiedades.svelte | 122 +++++++++ ...olUsuarios.svelte => AdminUsuarios.svelte} | 2 +- Front/src/paginas/BusquedaPropiedades.svelte | 3 + Front/src/types.d.ts | 19 ++ Modelo/RepositorioPropiedades.cs | 255 ++++++++++++++++-- 19 files changed, 818 insertions(+), 45 deletions(-) create mode 100644 Aspnet/Strategy/Busqueda/BusquedaContext.cs create mode 100644 Aspnet/Strategy/Busqueda/Filtros.cs create mode 100644 Aspnet/Strategy/Busqueda/IBusquedaStrategy.cs create mode 100644 Aspnet/Strategy/BusquedaAdmin/Filtros.cs create mode 100644 Aspnet/Strategy/BusquedaAdmin/IAdminBusquedaStrategy.cs create mode 100644 Entidades/Admin/PropiedadesAdmin.cs create mode 100644 Front/src/Componentes/AdminPanelBusqueda.svelte create mode 100644 Front/src/Componentes/AdminPropiedad.svelte create mode 100644 Front/src/Componentes/PaginacionStepper.svelte create mode 100644 Front/src/paginas/AdminPropiedades.svelte rename Front/src/paginas/{ControlUsuarios.svelte => AdminUsuarios.svelte} (99%) diff --git a/Aspnet/Controllers/AdminController.cs b/Aspnet/Controllers/AdminController.cs index 1941782..2d00ac2 100644 --- a/Aspnet/Controllers/AdminController.cs +++ b/Aspnet/Controllers/AdminController.cs @@ -3,6 +3,7 @@ using Modelo; using Entidades.Admin; using Entidades.Dto; using Entidades; +using System.Linq.Expressions; namespace AlquilaFacil.Controllers; [ApiController] @@ -106,4 +107,48 @@ 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; + if (servicios == ""){ + //no hay parametros de busqueda + if (cantidadHabitaciones == 0 && tipoPropiedad == 0 ) props = RepositorioPropiedades.Singleton.ListarPropiedadesPorPaginaAdmin(pag); + //Solo Habitaciones + if (cantidadHabitaciones != 0 && tipoPropiedad == 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitacionesPaginado(cantidadHabitaciones, pag); + //Solo TipoPropiedad + if (cantidadHabitaciones == 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipoPaginado(tipoPropiedad, pag); + //Habitaciones y TipoPropiedad + if (cantidadHabitaciones != 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_TipoPaginado(cantidadHabitaciones, tipoPropiedad, pag); + } else { + //Solo se filtra por servicios + if (cantidadHabitaciones == 0 && tipoPropiedad == 0 ) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorServiciosPaginado(servicios, pag); + //Servicios y habitaciones + if (cantidadHabitaciones != 0 && tipoPropiedad == 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Servicios_Paginado(cantidadHabitaciones, servicios, pag); + //Tipo y Servicios + if (cantidadHabitaciones == 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo_Servicios_Paginado(tipoPropiedad, servicios, pag); + // Todos los parametros + if (cantidadHabitaciones != 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo_Servicios_Paginado(cantidadHabitaciones, tipoPropiedad, servicios, pag); + } + + return Ok(props); + } } \ No newline at end of file diff --git a/Aspnet/Controllers/BusquedaControler.cs b/Aspnet/Controllers/BusquedaControler.cs index 71a1aae..efd224c 100644 --- a/Aspnet/Controllers/BusquedaControler.cs +++ b/Aspnet/Controllers/BusquedaControler.cs @@ -1,6 +1,8 @@ using Entidades.Dto; using Modelo; using Microsoft.AspNetCore.Mvc; +using Entidades.Admin; +using AlquilaFacil.StrategyBusqueda; namespace AlquilaFacil.Controllers; @@ -13,26 +15,13 @@ public class BusquedaController: ControllerBase { if (validacion1 == false) return Unauthorized(); IQueryable? props = null; - if (servicios == ""){ - //no hay parametros de busqueda - if (cantidadHabitaciones == 0 && tipoPropiedad == 0 ) props = RepositorioPropiedades.Singleton.ListarPropiedades(); - //Solo Habitaciones - if (cantidadHabitaciones != 0 && tipoPropiedad == 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones(cantidadHabitaciones); - //Solo TipoPropiedad - if (cantidadHabitaciones == 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo(tipoPropiedad); - //Habitaciones y TipoPropiedad - if (cantidadHabitaciones != 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo(cantidadHabitaciones, tipoPropiedad); - } else { - //Solo se filtra por servicios - if (cantidadHabitaciones == 0 && tipoPropiedad == 0 ) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorServicios(servicios); - //Servicios y habitaciones - if (cantidadHabitaciones != 0 && tipoPropiedad == 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Servicios(cantidadHabitaciones, servicios); - //Tipo y Servicios - if (cantidadHabitaciones == 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo_Servicios(tipoPropiedad, servicios); - // Todos los parametros - if (cantidadHabitaciones != 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo_Servicios(cantidadHabitaciones, tipoPropiedad, servicios); - } + + var clave = $"{(cantidadHabitaciones != 0 ? "1" : "0")}{(tipoPropiedad != 0 ? "1" : "0")}{(!string.IsNullOrEmpty(servicios) ? "1" : "0")}"; - return Ok(props); + var context = BusquedaContext.Singleton; + var estrategia = context.ObtenerEstrategia(clave); + props = estrategia.Filtrar(servicios, cantidadHabitaciones, tipoPropiedad); + + return Ok(props); } } diff --git a/Aspnet/Controllers/PropiedadesController.cs b/Aspnet/Controllers/PropiedadesController.cs index 0a7a5c2..0da73b7 100644 --- a/Aspnet/Controllers/PropiedadesController.cs +++ b/Aspnet/Controllers/PropiedadesController.cs @@ -8,20 +8,27 @@ namespace AlquilaFacil.Controllers; [ApiController] public class PropiedadesController: ControllerBase { [HttpGet("api/propiedades")] - public IActionResult ListarPropiedades([FromHeader(Name = "Auth")] string Auth) { + public IActionResult ListarPropiedades([FromHeader(Name = "Auth")] string Auth, int pag = 0) { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 10); if (validacion1 == false) validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 2); if (validacion1 == false) return Unauthorized(); - var ret = RepositorioPropiedades.Singleton.ListarPropiedades(); + IQueryable ret; + + if (pag == 0){ + ret = RepositorioPropiedades.Singleton.ListarPropiedades(); + } else{ + ret = RepositorioPropiedades.Singleton.ListarPropiedadesPorPagina(pag); + } + return Ok(ret); } [HttpGet("api/propiedad")] public IActionResult ObtenerPropiedadPorId(int Id, [FromHeader(Name = "Auth")] string Auth) { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 10); if (validacion1 == false) return Unauthorized(); if (Id < 0) return BadRequest(new {message ="la id de propiedad no puede ser negativa"}); @@ -31,6 +38,25 @@ public class PropiedadesController: ControllerBase { return Ok(ret); } + [HttpGet("api/propiedad/cantPagina")] + public IActionResult ObtenerCantidadDePaginas([FromHeader(Name = "Auth")] string Auth, int estado = 0) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 10); + if (validacion1 == false) return Unauthorized(); + + if (estado < 0) return BadRequest(new {message = "No puede tener un numero menor a 0"}); + int cant; + + if(estado == 0){ + cant = RepositorioPropiedades.Singleton.CuantasPaginas(); + }else{ + cant = RepositorioPropiedades.Singleton.CuantasPaginas(estado); + } + + return Ok(new {message = cant}); + + } + [HttpGet("api/propiedades/Propietario")] public IActionResult ObtenerPropiedadesPorPropietario ( [FromHeader(Name = "Email")] string email, diff --git a/Aspnet/Strategy/Busqueda/BusquedaContext.cs b/Aspnet/Strategy/Busqueda/BusquedaContext.cs new file mode 100644 index 0000000..497272b --- /dev/null +++ b/Aspnet/Strategy/Busqueda/BusquedaContext.cs @@ -0,0 +1,29 @@ +namespace AlquilaFacil.StrategyBusqueda; + +public class BusquedaContext +{ + private static readonly BusquedaContext singleton = new(); + public static BusquedaContext Singleton {get { return singleton; } } + + private readonly Dictionary _estrategias; + + public BusquedaContext() + { + _estrategias = new Dictionary + { + { "000", new BusquedaSinParametros() }, + { "100", new BusquedaPorHabitaciones() }, + { "010", new BusquedaPorTipo() }, + { "001", new BusquedaPorServicios() }, + { "110", new BusquedaPorHabitacionesTipo() }, + { "101", new BusquedaPorHabitacionesServicios() }, + { "011", new BusquedaTipoServicios() }, + { "111", new BusquedaFull() } + }; + } + + public IBusquedaStrategy ObtenerEstrategia(string clave) + { + return _estrategias.ContainsKey(clave) ? _estrategias[clave] : new BusquedaSinParametros(); + } +} \ No newline at end of file diff --git a/Aspnet/Strategy/Busqueda/Filtros.cs b/Aspnet/Strategy/Busqueda/Filtros.cs new file mode 100644 index 0000000..e50c434 --- /dev/null +++ b/Aspnet/Strategy/Busqueda/Filtros.cs @@ -0,0 +1,52 @@ +using Entidades.Dto; +using Modelo; + +namespace AlquilaFacil.StrategyBusqueda; + +public class BusquedaSinParametros : IBusquedaStrategy { + public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad) { + return RepositorioPropiedades.Singleton.ListarPropiedades(); + } +} + +public class BusquedaPorHabitaciones : IBusquedaStrategy { + public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones(cantidadHabitaciones); + } +} + +public class BusquedaPorTipo : IBusquedaStrategy { + public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo(tipoPropiedad); + } +} + +public class BusquedaPorServicios : IBusquedaStrategy { + public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorServicios(servicios); + } +} + +public class BusquedaPorHabitacionesTipo : IBusquedaStrategy { + public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo(cantidadHabitaciones, tipoPropiedad); + } +} + +public class BusquedaPorHabitacionesServicios : IBusquedaStrategy { + public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Servicios(cantidadHabitaciones, servicios); + } +} + +public class BusquedaTipoServicios : IBusquedaStrategy { + public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo_Servicios(tipoPropiedad, servicios); + } +} + +public class BusquedaFull : IBusquedaStrategy { + public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo_Servicios(cantidadHabitaciones, tipoPropiedad, servicios); + } +} \ No newline at end of file diff --git a/Aspnet/Strategy/Busqueda/IBusquedaStrategy.cs b/Aspnet/Strategy/Busqueda/IBusquedaStrategy.cs new file mode 100644 index 0000000..4a3f411 --- /dev/null +++ b/Aspnet/Strategy/Busqueda/IBusquedaStrategy.cs @@ -0,0 +1,6 @@ +namespace AlquilaFacil.StrategyBusqueda; +using Entidades.Dto; +public interface IBusquedaStrategy { + IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad); +} + diff --git a/Aspnet/Strategy/BusquedaAdmin/Filtros.cs b/Aspnet/Strategy/BusquedaAdmin/Filtros.cs new file mode 100644 index 0000000..e47106d --- /dev/null +++ b/Aspnet/Strategy/BusquedaAdmin/Filtros.cs @@ -0,0 +1,52 @@ +using Entidades.Admin; +using Modelo; + +namespace AlquilaFacil.StrategyBusquedaAdmin; + +public class BusquedaSinParametros : IAdminBusquedaStrategy { + public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { + return RepositorioPropiedades.Singleton.ListarPropiedades(); + } +} + +public class BusquedaPorHabitaciones : IAdminBusquedaStrategy { +public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones(cantidadHabitaciones); + } +} + +public class BusquedaPorTipo : IAdminBusquedaStrategy { +public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo(tipoPropiedad); + } +} + +public class BusquedaPorServicios : IAdminBusquedaStrategy { +public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorServicios(servicios); + } +} + +public class BusquedaPorHabitacionesTipo : IAdminBusquedaStrategy { +public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo(cantidadHabitaciones, tipoPropiedad); + } +} + +public class BusquedaPorHabitacionesServicios : IAdminBusquedaStrategy { +public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Servicios(cantidadHabitaciones, servicios); + } +} + +public class BusquedaTipoServicios : IAdminBusquedaStrategy { +public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo_Servicios(tipoPropiedad, servicios); + } +} + +public class BusquedaFull : IAdminBusquedaStrategy { +public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo_Servicios(cantidadHabitaciones, tipoPropiedad, servicios); + } +} \ No newline at end of file diff --git a/Aspnet/Strategy/BusquedaAdmin/IAdminBusquedaStrategy.cs b/Aspnet/Strategy/BusquedaAdmin/IAdminBusquedaStrategy.cs new file mode 100644 index 0000000..9151de7 --- /dev/null +++ b/Aspnet/Strategy/BusquedaAdmin/IAdminBusquedaStrategy.cs @@ -0,0 +1,6 @@ +namespace AlquilaFacil.StrategyBusquedaAdmin; +using Entidades.Admin; +public interface IAdminBusquedaStrategy { + IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag); +} + diff --git a/Entidades/Admin/PropiedadesAdmin.cs b/Entidades/Admin/PropiedadesAdmin.cs new file mode 100644 index 0000000..25274e5 --- /dev/null +++ b/Entidades/Admin/PropiedadesAdmin.cs @@ -0,0 +1,12 @@ +namespace Entidades.Admin; +public class PropiedadesAdmin { + public int id { get; set; } + public string Ubicacion { get; set; } = ""; + public int canthabitaciones { get; set; } + public int piso { get; set; } + public string letra { get; set; } = ""; + public string Tipo { get; set; } = ""; + public string? Servicios {get;set;} = ""; + public int Monto { get; set; } + public string Estado { get; set; } = ""; +} diff --git a/Front/src/App.svelte b/Front/src/App.svelte index 2c8e293..99895bb 100644 --- a/Front/src/App.svelte +++ b/Front/src/App.svelte @@ -14,7 +14,8 @@ 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"; @@ -32,7 +33,8 @@ - + @@ -67,6 +69,12 @@ + + + + + + diff --git a/Front/src/Componentes/AdminPanelBusqueda.svelte b/Front/src/Componentes/AdminPanelBusqueda.svelte new file mode 100644 index 0000000..ef212a4 --- /dev/null +++ b/Front/src/Componentes/AdminPanelBusqueda.svelte @@ -0,0 +1,86 @@ + + +
+ +
Busqueda Filtrada +
+
+ +
+ + +
+ +
+
Servicios
+ {#each servicios as servicio} +
+ + +
+ {/each} +
+ +
+ + +
+ + +
+ \ No newline at end of file diff --git a/Front/src/Componentes/AdminPropiedad.svelte b/Front/src/Componentes/AdminPropiedad.svelte new file mode 100644 index 0000000..a4f478b --- /dev/null +++ b/Front/src/Componentes/AdminPropiedad.svelte @@ -0,0 +1,59 @@ + + +
+
+
{prop.tipo}
+
+
+
+ +
+
{prop.ubicacion}
+

+ Habitaciones: {prop.canthabitaciones}
+ Piso: {prop.piso || "N/A"}
+ Letra: {prop.letra || "N/A"}
+ Servicios: {prop.servicios || "Sin servicios especificados"}
+ Monto: ${prop.monto}
+ Estado: {prop.estado}
+

+ {#if prop.estado == "Disponible"} + + {:else} + + {/if} +
+ +
+ \ No newline at end of file diff --git a/Front/src/Componentes/PaginacionStepper.svelte b/Front/src/Componentes/PaginacionStepper.svelte new file mode 100644 index 0000000..839947e --- /dev/null +++ b/Front/src/Componentes/PaginacionStepper.svelte @@ -0,0 +1,35 @@ + + +{#if cantpag>1} + +{/if} \ No newline at end of file diff --git a/Front/src/Componentes/PanelBusqueda.svelte b/Front/src/Componentes/PanelBusqueda.svelte index d808706..d0a06f2 100644 --- a/Front/src/Componentes/PanelBusqueda.svelte +++ b/Front/src/Componentes/PanelBusqueda.svelte @@ -8,10 +8,11 @@ let serviciosSel = $state([]); let tipo = $state(0); - async function formsubmit (e){ + async function formsubmit (e:Event){ e.preventDefault(); const url = window.location.pathname; + const goto = url+"?cantidadHabitaciones="+canthabitaciones+"&tipoPropiedad="+tipo+"&servicios="+serviciosSel.join(","); window.location.replace(goto); } @@ -20,7 +21,7 @@
Busqueda Filtrada -
+
diff --git a/Front/src/paginas/AdminPropiedades.svelte b/Front/src/paginas/AdminPropiedades.svelte new file mode 100644 index 0000000..fa9527c --- /dev/null +++ b/Front/src/paginas/AdminPropiedades.svelte @@ -0,0 +1,122 @@ + + + + +{#if modaldata} + !!(modaldata = "")}/> +{/if} + +
+ +
+
+ {#each Propiedades as p } + modaldata = a} /> +
+ {/each} + +
+
+ +
+
+
+ +{#if showButton } +
+ +
+{/if} \ No newline at end of file diff --git a/Front/src/paginas/ControlUsuarios.svelte b/Front/src/paginas/AdminUsuarios.svelte similarity index 99% rename from Front/src/paginas/ControlUsuarios.svelte rename to Front/src/paginas/AdminUsuarios.svelte index 66a0abb..2bca06b 100644 --- a/Front/src/paginas/ControlUsuarios.svelte +++ b/Front/src/paginas/AdminUsuarios.svelte @@ -14,7 +14,7 @@ let showAddmenu: boolean = $state(false); let grupo:string = $state(""); - let SelCliente: Cliente = $state(); + let SelCliente: Cliente = $state(null); onMount(async () => { try{ diff --git a/Front/src/paginas/BusquedaPropiedades.svelte b/Front/src/paginas/BusquedaPropiedades.svelte index 5db7c25..d24a78c 100644 --- a/Front/src/paginas/BusquedaPropiedades.svelte +++ b/Front/src/paginas/BusquedaPropiedades.svelte @@ -7,6 +7,8 @@ import { fade } from "svelte/transition"; import {urlG} from "../stores/urlStore" import type { PropiedadDto } from "../types"; + import BarraHorizontalConTexto from "../Componentes/BarraHorizontalConTexto.svelte"; + import { text } from "@sveltejs/kit"; let showButton = $state(false); @@ -69,6 +71,7 @@
+
{#each propiedades as item} diff --git a/Front/src/types.d.ts b/Front/src/types.d.ts index dfe4347..f391145 100644 --- a/Front/src/types.d.ts +++ b/Front/src/types.d.ts @@ -8,6 +8,25 @@ export type PropiedadDto = { servicios: string, monto: number } + +export type AdminParametrosBusqueda = { + cantidadhabitaciones: number=0, + tipopropiedad: number=0, + servicios: string="", + pag: number=1 +} + +export type PropiedadAdmin = { + id: number, + ubicacion: string, + tipo: string, + piso: string | null, + letra: string | null, + canthabitaciones: number, + servicios: string, + monto: number, + estado: string +} export type Permiso = { id: number; descripcion: string; diff --git a/Modelo/RepositorioPropiedades.cs b/Modelo/RepositorioPropiedades.cs index 7bc44de..8e05c02 100644 --- a/Modelo/RepositorioPropiedades.cs +++ b/Modelo/RepositorioPropiedades.cs @@ -1,9 +1,10 @@ using System; using System.Data; using Entidades; +using Entidades.Admin; using Entidades.Dto; -using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; +using Microsoft.Identity.Client; using Modelo; using MySql.Data.MySqlClient; @@ -160,8 +161,20 @@ public class RepositorioPropiedades: RepositorioBase { } - public bool BajaServiciosAPropiedad(int idprop, List idserv) - { + public bool BajaPropiedad(int id) { + var con = Context; + Propiedade? prop = con.Propiedades.FirstOrDefault(x=>x.Id == id); + + if (prop == null||prop.Dnipropietario == 0) return false; + + if (prop.Idestado == 2) return false; + //las alquiladas no se pueden dar de baja claramente + prop.Idestado = prop.Idestado == 1 ? 3 : 1; + + return Guardar(con); + } + + public bool BajaServiciosAPropiedad(int idprop, List idserv) { var con = Context; Propiedade? prop = con.Propiedades.Include(x=>x.IdServicios).FirstOrDefault(x => x.Id == idprop); if (prop == null) return false; @@ -183,7 +196,7 @@ public class RepositorioPropiedades: RepositorioBase { 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 + 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 @@ -207,7 +220,7 @@ public class RepositorioPropiedades: RepositorioBase { public IQueryable ObtenerPropiedesPorHabitaciones_Tipo(int cantidadHabitaciones, int tipoPropiedad) { 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 + 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 @@ -221,12 +234,12 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorServicios(string servicios) { + public IQueryable ObtenerPropiedesPorServicios(string servicios) { 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 + 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 @@ -246,10 +259,10 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorHabitaciones(int cantidadHabitaciones) { + public IQueryable ObtenerPropiedesPorHabitaciones(int cantidadHabitaciones) { 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 + 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 @@ -263,10 +276,10 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorTipo(int tipoPropiedad) { + public IQueryable ObtenerPropiedesPorTipo(int tipoPropiedad) { 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 + 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 @@ -280,11 +293,11 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorHabitaciones_Servicios(int cantidadHabitaciones, string servicios) { + public IQueryable ObtenerPropiedesPorHabitaciones_Servicios(int cantidadHabitaciones, string servicios) { 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 + 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 @@ -302,13 +315,14 @@ public class RepositorioPropiedades: RepositorioBase { """; var ret = Context.Database.SqlQuery(sqlq); - return ret; } + return ret; + } - public IQueryable? ObtenerPropiedesPorTipo_Servicios(int tipoPropiedad, string servicios) { + public IQueryable ObtenerPropiedesPorTipo_Servicios(int tipoPropiedad, string servicios) { 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 + 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 @@ -341,4 +355,213 @@ 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; + } } \ No newline at end of file -- 2.52.0 From cb4f81432007d5e8d5eb0820184a9c5930aeaefe Mon Sep 17 00:00:00 2001 From: fede Date: Fri, 3 Jan 2025 21:41:50 -0300 Subject: [PATCH 2/2] paginacion arreglada --- Aspnet/Controllers/AdminController.cs | 36 ++++++------- Aspnet/Controllers/BusquedaControler.cs | 4 +- .../BusquedaAdmin/AdminBusquedaContext.cs | 29 ++++++++++ Aspnet/Strategy/BusquedaAdmin/Filtros.cs | 16 +++--- Front/public/bell.svg | 1 + Front/src/paginas/AdminPropiedades.svelte | 53 +++++++------------ Modelo/RepositorioPropiedades.cs | 43 ++++++++++++--- 7 files changed, 112 insertions(+), 70 deletions(-) create mode 100644 Aspnet/Strategy/BusquedaAdmin/AdminBusquedaContext.cs create mode 100644 Front/public/bell.svg diff --git a/Aspnet/Controllers/AdminController.cs b/Aspnet/Controllers/AdminController.cs index 2d00ac2..6255091 100644 --- a/Aspnet/Controllers/AdminController.cs +++ b/Aspnet/Controllers/AdminController.cs @@ -4,6 +4,8 @@ using Entidades.Admin; using Entidades.Dto; using Entidades; using System.Linq.Expressions; +using AlquilaFacil.StrategyBusquedaAdmin; +using System.Diagnostics; namespace AlquilaFacil.Controllers; [ApiController] @@ -129,26 +131,22 @@ public class AdminController: ControllerBase IQueryable? props = null; pag -= 1; - if (servicios == ""){ - //no hay parametros de busqueda - if (cantidadHabitaciones == 0 && tipoPropiedad == 0 ) props = RepositorioPropiedades.Singleton.ListarPropiedadesPorPaginaAdmin(pag); - //Solo Habitaciones - if (cantidadHabitaciones != 0 && tipoPropiedad == 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitacionesPaginado(cantidadHabitaciones, pag); - //Solo TipoPropiedad - if (cantidadHabitaciones == 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipoPaginado(tipoPropiedad, pag); - //Habitaciones y TipoPropiedad - if (cantidadHabitaciones != 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_TipoPaginado(cantidadHabitaciones, tipoPropiedad, pag); - } else { - //Solo se filtra por servicios - if (cantidadHabitaciones == 0 && tipoPropiedad == 0 ) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorServiciosPaginado(servicios, pag); - //Servicios y habitaciones - if (cantidadHabitaciones != 0 && tipoPropiedad == 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Servicios_Paginado(cantidadHabitaciones, servicios, pag); - //Tipo y Servicios - if (cantidadHabitaciones == 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo_Servicios_Paginado(tipoPropiedad, servicios, pag); - // Todos los parametros - if (cantidadHabitaciones != 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo_Servicios_Paginado(cantidadHabitaciones, tipoPropiedad, servicios, pag); - } + + 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); + return Ok(new { message = ret}); + } } \ No newline at end of file diff --git a/Aspnet/Controllers/BusquedaControler.cs b/Aspnet/Controllers/BusquedaControler.cs index efd224c..2a3eb20 100644 --- a/Aspnet/Controllers/BusquedaControler.cs +++ b/Aspnet/Controllers/BusquedaControler.cs @@ -18,8 +18,8 @@ public class BusquedaController: ControllerBase { var clave = $"{(cantidadHabitaciones != 0 ? "1" : "0")}{(tipoPropiedad != 0 ? "1" : "0")}{(!string.IsNullOrEmpty(servicios) ? "1" : "0")}"; - var context = BusquedaContext.Singleton; - var estrategia = context.ObtenerEstrategia(clave); + var gen = BusquedaContext.Singleton; + var estrategia = gen.ObtenerEstrategia(clave); props = estrategia.Filtrar(servicios, cantidadHabitaciones, tipoPropiedad); return Ok(props); diff --git a/Aspnet/Strategy/BusquedaAdmin/AdminBusquedaContext.cs b/Aspnet/Strategy/BusquedaAdmin/AdminBusquedaContext.cs new file mode 100644 index 0000000..801557b --- /dev/null +++ b/Aspnet/Strategy/BusquedaAdmin/AdminBusquedaContext.cs @@ -0,0 +1,29 @@ +namespace AlquilaFacil.StrategyBusquedaAdmin; + +public class AdminBusquedaContext +{ + private static readonly AdminBusquedaContext singleton = new(); + public static AdminBusquedaContext Singleton {get { return singleton; } } + + private readonly Dictionary _estrategias; + + public AdminBusquedaContext() + { + _estrategias = new Dictionary + { + { "000", new BusquedaSinParametros() }, + { "100", new BusquedaPorHabitaciones() }, + { "010", new BusquedaPorTipo() }, + { "001", new BusquedaPorServicios() }, + { "110", new BusquedaPorHabitacionesTipo() }, + { "101", new BusquedaPorHabitacionesServicios() }, + { "011", new BusquedaTipoServicios() }, + { "111", new BusquedaFull() } + }; + } + + public IAdminBusquedaStrategy ObtenerEstrategia(string clave) + { + return _estrategias.ContainsKey(clave) ? _estrategias[clave] : new BusquedaSinParametros(); + } +} \ No newline at end of file diff --git a/Aspnet/Strategy/BusquedaAdmin/Filtros.cs b/Aspnet/Strategy/BusquedaAdmin/Filtros.cs index e47106d..8506bd9 100644 --- a/Aspnet/Strategy/BusquedaAdmin/Filtros.cs +++ b/Aspnet/Strategy/BusquedaAdmin/Filtros.cs @@ -5,48 +5,48 @@ namespace AlquilaFacil.StrategyBusquedaAdmin; public class BusquedaSinParametros : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ListarPropiedades(); + return RepositorioPropiedades.Singleton.ListarPropiedadesPorPaginaAdmin(pag); } } public class BusquedaPorHabitaciones : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones(cantidadHabitaciones); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitacionesPaginado(cantidadHabitaciones, pag); } } public class BusquedaPorTipo : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo(tipoPropiedad); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipoPaginado(tipoPropiedad, pag); } } public class BusquedaPorServicios : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorServicios(servicios); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorServiciosPaginado(servicios, pag); } } public class BusquedaPorHabitacionesTipo : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo(cantidadHabitaciones, tipoPropiedad); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_TipoPaginado(cantidadHabitaciones, tipoPropiedad, pag); } } public class BusquedaPorHabitacionesServicios : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Servicios(cantidadHabitaciones, servicios); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Servicios_Paginado(cantidadHabitaciones, servicios, pag); } } public class BusquedaTipoServicios : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo_Servicios(tipoPropiedad, servicios); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo_Servicios_Paginado(tipoPropiedad, servicios, pag); } } public class BusquedaFull : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo_Servicios(cantidadHabitaciones, tipoPropiedad, servicios); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo_Servicios_Paginado(cantidadHabitaciones, tipoPropiedad, servicios, pag); } } \ No newline at end of file diff --git a/Front/public/bell.svg b/Front/public/bell.svg new file mode 100644 index 0000000..8a1f51e --- /dev/null +++ b/Front/public/bell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/src/paginas/AdminPropiedades.svelte b/Front/src/paginas/AdminPropiedades.svelte index fa9527c..d2b00a2 100644 --- a/Front/src/paginas/AdminPropiedades.svelte +++ b/Front/src/paginas/AdminPropiedades.svelte @@ -40,15 +40,25 @@ async function cargaPropiedades() { try{ - const response = await fetch($urlG+"/api/admin/busqueda/paginada?cantidadHabitaciones="+p.cantidadhabitaciones+"&tipoPropiedad="+p.tipopropiedad+"&servicios="+p.servicios+"&pag="+p.pag, { - method: "GET", - headers: { - "Auth": String(token) - } - }); - if (response.ok) { - let data = await response.json(); + const [response, response2] = await Promise.all([ + fetch($urlG+"/api/admin/busqueda/paginada?cantidadHabitaciones="+p.cantidadhabitaciones+"&tipoPropiedad="+p.tipopropiedad+"&servicios="+p.servicios+"&pag="+p.pag, { + method: "GET", + headers: { + "Auth": String(token) + } + }), + fetch($urlG+"/api/admin/busqueda/cantPag?cantidadHabitaciones="+p.cantidadhabitaciones+"&tipoPropiedad="+p.tipopropiedad+"&servicios="+p.servicios, { + method: "GET", + headers: { + "Auth": String(token) + } + }) + ]); + + if (response.ok && response2.ok) { + const [data, data2] = await Promise.all([response.json(),response2.json()]); Propiedades = data; + cantpag = data2.message; return; } modaldata = "Fallo la request"; @@ -56,31 +66,6 @@ modaldata = "Fallo al intentar obtener la lista de propiedades"; } } - async function obtenerCant(){ - - try{ - const response = await fetch($urlG+"/api/propiedad/cantPagina?estado="+0, { - method: "GET", - headers: { - "Auth": String(token) - } - }); - if (response.ok) { - let data = await response.json(); - cantpag = data.message; - return; - } - if (response.status === 400) { - let data = await response.json(); - modaldata=data.message; - return; - } - modaldata="Fallo al recibir la peticion de la cantidad de paginas de propiedades"; - } catch { - modaldata="Fallo al intentar hacer la peticion de cuantas paginas hay"; - } - } - function queryPag(a:number){ p.pag = a; @@ -107,7 +92,7 @@ modaldata = a} />
{/each} - +
diff --git a/Modelo/RepositorioPropiedades.cs b/Modelo/RepositorioPropiedades.cs index 8e05c02..e3a16c1 100644 --- a/Modelo/RepositorioPropiedades.cs +++ b/Modelo/RepositorioPropiedades.cs @@ -391,7 +391,7 @@ public class RepositorioPropiedades: RepositorioBase { } - public IQueryable? ObtenerPropiedesPorHabitacionesPaginado(int cantidadHabitaciones, int pag) { + 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 @@ -409,7 +409,7 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorTipoPaginado(int tipoPropiedad, int pag) { + 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 @@ -427,7 +427,7 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorHabitaciones_TipoPaginado(int cantidadHabitaciones, int tipoPropiedad, int pag) { + 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 @@ -445,7 +445,7 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorServiciosPaginado(string servicios, int pag) { + public IQueryable ObtenerPropiedesPorServiciosPaginado(string servicios, int pag) { string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); FormattableString sqlq = $""" @@ -471,7 +471,7 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorHabitaciones_Servicios_Paginado(int cantidadHabitaciones, string servicios, int pag) { + 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, @@ -497,7 +497,7 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorTipo_Servicios_Paginado(int tipoPropiedad, string servicios, int pag) { + 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, @@ -523,7 +523,7 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorHabitaciones_Tipo_Servicios_Paginado(int habitaciones, int tipo, string servicios, int pag) { + 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, @@ -564,4 +564,33 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } + + public int CuantasPaginasBusqueda(int habitaciones, string servicios, int tipoPropiedad) { + 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 (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 -- 2.52.0