Ir al contenido

Workflows

Ruta: /owner/settings/workflows Crea y gestiona flujos de trabajo personalizados para organizar tus proyectos y tareas con diferentes metodologías.


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

TipoDescripciónEditable
SistemaWorkflows predefinidos por FactuxNo
PersonalizadoWorkflows creados por ti
PredeterminadoWorkflow 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

Cada workflow puede seguir una metodología que define su enfoque:

MetodologíaDescripciónCasos de uso
ÁgilDesarrollo iterativo con sprintsProyectos de desarrollo software
CascadaSecuencial, cada etapa se completa antes de la siguienteProyectos con requisitos fijos
KanbanFlujo continuo visualizado en columnasGestión de tareas operativas
PersonalizadoDefine tu propio flujo sin restriccionesCualquier tipo de proyecto

Cada workflow contiene estados que representan las etapas por las que pasa una tarea o proyecto:

Propiedades de un estado:

PropiedadDescripciónEjemplo
NombreTexto visible del estado”En Revisión”
ClaveIdentificador único (minúsculas con guiones bajos)en_revision
ColorColor del badge en hexadecimal#3b82f6
OrdenPosición en el flujo0, 1, 2…
InicialMarca si es el primer estado del flujotrue / false
FinalMarca si es un estado terminaltrue / false
Transiciones permitidasIDs 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

FunciónDescripciónDocumentación
Crear WorkflowCrea una plantilla de flujo personalizadaVer
Editar WorkflowModifica nombre, descripción y metodologíaVer
Eliminar WorkflowBorra workflows personalizados (no del sistema)Ver
Agregar EstadoAñade una nueva etapa al flujoVer
Editar EstadoModifica propiedades de un estado existenteVer
Eliminar EstadoQuita un estado del workflowVer

Los workflows se aplican a:

Proyectos:

  • Cada proyecto puede tener un workflow asignado
  • Campo workflow_id en tabla projects
  • Define las etapas por las que pasa el proyecto

Tareas:

  • Las tareas heredan el workflow del proyecto
  • Campo workflow_id en tabla tasks
  • Pueden tener workflow independiente del proyecto

Nota: El workflow determina qué estados están disponibles en el selector de estado de proyectos y tareas.


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.


Detalles técnicos
TablaColumnas principalesFK
workflow_templatesid, user_id, name, description, methodology, is_default, is_systemusers
workflow_statusesid, workflow_id, status_name, status_key, status_color, sort_order, is_initial, is_final, allowed_transitionsworkflow_templates
projectsid, workflow_id, …workflow_templates
tasksid, 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:

  • methodology debe ser: 'agile', 'waterfall', 'kanban' o 'custom'
  • is_system = true impide edición/eliminación
  • Solo puede haber un workflow con is_default = true por 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 de workflow
src/features/hr/types/workflows.ts
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íticaTablaRegla
Users can view accessible workflow templatesworkflow_templatesSELECT: can_access_owner_data(user_id)
Users can create their workflow templatesworkflow_templatesINSERT: can_access_owner_data(user_id) AND is_system = false
Users can update their workflow templatesworkflow_templatesUPDATE: can_access_owner_data(user_id) AND is_system = false
Users can delete their workflow templatesworkflow_templatesDELETE: can_access_owner_data(user_id) AND is_system = false
Users can view accessible workflow statusesworkflow_statusesSELECT: Via workflow padre con can_access_owner_data
Users can create workflow statusesworkflow_statusesINSERT: Via workflow padre no sistema
Users can update workflow statusesworkflow_statusesUPDATE: Via workflow padre no sistema
Users can delete workflow statusesworkflow_statusesDELETE: Via workflow padre no sistema

Protección: Los workflows del sistema (is_system = true) no se pueden modificar ni eliminar.

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[];
},
});

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 statuses
FROM workflow_templates wt
LEFT JOIN workflow_statuses ws ON ws.workflow_id = wt.id
WHERE wt.user_id = '<user_id>'
GROUP BY wt.id
ORDER 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_name
FROM projects p
LEFT JOIN workflow_templates wt ON p.workflow_id = wt.id
WHERE p.workflow_id = '<workflow_id>';

Estados sin transiciones configuradas:

SELECT
ws.id,
ws.status_name,
ws.allowed_transitions,
wt.name as workflow_name
FROM workflow_statuses ws
JOIN workflow_templates wt ON ws.workflow_id = wt.id
WHERE array_length(ws.allowed_transitions, 1) IS NULL
AND ws.is_final = false;

Workflows del sistema:

SELECT
id,
name,
methodology,
COUNT(statuses.*) as num_estados
FROM workflow_templates
LEFT JOIN workflow_statuses statuses ON statuses.workflow_id = workflow_templates.id
WHERE is_system = true
GROUP BY workflow_templates.id;