# Refatoração de Classes de Sincronização - Nova Arquitetura

## Resumo das Mudanças

Todas as classes de sincronização foram refatoradas para seguir a **nova arquitetura simplificada** baseada em `back.integracao`:

- **Antes**: Lógica com 3 níveis (modelo/origem/conexão) usando tabela obsoleta `back.integracao_erp`
- **Depois**: Lógica simplificada com uma única integração por conexão usando tabela `back.integracao`

## Arquivos Modificados

### 1. **SincronizadorERP.php** (Completamente reescrito)
- ✅ Removidas referências a `back.integracao_erp` e `fltipo`
- ✅ Construtor agora recebe `$cdIntegracao` em vez de `$cdModelo`
- ✅ `carregarConfiguracao()` busca diretamente de `back.integracao`
- ✅ `conectarOrigem()` não usa mais 3-level hierarchy
- ✅ `buscarDadosOrigem()` executa `sql_origem` diretamente do registro de integração
- ✅ `validarSQLLeituraApenas()` mantém proteção contra INSERT/UPDATE/DELETE
- ✅ `inserirLote()` cria registros com todos os 6 audit fields:
  - `florigem = 2` (sincronizado de origem)
  - `json_origem = json_encode($r)`
  - `flcancelado = 0`
  - `dtcriacao = NOW()`
  - `cdpessoa = 0`
  - `idlote = md5($cdintegracao . '_' . time() . '_' . count($lote))`

### 2. **SincronizadorRealizado.php** (Completamente reescrito)
- ✅ Removidas referências a `back.integracao_erp` e `fltipo`
- ✅ Construtor recebe `$cdIntegracao` e exige período (`$anoRef`, `$mesRef`)
- ✅ `carregarConfiguracao()` busca de `back.integracao` com `flativo = 1`
- ✅ `conectarOrigem()` constrói DSN diretamente dos campos de conexão
- ✅ `deletarPeriodo()` deleta apenas ano/mês específicos (não exercícios "abertos")
- ✅ `processarRegistros()` insere com todos os 6 audit fields
- ✅ Validação extra: `validarSQLLeituraApenas()` bloqueia comandos perigosos

### 3. **MapeadorDados.php** (Não alterado)
- ✅ Já usa arquitetura correta com `$cdintegracao`
- ✅ Carrega contexto e mapeamentos de tabelas dedicadas
- ✅ Compatível com nova estrutura

### 4. **FilaProcessador.php** (Não alterado)
- ✅ Já estava compatível, sem referências às tabelas obsoletas

### 5. **SincronizacaoERP.php** (Mantido por compatibilidade)
- ⚠️ Ainda contém lógica antiga com `back.integracao_erp`
- ⚠️ Não é usado em produção (apenas em exemplos/docs)
- ⚠️ Pode ser removido em versão futura

## Fluxo de Sincronização Atual

### Via realizado_actions.php (Funcionalmente ativo)

```
1. realizado_actions.php::sincronizarPeriodo()
   ├─ Recebe JSON com {anoref, mesref}
   ├─ Busca integrações ativas em back.integracao_empresa
   └─ Para cada integração:
      └─ sincronizarIntegracaoAgora($cdintegracao)
         ├─ Carrega config de back.integracao
         ├─ Valida sql_origem (SELECT/WITH only)
         ├─ Conecta ao banco de origem via PDO
         ├─ Executa sql_origem
         ├─ Deleta registros do período
         ├─ Insere registros com audit fields:
         │  ├─ florigem=2
         │  ├─ json_origem
         │  ├─ flcancelado=0
         │  ├─ dtcriacao
         │  ├─ cdpessoa=0
         │  └─ idlote (hash único)
         └─ Retorna estatísticas

2. Resposta JSON
   └─ {ok, msg, total, ignorados, erros}
```

### Via Classes (Disponíveis para uso futuro)

```
SincronizadorERP (genérico, todos os módulos)
├─ sincronizar()
├─ carregarConfiguracao()
├─ conectarOrigem()
├─ buscarDadosOrigem()
├─ processarRegistros()
└─ inserirLote()

SincronizadorRealizado (específico para back.realizado)
├─ sincronizar()
├─ carregarConfiguracao()
├─ conectarOrigem()
├─ deletarPeriodo()
├─ processarRegistros()
└─ inserirLote()
```

## Campos da Tabela back.realizado (17 campos)

```sql
cdempresa            INT
cdexercicio          INT
cdcentrocusto        INT
cdplanocontabil      INT
mesref               INT
anoref               INT
tpmovimento          CHAR(1) ['D', 'C']
valor                DECIMAL
dscomplemento        VARCHAR(500)
dtmovimento          DATE
cdintegracao         INT (FK → back.integracao)
florigem             INT (2 = sincronizado)
json_origem          JSON (dados originais)
flcancelado          INT (0 = ativo)
dtcriacao            TIMESTAMP (NOW())
cdpessoa             INT (0 = integração)
idlote               VARCHAR(32) (md5 hash)
```

## Validação de SQL (Defesa em Profundidade)

**Bloqueados em 4 camadas:**

1. **Frontend UI** (integracoes.php): Aviso visual com lista de comandos
2. **Frontend JS** (main.js): Alert ao tentar salvar SQL inválido
3. **Backend PHP** (integracoes_actions.php): `validarSQLOrigem()` regex
4. **Execução** (realizado_actions.php, Sincronizador*): Revalidação pré-execução

**Comandos Bloqueados:**
`INSERT`, `UPDATE`, `DELETE`, `MERGE`, `TRUNCATE`, `DROP`, `ALTER`, `CREATE`, `GRANT`, `REVOKE`, `COMMENT`, `EXEC`, `EXECUTE`, `CALL`

**Permitidos:**
`SELECT`, `WITH` (CTE)

## Tabelas Relacionadas

```
back.integracao
├─ cdintegracao (PK)
├─ tipo_banco (pgsql|mysql|sqlsrv)
├─ host
├─ porta
├─ dbname
├─ usuario
├─ senha_encrypted (base64)
├─ schema_banco
├─ sql_origem (SELECT/WITH only)
├─ flativo (1=ativo)
└─ ultima_sincronizacao

back.integracao_empresa (N:N)
├─ cdintegracao (FK)
├─ cdempresa (FK)
└─ flativo

back.realizado (destino)
├─ cdempresa
├─ cdexercicio
├─ cdcentrocusto
├─ cdplanocontabil
├─ mesref
├─ anoref
├─ tpmovimento
├─ valor
├─ dscomplemento
├─ dtmovimento
├─ cdintegracao (FK → back.integracao)
├─ florigem (2 = sincronizado)
├─ json_origem (audit)
├─ flcancelado (0 = ativo)
├─ dtcriacao (audit)
├─ cdpessoa (0 = integração)
└─ idlote (audit)
```

## Migração de Dados (Não necessária)

Não há necessidade de migração de dados se já estava usando a tabela `back.integracao`. Caso contrário, ver [migracao_cdmodelo.sql](../sql/migracao_cdmodelo.sql).

## Testes Recomendados

1. ✅ Sincronizar período com integração ativa
2. ✅ Verificar 6 audit fields em back.realizado
3. ✅ Testar SQL inválida (deve ser bloqueada)
4. ✅ Testar multas integrações simultâneas
5. ✅ Verificar que import/export CSV continua funcional
6. ✅ Validar erro handling com transação rollback

## Backward Compatibility

- ❌ **Não compatível** com código antigo que usa `$cdModelo` ou `fltipo = 'modelo'/'origem'/'conexao'`
- ✅ **Compatível** com integração_actions.php (já atualizado)
- ✅ **Compatível** com realizado_actions.php (já atualizado)
- ⚠️ **Descontinuado** SincronizacaoERP.php (use Sincronizador* em vez)

## Proximos Passos

1. ✅ Reescrever SincronizadorERP.php e SincronizadorRealizado.php
2. ✅ Verificar MapeadorDados.php e FilaProcessador.php
3. ⏳ Atualizar SincronizacaoERP.php se necessário para produção
4. ⏳ Teste end-to-end da sincronização
5. ⏳ Atualizar documentação de exemplo_integracao.php
