Ir al contenido

Crear Tarea

Crea nuevas tareas con información completa y configuración avanzada.

  • Botón “Nueva Tarea” en la cabecera del módulo
  • FAB (Floating Action Button) en móvil
  • Desde vista Calendario: crea tarea con fecha preseleccionada

Campos Requeridos:

  • Título: Nombre descriptivo de la tarea (máx. 255 caracteres)
  • Fecha de Vencimiento: Fecha límite para completar la tarea

Campos Opcionales:

  • Descripción: Detalles adicionales (texto largo, área de texto)
  • Prioridad: Baja, Media, Alta o Urgente (por defecto: Media)
  • Estado: Pendiente, En Progreso, Completada, Cancelada, En Espera (por defecto: Pendiente)
  • Fecha de Inicio: Cuándo comenzar la tarea
  • Horas Estimadas: Tiempo estimado de trabajo (decimal)
  • Progreso: Porcentaje de avance (0-100%, slider de 5 en 5)
  • Categoría: Selección de categorías personalizadas creadas previamente
  • Proyecto: Asignación a proyecto existente
  • Etiquetas: Tags personalizados para clasificación
  1. Click en “Nueva Tarea”
  2. Completar pestaña “General” con información básica
  3. (Opcional) Configurar recurrencia en pestaña “Recurrencia”
  4. (Opcional) Ajustar configuración avanzada en pestaña “Configuración”
  5. Click en “Guardar”

La tarea se crea inmediatamente y aparece en las vistas correspondientes.

Detalles Técnicos
  • Archivo: TaskFormSheet.tsx
  • Ruta: src/features/projects/sub-modules/tasks/components/TaskFormSheet.tsx
const taskSchema = z.object({
title: z.string().min(1, "El título es obligatorio").max(255, "El título es muy largo"),
description: z.string().optional(),
priority: z.enum(["low", "medium", "high", "urgent"]),
status: z.enum(["pending", "in_progress", "completed", "cancelled", "on_hold"]),
start_date: z.string().optional(),
due_date: z.string().min(1, "La fecha de vencimiento es obligatoria"),
estimated_hours: z.number().min(0).max(1000).optional(),
progress: z.number().min(0).max(100),
category: z.string().optional(),
tags: z.array(z.string()).optional(),
project_id: z.string().optional(),
});
const createTaskMutation = useMutation({
mutationFn: async (data: TaskFormData) => {
const taskData = {
...data,
user_id: user.id,
tags: selectedTags,
start_date: data.start_date ? new Date(data.start_date + "T00:00:00").toISOString() : null,
due_date: data.due_date ? new Date(data.due_date + "T23:59:59").toISOString() : null,
project_id: data.project_id === "none" ? null : data.project_id || null,
};
const { data: insertedTask, error } = await supabase
.from("tasks")
.insert([taskData])
.select('id')
.single();
if (error) throw error;
// Si tiene recurrencia, crear configuración
if (recurrenceEnabled && insertedTask.id) {
await supabase.from("task_recurrence_config").insert([recurrenceData]);
}
}
});
EstadoDescripción
taskIdID de tarea al editar (undefined al crear)
projectIdID de proyecto preseleccionado
defaultDueDateFecha de vencimiento predeterminada
selectedTagsArray de etiquetas seleccionadas
recurrenceEnabledSi se activa la recurrencia

Pestaña General:

  • Título
  • Descripción
  • Fecha de vencimiento
  • Prioridad
  • Categoría (si hay categorías creadas)

Pestaña Recurrencia:

  • Activar/desactivar recurrencia
  • Tipo de recurrencia (diaria, semanal, mensual, anual)
  • Intervalo de repetición
  • Días de la semana (para recurrencia semanal)
  • Fecha final opcional
  • Máximo de ocurrencias opcional
  • Vista previa de próximas fechas

Pestaña Recordatorios (solo al editar):

  • Configuración de recordatorios programados

Pestaña Configuración:

  • Estado de la tarea
  • Progreso (slider 0-100%)
  • Proyecto asignado
  • Fecha de inicio
  • Horas estimadas
  • Etiquetas personalizadas
CREATE TABLE tasks (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES auth.users(id),
title VARCHAR(255) NOT NULL,
description TEXT,
priority VARCHAR(20) NOT NULL,
status VARCHAR(20) NOT NULL,
start_date TIMESTAMPTZ,
due_date TIMESTAMPTZ NOT NULL,
completed_at TIMESTAMPTZ,
estimated_hours NUMERIC(10,2),
actual_hours NUMERIC(10,2),
progress INTEGER DEFAULT 0,
category VARCHAR(100),
tags TEXT[],
parent_task_id UUID REFERENCES tasks(id),
project_id UUID REFERENCES projects(id),
customer_id UUID REFERENCES customers(id),
invoice_id UUID REFERENCES invoices(id),
expense_id UUID REFERENCES expenses(id),
product_id UUID REFERENCES products(id),
reminder_enabled BOOLEAN DEFAULT false,
reminder_date TIMESTAMPTZ,
reminder_sent BOOLEAN DEFAULT false,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);