📊 Documentação do Sistema PDV

📋 Visão Geral

Este é um sistema de PDV (Ponto de Venda) desenvolvido em PHP que permite o registro de itens através de códigos de barras ou rastreamento, gerenciamento de carrinho de compras e finalização de vendas.

🎯 Objetivo: Facilitar o processo de vendas através da leitura automatizada de códigos, suportando tanto produtos quanto pacotes de clientes.

🏗️ Estrutura do Código

1. Inicialização e Dependências

session_start();
include_once "../templates/header_gestor.php";
include_once "../db/database.php";
$db = new Database();
$pdo = $db->getConnection();

Funcionalidade:

2. Inicialização do Carrinho

if (!isset($_SESSION['itens'])) {
    $_SESSION['itens'] = [];
}

Funcionalidade: Cria array de itens na sessão caso não exista.

3. Processamento de Requisições POST

3.1 Adição de Itens - Busca por Pacote

if (isset($_POST['codigo'])) {
    $codigo = trim($_POST['codigo']);
    
    // Busca por pacote
    $stmt = $pdo->prepare("SELECT c.nome AS cliente_nome, p.id 
                          FROM pacotes p 
                          INNER JOIN clientes c ON p.cliente_id = c.id_cliente 
                          WHERE p.codigo_rastreamento = :codigo");
    $stmt->bindParam(':codigo', $codigo);
    $stmt->execute();
    $pacote = $stmt->fetch(PDO::FETCH_ASSOC);

Funcionalidade:

📦 Estrutura do item pacote:
[
    'codigo' => 'código_rastreamento',
    'descricao' => 'Pacote - Nome do Cliente',
    'valor' => 2.00,
    'pacote_id' => id_do_pacote
]

3.2 Busca por Produto (fallback)

else {
    $stmt = $pdo->prepare("SELECT descricao, valor_venda 
                          FROM produtos 
                          WHERE codigo_barras = :codigo");
    $stmt->bindParam(':codigo', $codigo);
    $stmt->execute();
    $produto = $stmt->fetch(PDO::FETCH_ASSOC);

Funcionalidade:

🏷️ Estrutura do item produto:
[
    'codigo' => 'código_barras',
    'descricao' => 'descrição do produto',
    'valor' => valor_venda
]

3.3 Remoção de Itens

if (isset($_POST['remover'])) {
    unset($_SESSION['itens'][$_POST['remover']]);
    $_SESSION['itens'] = array_values($_SESSION['itens']);
}

Funcionalidade:

4. Cálculo do Total

$total = array_sum(array_column($_SESSION['itens'], 'valor'));
$itens_json = json_encode($_SESSION['itens']);

Funcionalidade:

🖥️ Interface HTML

5.1 Formulário de Entrada

<form method="POST">
    <input type="text" name="codigo" class="form-control" 
           placeholder="Bipe o código" autofocus>
    <button type="submit" class="btn btn-primary mt-2">Adicionar</button>
</form>

Funcionalidade:

5.2 Tabela de Itens

<?php foreach ($_SESSION['itens'] as $index => $item): ?>
    <tr>
        <td><?= htmlspecialchars($item['codigo']) ?></td>
        <td><?= htmlspecialchars($item['descricao']) ?></td>
        <td><?= number_format($item['valor'], 2, ',', '.') ?></td>
        <td>
            <form method="POST" style="display:inline;">
                <input type="hidden" name="remover" value="<?= $index ?>">
                <button type="submit" class="btn btn-danger btn-sm">Remover</button>
            </form>
        </td>
    </tr>
<?php endforeach; ?>

Funcionalidade:

5.3 Finalização

<h3>Total: R$ <?= number_format($total, 2, ',', '.') ?></h3>
<button class="btn btn-success" 
        onclick='abrirPagamento(<?= json_encode($total) ?>, <?= json_encode($itens_json) ?>)'>
    Finalizar Bipagem
</button>

⚙️ JavaScript - Abertura de Janela de Pagamento

function abrirPagamento(valorTotal, itens) {
    let url = `pagamento.php?valor_total=${valorTotal}&itens=${encodeURIComponent(itens)}`;
    window.open(url, 'Pagamento', 'width=600,height=400');
}

Funcionalidade:

🔄 Fluxo de Operação

1. Usuário bipa/digita código
   ↓
2. Sistema verifica se é pacote
   ↓
3. Se não for, verifica se é produto
   ↓
4. Item é adicionado ao carrinho (sessão)
   ↓
5. Página recarrega e exibe itens
   ↓
6. Usuário pode remover itens ou continuar bipando
   ↓
7. Ao finalizar, abre janela de pagamento

🗄️ Estrutura do Banco de Dados

Tabelas Referenciadas:

Tabela Campos Descrição
pacotes id, codigo_rastreamento, cliente_id Armazena pacotes de clientes com código de rastreamento
clientes id_cliente, nome Cadastro de clientes
produtos codigo_barras, descricao, valor_venda Catálogo de produtos para venda

💡 Melhorias Sugeridas

  1. Validação de entrada: Sanitizar código antes de buscar no banco
  2. Feedback visual: Mensagens de sucesso/erro ao adicionar itens
  3. AJAX: Evitar reload da página a cada adição
  4. Segurança: Validar sessão de usuário autenticado
  5. URL em GET: Passar dados via POST seria mais seguro que GET na URL
  6. Quantidade: Permitir adicionar múltiplas unidades do mesmo item
  7. Logs: Registrar todas as operações para auditoria

🔒 Considerações de Segurança