-- Reverte exclusivamente a migração financeira 009, aplicada por engano.
-- Preserva lançamentos legados e remove somente registros identificados pelas
-- chaves idempotentes geradas pelo backfill daquela migração.


DELETE FROM contas
WHERE automatica = 'S'
  AND chave_idempotencia IS NOT NULL
  AND (chave_idempotencia LIKE 'VENDA:%' OR chave_idempotencia LIKE 'COMPRA:%');

UPDATE contas
SET situacao = CASE
        WHEN situacao = 'PAGA' THEN 'PA'
        WHEN situacao = 'CANCELADA' THEN 'CA'
        ELSE 'PE'
    END,
    origem = CASE WHEN id_venda IS NOT NULL THEN 'V' ELSE LEFT(COALESCE(origem, 'C'), 1) END
WHERE chave_idempotencia IS NULL;

ALTER TABLE venda_pagamentos DROP FOREIGN KEY fk_venda_pagamento_condicao;
ALTER TABLE compra_pagamentos DROP FOREIGN KEY fk_compra_pagamento_condicao;

ALTER TABLE contas
    DROP FOREIGN KEY fk_contas_cliente,
    DROP FOREIGN KEY fk_contas_fornecedor,
    DROP FOREIGN KEY fk_contas_empresa,
    DROP FOREIGN KEY fk_contas_operacao,
    DROP FOREIGN KEY fk_contas_forma,
    DROP FOREIGN KEY fk_contas_condicao,
    DROP FOREIGN KEY fk_contas_venda,
    DROP FOREIGN KEY fk_contas_compra,
    DROP FOREIGN KEY fk_contas_categoria,
    DROP FOREIGN KEY fk_contas_centro,
    DROP FOREIGN KEY fk_contas_financeira,
    DROP FOREIGN KEY fk_contas_grupo,
    DROP FOREIGN KEY fk_contas_recorrencia,
    DROP FOREIGN KEY fk_contas_estornada,
    DROP FOREIGN KEY fk_contas_usuario,
    DROP FOREIGN KEY fk_contas_cancelado_usuario;


ALTER TABLE contas
    DROP INDEX uq_contas_chave_idempotencia,
    DROP INDEX idx_contas_consulta,
    DROP INDEX idx_contas_origem,
    DROP INDEX idx_contas_grupo,
    DROP INDEX idx_contas_recorrencia,
    DROP COLUMN id_fornecedor,
    DROP COLUMN id_operacao,
    DROP COLUMN id_compra,
    DROP COLUMN id_pagamento_origem,
    DROP COLUMN tipo_pagamento_origem,
    DROP COLUMN id_condicao,
    DROP COLUMN id_categoria,
    DROP COLUMN id_centro_custo,
    DROP COLUMN id_conta_financeira,
    DROP COLUMN id_grupo,
    DROP COLUMN id_recorrencia,
    DROP COLUMN id_conta_estornada,
    DROP COLUMN valor_original,
    DROP COLUMN valor_pago,
    DROP COLUMN saldo_aberto,
    DROP COLUMN moeda,
    DROP COLUMN data_emissao,
    DROP COLUMN total_parcelas,
    DROP COLUMN numero_parcela,
    DROP COLUMN automatica,
    DROP COLUMN chave_idempotencia,
    DROP COLUMN id_usuario,
    DROP COLUMN cancelado_por,
    DROP COLUMN cancelado_em,
    DROP COLUMN motivo_cancelamento,
    DROP COLUMN observacoes,
    MODIFY COLUMN valor DECIMAL(15,2) NOT NULL,
    MODIFY COLUMN valor_parcela DECIMAL(15,0) NULL,
    MODIFY COLUMN origem CHAR(1) NULL COMMENT 'C - Compra, V - Venda',
    MODIFY COLUMN situacao CHAR(2) NULL;

ALTER TABLE contas
    ADD CONSTRAINT FKCONTA_CLIENTE FOREIGN KEY (id_cliente) REFERENCES clientes (id) ON DELETE CASCADE ON UPDATE CASCADE,
    ADD CONSTRAINT FKCONTA_EMPRESA FOREIGN KEY (id_empresa) REFERENCES empresas (id) ON DELETE CASCADE ON UPDATE CASCADE,
    ADD CONSTRAINT FKCONTA_FORMA FOREIGN KEY (id_forma) REFERENCES formas_pagamento (id) ON DELETE CASCADE ON UPDATE CASCADE,
    ADD CONSTRAINT FKCONTA_VENDA FOREIGN KEY (id_venda) REFERENCES vendas (id) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE venda_pagamentos
    DROP INDEX uq_venda_pagamento_chave,
    DROP INDEX idx_venda_pagamento_condicao,
    DROP COLUMN id_condicao,
    DROP COLUMN chave_financeira,
    MODIFY COLUMN valor_parcela DECIMAL(15,0) NULL;

ALTER TABLE compra_pagamentos
    DROP INDEX uq_compra_pagamento_chave,
    DROP INDEX idx_compra_pagamento_condicao,
    DROP COLUMN id_condicao,
    DROP COLUMN chave_financeira;

UPDATE formas_pagamento fp
JOIN tipos_pagamento tp ON tp.id = fp.id_tipo
SET fp.condicao = 'A', fp.maximo_parcelas = 1
WHERE tp.codigo_sefaz IN (3,5,14,15)
  AND fp.intervalo_parcelas_dias = 30
  AND fp.maximo_parcelas IN (12,21)
  AND fp.prazo_primeira_parcela = CASE WHEN tp.codigo_sefaz IN (5,14,15) THEN 30 ELSE 0 END;

ALTER TABLE formas_pagamento
    DROP COLUMN prazo_primeira_parcela,
    DROP COLUMN intervalo_parcelas_dias;

ALTER TABLE operacoes
    DROP COLUMN gera_financeiro,
    DROP COLUMN financeiro_tipo,
    DROP COLUMN gerar_financeiro_em;


