Files
sgse-app/packages/backend/convex/tables/pedidos.ts

111 lines
3.4 KiB
TypeScript

import { defineTable } from 'convex/server';
import { v } from 'convex/values';
export const pedidosTables = {
pedidos: defineTable({
numeroSei: 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_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
modalidade: 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_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'])
};