# 🎯 PADRÕES OBRIGATÓRIOS DO SISTEMA

**Documento de referência rápida para padrões de banco de dados e código.**

---

## 1. PADRÕES DE BANCO DE DADOS

### Campo ID (Obrigatório)
```sql
id serial4 NOT NULL PRIMARY KEY
```
- ✅ Sempre use `serial4` para auto-increment
- ✅ Sempre é PRIMARY KEY
- ✅ Nunca deixe NULL

### Campo Status (Obrigatório)
```sql
status int4 DEFAULT 0 NOT NULL
```
- `0` = **Ativo** (padrão)
- `2` = **Excluído** (soft delete)
- ✅ NUNCA use status=1 ou outros valores
- ✅ SEMPRE tem DEFAULT 0

### Campo Empresa (Obrigatório)
```sql
empresa int4 NOT NULL
```
- ✅ SEMPRE filtre por empresa nas queries
- ✅ Vem de `$_SESSION['Codempresa']`
- ✅ Nunca deixe NULL

### Campos com Múltiplos Valores (INT com Descrição)
```sql
tipoconta int4,    -- 1=Ativo, 2=Sintético, 3=Analítico, 4=Detalhe, 5=Fechado
natureza int4,     -- 0=Débito, 1=Crédito
```
- ✅ Armazene como INT no banco
- ✅ Use CASE WHEN no SQL para exibir descrição
- ✅ Use intval() para converter POST
- ✅ Não armazene a descrição, apenas o código
- ✅ Mantenha mapping: valor INT ↔ descrição

**Mapeamento de Valores (exemplo Plano de Contas):**
| Campo | Valor | Descrição |
|-------|-------|-----------|
| tipoconta | 1 | Ativo |
| tipoconta | 2 | Sintético |
| tipoconta | 3 | Analítico |
| tipoconta | 4 | Detalhe |
| tipoconta | 5 | Fechado |
| natureza | 0 | Débito |
| natureza | 1 | Crédito |

### Exemplo Completo:
```sql
CREATE TABLE public.dim_novo_modulo (
	id serial4 NOT NULL PRIMARY KEY,
	empresa int4 NOT NULL,
	descricao varchar NOT NULL,
	tipo varchar,
	status int4 DEFAULT 0 NOT NULL,
	criado_em timestamp DEFAULT CURRENT_TIMESTAMP
);
```

---

## 2. PADRÕES DE CÓDIGO

### Nunca Fazer DELETE Direto
```php
// ❌ ERRADO
DELETE FROM dim_novo_modulo WHERE id=$id;

// ✅ CORRETO (Soft Delete)
UPDATE dim_novo_modulo SET status=2 WHERE id=$id AND empresa=$empresa;
```

### Sempre Filtrar por Empresa
```php
// ❌ ERRADO
$sql = "SELECT * FROM dim_novo_modulo WHERE id=$id";

// ✅ CORRETO
$sql = "SELECT * FROM dim_novo_modulo WHERE id=$id AND empresa=$codempresa";
```

### Sempre Filtrar Deletados
```php
// ❌ ERRADO
$sql = "SELECT * FROM dim_novo_modulo WHERE empresa=$codempresa";

// ✅ CORRETO
$sql = "SELECT * FROM dim_novo_modulo WHERE empresa=$codempresa AND status != 2";
```

### Insert Padrão
```php
// ✅ CORRETO (status=0 automático via DEFAULT)
$sql = "INSERT INTO dim_novo_modulo (empresa, descricao, tipo) VALUES ($empresa, '$descricao', '$tipo')";

// Ou explícito:
$sql = "INSERT INTO dim_novo_modulo (empresa, descricao, tipo, status) VALUES ($empresa, '$descricao', '$tipo', 0)";
```

### Update Padrão
```php
// ✅ CORRETO
$sql = "UPDATE dim_novo_modulo SET descricao='$descricao', status=$status WHERE id=$id AND empresa=$empresa";
```

---

## 3. PADRÕES DE PERMISSÃO

### 4 Ações Automáticas
```php
validarPermissaoOuRedirecionar($rot, 'visualizar');  // Listar
validarPermissaoOuRedirecionar($rot, 'criar');       // Inserir
validarPermissaoOuRedirecionar($rot, 'editar');      // Atualizar
validarPermissaoOuRedirecionar($rot, 'deletar');     // Soft delete
```

### Select.php
```php
<?php require ('../include/autenticacao.php');

if(strpos($rotina, 'dm_seu_modulo') === false){
	echo "<script>alert('Sem permissão'); window.location.href='../home';</script>";
	exit;
}

$query = "SELECT * FROM dim_seu_modulo WHERE empresa=$codempresa AND status != 2";
```

### Cac.php (Formulário)
```php
<?php require ('../include/autenticacao.php');
require ('../include/validacaopermissao.php');
$rot = 'dm_seu_modulo';

validarPermissaoOuRedirecionar($rot, 'visualizar');
include ('../include/inicio.php');
```

### Insert.php
```php
<?php require ('../include/autenticacao.php');
require ('../include/validacaopermissao.php');
$rot = 'dm_seu_modulo';
$empresa = $_SESSION['Codempresa'];

if($action == 1) {
	validarPermissaoOuRedirecionar($rot, 'editar');
} else {
	validarPermissaoOuRedirecionar($rot, 'criar');
}
```

### Delete.php (Soft Delete)
```php
<?php require ('../include/autenticacao.php');
require ('../include/validacaopermissao.php');
$rot = 'dm_seu_modulo';
$empresa = $_SESSION['Codempresa'];

validarPermissaoOuRedirecionar($rot, 'deletar');

$sql = "UPDATE dim_seu_modulo SET status=2 WHERE id=$id AND empresa=$empresa";
pg_query($bdcon, $sql);
```

### Index.php (Otimizado)
```php
<?php require ('../include/autenticacao.php');
require ('../include/validacaopermissao.php');
$rot = 'dm_seu_modulo';

validarPermissaoOuRedirecionar($rot, 'visualizar');

// ✅ BUSCAR PERMISSÕES UMA VEZ
$permissoes = obterTodasPermissoes($rot);
$perm_editar = $permissoes['editar'];
$perm_deletar = $permissoes['deletar'];

// Loop SEM queries
foreach($dados as $linha) {
	if($perm_editar) {
		echo "<a href='cad?id={$linha['id']}'>Editar</a>";
	}
	if($perm_deletar) {
		echo "<a href='delete?id={$linha['id']}'>Deletar</a>";
	}
}
```

---

## 4. CAMPOS ESPERADOS EM SEÇÕES

### select.php
- ✅ `require ('../include/autenticacao.php')`
- ✅ Verificar permissão em `$_SESSION['rotina']`
- ✅ Filtrar por `empresa`
- ✅ Filtrar por `status != 2`
- ✅ Aplicar `$filtros` se existirem
- ✅ `ORDER BY` definido
- ✅ Resultado em `$re_postgree_dim_seu_modulo`

### index.php
- ✅ `require ('../include/validacaopermissao.php')`
- ✅ `validarPermissaoOuRedirecionar($rot, 'visualizar')`
- ✅ Buscar permissões 1x antes do loop
- ✅ Botões condicionais com variáveis

### cac.php
- ✅ `require ('../include/validacaopermissao.php')`
- ✅ Validar `strpos($rotina, 'dm_seu_modulo')`
- ✅ `validarPermissaoOuRedirecionar($rot, 'visualizar')`
- ✅ Lógica GET com `$action`
- ✅ Form class="form-horizontal form-bordered"

### insert.php
- ✅ `require ('../include/validacaopermissao.php')`
- ✅ Validar 'editar' se `$action == 1`
- ✅ Validar 'criar' se `else`
- ✅ Alert de sucesso
- ✅ Redirect para `index.php`

### delete.php
- ✅ `require ('../include/validacaopermissao.php')`
- ✅ Validar 'deletar'
- ✅ **OBRIGATÓRIO:** `UPDATE status=2` (NUNCA DELETE)
- ✅ Alert de sucesso
- ✅ Redirect para `index`

---

## 5. CHECKLIST DE VALIDAÇÃO

Ao criar novo CRUD, verificar:

- [ ] DDL tem `id serial4 PRIMARY KEY`
- [ ] DDL tem `status int4 DEFAULT 0`
- [ ] DDL tem `empresa int4`
- [ ] select.php filtra `WHERE empresa=$codempresa AND status != 2`
- [ ] insert.php valida 'criar' e 'editar'
- [ ] delete.php usa `UPDATE status=2` (NUNCA DELETE)
- [ ] index.php busca permissões 1x antes do loop
- [ ] cac.php valida 'visualizar' no início
- [ ] Todos os arquivos têm `$codempresa = $_SESSION['Codempresa']`
- [ ] Todos os arquivos validam permissão
- [ ] Alerts de sucesso funcionam e redirecionam

---

## 6. RESTAURAR REGISTROS DELETADOS

Se necessário recuperar um registro "deletado":

```sql
-- Ver registros deletados
SELECT * FROM dim_seu_modulo WHERE empresa=1 AND status=2;

-- Restaurar um registro
UPDATE dim_seu_modulo SET status=0 WHERE id=123 AND empresa=1;

-- Ver todos (ativos + deletados)
SELECT * FROM dim_seu_modulo WHERE empresa=1 ORDER BY id;
```

---

## 7. REFERÊNCIA RÁPIDA DE VARIÁVEIS

### Session Variables
```php
$_SESSION['Codempresa']     // Código da empresa (SEMPRE usar em WHERE)
$_SESSION['UsuarioID']      // ID do usuário logado
$_SESSION['UsuarioNome']    // Nome do usuário
$_SESSION['idgrupo']        // ID do grupo do usuário
$_SESSION['grupousuario']   // Nome do grupo
$_SESSION['rotina']         // Rotinas do usuário (comma-separated)
```

### Validação
```php
validarPermissao($rotina, $acao)                    // Retorna true/false
validarPermissaoOuRedirecionar($rotina, $acao)     // Valida ou redireciona
obterTodasPermissoes($rotina)                       // Retorna array com 4 ações
```

---

**Última atualização:** 27/01/2026  
**Versão:** 1.0  
**Status:** Produção ✅

> **DICA:** Imprima este documento para referência rápida na equipe!
