@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.
Files changed (189) hide show
  1. package/.baruk-provenance.json +4 -4
  2. package/dist/cjs/clients/ibge.js +14 -0
  3. package/dist/cjs/clients/ibge.js.map +1 -1
  4. package/dist/cjs/clients/registry/http.js +157 -0
  5. package/dist/cjs/clients/registry/http.js.map +1 -0
  6. package/dist/cjs/clients/registry/ibge-municipios.js +28 -0
  7. package/dist/cjs/clients/registry/ibge-municipios.js.map +1 -0
  8. package/dist/cjs/clients/registry/ibge.js +63 -0
  9. package/dist/cjs/clients/registry/ibge.js.map +1 -0
  10. package/dist/cjs/clients/registry/lookup.js +191 -0
  11. package/dist/cjs/clients/registry/lookup.js.map +1 -0
  12. package/dist/cjs/clients/registry/provider.js +34 -0
  13. package/dist/cjs/clients/registry/provider.js.map +1 -0
  14. package/dist/cjs/clients/registry/resolve.js +47 -0
  15. package/dist/cjs/clients/registry/resolve.js.map +1 -0
  16. package/dist/cjs/clients/registry/serpro.js +149 -0
  17. package/dist/cjs/clients/registry/serpro.js.map +1 -0
  18. package/dist/cjs/clients/registry/service.js +230 -0
  19. package/dist/cjs/clients/registry/service.js.map +1 -0
  20. package/dist/cjs/clients/registry/synthetic.js +165 -0
  21. package/dist/cjs/clients/registry/synthetic.js.map +1 -0
  22. package/dist/cjs/clients/repository.js +6 -2
  23. package/dist/cjs/clients/repository.js.map +1 -1
  24. package/dist/cjs/db/provision-e2e-identity.js +8 -3
  25. package/dist/cjs/db/provision-e2e-identity.js.map +1 -1
  26. package/dist/cjs/fiscal/collection/authorization.js +186 -0
  27. package/dist/cjs/fiscal/collection/authorization.js.map +1 -0
  28. package/dist/cjs/fiscal/collection/competence.js +97 -0
  29. package/dist/cjs/fiscal/collection/competence.js.map +1 -0
  30. package/dist/cjs/fiscal/collection/first-contact.js +204 -0
  31. package/dist/cjs/fiscal/collection/first-contact.js.map +1 -0
  32. package/dist/cjs/fiscal/collection/plan.js +122 -0
  33. package/dist/cjs/fiscal/collection/plan.js.map +1 -0
  34. package/dist/cjs/fiscal/coverage/model.js +11 -1
  35. package/dist/cjs/fiscal/coverage/model.js.map +1 -1
  36. package/dist/cjs/fiscal/credentials/inspect.js +182 -0
  37. package/dist/cjs/fiscal/credentials/inspect.js.map +1 -0
  38. package/dist/cjs/fiscal/credentials/material.js +1 -1
  39. package/dist/cjs/fiscal/credentials/material.js.map +1 -1
  40. package/dist/cjs/fiscal/credentials/onboarding.js +266 -0
  41. package/dist/cjs/fiscal/credentials/onboarding.js.map +1 -0
  42. package/dist/cjs/fiscal/credentials/readiness.js +29 -2
  43. package/dist/cjs/fiscal/credentials/readiness.js.map +1 -1
  44. package/dist/cjs/fiscal/enrollment.js +134 -0
  45. package/dist/cjs/fiscal/enrollment.js.map +1 -0
  46. package/dist/cjs/fiscal/transport/synthetic-tls.js +52 -0
  47. package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -1
  48. package/dist/cjs/index.js +196 -113
  49. package/dist/cjs/index.js.map +1 -1
  50. package/dist/cjs/legal/documents.js +64 -4
  51. package/dist/cjs/legal/documents.js.map +1 -1
  52. package/dist/cjs/legal/types.js.map +1 -1
  53. package/dist/cjs/platform/capabilities.js +29 -0
  54. package/dist/cjs/platform/capabilities.js.map +1 -1
  55. package/dist/cjs/rbac/catalog.js +78 -2
  56. package/dist/cjs/rbac/catalog.js.map +1 -1
  57. package/dist/cjs/subscription-billing/index.js +8 -1
  58. package/dist/cjs/subscription-billing/index.js.map +1 -1
  59. package/dist/cjs/subscription-billing/platform-exemption.js +121 -0
  60. package/dist/cjs/subscription-billing/platform-exemption.js.map +1 -0
  61. package/dist/cjs/subscription-billing/service.js +93 -1
  62. package/dist/cjs/subscription-billing/service.js.map +1 -1
  63. package/dist/cjs/vault/repository.js +92 -5
  64. package/dist/cjs/vault/repository.js.map +1 -1
  65. package/dist/clients/ibge.d.ts.map +1 -1
  66. package/dist/clients/ibge.js +14 -0
  67. package/dist/clients/ibge.js.map +1 -1
  68. package/dist/clients/registry/http.d.ts +61 -0
  69. package/dist/clients/registry/http.d.ts.map +1 -0
  70. package/dist/clients/registry/http.js +151 -0
  71. package/dist/clients/registry/http.js.map +1 -0
  72. package/dist/clients/registry/ibge-municipios.d.ts +25 -0
  73. package/dist/clients/registry/ibge-municipios.d.ts.map +1 -0
  74. package/dist/clients/registry/ibge-municipios.js +25 -0
  75. package/dist/clients/registry/ibge-municipios.js.map +1 -0
  76. package/dist/clients/registry/ibge.d.ts +62 -0
  77. package/dist/clients/registry/ibge.d.ts.map +1 -0
  78. package/dist/clients/registry/ibge.js +57 -0
  79. package/dist/clients/registry/ibge.js.map +1 -0
  80. package/dist/clients/registry/lookup.d.ts +94 -0
  81. package/dist/clients/registry/lookup.d.ts.map +1 -0
  82. package/dist/clients/registry/lookup.js +184 -0
  83. package/dist/clients/registry/lookup.js.map +1 -0
  84. package/dist/clients/registry/provider.d.ts +124 -0
  85. package/dist/clients/registry/provider.d.ts.map +1 -0
  86. package/dist/clients/registry/provider.js +39 -0
  87. package/dist/clients/registry/provider.js.map +1 -0
  88. package/dist/clients/registry/resolve.d.ts +36 -0
  89. package/dist/clients/registry/resolve.d.ts.map +1 -0
  90. package/dist/clients/registry/resolve.js +44 -0
  91. package/dist/clients/registry/resolve.js.map +1 -0
  92. package/dist/clients/registry/serpro.d.ts +57 -0
  93. package/dist/clients/registry/serpro.d.ts.map +1 -0
  94. package/dist/clients/registry/serpro.js +143 -0
  95. package/dist/clients/registry/serpro.js.map +1 -0
  96. package/dist/clients/registry/service.d.ts +59 -0
  97. package/dist/clients/registry/service.d.ts.map +1 -0
  98. package/dist/clients/registry/service.js +225 -0
  99. package/dist/clients/registry/service.js.map +1 -0
  100. package/dist/clients/registry/synthetic.d.ts +30 -0
  101. package/dist/clients/registry/synthetic.d.ts.map +1 -0
  102. package/dist/clients/registry/synthetic.js +161 -0
  103. package/dist/clients/registry/synthetic.js.map +1 -0
  104. package/dist/clients/repository.d.ts +4 -0
  105. package/dist/clients/repository.d.ts.map +1 -1
  106. package/dist/clients/repository.js +6 -2
  107. package/dist/clients/repository.js.map +1 -1
  108. package/dist/db/provision-e2e-identity.js +8 -3
  109. package/dist/db/provision-e2e-identity.js.map +1 -1
  110. package/dist/fiscal/collection/authorization.d.ts +152 -0
  111. package/dist/fiscal/collection/authorization.d.ts.map +1 -0
  112. package/dist/fiscal/collection/authorization.js +178 -0
  113. package/dist/fiscal/collection/authorization.js.map +1 -0
  114. package/dist/fiscal/collection/competence.d.ts +66 -0
  115. package/dist/fiscal/collection/competence.d.ts.map +1 -0
  116. package/dist/fiscal/collection/competence.js +90 -0
  117. package/dist/fiscal/collection/competence.js.map +1 -0
  118. package/dist/fiscal/collection/first-contact.d.ts +103 -0
  119. package/dist/fiscal/collection/first-contact.d.ts.map +1 -0
  120. package/dist/fiscal/collection/first-contact.js +201 -0
  121. package/dist/fiscal/collection/first-contact.js.map +1 -0
  122. package/dist/fiscal/collection/plan.d.ts +74 -0
  123. package/dist/fiscal/collection/plan.d.ts.map +1 -0
  124. package/dist/fiscal/collection/plan.js +119 -0
  125. package/dist/fiscal/collection/plan.js.map +1 -0
  126. package/dist/fiscal/coverage/model.d.ts +28 -0
  127. package/dist/fiscal/coverage/model.d.ts.map +1 -1
  128. package/dist/fiscal/coverage/model.js +11 -1
  129. package/dist/fiscal/coverage/model.js.map +1 -1
  130. package/dist/fiscal/credentials/inspect.d.ts +114 -0
  131. package/dist/fiscal/credentials/inspect.d.ts.map +1 -0
  132. package/dist/fiscal/credentials/inspect.js +178 -0
  133. package/dist/fiscal/credentials/inspect.js.map +1 -0
  134. package/dist/fiscal/credentials/material.js +2 -2
  135. package/dist/fiscal/credentials/material.js.map +1 -1
  136. package/dist/fiscal/credentials/onboarding.d.ts +119 -0
  137. package/dist/fiscal/credentials/onboarding.d.ts.map +1 -0
  138. package/dist/fiscal/credentials/onboarding.js +259 -0
  139. package/dist/fiscal/credentials/onboarding.js.map +1 -0
  140. package/dist/fiscal/credentials/readiness.d.ts +30 -3
  141. package/dist/fiscal/credentials/readiness.d.ts.map +1 -1
  142. package/dist/fiscal/credentials/readiness.js +29 -2
  143. package/dist/fiscal/credentials/readiness.js.map +1 -1
  144. package/dist/fiscal/enrollment.d.ts +91 -0
  145. package/dist/fiscal/enrollment.d.ts.map +1 -0
  146. package/dist/fiscal/enrollment.js +126 -0
  147. package/dist/fiscal/enrollment.js.map +1 -0
  148. package/dist/fiscal/transport/synthetic-tls.d.ts +19 -0
  149. package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -1
  150. package/dist/fiscal/transport/synthetic-tls.js +51 -0
  151. package/dist/fiscal/transport/synthetic-tls.js.map +1 -1
  152. package/dist/index.d.ts +32 -4
  153. package/dist/index.d.ts.map +1 -1
  154. package/dist/index.js +22 -2
  155. package/dist/index.js.map +1 -1
  156. package/dist/legal/documents.d.ts.map +1 -1
  157. package/dist/legal/documents.js +64 -4
  158. package/dist/legal/documents.js.map +1 -1
  159. package/dist/legal/index.d.ts +1 -1
  160. package/dist/legal/index.d.ts.map +1 -1
  161. package/dist/legal/types.d.ts +77 -0
  162. package/dist/legal/types.d.ts.map +1 -1
  163. package/dist/legal/types.js.map +1 -1
  164. package/dist/platform/capabilities.d.ts.map +1 -1
  165. package/dist/platform/capabilities.js +29 -0
  166. package/dist/platform/capabilities.js.map +1 -1
  167. package/dist/rbac/catalog.d.ts.map +1 -1
  168. package/dist/rbac/catalog.js +78 -2
  169. package/dist/rbac/catalog.js.map +1 -1
  170. package/dist/subscription-billing/index.d.ts +3 -1
  171. package/dist/subscription-billing/index.d.ts.map +1 -1
  172. package/dist/subscription-billing/index.js +2 -1
  173. package/dist/subscription-billing/index.js.map +1 -1
  174. package/dist/subscription-billing/platform-exemption.d.ts +89 -0
  175. package/dist/subscription-billing/platform-exemption.d.ts.map +1 -0
  176. package/dist/subscription-billing/platform-exemption.js +113 -0
  177. package/dist/subscription-billing/platform-exemption.js.map +1 -0
  178. package/dist/subscription-billing/service.d.ts +53 -0
  179. package/dist/subscription-billing/service.d.ts.map +1 -1
  180. package/dist/subscription-billing/service.js +92 -1
  181. package/dist/subscription-billing/service.js.map +1 -1
  182. package/dist/vault/repository.d.ts +69 -1
  183. package/dist/vault/repository.d.ts.map +1 -1
  184. package/dist/vault/repository.js +88 -5
  185. package/dist/vault/repository.js.map +1 -1
  186. package/package.json +3 -2
  187. package/src/db/migrations/0060_fiscal_credential_vault_and_run_authorization.sql +321 -0
  188. package/src/db/migrations/0061_client_official_registry_provenance.sql +193 -0
  189. 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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"}