Finalización del módulo Luz Cámara: Corrección de errores JS, exportación profesional a PDF y reportes de deudores

This commit is contained in:
2026-02-14 16:07:25 -06:00
parent 5f90790c7a
commit 9850f1a85e
13 changed files with 2849 additions and 536 deletions

View File

@@ -1,96 +1,121 @@
<?php
class Auth {
public static function check() {
class Auth
{
public static function check()
{
if (!isset($_SESSION['user_id'])) {
return false;
}
$timeout = defined('SESSION_TIMEOUT') ? SESSION_TIMEOUT : 28800;
if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > $timeout)) {
session_destroy();
return false;
}
$_SESSION['last_activity'] = time();
return true;
}
public static function user() {
public static function user()
{
if (!self::check()) {
return null;
}
return $_SESSION;
}
public static function id() {
public static function id()
{
return $_SESSION['user_id'] ?? null;
}
public static function role() {
public static function role()
{
return $_SESSION['role'] ?? null;
}
public static function isAdmin() {
public static function isAdmin()
{
return self::role() === 'ADMIN';
}
public static function isCapturist() {
public static function isCapturist()
{
return self::role() === 'CAPTURIST' || self::isAdmin();
}
public static function isViewer() {
public static function isViewer()
{
return self::role() === 'VIEWER';
}
public static function isLector() {
public static function isLector()
{
return self::role() === 'LECTOR';
}
public static function getAccessibleHouseIds() {
public static function getAccessibleHouseIds()
{
$db = Database::getInstance();
if (self::isAdmin()) {
$result = $db->fetchAll("SELECT id FROM houses");
return array_column($result, 'id');
} elseif (self::isLector()) {
}
elseif (self::isLector()) {
$userId = self::id();
$result = $db->fetchAll(
"SELECT house_id FROM user_house_permissions WHERE user_id = ?",
[$userId]
[$userId]
);
return array_column($result, 'house_id');
} else {
}
else {
$result = $db->fetchAll("SELECT id FROM houses");
return array_column($result, 'id');
}
}
public static function requireAuth() {
public static function canViewHouse($houseId)
{
if (self::isAdmin()) {
return true;
}
$accessibleIds = self::getAccessibleHouseIds();
return in_array($houseId, $accessibleIds);
}
public static function requireAuth()
{
if (!self::check()) {
header('Location: /login.php');
exit;
}
}
public static function requireAdmin() {
public static function requireAdmin()
{
self::requireAuth();
if (!self::isAdmin()) {
header('Location: /dashboard.php');
exit;
}
}
public static function requireCapturist() {
public static function requireCapturist()
{
self::requireAuth();
if (!self::isCapturist()) {
header('Location: /dashboard.php');
exit;
}
}
public static function login($user) {
public static function login($user)
{
session_regenerate_id(true);
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
@@ -98,37 +123,39 @@ class Auth {
$_SESSION['first_name'] = $user['first_name'];
$_SESSION['last_name'] = $user['last_name'];
$_SESSION['last_activity'] = time();
$db = Database::getInstance();
$db->execute(
"UPDATE users SET last_login = NOW() WHERE id = ?",
[$user['id']]
[$user['id']]
);
self::logActivity('login', "Usuario {$user['username']} inició sesión");
}
public static function logout() {
public static function logout()
{
self::logActivity('logout', "Usuario {$_SESSION['username']} cerró sesión");
session_destroy();
header('Location: /login.php');
exit;
}
public static function logActivity($action, $details = '') {
public static function logActivity($action, $details = '')
{
if (!self::check()) {
return;
}
$db = Database::getInstance();
$db->execute(
"INSERT INTO activity_logs (user_id, action, details, ip_address) VALUES (?, ?, ?, ?)",
[
self::id(),
$action,
$details,
$_SERVER['REMOTE_ADDR'] ?? null
]
[
self::id(),
$action,
$details,
$_SERVER['REMOTE_ADDR'] ?? null
]
);
}
}
}