Archivar Proyecto
Exportar contenido
Sistema completo de archivado y eliminación permanente de proyectos.
Ubicación
Sección titulada «Ubicación»- Componente:
ProjectArchiveSystem.tsx - Acceso: Tab “Ajustes” en detalle del proyecto
- Card: “Gestión del Proyecto”
Funcionalidades
Sección titulada «Funcionalidades»1. Archivar Proyecto
Sección titulada «1. Archivar Proyecto»Propósito: Ocultar proyecto de vista principal sin eliminar datos.
Proceso:
- Usuario hace click en “Archivar Proyecto”
- Si hay tareas activas, se muestra advertencia
- Dialog de confirmación con contador de tareas afectadas
- Al confirmar:
- Se cancelan todas las tareas activas (pending, in_progress, on_hold)
- Se cambia estado del proyecto a
archived - Se registra
archived_atcon timestamp - Proyecto desaparece de lista principal
- Toast de confirmación
Efectos en Tareas:
// Cancelar tareas activasawait supabase .from('tasks') .update({ status: 'cancelled' }) .eq('project_id', project.id) .in('status', ['pending', 'in_progress', 'on_hold']);Advertencia Previa:
- Si
activeTasks > 0: Muestra card amarilla - “Este proyecto tiene N tarea(s) activa(s)”
- “Al archivar el proyecto, estas tareas serán canceladas automáticamente”
2. Restaurar Proyecto
Sección titulada «2. Restaurar Proyecto»Disponible: Solo para proyectos archivados
Proceso:
- Card muestra “Este proyecto está archivado”
- Botón “Restaurar Proyecto”
- Al confirmar:
- Se cambia estado a
active - Se limpia
archived_at - Proyecto vuelve a lista principal
- Las tareas NO se restauran automáticamente
- Se cambia estado a
- Toast de confirmación
Nota: Las tareas permanecen canceladas. Usuario debe reactivarlas manualmente si es necesario.
3. Eliminar Permanentemente
Sección titulada «3. Eliminar Permanentemente»Disponible: Solo para proyectos archivados
Proceso Destructivo:
- Botón rojo “Eliminar Permanentemente”
- Dialog de confirmación con advertencia severa
- Lista de todo lo que se eliminará
- Requiere confirmación explícita
- Eliminación en cascada:
1. Comentarios de tareas → task_comments2. Registros de tiempo de tareas → task_time_entries3. Adjuntos de tareas → task_attachments4. Tareas → tasks5. Hitos → project_milestones6. Recursos → project_resources7. Documentos → project_documents8. Actividades → project_activities9. Registros de tiempo → project_time_entries10. Items de presupuesto → project_budget_items11. Miembros del equipo → project_team_members12. Proyecto → projects
- Redirección a
/projects
Advertencia Mostrada:
⚠️ Esta acción eliminará permanentemente el proyecto "{nombre}" y no se puede deshacer.
Se eliminarán:• El proyecto y toda su información• Todas las tareas asociadas• Comentarios y registros de tiempo• Hitos y recursos del proyecto• Documentos y actividadesEstados Visuales
Sección titulada «Estados Visuales»Proyecto Activo
Sección titulada «Proyecto Activo»┌─────────────────────────────┐│ Gestión del Proyecto │├─────────────────────────────┤│ ⚠️ Atención ││ Este proyecto tiene 5 ││ tareas activas. Al ││ archivar el proyecto, ││ estas tareas serán ││ canceladas automáticamente. ││ ││ [Archivar Proyecto] │└─────────────────────────────┘Proyecto Archivado
Sección titulada «Proyecto Archivado»┌─────────────────────────────┐│ Gestión del Proyecto │├─────────────────────────────┤│ 📦 Este proyecto está ││ archivado ││ ││ [Restaurar Proyecto] ││ [Eliminar Permanentemente] │└─────────────────────────────┘Consideraciones
Sección titulada «Consideraciones»Archivado:
- ✅ Reversible
- ✅ Mantiene todos los datos
- ✅ Tareas se cancelan automáticamente
- ✅ Facturas asociadas NO se afectan
- ✅ Historial se preserva
Eliminación:
- ❌ Irreversible
- ❌ Elimina TODOS los datos relacionados
- ❌ No se pueden recuperar
- ⚠️ Facturas se mantienen (son independientes)
- ⚠️ Requiere que el proyecto esté archivado primero
Flujo Recomendado
Sección titulada «Flujo Recomendado»Proyecto Activo ↓ (Finalizar trabajo)Marcar como Completado ↓ (Después de tiempo)Archivar Proyecto ↓ (Si ya no es necesario)Eliminar PermanentementeCódigo de eliminación en cascada
// ProjectArchiveSystem.tsx - Delete mutationconst deleteProjectMutation = useMutation({ mutationFn: async () => { // 1. Obtener IDs de tareas const taskIds = (await supabase .from('tasks') .select('id') .eq('project_id', project.id) ).data?.map(t => t.id) || [];
// 2. Eliminar comentarios de tareas await supabase .from('task_comments') .delete() .in('task_id', taskIds);
// 3. Eliminar registros de tiempo de tareas await supabase .from('task_time_entries') .delete() .in('task_id', taskIds);
// 4. Eliminar adjuntos de tareas await supabase .from('task_attachments') .delete() .in('task_id', taskIds);
// 5. Eliminar tareas await supabase .from('tasks') .delete() .eq('project_id', project.id);
// 6-11. Eliminar datos del proyecto await supabase.from('project_milestones').delete().eq('project_id', project.id); await supabase.from('project_resources').delete().eq('project_id', project.id); await supabase.from('project_documents').delete().eq('project_id', project.id); await supabase.from('project_activities').delete().eq('project_id', project.id); await supabase.from('project_time_entries').delete().eq('project_id', project.id); await supabase.from('project_budget_items').delete().eq('project_id', project.id); await supabase.from('project_team_members').delete().eq('project_id', project.id);
// 12. Eliminar proyecto const { error } = await supabase .from('projects') .delete() .eq('id', project.id);
if (error) throw error; }, onSuccess: () => { toast({ title: "Proyecto eliminado" }); window.location.href = '/projects'; }});