SDK oficial para integrar com a API do Logigate ERP da plataforma Honga Yetu.
Funciona em qualquer projecto PHP 8.1+ e tem integração nativa com Laravel.
Consulte a documentação completa da API em: https://logigate.hongayetu.com/desenvolvedores/docs
composer require hongayetu/logigate-sdkuse HongaYetu\LogigateSDK\LogigateClient;
$logigate = new LogigateClient(
token: 'seu_token_api',
baseUrl: 'https://api.honga.com/logigate/v1'
);Publique o ficheiro de configuração:
php artisan vendor:publish --tag=logigate-sdk-configAdicione ao .env:
LOGIGATE_API_TOKEN=seu_token_api
LOGIGATE_API_URL=https://api.honga.com/logigate/v1Use via Facade ou helper:
use HongaYetu\LogigateSDK\Facades\Logigate;
// Facade
$clientes = Logigate::clientes()->listar();
// Helper
$clientes = logigate()->clientes()->listar();// Verificar se o token é válido
$auth = $logigate->auth()->verificar();
echo $auth['data']['empresa']['nome']; // Nome da empresa// Listar clientes (paginado)
$clientes = $logigate->clientes()->listar(['por_pagina' => 20]);
// Ver cliente
$cliente = $logigate->clientes()->ver(1);
// Criar cliente
$novo = $logigate->clientes()->criar([
'nome' => 'João Silva',
'tipo' => 0, // 0 = Pessoa Singular, 1 = Empresa
'nif' => '001234567LA041',
'telefone' => 923456789,
'email' => 'joao@email.com',
]);
// Actualizar cliente
$logigate->clientes()->actualizar(1, ['nome' => 'João Silva Actualizado']);
// Eliminar cliente
$logigate->clientes()->eliminar(1);$produtos = $logigate->produtos()->listar();
$produto = $logigate->produtos()->ver(1);
$novo = $logigate->produtos()->criar([
'nome' => 'Produto Novo',
'preco' => 5000.00,
'taxa' => 14,
]);$servicos = $logigate->servicos()->listar();
$servico = $logigate->servicos()->criar([
'nome' => 'Consultoria',
'preco' => 25000.00,
]);// Listar facturas
$facturas = $logigate->facturas()->listar([
'start' => '2026-01-01',
'end' => '2026-12-31',
'por_pagina' => 20,
]);
// Ver factura
$factura = $logigate->facturas()->ver(50);
// Emitir factura
$resultado = $logigate->facturas()->emitir([
'tipo' => 0, // 0=FR, 1=FT, 3=FP
'tipo_pagamento' => 0, // 0=Dinheiro, 1=TPA, 2=Transf. Bancária
'cliente_id' => 535,
'estabelecimento_id' => 21,
'artigos' => [
['artigo_id' => 1, 'quantidade' => 2, 'preco' => 5000],
['artigo_id' => 3, 'quantidade' => 1],
],
]);
echo $resultado['data']['texto']; // "Factura FR EMP012026/01 emitida com sucesso"
// Obter PDF (base64)
$pdf = $logigate->facturas()->pdf(50);
file_put_contents('factura.pdf', base64_decode($pdf['data']['pdf_base64']));
// URL directa do PDF (para abrir no browser)
$url = $logigate->facturas()->pdfUrl(50);$estabelecimentos = $logigate->estabelecimentos()->listar();// Fornecedores
$fornecedores = $logigate->fornecedores()->listar();
$logigate->fornecedores()->criar([
'nome' => 'Fornecedor ABC',
'tipo' => 1,
'endereco' => 'Rua Principal, 100',
'is_estrangeiro' => false,
]);
// Estoques
$estoques = $logigate->estoques()->listar(['estabelecimento_id' => 1]);
$logigate->estoques()->criar([
'tipo_estoque' => 0, // 0=Produto, 1=Matéria-Prima
'produto_id' => 1,
'quantidade' => 100,
'preco_compra' => 5000.00,
'data_entrada' => '2026-03-01',
'estabelecimento_id' => 1,
]);
// Matérias-Primas
$materias = $logigate->materiasPrimas()->listar();
// Movimentações (apenas leitura)
$movimentacoes = $logigate->movimentacoes()->listar([
'data_inicio' => '2026-01-01',
'data_fim' => '2026-03-31',
]);Os relatórios podem ser gerados imediatamente ou em segundo plano (quando o volume excede o threshold).
// Gerar relatório de facturas em PDF
$relatorio = $logigate->relatorios()->facturas([
'tipo' => 'pdf',
'formato' => 'base64', // ou 'link'
'start' => '2026-01-01',
'end' => '2026-03-31',
]);
if ($relatorio['tipo_resposta'] === 'imediato') {
// Relatório gerado imediatamente
file_put_contents('relatorio.pdf', base64_decode($relatorio['data']['ficheiro_base64']));
} else {
// Relatório em background — monitorar via processos
$processoId = $relatorio['data']['processo_id'];
echo "A gerar em background. Processo: {$processoId}";
}
// Outros relatórios disponíveis:
$logigate->relatorios()->clientes(['tipo' => 'excel']);
$logigate->relatorios()->produtos(['tipo' => 'pdf']);
$logigate->relatorios()->servicos(['tipo' => 'excel']);
$logigate->relatorios()->documentosEmitidos(['tipo' => 'pdf']);
$logigate->relatorios()->detalhado(['tipo' => 'pdf']);
$logigate->relatorios()->produtosMovimentos(['tipo' => 'pdf']);Monitorizar tarefas em segundo plano (relatórios, exportações).
// Listar processos
$processos = $logigate->processos()->listar();
// Ver estado de um processo
$processo = $logigate->processos()->ver(123);
echo $processo['data']['status_texto']; // "Concluído"
// Download do ficheiro
$ficheiro = $logigate->processos()->download(123, 'base64');
file_put_contents('export.pdf', base64_decode($ficheiro['data']['ficheiro_base64']));
// Ou obter link temporário (válido 30 min)
$link = $logigate->processos()->download(123, 'link');
echo $link['data']['download_url'];Receba notificações em tempo real quando ocorrem eventos.
// Criar webhook
$webhook = $logigate->webhooks()->criar([
'url' => 'https://meusite.com/webhook',
'eventos' => ['factura.emitida', 'cliente.criado'],
'descricao' => 'Webhook principal',
]);
// Guardar o secret (retornado apenas na criação)
$secret = $webhook['data']['secret']; // whsec_...
// Listar webhooks
$webhooks = $logigate->webhooks()->listar();
// Testar webhook
$logigate->webhooks()->testar(1);
// Ver entregas
$entregas = $logigate->webhooks()->entregas(1);
// Actualizar
$logigate->webhooks()->actualizar(1, ['eventos' => ['*']]);
// Eliminar
$logigate->webhooks()->eliminar(1);Quando receber um webhook, valide a assinatura HMAC-SHA256:
use HongaYetu\LogigateSDK\Support\WebhookValidator;
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_LOGIGATE_SIGNATURE'] ?? '';
$secret = 'whsec_seu_secret_aqui';
if (WebhookValidator::validar($payload, $signature, $secret)) {
$evento = json_decode($payload, true);
// Processar evento...
} else {
http_response_code(401);
echo 'Assinatura inválida';
}| Evento | Descrição |
|---|---|
processo.iniciado |
Processo de exportação iniciado |
processo.concluido |
Processo concluído com sucesso |
processo.erro |
Processo falhou |
factura.emitida |
Nova factura emitida |
factura.anulada |
Factura anulada |
cliente.criado |
Novo cliente criado |
cliente.actualizado |
Cliente actualizado |
cliente.eliminado |
Cliente eliminado |
* |
Todos os eventos |
O SDK converte erros HTTP em excepções específicas:
use HongaYetu\LogigateSDK\Exceptions\AuthenticationException;
use HongaYetu\LogigateSDK\Exceptions\ValidationException;
use HongaYetu\LogigateSDK\Exceptions\RateLimitException;
use HongaYetu\LogigateSDK\Exceptions\LogigateException;
try {
$logigate->clientes()->criar(['nome' => '']);
} catch (AuthenticationException $e) {
// 401 — Token inválido ou expirado
echo $e->getCodigoErro(); // TOKEN_INVALIDO, TOKEN_EXPIRADO, TOKEN_AUSENTE
} catch (ValidationException $e) {
// 422 — Dados inválidos
echo $e->getMessage();
print_r($e->errors()); // ['nome' => ['O nome é obrigatório']]
} catch (RateLimitException $e) {
// 429 — Limite de requisições excedido
echo "Tentar novamente em {$e->retryAfter()} segundos";
} catch (LogigateException $e) {
// Outros erros
echo $e->getMessage();
echo $e->getCodigoErro();
}use HongaYetu\LogigateSDK\Support\PaginatedResponse;
$resposta = $logigate->clientes()->listar(['por_pagina' => 10]);
$paginacao = new PaginatedResponse($resposta);
echo "Página {$paginacao->paginaActual} de {$paginacao->ultimaPagina}";
echo "Total: {$paginacao->total}";
foreach ($paginacao as $cliente) {
echo $cliente['nome'];
}
if ($paginacao->temProximaPagina()) {
// Carregar próxima página
$proxima = $logigate->clientes()->listar(['por_pagina' => 10, 'p' => $paginacao->paginaActual + 1]);
}- PHP 8.1+
- Guzzle 7.0+
- Laravel 10/11/12 (opcional, para integração Laravel)
MIT