🔐 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