52 lines
6.7 KiB
Markdown
52 lines
6.7 KiB
Markdown
# Núcleos de execução distribuídos com Compras
|
|
|
|
Estes ficheiros são artefactos fixados dos núcleos comuns de orçamento e obrigações, cuja origem é `sgf-tempo/packages`. Não são outra implementação financeira mantida independentemente.
|
|
|
|
O Compras carrega estes artefactos em todos os ambientes, incluindo produção, sem precisar da pasta vizinha do SGF. As configurações `COMMON_BUDGET_PATH` e `COMMON_PAYABLES_PATH` continuam disponíveis para instalações que forneçam os mesmos pacotes por outro mecanismo.
|
|
|
|
`runtime-manifest.json` identifica cada ficheiro distribuído por SHA-256. Conferir com `composer run runtime:check`. Actualizações devem vir da origem comum, passar os testes dos adaptadores e renovar o manifesto; não editar os artefactos directamente nem aplicar formatação que altere os bytes aceites.
|
|
|
|
O empacotamento não executa migrações, activa pagamentos, cria direitos ou transporta dados. As funcionalidades sintéticas ainda presentes nos núcleos conservam o seu âmbito até à implementação da respectiva operação comercial. Não distribuir configurações privadas ou bases de avaliação com o produto.
|
|
|
|
## Recepção de eventos para integração
|
|
|
|
`integration/bootstrap.php` carrega um módulo independente de Laravel, com PHP/PDO, para consumir `sgc.warehouse.fulfilment-feed.v1`. Não integra os18artefactos financeiros fixados nem altera a instalação do SGF. `WarehouseFeed` valida o contrato; `WarehouseInbox` guarda os factos e o cursor atomicamente; `WarehousePull` percorre páginas com limites e retoma pelo ponto persistido.
|
|
|
|
O host fornece uma ligação PDO SQLite/PostgreSQL em modo de excepções, a identificação estável da instalação de origem, empresa de origem, empresa local e geração do leitor. Estes vínculos devem vir da configuração autorizada do host, nunca de parâmetros livres recebidos do exterior. Os identificadores de empresa da origem e do destino são independentes. Diferentes leitores da mesma origem/empresa local partilham a deduplicação dos factos e conservam checkpoints separados. Uma geração nova de leitor permite reler uma origem após mudança de âmbito, preservando o checkpoint anterior; não representa outra conta de utilizador.
|
|
|
|
A instalação usa `WarehouseInbox::schema()` como entrada explícita para a migração do host. O construtor e o processamento não criam tabelas. Instalação, privilégios mínimos, backup, configuração de acesso e transporte autenticado pertencem ao procedimento do host; nenhum destes passos foi executado em instalações persistentes por este incremento.
|
|
|
|
Depois da preparação autorizada do destino, a ligação no host usa:
|
|
|
|
```php
|
|
require $packageDirectory.'/integration/bootstrap.php';
|
|
|
|
$inbox = new Tempo\Integration\WarehouseInbox(
|
|
$dedicatedPdo, $configuredSourceId, $sourceTenantId,
|
|
$destinationTenantId, $configuredReaderGeneration,
|
|
);
|
|
$pull = new Tempo\Integration\WarehousePull($inbox);
|
|
$result = $pull->run($fetchAuthenticatedPage, maxPages: 10, pageSize: 50);
|
|
```
|
|
|
|
`$fetchAuthenticatedPage` é uma função do host que recebe `(?string $cursor, int $limit)` e devolve a página JSON descodificada do endpoint configurado `/stock/integracao/entregas`, com a conta e contexto autorizados. Deve verificar origem, autenticação e resposta HTTP antes de devolver dados; o módulo não escolhe URLs, credenciais ou destinatários. Excepções interrompem a leitura e preservam as páginas já aceites. `has_more=true` no resultado indica continuação pendente pelo limite do lote, não conclusão do processamento.
|
|
|
|
Os eventos guardados são documentos históricos reutilizáveis e consultáveis por `fact($idempotencyKey)`. Não são comandos para lançar stock, aprovar compras ou facturar. Confirmações exigem a entrega original reconciliada e não criam outra saída. O SHA-256 confere o conteúdo emitido pelo produtor, sem substituir a autenticação do canal. O adaptador não cria projecções de negócio nem confirmações funcionais no sistema de origem. Testes e provas em `tests/Unit/WarehouseInboxTest.php`, `tests/Feature/WarehouseExchangeTest.php` e `scripts/work-context-pg-check.php --inbox`, só com dados sintéticos/base descartável.
|
|
|
|
### Consulta HTTP autenticada
|
|
|
|
`WarehouseHttpSource` implementa a função de consulta para `WarehousePull`, usando PHP cURL e a sessão já autorizada na origem. O host fornece a origem HTTPS, a empresa e uma função que obtém o cabeçalho Cookie da sessão por canal protegido. A sessão deve ter o contexto Compras internas seleccionado quando aplicável; as mesmas verificações de conta, perfis, empresa e contexto da rota continuam activas. O cliente não faz login, selecciona contexto, cria contas, outorga permissões ou armazena credenciais.
|
|
|
|
```php
|
|
$source = new Tempo\Integration\WarehouseHttpSource(
|
|
$configuredHttpsOrigin, $sourceTenantId, $sessionCookieProvider,
|
|
);
|
|
$result = $pull->run($source, maxPages: 10, pageSize: 50);
|
|
```
|
|
|
|
O cliente consulta apenas GET /stock/integracao/entregas dentro da origem configurada. Cursor/limite são codificados como parâmetros, e as credenciais seguem apenas no cabeçalho, nunca na URL. A origem não admite userinfo, query, fragmento, escapes de caminho ou travessia. Não segue redireccionamentos. HTTPS confere certificado/hostname; a opção allowLoopbackHttp=true só permite HTTP em127.0.0.1 ou[::1] para desenvolvimento explícito, sem proxy nesse percurso local. O ensaio8005 usa esta excepção; não representa prova de certificados TLS de um destino comercial.
|
|
|
|
Há limites técnicos configuráveis no construtor:15segundos totais,5de ligação e8MiB de resposta por defeito; tamanho é limitado também após descompressão. A resposta exige HTTP200, JSON e contrato/empresa/hash válidos. A função de credenciais é consultada novamente em cada pedido e a informação de depuração oculta-a. WarehouseTransportFailure oferece category/httpStatus/retryable(), sem corpo remoto, cookies ou erro original do fornecedor; falhas de acesso/cursor não desencadeiam reset, nova conta ou recuperação automática de autoridade. retryable é um diagnóstico técnico, não uma tentativa automática.
|
|
|
|
A instalação permanente, configuração pela administração do host, armazenamento protegido da sessão, renovação após expiração e uma eventual autenticação técnica restrita ainda dependem dos seus percursos próprios. Esta implementação não oferece tokens permanentes, login automático, serviço agendado ou projecção de stock/contabilidade no destinatário. Registar essas lacunas ao entregar; preservar os perfis/aprovações e a instalação real do SGF. Prova local: scripts/warehouse-http-source-http.mjs obtém a sessão sintética existente e passa-a por stdin privado ao processo PHP; o receptor usa só SQLite em memória e a prova não grava a credencial.
|