@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 @@
1
+ {"version":3,"file":"serpro.js","sourceRoot":"","sources":["../../../src/clients/registry/serpro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { Tx } from '../../db/client.js';
2
+ import { type OfficialField, type RegistryLookupOutcome } from './lookup.js';
3
+ import { type CompanyLookupFailure, type CompanyRegistryProvider } from './provider.js';
4
+ /**
5
+ * A consulta com as três defesas que o provedor não dá.
6
+ *
7
+ * Nenhuma delas é sobre a rede estar lenta. As três são sobre o que uma
8
+ * consulta barata e repetível permite fazer:
9
+ *
10
+ * **Cota** — um CNPJ tem 14 dígitos e o dígito verificador reduz o espaço a
11
+ * ~10^12, mas uma varredura por faixa é perfeitamente viável. Sem teto, a
12
+ * primeira conta comprometida vira um raspador do cadastro nacional financiado
13
+ * pelo contrato do escritório. O teto é por TENANT, não por usuário: quem varre
14
+ * cria usuários.
15
+ *
16
+ * **Cache** — a mesma tela consultada duas vezes em cinco minutos não pode
17
+ * gastar duas requisições de um contrato pago. E o cache é só de SUCESSO:
18
+ * cachear uma indisponibilidade de um minuto a deixaria colada no CNPJ pelo
19
+ * resto do TTL, e o operador veria "provedor fora do ar" com o provedor no ar.
20
+ *
21
+ * **Disjuntor** — mesma política do motor fiscal (três falhas seguidas, espera
22
+ * que dobra), mas em memória de processo, e é uma escolha, não um esquecimento:
23
+ * a consulta de CNPJ é interativa. Alguém está olhando a tela. Persistir o
24
+ * estado faria uma queda de dez minutos do provedor manter a tela recusando
25
+ * depois que ele voltou, e o operador não tem como saber que a recusa é nossa.
26
+ */
27
+ /** Teto de consultas por tenant na janela. */
28
+ export declare const LOOKUP_QUOTA_LIMIT = 120;
29
+ export declare const LOOKUP_QUOTA_WINDOW_MS: number;
30
+ /** Quanto tempo um retrato bem-sucedido responde sem tocar a rede. */
31
+ export declare const LOOKUP_CACHE_TTL_MS: number;
32
+ /** Falhas seguidas que abrem o disjuntor — mesma régua do motor fiscal. */
33
+ export declare const LOOKUP_CIRCUIT_THRESHOLD = 3;
34
+ export declare const LOOKUP_CIRCUIT_OPEN_MS: number;
35
+ export type LookupRefusal = CompanyLookupFailure | 'quota_exceeded' | 'circuit_open' | 'not_permitted';
36
+ export interface RegistryLookupResponse extends RegistryLookupOutcome {
37
+ /** De onde veio a resposta: `network` tocou o provedor, `cache` não tocou. */
38
+ served: 'network' | 'cache';
39
+ reason?: LookupRefusal;
40
+ }
41
+ /** Só para os testes: um disjuntor herdado entre casos esconderia o defeito. */
42
+ export declare function resetLookupCircuits(): void;
43
+ export interface LookupRequest {
44
+ tenantId: string;
45
+ actorId: string | null;
46
+ cnpj: string;
47
+ /** O cadastro atual, quando a consulta é de atualização de um cliente. */
48
+ current?: Partial<Record<OfficialField, string | null>>;
49
+ now?: Date;
50
+ }
51
+ /**
52
+ * Consulta o CNPJ com cota, cache, disjuntor e trilha — e NÃO grava cadastro.
53
+ *
54
+ * O que ela devolve são propostas. Aplicá-las é outro ato, com outra assinatura
55
+ * e outra permissão: quem pode consultar não necessariamente pode alterar o
56
+ * cadastro de um cliente.
57
+ */
58
+ export declare function lookupCompanyRegistry(tx: Tx, provider: CompanyRegistryProvider, req: LookupRequest): Promise<RegistryLookupResponse>;
59
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/clients/registry/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAkB,KAAK,aAAa,EAAE,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAGL,KAAK,oBAAoB,EAEzB,KAAK,uBAAuB,EAE7B,MAAM,eAAe,CAAC;AAEvB;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,8CAA8C;AAC9C,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,sBAAsB,QAAc,CAAC;AAElD,sEAAsE;AACtE,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAE/C,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,eAAO,MAAM,sBAAsB,QAAa,CAAC;AAEjD,MAAM,MAAM,aAAa,GACvB,oBAAoB,GAAG,gBAAgB,GAAG,cAAc,GAAG,eAAe,CAAC;AAE7E,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IACnE,8EAA8E;IAC9E,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAcD,gFAAgF;AAChF,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAkCD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAmED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,uBAAuB,EACjC,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,sBAAsB,CAAC,CA6GjC"}
@@ -0,0 +1,225 @@
1
+ import { uuidv7 } from '@baruk/shared';
2
+ import { appendAudit } from '../../audit/audit.js';
3
+ import { resolveMunicipality } from './ibge.js';
4
+ import { buildProposals } from './lookup.js';
5
+ import { cnpjDigits, isValidCnpj, } from './provider.js';
6
+ /**
7
+ * A consulta com as três defesas que o provedor não dá.
8
+ *
9
+ * Nenhuma delas é sobre a rede estar lenta. As três são sobre o que uma
10
+ * consulta barata e repetível permite fazer:
11
+ *
12
+ * **Cota** — um CNPJ tem 14 dígitos e o dígito verificador reduz o espaço a
13
+ * ~10^12, mas uma varredura por faixa é perfeitamente viável. Sem teto, a
14
+ * primeira conta comprometida vira um raspador do cadastro nacional financiado
15
+ * pelo contrato do escritório. O teto é por TENANT, não por usuário: quem varre
16
+ * cria usuários.
17
+ *
18
+ * **Cache** — a mesma tela consultada duas vezes em cinco minutos não pode
19
+ * gastar duas requisições de um contrato pago. E o cache é só de SUCESSO:
20
+ * cachear uma indisponibilidade de um minuto a deixaria colada no CNPJ pelo
21
+ * resto do TTL, e o operador veria "provedor fora do ar" com o provedor no ar.
22
+ *
23
+ * **Disjuntor** — mesma política do motor fiscal (três falhas seguidas, espera
24
+ * que dobra), mas em memória de processo, e é uma escolha, não um esquecimento:
25
+ * a consulta de CNPJ é interativa. Alguém está olhando a tela. Persistir o
26
+ * estado faria uma queda de dez minutos do provedor manter a tela recusando
27
+ * depois que ele voltou, e o operador não tem como saber que a recusa é nossa.
28
+ */
29
+ /** Teto de consultas por tenant na janela. */
30
+ export const LOOKUP_QUOTA_LIMIT = 120;
31
+ export const LOOKUP_QUOTA_WINDOW_MS = 60 * 60_000;
32
+ /** Quanto tempo um retrato bem-sucedido responde sem tocar a rede. */
33
+ export const LOOKUP_CACHE_TTL_MS = 15 * 60_000;
34
+ /** Falhas seguidas que abrem o disjuntor — mesma régua do motor fiscal. */
35
+ export const LOOKUP_CIRCUIT_THRESHOLD = 3;
36
+ export const LOOKUP_CIRCUIT_OPEN_MS = 2 * 60_000;
37
+ /**
38
+ * Estado por (processo, provedor). Um `Map` de módulo, e não um campo de
39
+ * instância: o serviço é chamado por função, sem objeto de longa vida onde
40
+ * pendurar isso.
41
+ */
42
+ const circuits = new Map();
43
+ /** Só para os testes: um disjuntor herdado entre casos esconderia o defeito. */
44
+ export function resetLookupCircuits() {
45
+ circuits.clear();
46
+ }
47
+ function circuitAllows(provider, now) {
48
+ const c = circuits.get(provider);
49
+ return !c || c.openUntil <= now;
50
+ }
51
+ function circuitRecord(provider, ok, now) {
52
+ if (ok) {
53
+ circuits.delete(provider);
54
+ return;
55
+ }
56
+ const c = circuits.get(provider) ?? { failures: 0, openUntil: 0 };
57
+ c.failures += 1;
58
+ if (c.failures >= LOOKUP_CIRCUIT_THRESHOLD) {
59
+ // O expoente conta as falhas ALÉM do limite, como no motor fiscal: sem
60
+ // isso a terceira falha já pediria a espera de uma décima segunda.
61
+ const excedente = Math.min(c.failures - LOOKUP_CIRCUIT_THRESHOLD, 4);
62
+ c.openUntil = now + LOOKUP_CIRCUIT_OPEN_MS * 2 ** excedente;
63
+ }
64
+ circuits.set(provider, c);
65
+ }
66
+ /**
67
+ * Falhas que contam contra o PROVEDOR.
68
+ *
69
+ * Um CNPJ que não existe é resposta correta de um provedor saudável — contá-la
70
+ * abriria o disjuntor para o escritório inteiro porque alguém digitou errado
71
+ * três vezes. `invalid_document` sequer chega à rede.
72
+ */
73
+ function countsAgainstProvider(reason) {
74
+ return reason === 'provider_unavailable' || reason === 'unexpected_payload';
75
+ }
76
+ async function quotaUsed(tx, since) {
77
+ const [row] = await tx `
78
+ SELECT count(*)::text AS n FROM client_registry_lookup
79
+ WHERE created_at >= ${since}
80
+ `;
81
+ return Number(row?.n ?? '0');
82
+ }
83
+ async function cached(tx, documento, provider, since) {
84
+ const [row] = await tx `
85
+ SELECT payload FROM client_registry_lookup
86
+ WHERE document_digits = ${documento} AND provider = ${provider}
87
+ AND outcome = 'ok' AND created_at >= ${since}
88
+ ORDER BY created_at DESC
89
+ LIMIT 1
90
+ `;
91
+ return row?.payload ?? null;
92
+ }
93
+ async function recordLookup(tx, input) {
94
+ await tx `
95
+ INSERT INTO client_registry_lookup (
96
+ id, tenant_id, document_digits, provider, outcome, failure_reason, payload, requested_by
97
+ ) VALUES (
98
+ ${uuidv7()}, ${input.tenantId}, ${input.documento}, ${input.provider},
99
+ ${input.outcome}, ${input.reason ?? null},
100
+ ${input.payload ? tx.json(input.payload) : null}, ${input.actorId}
101
+ )
102
+ `;
103
+ }
104
+ function montar(record, provider, current, served) {
105
+ const ibge = resolveMunicipality(record.address.municipality ?? '', record.address.uf);
106
+ return {
107
+ status: 'ok',
108
+ provider: provider.name,
109
+ official: provider.official,
110
+ record,
111
+ ibge,
112
+ proposals: buildProposals(record, current, ibge),
113
+ served,
114
+ };
115
+ }
116
+ /**
117
+ * Consulta o CNPJ com cota, cache, disjuntor e trilha — e NÃO grava cadastro.
118
+ *
119
+ * O que ela devolve são propostas. Aplicá-las é outro ato, com outra assinatura
120
+ * e outra permissão: quem pode consultar não necessariamente pode alterar o
121
+ * cadastro de um cliente.
122
+ */
123
+ export async function lookupCompanyRegistry(tx, provider, req) {
124
+ const agora = req.now ?? new Date();
125
+ const ms = agora.getTime();
126
+ const documento = cnpjDigits(req.cnpj);
127
+ const current = req.current ?? {};
128
+ const recusar = async (reason, opts = { registra: true }) => {
129
+ if (opts.registra) {
130
+ await recordLookup(tx, {
131
+ tenantId: req.tenantId,
132
+ documento,
133
+ provider: provider.name,
134
+ outcome: 'failed',
135
+ reason,
136
+ actorId: req.actorId,
137
+ });
138
+ }
139
+ await appendAudit(tx, {
140
+ actorId: req.actorId,
141
+ action: 'cnpj_lookup_failed',
142
+ resourceType: 'client_registry_lookup',
143
+ resourceId: null,
144
+ // O documento inteiro NÃO entra na trilha: ele identifica uma empresa, e
145
+ // a trilha é lida por gente que não precisa saber por quem se perguntou.
146
+ // O sufixo basta para casar dois eventos da mesma consulta.
147
+ metadata: { provider: provider.name, reason, documentTail: documento.slice(-6) },
148
+ });
149
+ return {
150
+ status: 'failed',
151
+ provider: provider.name,
152
+ official: provider.official,
153
+ reason,
154
+ proposals: [],
155
+ served: 'network',
156
+ };
157
+ };
158
+ // Documento inválido nem chega à contagem: reprovar aqui não gasta cota nem
159
+ // toca o provedor, e um dígito errado não pode consumir o orçamento de quem
160
+ // digitou certo depois.
161
+ if (!isValidCnpj(documento))
162
+ return recusar('invalid_document', { registra: false });
163
+ const usadas = await quotaUsed(tx, new Date(ms - LOOKUP_QUOTA_WINDOW_MS));
164
+ if (usadas >= LOOKUP_QUOTA_LIMIT)
165
+ return recusar('quota_exceeded', { registra: false });
166
+ const doCache = await cached(tx, documento, provider.name, new Date(ms - LOOKUP_CACHE_TTL_MS));
167
+ if (doCache) {
168
+ await appendAudit(tx, {
169
+ actorId: req.actorId,
170
+ action: 'cnpj_lookup_success',
171
+ resourceType: 'client_registry_lookup',
172
+ resourceId: null,
173
+ metadata: { provider: provider.name, served: 'cache', documentTail: documento.slice(-6) },
174
+ });
175
+ return montar(doCache, provider, current, 'cache');
176
+ }
177
+ if (!circuitAllows(provider.name, ms))
178
+ return recusar('circuit_open', { registra: false });
179
+ await appendAudit(tx, {
180
+ actorId: req.actorId,
181
+ action: 'cnpj_lookup_requested',
182
+ resourceType: 'client_registry_lookup',
183
+ resourceId: null,
184
+ metadata: { provider: provider.name, documentTail: documento.slice(-6) },
185
+ });
186
+ let resultado;
187
+ try {
188
+ resultado = await provider.lookup(documento);
189
+ }
190
+ catch {
191
+ // Nenhuma exceção de provedor atravessa com a sua mensagem: um cliente HTTP
192
+ // cita a URL, e URL de provedor pode carregar credencial no query string.
193
+ circuitRecord(provider.name, false, ms);
194
+ return recusar('provider_unavailable');
195
+ }
196
+ if (resultado.status === 'failed') {
197
+ if (countsAgainstProvider(resultado.reason))
198
+ circuitRecord(provider.name, false, ms);
199
+ return recusar(resultado.reason);
200
+ }
201
+ circuitRecord(provider.name, true, ms);
202
+ await recordLookup(tx, {
203
+ tenantId: req.tenantId,
204
+ documento,
205
+ provider: provider.name,
206
+ outcome: 'ok',
207
+ payload: resultado.record,
208
+ actorId: req.actorId,
209
+ });
210
+ await appendAudit(tx, {
211
+ actorId: req.actorId,
212
+ action: 'cnpj_lookup_success',
213
+ resourceType: 'client_registry_lookup',
214
+ resourceId: null,
215
+ metadata: {
216
+ provider: provider.name,
217
+ official: provider.official,
218
+ served: 'network',
219
+ registrationStatus: resultado.record.registrationStatus,
220
+ documentTail: documento.slice(-6),
221
+ },
222
+ });
223
+ return montar(resultado.record, provider, current, 'network');
224
+ }
225
+ //# 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,30 @@
1
+ import { type CompanyRegistryProvider, type CompanyLookupFailure } from './provider.js';
2
+ export interface SyntheticOptions {
3
+ /** Quando dado, toda consulta devolve este desfecho — útil para um caso só. */
4
+ force?: CompanyLookupFailure;
5
+ /** Contador de chamadas, para provar que o cache evitou a rede. */
6
+ onCall?: (cnpj: string) => void;
7
+ }
8
+ export declare function syntheticCompanyRegistry(options?: SyntheticOptions): CompanyRegistryProvider;
9
+ /** Os CNPJs sintéticos, nomeados — para o teste citar o caso, não o número. */
10
+ export declare const SYNTHETIC_CNPJ: {
11
+ readonly ativaCompleta: "11222333000181";
12
+ readonly ativaSemCache: "30000000000152";
13
+ readonly ativaSemCache2: "30000000000233";
14
+ readonly semNomeFantasia: "11444777000161";
15
+ readonly semContato: "19131243000197";
16
+ readonly baixada: "34028316000103";
17
+ readonly inapta: "33000167000101";
18
+ readonly variosCnae: "60746948000112";
19
+ readonly mei: "45283163000167";
20
+ readonly naoOptanteSimples: "47960950000121";
21
+ readonly regimeNaoInformado: "07526557000100";
22
+ readonly municipioDesconhecido: "02558157000162";
23
+ readonly municipioAmbiguo: "61695227000193";
24
+ readonly naoEncontrada: "00000000000191";
25
+ readonly limiteExcedido: "15436940000103";
26
+ readonly provedorForaDoAr: "92660406000119";
27
+ readonly tempoEsgotado: "76535764000143";
28
+ readonly respostaIlegivel: "05570714000159";
29
+ };
30
+ //# sourceMappingURL=synthetic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synthetic.d.ts","sourceRoot":"","sources":["../../../src/clients/registry/synthetic.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,uBAAuB,EAE5B,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AAmHvB,MAAM,WAAW,gBAAgB;IAC/B,+EAA+E;IAC/E,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,mEAAmE;IACnE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,gBAAqB,GAAG,uBAAuB,CAsChG;AAED,+EAA+E;AAC/E,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;CAmBjB,CAAC"}
@@ -0,0 +1,161 @@
1
+ import { cnpjDigits, isValidCnpj, } from './provider.js';
2
+ /**
3
+ * Um provedor de mentira, para provar o produto sem contrato.
4
+ *
5
+ * ## Por que ele é `official: false`, e por que isso importa
6
+ *
7
+ * Todo retrato que ele devolve entra no banco carimbado como NÃO oficial. Sem
8
+ * esse carimbo, um dado sintético usado num ambiente de demonstração ficaria
9
+ * indistinguível de um dado da Receita — e a etiqueta de proveniência, que
10
+ * existe justamente para dizer o quanto se confia num campo, viraria decoração.
11
+ *
12
+ * ## Os cenários vivem no número
13
+ *
14
+ * Cada CNPJ da tabela abaixo É um caso de teste: empresa baixada, sem nome
15
+ * fantasia, sem e-mail, Simples que a fonte não informou, município que o IBGE
16
+ * não conhece. Espalhar isso por mocks locais faria cada teste inventar a sua
17
+ * própria versão de "empresa inapta" — e duas versões divergentes de um mesmo
18
+ * conceito é como um bug passa entre elas.
19
+ */
20
+ const BASE = {
21
+ cnpj: '',
22
+ legalName: 'EMPRESA SINTETICA LTDA',
23
+ tradeName: 'SINTETICA',
24
+ registrationStatus: 'ATIVA',
25
+ openedOn: '2015-03-10',
26
+ legalNature: '206-2 - Sociedade Empresária Limitada',
27
+ size: 'ME',
28
+ primaryActivity: { code: '4712100', description: 'Comércio varejista de mercadorias em geral' },
29
+ secondaryActivities: [],
30
+ address: {
31
+ street: 'Rua das Provas',
32
+ number: '100',
33
+ complement: null,
34
+ district: 'Setor Central',
35
+ zipCode: '74000-000',
36
+ municipality: 'Goiânia',
37
+ uf: 'GO',
38
+ },
39
+ phone: '(62) 3000-0000',
40
+ email: 'contato@sintetica.example',
41
+ shareCapital: 50000,
42
+ simplesOptant: true,
43
+ meiOptant: false,
44
+ };
45
+ /** Cenários felizes: o CNPJ escolhe qual retrato volta. */
46
+ const RETRATOS = {
47
+ // Ativa, completa, optante do Simples — o caso comum.
48
+ '11222333000181': {},
49
+ // Gêmeas da anterior, e existem por uma razão de teste: o cache é por
50
+ // (tenant, documento), então um caso que precisa MESMO tocar a rede não pode
51
+ // reusar um CNPJ que outro caso já consultou.
52
+ '30000000000152': { tradeName: 'SINTETICA II' },
53
+ '30000000000233': { tradeName: 'SINTETICA III' },
54
+ // Sem nome fantasia: a tela não pode mostrar "undefined" nem cair para a
55
+ // razão social sem dizer que caiu.
56
+ '11444777000161': { tradeName: null, legalName: 'COMERCIO SEM FANTASIA LTDA' },
57
+ // Sem e-mail e sem telefone: os dois campos que o escritório mais preenche à
58
+ // mão, e que a fonte oficial mais frequentemente não tem.
59
+ '19131243000197': { email: null, phone: null },
60
+ // Baixada — não é erro de consulta. A empresa existe e está encerrada, e o
61
+ // cadastro não pode tratar isso como "não encontrado".
62
+ '34028316000103': { registrationStatus: 'BAIXADA', tradeName: 'ENCERRADA' },
63
+ // Inapta: opera, mas com pendência. Distinta de baixada.
64
+ '33000167000101': { registrationStatus: 'INAPTA' },
65
+ // Vários CNAEs secundários: a tela precisa caber mais de um.
66
+ '60746948000112': {
67
+ secondaryActivities: [
68
+ { code: '4711302', description: 'Comércio varejista de mercadorias em geral' },
69
+ { code: '5620104', description: 'Fornecimento de alimentos preparados' },
70
+ { code: '8299799', description: 'Outras atividades de serviços prestados' },
71
+ ],
72
+ },
73
+ // MEI. `simplesOptant` também é true: todo MEI é do Simples, e uma fonte que
74
+ // dissesse MEI sem dizer Simples estaria incompleta, não negando.
75
+ '45283163000167': { meiOptant: true, simplesOptant: true, size: 'MEI' },
76
+ // NÃO optante do Simples. Isto é a fonte DIZENDO "não" — e continua não
77
+ // dizendo nada sobre Real ou Presumido. Ver `NON_SIMPLES_TAX_REGIME_NOT_INFERRED`.
78
+ '47960950000121': { simplesOptant: false, size: 'DEMAIS' },
79
+ // A fonte SILENCIOU sobre o regime. `null` não é `false`: aqui o produto tem
80
+ // de dizer "não informado", nunca "não é do Simples".
81
+ '07526557000100': { simplesOptant: null, meiOptant: null },
82
+ // Município que o IBGE não resolve pelo nome que a fonte usou. O código não
83
+ // pode ser adivinhado — a tela pergunta.
84
+ '02558157000162': {
85
+ address: { ...BASE.address, municipality: 'Vila Que Nao Existe', uf: 'GO' },
86
+ },
87
+ // Município ambíguo sem UF confiável: "Bom Jesus" existe em cinco estados.
88
+ '61695227000193': {
89
+ address: { ...BASE.address, municipality: 'Bom Jesus', uf: null },
90
+ },
91
+ };
92
+ /** Cenários de falha: o CNPJ escolhe qual defeito o provedor apresenta. */
93
+ const FALHAS = {
94
+ '00000000000191': 'not_found',
95
+ '15436940000103': 'rate_limited',
96
+ '92660406000119': 'provider_unavailable',
97
+ '76535764000143': 'timeout',
98
+ '05570714000159': 'garbage',
99
+ };
100
+ export function syntheticCompanyRegistry(options = {}) {
101
+ return {
102
+ name: 'synthetic',
103
+ official: false,
104
+ async lookup(input) {
105
+ const cnpj = cnpjDigits(input);
106
+ const source = 'synthetic';
107
+ const recusa = (reason) => ({
108
+ status: 'failed',
109
+ reason,
110
+ source,
111
+ });
112
+ options.onCall?.(cnpj);
113
+ if (options.force)
114
+ return recusa(options.force);
115
+ if (!isValidCnpj(cnpj))
116
+ return recusa('invalid_document');
117
+ const falha = FALHAS[cnpj];
118
+ if (falha === 'timeout') {
119
+ // Uma exceção CRUA, como a rede produz. O serviço tem de classificá-la
120
+ // sozinho: um provedor real não devolve `{status:'failed'}` educado
121
+ // quando o socket morre.
122
+ throw new Error('ETIMEDOUT synthetic://registry');
123
+ }
124
+ if (falha === 'garbage')
125
+ return recusa('unexpected_payload');
126
+ if (falha)
127
+ return recusa(falha);
128
+ const patch = RETRATOS[cnpj];
129
+ if (!patch)
130
+ return recusa('not_found');
131
+ return {
132
+ status: 'ok',
133
+ record: { ...BASE, ...patch, cnpj },
134
+ source,
135
+ fetchedAt: new Date().toISOString(),
136
+ };
137
+ },
138
+ };
139
+ }
140
+ /** Os CNPJs sintéticos, nomeados — para o teste citar o caso, não o número. */
141
+ export const SYNTHETIC_CNPJ = {
142
+ ativaCompleta: '11222333000181',
143
+ ativaSemCache: '30000000000152',
144
+ ativaSemCache2: '30000000000233',
145
+ semNomeFantasia: '11444777000161',
146
+ semContato: '19131243000197',
147
+ baixada: '34028316000103',
148
+ inapta: '33000167000101',
149
+ variosCnae: '60746948000112',
150
+ mei: '45283163000167',
151
+ naoOptanteSimples: '47960950000121',
152
+ regimeNaoInformado: '07526557000100',
153
+ municipioDesconhecido: '02558157000162',
154
+ municipioAmbiguo: '61695227000193',
155
+ naoEncontrada: '00000000000191',
156
+ limiteExcedido: '15436940000103',
157
+ provedorForaDoAr: '92660406000119',
158
+ tempoEsgotado: '76535764000143',
159
+ respostaIlegivel: '05570714000159',
160
+ };
161
+ //# 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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"}
@@ -20,6 +20,8 @@ export interface ClientRecord {
20
20
  municipality: string | null;
21
21
  stateUf: string | null;
22
22
  legalName: string | null;
23
+ /** Nome fantasia. É por ele que a equipe chama o cliente no telefone. */
24
+ tradeName: string | null;
23
25
  addressLine: string | null;
24
26
  postalCode: string | null;
25
27
  notes: string | null;
@@ -107,6 +109,7 @@ export interface CreateClientInput {
107
109
  createdBy?: string | null;
108
110
  /** Razão social, quando difere do nome pelo qual o escritório chama o cliente. */
109
111
  legalName?: string | null;
112
+ tradeName?: string | null;
110
113
  addressLine?: string | null;
111
114
  municipality?: string | null;
112
115
  /** UF em duas maiúsculas — o CHECK do banco recusa qualquer outra forma. */
@@ -177,6 +180,7 @@ type Erasable<T> = T | null | undefined;
177
180
  export interface UpdateClientInput {
178
181
  displayName?: string;
179
182
  legalName?: string | null;
183
+ tradeName?: string | null;
180
184
  email?: string | null;
181
185
  phone?: string | null;
182
186
  status?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"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"}
@@ -71,6 +71,7 @@ function mapRow(r, channels = {}) {
71
71
  municipality: r.municipality ?? null,
72
72
  stateUf: r.state_uf ?? null,
73
73
  legalName: r.legal_name ?? null,
74
+ tradeName: r.trade_name ?? null,
74
75
  addressLine: r.address_line ?? null,
75
76
  postalCode: r.postal_code ?? null,
76
77
  notes: r.notes ?? null,
@@ -101,7 +102,8 @@ export async function createClient(tx, input) {
101
102
  // tentativa de gravar fora do tenant corrente.
102
103
  try {
103
104
  const rows = await tx `
104
- INSERT INTO client (id, tenant_id, client_type, display_name, legal_name, document_number,
105
+ INSERT INTO client (id, tenant_id, client_type, display_name, legal_name, trade_name,
106
+ document_number,
105
107
  email, phone, phone_e164, address_line, municipality, state_uf,
106
108
  municipality_ibge_code,
107
109
  postal_code, notes, responsible_user_id, contract_started_on,
@@ -112,6 +114,7 @@ export async function createClient(tx, input) {
112
114
  ${input.clientType ?? 'pj'},
113
115
  ${input.displayName},
114
116
  ${input.legalName?.trim() || null},
117
+ ${input.tradeName?.trim() || null},
115
118
  ${input.documentNumber ?? null},
116
119
  ${normalizeEmail(input.email)},
117
120
  ${normalizePhone(input.phone)},
@@ -148,7 +151,7 @@ export async function listClients(tx) {
148
151
  }
149
152
  export async function getClient(tx, id) {
150
153
  const rows = await tx `
151
- SELECT id, tenant_id, client_type, display_name, legal_name, document_number, email, phone,
154
+ SELECT id, tenant_id, client_type, display_name, legal_name, trade_name, document_number, email, phone,
152
155
  status, created_at, responsible_user_id, address_line, municipality, state_uf,
153
156
  municipality_ibge_code, postal_code, notes
154
157
  FROM client
@@ -242,6 +245,7 @@ export async function updateClient(tx, id, input) {
242
245
  UPDATE client SET
243
246
  display_name = COALESCE(${input.displayName ?? null}::text, display_name),
244
247
  legal_name = CASE WHEN ${'legalName' in input} THEN ${input.legalName?.trim() || null}::text ELSE legal_name END,
248
+ trade_name = CASE WHEN ${'tradeName' in input} THEN ${input.tradeName?.trim() || null}::text ELSE trade_name END,
245
249
  document_number = COALESCE(${input.documentNumber ?? null}::text, document_number),
246
250
  email = COALESCE(${normalizeEmail(input.email)}::citext, email),
247
251
  phone = COALESCE(${normalizePhone(input.phone)}::text, phone),