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