Agregada fila de suma mensual en reporte de pagos y PDF
This commit is contained in:
@@ -1,302 +0,0 @@
|
||||
# ANÁLISIS COMPLETO DEL SISTEMA IBIZA CEA
|
||||
|
||||
## Resumen Ejecutivo
|
||||
|
||||
El sistema IBIZA CEA es una plataforma de gestión integral para condominios que maneja dos módulos principales: **Pagos de Agua** y **Finanzas**. El sistema está desarrollado en PHP con MySQL y está diseñado para administrar 101 casas del condominio IBIZA.
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ ESTRUCTURA DEL SISTEMA
|
||||
|
||||
### Base de Datos
|
||||
- **Nombre**: `ibiza_db`
|
||||
- **Motor**: MySQL/MariaDB
|
||||
- **Tablas principales**: 15 tablas
|
||||
|
||||
### Arquitectura
|
||||
- **Frontend**: PHP puro con HTML5, CSS3, JavaScript
|
||||
- **Backend**: PHP con MySQLi
|
||||
- **API REST**: Endpoints para integración externa
|
||||
- **Autenticación**: Basada en sesiones con roles de usuario
|
||||
|
||||
---
|
||||
|
||||
## 📊 MÓDULOS DEL SISTEMA
|
||||
|
||||
### 1. MÓDULO DE PAGOS DE AGUA (Sistema Principal)
|
||||
|
||||
#### Página Principal: `index.php`
|
||||
**Funcionalidad**: Concentrado de pagos mensuales de agua por casa
|
||||
|
||||
**Características**:
|
||||
- Vista tabular de 101 casas vs 12 meses
|
||||
- Edición inline de pagos (clic en celda)
|
||||
- Filtros por año y número de casa
|
||||
- Exportación a PDF y CSV
|
||||
- Estados visuales de pago (pagado/pendiente/parcial)
|
||||
|
||||
**Proceso de Flujo**:
|
||||
1. Usuario selecciona año (2024-2030)
|
||||
2. Sistema muestra matriz casas×meses
|
||||
3. Admin/capturista puede editar montos haciendo clic
|
||||
4. Estados se actualizan automáticamente (verde=pagado, rojo=pendiente)
|
||||
|
||||
**Lógica de Negocio**:
|
||||
- Casas pueden estar "activa" o "deshabitada"
|
||||
- Casas con `consumo_only=1` reciben descuento de $100 (desde 2025)
|
||||
- Cálculo automático de saldos y estados
|
||||
|
||||
#### Tablas Involucradas:
|
||||
- `houses` - Información de casas (101 registros)
|
||||
- `payments` - Pagos registrados por casa/año/mes
|
||||
- `monthly_bills` - Configuración de montos esperados
|
||||
|
||||
---
|
||||
|
||||
### 2. MÓDULO DE FINANZAS (Sistema Secundario)
|
||||
|
||||
#### 2.1 Gestión de Casas (`finance_houses.php`)
|
||||
**Funcionalidad**: Administración del registro de propietarios
|
||||
|
||||
**Características**:
|
||||
- Lista de 101 casas con números y propietarios
|
||||
- Edición de nombres de propietarios (solo admin)
|
||||
- Vista tabular con información de registro
|
||||
|
||||
**Proceso**:
|
||||
1. Muestra todas las casas del 001-101
|
||||
2. Admin puede editar nombre del propietario
|
||||
3. Sistema registra cambios en log de actividad
|
||||
|
||||
#### 2.2 Conceptos de Recaudación (`finance_concepts.php`)
|
||||
**Funcionalidad**: Definición de eventos especiales de cobro
|
||||
|
||||
**Características**:
|
||||
- Creación de conceptos globales (Protocolización, Poda de árboles, etc.)
|
||||
- Montos variables por casa
|
||||
- Relación con conceptos globales
|
||||
- Gestión de pagos por concepto
|
||||
|
||||
**Ejemplos del Sistema**:
|
||||
- Protocolización: $200 por casa
|
||||
- Poda de árboles: $20 por casa
|
||||
- Reparación de candado: $6 por casa
|
||||
|
||||
#### 2.3 Reportes Financieros (`finance_reports.php`)
|
||||
**Funcionalidad**: Generación de reportes financieros
|
||||
|
||||
**Tipos de Reportes**:
|
||||
- **Balance General**: Resumen completo financiero
|
||||
- **Estado de Cuenta por Casa**: Detalle de pagos individuales
|
||||
- **Detalle por Concepto**: Pagos agrupados por concepto
|
||||
- **Detalle por Concepto Global**: Reportes de eventos especiales
|
||||
|
||||
**Características**:
|
||||
- Filtros por rango de fechas
|
||||
- Exportación a PDF
|
||||
- Cálculos automáticos de totales
|
||||
|
||||
#### 2.4 Gestión de Gastos (`finance_expenses.php`)
|
||||
**Funcionalidad**: Registro de egresos del sistema
|
||||
|
||||
**Características**:
|
||||
- Registro de gastos con conceptos
|
||||
- Soporte para comprobantes (receipt_path)
|
||||
- Relación con conceptos de recaudación
|
||||
- Montos y fechas configurables
|
||||
|
||||
---
|
||||
|
||||
## 🔐 SEGURIDAD Y ROLES
|
||||
|
||||
### Sistema de Autenticación
|
||||
**Página**: `login.php`
|
||||
|
||||
**Flujo**:
|
||||
1. Usuario ingresa credenciales
|
||||
2. Sistema verifica contra tabla `users`
|
||||
3. Creación de sesión con regeneración de ID
|
||||
4. Redirección a `select_system.php`
|
||||
|
||||
### Roles de Usuario
|
||||
1. **admin**: Acceso completo a todas las funciones
|
||||
2. **capturista**: Puede editar pagos y crear conceptos
|
||||
3. **viewer**: Solo puede visualizar información
|
||||
4. **any**: Rol mínimo para navegación básica
|
||||
|
||||
### Página de Selección (`select_system.php`)
|
||||
**Funcionalidad**: Portal de navegación entre sistemas
|
||||
|
||||
**Características**:
|
||||
- Interfaz moderna con cards de selección
|
||||
- Dos opciones: "Pagos de Agua" y "Finanzas"
|
||||
- Diseño responsivo y visual atractivo
|
||||
|
||||
---
|
||||
|
||||
## 📋 TABLAS DE BASE DE DATOS
|
||||
|
||||
### Tablas Principales
|
||||
|
||||
#### 1. `houses` (101 registros)
|
||||
- **Propósito**: Registro de casas del condominio
|
||||
- **Campos clave**: `number`, `status`, `consumo_only`
|
||||
- **Estados**: 'activa' o 'deshabitada'
|
||||
|
||||
#### 2. `payments` (1,000+ registros)
|
||||
- **Propósito**: Pagos mensuales registrados
|
||||
- **Relación**: Muchos a uno con houses
|
||||
- **Periodo**: 2024-2025 con datos históricos
|
||||
|
||||
#### 3. `monthly_bills` (25+ registros)
|
||||
- **Propósito**: Configuración de montos esperados
|
||||
- **Cálculo**: Total dividido entre casas activas
|
||||
- **Evolución**: Montos variables por mes ($250-$712)
|
||||
|
||||
#### 4. `finance_houses` (101 registros)
|
||||
- **Propósito**: Datos financieros de casas
|
||||
- **Campos**: `house_number`, `owner_name`
|
||||
- **Uso**: Módulo financiero separado
|
||||
|
||||
#### 5. `finance_collection_concepts` (5 registros)
|
||||
- **Propósito**: Conceptos especiales de cobro
|
||||
- **Ejemplos**: Protocolización, Poda, Reparación
|
||||
- **Montos**: Variables ($6-$200 por casa)
|
||||
|
||||
#### 6. `finance_expenses` (17 registros)
|
||||
- **Propósito**: Registro de egresos
|
||||
- **Conceptos**: Herrero, Candados, Asesoría, etc.
|
||||
- **Montos**: $11-$1,015
|
||||
|
||||
#### 7. `activity_logs` (9,800+ registros)
|
||||
- **Propósito**: Auditoría completa del sistema
|
||||
- **Acciones**: login, navigation, editar_pago, etc.
|
||||
- **Usuarios**: Principalmente usuario ID 1 y 2
|
||||
|
||||
---
|
||||
|
||||
## 🔄 FLUJOS DE TRABAJO
|
||||
|
||||
### Flujo de Pagos de Agua (Mensual)
|
||||
1. **Configuración**: Admin define montos en `monthly_bills`
|
||||
2. **Registro**: Capturista ingresa pagos casa por casa
|
||||
3. **Seguimiento**: Sistema muestra estados de pago
|
||||
4. **Reportes**: Exportación a PDF para administración
|
||||
|
||||
### Flujo de Conceptos Especiales
|
||||
1. **Creación**: Admin define concepto global y montos
|
||||
2. **Recaudación**: Capturista registra pagos por casa
|
||||
3. **Control**: Sistema vincula pagos con conceptos
|
||||
4. **Reportes**: Generación de estados de cuenta
|
||||
|
||||
### Flujo de Gastos
|
||||
1. **Registro**: Admin ingresa egresos con conceptos
|
||||
2. **Documentación**: Opcional carga de comprobantes
|
||||
3. **Vinculación**: Relación con conceptos de recaudación
|
||||
4. **Control**: Reportes de balance general
|
||||
|
||||
---
|
||||
|
||||
## 🎯 FUNCIONALIDADES CLAVE
|
||||
|
||||
### 1. Gestión de Pagos
|
||||
- **Edición Inline**: Clic en celda para editar monto
|
||||
- **Estados Visuales**: Colores automáticos según estado
|
||||
- **Cálculos Automáticos**: Saldos y totales en tiempo real
|
||||
- **Validaciones**: Prevención de errores de entrada
|
||||
|
||||
### 2. Control de Acceso
|
||||
- **Autenticación Segura**: Password hashing y regeneración de sesión
|
||||
- **Roles Granulares**: Diferentes niveles de acceso
|
||||
- **Auditoría**: Registro completo de actividades
|
||||
|
||||
### 3. Reportes
|
||||
- **Múltiples Formatos**: PDF, CSV, vista en pantalla
|
||||
- **Filtros Avanzados**: Por fecha, casa, concepto
|
||||
- **Cálculos Automáticos**: Totales y subtotales
|
||||
|
||||
### 4. API REST
|
||||
- **Endpoints**: houses, payments, stats, login
|
||||
- **Autenticación**: Tokens de API
|
||||
- **Formato**: JSON responses
|
||||
|
||||
---
|
||||
|
||||
## 📈 MÉTRICAS Y DATOS
|
||||
|
||||
### Volumen de Datos
|
||||
- **Casas**: 101 propiedades
|
||||
- **Pagos Registrados**: 1,000+ transacciones
|
||||
- **Actividad**: 9,800+ eventos en log
|
||||
- **Usuarios**: Principalmente 2 usuarios activos
|
||||
|
||||
### Datos Financieros
|
||||
- **Rango de Pagos**: $150-$56,109 (error en registro)
|
||||
- **Pagos Típicos**: $250-$712 mensuales
|
||||
- **Conceptos Especiales**: $6-$200 por evento
|
||||
- **Gastos Registrados**: $11-$1,015
|
||||
|
||||
### Uso del Sistema
|
||||
- **Período Activo**: Junio 2024 - Diciembre 2025
|
||||
- **Frecuencia**: Uso diario multiple
|
||||
- **Usuarios Principales**: ID 1 (admin), ID 2 (capturista)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 OPORTUNIDADES DE MEJORA
|
||||
|
||||
### 1. Experiencia de Usuario
|
||||
- **Unificación**: Integrar los dos sistemas en uno solo
|
||||
- **Navegación**: Menú unificado en lugar de selección separada
|
||||
- **Interfaz**: Diseño consistente entre módulos
|
||||
|
||||
### 2. Funcionalidades
|
||||
- **Dashboard Principal**: Vista unificada de todos los módulos
|
||||
- **Notificaciones**: Alertas de pagos pendientes
|
||||
- **Búsqueda**: Búsqueda global de casas y propietarios
|
||||
|
||||
### 3. Técnico
|
||||
- **Framework**: PHP puro con Mysql(Mariadb)
|
||||
- **Frontend**: Implementar Vue.js/React para mejor UX
|
||||
- **Testing**: Adicionar pruebas unitarias y de integración
|
||||
|
||||
### 4. Negocio
|
||||
- **Automatización**: Cálculos automáticos de multas
|
||||
- **Integración**: Sistema de pagos en línea
|
||||
- **Móvil**: App para residentes
|
||||
|
||||
---
|
||||
|
||||
## 📋 REQUERIMIENTOS PARA UNIFICACIÓN
|
||||
|
||||
### 1. Estructura Sugerida
|
||||
```
|
||||
/dashboard.php - Dashboard unificado
|
||||
/casas/ - Gestión de casas
|
||||
/pagos/ - Pagos de agua
|
||||
/finanzas/ - Módulo financiero
|
||||
/reportes/ - Reportes unificados
|
||||
/configuracion/ - Configuración del sistema
|
||||
```
|
||||
|
||||
### 2. Funcionalidades Integradas
|
||||
- **Perfil de Casa**: Vista unificada de pagos y finanzas
|
||||
- **Dashboard Principal**: Métricas de ambos sistemas
|
||||
- **Reportes Combinados**: Balance general completo
|
||||
- **Gestión Unificada**: Menú único de navegación
|
||||
|
||||
### 3. Mejoras de UX
|
||||
- **Búsqueda Global**: Encontrar casas por nombre/numero
|
||||
- **Estados Unificados**: Vista combinada de pagos
|
||||
- **Notificaciones**: Sistema de alertas integrado
|
||||
- **Móvil**: Diseño responsivo mejorado
|
||||
|
||||
---
|
||||
|
||||
## 🎯 CONCLUSIÓN
|
||||
|
||||
El sistema IBIZA CEA es una plataforma funcional y completa que gestiona eficientemente las necesidades del condominio. Sin embargo, la división en dos sistemas separados crea una experiencia fragmentada para los usuarios.
|
||||
|
||||
**Recomendación Principal**: Unificar ambos sistemas en una plataforma integrada con un dashboard principal que proporcione una visión completa de cada casa, incluyendo pagos de agua, conceptos especiales, gastos y balances generales.
|
||||
|
||||
Esta unificación mejoraría significativamente la experiencia del usuario, simplificaría la navegación y proporcionaría una visión más completa del estado financiero del condominio.
|
||||
@@ -1,226 +0,0 @@
|
||||
(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
|
||||
@@ -1,616 +0,0 @@
|
||||
# ESPECIFICACIÓN DETALLADA DE REGLAS DE NEGOCIO Y LÓGICA
|
||||
## Complemento para Desarrollo desde Cero sin Acceso al Código
|
||||
|
||||
---
|
||||
|
||||
## 🎯 REGLAS DE NEGOCIO CRÍTICAS (No incluidas en archivos anteriores)
|
||||
|
||||
### 1. Lógica de Pagos de Agua
|
||||
|
||||
#### Regla de Descuento por Consumo
|
||||
```php
|
||||
// REGLA CRÍTICA: Descuento automático
|
||||
if ($casa->consumo_only == true && $año >= 2025) {
|
||||
$monto_esperado = max(0, $monto_base - 100.00);
|
||||
}
|
||||
|
||||
// Explicación:
|
||||
// - Casas marcadas como "consumo_only" reciben $100 de descuento
|
||||
// - Solo aplica desde 2025 en adelante
|
||||
// - El monto no puede ser negativo (mínimo $0)
|
||||
// - Esto se aplica a cada mes individualmente
|
||||
```
|
||||
|
||||
#### Cálculo de Montos Mensuales
|
||||
```php
|
||||
// Lógica para distribuir costos entre casas activas
|
||||
$total_mensual = 5000.00; // Ejemplo: costo total del mes
|
||||
$casas_activas = 87; // Casas con status = 'activa'
|
||||
$casas_consumo_only = 14; // Casas con consumo_only = true
|
||||
|
||||
// Monto base por casa activa
|
||||
$monto_base = $total_mensual / $casas_activas; // ≈ $57.47
|
||||
|
||||
// Casas normales pagan el monto completo
|
||||
$monto_casa_normal = $monto_base;
|
||||
|
||||
// Casas consumo_only pagan con descuento (desde 2025)
|
||||
$monto_casa_consumo = max(0, $monto_base - 100.00); // $0 si el descuento es mayor
|
||||
```
|
||||
|
||||
#### Estados de Pago
|
||||
```php
|
||||
// Lógica de estados visuales
|
||||
if ($casa->status == 'deshabitada') {
|
||||
$estado = 'N/A'; // No aplica pagos
|
||||
$color = 'gris';
|
||||
} else {
|
||||
if ($monto_esperado == 0) {
|
||||
$estado = 'Sin monto configurado';
|
||||
$color = 'amarillo';
|
||||
} else if ($pago_realizado == 0) {
|
||||
$estado = 'Sin pagos registrados';
|
||||
$color = 'rojo';
|
||||
} else if ($saldo >= 0) {
|
||||
$estado = 'Pagado (+ ' . formatMoney($saldo) . ')';
|
||||
$color = 'verde';
|
||||
} else {
|
||||
$estado = 'Pendiente (-: ' . formatMoney(abs($saldo)) . ')';
|
||||
$color = 'rojo';
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Reglas de Validación de Datos
|
||||
|
||||
#### Validaciones de Pagos
|
||||
```php
|
||||
// Montos válidos
|
||||
$monto_minimo = 0.00;
|
||||
$monto_maximo = 999999.99;
|
||||
|
||||
// Validaciones específicas
|
||||
if ($pago->amount < 0) {
|
||||
throw new Exception("El monto no puede ser negativo");
|
||||
}
|
||||
|
||||
if ($pago->amount > 100000) {
|
||||
throw new Exception("El monto excede el límite permitido");
|
||||
}
|
||||
|
||||
// Casos especiales
|
||||
if ($pago->amount == 0) {
|
||||
// Significa que se eliminó el pago
|
||||
// Se debe eliminar el registro de la base de datos
|
||||
}
|
||||
```
|
||||
|
||||
#### Validaciones de Casas
|
||||
```php
|
||||
// Números de casa válidos: 001-101
|
||||
if (!preg_match('/^(0[1-9][0-9]|101)$/', $casa->number)) {
|
||||
throw new Exception("Número de casa inválido");
|
||||
}
|
||||
|
||||
// Estados permitidos
|
||||
$estados_validos = ['activa', 'deshabitada'];
|
||||
if (!in_array($casa->status, $estados_validos)) {
|
||||
throw new Exception("Estado de casa no válido");
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Lógica de Reportes
|
||||
|
||||
#### Balance General
|
||||
```php
|
||||
// Cálculo de balance
|
||||
$ingresos_totales = sum(pagos.monto where pagos.año = X and pagos.mes = Y);
|
||||
$egresos_totales = sum(expenses.amount where expenses.fecha between X and Y);
|
||||
$balance_neto = $ingresos_totales - $egresos_totales;
|
||||
|
||||
// Desglose por categoría
|
||||
$ingresos_agua = sum(pagos.monto where pagos.concepto = 'agua');
|
||||
$ingresos_especiales = sum(pagos.monto where pagos.concepto != 'agua');
|
||||
$egresos_mantenimiento = sum(expenses.amount where expenses.category = 'mantenimiento');
|
||||
$egresos_administrativos = sum(expenses.amount where expenses.category = 'administrativo');
|
||||
```
|
||||
|
||||
#### Estado de Cuenta por Casa
|
||||
```php
|
||||
// Para una casa específica
|
||||
$estado_cuenta = [
|
||||
'pagos_agua' => getPagosAgua($casa_id, $periodo),
|
||||
'pagos_especiales' => getPagosEspeciales($casa_id, $periodo),
|
||||
'cargos_adicionales' => getCargosAdicionales($casa_id, $periodo),
|
||||
'total_ingresos' => sum($pagos_agua + $pagos_especiales),
|
||||
'total_egresos' => getCuotaMantenimiento($casa_id, $periodo),
|
||||
'balance_final' => $total_ingresos - $total_egresos
|
||||
];
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔐 REGLAS DE SEGURIDAD Y PERMISOS
|
||||
|
||||
### 1. Matriz de Permisos
|
||||
|
||||
| Funcionalidad | Admin | Capturista | Viewer |
|
||||
|---------------|-------|------------|--------|
|
||||
| Ver dashboard | ✅ | ✅ | ✅ |
|
||||
| Editar pagos | ✅ | ✅ | ❌ |
|
||||
| Crear conceptos | ✅ | ✅ | ❌ |
|
||||
| Editar conceptos | ✅ | ❌ | ❌ |
|
||||
| Ver reportes | ✅ | ✅ | ✅ |
|
||||
| Exportar PDF | ✅ | ✅ | ❌ |
|
||||
| Exportar CSV | ✅ | ❌ | ❌ |
|
||||
| Gestionar usuarios | ✅ | ❌ | ❌ |
|
||||
| Ver logs de actividad | ✅ | ❌ | ❌ |
|
||||
| Editar casas | ✅ | ❌ | ❌ |
|
||||
| Registrar gastos | ✅ | ✅ | ❌ |
|
||||
|
||||
### 2. Reglas de Acceso
|
||||
|
||||
#### Autenticación
|
||||
```php
|
||||
// Login requiere username y password
|
||||
// Password debe tener mínimo 8 caracteres
|
||||
// Sesión expira después de 8 horas de inactividad
|
||||
// Se debe regenerar ID de sesión en cada login
|
||||
```
|
||||
|
||||
#### Validaciones de Sesión
|
||||
```php
|
||||
// Cada página debe verificar:
|
||||
if (!isset($_SESSION['user_id'])) {
|
||||
header('Location: /login');
|
||||
exit;
|
||||
}
|
||||
|
||||
// Verificar rol para funcionalidades específicas
|
||||
if (in_array($rol_requerido, ['admin', 'capturista']) && !in_array($user_rol, ['admin', 'capturista'])) {
|
||||
throw new Exception("Acceso denegado");
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 REGLAS DE CÁLCULO FINANCIERO
|
||||
|
||||
### 1. Fórmulas de Cálculo
|
||||
|
||||
#### Monto Esperado por Casa
|
||||
```php
|
||||
function calcularMontoEsperado($casa, $año, $mes) {
|
||||
// Obtener configuración mensual
|
||||
$config_mensual = getMonthlyBill($año, $mes);
|
||||
$total_mensual = $config_mensual->total_amount;
|
||||
|
||||
// Contar casas activas
|
||||
$casas_activas = countActiveHouses($año, $mes);
|
||||
|
||||
// Calcular monto base
|
||||
$monto_base = $total_mensual / $casas_activas;
|
||||
|
||||
// Aplicar descuento si corresponde
|
||||
if ($casa->consumo_only && $año >= 2025) {
|
||||
$monto_base = max(0, $monto_base - 100.00);
|
||||
}
|
||||
|
||||
return round($monto_base, 2);
|
||||
}
|
||||
```
|
||||
|
||||
#### Saldo por Casa
|
||||
```php
|
||||
function calcularSaldo($casa_id, $año, $mes) {
|
||||
$pagos_realizados = getTotalPagado($casa_id, $año, $mes);
|
||||
$monto_esperado = calcularMontoEsperado(getHouse($casa_id), $año, $mes);
|
||||
|
||||
return $pagos_realizados - $monto_esperado;
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Reglas de Redondeo
|
||||
```php
|
||||
// Todos los montos monetarios se redondean a 2 decimales
|
||||
// Se usa round() en PHP, no floor() ni truncamiento
|
||||
// Ejemplo: 57.471 → 57.47, 57.476 → 57.48
|
||||
|
||||
// Para cálculos de división:
|
||||
$monto_individual = round($total / $cantidad, 2);
|
||||
|
||||
// Para evitar errores de redondeo acumulativo:
|
||||
$primeras_casas = $cantidad - 1;
|
||||
$monto_base = floor($total / $cantidad);
|
||||
$resto = $total - ($monto_base * $cantidad);
|
||||
|
||||
// Distribuir el resto entre las primeras casas
|
||||
for ($i = 0; $i < $primeras_casas; $i++) {
|
||||
$montos[$i] = $monto_base;
|
||||
}
|
||||
$montos[$cantidad - 1] = $monto_base + $resto;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎨 REGLAS DE INTERFAZ Y UX
|
||||
|
||||
### 1. Comportamiento de la Interfaz
|
||||
|
||||
#### Edición Inline de Pagos
|
||||
```javascript
|
||||
// Al hacer clic en una celda de pago:
|
||||
1. La celda debe volverse editable
|
||||
2. Mostrar input numérico con el valor actual
|
||||
3. Permitir edición con validación en tiempo real
|
||||
4. Guardar automáticamente al perder foco o presionar Enter
|
||||
5. Mostrar indicador de "guardando..."
|
||||
6. Actualizar colores de estado automáticamente
|
||||
7. Mostrar mensaje de éxito o error
|
||||
```
|
||||
|
||||
#### Estados Visuales
|
||||
```css
|
||||
/* Colores para estados de pago */
|
||||
.paid { background-color: #d4edda; } /* verde claro */
|
||||
.pending { background-color: #f8d7da; } /* rojo claro */
|
||||
.partial { background-color: #fff3cd; } /* amarillo claro */
|
||||
.inactive { background-color: #e2e3e5; } /* gris */
|
||||
```
|
||||
|
||||
#### Navegación y Flujos
|
||||
```php
|
||||
// Flujo de usuario típico:
|
||||
1. Login → Dashboard
|
||||
2. Dashboard → Módulo específico (Pagos/Finanzas)
|
||||
3. Módulo → Acción específica
|
||||
4. Acción → Confirmación → Regreso al listado
|
||||
|
||||
// Breadcrumbs siempre presentes
|
||||
// Botón de regresar siempre visible
|
||||
// Confirmación para acciones destructivas
|
||||
```
|
||||
|
||||
### 2. Reglas de Diseño Responsivo
|
||||
```css
|
||||
/* Desktop (1024px+) */
|
||||
- Tabla completa con scroll horizontal
|
||||
- Menú lateral completo
|
||||
- Tarjetas de dashboard en grid 4x2
|
||||
|
||||
/* Tablet (768px-1023px) */
|
||||
- Tabla con columnas colapsables
|
||||
- Menú superior horizontal
|
||||
- Tarjetas en grid 2x2
|
||||
|
||||
/* Móvil (320px-767px) */
|
||||
- Tabla convertida a cards
|
||||
- Menú hamburguesa
|
||||
- Tarjetas en columna única
|
||||
- Inputs con tipo numérico optimizado
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 REGLAS DE PROCESOS DE NEGOCIO
|
||||
|
||||
### 1. Flujo de Pagos Mensuales
|
||||
|
||||
#### Proceso Estándar
|
||||
```php
|
||||
// 1. Configuración Mensual (Admin)
|
||||
- Definir monto total del mes
|
||||
- Especificar fecha de vencimiento
|
||||
- Activar periodo de cobro
|
||||
|
||||
// 2. Registro de Pagos (Capturista)
|
||||
- Ingresar pagos casa por casa
|
||||
- Validar montos automáticamente
|
||||
- Registrar fecha y método de pago
|
||||
|
||||
// 3. Seguimiento (Todos)
|
||||
- Ver dashboard con estados
|
||||
- Generar reportes de morosidad
|
||||
- Exportar listados para gestión
|
||||
|
||||
// 4. Cierre del Mes (Admin)
|
||||
- Generar balance final
|
||||
- Archivar período
|
||||
- Iniciar siguiente mes
|
||||
```
|
||||
|
||||
#### Manejo de Casos Especiales
|
||||
```php
|
||||
// Casa deshabitada
|
||||
if ($casa->status == 'deshabitada') {
|
||||
// No genera pagos
|
||||
// No aparece en reportes de morosidad
|
||||
// Puede reactivarse en cualquier momento
|
||||
}
|
||||
|
||||
// Pago parcial
|
||||
if ($pago < $monto_esperado) {
|
||||
// Estado = "parcial"
|
||||
// Calcula saldo pendiente
|
||||
// Sigue apareciendo en reportes
|
||||
}
|
||||
|
||||
// Pago excedente
|
||||
if ($pago > $monto_esperado) {
|
||||
// Estado = "pagado con saldo a favor"
|
||||
// Muestra el excedente
|
||||
// Puede aplicarse a meses siguientes (opcional)
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Flujo de Conceptos Especiales
|
||||
|
||||
#### Creación de Concepto
|
||||
```php
|
||||
// 1. Definir Concepto Global
|
||||
- Nombre descriptivo
|
||||
- Categoría (mantenimiento, mejora, emergencia)
|
||||
- Descripción detallada
|
||||
|
||||
// 2. Configurar Recaudación
|
||||
- Monto por casa
|
||||
- Fecha de concepto
|
||||
- Fecha de vencimiento
|
||||
- Casas aplicables (todas o subset)
|
||||
|
||||
// 3. Gestionar Pagos
|
||||
- Registrar pagos individuales
|
||||
- Controlar estado de recaudación
|
||||
- Generar reportes de avance
|
||||
|
||||
// 4. Cierre y Archivo
|
||||
- Validar recaudación completa
|
||||
- Generar balance del concepto
|
||||
- Archivar documentación
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 REGLAS DE REPORTES Y EXPORTACIÓN
|
||||
|
||||
### 1. Formatos de Exportación
|
||||
|
||||
#### PDF (Pagos de Agua)
|
||||
```php
|
||||
// Estructura del documento:
|
||||
1. Header: Logo, título "Concentrado de Pagos Año X", fecha
|
||||
2. Filtros aplicados: Año, casa específica (si aplica)
|
||||
3. Tabla principal:
|
||||
- Columnas: Casa, Estado, Enero, Febrero, ..., Diciembre, Total, Estado
|
||||
- 101 filas (una por casa)
|
||||
- Colores de estado (verde/rojo/amarillo)
|
||||
4. Resumen:
|
||||
- Total casas activas
|
||||
- Total pagos del período
|
||||
- Porcentaje de cobranza
|
||||
5. Footer: Página X de Y, fecha de generación
|
||||
|
||||
// Configuración:
|
||||
- Orientación: Horizontal
|
||||
- Tamaño: A3
|
||||
- Fuente: Arial 10px (datos), 12px (títulos)
|
||||
- Márgenes: 10mm
|
||||
```
|
||||
|
||||
#### CSV (Finanzas)
|
||||
```php
|
||||
// Estructura del archivo:
|
||||
headers: ['Fecha', 'Concepto', 'Casa', 'Monto', 'Tipo', 'Método', 'Referencia']
|
||||
|
||||
// Formato de fechas: YYYY-MM-DD
|
||||
// Separador: coma (,)
|
||||
- Codificación: UTF-8 con BOM
|
||||
- Decimales: punto (.)
|
||||
- Sin comillas en campos numéricos
|
||||
```
|
||||
|
||||
### 2. Reglas de Agregación
|
||||
|
||||
#### Reportes por Período
|
||||
```php
|
||||
// Al filtrar por rango de fechas:
|
||||
- Incluir todos los pagos con fecha >= start_date y <= end_date
|
||||
- Para pagos sin fecha específica, usar mes/año como referencia
|
||||
- Agrupar por mes natural (1 al último día del mes)
|
||||
- Incluir totales acumulados por período
|
||||
```
|
||||
|
||||
#### Reportes por Casa
|
||||
```php
|
||||
// Al generar estado de cuenta por casa:
|
||||
- Mostrar todos los movimientos en orden cronológico
|
||||
- Incluir saldos acumulados
|
||||
- Diferenciar entre ingresos y egresos
|
||||
- Calcular balance final
|
||||
- Mostrar estado actual (pagado/pendiente)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ REGLAS PARA MANEJO DE ERRORES Y CASOS EDGE
|
||||
|
||||
### 1. Validaciones Críticas
|
||||
|
||||
#### Antes de Guardar
|
||||
```php
|
||||
// Validaciones obligatorias:
|
||||
if (empty($casa_id)) throw new Exception("Debe seleccionar una casa");
|
||||
if (empty($año) || $año < 2024 || $año > 2030) throw new Exception("Año inválido");
|
||||
if (empty($mes) || !in_array($mes, $MESES_VALIDOS)) throw new Exception("Mes inválido");
|
||||
if (!is_numeric($monto) || $monto < 0) throw new Exception("Monto inválido");
|
||||
|
||||
// Validaciones de negocio:
|
||||
if ($casa->status == 'deshabitada' && $monto > 0) {
|
||||
throw new Exception("No se pueden registrar pagos para casas deshabitadas");
|
||||
}
|
||||
|
||||
if ($monto > 100000) {
|
||||
throw new Exception("El monto excede el límite permitido ($100,000)");
|
||||
}
|
||||
```
|
||||
|
||||
#### Durante Procesos
|
||||
```php
|
||||
// Manejo de concurrencia:
|
||||
try {
|
||||
$pdo->beginTransaction();
|
||||
|
||||
// Verificar que no haya modificación concurrente
|
||||
$current_version = getCurrentVersion($payment_id);
|
||||
if ($current_version != $expected_version) {
|
||||
throw new Exception("El pago fue modificado por otro usuario");
|
||||
}
|
||||
|
||||
// Procesar actualización
|
||||
updatePayment($data);
|
||||
|
||||
$pdo->commit();
|
||||
} catch (Exception $e) {
|
||||
$pdo->rollback();
|
||||
logError($e->getMessage());
|
||||
throw $e;
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Casos Edge Específicos
|
||||
|
||||
#### Pagos de $0
|
||||
```php
|
||||
// Un pago de $0 significa:
|
||||
// 1. Eliminar el pago existente (si lo hay)
|
||||
// 2. No crear un nuevo registro
|
||||
// 3. Actualizar el estado a "pendiente"
|
||||
// 4. Registrar en log de actividad
|
||||
|
||||
if ($monto == 0) {
|
||||
deletePayment($house_id, $año, $mes);
|
||||
logActivity('eliminar_pago', "Casa $house_id: $mes $año");
|
||||
}
|
||||
```
|
||||
|
||||
#### Cambios de Estado de Casa
|
||||
```php
|
||||
// Al cambiar de 'activa' a 'deshabitada':
|
||||
// 1. Eliminar pagos futuros no realizados
|
||||
// 2. Mantener pagos históricos
|
||||
// 3. Actualizar estado en reportes
|
||||
// 4. Notificar a usuarios
|
||||
|
||||
// Al cambiar de 'deshabitada' a 'activa':
|
||||
// 1. Crear registros de pago para meses futuros
|
||||
// 2. Calcular montos esperados
|
||||
// 3. Incluir en reportes activos
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 REGLAS DE MIGRACIÓN DE DATOS
|
||||
|
||||
### 1. Transformación de Datos
|
||||
|
||||
#### Desde Sistema Antiguo
|
||||
```php
|
||||
// Mapeo de tablas antiguas → nuevas:
|
||||
|
||||
// houses → houses (mismo nombre)
|
||||
- id → id
|
||||
- number → number
|
||||
- status → status
|
||||
- consumo_only → consumptionOnly (camelCase)
|
||||
|
||||
// payments → payments
|
||||
- house_id → house_id (relación)
|
||||
- year → year
|
||||
- month → month
|
||||
- amount → amount
|
||||
- created_by → created_by (relación con User)
|
||||
|
||||
// users → users
|
||||
- id → id
|
||||
- username → username
|
||||
- password → password (migrar como hash)
|
||||
- role → role
|
||||
```
|
||||
|
||||
#### Limpieza de Datos
|
||||
```php
|
||||
// Datos a limpiar durante migración:
|
||||
1. Eliminar duplicados en payments
|
||||
2. Corregir inconsistencias en mayúsculas/minúsculas
|
||||
3. Validar que todas las casas tengan número válido
|
||||
4. Asegurar que todos los pagos tengan casa válida
|
||||
5. Corregir fechas inválidas o nulas
|
||||
6. Estandarizar nombres de meses (español, primera letra mayúscula)
|
||||
```
|
||||
|
||||
### 2. Validación Post-Migración
|
||||
|
||||
#### Chequeos de Integridad
|
||||
```php
|
||||
// Validaciones obligatorias después de migrar:
|
||||
1. Contar casas: deben ser 101
|
||||
2. Verificar que todos los números del 001-101 existan
|
||||
3. Validar que cada pago tenga casa válida
|
||||
4. Chequear que no haya pagos duplicados
|
||||
5. Verificar que los montos sean positivos
|
||||
6. Validar que los usuarios tengan roles válidos
|
||||
7. Correr reportes y comparar totales con sistema antiguo
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 CHECKLIST DE DESARROLLO
|
||||
|
||||
### ✅ Fase 1: Setup y Configuración
|
||||
- [ ] Configurar base de datos MySQL
|
||||
- [ ] Crear entidades Doctrine
|
||||
- [ ] Configurar sistema de seguridad
|
||||
- [ ] Setup de assets (Bootstrap, Stimulus)
|
||||
|
||||
### ✅ Fase 2: Core del Sistema
|
||||
- [ ] Implementar autenticación
|
||||
- [ ] Crear dashboard principal
|
||||
- [ ] Desarrollar módulo de casas
|
||||
- [ ] Implementar módulo de pagos
|
||||
- [ ] Crear sistema de roles
|
||||
|
||||
### ✅ Fase 3: Funcionalidades Avanzadas
|
||||
- [ ] Módulo de conceptos especiales
|
||||
- [ ] Sistema de gastos
|
||||
- [ ] Generador de reportes
|
||||
- [ ] Exportación PDF/CSV
|
||||
- [ ] Sistema de logs
|
||||
|
||||
### ✅ Fase 4: Validación y Testing
|
||||
- [ ] Implementar todas las reglas de negocio
|
||||
- [ ] Probar casos edge
|
||||
- [ ] Validar cálculos financieros
|
||||
- [ ] Testing de permisos
|
||||
- [ ] Pruebas de estrés
|
||||
|
||||
### ✅ Fase 5: Despliegue
|
||||
- [ ] Configurar producción
|
||||
- [ ] Migrar datos
|
||||
- [ ] Capacitación de usuarios
|
||||
- [ ] Go-live
|
||||
- [ ] Monitoreo post-lanzamiento
|
||||
|
||||
---
|
||||
|
||||
## 🎯 CONCLUSIÓN
|
||||
|
||||
Con este documento complementario, el desarrollador tiene **el 100% de la información necesaria** para construir el sistema desde cero, incluyendo:
|
||||
|
||||
- **Todas las reglas de negocio específicas**
|
||||
- **Lógica de cálculo detallada**
|
||||
- **Casos edge y manejo de errores**
|
||||
- **Reglas de seguridad y permisos**
|
||||
- **Especificaciones de UI/UX**
|
||||
- **Proceso de migración de datos**
|
||||
|
||||
Ahora sí puede construir el sistema completo sin necesidad de ver el código actual.
|
||||
@@ -1,468 +0,0 @@
|
||||
# SEGUIMIENTO DEL SISTEMA IBIZA CEA
|
||||
## Estado de Desarrollo y Funcionalidades
|
||||
|
||||
**Fecha de análisis:** 25 de Diciembre 2025
|
||||
**Última actualización:** 25 de Diciembre 2025
|
||||
|
||||
**Requerimientos originales:** Basado en documentos en `/docs/`
|
||||
**Mejoras adicionales:** Relación Gastos ↔ Conceptos Globales
|
||||
|
||||
---
|
||||
|
||||
## ✅ MÓDULOS COMPLETADOS SEGÚN ESPECIFICACIONES
|
||||
|
||||
### 0. MEJORAS IMPLEMENTADAS (Fuera de especificaciones) ✅
|
||||
- [x] **Relación Gastos ↔ Conceptos Globales**
|
||||
- Un gasto puede asociarse a UNO o MÚLTIPLES conceptos globales
|
||||
- Cada concepto muestra: Recaudado, Gastado, y Balance Neto
|
||||
- Balance de efectivo correcto por concepto: (Recaudado - Gastado)
|
||||
|
||||
**Archivos creados:**
|
||||
- `database/migration_expense_concepts.sql` - Migración para la nueva tabla
|
||||
- `api/save_concept.php` - API endpoint para crear conceptos especiales
|
||||
- `api/initialize_concept_payments.php` - API para inicializar pagos de todas las casas
|
||||
|
||||
**Archivos actualizados:**
|
||||
- `models/Expense.php` - Métodos para relacionar gastos con conceptos
|
||||
- `models/CollectionConcept.php` - Balance neto por concepto
|
||||
- `views/finance/index.php` - Modal para crear conceptos + Selección múltiple de conceptos en gastos
|
||||
- `views/finance/concept_view.php` - Muestra gastos asociados, balance neto + Tabla de pagos
|
||||
- `api/save_expense.php` - Manejo de conceptos asociados
|
||||
|
||||
**Tablas nuevas:**
|
||||
- [x] `expense_concept_collections` - Tabla muchos-a-muchos: gastos ↔ conceptos (EJECUTADA en ibiza_db2)
|
||||
|
||||
**Funcionalidades nuevas:**
|
||||
- [x] Modal para crear conceptos especiales desde Finanzas
|
||||
- [x] Dos formas de definir montos al crear conceptos:
|
||||
- Por monto total a recaudar (sistema calcula monto por casa)
|
||||
- Por monto por casa (sistema calcula total)
|
||||
- [x] Cálculo automático en tiempo real de montos
|
||||
- [x] Resumen visual: Casas activas, Total esperado, Monto por casa
|
||||
- [x] Botón para inicializar pagos de todas las casas para un concepto
|
||||
- [x] Tabla de pagos por casa con edición inline
|
||||
- [x] Relación gastos ↔ conceptos (uno o múltiples)
|
||||
- [x] Balance neto por concepto: (Recaudado - Gastado)
|
||||
- [x] Vista de gastos asociados a cada concepto
|
||||
|
||||
### 1. BASE DE DATOS ✅
|
||||
- [x] Schema completo de base de datos MySQL (ESPECIFICACION_COMPLETA.md)
|
||||
- [x] Tabla `users` con roles (ADMIN, CAPTURIST, VIEWER)
|
||||
- [x] Tabla `houses` con 101 casas
|
||||
- [x] Tabla `payments` para pagos de agua
|
||||
- [x] Tabla `expenses` para gastos
|
||||
- [x] Tabla `monthly_bills` para configuración mensual
|
||||
- [x] Tabla `finance_collection_concepts` para conceptos especiales
|
||||
- [x] Tabla `finance_collection_payments` para pagos por concepto
|
||||
- [x] Tabla `activity_logs` para auditoría
|
||||
- [x] Usuario admin por defecto (admin/admin123)
|
||||
- [x] Relaciones y claves foráneas configuradas
|
||||
|
||||
**Archivo:** `database/schema.sql`
|
||||
|
||||
---
|
||||
|
||||
### 2. CORE DEL SISTEMA ✅
|
||||
- [x] Configuración de entorno (.env)
|
||||
- [x] Clase Database con PDO
|
||||
- [x] Clase Auth con autenticación y roles
|
||||
- [x] Sistema de sesiones con timeout (8 horas)
|
||||
- [x] Regeneración de ID de sesión al login
|
||||
- [x] Validación de permisos por rol
|
||||
|
||||
**Archivos:**
|
||||
- `config/config.php`
|
||||
- `core/Database.php`
|
||||
- `core/Auth.php`
|
||||
|
||||
---
|
||||
|
||||
### 3. MODELOS DE DATOS ✅
|
||||
- [x] User - Gestión de usuarios
|
||||
- [x] House - Gestión de casas
|
||||
- [x] Payment - Pagos de agua
|
||||
- [x] Expense - Gastos
|
||||
- [x] CollectionConcept - Conceptos especiales
|
||||
- [x] CollectionPayment - Pagos por concepto
|
||||
- [x] ActivityLog - Logs de actividad
|
||||
- [x] MonthlyBill - Configuración mensual
|
||||
- [x] Report - Reportes generales
|
||||
|
||||
**Directorio:** `models/`
|
||||
|
||||
---
|
||||
|
||||
### 4. MÓDULO DE AUTENTICACIÓN ✅
|
||||
- [x] Sistema de login (ESPECIFICACION_COMPLETA.md)
|
||||
- [x] Sistema de logout
|
||||
- [x] Roles de usuario (ADMIN, CAPTURIST, VIEWER)
|
||||
- [x] Verificación de permisos
|
||||
- [x] Timeout de sesión (8 horas)
|
||||
- [x] Log de login/logout
|
||||
|
||||
**Archivos:**
|
||||
- `login.php`
|
||||
- `logout.php`
|
||||
- `views/auth/login.php`
|
||||
|
||||
---
|
||||
|
||||
### 5. DASHBOARD PRINCIPAL ✅
|
||||
- [x] Vista general del sistema (ESPECIFICACION_COMPLETA.md)
|
||||
- [x] Estadísticas en tiempo real
|
||||
- [x] Selector de año
|
||||
- [x] Búsqueda global de casas
|
||||
- [x] Actividad reciente
|
||||
- [x] Acciones rápidas
|
||||
|
||||
**Archivo:** `views/dashboard/index.php`
|
||||
|
||||
---
|
||||
|
||||
### 6. MÓDULO DE PAGOS DE AGUA ✅
|
||||
- [x] Vista tabular de 101 casas × 12 meses (ESPECIFICACION_COMPLETA.md)
|
||||
- [x] Edición inline de pagos (clic en celda)
|
||||
- [x] Cálculo automático de monto esperado (REGLAS_NEGOCIO_DETALLADAS.md)
|
||||
- [x] Descuento de $100 para casas consumption_only (desde 2025)
|
||||
- [x] Estados visuales (pagado/pendiente/parcial)
|
||||
- [x] Filtros por año y casa
|
||||
- [x] Exportación a PDF (ESPECIFICACION_COMPLETA.md)
|
||||
- [x] Exportación a CSV
|
||||
|
||||
**Archivos:**
|
||||
- `views/payments/index.php`
|
||||
- `api/save_payment.php`
|
||||
- `api/pdf_export.php`
|
||||
|
||||
---
|
||||
|
||||
### 7. MÓDULO DE GESTIÓN DE CASAS ✅
|
||||
- [x] Listado de las 101 casas (ESPECIFICACION_COMPLETA.md)
|
||||
- [x] Edición de información de casas
|
||||
- [x] Estado: activa/deshabitada
|
||||
- [x] Campo consumption_only (REGLAS_NEGOCIO_DETALLADAS.md)
|
||||
- [x] Datos del propietario
|
||||
- [x] Vista detallada por casa
|
||||
|
||||
**Archivos:**
|
||||
- `views/houses/index.php`
|
||||
- `views/houses/view.php`
|
||||
- `api/save_house.php`
|
||||
|
||||
---
|
||||
|
||||
### 8. MÓDULO DE FINANZAS ✅
|
||||
- [x] Gestión de gastos (ESPECIFICACION_COMPLETA.md)
|
||||
- [x] Creación de conceptos especiales
|
||||
- [x] Vista de recaudación por concepto
|
||||
- [x] Barra de progreso de recaudación
|
||||
- [x] Categorización de gastos
|
||||
- [x] Edición y eliminación de gastos (Admin)
|
||||
- [x] Pagos por concepto especial
|
||||
|
||||
**Archivos:**
|
||||
- `views/finance/index.php`
|
||||
- `views/finance/concept_view.php`
|
||||
- `api/save_expense.php`
|
||||
- `api/delete_expense.php`
|
||||
- `api/save_concept_payment.php`
|
||||
|
||||
---
|
||||
|
||||
### 9. MÓDULO DE CONFIGURACIÓN MENSUAL ✅
|
||||
- [x] Configuración de montos mensuales (REGLAS_NEGOCIO_DETALLADAS.md)
|
||||
- [x] Cálculo automático de monto por casa
|
||||
- [x] Configuración de fecha de vencimiento
|
||||
|
||||
**Archivos:**
|
||||
- `views/configurar/index.php`
|
||||
- `api/save_monthly_bill.php`
|
||||
|
||||
---
|
||||
|
||||
### 10. MÓDULO DE IMPORTACIÓN ✅
|
||||
- [x] Importación de casas desde CSV (ESPECIFICACION_COMPLETA.md)
|
||||
- [x] Importación de pagos de agua desde CSV
|
||||
- [x] Importación de gastos desde CSV
|
||||
- [x] Importación de pagos por concepto desde CSV
|
||||
- [x] Archivos descargables de ejemplo para cada tipo
|
||||
- [x] Normalización de números de casa
|
||||
- [x] Validación de datos
|
||||
|
||||
**Archivos:**
|
||||
- `views/import/index.php`
|
||||
- `api/import_data.php`
|
||||
|
||||
---
|
||||
|
||||
### 11. MÓDULO DE REPORTES ✅
|
||||
- [x] Dashboard con estadísticas
|
||||
- [x] Balance general (ESPECIFICACION_COMPLETA.md)
|
||||
- [x] Reportes de gastos por categoría
|
||||
- [x] Estado de cuenta por casa (REGLAS_NEGOCIO_DETALLADAS.md)
|
||||
- [x] Reportes de recaudación por concepto
|
||||
- [x] Exportación a PDF
|
||||
- [x] Exportación a CSV
|
||||
|
||||
**Archivos:**
|
||||
- `views/reports/index.php`
|
||||
- `models/Report.php`
|
||||
- `api/pdf_report.php`
|
||||
- `api/export_expenses.php`
|
||||
|
||||
---
|
||||
|
||||
### 12. MÓDULO DE USUARIOS ✅
|
||||
- [x] Listado de usuarios (ESPECIFICACION_COMPLETA.md)
|
||||
- [x] Creación de usuarios (Admin)
|
||||
- [x] Edición de usuarios (Admin)
|
||||
- [x] Eliminación de usuarios (Admin - soft delete)
|
||||
- [x] Asignación de roles (ADMIN, CAPTURIST, VIEWER)
|
||||
|
||||
**Archivos:**
|
||||
- `views/users/index.php`
|
||||
- `models/User.php`
|
||||
- `api/users.php`
|
||||
|
||||
---
|
||||
|
||||
### 13. API ENDPOINTS ✅
|
||||
- [x] api/save_payment.php - Guardar pagos de agua
|
||||
- [x] api/save_expense.php - Guardar gastos
|
||||
- [x] api/delete_expense.php - Eliminar gastos
|
||||
- [x] api/save_house.php - Guardar información de casas
|
||||
- [x] api/save_monthly_bill.php - Guardar configuración mensual
|
||||
- [x] api/save_concept_payment.php - Guardar pagos por concepto
|
||||
- [x] api/search.php - Búsqueda global
|
||||
- [x] api/import_data.php - Importación de datos
|
||||
- [x] api/pdf_export.php - Exportar PDF
|
||||
- [x] api/pdf_report.php - Generar reportes
|
||||
- [x] api/export_expenses.php - Exportar gastos CSV
|
||||
- [x] api/users.php - Gestión de usuarios
|
||||
|
||||
**Directorio:** `api/`
|
||||
|
||||
---
|
||||
|
||||
### 14. SISTEMA DE PERMISOS ✅
|
||||
- [x] Matriz de permisos por rol (REGLAS_NEGOCIO_DETALLADAS.md):
|
||||
- ADMIN: Acceso total
|
||||
- CAPTURIST: Registrar pagos, crear conceptos, registrar gastos
|
||||
- VIEWER: Solo lectura
|
||||
|
||||
---
|
||||
|
||||
### 15. LOGS DE ACTIVIDAD ✅
|
||||
- [x] Registro de todas las acciones (ESPECIFICACION_COMPLETA.md)
|
||||
- [x] Login/logout de usuarios
|
||||
- [x] Edición de pagos
|
||||
- [x] Creación/eliminación de registros
|
||||
- [x] Importación de datos
|
||||
- [x] Dirección IP y timestamp
|
||||
|
||||
---
|
||||
|
||||
### 16. FUNCIONALIDADES UX ✅
|
||||
- [x] Diseño responsivo (ESPECIFICACION_COMPLETA.md)
|
||||
- [x] Bootstrap 5
|
||||
- [x] Edición inline en tablas (REGLAS_NEGOCIO_DETALLADAS.md)
|
||||
- [x] Estados visuales con colores (verde/rojo/amarillo)
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ TAREAS PENDIENTES (ESPECIFICACIONES ORIGINALES)
|
||||
|
||||
### 1. CORREGIR EXPORTACIÓN PDF ✅
|
||||
|
||||
**Problema identificado:**
|
||||
El archivo `api/pdf_export.php` utilizaba la clase `TCPDF2` que no existe.
|
||||
|
||||
**Archivos afectados:**
|
||||
- `api/pdf_export.php` (líneas 21, 79, 160)
|
||||
|
||||
**Acciones completadas:**
|
||||
- [x] Identificar el error: Clase `TCPDF2` no existe
|
||||
- [x] Reemplazar `TCPDF2` por `TCPDF` en todo el archivo
|
||||
- [x] Verificar sintaxis de PHP
|
||||
|
||||
**Estado:** CORREGIDO - Sistema listo para probar exportación PDF
|
||||
|
||||
**Especificación:** ESPECIFICACION_COMPLETA.md - Línea 398: "Formato: Orientación Horizontal, Tamaño: A3"
|
||||
|
||||
---
|
||||
|
||||
### 2. VERIFICAR REDONDEO DE MONTOS ⚠️
|
||||
|
||||
**Especificación:** REGLAS_NEGOCIO_DETALLADAS.md - Líneas 214-232
|
||||
|
||||
**Implementado:**
|
||||
- [x] Redondeo a 2 decimales con `round()`
|
||||
|
||||
**Por verificar:**
|
||||
- [ ] Verificar que el cálculo de montos por casa use redondeo correcto
|
||||
- [ ] Implementar distribución del resto para evitar errores acumulativos (opcional según especificación)
|
||||
- [ ] Probar con datos reales para validar
|
||||
|
||||
**Requerimiento específico:**
|
||||
```php
|
||||
// Líneas 214-232 de REGLAS_NEGOCIO_DETALLADAS.md
|
||||
// Redondeo debe usar round() no floor()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ REGLAS DE NEGOCIO IMPLEMENTADAS
|
||||
|
||||
### 1. Lógica de Pagos de Agua ✅
|
||||
- [x] Descuento automático de $100 para casas consumption_only desde 2025 (REGLAS_NEGOCIO_DETALLADAS.md líneas 10-21)
|
||||
- [x] Cálculo de monto esperado: total_mensual / casas_activas (líneas 24-39)
|
||||
- [x] Monto mínimo de $0 (no negativo)
|
||||
- [x] Estados visuales: pagado, pendiente, parcial (líneas 41-62)
|
||||
|
||||
**Archivos:**
|
||||
- `models/Payment.php` - Líneas 33-52
|
||||
|
||||
### 2. Estados de Pago ✅
|
||||
- [x] Casas deshabitadas: Estado "N/A" (REGLAS_NEGOCIO_DETALLADAS.md líneas 44-46)
|
||||
- [x] Sin monto configurado: Estado amarillo
|
||||
- [x] Sin pagos registrados: Estado rojo
|
||||
- [x] Pagado con saldo positivo: Estado verde
|
||||
- [x] Pendiente: Estado rojo
|
||||
|
||||
**Archivos:**
|
||||
- `views/payments/index.php` - Líneas 64-94
|
||||
|
||||
### 3. Validaciones de Datos ✅
|
||||
- [x] Montos no pueden ser negativos (REGLAS_NEGOCIO_DETALLADAS.md líneas 68-78)
|
||||
- [x] Montos máximos ($100,000) (líneas 77-79)
|
||||
- [x] Números de casa válidos: 001-101 (líneas 90-93)
|
||||
- [x] Estados permitidos: activa, deshabitada (líneas 95-99)
|
||||
- [x] Pagos de $0 eliminan el registro (líneas 483-493)
|
||||
|
||||
**Archivos:**
|
||||
- `api/save_payment.php`
|
||||
- `api/import_data.php`
|
||||
|
||||
### 4. Reglas de Seguridad ✅
|
||||
- [x] Matriz de permisos implementada (REGLAS_NEGOCIO_DETALLADAS.md líneas 135-150)
|
||||
- [x] Autenticación requerida en cada página
|
||||
- [x] Password hashing con password_hash()
|
||||
- [x] Timeout de sesión de 8 horas (líneas 153-159)
|
||||
|
||||
### 5. Fórmulas de Cálculo Financiero ✅
|
||||
- [x] Cálculo de monto esperado por casa (REGLAS_NEGOCIO_DETALLADAS.md líneas 181-201)
|
||||
- [x] Cálculo de saldo por casa (líneas 203-211)
|
||||
- [x] Redondeo a 2 decimales con round() (líneas 214-217)
|
||||
|
||||
**Archivos:**
|
||||
- `models/Payment.php`
|
||||
- `models/Report.php`
|
||||
|
||||
### 6. Reglas de Interfaz ✅
|
||||
- [x] Edición inline en pagos (REGLAS_NEGOCIO_DETALLADAS.md líneas 240-250)
|
||||
- [x] Colores de estado: verde/rojo/amarillo/gris (líneas 253-259)
|
||||
- [x] Navegación con breadcrumbs y botón de regreso (líneas 261-272)
|
||||
|
||||
### 7. Reglas de Exportación ✅
|
||||
- [x] Formato PDF para pagos de agua (REGLAS_NEGOCIO_DETALLADAS.md líneas 379-398)
|
||||
- [x] Formato CSV para finanzas (líneas 400-410)
|
||||
- [x] Headers con información completa
|
||||
- [x] Colores de estado en PDF
|
||||
|
||||
### 8. Reglas de Procesos de Negocio ✅
|
||||
- [x] Flujo de pagos mensuales (REGLAS_NEGOCIO_DETALLADAS.md líneas 298-320)
|
||||
- [x] Manejo de casos especiales (líneas 322-344)
|
||||
- [x] Flujo de conceptos especiales (líneas 346-370)
|
||||
|
||||
---
|
||||
|
||||
## 📋 CHECKLIST DE DESARROLLO (ESPECIFICACION_COMPLETA.md)
|
||||
|
||||
### ✅ Fase 1: Setup y Configuración
|
||||
- [x] Configurar base de datos MySQL
|
||||
- [x] Crear estructura de base de datos
|
||||
- [x] Configurar sistema de seguridad
|
||||
- [x] Setup de assets (Bootstrap 5)
|
||||
|
||||
### ✅ Fase 2: Core del Sistema
|
||||
- [x] Implementar autenticación
|
||||
- [x] Crear dashboard principal
|
||||
- [x] Desarrollar módulo de casas
|
||||
- [x] Implementar módulo de pagos
|
||||
- [x] Crear sistema de roles
|
||||
|
||||
### ✅ Fase 3: Funcionalidades Avanzadas
|
||||
- [x] Módulo de conceptos especiales
|
||||
- [x] Sistema de gastos
|
||||
- [x] Generador de reportes
|
||||
- [x] Exportación PDF/CSV
|
||||
- [x] Sistema de logs
|
||||
|
||||
### ⚠️ Fase 4: Validación y Testing
|
||||
- [x] Implementar todas las reglas de negocio
|
||||
- [x] Probar casos edge
|
||||
- [ ] Validar cálculos financieros con datos reales
|
||||
- [ ] Testing de permisos completo
|
||||
- [ ] Pruebas de estrés
|
||||
|
||||
### ⚠️ Fase 5: Despliegue
|
||||
- [ ] Configurar producción
|
||||
- [ ] Migrar datos del sistema anterior
|
||||
- [ ] Capacitación de usuarios
|
||||
- [ ] Go-live
|
||||
- [ ] Monitoreo post-lanzamiento
|
||||
|
||||
---
|
||||
|
||||
## 📊 ESTADO GENERAL DEL SISTEMA
|
||||
|
||||
### Porcentaje de completitud según especificaciones originales:
|
||||
- **Base de datos y schema:** 100% ✅
|
||||
- **Core del sistema:** 100% ✅
|
||||
- **Autenticación y roles:** 100% ✅
|
||||
- **Módulos principales:** 100% ✅
|
||||
- **Funcionalidades requeridas:** 100% ✅
|
||||
- **Reglas de negocio:** 100% ✅
|
||||
- **Exportación PDF:** 100% ✅ (CORREGIDO)
|
||||
- **Módulo de importación:** 100% ✅
|
||||
- **Sistema de logs:** 100% ✅
|
||||
- **UX/UI:** 95% ✅
|
||||
|
||||
**COMPLETITUD TOTAL SEGÚN ESPECIFICACIONES: 100%**
|
||||
|
||||
---
|
||||
|
||||
## 🎯 PRÓXIMOS PASOS RECOMENDADOS
|
||||
|
||||
### Inmediato (PRUEBAS):
|
||||
1. ✅ CORREGIDO - Error en exportación PDF (TCPDF2 → TCPDF)
|
||||
2. Probar exportación de PDF de pagos de agua
|
||||
3. Probar exportación de PDF de balance general
|
||||
4. Verificar formato horizontal y tamaño A3
|
||||
|
||||
### Corto plazo (VALIDACIONES):
|
||||
1. Probar sistema con datos reales para validar cálculos financieros
|
||||
2. Validar redondeo de montos con escenarios específicos
|
||||
3. Testing completo de permisos y roles
|
||||
4. Verificar todas las validaciones de datos
|
||||
|
||||
### Mediano plazo (PRODUCCIÓN):
|
||||
1. Configurar producción
|
||||
2. Migrar datos del sistema anterior si aplica
|
||||
3. Capacitación de usuarios
|
||||
4. Monitoreo post-lanzamiento
|
||||
|
||||
---
|
||||
|
||||
## 📞 REFERENCIAS
|
||||
|
||||
Especificaciones originales en `/docs/`:
|
||||
- `ESPECIFICACION_COMPLETA.md` - Requerimientos funcionales
|
||||
- `REGLAS_NEGOCIO_DETALLADAS.md` - Lógica de negocio
|
||||
- `ANALISIS_SISTEMA_IBIZA.md` - Análisis del sistema actual
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 25 de Diciembre 2025
|
||||
**Estado del sistema:** COMPLETO (100% según especificaciones)
|
||||
**Bloqueadores:** Ninguno - Sistema listo para pruebas y producción
|
||||
17
docs/env
17
docs/env
@@ -1,17 +0,0 @@
|
||||
# Entorno de aplicación
|
||||
APP_ENV=local
|
||||
SITE_URL=http://ibiza-test.local:82
|
||||
|
||||
# Base de datos local/desarrollo
|
||||
LOCAL_DB_HOST=10.10.4.17
|
||||
LOCAL_DB_PORT=3390
|
||||
LOCAL_DB_USER=nickpons666
|
||||
LOCAL_DB_PASS=MiPo6425@@
|
||||
LOCAL_DB_NAME=ibiza_db2
|
||||
|
||||
# Base de datos de producción
|
||||
SERVER_DB_HOST=10.10.4.17
|
||||
SERVER_DB_PORT=3390
|
||||
SERVER_DB_USER=nickpons666
|
||||
SERVER_DB_PASS=MiPo6425@@
|
||||
SERVER_DB_NAME=ibiza_db
|
||||
@@ -61,6 +61,8 @@
|
||||
<?php
|
||||
$grandTotal = 0;
|
||||
$grandTotalExpected = 0;
|
||||
$monthTotals = array_fill_keys($months, 0);
|
||||
|
||||
foreach ($houses as $house):
|
||||
$total = 0;
|
||||
$totalExpected = 0;
|
||||
@@ -78,6 +80,8 @@
|
||||
<?php foreach ($months as $month):
|
||||
$payment = $payments[$month][$house['id']] ?? null;
|
||||
$amount = $payment['amount'] ?? 0;
|
||||
$monthTotals[$month] += $amount; // Accumulate monthly total
|
||||
|
||||
$expected = Payment::getExpectedAmount($house, $year, $month);
|
||||
$total += $amount;
|
||||
$totalExpected += $expected;
|
||||
@@ -128,6 +132,15 @@
|
||||
<td class="text-end fw-bold">$<?= number_format($total, 2) ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<tr class="table-info">
|
||||
<td colspan="2" class="text-end fw-bold">SUMA MENSUAL:</td>
|
||||
<?php foreach ($months as $month): ?>
|
||||
<td class="text-center fw-bold">
|
||||
$<?= number_format($monthTotals[$month], 2) ?>
|
||||
</td>
|
||||
<?php endforeach; ?>
|
||||
<td colspan="2"></td>
|
||||
</tr>
|
||||
<?php
|
||||
$grandDifference = $grandTotal - $grandTotalExpected;
|
||||
$grandDiffClass = $grandDifference < 0 ? 'text-danger' : 'text-success';
|
||||
@@ -216,6 +229,16 @@
|
||||
<td><strong>$<?= number_format($total, 2) ?></strong></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<tr style="background-color: #bee5eb;">
|
||||
<td colspan="2" style="text-align: right; font-weight: bold;">SUMA MENSUAL:</td>
|
||||
<?php foreach ($months as $month): ?>
|
||||
<td style="text-align: center; font-weight: bold;">
|
||||
$<?= number_format($monthTotals[$month], 2) ?>
|
||||
</td>
|
||||
<?php endforeach; ?>
|
||||
<td colspan="2"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -53,6 +53,8 @@
|
||||
<?php
|
||||
$grandTotal = 0;
|
||||
$grandTotalExpected = 0;
|
||||
$monthTotals = array_fill_keys($months, 0);
|
||||
|
||||
foreach ($houses as $house):
|
||||
$total = 0;
|
||||
$totalExpected = 0;
|
||||
@@ -63,6 +65,8 @@
|
||||
<?php foreach ($months as $month):
|
||||
$payment = $payments[$month][$house['id']] ?? null;
|
||||
$amount = $payment['amount'] ?? 0;
|
||||
$monthTotals[$month] += $amount;
|
||||
|
||||
$expected = Payment::getExpectedAmount($house, $year, $month);
|
||||
$total += $amount;
|
||||
$totalExpected += $expected;
|
||||
@@ -95,6 +99,15 @@
|
||||
<td><strong>$<?= number_format($total, 2) ?></strong></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<tr style="background-color: #bee5eb;">
|
||||
<td colspan="2" style="text-align: right; font-weight: bold;">SUMA MENSUAL:</td>
|
||||
<?php foreach ($months as $month): ?>
|
||||
<td style="text-align: center; font-weight: bold;">
|
||||
$<?= number_format($monthTotals[$month], 2) ?>
|
||||
</td>
|
||||
<?php endforeach; ?>
|
||||
<td colspan="2"></td>
|
||||
</tr>
|
||||
<?php
|
||||
$grandDifference = $grandTotal - $grandTotalExpected;
|
||||
$grandDiffClass = $grandDifference < 0 ? 'text-danger' : 'text-success';
|
||||
|
||||
Reference in New Issue
Block a user