feat: Introduce structured table definitions in convex/tables for various entities and remove the todos example table.
This commit is contained in:
132
packages/backend/convex/tables/flows.ts
Normal file
132
packages/backend/convex/tables/flows.ts
Normal file
@@ -0,0 +1,132 @@
|
||||
import { defineTable } from 'convex/server';
|
||||
import { Infer, v } from 'convex/values';
|
||||
|
||||
// Status de templates de fluxo
|
||||
export const flowTemplateStatus = v.union(
|
||||
v.literal('draft'),
|
||||
v.literal('published'),
|
||||
v.literal('archived')
|
||||
);
|
||||
export type FlowTemplateStatus = Infer<typeof flowTemplateStatus>;
|
||||
|
||||
// Status de instâncias de fluxo
|
||||
export const flowInstanceStatus = v.union(
|
||||
v.literal('active'),
|
||||
v.literal('completed'),
|
||||
v.literal('cancelled')
|
||||
);
|
||||
export type FlowInstanceStatus = Infer<typeof flowInstanceStatus>;
|
||||
|
||||
// Status de passos de instância de fluxo
|
||||
export const flowInstanceStepStatus = v.union(
|
||||
v.literal('pending'),
|
||||
v.literal('in_progress'),
|
||||
v.literal('completed'),
|
||||
v.literal('blocked')
|
||||
);
|
||||
export type FlowInstanceStepStatus = Infer<typeof flowInstanceStepStatus>;
|
||||
|
||||
export const flowsTables = {
|
||||
// Templates de fluxo
|
||||
flowTemplates: defineTable({
|
||||
name: v.string(),
|
||||
description: v.optional(v.string()),
|
||||
status: flowTemplateStatus,
|
||||
createdBy: v.id('usuarios'),
|
||||
createdAt: v.number()
|
||||
})
|
||||
.index('by_status', ['status'])
|
||||
.index('by_createdBy', ['createdBy']),
|
||||
|
||||
// Passos de template de fluxo
|
||||
flowSteps: defineTable({
|
||||
flowTemplateId: v.id('flowTemplates'),
|
||||
name: v.string(),
|
||||
description: v.optional(v.string()),
|
||||
position: v.number(),
|
||||
expectedDuration: v.number(), // em dias
|
||||
setorId: v.id('setores'),
|
||||
defaultAssigneeId: v.optional(v.id('usuarios')),
|
||||
requiredDocuments: v.optional(v.array(v.string()))
|
||||
})
|
||||
.index('by_flowTemplateId', ['flowTemplateId'])
|
||||
.index('by_flowTemplateId_and_position', ['flowTemplateId', 'position']),
|
||||
|
||||
// Instâncias de fluxo
|
||||
flowInstances: defineTable({
|
||||
flowTemplateId: v.id('flowTemplates'),
|
||||
contratoId: v.optional(v.id('contratos')),
|
||||
managerId: v.id('usuarios'),
|
||||
status: flowInstanceStatus,
|
||||
startedAt: v.number(),
|
||||
finishedAt: v.optional(v.number()),
|
||||
currentStepId: v.optional(v.id('flowInstanceSteps'))
|
||||
})
|
||||
.index('by_flowTemplateId', ['flowTemplateId'])
|
||||
.index('by_contratoId', ['contratoId'])
|
||||
.index('by_managerId', ['managerId'])
|
||||
.index('by_status', ['status']),
|
||||
|
||||
// Passos de instância de fluxo
|
||||
flowInstanceSteps: defineTable({
|
||||
flowInstanceId: v.id('flowInstances'),
|
||||
flowStepId: v.id('flowSteps'),
|
||||
setorId: v.id('setores'),
|
||||
assignedToId: v.optional(v.id('usuarios')),
|
||||
status: flowInstanceStepStatus,
|
||||
startedAt: v.optional(v.number()),
|
||||
finishedAt: v.optional(v.number()),
|
||||
notes: v.optional(v.string()),
|
||||
notesUpdatedBy: v.optional(v.id('usuarios')),
|
||||
notesUpdatedAt: v.optional(v.number()),
|
||||
dueDate: v.optional(v.number())
|
||||
})
|
||||
.index('by_flowInstanceId', ['flowInstanceId'])
|
||||
.index('by_flowInstanceId_and_status', ['flowInstanceId', 'status'])
|
||||
.index('by_setorId', ['setorId'])
|
||||
.index('by_assignedToId', ['assignedToId']),
|
||||
|
||||
// Documentos de instância de fluxo
|
||||
flowInstanceDocuments: defineTable({
|
||||
flowInstanceStepId: v.id('flowInstanceSteps'),
|
||||
uploadedById: v.id('usuarios'),
|
||||
storageId: v.id('_storage'),
|
||||
name: v.string(),
|
||||
uploadedAt: v.number()
|
||||
})
|
||||
.index('by_flowInstanceStepId', ['flowInstanceStepId'])
|
||||
.index('by_uploadedById', ['uploadedById']),
|
||||
|
||||
// Sub-etapas de fluxo (para templates e instâncias)
|
||||
flowSubSteps: defineTable({
|
||||
flowStepId: v.optional(v.id('flowSteps')), // Para templates
|
||||
flowInstanceStepId: v.optional(v.id('flowInstanceSteps')), // Para instâncias
|
||||
name: v.string(),
|
||||
description: v.optional(v.string()),
|
||||
status: v.union(
|
||||
v.literal('pending'),
|
||||
v.literal('in_progress'),
|
||||
v.literal('completed'),
|
||||
v.literal('blocked')
|
||||
),
|
||||
position: v.number(),
|
||||
createdBy: v.id('usuarios'),
|
||||
createdAt: v.number()
|
||||
})
|
||||
.index('by_flowStepId', ['flowStepId'])
|
||||
.index('by_flowInstanceStepId', ['flowInstanceStepId']),
|
||||
|
||||
// Notas de steps e sub-etapas
|
||||
flowStepNotes: defineTable({
|
||||
flowStepId: v.optional(v.id('flowSteps')),
|
||||
flowInstanceStepId: v.optional(v.id('flowInstanceSteps')),
|
||||
flowSubStepId: v.optional(v.id('flowSubSteps')),
|
||||
texto: v.string(),
|
||||
criadoPor: v.id('usuarios'),
|
||||
criadoEm: v.number(),
|
||||
arquivos: v.array(v.id('_storage'))
|
||||
})
|
||||
.index('by_flowStepId', ['flowStepId'])
|
||||
.index('by_flowInstanceStepId', ['flowInstanceStepId'])
|
||||
.index('by_flowSubStepId', ['flowSubStepId'])
|
||||
};
|
||||
Reference in New Issue
Block a user