Sistema web interno de LogistiSoft para elaborar, visualizar y controlar la planificación de proyectos tecnológicos: EDT, cronograma, dependencias, recursos, presupuesto y reportes.
Construido con Laravel 12 (MVC), MySQL de XAMPP y librerías web instaladas localmente (Bootstrap 5.3, Chart.js 4, Frappe Gantt, SweetAlert2 y simple-datatables). La interfaz y los reportes funcionan sin depender de una conexión a internet.
Incluye un asistente integrado que responde con los datos reales de cada usuario y explica cómo se usa el sistema según su rol.
| Componente | Versión usada |
|---|---|
| XAMPP (Apache + MySQL/MariaDB) | 8.2.x |
| PHP | 8.2 o superior |
| Composer | 2.x |
| Node.js + npm | 20.x o superior (solo para reconstruir los recursos web) |
| Laravel | 12.x |
Extensiones PHP necesarias (todas vienen activas en XAMPP): pdo_mysql, mbstring,
openssl, tokenizer, xml, ctype, json, fileinfo, zip, gd.
# 1. Instalar dependencias
composer install
npm install
npm run vendor
npm run build
# 2. Copiar la configuración y generar la clave de la aplicación
copy .env.example .env
php artisan key:generate3. Arrancar MySQL desde el panel de control de XAMPP.
4. Crear la base de datos con las migraciones y datos de demostración:
php artisan migrate:fresh --seedCrea las 14 tablas y carga 30 proyectos de demostración coherentes con tareas, dependencias, objetivos, riesgos, comunicaciones, recursos, costos y avances.
Si la base
proplan_dbtodavía no existe, créala una vez desde phpMyAdmin (cotejamientoutf8mb4_unicode_ci) o con:C:\xampp\mysql\bin\mysql -u root -e "CREATE DATABASE proplan_db"
Como alternativa, database/proplan_db.sql contiene un respaldo completo y actualizado
de la estructura y los datos de demostración usados en la validación integral.
5. Levantar el sistema:
php artisan serveY entra a http://localhost:8000.
Todas usan la contraseña Admin123!
| Correo | Rol | Qué puede hacer |
|---|---|---|
admin@proplan.local |
Administrador | Todo: proyectos, usuarios, recursos y bitácora |
jefe@proplan.local |
Jefe de Proyecto | Planifica los proyectos que dirige |
usuario@proplan.local |
Usuario | Consulta sus tareas y reporta avance |
app/
├── Models/ Modelo → Rol, Usuario, Proyecto, Tarea, Dependencia,
│ Recurso, Asignacion, Avance, Costo, Bitacora,
│ Objetivo, Riesgo y Comunicacion
├── Http/
│ ├── Controllers/ Controlador → un controlador por módulo del sistema
│ ├── Requests/ Validación de cada formulario (Form Requests)
│ └── Middleware/ VerificarRol y VerificarClaveIntegracion
├── Services/ Reglas de negocio fuera del controlador
├── Policies/ Permisos por proyecto (ProyectoPolicy)
├── Support/ ConfiguracionSistema (patrón Singleton)
└── Exports/ LibroExcel: generador de planillas .xlsx reutilizable
resources/views/ Vista
├── layouts/ Plantilla general y plantilla de PDF
├── components/ Componentes Blade reutilizables
├── proyectos/ tareas/ recursos/ usuarios/ reportes/ pdf/
App\Support\ConfiguracionSistema es un Singleton clásico:
- constructor privado — nadie puede hacer
new, getInstance()crea la instancia la primera vez y después la reutiliza,__clone()privado y__wakeup()que lanza excepción, para que no se pueda duplicar.
Guarda los parámetros de negocio (moneda, umbrales del semáforo, jornada laboral) y
da el formato de importes de todo el sistema. Además está registrado en el contenedor
de Laravel (AppServiceProvider), de modo que al inyectarlo por constructor se recibe
esa misma instancia. Los seis servicios de negocio también se registran como
singleton.
| Servicio | Responsabilidad |
|---|---|
IndicadorService |
Avance real, avance esperado, desviación y semáforo |
PlanificacionService |
Avance de tareas, jerarquía EDT y ciclos en dependencias |
PresupuestoService |
Presupuesto vs. costo ejecutado |
RecursoService |
Carga de trabajo y utilización de cada recurso |
GanttService |
Arma los datos del diagrama de Gantt |
BitacoraService |
Registra la trazabilidad de las operaciones |
Asistente\ContextoUsuario |
Fotografía de lo que cada usuario puede ver, según su rol |
Asistente\MotorLocal |
Responde por reglas: manual del sistema + datos del usuario |
Asistente\MotorClaude |
Redacción opcional con la API de Claude |
Los componentes Blade delgados envuelven clases de Bootstrap y evitan repetir la estructura visual:
x-encabezado, x-tarjeta, x-indicador, x-campo, x-selector, x-badge-estado,
x-semaforo, x-barra, x-boton-eliminar, x-alertas, x-vacio, x-moneda,
x-enlace-menu, x-exportador, x-asistente.
Las tablas de reportes se vuelven ordenables y buscables con solo agregarles el atributo
data-tabla="10"; el resto lo hace simple-datatables.
El CSS y JavaScript propios del proyecto están en public/css/proplan.css,
public/js/proplan.js y resources/; Vite genera los archivos de producción.
| Librería | Uso |
|---|---|
| Bootstrap 5.3.3 + Bootstrap Icons 1.11.3 | Toda la interfaz |
| Chart.js 4.4.2 | Gráficos de avance, carga y presupuesto |
| Frappe Gantt 0.6.1 | Diagrama de Gantt con dependencias |
| SweetAlert2 11 | Confirmaciones de borrado y avisos |
| simple-datatables 9 | Búsqueda y orden en las tablas de reportes |
npm run vendor copia versiones fijadas de estas dependencias a public/vendor, por lo
que los reportes y gráficos no fallan durante una defensa sin internet.
14 tablas InnoDB, utf8mb4_unicode_ci, relacionadas mediante claves foráneas.
roles 1 ──< usuarios
usuarios 1 ──< proyectos (jefe_id)
usuarios 1 ──< tareas (responsable_id)
usuarios 1 ──< avances / costos / bitacoras / recursos
proyectos 1 ──< tareas
proyectos 1 ──< objetivos / riesgos / comunicaciones / equipo / costos generales
tareas 1 ──< tareas (tarea_padre_id: EDT jerárquica)
tareas N >── 1 objetivos (alineación de la EDT)
tareas 1 ──< dependencias (como sucesora y como predecesora)
tareas 1 ──< asignaciones >── 1 recursos
tareas 1 ──< avances
tareas 1 ──< costos
dependencias y asignaciones no son tablas pivote anónimas: son entidades propias
con datos propios (tipo de dependencia, desfase, horas estimadas y reales) y cada una
recibe dos relaciones 1:N.
- 1FN — cada columna guarda un solo valor; no hay listas ni campos repetidos.
- 2FN — todas las tablas tienen clave primaria simple (
id) y cada atributo depende de esa clave completa. Las claves candidatas (proyectos.codigo,usuarios.email,roles.nombre) están declaradas comoUNIQUE. - 3FN — no hay dependencias transitivas ni datos derivados almacenados:
- el nombre del responsable no se copia en
tareas, solo varesponsable_id; - el costo ejecutado no es columna: se calcula sumando
costos; - el avance del proyecto se calcula desde las tareas hoja, no se guarda;
- la tarifa del recurso vive únicamente en
recursos.costo_hora.
- el nombre del responsable no se copia en
- Avance real del proyecto = promedio del avance de las tareas hoja ponderado por su presupuesto.
- Avance esperado = porcentaje del calendario del proyecto ya transcurrido.
- Desviación = avance esperado − avance real.
- Semáforo: 🟢 Óptimo (desviación < 1) · 🟡 Precaución (1 a 15) · 🔴 Crítico (> 15).
Los umbrales se configuran en
.env(PROPLAN_UMBRAL_PRECAUCION,PROPLAN_UMBRAL_CRITICO).
| Requisito | Implementación |
|---|---|
| 1. Crear, editar, eliminar proyectos | ProyectoController · /proyectos |
| 2. Tareas, subtareas, fechas y responsables | TareaController · EDT en la ficha del proyecto + listado global en /tareas |
| 3. Cargar equipo y asignarlo por tarea | RecursoController + AsignacionController |
| 4. Presupuesto y costo ejecutado por tarea y proyecto | CostoController + PresupuestoService |
| 5. Roles Administrador / Jefe / Usuario | tabla roles, VerificarRol, ProyectoPolicy |
| 6.1 Diagrama de Gantt con dependencias y avance | /proyectos/{id}/reportes/gantt |
| 6.2 Carga de trabajo por recurso | /proyectos/{id}/reportes/recursos |
| 6.3 Presupuesto vs. costos reales | /proyectos/{id}/reportes/presupuesto |
| 6.4 Estado general tipo semáforo | /proyectos/{id}/reportes/estado |
| Dependencias entre actividades | tabla dependencias + control de ciclos |
| Objetivos y alineación de la EDT | ObjetivoController · /proyectos/{id}/seguimiento |
| Matriz de riesgos y respuesta | RiesgoController · /proyectos/{id}/seguimiento |
| Comunicaciones y acuerdos | ComunicacionController · /proyectos/{id}/seguimiento |
| Exportar en PDF y Excel | /proyectos/{id}/exportar/{reporte}/{formato}?alcance=… |
| Integración con otros sistemas | API JSON /api/v1/proyectos, protegida por clave |
| Trazabilidad | tabla bitacoras · /bitacora |
El botón Exportar de la ficha del proyecto abre una ventana con tres decisiones:
| Decisión | Opciones |
|---|---|
| Qué reporte | Plan de trabajo · Presupuesto vs. real · Carga por recurso |
Cuánto detalle (alcance) |
Toda la EDT · Solo fases · Solo subtareas · Solo retrasadas · Por responsable |
| Formato | PDF (para imprimir) · Excel (para seguir trabajando) |
El Excel sale con filtro automático, columnas con formato de moneda y porcentaje, encabezado congelado y fila de totales. Los totales suman solo las tareas que no tienen otra tarea listada por debajo, porque una fase ya acumula el importe de sus subtareas: así el total es el mismo se exporte «toda la EDT», «solo fases» o «solo subtareas».
Listado global de tareas, sin entrar proyecto por proyecto. Cada rol ve un alcance
distinto (Tarea::visiblesPara(), espejo de Proyecto::visiblesPara()):
| Rol | Qué tareas ve en el listado |
|---|---|
| Administrador | Todas |
| Jefe de Proyecto | Las de los proyectos que dirige, más las suyas en proyectos ajenos |
| Usuario | Únicamente aquellas de las que es responsable |
A un Usuario se le ocultan además la columna y el filtro de responsable, porque todas las filas son suyas. El asistente aplica exactamente el mismo alcance: si la pantalla no lo muestra, el chat tampoco lo cuenta.
La pantalla trae:
- Cuatro accesos rápidos que son filtros de un clic: mis tareas abiertas, retrasadas, en curso y vencen en 7 días.
- Filtros por texto, proyecto, estado, responsable (con «solo mis tareas») y vencimiento.
- Reporte de avance en un clic: el botón de la fila abre una ventana con barra deslizante y comentario, sin salir del listado. Solo aparece donde el usuario puede reportar: su propia tarea o una de un proyecto que dirige.
- Por defecto lista solo proyectos vigentes — una tarea de un proyecto entregado o cancelado no es trabajo pendiente de nadie. Un filtro permite incluirlos.
En el menú lateral, la entrada Tareas lleva una insignia roja con la cantidad de tareas abiertas del usuario, para que no haga falta entrar a buscarlas.
Sobre la tabla de la EDT hay una barra con: búsqueda por texto, filtro por estado, filtro por responsable (incluye «Solo mis tareas») y botones para expandir o contraer todas las fases. Cada fase tiene además su propio triángulo para plegarla. Todo funciona en el navegador, sin recargar la página.
Un botón flotante abre un panel de conversación disponible en todas las pantallas. Responde dos tipos de pregunta:
- Sobre tus datos: «¿cómo va la cartera?», «¿cuáles están en rojo?», «¿qué vence esta semana?», «¿qué tareas tengo?», «¿quién está sobrecargado?», «¿cómo va el PRJ-2026-02?».
- Sobre el uso del sistema: crear proyectos y tareas, dependencias, recursos, costos, reporte de avance, Gantt, exportaciones y qué permite cada rol.
Solo ve lo que el usuario puede ver: el contexto se arma con Proyecto::visiblesPara(),
así que un Usuario nunca recibe datos de proyectos ajenos, y las respuestas de «cómo hacer»
se adaptan al rol (a un Usuario no se le explican pasos que su rol no permite).
| Motor | Cuándo | Requiere |
|---|---|---|
local (por defecto) |
Siempre. Reconoce la intención de la pregunta y responde con reglas | Nada |
claude |
Opcional: redacta las respuestas con la API de Claude | Clave de API e internet |
Para activar el motor con IA, en .env:
PROPLAN_ASISTENTE=claude
ANTHROPIC_API_KEY=sk-ant-...
Usa el SDK oficial anthropic-ai/sdk con el modelo claude-opus-5. El motor local sigue
siendo la red de seguridad: si no hay clave, no hay internet, la API falla o la petición es
declinada, la respuesta se resuelve localmente y el usuario no percibe el error. En una
defensa sin internet el sistema funciona igual, por eso el motor local es el que viene
activado de fábrica.
El sistema expone una integración JSON de solo lectura para consultar la cartera desde otro sistema. La comprobación de servicio es pública:
GET /api/v1/salud
La lista y el detalle de proyectos requieren la cabecera X-PROPLAN-KEY. La clave se
define en .env y nunca se incluye en el código fuente:
PROPLAN_INTEGRATION_KEY=una-clave-segura
GET /api/v1/proyectos
GET /api/v1/proyectos/{id}
La respuesta de detalle incluye objetivos, EDT, responsables, dependencias, riesgos, presupuesto, costo real, avance y semáforo. Si no se configura la clave, los endpoints de datos quedan deshabilitados.
99 pruebas (253 aserciones) sobre SQLite en memoria: no tocan la base de XAMPP.
php artisan testCubren autenticación y roles, permisos por proyecto, validaciones, jerarquía EDT, dependencias circulares, cálculo del semáforo en sus tres niveles, presupuesto y sobregiro, acumulados por fase, carga por recurso, orden y numeración del Gantt, las seis exportaciones, objetivos y riesgos, comunicaciones, integración API, el listado global de tareas (filtros y alcance por rol), la vinculación única entre cada persona y su cuenta de acceso, y el asistente (respuestas con datos, respeto de roles y aislamiento entre usuarios).
php artisan serve # levantar el sistema
php artisan migrate:fresh --seed # rehacer la base con datos de demostración
php artisan test # ejecutar las pruebas
php artisan route:list # ver todas las rutas
npm run vendor # actualizar las librerías web locales
npm run build # compilar los recursos de producción