(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
