@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,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.municipalityKey = municipalityKey;
|
|
4
|
+
exports.municipalityCount = municipalityCount;
|
|
5
|
+
exports.resolveMunicipality = resolveMunicipality;
|
|
6
|
+
exports.municipalityByCode = municipalityByCode;
|
|
7
|
+
const ibge_municipios_js_1 = require("./ibge-municipios.js");
|
|
8
|
+
/**
|
|
9
|
+
* Chave de busca: sem acento, sem caixa, espaços colapsados.
|
|
10
|
+
*
|
|
11
|
+
* O nome ORIGINAL é preservado no dataset e é o que volta — normalizar para
|
|
12
|
+
* comparar não é o mesmo que normalizar para gravar. `Goiânia` cadastrada como
|
|
13
|
+
* `GOIANIA` deve casar, e o que se persiste é a grafia oficial.
|
|
14
|
+
*/
|
|
15
|
+
function municipalityKey(name) {
|
|
16
|
+
return name.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase().replace(/\s+/g, ' ').trim();
|
|
17
|
+
}
|
|
18
|
+
let cache = null;
|
|
19
|
+
function load() {
|
|
20
|
+
if (cache)
|
|
21
|
+
return cache;
|
|
22
|
+
const linhas = ibge_municipios_js_1.IBGE_MUNICIPALITIES_TSV.split('\n').filter(Boolean);
|
|
23
|
+
cache = linhas.map((linha) => {
|
|
24
|
+
const [code, uf, name] = linha.split('\t');
|
|
25
|
+
return { code: code, uf: uf, name: name, key: municipalityKey(name) };
|
|
26
|
+
});
|
|
27
|
+
return cache;
|
|
28
|
+
}
|
|
29
|
+
/** Quantos municípios o dataset conhece. O teste ancora nisso. */
|
|
30
|
+
function municipalityCount() {
|
|
31
|
+
return load().length;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolve o código IBGE.
|
|
35
|
+
*
|
|
36
|
+
* Com UF, a busca é exata e não há ambiguidade possível: dois municípios da
|
|
37
|
+
* mesma UF não compartilham nome. Sem UF, devolve `ambiguous` quando mais de um
|
|
38
|
+
* estado tem o mesmo nome — e é a UI que pergunta.
|
|
39
|
+
*/
|
|
40
|
+
function resolveMunicipality(name, uf) {
|
|
41
|
+
const alvo = municipalityKey(name ?? '');
|
|
42
|
+
if (!alvo)
|
|
43
|
+
return { status: 'not_found' };
|
|
44
|
+
const ufNorm = (uf ?? '').trim().toUpperCase();
|
|
45
|
+
const todos = load();
|
|
46
|
+
const achados = todos.filter((m) => m.key === alvo && (!ufNorm || m.uf === ufNorm));
|
|
47
|
+
if (achados.length === 0)
|
|
48
|
+
return { status: 'not_found' };
|
|
49
|
+
if (achados.length === 1) {
|
|
50
|
+
const m = achados[0];
|
|
51
|
+
return { status: 'match', code: m.code, name: m.name, uf: m.uf };
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
status: 'ambiguous',
|
|
55
|
+
candidates: achados.map((m) => ({ code: m.code, name: m.name, uf: m.uf })),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** O município de um código, para exibir o que foi gravado. */
|
|
59
|
+
function municipalityByCode(code) {
|
|
60
|
+
const m = load().find((x) => x.code === code);
|
|
61
|
+
return m ? { code: m.code, name: m.name, uf: m.uf } : null;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=ibge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ibge.js","sourceRoot":"","sources":["../../../../src/clients/registry/ibge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildProposals = buildProposals;
|
|
4
|
+
exports.lookupCompany = lookupCompany;
|
|
5
|
+
exports.saveRegistrySnapshot = saveRegistrySnapshot;
|
|
6
|
+
exports.markFieldProvenance = markFieldProvenance;
|
|
7
|
+
exports.humanOwnedFields = humanOwnedFields;
|
|
8
|
+
const shared_1 = require("@baruk/shared");
|
|
9
|
+
const ibge_js_1 = require("./ibge.js");
|
|
10
|
+
const provider_js_1 = require("./provider.js");
|
|
11
|
+
/** Os campos do cadastro que uma consulta oficial pode preencher. */
|
|
12
|
+
const CAMPOS = [
|
|
13
|
+
'legalName',
|
|
14
|
+
'tradeName',
|
|
15
|
+
'email',
|
|
16
|
+
'phone',
|
|
17
|
+
'addressLine',
|
|
18
|
+
'postalCode',
|
|
19
|
+
'municipality',
|
|
20
|
+
'stateUf',
|
|
21
|
+
'municipalityIbgeCode',
|
|
22
|
+
];
|
|
23
|
+
function endereco(r) {
|
|
24
|
+
const partes = [r.address.street, r.address.number, r.address.complement, r.address.district]
|
|
25
|
+
.map((p) => (p ?? '').trim())
|
|
26
|
+
.filter(Boolean);
|
|
27
|
+
return partes.length > 0 ? partes.join(', ') : null;
|
|
28
|
+
}
|
|
29
|
+
/** Só dígitos — CEP e telefone chegam com máscara de toda fonte. */
|
|
30
|
+
function digitos(v) {
|
|
31
|
+
const d = (v ?? '').replace(/\D/g, '');
|
|
32
|
+
return d === '' ? null : d;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Confronta o retrato oficial com o cadastro atual e devolve PROPOSTAS.
|
|
36
|
+
*
|
|
37
|
+
* Quatro desfechos por campo, e a UI trata cada um de um jeito:
|
|
38
|
+
*
|
|
39
|
+
* `absent` a fonte não informou. Nada a propor.
|
|
40
|
+
* `unchanged` igual ao que já está. Nada a fazer.
|
|
41
|
+
* `prefill` o cadastro está vazio — preencher é ganho, não é conflito.
|
|
42
|
+
* `conflict` os dois têm valor e diferem. **Só aqui alguém precisa decidir.**
|
|
43
|
+
*
|
|
44
|
+
* Separar `prefill` de `conflict` é o que evita a tela pedir confirmação de
|
|
45
|
+
* dezoito campos quando dezessete estavam em branco.
|
|
46
|
+
*/
|
|
47
|
+
function buildProposals(record, atual, ibge) {
|
|
48
|
+
const oficial = {
|
|
49
|
+
legalName: record.legalName,
|
|
50
|
+
tradeName: record.tradeName,
|
|
51
|
+
email: record.email,
|
|
52
|
+
phone: digitos(record.phone),
|
|
53
|
+
addressLine: endereco(record),
|
|
54
|
+
postalCode: digitos(record.address.zipCode),
|
|
55
|
+
municipality: record.address.municipality,
|
|
56
|
+
stateUf: record.address.uf,
|
|
57
|
+
municipalityIbgeCode: ibge.status === 'match' ? ibge.code : null,
|
|
58
|
+
};
|
|
59
|
+
return CAMPOS.map((field) => {
|
|
60
|
+
const off = oficial[field];
|
|
61
|
+
const cur = atual[field] ?? null;
|
|
62
|
+
let decision;
|
|
63
|
+
if (off === null || off === '')
|
|
64
|
+
decision = 'absent';
|
|
65
|
+
else if (cur === null || cur === '')
|
|
66
|
+
decision = 'prefill';
|
|
67
|
+
else if (String(cur).trim().toLowerCase() === String(off).trim().toLowerCase())
|
|
68
|
+
decision = 'unchanged';
|
|
69
|
+
else
|
|
70
|
+
decision = 'conflict';
|
|
71
|
+
return { field, current: cur, official: off, decision };
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Executa a consulta e monta o resultado — sem tocar no banco.
|
|
76
|
+
*
|
|
77
|
+
* A separação é deliberada: consultar é uma operação de rede que pode falhar, e
|
|
78
|
+
* gravar é uma decisão humana que vem depois. Fundi-las faria uma consulta
|
|
79
|
+
* bem-sucedida alterar cadastro sem que ninguém tivesse confirmado.
|
|
80
|
+
*/
|
|
81
|
+
async function lookupCompany(provider, cnpj, atual = {}) {
|
|
82
|
+
if (!(0, provider_js_1.isValidCnpj)(cnpj)) {
|
|
83
|
+
return {
|
|
84
|
+
status: 'failed',
|
|
85
|
+
provider: provider.name,
|
|
86
|
+
official: provider.official,
|
|
87
|
+
reason: 'invalid_document',
|
|
88
|
+
proposals: [],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
let resultado;
|
|
92
|
+
try {
|
|
93
|
+
resultado = await provider.lookup((0, provider_js_1.cnpjDigits)(cnpj));
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Nenhuma exceção de provedor atravessa: a mensagem de um cliente HTTP cita
|
|
97
|
+
// URL, e URL de provedor pode carregar credencial no query string.
|
|
98
|
+
return {
|
|
99
|
+
status: 'failed',
|
|
100
|
+
provider: provider.name,
|
|
101
|
+
official: provider.official,
|
|
102
|
+
reason: 'provider_unavailable',
|
|
103
|
+
proposals: [],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (resultado.status === 'failed') {
|
|
107
|
+
return {
|
|
108
|
+
status: 'failed',
|
|
109
|
+
provider: provider.name,
|
|
110
|
+
official: provider.official,
|
|
111
|
+
reason: resultado.reason,
|
|
112
|
+
proposals: [],
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const ibge = (0, ibge_js_1.resolveMunicipality)(resultado.record.address.municipality ?? '', resultado.record.address.uf);
|
|
116
|
+
return {
|
|
117
|
+
status: 'ok',
|
|
118
|
+
provider: provider.name,
|
|
119
|
+
official: provider.official,
|
|
120
|
+
record: resultado.record,
|
|
121
|
+
ibge,
|
|
122
|
+
proposals: buildProposals(resultado.record, atual, ibge),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Grava o retrato oficial ao lado do cadastro.
|
|
127
|
+
*
|
|
128
|
+
* `client` não é tocado aqui. O retrato é o que a fonte disse; aplicar sobre o
|
|
129
|
+
* cadastro é outro ato, com outra assinatura.
|
|
130
|
+
*/
|
|
131
|
+
async function saveRegistrySnapshot(tx, input) {
|
|
132
|
+
const r = input.record;
|
|
133
|
+
const rows = await tx `
|
|
134
|
+
INSERT INTO client_registry_snapshot (
|
|
135
|
+
id, tenant_id, client_id, provider, provider_official, document_digits,
|
|
136
|
+
legal_name, trade_name, registration_status, opened_on, legal_nature, company_size,
|
|
137
|
+
primary_activity_code, primary_activity_text, secondary_activities,
|
|
138
|
+
street, street_number, complement, district, postal_code, municipality, state_uf,
|
|
139
|
+
phone, email, share_capital_cents, simples_optant, mei_optant
|
|
140
|
+
) VALUES (
|
|
141
|
+
${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid, ${input.clientId},
|
|
142
|
+
${input.provider}, ${input.official}, ${(0, provider_js_1.cnpjDigits)(r.cnpj)},
|
|
143
|
+
${r.legalName}, ${r.tradeName}, ${r.registrationStatus}, ${r.openedOn},
|
|
144
|
+
${r.legalNature}, ${r.size},
|
|
145
|
+
${r.primaryActivity?.code ?? null}, ${r.primaryActivity?.description ?? null},
|
|
146
|
+
${tx.json(r.secondaryActivities)},
|
|
147
|
+
${r.address.street}, ${r.address.number}, ${r.address.complement}, ${r.address.district},
|
|
148
|
+
${digitos(r.address.zipCode)}, ${r.address.municipality}, ${r.address.uf},
|
|
149
|
+
${digitos(r.phone)}, ${r.email},
|
|
150
|
+
${r.shareCapital === null ? null : Math.round(r.shareCapital * 100)},
|
|
151
|
+
${r.simplesOptant}, ${r.meiOptant}
|
|
152
|
+
)
|
|
153
|
+
RETURNING id
|
|
154
|
+
`;
|
|
155
|
+
return rows[0].id;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Marca a origem de um campo do cadastro.
|
|
159
|
+
*
|
|
160
|
+
* `human` vence: um campo que uma pessoa escreveu NUNCA volta a `official_lookup`
|
|
161
|
+
* por uma atualização automática. É esta função — e o `WHERE` dela — que faz
|
|
162
|
+
* `HUMAN_OVERRIDE_PRESERVED` ser uma consulta, e não uma promessa.
|
|
163
|
+
*/
|
|
164
|
+
async function markFieldProvenance(tx, input) {
|
|
165
|
+
const oficial = input.origin === 'official_lookup';
|
|
166
|
+
await tx `
|
|
167
|
+
INSERT INTO client_field_provenance (
|
|
168
|
+
id, tenant_id, client_id, field, origin, provider, verified_at, updated_by
|
|
169
|
+
) VALUES (
|
|
170
|
+
${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid, ${input.clientId},
|
|
171
|
+
${input.field}, ${input.origin}, ${oficial ? (input.provider ?? null) : null},
|
|
172
|
+
${oficial ? new Date().toISOString() : null}, ${input.updatedBy ?? null}
|
|
173
|
+
)
|
|
174
|
+
ON CONFLICT (tenant_id, client_id, field) DO UPDATE SET
|
|
175
|
+
origin = EXCLUDED.origin, provider = EXCLUDED.provider,
|
|
176
|
+
verified_at = EXCLUDED.verified_at, updated_by = EXCLUDED.updated_by,
|
|
177
|
+
updated_at = now()
|
|
178
|
+
-- A cláusula que preserva a decisão humana: uma atualização automática não
|
|
179
|
+
-- rebaixa um campo que alguém assumiu. Só outra pessoa faz isso.
|
|
180
|
+
WHERE client_field_provenance.origin <> 'human' OR EXCLUDED.origin = 'human'
|
|
181
|
+
`;
|
|
182
|
+
}
|
|
183
|
+
/** Os campos que uma pessoa assumiu — o autofill não os toca. */
|
|
184
|
+
async function humanOwnedFields(tx, clientId) {
|
|
185
|
+
const rows = await tx `
|
|
186
|
+
SELECT field FROM client_field_provenance
|
|
187
|
+
WHERE client_id = ${clientId} AND origin = 'human'
|
|
188
|
+
`;
|
|
189
|
+
return rows.map((r) => r.field);
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=lookup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../../../src/clients/registry/lookup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.unconfiguredCompanyRegistry = exports.isValidCnpj = void 0;
|
|
4
|
+
exports.cnpjDigits = cnpjDigits;
|
|
5
|
+
const br_documents_js_1 = require("../../import/br-documents.js");
|
|
6
|
+
Object.defineProperty(exports, "isValidCnpj", { enumerable: true, get: function () { return br_documents_js_1.isValidCnpj; } });
|
|
7
|
+
/**
|
|
8
|
+
* Dígitos do CNPJ, sem máscara.
|
|
9
|
+
*
|
|
10
|
+
* Delega a `onlyDigits`, e não repete o `replace`: o dia em que a normalização
|
|
11
|
+
* precisar tratar um caractere invisível colado de um PDF, ela precisa mudar
|
|
12
|
+
* num lugar só.
|
|
13
|
+
*/
|
|
14
|
+
function cnpjDigits(value) {
|
|
15
|
+
return (0, br_documents_js_1.onlyDigits)(value);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* O provedor que responde quando nenhum está configurado.
|
|
19
|
+
*
|
|
20
|
+
* Existe para que a ausência de contrato seja um estado NOMEADO do produto, e
|
|
21
|
+
* não uma exceção no meio de um formulário. Quem chama recebe
|
|
22
|
+
* `provider_not_configured` e mostra "não foi possível consultar
|
|
23
|
+
* automaticamente" — o cadastro manual segue funcionando.
|
|
24
|
+
*/
|
|
25
|
+
exports.unconfiguredCompanyRegistry = {
|
|
26
|
+
name: 'unconfigured',
|
|
27
|
+
official: false,
|
|
28
|
+
lookup: async (cnpj) => ({
|
|
29
|
+
status: 'failed',
|
|
30
|
+
reason: (0, br_documents_js_1.isValidCnpj)(cnpj) ? 'provider_not_configured' : 'invalid_document',
|
|
31
|
+
source: 'unconfigured',
|
|
32
|
+
}),
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../../src/clients/registry/provider.ts"],"names":[],"mappings":";;;AA0GA,gCAEC;AA5GD,kEAAuE;AAuH9D,4FAvHA,6BAAW,OAuHA;AApBpB;;;;;;GAMG;AACH,SAAgB,UAAU,CAAC,KAAa;IACtC,OAAO,IAAA,4BAAU,EAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAaD;;;;;;;GAOG;AACU,QAAA,2BAA2B,GAA4B;IAClE,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,IAAA,6BAAW,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,kBAAkB;QAC1E,MAAM,EAAE,cAAc;KACvB,CAAC;CACH,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveCompanyRegistry = resolveCompanyRegistry;
|
|
4
|
+
const serpro_js_1 = require("./serpro.js");
|
|
5
|
+
const synthetic_js_1 = require("./synthetic.js");
|
|
6
|
+
const provider_js_1 = require("./provider.js");
|
|
7
|
+
const INDISPONIVEL = (reason) => ({
|
|
8
|
+
provider: provider_js_1.unconfiguredCompanyRegistry,
|
|
9
|
+
enabled: false,
|
|
10
|
+
reason,
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* Resolve o provedor a partir do ambiente.
|
|
14
|
+
*
|
|
15
|
+
* O padrão é `none`. Um padrão que tentasse adivinhar — "tem token? então usa"
|
|
16
|
+
* — ligaria consulta paga em qualquer ambiente onde a variável vazasse, e a
|
|
17
|
+
* primeira fatura seria a notificação.
|
|
18
|
+
*/
|
|
19
|
+
function resolveCompanyRegistry(env = process.env) {
|
|
20
|
+
const escolha = (env.COMPANY_REGISTRY_PROVIDER ?? 'none').trim().toLowerCase();
|
|
21
|
+
if (escolha === '' || escolha === 'none')
|
|
22
|
+
return INDISPONIVEL('not_configured');
|
|
23
|
+
if (escolha === 'synthetic') {
|
|
24
|
+
// Sintético é `official: false` na origem, e o carimbo acompanha todo dado
|
|
25
|
+
// que ele produzir. Ver `synthetic.ts`.
|
|
26
|
+
return { provider: (0, synthetic_js_1.syntheticCompanyRegistry)(), enabled: true, reason: 'available' };
|
|
27
|
+
}
|
|
28
|
+
if (escolha === 'serpro') {
|
|
29
|
+
const token = (env.SERPRO_CONSULTA_CNPJ_TOKEN ?? '').trim();
|
|
30
|
+
if (token === '')
|
|
31
|
+
return INDISPONIVEL('missing_credential');
|
|
32
|
+
try {
|
|
33
|
+
return {
|
|
34
|
+
provider: (0, serpro_js_1.createSerproCompanyRegistry)({ token }),
|
|
35
|
+
enabled: true,
|
|
36
|
+
reason: 'available',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
if (err instanceof serpro_js_1.SerproContractUnverifiedError)
|
|
41
|
+
return INDISPONIVEL('contract_unverified');
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return INDISPONIVEL('unknown_choice');
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../../src/clients/registry/resolve.ts"],"names":[],"mappings":";;AAoDA,wDA2BC;AA/ED,2CAAyF;AACzF,iDAA0D;AAC1D,+CAA0F;AAgC1F,MAAM,YAAY,GAAG,CAAC,MAAsC,EAAwB,EAAE,CAAC,CAAC;IACtF,QAAQ,EAAE,yCAA2B;IACrC,OAAO,EAAE,KAAK;IACd,MAAM;CACP,CAAC,CAAC;AAOH;;;;;;GAMG;AACH,SAAgB,sBAAsB,CAAC,MAAmB,OAAO,CAAC,GAAG;IACnE,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,yBAAyB,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE/E,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAEhF,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC5B,2EAA2E;QAC3E,wCAAwC;QACxC,OAAO,EAAE,QAAQ,EAAE,IAAA,uCAAwB,GAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACtF,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,YAAY,CAAC,oBAAoB,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,OAAO;gBACL,QAAQ,EAAE,IAAA,uCAA2B,EAAC,EAAE,KAAK,EAAE,CAAC;gBAChD,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,WAAW;aACpB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,yCAA6B;gBAAE,OAAO,YAAY,CAAC,qBAAqB,CAAC,CAAC;YAC7F,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC,gBAAgB,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SerproContractUnverifiedError = exports.SERPRO_CONTRACT_VERIFIED = exports.SERPRO_BASE_URL = void 0;
|
|
4
|
+
exports.parseSerproPayload = parseSerproPayload;
|
|
5
|
+
exports.createSerproCompanyRegistry = createSerproCompanyRegistry;
|
|
6
|
+
const http_js_1 = require("./http.js");
|
|
7
|
+
/**
|
|
8
|
+
* Serpro — Consulta CNPJ. Escrito, e deliberadamente fechado.
|
|
9
|
+
*
|
|
10
|
+
* ## Por que existe um adaptador que ninguém pode ligar
|
|
11
|
+
*
|
|
12
|
+
* A descoberta desta rodada encontrou exatamente três fontes oficiais de dado
|
|
13
|
+
* cadastral de CNPJ, e nenhuma delas está disponível para este produto hoje:
|
|
14
|
+
*
|
|
15
|
+
* - **Conecta gov.br (Receita Federal)** — restrita a órgãos públicos. A SC é
|
|
16
|
+
* uma empresa privada. Não é questão de pedir acesso; é fora do escopo.
|
|
17
|
+
* - **Serpro Consulta CNPJ** — oficial e disponível, mediante **contrato
|
|
18
|
+
* comercial**. Há período de avaliação (30 dias / 3.000 consultas), que
|
|
19
|
+
* também exige cadastro e aceite de termos por uma pessoa jurídica.
|
|
20
|
+
* - **Dados Abertos da RFB** — oficial, mas são dumps CSV mensais. Servem
|
|
21
|
+
* para conferência em lote; não respondem "consulte este CNPJ agora".
|
|
22
|
+
*
|
|
23
|
+
* Agregadores comunitários gratuitos resolveriam o problema técnico hoje e
|
|
24
|
+
* criariam outro: o dado não teria autoria, e a etiqueta de proveniência diria
|
|
25
|
+
* "oficial" sobre algo que ninguém oficial afirmou. Ficam fora.
|
|
26
|
+
*
|
|
27
|
+
* ## Por que não basta ter o token
|
|
28
|
+
*
|
|
29
|
+
* **Os nomes dos campos da resposta não foram conferidos contra o serviço
|
|
30
|
+
* real.** O `parse` abaixo é a melhor leitura da documentação pública, e uma
|
|
31
|
+
* leitura não conferida que roda em produção é como um campo silenciosamente
|
|
32
|
+
* vazio vira "a Receita não informou" — indistinguível de uma ausência
|
|
33
|
+
* verdadeira, e muito pior, porque ninguém vai procurar.
|
|
34
|
+
*
|
|
35
|
+
* Enquanto `SERPRO_CONTRACT_VERIFIED` for `false`, este provedor não é
|
|
36
|
+
* construível, mesmo com credencial. Ligar exige DUAS coisas: o contrato
|
|
37
|
+
* (humano, externo) e a conferência do envelope contra uma resposta real.
|
|
38
|
+
*/
|
|
39
|
+
exports.SERPRO_BASE_URL = 'https://gateway.apiserpro.serpro.gov.br/consulta-cnpj-df/v2';
|
|
40
|
+
/**
|
|
41
|
+
* O envelope de resposta foi conferido contra o serviço real?
|
|
42
|
+
*
|
|
43
|
+
* Vira `true` numa mudança de código com a evidência anexada — nunca por
|
|
44
|
+
* variável de ambiente. Uma flag de ambiente permitiria ligar em produção o que
|
|
45
|
+
* ninguém verificou, que é precisamente o que esta constante impede.
|
|
46
|
+
*/
|
|
47
|
+
exports.SERPRO_CONTRACT_VERIFIED = false;
|
|
48
|
+
class SerproContractUnverifiedError extends Error {
|
|
49
|
+
constructor() {
|
|
50
|
+
super('o envelope de resposta do Serpro Consulta CNPJ não foi conferido contra o serviço real; ' +
|
|
51
|
+
'o provedor permanece fechado até que seja');
|
|
52
|
+
this.name = 'SerproContractUnverifiedError';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.SerproContractUnverifiedError = SerproContractUnverifiedError;
|
|
56
|
+
function texto(v) {
|
|
57
|
+
const s = typeof v === 'string' ? v.trim() : typeof v === 'number' ? String(v) : '';
|
|
58
|
+
return s === '' ? null : s;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Situação cadastral pelo código da RFB.
|
|
62
|
+
*
|
|
63
|
+
* Código desconhecido vira `DESCONHECIDA`, e não `ATIVA`. Tratar o desconhecido
|
|
64
|
+
* como ativo faria uma empresa baixada entrar na carteira como operante — e o
|
|
65
|
+
* motor fiscal passaria a gerar obrigação para quem não tem mais nenhuma.
|
|
66
|
+
*/
|
|
67
|
+
function situacao(codigo) {
|
|
68
|
+
switch (texto(codigo)) {
|
|
69
|
+
case '2':
|
|
70
|
+
return 'ATIVA';
|
|
71
|
+
case '3':
|
|
72
|
+
return 'SUSPENSA';
|
|
73
|
+
case '4':
|
|
74
|
+
return 'INAPTA';
|
|
75
|
+
case '8':
|
|
76
|
+
return 'BAIXADA';
|
|
77
|
+
case '1':
|
|
78
|
+
return 'NULA';
|
|
79
|
+
default:
|
|
80
|
+
return 'DESCONHECIDA';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const bag = (v) => (v && typeof v === 'object' ? v : {});
|
|
84
|
+
/** Leitura da documentação pública. NÃO conferida contra resposta real. */
|
|
85
|
+
function parseSerproPayload(body) {
|
|
86
|
+
const b = bag(body);
|
|
87
|
+
const ni = texto(b.ni);
|
|
88
|
+
if (!ni)
|
|
89
|
+
return null;
|
|
90
|
+
const end = bag(b.endereco);
|
|
91
|
+
const principal = bag(b.cnaePrincipal);
|
|
92
|
+
const telefone = Array.isArray(b.telefones) ? bag(b.telefones[0]) : {};
|
|
93
|
+
const ddd = texto(telefone.ddd);
|
|
94
|
+
const numero = texto(telefone.numero);
|
|
95
|
+
return {
|
|
96
|
+
cnpj: ni,
|
|
97
|
+
legalName: texto(b.nomeEmpresarial),
|
|
98
|
+
tradeName: texto(b.nomeFantasia),
|
|
99
|
+
registrationStatus: situacao(bag(b.situacaoCadastral).codigo),
|
|
100
|
+
openedOn: texto(b.dataAbertura),
|
|
101
|
+
legalNature: texto(bag(b.naturezaJuridica).descricao),
|
|
102
|
+
size: texto(b.porte),
|
|
103
|
+
primaryActivity: texto(principal.codigo)
|
|
104
|
+
? { code: texto(principal.codigo), description: texto(principal.descricao) }
|
|
105
|
+
: null,
|
|
106
|
+
secondaryActivities: (Array.isArray(b.cnaeSecundarias) ? b.cnaeSecundarias : [])
|
|
107
|
+
.map((c) => bag(c))
|
|
108
|
+
.filter((c) => texto(c.codigo))
|
|
109
|
+
.map((c) => ({ code: texto(c.codigo), description: texto(c.descricao) })),
|
|
110
|
+
address: {
|
|
111
|
+
street: texto(end.logradouro),
|
|
112
|
+
number: texto(end.numero),
|
|
113
|
+
complement: texto(end.complemento),
|
|
114
|
+
district: texto(end.bairro),
|
|
115
|
+
zipCode: texto(end.cep),
|
|
116
|
+
municipality: texto(bag(end.municipio).descricao) ?? texto(end.municipio),
|
|
117
|
+
uf: texto(end.uf),
|
|
118
|
+
},
|
|
119
|
+
phone: ddd && numero ? `${ddd}${numero}` : numero,
|
|
120
|
+
email: texto(b.correioEletronico),
|
|
121
|
+
shareCapital: typeof b.capitalSocial === 'number' ? b.capitalSocial : null,
|
|
122
|
+
// ═══ O silêncio, preservado ═══════════════════════════════════════════
|
|
123
|
+
// Esta consulta NÃO informa opção pelo Simples nem MEI. `null` diz isso.
|
|
124
|
+
// Preencher `false` aqui — "a resposta não citou, então não é" — faria um
|
|
125
|
+
// optante do Simples ser tratado como Lucro Presumido pelo motor fiscal,
|
|
126
|
+
// por uma dedução que nenhuma fonte fez.
|
|
127
|
+
simplesOptant: null,
|
|
128
|
+
meiOptant: null,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Constrói o provedor do Serpro. Recusa enquanto o contrato não for conferido.
|
|
133
|
+
*/
|
|
134
|
+
function createSerproCompanyRegistry(options) {
|
|
135
|
+
if (!exports.SERPRO_CONTRACT_VERIFIED)
|
|
136
|
+
throw new SerproContractUnverifiedError();
|
|
137
|
+
const base = options.baseUrl ?? exports.SERPRO_BASE_URL;
|
|
138
|
+
return (0, http_js_1.createHttpCompanyRegistry)({
|
|
139
|
+
name: 'serpro',
|
|
140
|
+
official: true,
|
|
141
|
+
buildUrl: (cnpj) => `${base}/basica/${cnpj}`,
|
|
142
|
+
// A credencial vive AQUI e só aqui. Nunca na URL: query string entra em log
|
|
143
|
+
// de proxy, em `Referer` e em mensagem de erro.
|
|
144
|
+
headers: () => ({ authorization: `Bearer ${options.token}` }),
|
|
145
|
+
parse: parseSerproPayload,
|
|
146
|
+
...(options.fetchImpl ? { fetchImpl: options.fetchImpl } : {}),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=serpro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serpro.js","sourceRoot":"","sources":["../../../../src/clients/registry/serpro.ts"],"names":[],"mappings":"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"}
|