@baruk/core 0.4.2 → 0.5.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 (465) hide show
  1. package/.baruk-provenance.json +4 -4
  2. package/CHANGELOG.md +42 -0
  3. package/dist/audit/repository.d.ts +33 -1
  4. package/dist/audit/repository.d.ts.map +1 -1
  5. package/dist/audit/repository.js +41 -7
  6. package/dist/audit/repository.js.map +1 -1
  7. package/dist/auth/service.d.ts +21 -0
  8. package/dist/auth/service.d.ts.map +1 -1
  9. package/dist/auth/service.js +46 -1
  10. package/dist/auth/service.js.map +1 -1
  11. package/dist/billing/ar-repository.d.ts +41 -1
  12. package/dist/billing/ar-repository.d.ts.map +1 -1
  13. package/dist/billing/ar-repository.js +82 -6
  14. package/dist/billing/ar-repository.js.map +1 -1
  15. package/dist/billing/provider-account.d.ts +38 -0
  16. package/dist/billing/provider-account.d.ts.map +1 -1
  17. package/dist/billing/provider-account.js +58 -2
  18. package/dist/billing/provider-account.js.map +1 -1
  19. package/dist/billing/repository.d.ts +44 -0
  20. package/dist/billing/repository.d.ts.map +1 -1
  21. package/dist/billing/repository.js +49 -5
  22. package/dist/billing/repository.js.map +1 -1
  23. package/dist/cjs/audit/repository.js +41 -7
  24. package/dist/cjs/audit/repository.js.map +1 -1
  25. package/dist/cjs/auth/service.js +46 -1
  26. package/dist/cjs/auth/service.js.map +1 -1
  27. package/dist/cjs/billing/ar-repository.js +82 -6
  28. package/dist/cjs/billing/ar-repository.js.map +1 -1
  29. package/dist/cjs/billing/provider-account.js +60 -1
  30. package/dist/cjs/billing/provider-account.js.map +1 -1
  31. package/dist/cjs/billing/repository.js +51 -5
  32. package/dist/cjs/billing/repository.js.map +1 -1
  33. package/dist/cjs/clients/ibge.js +103 -0
  34. package/dist/cjs/clients/ibge.js.map +1 -0
  35. package/dist/cjs/clients/repository.js +186 -9
  36. package/dist/cjs/clients/repository.js.map +1 -1
  37. package/dist/cjs/collection/branding.js +190 -0
  38. package/dist/cjs/collection/branding.js.map +1 -1
  39. package/dist/cjs/collection/clearance-store.js +74 -0
  40. package/dist/cjs/collection/clearance-store.js.map +1 -0
  41. package/dist/cjs/collection/communication-runtime.js +65 -2
  42. package/dist/cjs/collection/communication-runtime.js.map +1 -1
  43. package/dist/cjs/collection/engine.js +20 -0
  44. package/dist/cjs/collection/engine.js.map +1 -1
  45. package/dist/cjs/collection/policy.js +29 -1
  46. package/dist/cjs/collection/policy.js.map +1 -1
  47. package/dist/cjs/communication/clearance.js +18 -0
  48. package/dist/cjs/communication/clearance.js.map +1 -0
  49. package/dist/cjs/communication/dry-run-scenario.js +5 -0
  50. package/dist/cjs/communication/dry-run-scenario.js.map +1 -1
  51. package/dist/cjs/communication/engine.js +12 -0
  52. package/dist/cjs/communication/engine.js.map +1 -1
  53. package/dist/cjs/communication/policy.js.map +1 -1
  54. package/dist/cjs/competence/business-days.js +155 -0
  55. package/dist/cjs/competence/business-days.js.map +1 -0
  56. package/dist/cjs/competence/catalog-validation.js +174 -0
  57. package/dist/cjs/competence/catalog-validation.js.map +1 -0
  58. package/dist/cjs/competence/obligation-preview.js +190 -0
  59. package/dist/cjs/competence/obligation-preview.js.map +1 -0
  60. package/dist/cjs/competence/repository.js +330 -17
  61. package/dist/cjs/competence/repository.js.map +1 -1
  62. package/dist/cjs/dashboard/pilot-panel.js +90 -0
  63. package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
  64. package/dist/cjs/dashboard/repository.js +11 -1
  65. package/dist/cjs/dashboard/repository.js.map +1 -1
  66. package/dist/cjs/db/client.js +17 -11
  67. package/dist/cjs/db/client.js.map +1 -1
  68. package/dist/cjs/db/provision-e2e-identity.js +111 -0
  69. package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
  70. package/dist/cjs/fiscal/applicability.js +164 -0
  71. package/dist/cjs/fiscal/applicability.js.map +1 -0
  72. package/dist/cjs/fiscal/conditions.js +198 -0
  73. package/dist/cjs/fiscal/conditions.js.map +1 -0
  74. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
  75. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  76. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
  77. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  78. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
  79. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  80. package/dist/cjs/fiscal/coverage/model.js +127 -0
  81. package/dist/cjs/fiscal/coverage/model.js.map +1 -0
  82. package/dist/cjs/fiscal/coverage/requests.js +99 -0
  83. package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
  84. package/dist/cjs/fiscal/credentials/material.js +168 -0
  85. package/dist/cjs/fiscal/credentials/material.js.map +1 -0
  86. package/dist/cjs/fiscal/credentials/readiness.js +163 -0
  87. package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
  88. package/dist/cjs/fiscal/eligibility.js +199 -0
  89. package/dist/cjs/fiscal/eligibility.js.map +1 -0
  90. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
  91. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  92. package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
  93. package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
  94. package/dist/cjs/fiscal/ingestion/direction.js +36 -0
  95. package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
  96. package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
  97. package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
  98. package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
  99. package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
  100. package/dist/cjs/fiscal/ingestion/provider.js +51 -0
  101. package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
  102. package/dist/cjs/fiscal/ingestion/repository.js +132 -0
  103. package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
  104. package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
  105. package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
  106. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
  107. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  108. package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
  109. package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
  110. package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
  111. package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
  112. package/dist/cjs/fiscal/repository.js +470 -0
  113. package/dist/cjs/fiscal/repository.js.map +1 -0
  114. package/dist/cjs/fiscal/sync/circuit.js +124 -0
  115. package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
  116. package/dist/cjs/fiscal/sync/intervention.js +140 -0
  117. package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
  118. package/dist/cjs/fiscal/sync/lease.js +146 -0
  119. package/dist/cjs/fiscal/sync/lease.js.map +1 -0
  120. package/dist/cjs/fiscal/sync/observability.js +244 -0
  121. package/dist/cjs/fiscal/sync/observability.js.map +1 -0
  122. package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
  123. package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
  124. package/dist/cjs/fiscal/sync/policy.js +143 -0
  125. package/dist/cjs/fiscal/sync/policy.js.map +1 -0
  126. package/dist/cjs/fiscal/sync/reprocess.js +241 -0
  127. package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
  128. package/dist/cjs/fiscal/sync/retry.js +183 -0
  129. package/dist/cjs/fiscal/sync/retry.js.map +1 -0
  130. package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
  131. package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
  132. package/dist/cjs/fiscal/transport/https.js +309 -0
  133. package/dist/cjs/fiscal/transport/https.js.map +1 -0
  134. package/dist/cjs/fiscal/transport/synthetic-tls.js +328 -0
  135. package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
  136. package/dist/cjs/fiscal/transport/types.js +93 -0
  137. package/dist/cjs/fiscal/transport/types.js.map +1 -0
  138. package/dist/cjs/import/br-documents.js +85 -0
  139. package/dist/cjs/import/br-documents.js.map +1 -0
  140. package/dist/cjs/import/clients-import.js +347 -40
  141. package/dist/cjs/import/clients-import.js.map +1 -1
  142. package/dist/cjs/index.js +316 -11
  143. package/dist/cjs/index.js.map +1 -1
  144. package/dist/cjs/legal/documents.js +100 -15
  145. package/dist/cjs/legal/documents.js.map +1 -1
  146. package/dist/cjs/legal/index.js +3 -1
  147. package/dist/cjs/legal/index.js.map +1 -1
  148. package/dist/cjs/legal/types.js.map +1 -1
  149. package/dist/cjs/onboarding/persistence.js +4 -4
  150. package/dist/cjs/onboarding/persistence.js.map +1 -1
  151. package/dist/cjs/pilot/go-live-checklist.js +212 -0
  152. package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
  153. package/dist/cjs/pilot/milestone.js +79 -0
  154. package/dist/cjs/pilot/milestone.js.map +1 -0
  155. package/dist/cjs/platform/capabilities.js +144 -0
  156. package/dist/cjs/platform/capabilities.js.map +1 -0
  157. package/dist/cjs/platform/job-contract.js +411 -0
  158. package/dist/cjs/platform/job-contract.js.map +1 -0
  159. package/dist/cjs/rbac/catalog.js +34 -0
  160. package/dist/cjs/rbac/catalog.js.map +1 -1
  161. package/dist/cjs/subscription-billing/index.js +2 -1
  162. package/dist/cjs/subscription-billing/index.js.map +1 -1
  163. package/dist/cjs/subscription-billing/service.js +153 -77
  164. package/dist/cjs/subscription-billing/service.js.map +1 -1
  165. package/dist/cjs/tenancy/features.js +131 -0
  166. package/dist/cjs/tenancy/features.js.map +1 -0
  167. package/dist/cjs/tenancy/settings.js +224 -0
  168. package/dist/cjs/tenancy/settings.js.map +1 -0
  169. package/dist/cjs/users/repository.js +24 -1
  170. package/dist/cjs/users/repository.js.map +1 -1
  171. package/dist/clients/ibge.d.ts +17 -0
  172. package/dist/clients/ibge.d.ts.map +1 -0
  173. package/dist/clients/ibge.js +98 -0
  174. package/dist/clients/ibge.js.map +1 -0
  175. package/dist/clients/repository.d.ts +154 -0
  176. package/dist/clients/repository.d.ts.map +1 -1
  177. package/dist/clients/repository.js +182 -9
  178. package/dist/clients/repository.js.map +1 -1
  179. package/dist/collection/branding.d.ts +65 -0
  180. package/dist/collection/branding.d.ts.map +1 -1
  181. package/dist/collection/branding.js +186 -0
  182. package/dist/collection/branding.js.map +1 -1
  183. package/dist/collection/clearance-store.d.ts +39 -0
  184. package/dist/collection/clearance-store.d.ts.map +1 -0
  185. package/dist/collection/clearance-store.js +69 -0
  186. package/dist/collection/clearance-store.js.map +1 -0
  187. package/dist/collection/communication-runtime.d.ts +37 -0
  188. package/dist/collection/communication-runtime.d.ts.map +1 -1
  189. package/dist/collection/communication-runtime.js +63 -1
  190. package/dist/collection/communication-runtime.js.map +1 -1
  191. package/dist/collection/engine.d.ts +23 -0
  192. package/dist/collection/engine.d.ts.map +1 -1
  193. package/dist/collection/engine.js +20 -0
  194. package/dist/collection/engine.js.map +1 -1
  195. package/dist/collection/policy.d.ts +25 -0
  196. package/dist/collection/policy.d.ts.map +1 -1
  197. package/dist/collection/policy.js +27 -0
  198. package/dist/collection/policy.js.map +1 -1
  199. package/dist/communication/clearance.d.ts +53 -0
  200. package/dist/communication/clearance.d.ts.map +1 -0
  201. package/dist/communication/clearance.js +15 -0
  202. package/dist/communication/clearance.js.map +1 -0
  203. package/dist/communication/dry-run-scenario.d.ts.map +1 -1
  204. package/dist/communication/dry-run-scenario.js +5 -0
  205. package/dist/communication/dry-run-scenario.js.map +1 -1
  206. package/dist/communication/engine.d.ts +10 -0
  207. package/dist/communication/engine.d.ts.map +1 -1
  208. package/dist/communication/engine.js +12 -0
  209. package/dist/communication/engine.js.map +1 -1
  210. package/dist/communication/policy.d.ts +16 -0
  211. package/dist/communication/policy.d.ts.map +1 -1
  212. package/dist/communication/policy.js.map +1 -1
  213. package/dist/competence/business-days.d.ts +51 -0
  214. package/dist/competence/business-days.d.ts.map +1 -0
  215. package/dist/competence/business-days.js +145 -0
  216. package/dist/competence/business-days.js.map +1 -0
  217. package/dist/competence/catalog-validation.d.ts +86 -0
  218. package/dist/competence/catalog-validation.d.ts.map +1 -0
  219. package/dist/competence/catalog-validation.js +168 -0
  220. package/dist/competence/catalog-validation.js.map +1 -0
  221. package/dist/competence/obligation-preview.d.ts +103 -0
  222. package/dist/competence/obligation-preview.d.ts.map +1 -0
  223. package/dist/competence/obligation-preview.js +184 -0
  224. package/dist/competence/obligation-preview.js.map +1 -0
  225. package/dist/competence/repository.d.ts +139 -1
  226. package/dist/competence/repository.d.ts.map +1 -1
  227. package/dist/competence/repository.js +325 -17
  228. package/dist/competence/repository.js.map +1 -1
  229. package/dist/dashboard/pilot-panel.d.ts +100 -0
  230. package/dist/dashboard/pilot-panel.d.ts.map +1 -0
  231. package/dist/dashboard/pilot-panel.js +87 -0
  232. package/dist/dashboard/pilot-panel.js.map +1 -0
  233. package/dist/dashboard/repository.d.ts.map +1 -1
  234. package/dist/dashboard/repository.js +11 -1
  235. package/dist/dashboard/repository.js.map +1 -1
  236. package/dist/db/client.d.ts +45 -0
  237. package/dist/db/client.d.ts.map +1 -1
  238. package/dist/db/client.js +16 -11
  239. package/dist/db/client.js.map +1 -1
  240. package/dist/db/migrate.d.ts +36 -1
  241. package/dist/db/migrate.d.ts.map +1 -1
  242. package/dist/db/migrate.js +199 -32
  243. package/dist/db/migrate.js.map +1 -1
  244. package/dist/db/provision-e2e-identity.d.ts +2 -0
  245. package/dist/db/provision-e2e-identity.d.ts.map +1 -0
  246. package/dist/db/provision-e2e-identity.js +109 -0
  247. package/dist/db/provision-e2e-identity.js.map +1 -0
  248. package/dist/fiscal/applicability.d.ts +73 -0
  249. package/dist/fiscal/applicability.d.ts.map +1 -0
  250. package/dist/fiscal/applicability.js +160 -0
  251. package/dist/fiscal/applicability.js.map +1 -0
  252. package/dist/fiscal/conditions.d.ts +99 -0
  253. package/dist/fiscal/conditions.d.ts.map +1 -0
  254. package/dist/fiscal/conditions.js +190 -0
  255. package/dist/fiscal/conditions.js.map +1 -0
  256. package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
  257. package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
  258. package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
  259. package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  260. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
  261. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
  262. package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
  263. package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  264. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
  265. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
  266. package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
  267. package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  268. package/dist/fiscal/coverage/model.d.ts +86 -0
  269. package/dist/fiscal/coverage/model.d.ts.map +1 -0
  270. package/dist/fiscal/coverage/model.js +120 -0
  271. package/dist/fiscal/coverage/model.js.map +1 -0
  272. package/dist/fiscal/coverage/requests.d.ts +70 -0
  273. package/dist/fiscal/coverage/requests.d.ts.map +1 -0
  274. package/dist/fiscal/coverage/requests.js +95 -0
  275. package/dist/fiscal/coverage/requests.js.map +1 -0
  276. package/dist/fiscal/credentials/material.d.ts +81 -0
  277. package/dist/fiscal/credentials/material.d.ts.map +1 -0
  278. package/dist/fiscal/credentials/material.js +164 -0
  279. package/dist/fiscal/credentials/material.js.map +1 -0
  280. package/dist/fiscal/credentials/readiness.d.ts +92 -0
  281. package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
  282. package/dist/fiscal/credentials/readiness.js +159 -0
  283. package/dist/fiscal/credentials/readiness.js.map +1 -0
  284. package/dist/fiscal/eligibility.d.ts +106 -0
  285. package/dist/fiscal/eligibility.d.ts.map +1 -0
  286. package/dist/fiscal/eligibility.js +194 -0
  287. package/dist/fiscal/eligibility.js.map +1 -0
  288. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
  289. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
  290. package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
  291. package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  292. package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
  293. package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
  294. package/dist/fiscal/ingestion/adn-transport.js +220 -0
  295. package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
  296. package/dist/fiscal/ingestion/direction.d.ts +60 -0
  297. package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
  298. package/dist/fiscal/ingestion/direction.js +32 -0
  299. package/dist/fiscal/ingestion/direction.js.map +1 -0
  300. package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
  301. package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
  302. package/dist/fiscal/ingestion/nfse-adn.js +222 -0
  303. package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
  304. package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
  305. package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
  306. package/dist/fiscal/ingestion/pipeline.js +699 -0
  307. package/dist/fiscal/ingestion/pipeline.js.map +1 -0
  308. package/dist/fiscal/ingestion/provider.d.ts +206 -0
  309. package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
  310. package/dist/fiscal/ingestion/provider.js +47 -0
  311. package/dist/fiscal/ingestion/provider.js.map +1 -0
  312. package/dist/fiscal/ingestion/repository.d.ts +82 -0
  313. package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
  314. package/dist/fiscal/ingestion/repository.js +127 -0
  315. package/dist/fiscal/ingestion/repository.js.map +1 -0
  316. package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
  317. package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
  318. package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
  319. package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
  320. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
  321. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
  322. package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
  323. package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  324. package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
  325. package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
  326. package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
  327. package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
  328. package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
  329. package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
  330. package/dist/fiscal/ingestion/xml-reader.js +112 -0
  331. package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
  332. package/dist/fiscal/repository.d.ts +220 -0
  333. package/dist/fiscal/repository.d.ts.map +1 -0
  334. package/dist/fiscal/repository.js +449 -0
  335. package/dist/fiscal/repository.js.map +1 -0
  336. package/dist/fiscal/sync/circuit.d.ts +86 -0
  337. package/dist/fiscal/sync/circuit.d.ts.map +1 -0
  338. package/dist/fiscal/sync/circuit.js +118 -0
  339. package/dist/fiscal/sync/circuit.js.map +1 -0
  340. package/dist/fiscal/sync/intervention.d.ts +81 -0
  341. package/dist/fiscal/sync/intervention.d.ts.map +1 -0
  342. package/dist/fiscal/sync/intervention.js +135 -0
  343. package/dist/fiscal/sync/intervention.js.map +1 -0
  344. package/dist/fiscal/sync/lease.d.ts +118 -0
  345. package/dist/fiscal/sync/lease.d.ts.map +1 -0
  346. package/dist/fiscal/sync/lease.js +139 -0
  347. package/dist/fiscal/sync/lease.js.map +1 -0
  348. package/dist/fiscal/sync/observability.d.ts +148 -0
  349. package/dist/fiscal/sync/observability.d.ts.map +1 -0
  350. package/dist/fiscal/sync/observability.js +239 -0
  351. package/dist/fiscal/sync/observability.js.map +1 -0
  352. package/dist/fiscal/sync/orchestrator.d.ts +132 -0
  353. package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
  354. package/dist/fiscal/sync/orchestrator.js +487 -0
  355. package/dist/fiscal/sync/orchestrator.js.map +1 -0
  356. package/dist/fiscal/sync/policy.d.ts +87 -0
  357. package/dist/fiscal/sync/policy.d.ts.map +1 -0
  358. package/dist/fiscal/sync/policy.js +136 -0
  359. package/dist/fiscal/sync/policy.js.map +1 -0
  360. package/dist/fiscal/sync/reprocess.d.ts +76 -0
  361. package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
  362. package/dist/fiscal/sync/reprocess.js +237 -0
  363. package/dist/fiscal/sync/reprocess.js.map +1 -0
  364. package/dist/fiscal/sync/retry.d.ts +82 -0
  365. package/dist/fiscal/sync/retry.d.ts.map +1 -0
  366. package/dist/fiscal/sync/retry.js +176 -0
  367. package/dist/fiscal/sync/retry.js.map +1 -0
  368. package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
  369. package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
  370. package/dist/fiscal/sync/secret-boundary.js +116 -0
  371. package/dist/fiscal/sync/secret-boundary.js.map +1 -0
  372. package/dist/fiscal/transport/https.d.ts +86 -0
  373. package/dist/fiscal/transport/https.d.ts.map +1 -0
  374. package/dist/fiscal/transport/https.js +303 -0
  375. package/dist/fiscal/transport/https.js.map +1 -0
  376. package/dist/fiscal/transport/synthetic-tls.d.ts +80 -0
  377. package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
  378. package/dist/fiscal/transport/synthetic-tls.js +323 -0
  379. package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
  380. package/dist/fiscal/transport/types.d.ts +134 -0
  381. package/dist/fiscal/transport/types.d.ts.map +1 -0
  382. package/dist/fiscal/transport/types.js +88 -0
  383. package/dist/fiscal/transport/types.js.map +1 -0
  384. package/dist/import/br-documents.d.ts +26 -0
  385. package/dist/import/br-documents.d.ts.map +1 -0
  386. package/dist/import/br-documents.js +78 -0
  387. package/dist/import/br-documents.js.map +1 -0
  388. package/dist/import/clients-import.d.ts +122 -4
  389. package/dist/import/clients-import.d.ts.map +1 -1
  390. package/dist/import/clients-import.js +341 -41
  391. package/dist/import/clients-import.js.map +1 -1
  392. package/dist/index.d.ts +115 -11
  393. package/dist/index.d.ts.map +1 -1
  394. package/dist/index.js +100 -7
  395. package/dist/index.js.map +1 -1
  396. package/dist/legal/documents.d.ts +12 -1
  397. package/dist/legal/documents.d.ts.map +1 -1
  398. package/dist/legal/documents.js +98 -14
  399. package/dist/legal/documents.js.map +1 -1
  400. package/dist/legal/index.d.ts +1 -1
  401. package/dist/legal/index.d.ts.map +1 -1
  402. package/dist/legal/index.js +1 -1
  403. package/dist/legal/index.js.map +1 -1
  404. package/dist/legal/types.d.ts +37 -2
  405. package/dist/legal/types.d.ts.map +1 -1
  406. package/dist/legal/types.js.map +1 -1
  407. package/dist/onboarding/persistence.d.ts +10 -1
  408. package/dist/onboarding/persistence.d.ts.map +1 -1
  409. package/dist/onboarding/persistence.js +4 -4
  410. package/dist/onboarding/persistence.js.map +1 -1
  411. package/dist/pilot/go-live-checklist.d.ts +41 -0
  412. package/dist/pilot/go-live-checklist.d.ts.map +1 -0
  413. package/dist/pilot/go-live-checklist.js +209 -0
  414. package/dist/pilot/go-live-checklist.js.map +1 -0
  415. package/dist/pilot/milestone.d.ts +56 -0
  416. package/dist/pilot/milestone.d.ts.map +1 -0
  417. package/dist/pilot/milestone.js +74 -0
  418. package/dist/pilot/milestone.js.map +1 -0
  419. package/dist/platform/capabilities.d.ts +88 -0
  420. package/dist/platform/capabilities.d.ts.map +1 -0
  421. package/dist/platform/capabilities.js +140 -0
  422. package/dist/platform/capabilities.js.map +1 -0
  423. package/dist/platform/job-contract.d.ts +232 -0
  424. package/dist/platform/job-contract.d.ts.map +1 -0
  425. package/dist/platform/job-contract.js +403 -0
  426. package/dist/platform/job-contract.js.map +1 -0
  427. package/dist/rbac/catalog.d.ts.map +1 -1
  428. package/dist/rbac/catalog.js +34 -0
  429. package/dist/rbac/catalog.js.map +1 -1
  430. package/dist/subscription-billing/index.d.ts +6 -5
  431. package/dist/subscription-billing/index.d.ts.map +1 -1
  432. package/dist/subscription-billing/index.js +3 -3
  433. package/dist/subscription-billing/index.js.map +1 -1
  434. package/dist/subscription-billing/service.d.ts +21 -0
  435. package/dist/subscription-billing/service.d.ts.map +1 -1
  436. package/dist/subscription-billing/service.js +90 -15
  437. package/dist/subscription-billing/service.js.map +1 -1
  438. package/dist/tenancy/features.d.ts +69 -0
  439. package/dist/tenancy/features.d.ts.map +1 -0
  440. package/dist/tenancy/features.js +123 -0
  441. package/dist/tenancy/features.js.map +1 -0
  442. package/dist/tenancy/settings.d.ts +63 -0
  443. package/dist/tenancy/settings.d.ts.map +1 -0
  444. package/dist/tenancy/settings.js +218 -0
  445. package/dist/tenancy/settings.js.map +1 -0
  446. package/dist/users/repository.d.ts +16 -1
  447. package/dist/users/repository.d.ts.map +1 -1
  448. package/dist/users/repository.js +24 -1
  449. package/dist/users/repository.js.map +1 -1
  450. package/package.json +9 -2
  451. package/src/db/migrations/0045_role_write_scope.sql +122 -0
  452. package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
  453. package/src/db/migrations/0047_recipient_clearance.sql +89 -0
  454. package/src/db/migrations/0048_item_type_note.sql +16 -0
  455. package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
  456. package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
  457. package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
  458. package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
  459. package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
  460. package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
  461. package/src/db/migrations/0055_job_capability_contract.sql +300 -0
  462. package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
  463. package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
  464. package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
  465. package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
@@ -0,0 +1,209 @@
1
+ import { catalogValidationSummary } from '../competence/catalog-validation.js';
2
+ import { readLiveRuntime } from '../billing/live-guard.js';
3
+ import { clearanceSummary } from '../collection/clearance-store.js';
4
+ import { getRealPilotStart } from './milestone.js';
5
+ export async function goLiveChecklist(tx, env = process.env) {
6
+ const gates = [];
7
+ const add = (g) => void gates.push(g);
8
+ // ── DATA ────────────────────────────────────────────────────────────────
9
+ const [clientes] = await tx `
10
+ SELECT count(*)::int AS total,
11
+ count(*) FILTER (WHERE email IS NULL)::int AS sem_email,
12
+ count(*) FILTER (WHERE responsible_user_id IS NULL)::int AS sem_resp
13
+ FROM client
14
+ WHERE deleted_at IS NULL AND status = 'active'
15
+ `;
16
+ const total = clientes?.total ?? 0;
17
+ add({
18
+ key: 'CLIENT_DATA_READY',
19
+ category: 'DATA',
20
+ ready: total > 0,
21
+ detail: total > 0
22
+ ? `${total} cliente(s) ativos.`
23
+ : 'Nenhum cliente ativo — carteira real não importada.',
24
+ humanOnly: true,
25
+ });
26
+ add({
27
+ key: 'REAL_EMAIL_READY',
28
+ category: 'DATA',
29
+ ready: total > 0 && (clientes?.sem_email ?? 0) === 0,
30
+ detail: total === 0
31
+ ? 'Sem carteira para avaliar.'
32
+ : (clientes?.sem_email ?? 0) === 0
33
+ ? 'Todos os clientes ativos têm e-mail.'
34
+ : `${clientes?.sem_email} cliente(s) sem e-mail: cobrança e pedido de documento não os alcançam.`,
35
+ humanOnly: true,
36
+ });
37
+ add({
38
+ key: 'USERS_READY',
39
+ category: 'DATA',
40
+ ready: total > 0 && (clientes?.sem_resp ?? 0) === 0,
41
+ detail: total === 0
42
+ ? 'Sem carteira para distribuir.'
43
+ : (clientes?.sem_resp ?? 0) === 0
44
+ ? 'Carteira inteira com responsável.'
45
+ : `${clientes?.sem_resp} cliente(s) sem responsável.`,
46
+ humanOnly: true,
47
+ });
48
+ // ── COMUNICAÇÃO EXTERNA ─────────────────────────────────────────────────
49
+ //
50
+ // Este gate mede o que a Fase 6 encontrou rodando em produção: a régua
51
+ // enviava e-mail para todo cliente com endereço e recebível vencido, sem que
52
+ // nada perguntasse se alguém conferiu aquele endereço.
53
+ const clr = await clearanceSummary(tx);
54
+ add({
55
+ key: 'EMAIL_RECIPIENT_CONFIRMED',
56
+ category: 'HUMAN',
57
+ ready: total > 0 && clr.pendingWithEmail === 0,
58
+ detail: total === 0
59
+ ? 'Sem carteira para conferir.'
60
+ : clr.pendingWithEmail === 0
61
+ ? `${clr.cleared} cliente(s) liberados para comunicação externa.`
62
+ : `${clr.pendingWithEmail} cliente(s) com e-mail e SEM liberação — a régua não os alcança até alguém conferir.`,
63
+ humanOnly: true,
64
+ });
65
+ // ── FRONTEIRA ENSAIO × OPERAÇÃO ─────────────────────────────────────────
66
+ const marco = await getRealPilotStart(tx);
67
+ add({
68
+ key: 'REAL_PILOT_START_DECLARED',
69
+ category: 'BUSINESS',
70
+ ready: marco !== null,
71
+ detail: marco
72
+ ? `Piloto real declarado em ${marco.occurredAt}. Dados anteriores são pré-produtivos por definição.`
73
+ : 'Marco não declarado: todo dado atual conta como pré-produtivo (QA, demo, App Review da Meta).',
74
+ humanOnly: true,
75
+ });
76
+ // ── IMPORTAÇÃO ──────────────────────────────────────────────────────────
77
+ const [lotes] = await tx `SELECT count(*)::int AS n FROM client_import_batch`;
78
+ add({
79
+ key: 'IMPORT_READY',
80
+ category: 'TECHNICAL',
81
+ ready: true,
82
+ detail: `Plano, digest, avisos, lote e desfazer disponíveis. ${lotes?.n ?? 0} importação(ões) registrada(s).`,
83
+ humanOnly: false,
84
+ });
85
+ add({
86
+ key: 'ROLLBACK_READY',
87
+ category: 'TECHNICAL',
88
+ ready: true,
89
+ detail: 'Desfazer é lógico e seletivo: cliente com honorário, obrigação, documento ou cobrança é preservado.',
90
+ humanOnly: false,
91
+ });
92
+ // ── CATÁLOGO ────────────────────────────────────────────────────────────
93
+ const cat = await catalogValidationSummary(tx);
94
+ add({
95
+ key: 'CATALOG_READY',
96
+ category: 'BUSINESS',
97
+ ready: cat.humanValidationComplete,
98
+ detail: cat.humanValidationComplete
99
+ ? `${cat.validated} obrigação(ões) conferidas.`
100
+ : cat.total === 0
101
+ ? 'Lista de conferência ainda não preparada.'
102
+ : `${cat.pending} item(ns) por conferir — a prévia não os propõe enquanto isso.`,
103
+ humanOnly: true,
104
+ });
105
+ // ── FINANCEIRO ──────────────────────────────────────────────────────────
106
+ // `payment_provider_account` não tem soft-delete: a conta ou está cadastrada
107
+ // ou não está. Filtrar por `deleted_at` aqui quebraria a consulta inteira.
108
+ const [contas] = await tx `
109
+ SELECT count(*) FILTER (WHERE environment = 'live')::int AS live
110
+ FROM payment_provider_account
111
+ `;
112
+ add({
113
+ key: 'FINANCE_READY',
114
+ category: 'FINANCIAL',
115
+ ready: true,
116
+ detail: 'Honorário → recebível → aging → régua operam sem provedor configurado (ASAAS_NOT_READY tolerado).',
117
+ humanOnly: false,
118
+ });
119
+ // **Este gate nunca fica verde sozinho, e é de propósito.**
120
+ //
121
+ // A primeira versão respondia `ready: (contas.live > 0)` — existe linha de
122
+ // conta em produção? Rodando contra o banco real, ela deu VERDE enquanto o
123
+ // KYC do Asaas estava REJEITADO. A linha existir não prova que a conta emite
124
+ // cobrança; prova só que alguém a cadastrou.
125
+ //
126
+ // A aprovação do KYC não é derivável do banco: ela vive no provedor. Um gate
127
+ // que afirma prontidão a partir de um substituto local é pior que gate
128
+ // nenhum, porque dá autorização com a aparência de verificação. Então ele
129
+ // declara o que sabe, diz o que não pode saber, e deixa a confirmação com
130
+ // quem consegue fazê-la.
131
+ const temContaLive = (contas?.live ?? 0) > 0;
132
+ add({
133
+ key: 'ASAAS_LIVE_ACTIVATION_AUTHORIZED_BY_HUMAN',
134
+ category: 'FINANCIAL',
135
+ ready: false,
136
+ detail: 'Segundo portão, independente do KYC: mesmo com o KYC aprovado, ligar a emissão em produção é uma autorização humana explícita e separada. Aprovação do provedor não é autorização do escritório.',
137
+ humanOnly: true,
138
+ });
139
+ add({
140
+ key: 'ASAAS_READY',
141
+ category: 'FINANCIAL',
142
+ ready: false,
143
+ detail: temContaLive
144
+ ? 'Conta de produção cadastrada — mas isto NÃO prova que ela emite cobrança. A aprovação do KYC vive no provedor e não é verificável a partir do banco: confirme no painel do Asaas antes de ligar a emissão.'
145
+ : 'Sem conta de produção cadastrada, e o KYC do Asaas é dependência externa não contornável pelo produto.',
146
+ humanOnly: true,
147
+ });
148
+ const live = readLiveRuntime(env);
149
+ add({
150
+ key: 'LIVE_CHARGES_GATE',
151
+ category: 'SECURITY',
152
+ ready: true,
153
+ detail: live.liveChargesDisabled
154
+ ? 'Emissão em produção PAUSADA — estado desejado até o KYC sair.'
155
+ : 'Emissão em produção liberada.',
156
+ humanOnly: false,
157
+ });
158
+ // ── SEGURANÇA ───────────────────────────────────────────────────────────
159
+ //
160
+ // Mede o ATRIBUTO no catálogo do Postgres, e não o comportamento: uma sonda
161
+ // comportamental passa quando a conexão de teste tem privilégio de mais.
162
+ const [rls] = await tx `
163
+ SELECT count(*)::int AS sem_force
164
+ FROM pg_class c
165
+ JOIN pg_namespace n ON n.oid = c.relnamespace
166
+ WHERE n.nspname = 'public'
167
+ AND c.relname IN ('client','fee_agreement','receivable','recurring_instance',
168
+ 'document_request','client_import_batch',
169
+ 'recurring_item_type_validation','fee_agreement_obligation')
170
+ AND NOT (c.relrowsecurity AND c.relforcerowsecurity)
171
+ `;
172
+ add({
173
+ key: 'TENANT_SECURITY_READY',
174
+ category: 'SECURITY',
175
+ ready: (rls?.sem_force ?? 1) === 0,
176
+ detail: (rls?.sem_force ?? 1) === 0
177
+ ? 'RLS FORCE ativo nas tabelas do ciclo, incluindo as criadas nesta fase.'
178
+ : `${rls?.sem_force} tabela(s) do ciclo sem RLS FORCE.`,
179
+ humanOnly: false,
180
+ });
181
+ add({
182
+ key: 'WHATSAPP_READY_OR_OPTIONAL',
183
+ category: 'TECHNICAL',
184
+ ready: true,
185
+ detail: 'Opcional para o piloto: o e-mail cobre cobrança, pedido de documento e portal. WhatsApp segue fora de escopo.',
186
+ humanOnly: false,
187
+ });
188
+ // ── MONITORAMENTO ───────────────────────────────────────────────────────
189
+ const [auditoria] = await tx `
190
+ SELECT count(*)::int AS n FROM audit_log WHERE occurred_at > now() - interval '30 days'
191
+ `;
192
+ add({
193
+ key: 'MONITORING_READY',
194
+ category: 'TECHNICAL',
195
+ ready: (auditoria?.n ?? 0) > 0,
196
+ detail: (auditoria?.n ?? 0) > 0
197
+ ? `${auditoria?.n} evento(s) de auditoria nos últimos 30 dias.`
198
+ : 'Sem eventos de auditoria recentes — a trilha existe e não está sendo alimentada.',
199
+ humanOnly: false,
200
+ });
201
+ const technicalReady = gates.filter((g) => !g.humanOnly).every((g) => g.ready);
202
+ return {
203
+ gates,
204
+ technicalReady,
205
+ activationReady: gates.every((g) => g.ready),
206
+ humanBlockers: gates.filter((g) => g.humanOnly && !g.ready).map((g) => g.key),
207
+ };
208
+ }
209
+ //# sourceMappingURL=go-live-checklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go-live-checklist.js","sourceRoot":"","sources":["../../src/pilot/go-live-checklist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { Tx } from '../db/client.js';
2
+ /**
3
+ * A fronteira entre o que era ensaio e o que é operação.
4
+ *
5
+ * ## Por que precisa ser um fato gravado
6
+ *
7
+ * O tenant da SC já tem registros: desenvolvimento, QA, homologação,
8
+ * demonstração e os artefatos do App Review da Meta. Nenhum é carteira real.
9
+ *
10
+ * Sem um marco explícito, daqui a três meses ninguém distingue "cliente de
11
+ * teste de agosto" de "cliente real de setembro" — e todo indicador do painel
12
+ * passa a somar os dois. Inadimplência, faturamento, produtividade: todos
13
+ * ficam sem significado, e o erro é irreversível porque a informação que os
14
+ * separava nunca existiu.
15
+ *
16
+ * O marco é uma linha no tempo com autor e data. Tudo antes dele é
17
+ * pré-produtivo por definição; tudo depois é operação.
18
+ */
19
+ export interface PilotMilestone {
20
+ occurredAt: string;
21
+ declaredBy: string | null;
22
+ note: string | null;
23
+ }
24
+ export declare function getRealPilotStart(tx: Tx): Promise<PilotMilestone | null>;
25
+ /**
26
+ * Declara o início do piloto real.
27
+ *
28
+ * **Idempotente e não sobrescreve.** Se o marco já existe, a chamada devolve o
29
+ * que está lá em vez de mover a linha: "quando começou de verdade" não admite
30
+ * duas respostas, e uma segunda declaração seria alguém reescrevendo a
31
+ * fronteira depois de os dados já terem cruzado.
32
+ */
33
+ export declare function declareRealPilotStart(tx: Tx, input: {
34
+ actorId: string | null;
35
+ note?: string | null;
36
+ }): Promise<{
37
+ milestone: PilotMilestone;
38
+ created: boolean;
39
+ }>;
40
+ export interface DataProvenance {
41
+ /** `null` enquanto o piloto real não foi declarado. */
42
+ realPilotStartedAt: string | null;
43
+ /** Clientes criados ANTES do marco — ou todos, se ele não existe. */
44
+ preProduction: number;
45
+ /** Clientes criados a partir do marco. */
46
+ realPilot: number;
47
+ }
48
+ /**
49
+ * Quantos clientes de cada lado da fronteira.
50
+ *
51
+ * Enquanto o marco não existe, **tudo** é pré-produtivo — e não "tudo é real",
52
+ * que seria o default otimista. Um sistema que assume produção antes de alguém
53
+ * declarar produção é o que produz o indicador sem significado.
54
+ */
55
+ export declare function dataProvenance(tx: Tx): Promise<DataProvenance>;
56
+ //# sourceMappingURL=milestone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milestone.d.ts","sourceRoot":"","sources":["../../src/pilot/milestone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAG1C;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAU9E;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACtD,OAAO,CAAC;IAAE,SAAS,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA0B1D;AAED,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,qEAAqE;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAkBpE"}
@@ -0,0 +1,74 @@
1
+ import { uuidv7 } from '@baruk/shared';
2
+ export async function getRealPilotStart(tx) {
3
+ const rows = await tx `
4
+ SELECT occurred_at, declared_by, note
5
+ FROM tenant_pilot_milestone
6
+ WHERE milestone = 'real_pilot_start'
7
+ `;
8
+ const r = rows[0];
9
+ return r
10
+ ? { occurredAt: r.occurred_at.toISOString(), declaredBy: r.declared_by, note: r.note }
11
+ : null;
12
+ }
13
+ /**
14
+ * Declara o início do piloto real.
15
+ *
16
+ * **Idempotente e não sobrescreve.** Se o marco já existe, a chamada devolve o
17
+ * que está lá em vez de mover a linha: "quando começou de verdade" não admite
18
+ * duas respostas, e uma segunda declaração seria alguém reescrevendo a
19
+ * fronteira depois de os dados já terem cruzado.
20
+ */
21
+ export async function declareRealPilotStart(tx, input) {
22
+ const existente = await getRealPilotStart(tx);
23
+ if (existente)
24
+ return { milestone: existente, created: false };
25
+ const rows = await tx `
26
+ INSERT INTO tenant_pilot_milestone (id, tenant_id, milestone, declared_by, note)
27
+ VALUES (${uuidv7()}, current_setting('app.current_tenant')::uuid, 'real_pilot_start',
28
+ ${input.actorId}, ${input.note ?? null})
29
+ ON CONFLICT DO NOTHING
30
+ RETURNING occurred_at, declared_by, note
31
+ `;
32
+ const r = rows[0];
33
+ if (!r) {
34
+ // Corrida: outra sessão declarou entre a consulta e o INSERT. A resposta
35
+ // certa é a linha que ficou, não um erro.
36
+ const agora = await getRealPilotStart(tx);
37
+ return { milestone: agora, created: false };
38
+ }
39
+ return {
40
+ milestone: {
41
+ occurredAt: r.occurred_at.toISOString(),
42
+ declaredBy: r.declared_by,
43
+ note: r.note,
44
+ },
45
+ created: true,
46
+ };
47
+ }
48
+ /**
49
+ * Quantos clientes de cada lado da fronteira.
50
+ *
51
+ * Enquanto o marco não existe, **tudo** é pré-produtivo — e não "tudo é real",
52
+ * que seria o default otimista. Um sistema que assume produção antes de alguém
53
+ * declarar produção é o que produz o indicador sem significado.
54
+ */
55
+ export async function dataProvenance(tx) {
56
+ const marco = await getRealPilotStart(tx);
57
+ if (!marco) {
58
+ const [r] = await tx `
59
+ SELECT count(*)::int AS n FROM client WHERE deleted_at IS NULL
60
+ `;
61
+ return { realPilotStartedAt: null, preProduction: r?.n ?? 0, realPilot: 0 };
62
+ }
63
+ const [r] = await tx `
64
+ SELECT count(*) FILTER (WHERE created_at < ${marco.occurredAt}::timestamptz)::int AS antes,
65
+ count(*) FILTER (WHERE created_at >= ${marco.occurredAt}::timestamptz)::int AS depois
66
+ FROM client WHERE deleted_at IS NULL
67
+ `;
68
+ return {
69
+ realPilotStartedAt: marco.occurredAt,
70
+ preProduction: r?.antes ?? 0,
71
+ realPilot: r?.depois ?? 0,
72
+ };
73
+ }
74
+ //# sourceMappingURL=milestone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milestone.js","sourceRoot":"","sources":["../../src/pilot/milestone.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AA0BvC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAM;IAC5C,MAAM,IAAI,GAAG,MAAM,EAAE,CAA0E;;;;GAI9F,CAAC;IACF,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,OAAO,CAAC;QACN,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACtF,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,EAAM,EACN,KAAuD;IAEvD,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC9C,IAAI,SAAS;QAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAE/D,MAAM,IAAI,GAAG,MAAM,EAAE,CAA0E;;cAEnF,MAAM,EAAE;cACR,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,IAAI,IAAI;;;GAG/C,CAAC;IACF,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,yEAAyE;QACzE,0CAA0C;QAC1C,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC1C,OAAO,EAAE,SAAS,EAAE,KAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO;QACL,SAAS,EAAE;YACT,UAAU,EAAE,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE;YACvC,UAAU,EAAE,CAAC,CAAC,WAAW;YACzB,IAAI,EAAE,CAAC,CAAC,IAAI;SACb;QACD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAWD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAM;IACzC,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAiB;;KAEpC,CAAC;QACF,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC;IACD,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAqC;kDACT,KAAK,CAAC,UAAU;kDAChB,KAAK,CAAC,UAAU;;GAE/D,CAAC;IACF,OAAO;QACL,kBAAkB,EAAE,KAAK,CAAC,UAAU;QACpC,aAAa,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;QAC5B,SAAS,EAAE,CAAC,EAAE,MAAM,IAAI,CAAC;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * O contrato de CAPACIDADE entre a API e as telas que a consomem.
3
+ *
4
+ * ## O defeito que isto existe para fechar
5
+ *
6
+ * O console publica na Vercel no instante do merge. A API publica na Render
7
+ * depois — build da imagem, `db:predeploy`, health check. Entre um e outro
8
+ * existe uma janela de minutos em que o navegador carrega a tela NOVA e fala
9
+ * com a API VELHA. Na Onda A isso não foi hipótese: nove rotas
10
+ * (`/v1/tenant/profile`, `/v1/tenant/features`, `/v1/tenant/setup`,
11
+ * `/v1/fiscal/governance` e as irmãs) existiram na tela antes de existirem no
12
+ * servidor.
13
+ *
14
+ * O que a pessoa via nessa janela era a pior variante possível: um 404 da API
15
+ * que o Next transforma em tela genérica de erro, com `digest` e pedido de
16
+ * abrir chamado — o mesmo modo de falha que o `SemAcesso` corrigiu para RBAC.
17
+ * Não é erro do sistema: é uma versão que ainda não subiu.
18
+ *
19
+ * ## Por que capacidade, e não SHA
20
+ *
21
+ * Comparar o commit servido com o commit esperado acopla a tela ao processo de
22
+ * release: qualquer publicação — inclusive uma que não muda nada relevante —
23
+ * passa a poder derrubar a tela, e um hotfix na API com outro SHA reprovaria
24
+ * um frontend perfeitamente compatível. O que a tela precisa saber não é QUAL
25
+ * build está no ar, e sim se aquele build SABE responder o que ela vai pedir.
26
+ *
27
+ * Por isso o contrato é uma lista de nomes. A API declara o que serve; a tela
28
+ * declara o que exige. Compatibilidade é continência de conjunto, não
29
+ * igualdade de versão — e é isso que torna o backend-first possível: a API
30
+ * publica a capacidade ANTES da tela existir, e nada quebra porque ninguém
31
+ * ainda a exige.
32
+ *
33
+ * ## Regras de evolução
34
+ *
35
+ * - Uma chave é imutável. Mudança incompatível ganha `.v2`; a `.v1` só sai
36
+ * quando nenhum frontend em produção ainda a exigir.
37
+ * - A API nunca declara capacidade que não implementa — o guarda
38
+ * `capabilities.test.ts` confere cada rota declarada contra as rotas
39
+ * efetivamente montadas no Fastify. Declarar sem implementar seria o mesmo
40
+ * defeito de novo, com um passo a mais de indireção.
41
+ * - Ausência é resposta legítima. A tela degrada para "aguardando a API", não
42
+ * para erro.
43
+ */
44
+ /**
45
+ * Versão do FORMATO da resposta de `/v1/capabilities` — não das capacidades.
46
+ *
47
+ * Muda apenas se a forma do documento mudar. Um cliente que não reconhece a
48
+ * versão trata tudo como indisponível: fail-closed é a única leitura segura de
49
+ * um contrato que não se sabe ler.
50
+ */
51
+ export declare const CAPABILITY_CONTRACT_VERSION = 1;
52
+ export interface ApiCapabilityDef {
53
+ /** `<produto>.<recurso>.v<N>`. Imutável depois de publicada. */
54
+ key: string;
55
+ label: string;
56
+ /**
57
+ * Rotas que compõem a capacidade, no formato do Fastify (`/v1/x/:id`).
58
+ *
59
+ * Não é documentação: é o que o guarda executa. Uma capacidade cujas rotas
60
+ * não existem no app montado reprova o build.
61
+ */
62
+ routes: readonly string[];
63
+ }
64
+ /**
65
+ * O que ESTE build da API serve.
66
+ *
67
+ * A Onda A entra inteira porque foi ela quem sofreu o skew. Capacidades
68
+ * anteriores não estão aqui de propósito: uma tela que nunca conheceu janela
69
+ * de incompatibilidade não ganha um portão novo para atravessar.
70
+ */
71
+ export declare const API_CAPABILITIES: readonly ApiCapabilityDef[];
72
+ export declare const API_CAPABILITY_KEYS: readonly string[];
73
+ /** Formato exigido de uma chave. O guarda usa isto; a revisão humana não basta. */
74
+ export declare const CAPABILITY_KEY_PATTERN: RegExp;
75
+ export interface CapabilityDocument {
76
+ contract: number;
77
+ capabilities: readonly string[];
78
+ }
79
+ /**
80
+ * A API declarada satisfaz o que a tela exige?
81
+ *
82
+ * Fail-closed em três frentes, e todas já aconteceram em produção em algum
83
+ * produto: documento ausente (API velha, sem a rota), versão de contrato
84
+ * desconhecida (cliente novo demais ou velho demais) e capacidade faltando.
85
+ * Nenhuma delas devolve "sim por não saber".
86
+ */
87
+ export declare function satisfiesCapability(doc: CapabilityDocument | null | undefined, required: string): boolean;
88
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/platform/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,gBAAgB,EAgEvD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAuC,CAAC;AAEzF,mFAAmF;AACnF,eAAO,MAAM,sBAAsB,QACgC,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAC1C,QAAQ,EAAE,MAAM,GACf,OAAO,CAIT"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * O contrato de CAPACIDADE entre a API e as telas que a consomem.
3
+ *
4
+ * ## O defeito que isto existe para fechar
5
+ *
6
+ * O console publica na Vercel no instante do merge. A API publica na Render
7
+ * depois — build da imagem, `db:predeploy`, health check. Entre um e outro
8
+ * existe uma janela de minutos em que o navegador carrega a tela NOVA e fala
9
+ * com a API VELHA. Na Onda A isso não foi hipótese: nove rotas
10
+ * (`/v1/tenant/profile`, `/v1/tenant/features`, `/v1/tenant/setup`,
11
+ * `/v1/fiscal/governance` e as irmãs) existiram na tela antes de existirem no
12
+ * servidor.
13
+ *
14
+ * O que a pessoa via nessa janela era a pior variante possível: um 404 da API
15
+ * que o Next transforma em tela genérica de erro, com `digest` e pedido de
16
+ * abrir chamado — o mesmo modo de falha que o `SemAcesso` corrigiu para RBAC.
17
+ * Não é erro do sistema: é uma versão que ainda não subiu.
18
+ *
19
+ * ## Por que capacidade, e não SHA
20
+ *
21
+ * Comparar o commit servido com o commit esperado acopla a tela ao processo de
22
+ * release: qualquer publicação — inclusive uma que não muda nada relevante —
23
+ * passa a poder derrubar a tela, e um hotfix na API com outro SHA reprovaria
24
+ * um frontend perfeitamente compatível. O que a tela precisa saber não é QUAL
25
+ * build está no ar, e sim se aquele build SABE responder o que ela vai pedir.
26
+ *
27
+ * Por isso o contrato é uma lista de nomes. A API declara o que serve; a tela
28
+ * declara o que exige. Compatibilidade é continência de conjunto, não
29
+ * igualdade de versão — e é isso que torna o backend-first possível: a API
30
+ * publica a capacidade ANTES da tela existir, e nada quebra porque ninguém
31
+ * ainda a exige.
32
+ *
33
+ * ## Regras de evolução
34
+ *
35
+ * - Uma chave é imutável. Mudança incompatível ganha `.v2`; a `.v1` só sai
36
+ * quando nenhum frontend em produção ainda a exigir.
37
+ * - A API nunca declara capacidade que não implementa — o guarda
38
+ * `capabilities.test.ts` confere cada rota declarada contra as rotas
39
+ * efetivamente montadas no Fastify. Declarar sem implementar seria o mesmo
40
+ * defeito de novo, com um passo a mais de indireção.
41
+ * - Ausência é resposta legítima. A tela degrada para "aguardando a API", não
42
+ * para erro.
43
+ */
44
+ /**
45
+ * Versão do FORMATO da resposta de `/v1/capabilities` — não das capacidades.
46
+ *
47
+ * Muda apenas se a forma do documento mudar. Um cliente que não reconhece a
48
+ * versão trata tudo como indisponível: fail-closed é a única leitura segura de
49
+ * um contrato que não se sabe ler.
50
+ */
51
+ export const CAPABILITY_CONTRACT_VERSION = 1;
52
+ /**
53
+ * O que ESTE build da API serve.
54
+ *
55
+ * A Onda A entra inteira porque foi ela quem sofreu o skew. Capacidades
56
+ * anteriores não estão aqui de propósito: uma tela que nunca conheceu janela
57
+ * de incompatibilidade não ganha um portão novo para atravessar.
58
+ */
59
+ export const API_CAPABILITIES = [
60
+ {
61
+ key: 'office.tenant-profile.v1',
62
+ label: 'Identificação do escritório (razão social, CNPJ, fuso)',
63
+ routes: ['GET /v1/tenant/profile', 'PUT /v1/tenant/profile'],
64
+ },
65
+ {
66
+ key: 'office.tenant-branding.v1',
67
+ label: 'Marca do escritório',
68
+ routes: ['GET /v1/tenant/branding', 'PUT /v1/tenant/branding'],
69
+ },
70
+ {
71
+ key: 'office.tenant-features.v1',
72
+ label: 'Módulos ligados e desligados pelo próprio escritório',
73
+ routes: ['GET /v1/tenant/features', 'PUT /v1/tenant/features'],
74
+ },
75
+ {
76
+ key: 'office.tenant-setup.v1',
77
+ label: 'Progresso de configuração do escritório',
78
+ routes: ['GET /v1/tenant/setup'],
79
+ },
80
+ {
81
+ key: 'office.fiscal-governance.v1',
82
+ label: 'Governança do catálogo fiscal (fonte oficial e conferência)',
83
+ routes: [
84
+ 'GET /v1/fiscal/governance',
85
+ 'PUT /v1/fiscal/rules/:id/source',
86
+ 'POST /v1/fiscal/rules/:id/validate',
87
+ ],
88
+ },
89
+ {
90
+ key: 'office.fiscal-documents.v1',
91
+ label: 'Documentos fiscais capturados e o estado da sincronização',
92
+ routes: [
93
+ 'GET /v1/fiscal/documents',
94
+ 'GET /v1/fiscal/documents/:id',
95
+ 'GET /v1/fiscal/sync-state',
96
+ ],
97
+ },
98
+ {
99
+ key: 'office.fiscal-operations.v1',
100
+ label: 'Motor operacional fiscal: estado por cliente, cobertura, fila humana e caixa de entrada',
101
+ routes: [
102
+ 'GET /v1/fiscal/sync-clients',
103
+ 'GET /v1/fiscal/coverage',
104
+ 'GET /v1/fiscal/interventions',
105
+ 'GET /v1/fiscal/metrics',
106
+ 'GET /v1/fiscal/inbox',
107
+ 'POST /v1/fiscal/inbox/:id/reprocess',
108
+ 'GET /v1/fiscal/request-coverage',
109
+ ],
110
+ },
111
+ {
112
+ // Separada de `fiscal-operations` de propósito: ela não descreve a carteira
113
+ // do escritório, e sim o CONTRATO com o provedor oficial. Um console que
114
+ // exiba "transporte real desativado" antes de a rota existir mostraria a
115
+ // tela genérica de erro em vez do estado — que é exatamente o modo de falha
116
+ // que o portão de capacidade existe para fechar.
117
+ key: 'office.fiscal-provider-contract.v1',
118
+ label: 'Contrato do provedor fiscal oficial: versão, fontes e por que o transporte real está fechado',
119
+ routes: ['GET /v1/fiscal/provider-contract'],
120
+ },
121
+ ];
122
+ export const API_CAPABILITY_KEYS = API_CAPABILITIES.map((c) => c.key);
123
+ /** Formato exigido de uma chave. O guarda usa isto; a revisão humana não basta. */
124
+ export const CAPABILITY_KEY_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*(?:\.[a-z0-9]+(?:-[a-z0-9]+)*)+\.v\d+$/;
125
+ /**
126
+ * A API declarada satisfaz o que a tela exige?
127
+ *
128
+ * Fail-closed em três frentes, e todas já aconteceram em produção em algum
129
+ * produto: documento ausente (API velha, sem a rota), versão de contrato
130
+ * desconhecida (cliente novo demais ou velho demais) e capacidade faltando.
131
+ * Nenhuma delas devolve "sim por não saber".
132
+ */
133
+ export function satisfiesCapability(doc, required) {
134
+ if (!doc)
135
+ return false;
136
+ if (doc.contract !== CAPABILITY_CONTRACT_VERSION)
137
+ return false;
138
+ return doc.capabilities.includes(required);
139
+ }
140
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/platform/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAe7C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAgC;IAC3D;QACE,GAAG,EAAE,0BAA0B;QAC/B,KAAK,EAAE,wDAAwD;QAC/D,MAAM,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC;KAC7D;IACD;QACE,GAAG,EAAE,2BAA2B;QAChC,KAAK,EAAE,qBAAqB;QAC5B,MAAM,EAAE,CAAC,yBAAyB,EAAE,yBAAyB,CAAC;KAC/D;IACD;QACE,GAAG,EAAE,2BAA2B;QAChC,KAAK,EAAE,sDAAsD;QAC7D,MAAM,EAAE,CAAC,yBAAyB,EAAE,yBAAyB,CAAC;KAC/D;IACD;QACE,GAAG,EAAE,wBAAwB;QAC7B,KAAK,EAAE,yCAAyC;QAChD,MAAM,EAAE,CAAC,sBAAsB,CAAC;KACjC;IACD;QACE,GAAG,EAAE,6BAA6B;QAClC,KAAK,EAAE,6DAA6D;QACpE,MAAM,EAAE;YACN,2BAA2B;YAC3B,iCAAiC;YACjC,oCAAoC;SACrC;KACF;IACD;QACE,GAAG,EAAE,4BAA4B;QACjC,KAAK,EAAE,2DAA2D;QAClE,MAAM,EAAE;YACN,0BAA0B;YAC1B,8BAA8B;YAC9B,2BAA2B;SAC5B;KACF;IACD;QACE,GAAG,EAAE,6BAA6B;QAClC,KAAK,EACH,yFAAyF;QAC3F,MAAM,EAAE;YACN,6BAA6B;YAC7B,yBAAyB;YACzB,8BAA8B;YAC9B,wBAAwB;YACxB,sBAAsB;YACtB,qCAAqC;YACrC,iCAAiC;SAClC;KACF;IACD;QACE,4EAA4E;QAC5E,yEAAyE;QACzE,yEAAyE;QACzE,4EAA4E;QAC5E,iDAAiD;QACjD,GAAG,EAAE,oCAAoC;QACzC,KAAK,EACH,8FAA8F;QAChG,MAAM,EAAE,CAAC,kCAAkC,CAAC;KAC7C;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAsB,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAEzF,mFAAmF;AACnF,MAAM,CAAC,MAAM,sBAAsB,GACjC,iEAAiE,CAAC;AAOpE;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAA0C,EAC1C,QAAgB;IAEhB,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,IAAI,GAAG,CAAC,QAAQ,KAAK,2BAA2B;QAAE,OAAO,KAAK,CAAC;IAC/D,OAAO,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC"}