-- ===================================================== -- SCRIPT COMPLETO: SISTEMA DE PARCELAS INDIVIDUAIS -- Execute este script no Supabase SQL Editor -- ===================================================== -- Verificar se a tabela já existe DO $$ BEGIN IF EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'venda_parcelas') THEN RAISE NOTICE '⚠️ Tabela venda_parcelas já existe. Pulando criação.'; ELSE RAISE NOTICE '✅ Criando tabela venda_parcelas...'; END IF; END $$; -- Criar tabela de parcelas CREATE TABLE IF NOT EXISTS venda_parcelas ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), venda_id UUID NOT NULL REFERENCES vendas(id) ON DELETE CASCADE, numero_parcela INTEGER NOT NULL, valor DECIMAL(10,2) NOT NULL, data_vencimento DATE NOT NULL, status TEXT DEFAULT 'pendente' CHECK (status IN ('pendente', 'pago', 'vencida', 'cancelada')), data_pagamento TIMESTAMP WITH TIME ZONE, pix_payment_id TEXT, pix_qr_code TEXT, pix_qr_code_base64 TEXT, observacoes TEXT, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), UNIQUE(venda_id, numero_parcela) ); -- Índices para performance CREATE INDEX IF NOT EXISTS idx_venda_parcelas_venda ON venda_parcelas(venda_id); CREATE INDEX IF NOT EXISTS idx_venda_parcelas_status ON venda_parcelas(status); CREATE INDEX IF NOT EXISTS idx_venda_parcelas_vencimento ON venda_parcelas(data_vencimento); -- Trigger para atualização automática do campo updated_at DROP TRIGGER IF EXISTS update_venda_parcelas_updated_at ON venda_parcelas; CREATE TRIGGER update_venda_parcelas_updated_at BEFORE UPDATE ON venda_parcelas FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); -- Habilitar Row Level Security ALTER TABLE venda_parcelas ENABLE ROW LEVEL SECURITY; -- Remover política antiga se existir DROP POLICY IF EXISTS "Enable all operations for authenticated users" ON venda_parcelas; -- Criar política de acesso (permitir todas operações) CREATE POLICY "Enable all operations for authenticated users" ON venda_parcelas FOR ALL USING (true); -- Comentários para documentação COMMENT ON TABLE venda_parcelas IS 'Armazena as parcelas individuais de cada venda parcelada com controle de status e PIX'; COMMENT ON COLUMN venda_parcelas.numero_parcela IS 'Número sequencial da parcela (1, 2, 3, etc)'; COMMENT ON COLUMN venda_parcelas.valor IS 'Valor da parcela individual'; COMMENT ON COLUMN venda_parcelas.data_vencimento IS 'Data de vencimento da parcela'; COMMENT ON COLUMN venda_parcelas.status IS 'Status da parcela: pendente, pago, vencida, cancelada'; COMMENT ON COLUMN venda_parcelas.data_pagamento IS 'Data e hora em que a parcela foi paga'; COMMENT ON COLUMN venda_parcelas.pix_payment_id IS 'ID do pagamento PIX no MercadoPago'; COMMENT ON COLUMN venda_parcelas.pix_qr_code IS 'Código PIX para cópia e cola'; COMMENT ON COLUMN venda_parcelas.pix_qr_code_base64 IS 'QR Code em base64 para exibição'; -- ===================================================== -- VERIFICAÇÃO E DIAGNÓSTICO -- ===================================================== -- Verificar se a tabela foi criada DO $$ DECLARE table_count INTEGER; index_count INTEGER; policy_count INTEGER; BEGIN -- Contar tabela SELECT COUNT(*) INTO table_count FROM information_schema.tables WHERE table_name = 'venda_parcelas'; -- Contar índices SELECT COUNT(*) INTO index_count FROM pg_indexes WHERE tablename = 'venda_parcelas'; -- Contar políticas SELECT COUNT(*) INTO policy_count FROM pg_policies WHERE tablename = 'venda_parcelas'; -- Exibir resultados RAISE NOTICE '========================================'; RAISE NOTICE '✅ VERIFICAÇÃO DO SISTEMA DE PARCELAS'; RAISE NOTICE '========================================'; RAISE NOTICE 'Tabela venda_parcelas: % %', CASE WHEN table_count > 0 THEN '✅ CRIADA' ELSE '❌ NÃO ENCONTRADA' END, CASE WHEN table_count > 0 THEN '' ELSE ' - Execute o script novamente!' END; RAISE NOTICE 'Índices criados: % índice(s)', index_count; RAISE NOTICE 'Políticas RLS: % política(s)', policy_count; RAISE NOTICE '========================================'; IF table_count > 0 THEN RAISE NOTICE '🎉 Sistema de parcelas instalado com sucesso!'; RAISE NOTICE '📝 Próximo passo: Reinicie o servidor Node.js'; RAISE NOTICE '🚀 Depois: Teste criando uma venda parcelada'; ELSE RAISE NOTICE '⚠️ Erro na instalação. Verifique as mensagens acima.'; END IF; RAISE NOTICE '========================================'; END $$; -- Verificar estrutura da tabela SELECT column_name as "Coluna", data_type as "Tipo", is_nullable as "Nullable" FROM information_schema.columns WHERE table_name = 'venda_parcelas' ORDER BY ordinal_position;