- 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
227 lines
4.3 KiB
Markdown
Executable File
227 lines
4.3 KiB
Markdown
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
|
|
|
|
```sql
|
|
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
|
|
|
|
```sql
|
|
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
|
|
|
|
```sql
|
|
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
|
|
|
|
```sql
|
|
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
|
|
|
|
```sql
|
|
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)
|
|
|
|
```php
|
|
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
|
|
|
|
```php
|
|
require '../core/Auth.php';
|
|
Auth::check();
|
|
|
|
$data = Dashboard::getData($_GET['year'] ?? date('Y'));
|
|
require '../views/dashboard/index.php';
|
|
```
|
|
|
|
### payments.php
|
|
|
|
```php
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
Payment::update($_POST);
|
|
echo json_encode(['success' => true]);
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🎨 VISTAS (HTML + PHP)
|
|
|
|
### layout/base.php
|
|
|
|
```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
|
|
|
|
```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
|