- Filtros por casas: selección múltiple con opción 'Todas las casas' - Filtros por conceptos: selección múltiple con opción 'Todos los conceptos' - Estado inicial: todos los filtros marcados por defecto (muestra toda la info) - Exportación PDF: incluye solo datos filtrados según selección - JavaScript interactivo: lógica de checkboxes con estados intermedios - Modelo actualizado: método getConceptDebtorsFiltered para filtrado avanzado - Interfaz intuitiva: scrollable containers para listas largas - Preserva permisos: respeta restricciones de acceso por casas
4.3 KiB
Executable File
4.3 KiB
Executable File
(Documento convertido a PHP puro con MySQL)
ESPECIFICACIÓN COMPLETA PARA SISTEMA IBIZA CEA
Desarrollo desde Cero con PHP Puro + MySQL
📋 RESUMEN EJECUTIVO
Proyecto: Sistema de Gestión Integral para Condominio IBIZA CEA Tecnología: PHP 8.x (procedimental / OOP simple) + MySQL 8.0 Arquitectura: Aplicación web monolítica clásica (MVC ligero propio) Objetivo: Unificar dos sistemas separados en una plataforma estable, sin frameworks
🏗️ ARQUITECTURA TÉCNICA
Stack Tecnológico
Backend: PHP 8.x (sin framework)
Frontend: HTML5 + CSS3 + Bootstrap 5 + JavaScript
Base de Datos: MySQL 8.0 (PDO)
Autenticación: Sesiones PHP + password_hash()
API Interna: Endpoints PHP (JSON)
Estructura de Directorios
ibizacea/
├── config/
│ └── database.php
├── core/
│ ├── Database.php
│ ├── Auth.php
│ └── Router.php
├── models/
│ ├── User.php
│ ├── House.php
│ ├── Payment.php
│ ├── Expense.php
│ └── ActivityLog.php
├── controllers/
│ ├── auth.php
│ ├── dashboard.php
│ ├── payments.php
│ ├── finance.php
│ └── reports.php
├── views/
│ ├── layout/
│ ├── dashboard/
│ ├── payments/
│ └── finance/
├── public/
│ ├── index.php
│ └── assets/
└── sql/
└── schema.sql
🗄️ DISEÑO DE BASE DE DATOS (MySQL)
Tabla users
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(180) UNIQUE NOT NULL,
email VARCHAR(180) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
first_name VARCHAR(100),
last_name VARCHAR(100),
role ENUM('ADMIN','CAPTURIST','VIEWER') DEFAULT 'VIEWER',
is_active TINYINT(1) DEFAULT 1,
last_login DATETIME NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
Tabla houses
CREATE TABLE houses (
id INT AUTO_INCREMENT PRIMARY KEY,
number VARCHAR(10) UNIQUE NOT NULL,
status VARCHAR(20),
consumption_only TINYINT(1) DEFAULT 0,
owner_name VARCHAR(200),
owner_email VARCHAR(180),
owner_phone VARCHAR(20)
);
Tabla payments
CREATE TABLE payments (
id INT AUTO_INCREMENT PRIMARY KEY,
house_id INT NOT NULL,
year INT NOT NULL,
month VARCHAR(20) NOT NULL,
amount DECIMAL(10,2) DEFAULT 0,
payment_date DATETIME NULL,
created_by INT,
FOREIGN KEY (house_id) REFERENCES houses(id)
);
Tabla expenses
CREATE TABLE expenses (
id INT AUTO_INCREMENT PRIMARY KEY,
description VARCHAR(300),
amount DECIMAL(10,2),
expense_date DATE,
category VARCHAR(100),
notes TEXT
);
Tabla activity_logs
CREATE TABLE activity_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
action VARCHAR(100),
details TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
🔐 AUTENTICACIÓN Y ROLES
Login PHP (ejemplo)
session_start();
$user = User::findByUsername($_POST['username']);
if ($user && password_verify($_POST['password'], $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['role'] = $user['role'];
}
Roles
- ADMIN: Acceso total
- CAPTURIST: Registrar pagos y gastos
- VIEWER: Solo lectura
🎛️ CONTROLADORES (PHP)
dashboard.php
require '../core/Auth.php';
Auth::check();
$data = Dashboard::getData($_GET['year'] ?? date('Y'));
require '../views/dashboard/index.php';
payments.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
Payment::update($_POST);
echo json_encode(['success' => true]);
}
🎨 VISTAS (HTML + PHP)
layout/base.php
<!DOCTYPE html>
<html>
<head>
<title>IBIZA CEA</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<?php include $view; ?>
</body>
</html>
📦 DESPLIEGUE
Requisitos
- PHP 8.x
- MySQL 8.0
- Apache o Nginx
index.php
require '../config/database.php';
require '../core/Router.php';
Router::dispatch();
AGREGAR MODULO PARA IMPORTAR
--De acuerdo a la relación de la base de datos crear un modulo para poder importar datos de forma masiva y coherente con el sistema. --Cada importación tendrá un archivo descargable de ejemplo para poder hacer la importación