# ⚙️ CONFIGURAÇÃO DO AGENTE COPILOT - TESTE

**Documento que personaliza o agente para seguir 100% os padrões do projeto SAG**

---

## 📋 REGRAS OBRIGATÓRIAS DO AGENTE

O agente deve **SEMPRE** aplicar estes padrões em qualquer CRUD ou desenvolvimento:

### 1️⃣ PADRÕES DE BANCO DE DADOS

#### Campo ID (OBRIGATÓRIO)
```sql
id serial4 NOT NULL PRIMARY KEY
```
✅ Use SEMPRE `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
```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  
✅ Nunca armazene a descrição, apenas o código

---

### 2️⃣ REGRAS DE CÓDIGO OBRIGATÓRIAS

#### ❌ 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
SELECT * FROM dim_novo_modulo WHERE id=$id

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

#### ✅ SEMPRE filtrar Deletados
```php
// ❌ ERRADO
SELECT * FROM dim_novo_modulo WHERE empresa=$codempresa

// ✅ CORRETO
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) VALUES ($empresa, '$descricao')";
```

#### 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 ARQUIVO (ESTRUTURA CRUD)

**Arquivos que SEMPRE serão criados para cada módulo:**

1. **select.php** - Consulta básica com filtros
2. **cad.php** - Formulário de cadastro
3. **index.php** - Lista com permissões (otimizada)
4. **insert.php** - Inserir/Atualizar com validações
5. **delete.php** - Soft delete (UPDATE status=2)
6. **filtro.php** - Aplicar filtros

---

### 4️⃣ 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";
```

#### cad.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';

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';

validarPermissaoOuRedirecionar($rot, 'deletar');

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

#### index.php (Otimizado - uma busca de permissão)
```php
<?php require ('../include/validacaopermissao.php');
$rot = 'dm_seu_modulo';

validarPermissaoOuRedirecionar($rot, 'visualizar');

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

// Loop REUTILIZA as variáveis (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>";
	}
}
```

---

### 5️⃣ PADRÃO DE CAMPOS COM MÚLTIPLOS VALORES

**Quando um campo possui múltiplas opções, use INT com CASE WHEN:**

#### No SQL (com CASE WHEN):
```php
$query = "
	SELECT
		pc.id,
		pc.descricao,
		pc.tipoconta,
		CASE WHEN pc.tipoconta = 1 THEN 'Ativo'
			 WHEN pc.tipoconta = 2 THEN 'Sintético'
			 WHEN pc.tipoconta = 3 THEN 'Analítico'
			 WHEN pc.tipoconta = 4 THEN 'Detalhe'
			 WHEN pc.tipoconta = 5 THEN 'Fechado'
			 ELSE 'Indefinido' END as tipoconta_desc,
		pc.natureza,
		CASE WHEN pc.natureza = 0 THEN 'Débito' ELSE 'Crédito' END as natureza_desc,
		pc.status
	FROM public.dim_planoconta pc
	WHERE pc.empresa = $codempresa AND pc.status != 2
";
```

#### No cad.php (com SELECT):
```php
<select class="form-control populate" id="tipoconta" name="tipoconta" required>
	<option value="">-- Selecione --</option>
	<option value="1" <?php if($dados['tipoconta']==1){echo "selected";}?>>Ativo</option>
	<option value="2" <?php if($dados['tipoconta']==2){echo "selected";}?>>Sintético</option>
	<option value="3" <?php if($dados['tipoconta']==3){echo "selected";}?>>Analítico</option>
	<option value="4" <?php if($dados['tipoconta']==4){echo "selected";}?>>Detalhe</option>
	<option value="5" <?php if($dados['tipoconta']==5){echo "selected";}?>>Fechado</option>
</select>
```

#### No insert.php (converter para INT):
```php
$tipoconta = intval($_POST["tipoconta"]);    // Converter para INT
$natureza = intval($_POST["natureza"]);      // Converter para INT

$sql = "INSERT INTO dim_planoconta (empresa, descricao, tipoconta, natureza) 
		VALUES ($empresa, '$descricao', $tipoconta, $natureza)";
```

---

## 🎯 CHECKLIST DO AGENTE

Quando pedir um CRUD novo, o agente deve **SEMPRE**:

### Antes de Codificar:
- [ ] Ler o DDL fornecido
- [ ] Verificar se tem `id serial4 PRIMARY KEY`
- [ ] Verificar se tem `status int4 DEFAULT 0`
- [ ] Verificar se tem `empresa int4 NOT NULL`
- [ ] Identificar campos com múltiplos valores (devem ser INT)

### Ao Criar select.php:
- [ ] Incluir `WHERE empresa=$codempresa AND status != 2`
- [ ] Usar `CASE WHEN` para campos com múltiplos valores
- [ ] Aplicar filtros com `intval()` para INT e `pg_escape_string()` para VARCHAR

### Ao Criar cad.php:
- [ ] Incluir `validarPermissaoOuRedirecionar($rot, 'visualizar')`
- [ ] Criar SELECT com OPTIONS para campos de múltiplos valores

### Ao Criar insert.php:
- [ ] Usar `validarPermissaoOuRedirecionar($rot, 'editar')` para UPDATE
- [ ] Usar `validarPermissaoOuRedirecionar($rot, 'criar')` para INSERT
- [ ] Converter POST com `intval()` ou `pg_escape_string()` conforme tipo
- [ ] Incluir `AND empresa=$empresa` em UPDATE/DELETE

### Ao Criar delete.php:
- [ ] ❌ NUNCA usar DELETE FROM
- [ ] ✅ SEMPRE usar `UPDATE SET status=2`
- [ ] Incluir `AND empresa=$empresa` na cláusula WHERE
- [ ] Usar `validarPermissaoOuRedirecionar($rot, 'deletar')`

### Ao Criar index.php:
- [ ] Usar `obterTodasPermissoes($rot)` UMA VEZ antes do loop
- [ ] Armazenar em variáveis: `$perm_editar`, `$perm_deletar`
- [ ] Reutilizar variáveis dentro do loop (sem queries dentro do loop)

---

## 📌 INSTRUÇÕES PARA O AGENTE

### Quando o Usuário Pedir um CRUD:

**Você deve seguir exatamente estes passos:**

1. **Ler a documentação `DOCUMENTACAO_PADROES/` do projeto**
   - Especialmente: PADROES_SISTEMA.md, SNIPPETS_CODIGO_PADRAO.md, QUICK_PADROES.md

2. **Solicitar o DDL ou CREATE TABLE**
   - Se não fornecido, pedir: "Qual é o CREATE TABLE da tabela?"

3. **Validar o DDL**
   - Verificar se tem `id serial4 PRIMARY KEY`
   - Verificar se tem `status int4 DEFAULT 0`
   - Verificar se tem `empresa int4 NOT NULL`
   - Se faltar algum, avisar e corrigir

4. **Criar os 6 arquivos padrão:**
   - select.php (com filtros e CASE WHEN)
   - cad.php (formulário com SELECT)
   - index.php (com permissões otimizadas)
   - insert.php (com validações)
   - delete.php (SOFT DELETE apenas)
   - filtro.php (aplicar filtros)

5. **Aplicar padrões em TODOS os arquivos:**
   - Validação de permissão em cada arquivo
   - WHERE com `empresa=$codempresa AND status != 2`
   - NUNCA DELETE FROM (sempre UPDATE status=2)
   - intval() para INT, pg_escape_string() para VARCHAR

6. **Documentar com comentários:**
   - Explicar cada query
   - Marcar validações de permissão
   - Indicar onde aplicar filtros

---

## 🚀 COMO USAR ESTE DOCUMENTO

**Copie este link para todas as conversas com o agente:**

```
Siga os padrões do projeto:
/DOCUMENTACAO_PADROES/CONFIGURACAO_AGENTE_COPILOT.md
```

**Ou simplesmente peça um CRUD assim:**

```
Novo CRUD:
- Nome: dm_novo_modulo
- Rótulo: "Seu Rótulo"
- DDL: [CREATE TABLE aqui]
- Padrão: Siga DOCUMENTACAO_PADROES/
```

---

## 📚 ARQUIVOS DE REFERÊNCIA OBRIGATÓRIA

O agente deve **SEMPRE** consultar estes arquivos:

1. **PADROES_SISTEMA.md** - Padrões obrigatórios
2. **SNIPPETS_CODIGO_PADRAO.md** - Código pronto para copiar
3. **QUICK_PADROES.md** - Resumo em 1 página
4. **PADROES_CAMPOS_MULTIPLOS_VALORES.md** - Para campos INT com múltiplos valores
5. **FAQ_STATUS_SOFTDELETE.md** - Dúvidas sobre soft delete

---

> ⚠️ **IMPORTANTE:** Este documento é a "constituição" do agente. Sempre aplique estas regras, nunca faça exceção, nunca desvie dos padrões.
