asd
This commit is contained in:
@@ -106,4 +106,44 @@ public class AdminController: ControllerBase
|
|||||||
var ret = RepositorioUsuarios.Singleton.BajaCliente(Dni);
|
var ret = RepositorioUsuarios.Singleton.BajaCliente(Dni);
|
||||||
return Ok(ret);
|
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<PropiedadesAdmin>? 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});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -35,4 +35,15 @@ public class BusquedaController: ControllerBase {
|
|||||||
|
|
||||||
return Ok(props);
|
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});
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,9 @@
|
|||||||
import FrontPropietario from "./paginas/grupos/PropietarioG.svelte";
|
import FrontPropietario from "./paginas/grupos/PropietarioG.svelte";
|
||||||
import PublicarPropiedad from "./paginas/PublicarPropiedad.svelte";
|
import PublicarPropiedad from "./paginas/PublicarPropiedad.svelte";
|
||||||
import BusquedaPropiedades from "./paginas/BusquedaPropiedades.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";
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Router>
|
<Router>
|
||||||
@@ -82,6 +84,10 @@
|
|||||||
<ProteRoute componente={FrontInformes}/>
|
<ProteRoute componente={FrontInformes}/>
|
||||||
</Route>
|
</Route>
|
||||||
|
|
||||||
|
<!--Notificaciones-->
|
||||||
|
<Route path="/notificaciones">
|
||||||
|
<ProteRoute componente={Notificaciones}/>
|
||||||
|
</Route>
|
||||||
|
|
||||||
|
|
||||||
</Router>
|
</Router>
|
||||||
|
|||||||
@@ -63,13 +63,16 @@
|
|||||||
<img src="/home.svg" alt="Volver al Menú"/>
|
<img src="/home.svg" alt="Volver al Menú"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<button class="badge btn btn-outline-primary" onclick={toggleTheme} style="background-color: cadetblue;">
|
<button class="badge btn" onclick={toggleTheme} style="background-color: cadetblue;">
|
||||||
{#if theme === "light" }
|
{#if theme === "light" }
|
||||||
<img src="/toggle-left.svg" alt=""/>
|
<img src="/toggle-left.svg" alt=""/>
|
||||||
{:else}
|
{:else}
|
||||||
<img src="/toggle-right.svg" alt=""/>
|
<img src="/toggle-right.svg" alt=""/>
|
||||||
{/if}
|
{/if}
|
||||||
</button>
|
</button>
|
||||||
|
<button class="badge btn btn-info" onclick={()=>navigate("/notificaciones")}>
|
||||||
|
<img src="/bell.svg" alt="">
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<NavbarToggler on:click={() => (isOpen = !isOpen)} />
|
<NavbarToggler on:click={() => (isOpen = !isOpen)} />
|
||||||
<Collapse isOpen={isOpen} navbar expand="md">
|
<Collapse isOpen={isOpen} navbar expand="md">
|
||||||
|
|||||||
7
Front/src/paginas/Notificaciones.svelte
Normal file
7
Front/src/paginas/Notificaciones.svelte
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import NavBarAutocompletable from "../Componentes/NavBarAutocompletable.svelte";
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<NavBarAutocompletable/>
|
||||||
@@ -341,4 +341,246 @@ public class RepositorioPropiedades: RepositorioBase<RepositorioPropiedades> {
|
|||||||
}
|
}
|
||||||
return Guardar(con);
|
return Guardar(con);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IQueryable<PropiedadesDto> 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<PropiedadesDto>(sqlq);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
///////////////ADMIN
|
||||||
|
public IQueryable<PropiedadesAdmin> 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<PropiedadesAdmin>(sqlq);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public IQueryable<PropiedadesAdmin> 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<PropiedadesAdmin>(sqlq);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IQueryable<PropiedadesAdmin> 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<PropiedadesAdmin>(sqlq);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IQueryable<PropiedadesAdmin> 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<PropiedadesAdmin>(sqlq);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IQueryable<PropiedadesAdmin> 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<PropiedadesAdmin>(sqlq);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IQueryable<PropiedadesAdmin> 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<PropiedadesAdmin>(sqlq);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IQueryable<PropiedadesAdmin> 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<PropiedadesAdmin>(sqlq);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IQueryable<PropiedadesAdmin> 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<PropiedadesAdmin>(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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user