Workflows
Ruta:
/owner/settings/workflowsCrea y gestiona flujos de trabajo personalizados para organizar tus proyectos y tareas con diferentes metodologías.
Vista general
Sección titulada «Vista general»La pantalla de Workflows permite crear plantillas de flujos de trabajo con estados personalizados que luego puedes aplicar a tus proyectos. Define las etapas por las que pasa tu trabajo y organiza mejor tus procesos.
Componentes principales:
- Lista de workflows — Muestra todos los workflows creados (propios y del sistema)
- Tarjetas de workflow — Cada workflow muestra su nombre, descripción, metodología y estados
- Badges de estado — Identifican workflows del sistema, predeterminados y la metodología aplicada
Tipos de workflows
Sección titulada «Tipos de workflows»| Tipo | Descripción | Editable |
|---|---|---|
| Sistema | Workflows predefinidos por Factux | No |
| Personalizado | Workflows creados por ti | Sí |
| Predeterminado | Workflow que se aplica por defecto a nuevos proyectos | — |
Badges identificativos:
- Sistema (gris) — No se puede editar ni eliminar
- Predeterminado (color acento) — Se aplica automáticamente a proyectos nuevos
- Metodología (outline) — Ágil, Cascada, Kanban o Personalizado
Metodologías disponibles
Sección titulada «Metodologías disponibles»Cada workflow puede seguir una metodología que define su enfoque:
| Metodología | Descripción | Casos de uso |
|---|---|---|
| Ágil | Desarrollo iterativo con sprints | Proyectos de desarrollo software |
| Cascada | Secuencial, cada etapa se completa antes de la siguiente | Proyectos con requisitos fijos |
| Kanban | Flujo continuo visualizado en columnas | Gestión de tareas operativas |
| Personalizado | Define tu propio flujo sin restricciones | Cualquier tipo de proyecto |
Estados del flujo
Sección titulada «Estados del flujo»Cada workflow contiene estados que representan las etapas por las que pasa una tarea o proyecto:
Propiedades de un estado:
| Propiedad | Descripción | Ejemplo |
|---|---|---|
| Nombre | Texto visible del estado | ”En Revisión” |
| Clave | Identificador único (minúsculas con guiones bajos) | en_revision |
| Color | Color del badge en hexadecimal | #3b82f6 |
| Orden | Posición en el flujo | 0, 1, 2… |
| Inicial | Marca si es el primer estado del flujo | true / false |
| Final | Marca si es un estado terminal | true / false |
| Transiciones permitidas | IDs de estados a los que puede cambiar | [uuid1, uuid2] |
Visualización de estados:
Los estados se muestran como badges de colores ordenados según sort_order, con indicadores adicionales:
- (Inicial) — Primer estado del flujo
- (Final) — Estado terminal, no permite más transiciones
Funciones
Sección titulada «Funciones»| Función | Descripción | Documentación |
|---|---|---|
| Crear Workflow | Crea una plantilla de flujo personalizada | Ver |
| Editar Workflow | Modifica nombre, descripción y metodología | Ver |
| Eliminar Workflow | Borra workflows personalizados (no del sistema) | Ver |
| Agregar Estado | Añade una nueva etapa al flujo | Ver |
| Editar Estado | Modifica propiedades de un estado existente | Ver |
| Eliminar Estado | Quita un estado del workflow | Ver |
Relación con Proyectos y Tareas
Sección titulada «Relación con Proyectos y Tareas»Los workflows se aplican a:
Proyectos:
- Cada proyecto puede tener un workflow asignado
- Campo
workflow_iden tablaprojects - Define las etapas por las que pasa el proyecto
Tareas:
- Las tareas heredan el workflow del proyecto
- Campo
workflow_iden tablatasks - Pueden tener workflow independiente del proyecto
Nota: El workflow determina qué estados están disponibles en el selector de estado de proyectos y tareas.
Workflows del sistema
Sección titulada «Workflows del sistema»Factux incluye workflows predefinidos que no se pueden editar ni eliminar:
- Kanban básico — Para Do, Doing, Done
- Desarrollo Ágil — Backlog, Sprint, En progreso, Revisión, Hecho
- Diseño creativo — Briefing, Concepto, Diseño, Revisión, Aprobado
Estos workflows sirven como plantillas que puedes duplicar y personalizar.
Referencia técnica
Sección titulada «Referencia técnica»Detalles técnicos
Tablas de base de datos
Sección titulada «Tablas de base de datos»| Tabla | Columnas principales | FK |
|---|---|---|
workflow_templates | id, user_id, name, description, methodology, is_default, is_system | users |
workflow_statuses | id, workflow_id, status_name, status_key, status_color, sort_order, is_initial, is_final, allowed_transitions | workflow_templates |
projects | id, workflow_id, … | workflow_templates |
tasks | id, workflow_id, … | workflow_templates |
Esquema completo de workflow_templates
CREATE TABLE IF NOT EXISTS "public"."workflow_templates" ( "id" uuid DEFAULT gen_random_uuid() NOT NULL, "user_id" uuid NOT NULL, "name" text NOT NULL, "description" text, "methodology" text NOT NULL, "is_default" boolean DEFAULT false, "is_system" boolean DEFAULT false, "created_at" timestamp with time zone DEFAULT now(), "updated_at" timestamp with time zone DEFAULT now(), CONSTRAINT "workflow_templates_methodology_check" CHECK (methodology = ANY (ARRAY['agile', 'waterfall', 'kanban', 'custom'])));Restricciones:
methodologydebe ser:'agile','waterfall','kanban'o'custom'is_system = trueimpide edición/eliminación- Solo puede haber un workflow con
is_default = truepor usuario
Esquema completo de workflow_statuses
CREATE TABLE IF NOT EXISTS "public"."workflow_statuses" ( "id" uuid DEFAULT gen_random_uuid() NOT NULL, "workflow_id" uuid NOT NULL, "status_name" text NOT NULL, "status_key" text NOT NULL, "status_color" text DEFAULT '#6b7280' NOT NULL, "status_icon" text, "sort_order" integer DEFAULT 0 NOT NULL, "is_initial" boolean DEFAULT false, "is_final" boolean DEFAULT false, "allowed_transitions" uuid[] DEFAULT '{}', "created_at" timestamp with time zone DEFAULT now(), "updated_at" timestamp with time zone DEFAULT now(), FOREIGN KEY (workflow_id) REFERENCES workflow_templates(id) ON DELETE CASCADE);Columnas destacadas:
status_key— Identificador único en snake_case (ej:en_revision)status_color— Hexadecimal del color del badge (ej:#3b82f6)sort_order— Orden de visualización (0, 1, 2…)allowed_transitions— Array de UUIDs de estados permitidos
Tipos TypeScript
Sección titulada «Tipos TypeScript»Tipos de workflow
export type WorkflowMethodology = 'agile' | 'waterfall' | 'kanban' | 'custom';
export interface WorkflowTemplate { id: string; user_id: string; name: string; description?: string; methodology: WorkflowMethodology; is_default: boolean; is_system: boolean; created_at: string; updated_at: string;
// Relations statuses?: WorkflowStatus[];}
export interface WorkflowStatus { id: string; workflow_id: string; status_name: string; status_key: string; status_color: string; status_icon?: string; sort_order: number; is_initial: boolean; is_final: boolean; allowed_transitions: string[]; created_at: string; updated_at: string;}
export interface WorkflowFilters { methodology?: WorkflowMethodology; is_system?: boolean; search?: string;}Políticas RLS
Sección titulada «Políticas RLS»| Política | Tabla | Regla |
|---|---|---|
Users can view accessible workflow templates | workflow_templates | SELECT: can_access_owner_data(user_id) |
Users can create their workflow templates | workflow_templates | INSERT: can_access_owner_data(user_id) AND is_system = false |
Users can update their workflow templates | workflow_templates | UPDATE: can_access_owner_data(user_id) AND is_system = false |
Users can delete their workflow templates | workflow_templates | DELETE: can_access_owner_data(user_id) AND is_system = false |
Users can view accessible workflow statuses | workflow_statuses | SELECT: Via workflow padre con can_access_owner_data |
Users can create workflow statuses | workflow_statuses | INSERT: Via workflow padre no sistema |
Users can update workflow statuses | workflow_statuses | UPDATE: Via workflow padre no sistema |
Users can delete workflow statuses | workflow_statuses | DELETE: Via workflow padre no sistema |
Protección: Los workflows del sistema (
is_system = true) no se pueden modificar ni eliminar.
Componente principal
Sección titulada «Componente principal»WorkflowManager.tsx
Ubicación: src/features/projects/components/WorkflowManager.tsx
Responsabilidades:
- Lista workflows con filtros
- CRUD completo de workflows personalizados
- Gestión de estados de cada workflow
- Diálogos modales para crear/editar workflows y estados
- Visualización con badges de metodología, sistema y predeterminado
Mutaciones principales:
const createWorkflow = useMutation({ ... });const updateWorkflow = useMutation({ ... });const deleteWorkflow = useMutation({ ... });const addStatus = useMutation({ ... });Query principal:
const { data: workflows } = useQuery({ queryKey: ["workflows", user?.id], queryFn: async () => { const { data, error } = await supabase .from("workflow_templates") .select(` *, statuses:workflow_statuses(*) `) .order("is_system", { ascending: false }) .order("created_at", { ascending: false });
if (error) throw error; return data as WorkflowTemplate[]; },});Queries de diagnóstico
Sección titulada «Queries de diagnóstico»Workflows de un usuario con sus estados:
SELECT wt.*, json_agg( json_build_object( 'id', ws.id, 'status_name', ws.status_name, 'status_key', ws.status_key, 'status_color', ws.status_color, 'sort_order', ws.sort_order, 'is_initial', ws.is_initial, 'is_final', ws.is_final ) ORDER BY ws.sort_order ) as statusesFROM workflow_templates wtLEFT JOIN workflow_statuses ws ON ws.workflow_id = wt.idWHERE wt.user_id = '<user_id>'GROUP BY wt.idORDER BY wt.is_system DESC, wt.created_at DESC;Proyectos usando un workflow específico:
SELECT p.id, p.name, p.status, wt.name as workflow_nameFROM projects pLEFT JOIN workflow_templates wt ON p.workflow_id = wt.idWHERE p.workflow_id = '<workflow_id>';Estados sin transiciones configuradas:
SELECT ws.id, ws.status_name, ws.allowed_transitions, wt.name as workflow_nameFROM workflow_statuses wsJOIN workflow_templates wt ON ws.workflow_id = wt.idWHERE array_length(ws.allowed_transitions, 1) IS NULL AND ws.is_final = false;Workflows del sistema:
SELECT id, name, methodology, COUNT(statuses.*) as num_estadosFROM workflow_templatesLEFT JOIN workflow_statuses statuses ON statuses.workflow_id = workflow_templates.idWHERE is_system = trueGROUP BY workflow_templates.id;