Sistema de Sincronização
📡 Documentação da API - Mais PDV
🔐 Autenticação
POST /api/auth/login
Obtém token de acesso para as APIs
Headers:
Content-Type: application/json
Accept: application/json
Body:
{
"email": "usuario@exemplo.com",
"password": "sua_senha"
}
Resposta de Sucesso:
{
"success": true,
"message": "Login realizado com sucesso",
"data": {
"token": "1|abc123xyz789...",
"user": {
"id": 123,
"name": "João Silva",
"email": "joao@exemplo.com",
"company_id": 456
},
"expires_at": null
}
}
💡 Dica: Salve o token retornado para usar nas próximas chamadas!
POST /api/auth/refresh
Renova o token atual
Authorization: Bearer {token}
POST /api/auth/logout
Revoga o token atual
Authorization: Bearer {token}
GET /api/auth/user
Dados do usuário logado
Authorization: Bearer {token}
🔄 Endpoints de Sincronização
🔍 GET /api/sync/status
Verifica conectividade e informações do servidor
Headers:
Authorization: Bearer {token}
Resposta:
{
"success": true,
"server_time": "2025-09-04T15:30:00.000Z",
"company_id": 456,
"user_id": 123,
"user_name": "João Silva",
"version": "1.0.0"
}
📦 GET /api/sync/products
Baixa produtos para sincronização offline
Query Parameters (opcionais):
last_sync=2025-09-04T14:00:00.000Z
Para sincronização incremental
Resposta:
{
"success": true,
"data": [
{
"id": 1,
"name": "Produto Teste",
"barcode": "7894900010015",
"price": 20.0,
"stock": 10.0,
"category_name": "Geral"
}
],
"sync_timestamp": "2025-09-04T15:30:00.000Z",
"total": 150
}
⚙️ GET /api/sync/config
Baixa configurações da empresa e formas de pagamento
Resposta:
{
"success": true,
"data": {
"company": {
"id": 456,
"name": "Minha Empresa",
"cnpj": "12.345.678/0001-90",
"logo_url": "https://..."
},
"payment_types": [
{"id": 1, "name": "Dinheiro"},
{"id": 2, "name": "PIX"}
],
"user": {
"id": 123,
"name": "João Silva",
"role": "admin"
}
}
}
📤 POST /api/sync/sales
Envia vendas offline para o servidor
Body (exemplo):
{
"sales": [
{
"offline_id": "offline_1725462600123",
"total": 20.00,
"amount_received": 25.00,
"change": 5.00,
"status": "completed",
"created_at": "2025-09-04T14:30:00.000Z",
"items": [
{
"product_id": 1,
"quantity": 1,
"price": 20.00,
"total": 20.00
}
],
"payments": [
{
"payment_type_id": 1,
"amount": 20.00,
"status": "completed"
}
]
}
]
}
Resposta:
{
"success": true,
"message": "Sincronização concluída: 1 sucessos, 0 erros",
"summary": {
"total_processed": 1,
"success_count": 1,
"error_count": 0
},
"results": [
{
"offline_id": "offline_1725462600123",
"status": "success",
"sale_id": 789
}
]
}
🔍 POST /api/sync/check-conflicts
Verifica conflitos antes da sincronização
Body:
{
"products": [
{
"id": 1,
"updated_at": "2025-09-04T14:00:00.000Z"
}
]
}
Resposta (sem conflitos):
{
"success": true,
"has_conflicts": false,
"conflicts": [],
"checked_at": "2025-09-04T15:30:00.000Z"
}
📋 Exemplos de Uso
JavaScript (Fetch)
// Login
const loginResponse = await fetch('/api/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
email: 'usuario@exemplo.com',
password: 'senha123'
})
});
const { data } = await loginResponse.json();
const token = data.token;
// Usar o token nas próximas chamadas
const productsResponse = await fetch('/api/sync/products', {
headers: {
'Authorization': `Bearer ${token}`
}
});
const products = await productsResponse.json();
cURL
# Login
curl -X POST https://maispdv.com/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"usuario@exemplo.com","password":"senha123"}'
# Produtos (usando token)
curl -X GET https://maispdv.com/api/sync/products \
-H "Authorization: Bearer SEU_TOKEN_AQUI"
# Enviar vendas
curl -X POST https://maispdv.com/api/sync/sales \
-H "Authorization: Bearer SEU_TOKEN_AQUI" \
-H "Content-Type: application/json" \
-d '{"sales":[...]}'
⚠️ Importante
- Token obrigatório: Todas as rotas de sincronização precisam do token de autenticação
- Headers corretos: Sempre usar
Content-Type: application/json
para POST - Timeout: Configure timeouts adequados (30s recomendado)
- Retry: Implemente retry com backoff exponencial
🚨 Códigos de Erro
Código | Descrição | Possível Causa | Solução |
---|---|---|---|
200 | Sucesso | Requisição processada corretamente | ✅ Tudo funcionando |
401 | Unauthorized | Token inválido ou expirado | Refazer login para obter novo token |
404 | Not Found | Rota não existe ou não foi registrada | Verificar URLs e limpar cache de rotas |
422 | Unprocessable Entity | Dados inválidos no JSON | Verificar estrutura do JSON e campos obrigatórios |
500 | Internal Server Error | Erro no código do servidor | Verificar logs do Laravel |