chore: sincroniza projeto para gitea
This commit is contained in:
123
scripts/aplicar-sistema-parcelas.sql
Normal file
123
scripts/aplicar-sistema-parcelas.sql
Normal file
@@ -0,0 +1,123 @@
|
||||
-- =====================================================
|
||||
-- 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;
|
||||
Reference in New Issue
Block a user