PHPackages                             bahiash/omie-sdk - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. bahiash/omie-sdk

ActiveLibrary[API Development](/categories/api)

bahiash/omie-sdk
================

Laravel package for interaction with Omie ERP

1.0.5(1mo ago)06proprietaryPHPPHP ^8.1

Since Jan 19Pushed 1mo agoCompare

[ Source](https://github.com/Bahia-SH/omie-sdk)[ Packagist](https://packagist.org/packages/bahiash/omie-sdk)[ RSS](/packages/bahiash-omie-sdk/feed)WikiDiscussions master Synced today

READMEChangelogDependencies (8)Versions (7)Used By (0)

Omie SDK
========

[](#omie-sdk)

Pacote Laravel pra integrar com API Omie. Multi-tenant, com fila, rate-limit, log estruturado e feedback claro pro programador.

Instalação
----------

[](#instalação)

```
composer require bahiash/omie-sdk
php artisan vendor:publish --tag=omie-config
php artisan migrate
```

Auto-discovery: `OmieServiceProvider` + facade `Omie`.

Configuração mínima
-------------------

[](#configuração-mínima)

`.env`:

```
OMIE_QUEUE_CONNECTION=redis
OMIE_QUEUE=omie
OMIE_HTTP_TIMEOUT=30
OMIE_HTTP_RETRY_ENABLED=true

```

Cache **deve** suportar locks (`redis` ou `database`).

Uso
---

[](#uso)

### Async (fila) — padrão

[](#async-fila--padrão)

```
use Bahiash\Omie\Facades\Omie;

$correlationId = Omie::for($appKey, $appSecret, tenantId: $tenant->id)
    ->produtos()
    ->dispatch('ListarProdutos', [
        ['pagina' => 1, 'registros_por_pagina' => 50],
    ]);

// $correlationId = uuid → use pra rastrear o log
```

### Síncrono — quando precisar resposta imediata

[](#síncrono--quando-precisar-resposta-imediata)

```
$log = Omie::for($appKey, $appSecret)
    ->produtos()
    ->call('ConsultarProduto', [['codigo_produto_integracao' => 'ABC']]);

if ($log->wasSuccessful()) {
    $produto = $log->response_body;
} else {
    // $log->omie_fault_code, $log->omie_fault_string, $log->retryable
}
```

### Generic — qualquer endpoint Omie

[](#generic--qualquer-endpoint-omie)

```
Omie::for($appKey, $appSecret)
    ->dispatch('produtos/familias', 'ListarFamilias', [['pagina' => 1]]);
```

### Aguardar resultado de chamada async

[](#aguardar-resultado-de-chamada-async)

```
$id = Omie::for($k, $s)->produtos()->dispatch('ListarProdutos', [...]);

$log = Omie::waitFor($id, timeoutSeconds: 30);

$log->wasSuccessful();   // bool
$log->response_body;     // array
$log->omie_fault_code;   // ex: "SOAP-ENV:Client-101"
$log->retryable;         // bool
```

### Eventos

[](#eventos)

Dois eventos disparados automaticamente:

- `Bahiash\Omie\Events\OmieCallSucceeded`
- `Bahiash\Omie\Events\OmieCallFailed`

Listener:

```
use Bahiash\Omie\Events\OmieCallSucceeded;

class ProcessarProdutoOmie
{
    public function handle(OmieCallSucceeded $event): void
    {
        $log = $event->getLog();
        $params = $event->getEventParams();   // ex: ['pedido_id' => 42]

        // log->response_body já decodificado
    }
}
```

`EventServiceProvider`:

```
protected $listen = [
    OmieCallSucceeded::class => [ProcessarProdutoOmie::class],
    OmieCallFailed::class    => [NotificarFalhaOmie::class],
];
```

Passar `eventParams` na chamada:

```
Omie::for($k, $s)->produtos()->dispatch(
    'IncluirProduto',
    [$produto],
    eventClass: null,
    eventParams: ['origem_id' => 99]
);
```

### Tratamento de erro

[](#tratamento-de-erro)

```
use Bahiash\Omie\Exceptions\OmieApiException;

try {
    $log = Omie::for($k, $s)->produtos()->call('IncluirProduto', [$dados]);
} catch (OmieApiException $e) {
    $e->getOmieFaultCode();    // SOAP-ENV:Client-101
    $e->getOmieFaultString();  // mensagem original Omie
    $e->getHttpStatus();       // 400/500/etc
    $e->isRateLimited();       // bool
    $e->isRetryable();         // bool
}
```

Tabela de log (`omie_api_logs`)
-------------------------------

[](#tabela-de-log-omie_api_logs)

Colunas chave:

ColunaUso`correlation_id`uuid retornado pelo `dispatch()`/`call()``tenant_id`identificador opcional do tenant`status``pending` / `running` / `success` / `failed``attempt`tentativa do job`omie_fault_code` / `omie_fault_string`erro estruturado Omie`retryable`indica se erro pode ser re-tentado`duration_ms`, `finished_at`métricas`request_body`, `response_body`payload mascaradoRecuperar log direto:

```
use Bahiash\Omie\Models\OmieApiLog;

$log = OmieApiLog::findByCorrelationId($id);
```

Rate Limiting
-------------

[](#rate-limiting)

Limites Omie aplicados automaticamente no worker:

- 960/min por IP
- 240/min por app+method
- 4 simultâneas por app+method (com `acquire`/`release` em `finally`)

Configuração em `config/omie.php` → `rate_limit`. Estratégia `fixed` (default) ou `sliding` (Redis sorted set).

Mascaramento de dados sensíveis
-------------------------------

[](#mascaramento-de-dados-sensíveis)

Recursivo. Configure em `config/omie.php` → `logging.masked_fields`:

```
'masked_fields' => ['app_secret','password','cnpj_cpf','cpf','token'],
```

Aplica em `request_body`, `response_body` e `event_params` (request body — request `app_secret` nunca chega ao log porque o job só persiste `params`, não as credenciais).

Retry
-----

[](#retry)

Job tem `tries` e `backoff` configuráveis em `config('omie.queue')`. Erros marcados `retryable=false` (ex: validação Omie 4xx) chamam `fail()` direto, sem retentar.

Modelo de extensão
------------------

[](#modelo-de-extensão)

Adicionar novo recurso = uma classe vazia:

```
namespace App\Omie;

use Bahiash\Omie\Services\AbstractOmieService;

class FamiliasService extends AbstractOmieService
{
    public const SERVICE_PATH = 'produtos/familias';
}
```

Ou usar `Omie::for(...)->dispatch($servicePath, $method, $params)` direto (generic), sem criar classe.

Arquitetura (resumo)
--------------------

[](#arquitetura-resumo)

```
Service (Produtos|Clientes|...|Generic)
  └─ DispatchOmieCallJob (gera correlation_id, captura IP)
       └─ worker → handle()
            ├─ logger->startLog (status=running, mascara recursivo)
            ├─ rateLimiter->acquire (IP + app+method + concurrent)
            ├─ try
            │    ├─ new OmieClient(...)->call()  (timeout/retry/parse fault)
            │    ├─ logger->finishLogSuccess
            │    └─ Event::dispatch(OmieCallSucceeded)
            ├─ catch
            │    ├─ logger->finishLogError (com omie_fault_code, retryable)
            │    ├─ Event::dispatch(OmieCallFailed)
            │    └─ if !retryable → $this->fail(); senão rethrow (retry)
            └─ finally
                 └─ rateLimiter->releaseConcurrent

```

Comandos úteis
--------------

[](#comandos-úteis)

```
composer install
vendor/bin/phpunit
vendor/bin/phpunit --filter testMethodName
```

###  Health Score

39

—

LowBetter than 84% of packages

Maintenance88

Actively maintained with recent releases

Popularity4

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity48

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~21 days

Total

6

Last Release

58d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/d52693f3ad1702bb60e9188e1074ce7dd56226786e9a7652992be177d307eb75?d=identicon)[RodolfoMelo](/maintainers/RodolfoMelo)

---

Top Contributors

[![RodolfoMelo](https://avatars.githubusercontent.com/u/3863237?v=4)](https://github.com/RodolfoMelo "RodolfoMelo (16 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/bahiash-omie-sdk/health.svg)

```
[![Health](https://phpackages.com/badges/bahiash-omie-sdk/health.svg)](https://phpackages.com/packages/bahiash-omie-sdk)
```

###  Alternatives

[craftcms/cms

Craft CMS

3.6k3.6M3.1k](/packages/craftcms-cms)[tencentcloud/tencentcloud-sdk-php

TencentCloudApi php sdk

3741.3M46](/packages/tencentcloud-tencentcloud-sdk-php)[spatie/laravel-export

Create a static site bundle from a Laravel app

674146.0k6](/packages/spatie-laravel-export)[simplestats-io/laravel-client

Server-side analytics for Laravel that follows the full funnel from visit to registration to payment, attributed to the channel that drove it. Revenue, MRR, churn and ad-spend profit (ROAS/CAC) per channel. GDPR compliant, ad-blocker proof.

5022.0k](/packages/simplestats-io-laravel-client)[eslazarev/wildberries-sdk

Wildberries OpenAPI clients (generated).

273.0k](/packages/eslazarev-wildberries-sdk)[jasara/php-amzn-selling-partner-api

A fluent interface for Amazon's Selling Partner API in PHP

1348.7k1](/packages/jasara-php-amzn-selling-partner-api)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
