# 📋 PADRÃO - Campos com Múltiplos Valores (INT com CASE WHEN)

## ℹ️ O Padrão

Quando um campo precisa armazenar **múltiplas opções** (como Tipo de Conta, Natureza, Tipo de Documento), use INT com mapeamento de valores.

### ✅ O que fazer:
```sql
-- No banco: armazenar INT (0, 1, 2, 3, 4, 5...)
tipoconta int4,     -- 1=Ativo, 2=Sintético, 3=Analítico, 4=Detalhe, 5=Fechado
natureza int4,      -- 0=Débito, 1=Crédito
```

### ❌ O que NÃO fazer:
```sql
-- ❌ ERRADO: armazenar string
tipoconta varchar,  -- "Ativo", "Sintético"... (consome mais espaço)
```

---

## 📊 Exemplo Real: Plano de Contas (dim_planoconta)

### DDL (Banco de Dados):
```sql
CREATE TABLE public.dim_planoconta (
	id bigserial PRIMARY KEY,
	empresa int4 NOT NULL,
	codigo varchar(50) NOT NULL,
	descricao varchar(255) NOT NULL,
	tipoconta int4,      -- 1=Ativo, 2=Sintético, 3=Analítico, 4=Detalhe, 5=Fechado
	nivel int4,
	natureza int4,       -- 0=Débito, 1=Crédito
	idanterior int4,
	contabil int4,
	gerencial int4,
	aceitalancamento int4,
	codigoreferencia varchar(50),
	status int4 DEFAULT 0,
	CONSTRAINT fk_plano_empresa FOREIGN KEY (empresa) REFERENCES sis001_empresa(id)
);
```

---

## 🔀 SELECT.PHP - Mapping de Valores para Exibição

```php
<?php require ('../include/autenticacao.php');
$query = "
	SELECT
		pc.id,
		pc.codigo,
		pc.descricao,
		pc.tipoconta,
		-- MAPEAMENTO: Int → Descrição
		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,
		-- MAPEAMENTO simples: 0 ou não = Débito : Crédito
		CASE WHEN pc.natureza = 0 THEN 'Débito' ELSE 'Crédito' END as natureza_desc,
		CASE WHEN pc.status = 0 THEN 'Ativo' ELSE 'Inativo' END as status_desc,
		pc.status
	FROM public.dim_planoconta pc
	WHERE pc.empresa = $codempresa
	AND pc.status != 2
";

// Filtros com intval para INT
if(isset($filtros) && is_array($filtros)) {
	if(isset($filtros['tipoconta']) && $filtros['tipoconta'] !== '') {
		$query .= " AND pc.tipoconta = " . intval($filtros['tipoconta']);
	}
	if(isset($filtros['natureza']) && $filtros['natureza'] !== '') {
		$query .= " AND pc.natureza = " . intval($filtros['natureza']);
	}
}

$query .= " ORDER BY pc.codigo ASC";
$re_postgree_dim_planoconta = pg_query($bdcon, $query);
?>
```

---

## 🎨 CAD.PHP - Formulário com SELECT

```php
<!-- Tipo de Conta: múltiplas opções -->
<div class="col-lg-3">
	<div class="form-group">
		<label class="col-form-label" for="tipoconta">Tipo de Conta</label>
		<select class="form-control populate" id="tipoconta" 
		        data-plugin-selectTwo name="tipoconta" required>
			<option value="">-- Selecione --</option>
			<!-- Valor 1 = Ativo -->
			<option value="1" 
			        <?php if($dados['tipoconta']==1){echo "selected";}?>>Ativo</option>
			<!-- Valor 2 = Sintético -->
			<option value="2" 
			        <?php if($dados['tipoconta']==2){echo "selected";}?>>Sintético</option>
			<!-- Valor 3 = Analítico -->
			<option value="3" 
			        <?php if($dados['tipoconta']==3){echo "selected";}?>>Analítico</option>
			<!-- Valor 4 = Detalhe -->
			<option value="4" 
			        <?php if($dados['tipoconta']==4){echo "selected";}?>>Detalhe</option>
			<!-- Valor 5 = Fechado -->
			<option value="5" 
			        <?php if($dados['tipoconta']==5){echo "selected";}?>>Fechado</option>
		</select>
	</div>
</div>

<!-- Natureza: apenas 2 opções -->
<div class="col-lg-2">
	<div class="form-group">
		<label class="col-form-label" for="natureza">Natureza</label>
		<select class="form-control populate" id="natureza" 
		        data-plugin-selectTwo name="natureza" required>
			<option value="">-- Selecione --</option>
			<!-- Valor 0 = Débito -->
			<option value="0" 
			        <?php if($dados['natureza']==0){echo "selected";}?>>Débito</option>
			<!-- Valor 1 = Crédito -->
			<option value="1" 
			        <?php if($dados['natureza']==1){echo "selected";}?>>Crédito</option>
		</select>
	</div>
</div>
```

---

## 💾 INSERT.PHP - Converter STRING → INT

```php
<?php require ('../include/autenticacao.php');
require ('../include/validacaopermissao.php');
$rot = 'dm_planoconta';

if($_SERVER["REQUEST_METHOD"] == "POST") {
	$id           = $_POST['id'];
	if($id == null){$id = 'null';}
	
	$codigo       = pg_escape_string($_POST["codigo"]);         // VARCHAR → pg_escape
	$descricao    = pg_escape_string($_POST["descricao"]);     // VARCHAR → pg_escape
	$tipoconta    = intval($_POST["tipoconta"]);               // INT → intval
	$nivel        = intval($_POST["nivel"]);                   // INT → intval
	$natureza     = intval($_POST["natureza"]);                // INT → intval
	$action       = $_POST["action"];
	$empresa      = $_POST["empresa"];
	$status       = $_POST["status"];
	if($status == null || $status == ''){$status = 0;}

	if($action == 1) {
		validarPermissaoOuRedirecionar($rot, 'editar');
		// Atualizar: não mexer com tipoconta/natureza existentes se vazios
		$sql = "UPDATE public.dim_planoconta
				SET codigo='$codigo', 
				descricao='$descricao',
				tipoconta=$tipoconta,
				nivel=$nivel,
				natureza=$natureza,
				status=$status
				WHERE id=$id AND empresa=$empresa";
	} else {
		validarPermissaoOuRedirecionar($rot, 'criar');
		// Inserir: usar intval dos INT
		$sql = "INSERT INTO public.dim_planoconta 
				(empresa, codigo, descricao, tipoconta, nivel, natureza, status)
				VALUES 
				($empresa, '$codigo', '$descricao', $tipoconta, $nivel, $natureza, 0)";
	}

	$res = pg_query($bdcon,$sql);
	
	if($res){
		echo "<script language='javascript' type='text/javascript'>
		alert('Cadastro realizado com sucesso');
		window.location.href='index';
		</script>";
		exit;
	}else{
		echo pg_last_error($bdcon);
		exit;
	}
}
?>
```

**⚠️ Regras de Conversão:**
- `pg_escape_string()` → Apenas para VARCHAR/TEXT
- `intval()` → Para INT/BIGINT/SMALLINT
- ❌ NÃO usar `pg_escape_string()` em INT!

---

## 🔍 FILTRO.PHP - Filtros com Múltiplos Valores

```php
<?php 
require ('../include/autenticacao.php'); 
$rot = 'dm_planoconta';
$filtros = [
	'tipoconta' => '',
	'natureza'  => '',
	'status'    => ''
];
include('../include/filtros_db.php');  // Salva na sessão
include ('../include/inicio.php');  
include ('select.php');
?>

<form id="filtroform" class="form-horizontal form-bordered" method="POST" action="index">

	<div class="row form-group">
		<div class="col-lg-3">
			<div class="form-group">
				<label class="col-form-label" for="tipoconta">Tipo de Conta</label>
				<select id="tipoconta" name="tipoconta" data-plugin-selectTwo 
				        class="form-control populate">
					<!-- Opção vazia para "Todos" -->
					<option value="" <?php echo (!isset($filtros['tipoconta']) || 
					        $filtros['tipoconta'] === '') ? 'selected' : ''; ?>>Todos</option>
					<!-- Mapeamento 1-5 -->
					<option value="1" 
					        <?php echo (isset($filtros['tipoconta']) && 
					        $filtros['tipoconta'] == '1') ? 'selected' : ''; ?>>Ativo</option>
					<option value="2" 
					        <?php echo (isset($filtros['tipoconta']) && 
					        $filtros['tipoconta'] == '2') ? 'selected' : ''; ?>>Sintético</option>
					<option value="3" 
					        <?php echo (isset($filtros['tipoconta']) && 
					        $filtros['tipoconta'] == '3') ? 'selected' : ''; ?>>Analítico</option>
					<option value="4" 
					        <?php echo (isset($filtros['tipoconta']) && 
					        $filtros['tipoconta'] == '4') ? 'selected' : ''; ?>>Detalhe</option>
					<option value="5" 
					        <?php echo (isset($filtros['tipoconta']) && 
					        $filtros['tipoconta'] == '5') ? 'selected' : ''; ?>>Fechado</option>
				</select>
			</div>
		</div>

		<div class="col-lg-3">
			<div class="form-group">
				<label class="col-form-label" for="natureza">Natureza</label>
				<select id="natureza" name="natureza" data-plugin-selectTwo 
				        class="form-control populate">
					<option value="" 
					        <?php echo (!isset($filtros['natureza']) || 
					        $filtros['natureza'] === '') ? 'selected' : ''; ?>>Todos</option>
					<!-- Mapeamento 0-1 -->
					<option value="0" 
					        <?php echo (isset($filtros['natureza']) && 
					        $filtros['natureza'] == '0') ? 'selected' : ''; ?>>Débito</option>
					<option value="1" 
					        <?php echo (isset($filtros['natureza']) && 
					        $filtros['natureza'] == '1') ? 'selected' : ''; ?>>Crédito</option>
				</select>
			</div>
		</div>
	</div>

</form>
```

---

## 📝 Mapeamento de Valores (Documentação)

**Sempre documente o mapeamento** para que outros desenvolvedores entendam:

```
Tabela: dim_planoconta

Campo: tipoconta (int4)
- 1 = Ativo
- 2 = Sintético
- 3 = Analítico
- 4 = Detalhe
- 5 = Fechado

Campo: natureza (int4)
- 0 = Débito
- 1 = Crédito

Campo: status (int4)
- 0 = Ativo (padrão)
- 2 = Excluído (soft delete)
```

---

## ✅ Checklist para Campos com Múltiplos Valores

- [ ] DDL usa INT (não VARCHAR)
- [ ] select.php tem CASE WHEN para exibir descrição
- [ ] cad.php tem SELECT com OPTIONS para cada valor
- [ ] insert.php usa `intval()` para converter POST
- [ ] filtro.php tem SELECT com OPTIONS para filtrar
- [ ] ❌ NÃO usa `pg_escape_string()` em INT
- [ ] Mapeamento documentado (1=descrição, 2=descrição...)
- [ ] Constraints CHECK implementados se necessário

---

## 🚀 Exemplo Completo Pronto para Copiar

Veja: [dm_planoconta](../dm_planoconta/) na pasta raiz - é um exemplo completo implementado com este padrão!

---

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