🌱 Sistema de Gestão Agropecuária

HRagro PDV
Ponto de Venda

Sistema completo de ponto de venda desenvolvido especialmente para a HRagro Agropecuária de Piracaia-SP — com gestão de estoque, vendas, caixa, receituários agrônomos e muito mais.

Versão 1.0 · Produção
Data Abril 2026
Plataforma .NET 8 + Angular 20
Banco de Dados PostgreSQL 16
Status 🟡 Em Hardening
📋

Sobre o Projeto

Visão geral e objetivos do sistema

🎯

Objetivo

O HRagro PDV é um sistema de ponto de venda completo desenvolvido sob medida para as necessidades da agropecuária HRagro em Piracaia-SP. O sistema gerencia todo o ciclo de vendas — do atendimento ao cliente até o fechamento do caixa — com suporte a múltiplas formas de pagamento, controle de estoque, receituários agronômicos, importação de notas fiscais e relatórios gerenciais.

O desenvolvimento segue um plano de hardening para produção com 18 tarefas organizadas em 5 fases, das quais 14 já foram concluídas, cobrindo segurança, UX, qualidade de backend e infraestrutura.

🏢

Dados da Loja

Razão SocialHRagro
Nome FantasiaHRagro Agropecuária
CidadePiracaia — SP
Telefone(11) 4036-6393
E-mailhragropiracaia@gmail.com
SegmentoAgropecuária / Veterinária
Foco na realidade do negócio: O sistema foi desenvolvido pensando nos produtos e fluxos específicos de uma agropecuária — ração animal, defensivos agrícolas, medicamentos veterinários, receituários agronômicos e controle de lotes.
📊

Números do Sistema

O que já está construído

🖥️
15
Telas no frontend
55+
Endpoints de API
🗃️
18+
Entidades no banco
14/18
Tarefas concluídas
🔒
9
Endpoints de gerente
📦
10
Categorias de produto
💳
4
Formas de pagamento
👤
4
Perfis de usuário
🏗️

Arquitetura do Sistema

Tecnologias e camadas da aplicação

Frontend — Browser / Tablet
Angular 20 (Standalone) Angular Material M3 TypeScript 5 SCSS + CSS Tokens Axios (HTTP Client) Angular Signals
↕ HTTPS / JWT Bearer
Backend — .NET 8 API
.NET 8 Minimal APIs Entity Framework Core 9 JWT Bearer Auth BCrypt.Net (PIN Hash) FluentValidation Serilog ProblemDetails RFC 7807
↕ EF Core / Npgsql
Dados
PostgreSQL 16 Migrações EF Core Seed automático
↕ Docker Network
Infraestrutura
Docker Compose Nginx (Reverse Proxy) Servidor OVH HTTPS / HTTP
📁

Estrutura de Projetos

📁 Hragro.Pdv/
  📁 Hragro.Pdv.Api/ — Backend
  📁 Hragro.Pdv.Core/ — Entidades
  📁 Hragro.Pdv.Infra/ — EF Core
  📁 hragro-pdv-web/ — Angular
  📁 docker/ — Config Docker
🗃️

Principais Entidades

Produto Cliente Venda
ItemVenda Caixa 
MovimentoCaixa
VendaParcela Devolucao
ReceituarioAgronomico
DocumentoFiscal Loja
📝

Logging (Serilog)

✅ Arquivo diário: logs/app-YYYY-MM-DD.log
✅ Retenção 30 dias
✅ Eventos auditáveis:
  • Login / Logout
  • Abertura / Fechamento de caixa
  • Vendas realizadas (valor, op.)
  • Descontos autorizados
  • Devoluções
  • Ajustes de estoque
🔒

Segurança & Autenticação

JWT + bcrypt + autorização por perfil

🔢
PIN do Operador
4–6 dígitos
🔐
bcrypt verify
custo 12 · hash seguro
🎫
JWT gerado
claims: userId, nome, perfil
🛡️
Middleware valida
Bearer token em todo request
Acesso liberado
conforme perfil do usuário
👤

Perfis de Usuário

PerfilCódigoPermissões
Caixa 1 Registrar vendas, consultar produtos
Vendedor 2 Caixa + cadastros básicos
Gerente 3 Descontos, cancelamentos, fechar caixa, relatórios
Admin 4 Acesso total, configurações, usuários
🛡️

O que foi implementado

PINs com hash bcrypt custo 12 — nunca em texto puro
JWT em memória (protegido contra XSS)
Interceptor Axios injeta Bearer token automaticamente
Guard de rota Angular — redireciona para login se inativo
35 endpoints protegidos com RequireAuthorization
9 endpoints exclusivos para RequireGerente
Validação de PIN de gerente para descontos
Login inválido retorna 401 sem revelar existência do usuário
Endpoint público: Apenas POST /api/auth/login e POST /api/usuarios/validar-pin não requerem JWT. Todos os demais endpoints rejeitam requisições sem token válido com HTTP 401.
🖥️

Telas do Sistema

15 páginas completas com guarda de rota

🔑

Login

Autenticação via PIN numérico. Suporte a teclado numérico em tablet. Erro genérico sem revelar existência do usuário.

PIN + JWT bcrypt
📊

Dashboard

KPIs do dia: faturamento, quantidade de vendas, ticket médio, devoluções, saldo do caixa, alertas de estoque baixo e contas vencidas.

Gerente+ Tempo Real
🛒

PDV — Ponto de Venda

Tela principal de vendas. Busca de produto por código de barras ou nome (autocomplete ≥3 chars). Atalhos F2/F9/Esc. Múltiplas formas de pagamento.

Autocomplete F2/F9/Esc Multi-pgto Recibo
📜

Histórico de Vendas

Lista paginada com filtros por caixa e data. Totalizadores computados. Visualização de itens, pagamentos e parcelas de cada venda.

Paginação Filtros
💰

Caixa

Abertura com saldo inicial, suprimento e sangria durante o turno, fechamento com saldo calculado automaticamente. Histórico de movimentos.

Abertura Sangria Suprimento Fechamento
📦

Estoque

Ajuste manual de estoque, entrada por compra vinculada à nota fiscal, histórico de movimentos por produto com origem rastreada.

Movimentos Ajuste Entrada NF
🏪

Produtos

Cadastro e edição de produtos com validação FluentValidation (NCM 8 dígitos, preço positivo). Filtro por categoria e busca por nome/código.

CRUD Categorias NCM
👥

Clientes

Cadastro com validação de CPF e CNPJ (algoritmo completo). Busca por nome ou documento. Histórico de compras e parcelamentos vinculados.

CPF/CNPJ Busca
↩️

Devoluções

Registro de devoluções e trocas vinculadas a vendas existentes. Estorno automático no caixa e retorno ao estoque. Motivo documentado.

Estorno Estoque
🌿

Receituários Agronômicos

Emissão e consulta de receituários com número, cliente e dados do produto agroquímico. Obrigatório para defensivos agrícolas.

Agroquímico Legislação
📑

Contas a Receber

Controle de parcelas em aberto por cliente. Identificação de vencidas e vencendo hoje. Baixa manual de pagamento. Resumo financeiro.

Parcelas Vencidas Baixa
📈

Relatórios

Relatório de vendas por período, ranking de produtos mais vendidos e análise por forma de pagamento. Exportável para impressão.

Gerente+ Por período Ranking
💳

Formas de Pagamento

Cadastro e ativação de formas de pagamento. Configuração de parcelamento por forma. Suporte nativo a Dinheiro, Débito, Crédito e Pix.

Pix Parcelamento
👤

Usuários

Cadastro de operadores com perfil (Caixa, Vendedor, Gerente, Admin). PIN configurável com hash automático. Inativação sem exclusão.

Perfis PIN Admin+
⚙️

Configurações

Dados cadastrais da loja (nome, CNPJ, telefone, endereço, logo). Aparece no cabeçalho dos recibos e documentos emitidos.

Loja CNPJ Admin+
🛒

Fluxo de Vendas

Do atendimento ao recibo

🛒

Passo a passo da venda

1
Abrir caixa
Operador informa saldo inicial. Sistema registra abertura com timestamp.
2
Adicionar produtos
Busca por código de barras, código interno ou nome (autocomplete). F2 abre busca.
3
Desconto (opcional)
Requer validação de PIN de gerente. Registrado com quem autorizou.
4
Selecionar pagamento
Multi-pagamento (ex: parte em dinheiro + parte no pix). Troco calculado automaticamente.
5
Parcelamento (opcional)
Divide em N parcelas com vencimentos. Vai para Contas a Receber automaticamente.
6
Imprimir recibo
Modal de recibo exibido após confirmação. Imprime via window.print() compatível com impressora térmica 80mm.
🖨️

Modelo de Recibo (80mm)

HRagro Agropecuária
Piracaia-SP | (11) 4036-6393
CUPOM NÃO FISCAL
22/04/2026 14:32 | OP: MARIA
2x Ração Guabi 25kg    R$ 480,00
1x Vacina Aftosa        R$  45,00
SUBTOTAL             R$ 525,00
DESCONTO (-5%)        -R$  26,25
TOTAL                R$ 498,75
DINHEIRO             R$ 500,00
TROCO                 R$   1,25
OBRIGADO PELA PREFERÊNCIA!
💰

Gestão de Caixa

Controle completo de movimentações financeiras

🔓

Abertura de Caixa

Operador informa saldo inicial em dinheiro. Sistema bloqueia abertura de segundo caixa simultâneo. Registrado com data/hora e operador.

💸

Suprimento e Sangria

Adição de troco (suprimento) ou retirada de valores (sangria) durante o turno, com observação opcional e rastreabilidade completa.

🔒

Fechamento

Saldo calculado automaticamente: saldo inicial + vendas + suprimentos − sangrias − estornos. Apenas gerentes podem fechar.

📊

Tipos de Movimentação

TipoSinalOrigemQuem pode
Abertura+Saldo inicial ao abrir o caixaQualquer perfil
Venda+Toda venda realizada no caixaAutomático
Suprimento+Adição de dinheiro ao caixaQualquer perfil
SangriaRetirada de dinheiro do caixaQualquer perfil
DevoluçãoEstorno de venda devolvidaAutomático
FechamentoRegistro de saldo finalGerente+
📦

Estoque & Importação de NF

Controle de estoque com rastreabilidade de movimentos

📦

Controle de Estoque

Baixa automática ao registrar venda
Retorno automático ao registrar devolução
Bloqueio de venda com estoque insuficiente
Ajuste manual com motivo documentado
Entrada por compra com referência à NF
Histórico completo de movimentos por produto
Alerta de estoque baixo (≤5 unidades) no Dashboard
10 categorias padrão do segmento agropecuário
📄

Importação de Nota Fiscal

Upload de XML diretamente do sistema, com criação ou atualização automática de produtos.

TipoFormato
NF-eXML SEFAZ (namespace nfeProc)
NFC-eXML SEFAZ (nota do consumidor)
CF-e SATXML CFe SAT fiscal
NFS-eXML padrão ABRASF
✅ Cria produtos automaticamente com EAN e NCM
aplicarEstoque=true dá entrada no estoque
✅ Log de quantos criados/atualizados
📈

Relatórios Gerenciais

Análises de desempenho para tomada de decisão (acesso exclusivo Gerente+)

📅

Vendas por Período

Total faturado, quantidade de vendas e ticket médio em qualquer intervalo de datas. Agrupamento diário para análise de tendência.

💳

Por Forma de Pagamento

Breakdown de quanto foi recebido em dinheiro, débito, crédito e Pix. Identifica o mix de pagamentos do negócio.

🏆

Produtos Mais Vendidos

Ranking dos N produtos com maior faturamento. Quantidade vendida, total faturado e número de vendas por produto.

🔌

Integrações

Módulos conectados e stubs prontos para ativação futura

Sobre stubs: As integrações de Pix e Nota Fiscal requerem credenciais de produção (contrato com banco/PSP e certificado digital A1/A3) que dependem de habilitação junto à SEFAZ e instituição financeira. Os stubs implementados mantêm a interface definida, permitindo ativação futura sem alterar o restante do sistema.
🔌

Integrações Implementadas

IntegraçãoStatusObservação
Importação NF-e/NFC-e ✓ Ativo Parse de XML SEFAZ real
Importação CF-e SAT ✓ Ativo XML SAT fiscal
Impressão de Recibo ✓ Ativo Impressora 80mm via CSS
PIX (cobrança) Stub Requer contrato PSP
NF-e / NFC-e Emissão Stub Requer certificado A1/A3
Balança Stub Interface pronta
Impressora Fiscal Stub Interface pronta
🌿

Receituário Agronômico

Módulo específico para agropecuárias — obrigatório para venda de defensivos agrícolas pela legislação brasileira (Decreto 4.074/2002).

Cadastro de receituário com número único
Vinculação ao cliente comprador
Consulta por número ou cliente
Rastreabilidade por produto agroquímico

API Endpoints

Referência completa da API REST (.NET 8 Minimal APIs)

Base URL: https://hragro.ajudei.com.br/api/  |  Autenticação: Todos os endpoints (exceto /auth/login) requerem header Authorization: Bearer <jwt>
🔐 Autenticação
MétodoEndpointDescriçãoAuth
POST/api/auth/loginLogin via PIN — retorna JWT + dados do usuárioPúblico
POST/api/usuarios/validar-pinValida PIN com perfil mínimo (ex: desconto)Público
🏪 Produtos
MétodoEndpointDescriçãoAuth
GET/api/produtos?busca=&categoria=&page=&pageSize=Listar produtos com busca e paginaçãoJWT
GET/api/produtos/{id}Buscar produto por IDJWT
GET/api/produtos/barcode/{codigo}Buscar por código de barras ou código internoJWT
POST/api/produtosCadastrar produto (com validação FluentValidation)JWT
PUT/api/produtos/{id}Atualizar produtoJWT
DELETE/api/produtos/{id}Inativar produto (soft delete)Gerente
🛒 Vendas
MétodoEndpointDescriçãoAuth
POST/api/vendasRegistrar venda (multi-pagamento, troco, parcelamento)JWT
GET/api/vendas?caixaId=&data=&page=&pageSize=Listar vendas com filtros e paginaçãoJWT
GET/api/vendas/{id}Detalhar venda com itens, pagamentos e parcelasJWT
💰 Caixa
MétodoEndpointDescriçãoAuth
POST/api/caixa/abrirAbrir caixa com saldo inicialJWT
GET/api/caixa/abertoObter caixa em aberto (se existir)JWT
POST/api/caixa/fechar/{id}Fechar caixa com cálculo de saldoGerente
POST/api/caixa/suprimentoRegistrar suprimentoJWT
POST/api/caixa/sangriaRegistrar sangriaJWT
GET/api/caixaListar últimos 30 caixasJWT
GET/api/caixa/{id}/movimentosMovimentos de um caixaJWT
📊 Dashboard & Relatórios
MétodoEndpointDescriçãoAuth
GET/api/dashboardKPIs do dia (faturamento, estoque, caixa)Gerente
GET/api/relatorios/vendasRelatório por período com agrupamento diárioGerente
GET/api/relatorios/formas-pagamentoBreakdown por forma de pagamentoGerente
GET/api/relatorios/produtosRanking de produtos mais vendidosGerente

Outros Endpoints

GET/POST/PUT/DELETE/api/clientes
GET/POST/PUT/DELETE/api/usuarios
GET/POST/PUT/DELETE/api/formas-pagamento
GET/PUT/api/loja
POST/GET/api/estoque/ajustar, entrada, movimentos
POST/GET/api/devolucoes
POST/GET/api/receituarios
GET/POST/api/contas-receber
POST/api/importacoes/notas, produtos
GET/api/categorias
GET/POST/api/pix/cobrancas (stub)
GET/POST/api/fiscal/emitir, documentos (stub)
📄

Padrão de Resposta

O sistema segue padrões REST e RFC 7807 para erros:

// Sucesso — Paginação
{
  "items": [...],
  "total": 150,
  "page": 1,
  "pageSize": 20,
  "totalPages": 8,
  "hasNext": true
}
// Erro — RFC 7807
{
  "type": "validation-error",
  "title": "Erro de Validação",
  "status": 400,
  "errors": {
    "Nome": ["O nome é obrigatório"]
  }
}

Qualidade de Backend

Robustez, validação e rastreabilidade em produção

🚨

Global Exception Middleware

Todas as exceções não tratadas são capturadas e retornam ProblemDetails RFC 7807 com status HTTP correto. Nenhum stack trace vaza para o cliente em produção.

FluentValidation

Validação de entidades com regras de negócio: CPF e CNPJ por algoritmo, NCM com 8 dígitos, preço positivo, desconto máximo 50%, estoque não-negativo.

📋

Serilog Structured Logging

Logs estruturados com MachineEnricher e contexto de request. Arquivo rotativo diário com 30 dias de retenção. Fácil integração futura com Seq ou Datadog.

📄

Paginação

PagedResult<T> genérico em todos os endpoints de lista. Parâmetros ?page=1&pageSize=20. Metadados: total, totalPages, hasNext, hasPrev.

🔍

Swagger UI

Documentação automática de todos os endpoints em desenvolvimento (/swagger). Todos os endpoints têm summary e description configurados.

🗄️

EF Core + Migrations

Banco de dados versionado com migrations automáticas. Seed automático de formas de pagamento, produtos demo e usuários iniciais na primeira execução.

🐳

Infraestrutura

Docker Compose + Nginx + PostgreSQL no servidor OVH

🐳

Docker Compose (Produção)

🐘 Banco de Dados
  PostgreSQL 16 Alpine
  volume persistente
  healthcheck automático
⚙️ API (.NET 8)
  Build via Dockerfile
  Aguarda banco estar saudável
  Ambiente: Production
🌐 Frontend (Nginx + Angular)
  Build via Dockerfile
  Serve a aplicação web
  depends_on: api
🌐

Roteamento Nginx

RotaDestinoDescrição
/api/*API interna.NET 8 API
/*Frontend internoAngular SPA
✅ Containers em rede interna isolada
✅ Acesso externo somente via HTTPS
✅ Banco de dados não exposto na rede pública
✅ Restart automático em caso de falha
CI/CD (em progresso): GitHub Actions configurados para rodar testes automaticamente em pull requests e fazer deploy ao merge na branch principal. Health check endpoint GET /health em desenvolvimento.
🗺️

Plano de Entrega — Production Hardening

18 tarefas organizadas em 5 fases — 14 concluídas

Fase 1 — Segurança & Autenticação ✓ Completa

Tornar o sistema seguro para produção — nenhum endpoint acessível sem autenticação válida.

Task 1: Pacotes JWT + bcrypt + migração de PinHash
Task 2: JwtService (geração e validação de tokens)
Task 3: JWT middleware, bcrypt no login, PINs com hash no seed
Task 4: Frontend — auth service, JWT interceptor, guard de rota
Task 5: Proteção de todos os endpoints (35 RequireAuthorization + 9 RequireGerente)

Fase 2 — UX/UI Design System ✓ Completa

Experiência consistente com Angular Material M3 e funcionalidades de UX faltantes implementadas.

Task 6: Angular Material M3 com tema HRagro (verde/laranja) + ToastService
Task 7: Substituição de todos os confirm() por double-click pattern com Toast
Task 8: Autocomplete de produtos no PDV + atalhos F2/F9/Esc
Task 9: Modal de recibo após venda com impressão para 80mm
Task 10: Histórico de vendas com filtro de caixa, totais e tratamento de erros

Fase 3 — Qualidade de Backend ✓ Completa

Robustez, manutenibilidade e rastreabilidade em produção.

Task 11: GlobalExceptionMiddleware + ProblemDetails RFC 7807
Task 12: Serilog structured logging com arquivo rotativo e eventos de negócio
Task 13: FluentValidation (ProdutoValidator + ClienteValidator com CPF/CNPJ)
Task 14: Paginação PagedResult<T> em produtos e vendas

Fase 4 — Testes Automatizados Em progresso

Cobertura mínima de 70% em código crítico — backend e frontend.

Task 15: xUnit — JwtServiceTests + ProdutoValidatorTests + ClienteValidatorTests
Task 16: Angular unit tests — HomeComponent (totalItens, totalFinal, removerItem)

Fase 5 — Infraestrutura & CI/CD Pendente

Pipeline automatizado e deploy confiável.

Task 17: Frontend containerizado com Nginx
Task 18: Health check endpoint (GET /health) + GitHub Actions CI
📊

Progresso Geral

14 / 18 tarefas
5/5
Segurança ✅
5/5
UX/UI ✅
4/4
Qualidade ✅
0/2
Testes ⏳
HRagro PDV — Sistema de Ponto de Venda
HRagro Agropecuária · Piracaia-SP · (11) 4036-6393 · hragropiracaia@gmail.com
Documentação gerada em
Abril 2026
Versão 1.0-hardening