158 lines
5.2 KiB
TypeScript
158 lines
5.2 KiB
TypeScript
import { defineTable } from 'convex/server';
|
|
import { v } from 'convex/values';
|
|
|
|
export const pedidosTables = {
|
|
pedidos: defineTable({
|
|
numeroSei: v.optional(v.string()),
|
|
numeroDfd: v.optional(v.string()),
|
|
status: v.union(
|
|
v.literal('em_rascunho'),
|
|
v.literal('aguardando_aceite'),
|
|
v.literal('em_analise'),
|
|
v.literal('precisa_ajustes'),
|
|
v.literal('cancelado'),
|
|
v.literal('concluido')
|
|
),
|
|
// acaoId removed
|
|
criadoPor: v.id('usuarios'),
|
|
aceitoPor: v.optional(v.id('funcionarios')),
|
|
descricaoAjuste: v.optional(v.string()), // Required when status is 'precisa_ajustes'
|
|
concluidoEm: v.optional(v.number()),
|
|
criadoEm: v.number(),
|
|
atualizadoEm: v.number()
|
|
})
|
|
.index('by_numeroSei', ['numeroSei'])
|
|
.index('by_numeroDfd', ['numeroDfd'])
|
|
.index('by_status', ['status'])
|
|
.index('by_criadoPor', ['criadoPor'])
|
|
.index('by_aceitoPor', ['aceitoPor'])
|
|
.index('by_criadoEm', ['criadoEm'])
|
|
.index('by_concluidoEm', ['concluidoEm']),
|
|
|
|
objetoItems: defineTable({
|
|
pedidoId: v.id('pedidos'),
|
|
objetoId: v.id('objetos'), // was produtoId
|
|
ataId: v.optional(v.id('atas')),
|
|
acaoId: v.optional(v.id('acoes')), // Moved from pedidos
|
|
// Opcional: permite criar itens sem definir modalidade upfront (ex: geração via planejamento)
|
|
modalidade: v.optional(
|
|
v.union(
|
|
v.literal('dispensa'),
|
|
v.literal('inexgibilidade'),
|
|
v.literal('adesao'),
|
|
v.literal('consumo')
|
|
)
|
|
),
|
|
valorEstimado: v.string(),
|
|
valorReal: v.optional(v.string()),
|
|
quantidade: v.number(),
|
|
adicionadoPor: v.id('funcionarios'),
|
|
criadoEm: v.number()
|
|
})
|
|
.index('by_pedidoId', ['pedidoId'])
|
|
.index('by_objetoId', ['objetoId'])
|
|
.index('by_ataId_and_objetoId', ['ataId', 'objetoId'])
|
|
.index('by_adicionadoPor', ['adicionadoPor'])
|
|
.index('by_acaoId', ['acaoId']),
|
|
|
|
solicitacoesItens: defineTable({
|
|
pedidoId: v.id('pedidos'),
|
|
tipo: v.union(
|
|
v.literal('adicao'),
|
|
v.literal('alteracao_quantidade'),
|
|
v.literal('exclusao'),
|
|
v.literal('alteracao_detalhes')
|
|
),
|
|
dados: v.string(), // JSON string with details
|
|
status: v.union(v.literal('pendente'), v.literal('aprovado'), v.literal('rejeitado')),
|
|
solicitadoPor: v.id('funcionarios'),
|
|
criadoEm: v.number()
|
|
})
|
|
.index('by_pedidoId', ['pedidoId'])
|
|
.index('by_status', ['status']),
|
|
|
|
historicoPedidos: defineTable({
|
|
pedidoId: v.id('pedidos'),
|
|
usuarioId: v.id('usuarios'),
|
|
acao: v.string(), // "criacao", "alteracao_status", "adicao_item", "remocao_item", "edicao_item"
|
|
detalhes: v.optional(v.string()), // JSON string
|
|
data: v.number()
|
|
})
|
|
.index('by_pedidoId', ['pedidoId'])
|
|
.index('by_usuarioId', ['usuarioId'])
|
|
.index('by_data', ['data']),
|
|
|
|
// Documentos anexados diretamente ao pedido (ilimitado)
|
|
pedidoDocumentos: defineTable({
|
|
pedidoId: v.id('pedidos'),
|
|
descricao: v.string(),
|
|
nome: v.string(),
|
|
storageId: v.id('_storage'),
|
|
tipo: v.string(), // MIME type
|
|
tamanho: v.number(), // bytes
|
|
criadoPor: v.id('funcionarios'),
|
|
criadoEm: v.number(),
|
|
origemSolicitacaoId: v.optional(v.id('solicitacoesItens'))
|
|
})
|
|
.index('by_pedidoId', ['pedidoId'])
|
|
.index('by_criadoPor', ['criadoPor'])
|
|
.index('by_origemSolicitacaoId', ['origemSolicitacaoId']),
|
|
|
|
// Documentos anexados a uma solicitação (somente solicitante; pode ter mais de um)
|
|
solicitacoesItensDocumentos: defineTable({
|
|
requestId: v.id('solicitacoesItens'),
|
|
pedidoId: v.id('pedidos'),
|
|
descricao: v.string(),
|
|
nome: v.string(),
|
|
storageId: v.id('_storage'),
|
|
tipo: v.string(), // MIME type
|
|
tamanho: v.number(), // bytes
|
|
criadoPor: v.id('funcionarios'),
|
|
criadoEm: v.number()
|
|
})
|
|
.index('by_requestId', ['requestId'])
|
|
.index('by_pedidoId', ['pedidoId'])
|
|
.index('by_criadoPor', ['criadoPor']),
|
|
|
|
// ========== FLUXO DE PEDIDOS ==========
|
|
|
|
// Configuração das etapas do fluxo de pedidos (dinâmico)
|
|
pedidoFluxoEtapa: defineTable({
|
|
nome: v.string(), // Nome da etapa (ex: "Rascunho", "Aguardando Aceite")
|
|
codigo: v.string(), // Código único (ex: "rascunho", "aguardando_aceite")
|
|
descricao: v.optional(v.string()),
|
|
setorId: v.optional(v.id('setores')), // Setor responsável por esta etapa
|
|
tempoEstimadoDias: v.optional(v.number()), // Tempo estimado em dias
|
|
incluirNoTimeline: v.boolean(), // Se false, não aparece no timeline (ex: rascunho)
|
|
ordem: v.number(), // Ordem de exibição
|
|
criadoEm: v.number(),
|
|
atualizadoEm: v.number()
|
|
})
|
|
.index('by_codigo', ['codigo'])
|
|
.index('by_ordem', ['ordem']),
|
|
|
|
// Transições possíveis entre etapas
|
|
pedidoFluxoTransicao: defineTable({
|
|
etapaOrigemId: v.id('pedidoFluxoEtapa'),
|
|
etapaDestinoId: v.id('pedidoFluxoEtapa'),
|
|
isPadrao: v.boolean(), // Se é a transição padrão quando há múltiplas opções
|
|
criadoEm: v.number()
|
|
})
|
|
.index('by_etapaOrigemId', ['etapaOrigemId'])
|
|
.index('by_etapaOrigemId_isPadrao', ['etapaOrigemId', 'isPadrao']),
|
|
|
|
// Histórico de etapas do pedido
|
|
pedidoEtapasHistorico: defineTable({
|
|
pedidoId: v.id('pedidos'),
|
|
etapaId: v.id('pedidoFluxoEtapa'),
|
|
inicioData: v.number(),
|
|
fimData: v.optional(v.number()),
|
|
funcionarioId: v.optional(v.id('funcionarios')),
|
|
atual: v.boolean()
|
|
})
|
|
.index('by_pedidoId', ['pedidoId'])
|
|
.index('by_pedidoId_atual', ['pedidoId', 'atual'])
|
|
.index('by_etapaId', ['etapaId'])
|
|
.index('by_funcionarioId', ['funcionarioId'])
|
|
};
|