223 lines
8.0 KiB
Markdown
223 lines
8.0 KiB
Markdown
# EFINTEL | ERP Interno I+D+i — Sistema de Control de Gastos
|
|
|
|
**Sistema Django de Control Financiero, Operaciones, Talento y Proyectos**
|
|
|
|
Dashboard corporativo para la gestión financiera del Área de Investigación, Desarrollo e Innovación (I+D+i) de EFINTEL. Construido con Django 6.1, autenticación por roles, base de datos SQLite, y WebSockets en tiempo real.
|
|
|
|
---
|
|
|
|
## Requisitos del Sistema
|
|
|
|
| Componente | Versión | ¿Necesario? |
|
|
|---|---|---|
|
|
| **Python** | 3.10 o superior | ✅ Obligatorio |
|
|
| **pip** | (viene con Python) | ✅ Obligatorio |
|
|
| **macOS** | 12 Monterey o superior | 💡 Recomendado |
|
|
| Node.js / npm | — | ❌ No necesario |
|
|
| PostgreSQL | — | ❌ No necesario (usa SQLite) |
|
|
| Redis | — | ❌ No necesario (usa InMemoryChannelLayer) |
|
|
|
|
### Instalación de Python en macOS (si no lo tienes)
|
|
|
|
```bash
|
|
# 1. Instalar Homebrew (si no lo tienes)
|
|
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
|
|
# Para Apple Silicon (M1/M2/M3/M4), agregar al PATH:
|
|
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
|
|
eval "$(/opt/homebrew/bin/brew shellenv)"
|
|
|
|
# 2. Instalar Python 3.12
|
|
brew install python@3.12
|
|
|
|
# 3. Verificar
|
|
python3 --version && pip3 --version
|
|
```
|
|
|
|
---
|
|
|
|
## Arranque Rápido
|
|
|
|
### Opción A: Script automático (recomendado)
|
|
|
|
```bash
|
|
# Solo la primera vez — dar permisos:
|
|
chmod +x start.sh
|
|
|
|
# Iniciar el sistema:
|
|
./start.sh
|
|
```
|
|
|
|
El script automáticamente:
|
|
1. ✅ Verifica Python 3
|
|
2. ✅ Crea entorno virtual (`venv`) si no existe
|
|
3. ✅ Instala las 29 dependencias (Django, Channels, Daphne, etc.)
|
|
4. ✅ Ejecuta migraciones de base de datos
|
|
5. ✅ Crea usuarios y roles (primera ejecución)
|
|
6. ✅ Inicia el servidor Daphne en `http://localhost:8000`
|
|
7. ✅ Abre el navegador automáticamente (macOS)
|
|
|
|
### Opción B: Manual
|
|
|
|
```bash
|
|
# 1. Crear entorno virtual
|
|
python3 -m venv venv
|
|
|
|
# 2. Activar
|
|
source venv/bin/activate
|
|
|
|
# 3. Instalar dependencias
|
|
pip install -r requirements.txt
|
|
|
|
# 4. Migraciones
|
|
python manage.py migrate
|
|
|
|
# 5. Crear usuarios (solo la primera vez)
|
|
python setup_roles.py
|
|
|
|
# 6. Iniciar servidor
|
|
python -m daphne -b 0.0.0.0 -p 8000 config.asgi:application
|
|
```
|
|
|
|
Abrir en el navegador: **http://localhost:8000**
|
|
|
|
Para detener: **Ctrl + C**
|
|
|
|
---
|
|
|
|
## Cuentas de Usuario
|
|
|
|
| Usuario | Contraseña | Rol | Acceso |
|
|
|---|---|---|---|
|
|
| `admin` | `admin` | Administrador | ✅ Panel de Gestión + Admin Django |
|
|
| `ginevra_ortega` | `ginevra123` | Administrador | ✅ Panel de Gestión + Admin Django |
|
|
| `finanzas` | `finanzas123` | Administrador Finanzas | 💰 Liberación de pagos |
|
|
| `miguel_contreras` | `miguel123` | Director de Proyecto | 📋 Gestión de proyectos |
|
|
|
|
### Acceso al panel Admin Django
|
|
URL: **http://localhost:8000/admin/**
|
|
Usuarios: `admin` o `ginevra_ortega`
|
|
|
|
---
|
|
|
|
## Estructura del Proyecto
|
|
|
|
```
|
|
├── manage.py → CLI de Django
|
|
├── requirements.txt → 29 dependencias Python
|
|
├── setup_roles.py → Creación de usuarios y roles
|
|
├── start.sh → Script de arranque automático
|
|
├── db.sqlite3 → Base de datos SQLite (se genera automáticamente)
|
|
├── .gitignore → Exclusiones para Git
|
|
├── README.md → Este archivo
|
|
│
|
|
├── config/ → Configuración Django
|
|
│ ├── settings.py → Settings (SQLite, Channels, ASGI)
|
|
│ ├── urls.py → Rutas raíz
|
|
│ ├── asgi.py → Config ASGI (Daphne + WebSockets)
|
|
│ └── wsgi.py → Config WSGI (fallback)
|
|
│
|
|
├── expenses/ → App principal del ERP
|
|
│ ├── models.py → 8 modelos de datos
|
|
│ ├── views.py → 16 vistas (dashboard, CRUD, aprobación)
|
|
│ ├── forms.py → 5 formularios
|
|
│ ├── urls.py → 18 rutas
|
|
│ ├── admin.py → Admin Django registrado
|
|
│ ├── decorators.py → Decorator @role_required
|
|
│ ├── signals.py → WebSocket signals
|
|
│ ├── consumers.py → WebSocket consumer
|
|
│ └── routing.py → WebSocket routing
|
|
│
|
|
├── templates/ → Templates HTML
|
|
│ ├── base.html → Layout base con navegación
|
|
│ ├── registration/
|
|
│ │ └── login.html → Pantalla de login
|
|
│ └── expenses/
|
|
│ ├── dashboard.html → Resumen financiero
|
|
│ ├── expense_list.html → Lista de gastos con filtros
|
|
│ ├── expense_form.html → Formulario de gasto
|
|
│ ├── project_list.html → Lista de proyectos
|
|
│ ├── project_form.html → Formulario de proyecto
|
|
│ ├── gestion.html → Panel de gestión (admin)
|
|
│ ├── responsable_form.html→ Formulario de responsable
|
|
│ └── settings_form.html → Config del sistema
|
|
│
|
|
├── static/ → Archivos estáticos
|
|
│ ├── css/style.css → Estilos CSS corporativos EFINTEL
|
|
│ ├── js/app.js → JavaScript del frontend
|
|
│ └── img/
|
|
│ ├── efintel_logo.png
|
|
│ └── efintel_logo.svg
|
|
│
|
|
└── venv/ → Entorno virtual (generado, no se sube a Git)
|
|
```
|
|
|
|
---
|
|
|
|
## Módulos del ERP
|
|
|
|
| Ruta | Módulo | Descripción |
|
|
|---|---|---|
|
|
| `/` | Dashboard | KPIs financieros, gastos del mes, presupuesto restante |
|
|
| `/gastos/` | Operaciones y Gastos | Lista completa con filtros por proyecto y categoría |
|
|
| `/gastos/nuevo/` | Registrar Gasto | Formulario multimoneda CLP/USD |
|
|
| `/proyectos/` | Control de Proyectos | Proyectos con presupuesto y gastos acumulados |
|
|
| `/gestion/` | Panel de Gestión | CRUD de proyectos, responsables y configuración (solo Admin) |
|
|
| `/gastos/exportar/csv/` | Exportar CSV | Descarga matriz para Excel / Power BI |
|
|
| `/admin/` | Admin Django | Panel administrativo completo |
|
|
|
|
### Flujo de Aprobación de Gastos (3 pasos)
|
|
|
|
1. **Paso 1 — Revisión Documental**: El gasto entra en estado "En Revisión"
|
|
2. **Paso 2 — Elevar a Finanzas**: Un admin/director solicita el pago
|
|
3. **Paso 3 — Liberar Pago**: Finanzas aprueba y ejecuta la transferencia
|
|
|
|
---
|
|
|
|
## Stack Tecnológico
|
|
|
|
| Componente | Tecnología |
|
|
|---|---|
|
|
| **Backend** | Django 6.1 |
|
|
| **Servidor ASGI** | Daphne (para WebSockets) |
|
|
| **WebSockets** | Django Channels |
|
|
| **Base de datos** | SQLite3 |
|
|
| **Frontend** | HTML + CSS + JS vanilla |
|
|
| **Gráficos** | Chart.js (CDN) |
|
|
| **Iconos** | Lucide Icons (CDN) |
|
|
| **Fuentes** | Inter + JetBrains Mono (Google Fonts) |
|
|
|
|
---
|
|
|
|
## Equipo EFINTEL I+D+i
|
|
|
|
- **Miguel Angel Contreras Orozco** — Jefe de Área I+D+i
|
|
- **Ginevra Ortega Acuña** — Encargada de Contratos y Auditoría Documental
|
|
- **Samuel Abdias Contreras Orozco** — Encargado de Desarrollo Comercial
|
|
|
|
---
|
|
|
|
## Estándar de Control de Versiones
|
|
|
|
Este proyecto utiliza **GitHub Flow** y **Conventional Commits** para mantener un historial limpio y trazabilidad.
|
|
|
|
### 1. Flujo de Trabajo (GitHub Flow)
|
|
- La rama `main` contiene el código estable y de producción.
|
|
- Para cada nueva funcionalidad o corrección, se crea una rama nueva a partir de `main` (ej: `feature/agregar-modulo-nomina`).
|
|
- Una vez terminado el desarrollo en la rama, se realiza un Pull Request hacia `main`.
|
|
|
|
### 2. Formato de Commits (Conventional Commits)
|
|
Los mensajes de commit deben seguir esta estructura:
|
|
`<tipo>(<alcance opcional>): <descripción breve>`
|
|
|
|
**Tipos permitidos:**
|
|
- `feat:` Una nueva funcionalidad.
|
|
- `fix:` Corrección de un error (bug).
|
|
- `refactor:` Cambios en el código que no corrigen errores ni añaden funcionalidades (ej. aplicar POO).
|
|
- `docs:` Cambios en la documentación.
|
|
- `chore:` Tareas de mantenimiento, actualización de dependencias.
|
|
- `style:` Cambios de formato (espacios, comas, etc) que no afectan la lógica.
|
|
- `test:` Agregar o modificar pruebas.
|
|
|
|
*Ejemplo:* `feat(gastos): agregar soporte multidivisa para proveedores`
|