# ⚡ Quick Reference - GT_DoctoTransporte

## 🎯 Referência Rápida para Desenvolvedores

---

## 📂 Estrutura Pronta para Copiar

### Adicionar Novo Campo no Formulário

```php
<!-- No cad.php, dentro de uma seção card-body -->
<div class="col-lg-X">
  <div class="form-group">
    <label class="col-form-label" for="novofield">Rótulo do Campo</label>
    <input type="text" class="form-control" id="novofield" 
           name="novofield" 
           value="<?php echo isset($dados['novofield']) ? $dados['novofield'] : '';?>">
  </div>
</div>
```

```php
// No insert.php - adicionar variável de captura
$novofield = isset($_POST['novofield']) && !empty($_POST['novofield']) 
  ? pg_escape_string($bdcon, $_POST['novofield']) 
  : null;

// Na query INSERT:
$query = "INSERT INTO gt_doctotransporte (
  ..., 
  novofield,
  ...
) VALUES (
  ..., 
  '$novofield',
  ...
)";

// Na query UPDATE:
$query = "UPDATE gt_doctotransporte SET
  ...,
  novofield = '$novofield',
  ...
  WHERE id = $id";
```

---

## 🔧 Endpoints AJAX Rápidos

### Criar um Novo Endpoint

```php
<?php
// novo_endpoint.php
header('Content-Type: application/json');
ob_start();

require('../include/autenticacao.php');

ob_clean();

$parametro = isset($_POST['parametro']) ? intval($_POST['parametro']) : 0;

if ($_SERVER['REQUEST_METHOD'] != 'POST') {
    http_response_code(400);
    echo json_encode(['sucesso' => false, 'erro' => 'Método não permitido']);
    exit;
}

try {
    // Sua lógica aqui
    $query = "SELECT * FROM tabela WHERE id = $parametro";
    $result = pg_query($bdcon, $query);
    
    if (!$result) {
        throw new Exception(pg_last_error($bdcon));
    }
    
    // Sucesso
    echo json_encode(['sucesso' => true, 'dados' => pg_fetch_all($result)]);
    
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['sucesso' => false, 'erro' => $e->getMessage()]);
}
?>
```

### Chamar Endpoint via JavaScript

```javascript
const data = {
  parametro: 123,
  outro: 'valor'
};

fetch('novo_endpoint.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  body: new URLSearchParams(data)
})
.then(response => response.json())
.then(result => {
  if (result.sucesso) {
    console.log('Sucesso:', result.dados);
    // Mostrar modal
  } else {
    console.error('Erro:', result.erro);
  }
})
.catch(error => console.error('Erro fetch:', error));
```

---

## 🎨 Componentes HTML Prontos

### Card de Seção

```php
<div class="gt_doctotransporte-card card-primary">
  <div class="gt_doctotransporte-card-header">
    <span class="material-icons">icon_name</span> 
    <h6>Título da Seção</h6>
  </div>
  <div class="gt_doctotransporte-card-body">
    <!-- Conteúdo aqui -->
  </div>
</div>
```

### Form Group (campo)

```php
<div class="row form-group">
  <div class="col-lg-6">
    <div class="form-group">
      <label class="col-form-label" for="field">Rótulo</label>
      <input type="text" class="form-control" id="field" name="field">
    </div>
  </div>
</div>
```

### Select com SelectTwo

```php
<select class="form-control populate" data-plugin-selectTwo id="select" name="select">
  <option value="">Selecione...</option>
  <?php foreach($lista as $item): ?>
    <option value="<?php echo $item['id']; ?>">
      <?php echo $item['descricao']; ?>
    </option>
  <?php endforeach; ?>
</select>
```

### Modal Bootstrap

```php
<div class="modal fade" id="modalCustom" tabindex="-1">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">Título</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
      </div>
      <div class="modal-body">
        Conteúdo aqui
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
          Fechar
        </button>
        <button type="button" class="btn btn-primary">Ação</button>
      </div>
    </div>
  </div>
</div>
```

---

## 💾 Snippets de Código Frequentes

### Validar e Escapar Dados

```php
// String
$nome = isset($_POST['nome']) ? pg_escape_string($bdcon, $_POST['nome']) : null;

// Inteiro
$id = isset($_POST['id']) ? intval($_POST['id']) : 0;

// Float/Decimal
$valor = isset($_POST['valor']) ? floatval($_POST['valor']) : 0;

// Data
$data = isset($_POST['data']) ? pg_escape_string($bdcon, $_POST['data']) : null;

// Com validação
$email = isset($_POST['email']) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)
  ? pg_escape_string($bdcon, $_POST['email']) 
  : null;
```

### Retornar Resposta JSON

```php
// Sucesso simples
echo json_encode(['sucesso' => true]);

// Sucesso com dados
echo json_encode(['sucesso' => true, 'id' => 123, 'mensagem' => 'Salvo']);

// Erro
http_response_code(400);
echo json_encode(['sucesso' => false, 'erro' => 'Mensagem de erro']);
exit;

// Com exceção
try {
  // código
} catch (Exception $e) {
  http_response_code(500);
  echo json_encode(['sucesso' => false, 'erro' => $e->getMessage()]);
  exit;
}
```

### Executar Query com Tratamento

```php
$query = "SELECT * FROM tabela WHERE id = $id";
$result = pg_query($bdcon, $query);

if (!$result) {
  throw new Exception('Erro na query: ' . pg_last_error($bdcon));
}

// Fetch um resultado
$row = pg_fetch_assoc($result);

// Fetch todos resultados
$rows = pg_fetch_all($result);

// Contar linhas
$count = pg_num_rows($result);
```

### JavaScript - Mostrar Modal

```javascript
// Modal sucesso
const modal = new bootstrap.Modal(document.getElementById('modalSucesso'));
document.getElementById('modalSucessoMensagem').textContent = 'Operação concluída!';
modal.show();

// Modal erro
const modal = new bootstrap.Modal(document.getElementById('modalErro'));
document.getElementById('modalErroMensagem').textContent = 'Ocorreu um erro!';
modal.show();

// Fechar
const modal = bootstrap.Modal.getInstance(document.getElementById('modalSucesso'));
modal.hide();
```

### JavaScript - Fetch com FormData

```javascript
const form = document.getElementById('cadform');
const formData = new FormData(form);

fetch(form.getAttribute('action'), {
  method: 'POST',
  body: formData
})
.then(response => response.json())
.then(data => {
  if(data.sucesso) {
    // sucesso
  } else {
    // erro: data.erro
  }
})
.catch(error => console.error(error));
```

### Event Delegation em Tabela

```javascript
const tabela = document.getElementById('tabelaComposicao');

tabela.addEventListener('click', function(e) {
  // Botão remover
  if (e.target.closest('.btn-remover')) {
    const btn = e.target.closest('.btn-remover');
    const id = btn.dataset.id;
    removerItem(id);
  }
  
  // Botão salvar
  if (e.target.closest('.btn-salvar')) {
    const btn = e.target.closest('.btn-salvar');
    const id = btn.dataset.id;
    salvarItem(id);
  }
});
```

---

## 🗄️ Queries SQL Comuns

### SELECT com JOIN

```sql
SELECT 
  gt.*,
  dp.nomerazaosocial as nome_remetente,
  dp2.nomerazaosocial as nome_destinatario
FROM gt_doctotransporte gt
LEFT JOIN dm_participante dp ON gt.idremetente = dp.id
LEFT JOIN dm_participante dp2 ON gt.iddestinatario = dp2.id
WHERE gt.id = $id;
```

### COUNT com GROUP BY

```sql
SELECT 
  tipocomposicao,
  COUNT(*) as quantidade,
  SUM(valor) as total
FROM gt_doctotransporte_composicao
WHERE iddocto = $id AND status = 0
GROUP BY tipocomposicao;
```

### UPDATE com condicional

```sql
UPDATE gt_doctotransporte 
SET vlrtotal = $total,
    vlrreceber = $total,
    impbasecalculo = $total
WHERE id = $id
  AND empresa = $empresa;
```

### DELETE com validação

```sql
DELETE FROM gt_doctotransporte_composicao
WHERE id = $id 
  AND iddocto = (SELECT iddocto FROM gt_doctotransporte_composicao WHERE id = $id)
RETURNING iddocto;
```

---

## 🔍 Debugging Rápido

### Console Log (JavaScript)

```javascript
// Objeto completo
console.log('Item:', item);

// Com label
console.log('Valor:', valor);
console.log('Array:', composicaoItems);

// Tabela
console.table(composicaoItems);

// Tempo
console.time('operacao');
// ... código ...
console.timeEnd('operacao');

// Erro
console.error('Erro crítico:', erro);
```

### var_dump (PHP)

```php
// Debug simples
var_dump($variavel);

// Sem parar execução
echo '<pre>'; print_r($dados); echo '</pre>';

// JSON
echo json_encode($dados, JSON_PRETTY_PRINT);

// Condicional
if ($debug) {
  error_log('Debug: ' . json_encode($dados));
}
```

---

## 📋 Checklist - Antes de Fazer Deploy

- [ ] Testar INSERT novo documento
- [ ] Testar UPDATE editar documento
- [ ] Testar DELETE documento
- [ ] Testar adicionar composição
- [ ] Testar editar composição
- [ ] Testar remover composição
- [ ] Verificar modal de sucesso/erro
- [ ] Verificar permissões
- [ ] Testar em navegador antigo (Chrome, Firefox, Safari)
- [ ] Testar responsividade (mobile)
- [ ] Remover console.log de produção
- [ ] Remover var_dump de produção
- [ ] Verificar pontos de escape (pg_escape_string)
- [ ] Backup do banco antes

---

## 🚀 Performance Tips

### JavaScript

```javascript
// ❌ Ruim - múltiplos DOM access
for (let i = 0; i < 100; i++) {
  document.getElementById('resultado').innerHTML += '<div>' + i + '</div>';
}

// ✅ Bom - acesso único + acúmulo string
let html = '';
for (let i = 0; i < 100; i++) {
  html += '<div>' + i + '</div>';
}
document.getElementById('resultado').innerHTML = html;

// ✅ Melhor - usar fragment
const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
  const div = document.createElement('div');
  div.textContent = i;
  fragment.appendChild(div);
}
document.getElementById('resultado').appendChild(fragment);
```

### PHP

```php
// ❌ Ruim - query em loop
foreach ($ids as $id) {
  $result = pg_query($bdcon, "SELECT * FROM tabela WHERE id = $id");
  // processar
}

// ✅ Bom - query única
$ids_str = implode(',', $ids);
$result = pg_query($bdcon, "SELECT * FROM tabela WHERE id IN ($ids_str)");
while ($row = pg_fetch_assoc($result)) {
  // processar
}
```

---

## 📚 Links Úteis Internos

- [GUIA_MANUTENCAO.md](GUIA_MANUTENCAO.md) - Documentação completa
- [IMPLEMENTACAO_LAYOUT_ABAS.md](IMPLEMENTACAO_LAYOUT_ABAS.md) - Detalhes UI
- [cad.php](cad.php) - Formulário principal
- [insert.php](insert.php) - Handler de cadastro
- [js/formulario.js](js/formulario.js) - Lógica formulário
- [js/composicao.js](js/composicao.js) - Lógica composição

---

**Dúvidas?** Consulte GUIA_MANUTENCAO.md para informações mais detalhadas.
