# Industry Tasks

Plataforma de gestión de proyectos e incidencias inspirada en Jira, orientada a equipos de desarrollo. Interfaz en español, diseño oscuro con identidad corporativa verde (`#118041`).

## Stack tecnológico

| Capa | Tecnología |
|------|------------|
| Backend | PHP 8.3 |
| Base de datos | MySQL / MariaDB |
| Servidor web | IIS (Apache/Nginx también válidos) |
| Frontend | HTML, CSS, JavaScript vanilla |
| Dependencias JS | SortableJS (drag & drop), Font Awesome |

---

## Instalación rápida

1. Copiar el proyecto al directorio web (p. ej. `C:\inetpub\wwwroot\industry_tasks`).
2. Crear `config/config.php` a partir de `config/config.example.php` (base de datos, URL, correo).
3. Abrir `setup/install.php` en el navegador para crear la base de datos y el esquema inicial.
4. Iniciar sesión con el usuario administrador creado en la instalación.
5. En producción: establecer `app.debug` en `false` en la configuración.

Las migraciones pendientes se aplican automáticamente al cargar la aplicación.

---

## Funcionalidades

### Autenticación y usuarios

- Registro e inicio de sesión.
- Cambio de contraseña obligatorio cuando el administrador lo indica.
- Perfil de usuario con avatar.
- Roles globales: **administrador** y **usuario**.
- Gestión de usuarios (solo administradores): alta, edición, activación/desactivación.

### Proyectos

- Creación de proyectos con clave única (p. ej. `TEST`) y avatar.
- Listado de proyectos accesibles por el usuario.
- **Miembros del proyecto** con roles:
  - **Admin** — gestión completa del proyecto y miembros.
  - **Member** — puede crear y editar incidencias.
  - **Viewer** — solo lectura.
- Configuración del proyecto: nombre, descripción y avatar.

### Incidencias

Tipos: tarea, error, historia, subtarea y épica.

**Campos y acciones:**

- Resumen (edición inline al hacer clic).
- Descripción enriquecida (editor con imágenes pegadas y adjuntos).
- Estado, prioridad, tipo, asignado, fecha límite.
- Story points (escala Fibonacci).
- Etiquetas (creación al vuelo por proyecto).
- **Fix version** y **Affects version** (varias por incidencia).
- Épica padre y subtareas.
- Sprint asignado (visible en sidebar).
- Seguir incidencia (watchers).
- Clonar y eliminar incidencia.
- Historial de actividad.
- Indicadores: vencida, bloqueada, story points, versiones en cabecera.

**Bloqueos:** las incidencias pueden quedar bloqueadas por enlaces entre issues; el sistema avisa al moverlas en backlog/tablero.

### Backlog y sprints

- Backlog ordenable con drag & drop (SortableJS).
- Paneles por sprint abierto (activo + planificados) y backlog general.
- Crear, editar, iniciar, completar y eliminar sprints (nombre, objetivo, fechas).
- Los sprints completados no se eliminan (quedan en el historial).
- Arrastre de incidencias entre backlog y sprints (incluye subtareas con su padre).
- Panel de **épicas** con barra de progreso.
- Historial de **sprints completados** con snapshot al cerrar.
- Filtros: texto, estado, asignado, prioridad, tipo, etiqueta, corregido en (versión).
- Filtros guardados (personales o compartidos en el proyecto).
- Filtro rápido por avatares de participantes.
- Exportación CSV del proyecto.

### Lista de incidencias

- Pestaña **Lista** con todas las incidencias del proyecto (raíces y subtareas).
- Tabla ordenada por última actualización.
- Mismos filtros, filtros guardados y export CSV que el backlog.

### Tablero Kanban

- Columnas por estado del workflow.
- Drag & drop entre columnas (respeta transiciones permitidas).
- Swimlanes por asignado, prioridad o tipo.
- Mismos filtros y filtros guardados que el backlog.
- Badges: etiquetas, versión (corregido en), story points, fecha límite, bloqueo.

### Resumen del proyecto

Dashboard con KPIs y paneles:

- Incidencias abiertas, vencidas, bloqueadas.
- Sprint activo (incidencias y story points).
- **Versiones sin publicar** y próximo lanzamiento.
- Distribución por estado y carga por asignado.
- Listados de vencidas y bloqueadas.
- **Próximos lanzamientos** (versiones pendientes).
- Sprints completados recientes.
- Progreso de épicas.

### Versiones y release notes

- Pestaña **Versiones** en cada proyecto.
- CRUD de versiones: nombre, fecha, notas de lanzamiento, estado publicada/sin publicar.
- Asignación en incidencias: **Corregido en** (versión donde se soluciona).
- Creación de versión desde la propia incidencia.
- Vista de detalle con notas y listado de incidencias vinculadas.
- Acción **Publicar versión**.
- Filtros y export CSV integrados con versiones.

### Búsqueda global

- Búsqueda por clave, resumen, descripción, etiqueta o nombre de versión.
- Filtros: proyecto, estado, asignado, versión (corregido en).
- Exportación CSV de resultados.

### Mis incidencias

- Pestañas: asignadas a mí, reportadas por mí, que sigo.
- Export CSV.

### Comentarios y colaboración

- Comentarios con hilos (respuestas anidadas).
- Menciones `@usuario` con autocompletado.
- Reacciones con emoji y “me gusta”.
- Adjuntos en comentarios e incidencias.
- Notificaciones in-app y por correo (según preferencias).

### Notificaciones

- Campana con notificaciones in-app.
- Preferencias por tipo de evento (correo / in-app).
- Avisos por asignaciones, menciones, comentarios, etc.

### Administración (solo admin global)

- **Workflow:** estados, categorías, tipos de incidencia y transiciones permitidas.
- **Usuarios:** gestión de cuentas de la plataforma.
- **Configuración:** ajustes generales de la plataforma.

---

## API REST interna

Endpoints JSON bajo `/api/` (requieren sesión autenticada), entre otros:

| Endpoint | Uso |
|----------|-----|
| `issues.php` | CRUD de incidencias |
| `sprints.php` | Sprints y asignación |
| `versions.php` | Versiones y vínculos con incidencias |
| `labels.php` | Etiquetas |
| `comments.php` | Comentarios |
| `attachments.php` | Adjuntos |
| `search.php` | Búsqueda |
| `export.php` | Export CSV |
| `saved-filters.php` | Filtros guardados |
| `notifications.php` | Notificaciones |

---

## Estructura del proyecto

```
industry_tasks/
├── api/              # Endpoints REST
├── config/           # Configuración (config.php no versionado)
├── css/              # Estilos (app.css)
├── includes/         # Servicios PHP, renderizado, migraciones
├── js/               # Lógica frontend
├── migrations/       # schema.sql base
├── public/uploads/   # Archivos subidos
├── rsc/              # Páginas PHP de la aplicación
│   ├── index.php     # Listado de proyectos
│   ├── project.php   # Backlog, tablero, resumen, versiones…
│   ├── issue.php     # Detalle de incidencia
│   ├── search.php    # Búsqueda global
│   ├── login.php     # Autenticación
│   └── …             # Resto de pantallas
├── setup/            # Instalación inicial
│   └── install.php   # Instalador de base de datos
└── web.config        # Configuración IIS
```

Las páginas viven en `rsc/` (`rsc/project.php`, `rsc/login.php`, etc.) y el instalador en `setup/`. La raíz solo contiene carpetas y configuración, sin archivos PHP duplicados. IIS usa `rsc/index.php` como documento por defecto.

---

## Despliegue al servidor (SFTP)

Servidor: `industry.francecentral.cloudapp.azure.com` → `/var/www/html/industry_tasks`

### Subida automática al guardar (Cursor / VS Code)

1. Instala la extensión **SFTP** (`natizyskunk.vscode-sftp`).
2. Copia `.vscode/sftp.json.example` → `.vscode/sftp.json` (ajusta `privateKeyPath` si hace falta).
3. Abre la paleta → **SFTP: Config** y comprueba la conexión → **SFTP: Upload Project** la primera vez si quieres.
4. Con `uploadOnSave: true`, cada archivo guardado se sube al servidor.

**No se sube** (para no pisar producción): `config/config.php`, uploads, logs, `.git`.

Si la extensión no acepta `.ppk`, exporta la clave a OpenSSH con PuTTYgen y apunta `privateKeyPath` al `.pem`.

### Despliegue manual (WinSCP)

```powershell
.\scripts\deploy.ps1
```

Requiere [WinSCP](https://winscp.net/) (p. ej. `%LOCALAPPDATA%\Programs\WinSCP\WinSCP.com`). Usa la misma clave y exclusiones que SFTP. Si WinSCP no está, el script intenta tar + PuTTY.

---

## Producción

- Copiar `config/config.example.php` → `config/config.php` y ajustar credenciales.
- `app.debug = false` y `app.env = production`.
- Permisos de escritura en `public/uploads/` y carpetas de avatares.
- Configurar SMTP en `mail` para notificaciones por correo.
- Las migraciones en `includes/Migration.php` se ejecutan solas; no requiere pasos manuales tras desplegar código nuevo.

---

## Licencia

Uso interno / propietario. Ajustar según la política de tu organización.
