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