USE [Levelcode-LevelOS]
GO

-- ============================================================
--  MIGRAÇÃO DA TABELA [dbo].[Boletos]
--  Gerado em: 20/04/2026
--  Descrição: Melhoria de tipos, rastreabilidade,
--             suporte a arquivo (XML/PDF) e baixa bancária
-- ============================================================

-- ── PASSO 1: Corrigir tipos das colunas existentes ──────────

-- Datas
ALTER TABLE [dbo].[Boletos]
    ALTER COLUMN [EMITIDO] DATE NULL;
GO

ALTER TABLE [dbo].[Boletos]
    ALTER COLUMN [VENCE] DATE NULL;
GO

-- Valor
ALTER TABLE [dbo].[Boletos]
    ALTER COLUMN [VALOR] DECIMAL(10,2) NULL;
GO

-- Flags booleanas (S/N → BIT)
-- Precisa converter os dados antes de mudar o tipo
UPDATE [dbo].[Boletos] SET [PG]        = CASE WHEN [PG]        = 'S' THEN '1' ELSE '0' END;
UPDATE [dbo].[Boletos] SET [ACEITE]    = CASE WHEN [ACEITE]    = 'S' THEN '1' ELSE '0' END;
UPDATE [dbo].[Boletos] SET [IMPRESSO]  = CASE WHEN [IMPRESSO]  = 'S' THEN '1' ELSE '0' END;
UPDATE [dbo].[Boletos] SET [IMPORTACAO]= CASE WHEN [IMPORTACAO]= 'S' THEN '1' ELSE '0' END;
GO

ALTER TABLE [dbo].[Boletos] ALTER COLUMN [PG]         BIT NOT NULL;
ALTER TABLE [dbo].[Boletos] ALTER COLUMN [ACEITE]     BIT NOT NULL;
ALTER TABLE [dbo].[Boletos] ALTER COLUMN [IMPRESSO]   BIT NOT NULL;
ALTER TABLE [dbo].[Boletos] ALTER COLUMN [IMPORTACAO] BIT NOT NULL;
GO

-- Campos de texto: limitar tamanho adequado
ALTER TABLE [dbo].[Boletos] ALTER COLUMN [CODIGO]       VARCHAR(50)  NULL;
ALTER TABLE [dbo].[Boletos] ALTER COLUMN [NUMERO]       VARCHAR(50)  NULL;
ALTER TABLE [dbo].[Boletos] ALTER COLUMN [NOSSO_NUMERO] VARCHAR(50)  NULL;
ALTER TABLE [dbo].[Boletos] ALTER COLUMN [SACADO]       VARCHAR(200) NULL;
ALTER TABLE [dbo].[Boletos] ALTER COLUMN [CONTA]        VARCHAR(100) NULL;
ALTER TABLE [dbo].[Boletos] ALTER COLUMN [COD_CONTA]    VARCHAR(30)  NULL;
ALTER TABLE [dbo].[Boletos] ALTER COLUMN [OBSERVACAO]   VARCHAR(500) NULL;
GO

-- ── PASSO 2: Adicionar colunas novas ────────────────────────

-- Baixa bancária / integração
ALTER TABLE [dbo].[Boletos]
    ADD [CHAVE_BOLETO]    VARCHAR(100) NULL;  -- Chave única para baixa/integração bancária
GO

ALTER TABLE [dbo].[Boletos]
    ADD [LINHA_DIGITAVEL] VARCHAR(60) NULL;   -- Código de barras / linha digitável
GO

-- Pagamento
ALTER TABLE [dbo].[Boletos]
    ADD [DT_PAGAMENTO] DATE NULL;             -- Data efetiva do pagamento
GO

ALTER TABLE [dbo].[Boletos]
    ADD [VL_PAGO] DECIMAL(10,2) NULL;         -- Valor pago (pode ter multa/desconto)
GO

ALTER TABLE [dbo].[Boletos]
    ADD [VL_MULTA]    DECIMAL(10,2) NULL;     -- Multa por atraso
GO

ALTER TABLE [dbo].[Boletos]
    ADD [VL_DESCONTO] DECIMAL(10,2) NULL;     -- Desconto concedido
GO

-- Arquivo (XML ou PDF) — caminho em disco
ALTER TABLE [dbo].[Boletos]
    ADD [ARQUIVO_NOME]    VARCHAR(255) NULL;  -- Nome original do arquivo
GO

ALTER TABLE [dbo].[Boletos]
    ADD [ARQUIVO_TIPO]    VARCHAR(10)  NULL;  -- 'XML' ou 'PDF'
GO

ALTER TABLE [dbo].[Boletos]
    ADD [ARQUIVO_CAMINHO] VARCHAR(500) NULL;  -- Caminho completo em disco
GO

-- Arquivo — binário no banco
ALTER TABLE [dbo].[Boletos]
    ADD [ARQUIVO_DADOS] VARBINARY(MAX) NULL;  -- Conteúdo binário do arquivo
GO

-- Rastreabilidade
ALTER TABLE [dbo].[Boletos]
    ADD [DT_CADASTRO]  DATETIME     NOT NULL DEFAULT GETDATE();  -- Data de criação
GO

ALTER TABLE [dbo].[Boletos]
    ADD [DT_ALTERACAO] DATETIME     NULL;                        -- Última alteração
GO

ALTER TABLE [dbo].[Boletos]
    ADD [ID_USUARIO]   INT          NULL;                        -- Usuário responsável
GO

ALTER TABLE [dbo].[Boletos]
    ADD [STATUS] VARCHAR(20) NOT NULL DEFAULT 'ABERTO';
    -- Valores possíveis: 'ABERTO', 'PAGO', 'VENCIDO', 'CANCELADO', 'BAIXADO'
GO

-- ── PASSO 3: Índices para performance ───────────────────────

-- Busca por número do boleto
CREATE NONCLUSTERED INDEX [IX_Boletos_Numero]
    ON [dbo].[Boletos] ([NUMERO] ASC)
    WHERE [NUMERO] IS NOT NULL;
GO

-- Busca por chave bancária
CREATE NONCLUSTERED INDEX [IX_Boletos_Chave]
    ON [dbo].[Boletos] ([CHAVE_BOLETO] ASC)
    WHERE [CHAVE_BOLETO] IS NOT NULL;
GO

-- Busca por vencimento (relatórios de inadimplência)
CREATE NONCLUSTERED INDEX [IX_Boletos_Vence]
    ON [dbo].[Boletos] ([VENCE] ASC);
GO

-- Busca por status
CREATE NONCLUSTERED INDEX [IX_Boletos_Status]
    ON [dbo].[Boletos] ([STATUS] ASC);
GO

-- ── PASSO 4: Constraint de validação de status ──────────────

ALTER TABLE [dbo].[Boletos]
    ADD CONSTRAINT [CK_Boletos_Status]
    CHECK ([STATUS] IN ('ABERTO', 'PAGO', 'VENCIDO', 'CANCELADO', 'BAIXADO'));
GO

ALTER TABLE [dbo].[Boletos]
    ADD CONSTRAINT [CK_Boletos_ArquivoTipo]
    CHECK ([ARQUIVO_TIPO] IN ('XML', 'PDF') OR [ARQUIVO_TIPO] IS NULL);
GO

-- ── PASSO 5: FK para usuário (se a tabela existir) ──────────
-- Descomente quando a tabela de usuários estiver criada:
-- ALTER TABLE [dbo].[Boletos]
--     ADD CONSTRAINT [FK_Boletos_Usuario]
--     FOREIGN KEY ([ID_USUARIO]) REFERENCES [dbo].[Usuarios]([ID_USUARIO]);
-- GO

-- ── RESULTADO FINAL ──────────────────────────────────────────
-- Tabela com a estrutura completa após migração:
--
--  ID_BOLETO        INT IDENTITY PK
--  CODIGO           VARCHAR(50)
--  NUMERO           VARCHAR(50)
--  NOSSO_NUMERO     VARCHAR(50)
--  CHAVE_BOLETO     VARCHAR(100)   ← novo
--  LINHA_DIGITAVEL  VARCHAR(60)    ← novo
--  EMITIDO          DATE           ← tipo corrigido
--  VENCE            DATE           ← tipo corrigido
--  DT_PAGAMENTO     DATE           ← novo
--  VALOR            DECIMAL(10,2)  ← tipo corrigido
--  VL_PAGO          DECIMAL(10,2)  ← novo
--  VL_MULTA         DECIMAL(10,2)  ← novo
--  VL_DESCONTO      DECIMAL(10,2)  ← novo
--  STATUS           VARCHAR(20)    ← novo
--  PG               BIT            ← tipo corrigido
--  SACADO           VARCHAR(200)   ← tipo corrigido
--  CONTA            VARCHAR(100)   ← tipo corrigido
--  COD_CONTA        VARCHAR(30)    ← tipo corrigido
--  ACEITE           BIT            ← tipo corrigido
--  IMPRESSO         BIT            ← tipo corrigido
--  IMPORTACAO       BIT            ← tipo corrigido
--  ARQUIVO_NOME     VARCHAR(255)   ← novo
--  ARQUIVO_TIPO     VARCHAR(10)    ← novo
--  ARQUIVO_CAMINHO  VARCHAR(500)   ← novo
--  ARQUIVO_DADOS    VARBINARY(MAX) ← novo
--  OBSERVACAO       VARCHAR(500)   ← tipo corrigido
--  DT_CADASTRO      DATETIME       ← novo
--  DT_ALTERACAO     DATETIME       ← novo
--  ID_USUARIO       INT            ← novo