@baruk/core 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.baruk-provenance.json +4 -4
- package/dist/cjs/clients/ibge.js +14 -0
- package/dist/cjs/clients/ibge.js.map +1 -1
- package/dist/cjs/clients/registry/http.js +157 -0
- package/dist/cjs/clients/registry/http.js.map +1 -0
- package/dist/cjs/clients/registry/ibge-municipios.js +28 -0
- package/dist/cjs/clients/registry/ibge-municipios.js.map +1 -0
- package/dist/cjs/clients/registry/ibge.js +63 -0
- package/dist/cjs/clients/registry/ibge.js.map +1 -0
- package/dist/cjs/clients/registry/lookup.js +191 -0
- package/dist/cjs/clients/registry/lookup.js.map +1 -0
- package/dist/cjs/clients/registry/provider.js +34 -0
- package/dist/cjs/clients/registry/provider.js.map +1 -0
- package/dist/cjs/clients/registry/resolve.js +47 -0
- package/dist/cjs/clients/registry/resolve.js.map +1 -0
- package/dist/cjs/clients/registry/serpro.js +149 -0
- package/dist/cjs/clients/registry/serpro.js.map +1 -0
- package/dist/cjs/clients/registry/service.js +230 -0
- package/dist/cjs/clients/registry/service.js.map +1 -0
- package/dist/cjs/clients/registry/synthetic.js +165 -0
- package/dist/cjs/clients/registry/synthetic.js.map +1 -0
- package/dist/cjs/clients/repository.js +6 -2
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/db/provision-e2e-identity.js +8 -3
- package/dist/cjs/db/provision-e2e-identity.js.map +1 -1
- package/dist/cjs/fiscal/collection/authorization.js +186 -0
- package/dist/cjs/fiscal/collection/authorization.js.map +1 -0
- package/dist/cjs/fiscal/collection/competence.js +97 -0
- package/dist/cjs/fiscal/collection/competence.js.map +1 -0
- package/dist/cjs/fiscal/collection/first-contact.js +204 -0
- package/dist/cjs/fiscal/collection/first-contact.js.map +1 -0
- package/dist/cjs/fiscal/collection/plan.js +122 -0
- package/dist/cjs/fiscal/collection/plan.js.map +1 -0
- package/dist/cjs/fiscal/coverage/model.js +11 -1
- package/dist/cjs/fiscal/coverage/model.js.map +1 -1
- package/dist/cjs/fiscal/credentials/inspect.js +182 -0
- package/dist/cjs/fiscal/credentials/inspect.js.map +1 -0
- package/dist/cjs/fiscal/credentials/material.js +1 -1
- package/dist/cjs/fiscal/credentials/material.js.map +1 -1
- package/dist/cjs/fiscal/credentials/onboarding.js +266 -0
- package/dist/cjs/fiscal/credentials/onboarding.js.map +1 -0
- package/dist/cjs/fiscal/credentials/readiness.js +29 -2
- package/dist/cjs/fiscal/credentials/readiness.js.map +1 -1
- package/dist/cjs/fiscal/enrollment.js +134 -0
- package/dist/cjs/fiscal/enrollment.js.map +1 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js +52 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -1
- package/dist/cjs/index.js +196 -113
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +64 -4
- package/dist/cjs/legal/documents.js.map +1 -1
- package/dist/cjs/legal/types.js.map +1 -1
- package/dist/cjs/platform/capabilities.js +29 -0
- package/dist/cjs/platform/capabilities.js.map +1 -1
- package/dist/cjs/rbac/catalog.js +78 -2
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/subscription-billing/index.js +8 -1
- package/dist/cjs/subscription-billing/index.js.map +1 -1
- package/dist/cjs/subscription-billing/platform-exemption.js +121 -0
- package/dist/cjs/subscription-billing/platform-exemption.js.map +1 -0
- package/dist/cjs/subscription-billing/service.js +93 -1
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/vault/repository.js +92 -5
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/ibge.d.ts.map +1 -1
- package/dist/clients/ibge.js +14 -0
- package/dist/clients/ibge.js.map +1 -1
- package/dist/clients/registry/http.d.ts +61 -0
- package/dist/clients/registry/http.d.ts.map +1 -0
- package/dist/clients/registry/http.js +151 -0
- package/dist/clients/registry/http.js.map +1 -0
- package/dist/clients/registry/ibge-municipios.d.ts +25 -0
- package/dist/clients/registry/ibge-municipios.d.ts.map +1 -0
- package/dist/clients/registry/ibge-municipios.js +25 -0
- package/dist/clients/registry/ibge-municipios.js.map +1 -0
- package/dist/clients/registry/ibge.d.ts +62 -0
- package/dist/clients/registry/ibge.d.ts.map +1 -0
- package/dist/clients/registry/ibge.js +57 -0
- package/dist/clients/registry/ibge.js.map +1 -0
- package/dist/clients/registry/lookup.d.ts +94 -0
- package/dist/clients/registry/lookup.d.ts.map +1 -0
- package/dist/clients/registry/lookup.js +184 -0
- package/dist/clients/registry/lookup.js.map +1 -0
- package/dist/clients/registry/provider.d.ts +124 -0
- package/dist/clients/registry/provider.d.ts.map +1 -0
- package/dist/clients/registry/provider.js +39 -0
- package/dist/clients/registry/provider.js.map +1 -0
- package/dist/clients/registry/resolve.d.ts +36 -0
- package/dist/clients/registry/resolve.d.ts.map +1 -0
- package/dist/clients/registry/resolve.js +44 -0
- package/dist/clients/registry/resolve.js.map +1 -0
- package/dist/clients/registry/serpro.d.ts +57 -0
- package/dist/clients/registry/serpro.d.ts.map +1 -0
- package/dist/clients/registry/serpro.js +143 -0
- package/dist/clients/registry/serpro.js.map +1 -0
- package/dist/clients/registry/service.d.ts +59 -0
- package/dist/clients/registry/service.d.ts.map +1 -0
- package/dist/clients/registry/service.js +225 -0
- package/dist/clients/registry/service.js.map +1 -0
- package/dist/clients/registry/synthetic.d.ts +30 -0
- package/dist/clients/registry/synthetic.d.ts.map +1 -0
- package/dist/clients/registry/synthetic.js +161 -0
- package/dist/clients/registry/synthetic.js.map +1 -0
- package/dist/clients/repository.d.ts +4 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +6 -2
- package/dist/clients/repository.js.map +1 -1
- package/dist/db/provision-e2e-identity.js +8 -3
- package/dist/db/provision-e2e-identity.js.map +1 -1
- package/dist/fiscal/collection/authorization.d.ts +152 -0
- package/dist/fiscal/collection/authorization.d.ts.map +1 -0
- package/dist/fiscal/collection/authorization.js +178 -0
- package/dist/fiscal/collection/authorization.js.map +1 -0
- package/dist/fiscal/collection/competence.d.ts +66 -0
- package/dist/fiscal/collection/competence.d.ts.map +1 -0
- package/dist/fiscal/collection/competence.js +90 -0
- package/dist/fiscal/collection/competence.js.map +1 -0
- package/dist/fiscal/collection/first-contact.d.ts +103 -0
- package/dist/fiscal/collection/first-contact.d.ts.map +1 -0
- package/dist/fiscal/collection/first-contact.js +201 -0
- package/dist/fiscal/collection/first-contact.js.map +1 -0
- package/dist/fiscal/collection/plan.d.ts +74 -0
- package/dist/fiscal/collection/plan.d.ts.map +1 -0
- package/dist/fiscal/collection/plan.js +119 -0
- package/dist/fiscal/collection/plan.js.map +1 -0
- package/dist/fiscal/coverage/model.d.ts +28 -0
- package/dist/fiscal/coverage/model.d.ts.map +1 -1
- package/dist/fiscal/coverage/model.js +11 -1
- package/dist/fiscal/coverage/model.js.map +1 -1
- package/dist/fiscal/credentials/inspect.d.ts +114 -0
- package/dist/fiscal/credentials/inspect.d.ts.map +1 -0
- package/dist/fiscal/credentials/inspect.js +178 -0
- package/dist/fiscal/credentials/inspect.js.map +1 -0
- package/dist/fiscal/credentials/material.js +2 -2
- package/dist/fiscal/credentials/material.js.map +1 -1
- package/dist/fiscal/credentials/onboarding.d.ts +119 -0
- package/dist/fiscal/credentials/onboarding.d.ts.map +1 -0
- package/dist/fiscal/credentials/onboarding.js +259 -0
- package/dist/fiscal/credentials/onboarding.js.map +1 -0
- package/dist/fiscal/credentials/readiness.d.ts +30 -3
- package/dist/fiscal/credentials/readiness.d.ts.map +1 -1
- package/dist/fiscal/credentials/readiness.js +29 -2
- package/dist/fiscal/credentials/readiness.js.map +1 -1
- package/dist/fiscal/enrollment.d.ts +91 -0
- package/dist/fiscal/enrollment.d.ts.map +1 -0
- package/dist/fiscal/enrollment.js +126 -0
- package/dist/fiscal/enrollment.js.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts +19 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -1
- package/dist/fiscal/transport/synthetic-tls.js +51 -0
- package/dist/fiscal/transport/synthetic-tls.js.map +1 -1
- package/dist/index.d.ts +32 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -2
- package/dist/index.js.map +1 -1
- package/dist/legal/documents.d.ts.map +1 -1
- package/dist/legal/documents.js +64 -4
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +1 -1
- package/dist/legal/index.d.ts.map +1 -1
- package/dist/legal/types.d.ts +77 -0
- package/dist/legal/types.d.ts.map +1 -1
- package/dist/legal/types.js.map +1 -1
- package/dist/platform/capabilities.d.ts.map +1 -1
- package/dist/platform/capabilities.js +29 -0
- package/dist/platform/capabilities.js.map +1 -1
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +78 -2
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/subscription-billing/index.d.ts +3 -1
- package/dist/subscription-billing/index.d.ts.map +1 -1
- package/dist/subscription-billing/index.js +2 -1
- package/dist/subscription-billing/index.js.map +1 -1
- package/dist/subscription-billing/platform-exemption.d.ts +89 -0
- package/dist/subscription-billing/platform-exemption.d.ts.map +1 -0
- package/dist/subscription-billing/platform-exemption.js +113 -0
- package/dist/subscription-billing/platform-exemption.js.map +1 -0
- package/dist/subscription-billing/service.d.ts +53 -0
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +92 -1
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/vault/repository.d.ts +69 -1
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +88 -5
- package/dist/vault/repository.js.map +1 -1
- package/package.json +3 -2
- package/src/db/migrations/0060_fiscal_credential_vault_and_run_authorization.sql +321 -0
- package/src/db/migrations/0061_client_official_registry_provenance.sql +193 -0
- package/src/db/migrations/0062_first_contact_and_capability_truth.sql +119 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LOOKUP_CIRCUIT_OPEN_MS = exports.LOOKUP_CIRCUIT_THRESHOLD = exports.LOOKUP_CACHE_TTL_MS = exports.LOOKUP_QUOTA_WINDOW_MS = exports.LOOKUP_QUOTA_LIMIT = void 0;
|
|
4
|
+
exports.resetLookupCircuits = resetLookupCircuits;
|
|
5
|
+
exports.lookupCompanyRegistry = lookupCompanyRegistry;
|
|
6
|
+
const shared_1 = require("@baruk/shared");
|
|
7
|
+
const audit_js_1 = require("../../audit/audit.js");
|
|
8
|
+
const ibge_js_1 = require("./ibge.js");
|
|
9
|
+
const lookup_js_1 = require("./lookup.js");
|
|
10
|
+
const provider_js_1 = require("./provider.js");
|
|
11
|
+
/**
|
|
12
|
+
* A consulta com as três defesas que o provedor não dá.
|
|
13
|
+
*
|
|
14
|
+
* Nenhuma delas é sobre a rede estar lenta. As três são sobre o que uma
|
|
15
|
+
* consulta barata e repetível permite fazer:
|
|
16
|
+
*
|
|
17
|
+
* **Cota** — um CNPJ tem 14 dígitos e o dígito verificador reduz o espaço a
|
|
18
|
+
* ~10^12, mas uma varredura por faixa é perfeitamente viável. Sem teto, a
|
|
19
|
+
* primeira conta comprometida vira um raspador do cadastro nacional financiado
|
|
20
|
+
* pelo contrato do escritório. O teto é por TENANT, não por usuário: quem varre
|
|
21
|
+
* cria usuários.
|
|
22
|
+
*
|
|
23
|
+
* **Cache** — a mesma tela consultada duas vezes em cinco minutos não pode
|
|
24
|
+
* gastar duas requisições de um contrato pago. E o cache é só de SUCESSO:
|
|
25
|
+
* cachear uma indisponibilidade de um minuto a deixaria colada no CNPJ pelo
|
|
26
|
+
* resto do TTL, e o operador veria "provedor fora do ar" com o provedor no ar.
|
|
27
|
+
*
|
|
28
|
+
* **Disjuntor** — mesma política do motor fiscal (três falhas seguidas, espera
|
|
29
|
+
* que dobra), mas em memória de processo, e é uma escolha, não um esquecimento:
|
|
30
|
+
* a consulta de CNPJ é interativa. Alguém está olhando a tela. Persistir o
|
|
31
|
+
* estado faria uma queda de dez minutos do provedor manter a tela recusando
|
|
32
|
+
* depois que ele voltou, e o operador não tem como saber que a recusa é nossa.
|
|
33
|
+
*/
|
|
34
|
+
/** Teto de consultas por tenant na janela. */
|
|
35
|
+
exports.LOOKUP_QUOTA_LIMIT = 120;
|
|
36
|
+
exports.LOOKUP_QUOTA_WINDOW_MS = 60 * 60_000;
|
|
37
|
+
/** Quanto tempo um retrato bem-sucedido responde sem tocar a rede. */
|
|
38
|
+
exports.LOOKUP_CACHE_TTL_MS = 15 * 60_000;
|
|
39
|
+
/** Falhas seguidas que abrem o disjuntor — mesma régua do motor fiscal. */
|
|
40
|
+
exports.LOOKUP_CIRCUIT_THRESHOLD = 3;
|
|
41
|
+
exports.LOOKUP_CIRCUIT_OPEN_MS = 2 * 60_000;
|
|
42
|
+
/**
|
|
43
|
+
* Estado por (processo, provedor). Um `Map` de módulo, e não um campo de
|
|
44
|
+
* instância: o serviço é chamado por função, sem objeto de longa vida onde
|
|
45
|
+
* pendurar isso.
|
|
46
|
+
*/
|
|
47
|
+
const circuits = new Map();
|
|
48
|
+
/** Só para os testes: um disjuntor herdado entre casos esconderia o defeito. */
|
|
49
|
+
function resetLookupCircuits() {
|
|
50
|
+
circuits.clear();
|
|
51
|
+
}
|
|
52
|
+
function circuitAllows(provider, now) {
|
|
53
|
+
const c = circuits.get(provider);
|
|
54
|
+
return !c || c.openUntil <= now;
|
|
55
|
+
}
|
|
56
|
+
function circuitRecord(provider, ok, now) {
|
|
57
|
+
if (ok) {
|
|
58
|
+
circuits.delete(provider);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const c = circuits.get(provider) ?? { failures: 0, openUntil: 0 };
|
|
62
|
+
c.failures += 1;
|
|
63
|
+
if (c.failures >= exports.LOOKUP_CIRCUIT_THRESHOLD) {
|
|
64
|
+
// O expoente conta as falhas ALÉM do limite, como no motor fiscal: sem
|
|
65
|
+
// isso a terceira falha já pediria a espera de uma décima segunda.
|
|
66
|
+
const excedente = Math.min(c.failures - exports.LOOKUP_CIRCUIT_THRESHOLD, 4);
|
|
67
|
+
c.openUntil = now + exports.LOOKUP_CIRCUIT_OPEN_MS * 2 ** excedente;
|
|
68
|
+
}
|
|
69
|
+
circuits.set(provider, c);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Falhas que contam contra o PROVEDOR.
|
|
73
|
+
*
|
|
74
|
+
* Um CNPJ que não existe é resposta correta de um provedor saudável — contá-la
|
|
75
|
+
* abriria o disjuntor para o escritório inteiro porque alguém digitou errado
|
|
76
|
+
* três vezes. `invalid_document` sequer chega à rede.
|
|
77
|
+
*/
|
|
78
|
+
function countsAgainstProvider(reason) {
|
|
79
|
+
return reason === 'provider_unavailable' || reason === 'unexpected_payload';
|
|
80
|
+
}
|
|
81
|
+
async function quotaUsed(tx, since) {
|
|
82
|
+
const [row] = await tx `
|
|
83
|
+
SELECT count(*)::text AS n FROM client_registry_lookup
|
|
84
|
+
WHERE created_at >= ${since}
|
|
85
|
+
`;
|
|
86
|
+
return Number(row?.n ?? '0');
|
|
87
|
+
}
|
|
88
|
+
async function cached(tx, documento, provider, since) {
|
|
89
|
+
const [row] = await tx `
|
|
90
|
+
SELECT payload FROM client_registry_lookup
|
|
91
|
+
WHERE document_digits = ${documento} AND provider = ${provider}
|
|
92
|
+
AND outcome = 'ok' AND created_at >= ${since}
|
|
93
|
+
ORDER BY created_at DESC
|
|
94
|
+
LIMIT 1
|
|
95
|
+
`;
|
|
96
|
+
return row?.payload ?? null;
|
|
97
|
+
}
|
|
98
|
+
async function recordLookup(tx, input) {
|
|
99
|
+
await tx `
|
|
100
|
+
INSERT INTO client_registry_lookup (
|
|
101
|
+
id, tenant_id, document_digits, provider, outcome, failure_reason, payload, requested_by
|
|
102
|
+
) VALUES (
|
|
103
|
+
${(0, shared_1.uuidv7)()}, ${input.tenantId}, ${input.documento}, ${input.provider},
|
|
104
|
+
${input.outcome}, ${input.reason ?? null},
|
|
105
|
+
${input.payload ? tx.json(input.payload) : null}, ${input.actorId}
|
|
106
|
+
)
|
|
107
|
+
`;
|
|
108
|
+
}
|
|
109
|
+
function montar(record, provider, current, served) {
|
|
110
|
+
const ibge = (0, ibge_js_1.resolveMunicipality)(record.address.municipality ?? '', record.address.uf);
|
|
111
|
+
return {
|
|
112
|
+
status: 'ok',
|
|
113
|
+
provider: provider.name,
|
|
114
|
+
official: provider.official,
|
|
115
|
+
record,
|
|
116
|
+
ibge,
|
|
117
|
+
proposals: (0, lookup_js_1.buildProposals)(record, current, ibge),
|
|
118
|
+
served,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Consulta o CNPJ com cota, cache, disjuntor e trilha — e NÃO grava cadastro.
|
|
123
|
+
*
|
|
124
|
+
* O que ela devolve são propostas. Aplicá-las é outro ato, com outra assinatura
|
|
125
|
+
* e outra permissão: quem pode consultar não necessariamente pode alterar o
|
|
126
|
+
* cadastro de um cliente.
|
|
127
|
+
*/
|
|
128
|
+
async function lookupCompanyRegistry(tx, provider, req) {
|
|
129
|
+
const agora = req.now ?? new Date();
|
|
130
|
+
const ms = agora.getTime();
|
|
131
|
+
const documento = (0, provider_js_1.cnpjDigits)(req.cnpj);
|
|
132
|
+
const current = req.current ?? {};
|
|
133
|
+
const recusar = async (reason, opts = { registra: true }) => {
|
|
134
|
+
if (opts.registra) {
|
|
135
|
+
await recordLookup(tx, {
|
|
136
|
+
tenantId: req.tenantId,
|
|
137
|
+
documento,
|
|
138
|
+
provider: provider.name,
|
|
139
|
+
outcome: 'failed',
|
|
140
|
+
reason,
|
|
141
|
+
actorId: req.actorId,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
await (0, audit_js_1.appendAudit)(tx, {
|
|
145
|
+
actorId: req.actorId,
|
|
146
|
+
action: 'cnpj_lookup_failed',
|
|
147
|
+
resourceType: 'client_registry_lookup',
|
|
148
|
+
resourceId: null,
|
|
149
|
+
// O documento inteiro NÃO entra na trilha: ele identifica uma empresa, e
|
|
150
|
+
// a trilha é lida por gente que não precisa saber por quem se perguntou.
|
|
151
|
+
// O sufixo basta para casar dois eventos da mesma consulta.
|
|
152
|
+
metadata: { provider: provider.name, reason, documentTail: documento.slice(-6) },
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
status: 'failed',
|
|
156
|
+
provider: provider.name,
|
|
157
|
+
official: provider.official,
|
|
158
|
+
reason,
|
|
159
|
+
proposals: [],
|
|
160
|
+
served: 'network',
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
// Documento inválido nem chega à contagem: reprovar aqui não gasta cota nem
|
|
164
|
+
// toca o provedor, e um dígito errado não pode consumir o orçamento de quem
|
|
165
|
+
// digitou certo depois.
|
|
166
|
+
if (!(0, provider_js_1.isValidCnpj)(documento))
|
|
167
|
+
return recusar('invalid_document', { registra: false });
|
|
168
|
+
const usadas = await quotaUsed(tx, new Date(ms - exports.LOOKUP_QUOTA_WINDOW_MS));
|
|
169
|
+
if (usadas >= exports.LOOKUP_QUOTA_LIMIT)
|
|
170
|
+
return recusar('quota_exceeded', { registra: false });
|
|
171
|
+
const doCache = await cached(tx, documento, provider.name, new Date(ms - exports.LOOKUP_CACHE_TTL_MS));
|
|
172
|
+
if (doCache) {
|
|
173
|
+
await (0, audit_js_1.appendAudit)(tx, {
|
|
174
|
+
actorId: req.actorId,
|
|
175
|
+
action: 'cnpj_lookup_success',
|
|
176
|
+
resourceType: 'client_registry_lookup',
|
|
177
|
+
resourceId: null,
|
|
178
|
+
metadata: { provider: provider.name, served: 'cache', documentTail: documento.slice(-6) },
|
|
179
|
+
});
|
|
180
|
+
return montar(doCache, provider, current, 'cache');
|
|
181
|
+
}
|
|
182
|
+
if (!circuitAllows(provider.name, ms))
|
|
183
|
+
return recusar('circuit_open', { registra: false });
|
|
184
|
+
await (0, audit_js_1.appendAudit)(tx, {
|
|
185
|
+
actorId: req.actorId,
|
|
186
|
+
action: 'cnpj_lookup_requested',
|
|
187
|
+
resourceType: 'client_registry_lookup',
|
|
188
|
+
resourceId: null,
|
|
189
|
+
metadata: { provider: provider.name, documentTail: documento.slice(-6) },
|
|
190
|
+
});
|
|
191
|
+
let resultado;
|
|
192
|
+
try {
|
|
193
|
+
resultado = await provider.lookup(documento);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// Nenhuma exceção de provedor atravessa com a sua mensagem: um cliente HTTP
|
|
197
|
+
// cita a URL, e URL de provedor pode carregar credencial no query string.
|
|
198
|
+
circuitRecord(provider.name, false, ms);
|
|
199
|
+
return recusar('provider_unavailable');
|
|
200
|
+
}
|
|
201
|
+
if (resultado.status === 'failed') {
|
|
202
|
+
if (countsAgainstProvider(resultado.reason))
|
|
203
|
+
circuitRecord(provider.name, false, ms);
|
|
204
|
+
return recusar(resultado.reason);
|
|
205
|
+
}
|
|
206
|
+
circuitRecord(provider.name, true, ms);
|
|
207
|
+
await recordLookup(tx, {
|
|
208
|
+
tenantId: req.tenantId,
|
|
209
|
+
documento,
|
|
210
|
+
provider: provider.name,
|
|
211
|
+
outcome: 'ok',
|
|
212
|
+
payload: resultado.record,
|
|
213
|
+
actorId: req.actorId,
|
|
214
|
+
});
|
|
215
|
+
await (0, audit_js_1.appendAudit)(tx, {
|
|
216
|
+
actorId: req.actorId,
|
|
217
|
+
action: 'cnpj_lookup_success',
|
|
218
|
+
resourceType: 'client_registry_lookup',
|
|
219
|
+
resourceId: null,
|
|
220
|
+
metadata: {
|
|
221
|
+
provider: provider.name,
|
|
222
|
+
official: provider.official,
|
|
223
|
+
served: 'network',
|
|
224
|
+
registrationStatus: resultado.record.registrationStatus,
|
|
225
|
+
documentTail: documento.slice(-6),
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
return montar(resultado.record, provider, current, 'network');
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/clients/registry/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SYNTHETIC_CNPJ = void 0;
|
|
4
|
+
exports.syntheticCompanyRegistry = syntheticCompanyRegistry;
|
|
5
|
+
const provider_js_1 = require("./provider.js");
|
|
6
|
+
/**
|
|
7
|
+
* Um provedor de mentira, para provar o produto sem contrato.
|
|
8
|
+
*
|
|
9
|
+
* ## Por que ele é `official: false`, e por que isso importa
|
|
10
|
+
*
|
|
11
|
+
* Todo retrato que ele devolve entra no banco carimbado como NÃO oficial. Sem
|
|
12
|
+
* esse carimbo, um dado sintético usado num ambiente de demonstração ficaria
|
|
13
|
+
* indistinguível de um dado da Receita — e a etiqueta de proveniência, que
|
|
14
|
+
* existe justamente para dizer o quanto se confia num campo, viraria decoração.
|
|
15
|
+
*
|
|
16
|
+
* ## Os cenários vivem no número
|
|
17
|
+
*
|
|
18
|
+
* Cada CNPJ da tabela abaixo É um caso de teste: empresa baixada, sem nome
|
|
19
|
+
* fantasia, sem e-mail, Simples que a fonte não informou, município que o IBGE
|
|
20
|
+
* não conhece. Espalhar isso por mocks locais faria cada teste inventar a sua
|
|
21
|
+
* própria versão de "empresa inapta" — e duas versões divergentes de um mesmo
|
|
22
|
+
* conceito é como um bug passa entre elas.
|
|
23
|
+
*/
|
|
24
|
+
const BASE = {
|
|
25
|
+
cnpj: '',
|
|
26
|
+
legalName: 'EMPRESA SINTETICA LTDA',
|
|
27
|
+
tradeName: 'SINTETICA',
|
|
28
|
+
registrationStatus: 'ATIVA',
|
|
29
|
+
openedOn: '2015-03-10',
|
|
30
|
+
legalNature: '206-2 - Sociedade Empresária Limitada',
|
|
31
|
+
size: 'ME',
|
|
32
|
+
primaryActivity: { code: '4712100', description: 'Comércio varejista de mercadorias em geral' },
|
|
33
|
+
secondaryActivities: [],
|
|
34
|
+
address: {
|
|
35
|
+
street: 'Rua das Provas',
|
|
36
|
+
number: '100',
|
|
37
|
+
complement: null,
|
|
38
|
+
district: 'Setor Central',
|
|
39
|
+
zipCode: '74000-000',
|
|
40
|
+
municipality: 'Goiânia',
|
|
41
|
+
uf: 'GO',
|
|
42
|
+
},
|
|
43
|
+
phone: '(62) 3000-0000',
|
|
44
|
+
email: 'contato@sintetica.example',
|
|
45
|
+
shareCapital: 50000,
|
|
46
|
+
simplesOptant: true,
|
|
47
|
+
meiOptant: false,
|
|
48
|
+
};
|
|
49
|
+
/** Cenários felizes: o CNPJ escolhe qual retrato volta. */
|
|
50
|
+
const RETRATOS = {
|
|
51
|
+
// Ativa, completa, optante do Simples — o caso comum.
|
|
52
|
+
'11222333000181': {},
|
|
53
|
+
// Gêmeas da anterior, e existem por uma razão de teste: o cache é por
|
|
54
|
+
// (tenant, documento), então um caso que precisa MESMO tocar a rede não pode
|
|
55
|
+
// reusar um CNPJ que outro caso já consultou.
|
|
56
|
+
'30000000000152': { tradeName: 'SINTETICA II' },
|
|
57
|
+
'30000000000233': { tradeName: 'SINTETICA III' },
|
|
58
|
+
// Sem nome fantasia: a tela não pode mostrar "undefined" nem cair para a
|
|
59
|
+
// razão social sem dizer que caiu.
|
|
60
|
+
'11444777000161': { tradeName: null, legalName: 'COMERCIO SEM FANTASIA LTDA' },
|
|
61
|
+
// Sem e-mail e sem telefone: os dois campos que o escritório mais preenche à
|
|
62
|
+
// mão, e que a fonte oficial mais frequentemente não tem.
|
|
63
|
+
'19131243000197': { email: null, phone: null },
|
|
64
|
+
// Baixada — não é erro de consulta. A empresa existe e está encerrada, e o
|
|
65
|
+
// cadastro não pode tratar isso como "não encontrado".
|
|
66
|
+
'34028316000103': { registrationStatus: 'BAIXADA', tradeName: 'ENCERRADA' },
|
|
67
|
+
// Inapta: opera, mas com pendência. Distinta de baixada.
|
|
68
|
+
'33000167000101': { registrationStatus: 'INAPTA' },
|
|
69
|
+
// Vários CNAEs secundários: a tela precisa caber mais de um.
|
|
70
|
+
'60746948000112': {
|
|
71
|
+
secondaryActivities: [
|
|
72
|
+
{ code: '4711302', description: 'Comércio varejista de mercadorias em geral' },
|
|
73
|
+
{ code: '5620104', description: 'Fornecimento de alimentos preparados' },
|
|
74
|
+
{ code: '8299799', description: 'Outras atividades de serviços prestados' },
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
// MEI. `simplesOptant` também é true: todo MEI é do Simples, e uma fonte que
|
|
78
|
+
// dissesse MEI sem dizer Simples estaria incompleta, não negando.
|
|
79
|
+
'45283163000167': { meiOptant: true, simplesOptant: true, size: 'MEI' },
|
|
80
|
+
// NÃO optante do Simples. Isto é a fonte DIZENDO "não" — e continua não
|
|
81
|
+
// dizendo nada sobre Real ou Presumido. Ver `NON_SIMPLES_TAX_REGIME_NOT_INFERRED`.
|
|
82
|
+
'47960950000121': { simplesOptant: false, size: 'DEMAIS' },
|
|
83
|
+
// A fonte SILENCIOU sobre o regime. `null` não é `false`: aqui o produto tem
|
|
84
|
+
// de dizer "não informado", nunca "não é do Simples".
|
|
85
|
+
'07526557000100': { simplesOptant: null, meiOptant: null },
|
|
86
|
+
// Município que o IBGE não resolve pelo nome que a fonte usou. O código não
|
|
87
|
+
// pode ser adivinhado — a tela pergunta.
|
|
88
|
+
'02558157000162': {
|
|
89
|
+
address: { ...BASE.address, municipality: 'Vila Que Nao Existe', uf: 'GO' },
|
|
90
|
+
},
|
|
91
|
+
// Município ambíguo sem UF confiável: "Bom Jesus" existe em cinco estados.
|
|
92
|
+
'61695227000193': {
|
|
93
|
+
address: { ...BASE.address, municipality: 'Bom Jesus', uf: null },
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
/** Cenários de falha: o CNPJ escolhe qual defeito o provedor apresenta. */
|
|
97
|
+
const FALHAS = {
|
|
98
|
+
'00000000000191': 'not_found',
|
|
99
|
+
'15436940000103': 'rate_limited',
|
|
100
|
+
'92660406000119': 'provider_unavailable',
|
|
101
|
+
'76535764000143': 'timeout',
|
|
102
|
+
'05570714000159': 'garbage',
|
|
103
|
+
};
|
|
104
|
+
function syntheticCompanyRegistry(options = {}) {
|
|
105
|
+
return {
|
|
106
|
+
name: 'synthetic',
|
|
107
|
+
official: false,
|
|
108
|
+
async lookup(input) {
|
|
109
|
+
const cnpj = (0, provider_js_1.cnpjDigits)(input);
|
|
110
|
+
const source = 'synthetic';
|
|
111
|
+
const recusa = (reason) => ({
|
|
112
|
+
status: 'failed',
|
|
113
|
+
reason,
|
|
114
|
+
source,
|
|
115
|
+
});
|
|
116
|
+
options.onCall?.(cnpj);
|
|
117
|
+
if (options.force)
|
|
118
|
+
return recusa(options.force);
|
|
119
|
+
if (!(0, provider_js_1.isValidCnpj)(cnpj))
|
|
120
|
+
return recusa('invalid_document');
|
|
121
|
+
const falha = FALHAS[cnpj];
|
|
122
|
+
if (falha === 'timeout') {
|
|
123
|
+
// Uma exceção CRUA, como a rede produz. O serviço tem de classificá-la
|
|
124
|
+
// sozinho: um provedor real não devolve `{status:'failed'}` educado
|
|
125
|
+
// quando o socket morre.
|
|
126
|
+
throw new Error('ETIMEDOUT synthetic://registry');
|
|
127
|
+
}
|
|
128
|
+
if (falha === 'garbage')
|
|
129
|
+
return recusa('unexpected_payload');
|
|
130
|
+
if (falha)
|
|
131
|
+
return recusa(falha);
|
|
132
|
+
const patch = RETRATOS[cnpj];
|
|
133
|
+
if (!patch)
|
|
134
|
+
return recusa('not_found');
|
|
135
|
+
return {
|
|
136
|
+
status: 'ok',
|
|
137
|
+
record: { ...BASE, ...patch, cnpj },
|
|
138
|
+
source,
|
|
139
|
+
fetchedAt: new Date().toISOString(),
|
|
140
|
+
};
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/** Os CNPJs sintéticos, nomeados — para o teste citar o caso, não o número. */
|
|
145
|
+
exports.SYNTHETIC_CNPJ = {
|
|
146
|
+
ativaCompleta: '11222333000181',
|
|
147
|
+
ativaSemCache: '30000000000152',
|
|
148
|
+
ativaSemCache2: '30000000000233',
|
|
149
|
+
semNomeFantasia: '11444777000161',
|
|
150
|
+
semContato: '19131243000197',
|
|
151
|
+
baixada: '34028316000103',
|
|
152
|
+
inapta: '33000167000101',
|
|
153
|
+
variosCnae: '60746948000112',
|
|
154
|
+
mei: '45283163000167',
|
|
155
|
+
naoOptanteSimples: '47960950000121',
|
|
156
|
+
regimeNaoInformado: '07526557000100',
|
|
157
|
+
municipioDesconhecido: '02558157000162',
|
|
158
|
+
municipioAmbiguo: '61695227000193',
|
|
159
|
+
naoEncontrada: '00000000000191',
|
|
160
|
+
limiteExcedido: '15436940000103',
|
|
161
|
+
provedorForaDoAr: '92660406000119',
|
|
162
|
+
tempoEsgotado: '76535764000143',
|
|
163
|
+
respostaIlegivel: '05570714000159',
|
|
164
|
+
};
|
|
165
|
+
//# sourceMappingURL=synthetic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthetic.js","sourceRoot":"","sources":["../../../../src/clients/registry/synthetic.ts"],"names":[],"mappings":"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"}
|
|
@@ -88,6 +88,7 @@ function mapRow(r, channels = {}) {
|
|
|
88
88
|
municipality: r.municipality ?? null,
|
|
89
89
|
stateUf: r.state_uf ?? null,
|
|
90
90
|
legalName: r.legal_name ?? null,
|
|
91
|
+
tradeName: r.trade_name ?? null,
|
|
91
92
|
addressLine: r.address_line ?? null,
|
|
92
93
|
postalCode: r.postal_code ?? null,
|
|
93
94
|
notes: r.notes ?? null,
|
|
@@ -118,7 +119,8 @@ async function createClient(tx, input) {
|
|
|
118
119
|
// tentativa de gravar fora do tenant corrente.
|
|
119
120
|
try {
|
|
120
121
|
const rows = await tx `
|
|
121
|
-
INSERT INTO client (id, tenant_id, client_type, display_name, legal_name,
|
|
122
|
+
INSERT INTO client (id, tenant_id, client_type, display_name, legal_name, trade_name,
|
|
123
|
+
document_number,
|
|
122
124
|
email, phone, phone_e164, address_line, municipality, state_uf,
|
|
123
125
|
municipality_ibge_code,
|
|
124
126
|
postal_code, notes, responsible_user_id, contract_started_on,
|
|
@@ -129,6 +131,7 @@ async function createClient(tx, input) {
|
|
|
129
131
|
${input.clientType ?? 'pj'},
|
|
130
132
|
${input.displayName},
|
|
131
133
|
${input.legalName?.trim() || null},
|
|
134
|
+
${input.tradeName?.trim() || null},
|
|
132
135
|
${input.documentNumber ?? null},
|
|
133
136
|
${normalizeEmail(input.email)},
|
|
134
137
|
${normalizePhone(input.phone)},
|
|
@@ -165,7 +168,7 @@ async function listClients(tx) {
|
|
|
165
168
|
}
|
|
166
169
|
async function getClient(tx, id) {
|
|
167
170
|
const rows = await tx `
|
|
168
|
-
SELECT id, tenant_id, client_type, display_name, legal_name, document_number, email, phone,
|
|
171
|
+
SELECT id, tenant_id, client_type, display_name, legal_name, trade_name, document_number, email, phone,
|
|
169
172
|
status, created_at, responsible_user_id, address_line, municipality, state_uf,
|
|
170
173
|
municipality_ibge_code, postal_code, notes
|
|
171
174
|
FROM client
|
|
@@ -259,6 +262,7 @@ async function updateClient(tx, id, input) {
|
|
|
259
262
|
UPDATE client SET
|
|
260
263
|
display_name = COALESCE(${input.displayName ?? null}::text, display_name),
|
|
261
264
|
legal_name = CASE WHEN ${'legalName' in input} THEN ${input.legalName?.trim() || null}::text ELSE legal_name END,
|
|
265
|
+
trade_name = CASE WHEN ${'tradeName' in input} THEN ${input.tradeName?.trim() || null}::text ELSE trade_name END,
|
|
262
266
|
document_number = COALESCE(${input.documentNumber ?? null}::text, document_number),
|
|
263
267
|
email = COALESCE(${normalizeEmail(input.email)}::citext, email),
|
|
264
268
|
phone = COALESCE(${normalizePhone(input.phone)}::text, phone),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/clients/repository.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/clients/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
13
13
|
* ## O que ele garante
|
|
14
14
|
*
|
|
15
15
|
* - `user_type = 'service'` — reconhecível como não-humana em toda consulta;
|
|
16
|
-
* - papel `e2e_automation` e nada além:
|
|
16
|
+
* - papel `e2e_automation` e nada além: cinco permissões, tenant único;
|
|
17
17
|
* - idempotente: rodar de novo não duplica nem escala privilégio;
|
|
18
18
|
* - a senha vem do ambiente e **nunca** é impressa, ecoada ou gravada em log.
|
|
19
19
|
*
|
|
@@ -30,6 +30,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
30
30
|
const client_js_1 = require("./client.js");
|
|
31
31
|
const context_js_1 = require("./context.js");
|
|
32
32
|
const provisioning_js_1 = require("../tenancy/provisioning.js");
|
|
33
|
+
const catalog_js_1 = require("../rbac/catalog.js");
|
|
33
34
|
const service_js_1 = require("../auth/service.js");
|
|
34
35
|
const ROLE = 'e2e_automation';
|
|
35
36
|
function arg(nome, padrao) {
|
|
@@ -87,8 +88,12 @@ async function main() {
|
|
|
87
88
|
console.log(` papel: ${ROLE}`);
|
|
88
89
|
console.log(` permissões (${permissoes.length}): ${permissoes.join(', ')}`);
|
|
89
90
|
console.log(` senha definida nesta execução: ${user.passwordWasSet ? 'sim' : 'não (já existia)'}`);
|
|
90
|
-
|
|
91
|
-
|
|
91
|
+
// O número vem do catálogo, e não de um literal repetido aqui: duas cópias
|
|
92
|
+
// da mesma régua divergem, e a divergência aparece como um provisionamento
|
|
93
|
+
// que aborta sem motivo — ou, pior, que aceita uma permissão a mais.
|
|
94
|
+
const esperadas = catalog_js_1.SYSTEM_ROLES.find((r) => r.key === ROLE)?.permissions.length ?? 0;
|
|
95
|
+
if (permissoes.length !== esperadas) {
|
|
96
|
+
throw new Error(`Esperava ${esperadas} permissões e encontrei ${permissoes.length}. Abortando: uma identidade de automação com privilégio a mais não deve ficar de pé.`);
|
|
92
97
|
}
|
|
93
98
|
}
|
|
94
99
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provision-e2e-identity.js","sourceRoot":"","sources":["../../../src/db/provision-e2e-identity.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"provision-e2e-identity.js","sourceRoot":"","sources":["../../../src/db/provision-e2e-identity.ts"],"names":[],"mappings":"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"}
|