Este módulo gerencia o cadastro de produtos e o controle de estoque no painel administrativo.
Ele segue o padrão do BarberBot: página do módulo (produtos.php) + listagem via AJAX (produtos/listar.php)
+ endpoints de ação (salvar, excluir, entrada, saida).
Estrutura (onde mexer)
sistema/painel/paginas/
├─ produtos.php
├─ cat_produtos.php
└─ produtos/
├─ listar.php
├─ salvar.php
├─ excluir.php
├─ entrada.php
└─ saida.php
produtos.php– tela do módulo (botões, modais e formulários de cadastro/entrada/saída).produtos/listar.php– renderiza a tabela HTML com os registros e ações (editar/excluir/entrada/saída).produtos/salvar.php– cria/edita produto (inclui upload de foto quando presente).produtos/excluir.php– remove produto (e apaga a foto do disco quando existir).produtos/entrada.php– registra entrada de estoque (log + atualização do produto).produtos/saida.php– registra saída de estoque (log + atualização do produto).cat_produtos.php– categorias de produtos (cat_produtos).
Tabelas envolvidas (MySQL)
Abaixo está o que existe no dump atual do banco (arquivo barberbotcom_barberbot.sql).
Se sua base tiver tabelas extras, documente junto para manter o histórico.
produtos colunas
id, nome, descricao, categoria, valor_compra, valor_venda, estoque, foto, nivel_estoque, comissao_tipo, comissao_valor
cat_produtos colunas
id, nome
entradas e saidas (log de estoque)
entradas: id, produto, quantidade, motivo, usuario, data
saidas: id, produto, quantidade, motivo, usuario, data
Ponto crítico: entradas/saídas são “log” de movimento. Se faltar transação, você pode gravar o log e falhar na atualização do estoque (ou o inverso).
Em manutenção, prefira
BEGIN / COMMIT / ROLLBACK para garantir atomicidade.
Fluxos do módulo (padrão BarberBot)
1) Listagem (AJAX)
- O módulo trabalha com o parâmetro JS
pag(valor encontrado:<?=$pag?>). - A listagem é carregada via chamada AJAX para:
produtos/listar.phpe injetada no container de listagem. - O arquivo
listar.phpmonta tabela com colunas:
Nome | Categoria | Valor Compra | Valor Venda | Estoque | Ações
2) Cadastrar / Editar produto
- Formulário em
produtos.phpenvia dados paraprodutos/salvar.php. - Contrato de retorno esperado pelo front (string):
Salvo com Sucesso. - Chaves recebidas por
$_POSTemsalvar.php:
POST: categoria, comissao_tipo, comissao_valor, descricao, id, nivel_estoque, nome, valor, valor_compra, valor_venda
FILES: foto
3) Entrada de estoque
- Ação “entrada” abre modal e envia para
produtos/entrada.php. - Contrato de retorno (string):
Salvo com Sucesso. - Chaves recebidas por
$_POST:
POST: estoque, id, motivo_entrada, quantidade_entrada
4) Saída de estoque
- Ação “saída” abre modal e envia para
produtos/saida.php. - Contrato de retorno (string):
Salvo com Sucesso. - Chaves recebidas por
$_POST:
POST: estoque, funcionario_saida, id, motivo_saida, quantidade_saida
5) Excluir produto
- Ação “excluir” chama
produtos/excluir.php. - Contrato de retorno esperado pelo front (string):
Excluído com Sucesso. - Chaves recebidas por
$_POST:
POST: id
Upload de foto do produto
O endpoint produtos/salvar.php aceita envio de arquivo via multipart/form-data.
Em manutenção, procure pelo bloco de “upload” e revise:
- Validação de extensão/MIME (não confiar só no nome).
- Normalização do nome do arquivo (evitar espaços/acentos) e evitar sobrescrita.
- Bloqueio de execução dentro da pasta de uploads (via
.htaccessou config do servidor). - Ao excluir um produto, o backend tenta remover a foto do disco (procure por
unlink()emexcluir.php).
Recomendação prática: salve a foto com nome randômico (hash) e guarde apenas o nome no banco.
Isso evita conflito de arquivos e simplifica cache/CDN.
Pontos críticos e recomendações (para o próximo dev)
- Concorrência de estoque: entrada/saída em paralelo pode gerar saldo errado se não travar ou não usar transação. Se o sistema crescer, usar
SELECT ... FOR UPDATEou controle por transação/lock. - Validação obrigatória:
quantidadedeve ser inteiro > 0; na saída, não permitir saldo negativo. - Auditoria: manter
usuariono log (entradas/saídas) para rastreabilidade. - Retornos padronizados: o front compara strings (ex.: “Salvo com Sucesso”). Se mudar a frase, precisa ajustar o JS.
- SQL seguro: manter sempre
prepare()+ bind/params. Evitar concatenar SQL com valores do usuário.