@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,470 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InvalidAttributeValue = exports.UnknownFiscalAttribute = void 0;
4
+ exports.listFiscalAttributes = listFiscalAttributes;
5
+ exports.setClientFiscalAttribute = setClientFiscalAttribute;
6
+ exports.clearClientFiscalAttribute = clearClientFiscalAttribute;
7
+ exports.loadFiscalProfile = loadFiscalProfile;
8
+ exports.loadClientJurisdiction = loadClientJurisdiction;
9
+ exports.candidateRules = candidateRules;
10
+ exports.resolveRule = resolveRule;
11
+ exports.createFiscalRule = createFiscalRule;
12
+ exports.supersedeFiscalRule = supersedeFiscalRule;
13
+ exports.getFiscalRule = getFiscalRule;
14
+ exports.setTenantRulePolicy = setTenantRulePolicy;
15
+ exports.listTenantRulePolicies = listTenantRulePolicies;
16
+ exports.listGovernanceRules = listGovernanceRules;
17
+ exports.summarizeGovernance = summarizeGovernance;
18
+ exports.annotateFiscalRule = annotateFiscalRule;
19
+ exports.validateFiscalRule = validateFiscalRule;
20
+ const shared_1 = require("@baruk/shared");
21
+ const conditions_js_1 = require("./conditions.js");
22
+ async function listFiscalAttributes(tx) {
23
+ const rows = await tx `
24
+ SELECT key, label, description, value_type, allowed_values
25
+ FROM fiscal_attribute_definition ORDER BY key
26
+ `;
27
+ return rows.map((r) => ({
28
+ key: r.key,
29
+ label: r.label,
30
+ description: r.description,
31
+ valueType: r.value_type,
32
+ allowedValues: Array.isArray(r.allowed_values) ? r.allowed_values : null,
33
+ }));
34
+ }
35
+ class UnknownFiscalAttribute extends Error {
36
+ constructor(key) {
37
+ super(`Atributo fiscal desconhecido: ${key}`);
38
+ this.name = 'UnknownFiscalAttribute';
39
+ }
40
+ }
41
+ exports.UnknownFiscalAttribute = UnknownFiscalAttribute;
42
+ class InvalidAttributeValue extends Error {
43
+ constructor(message) {
44
+ super(message);
45
+ this.name = 'InvalidAttributeValue';
46
+ }
47
+ }
48
+ exports.InvalidAttributeValue = InvalidAttributeValue;
49
+ /**
50
+ * Grava um atributo do perfil.
51
+ *
52
+ * Valida o valor CONTRA A DEFINIÇÃO antes de gravar: booleano recebe booleano,
53
+ * enum recebe um dos valores declarados. Sem isso, `activity_segment` aceitaria
54
+ * "industria " com espaço e a regra que compara com "industria" nunca casaria —
55
+ * e ninguém saberia por quê, porque o dado *parece* certo na tela.
56
+ */
57
+ async function setClientFiscalAttribute(tx, input) {
58
+ const [def] = await tx `
59
+ SELECT value_type, allowed_values FROM fiscal_attribute_definition WHERE key = ${input.attributeKey}
60
+ `;
61
+ if (!def)
62
+ throw new UnknownFiscalAttribute(input.attributeKey);
63
+ let vBool = null;
64
+ let vText = null;
65
+ if (def.value_type === 'boolean') {
66
+ if (typeof input.value !== 'boolean') {
67
+ throw new InvalidAttributeValue(`"${input.attributeKey}" espera verdadeiro ou falso.`);
68
+ }
69
+ vBool = input.value;
70
+ }
71
+ else {
72
+ if (typeof input.value !== 'string' || input.value.trim() === '') {
73
+ throw new InvalidAttributeValue(`"${input.attributeKey}" espera texto não vazio.`);
74
+ }
75
+ vText = input.value.trim();
76
+ if (def.value_type === 'enum') {
77
+ const permitidos = Array.isArray(def.allowed_values) ? def.allowed_values : [];
78
+ if (!permitidos.includes(vText)) {
79
+ throw new InvalidAttributeValue(`"${vText}" não é aceito em "${input.attributeKey}". Valores: ${permitidos.join(', ')}.`);
80
+ }
81
+ }
82
+ }
83
+ await tx `
84
+ INSERT INTO client_fiscal_attribute
85
+ (id, tenant_id, client_id, attribute_key, value_bool, value_text, source, updated_by)
86
+ VALUES (
87
+ ${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid, ${input.clientId},
88
+ ${input.attributeKey}, ${vBool}, ${vText}, ${input.source ?? null}, ${input.actorId ?? null}
89
+ )
90
+ ON CONFLICT (tenant_id, client_id, attribute_key) DO UPDATE SET
91
+ value_bool = EXCLUDED.value_bool,
92
+ value_text = EXCLUDED.value_text,
93
+ source = EXCLUDED.source,
94
+ updated_by = EXCLUDED.updated_by,
95
+ updated_at = now()
96
+ `;
97
+ }
98
+ /**
99
+ * Remove um atributo — devolvendo-o ao estado DESCONHECIDO.
100
+ *
101
+ * Existe porque "não sei mais" é um estado legítimo e diferente de `false`.
102
+ * Sem esta operação, corrigir um dado errado exigiria gravar um valor que
103
+ * ninguém confirmou.
104
+ */
105
+ async function clearClientFiscalAttribute(tx, input) {
106
+ await tx `
107
+ DELETE FROM client_fiscal_attribute
108
+ WHERE client_id = ${input.clientId} AND attribute_key = ${input.attributeKey}
109
+ `;
110
+ }
111
+ /**
112
+ * O perfil como o motor o enxerga.
113
+ *
114
+ * Atributo ausente simplesmente não aparece no objeto — e é assim que
115
+ * `evaluate` o distingue de `false`.
116
+ */
117
+ async function loadFiscalProfile(tx, clientId) {
118
+ const rows = await tx `
119
+ SELECT attribute_key, value_bool, value_text
120
+ FROM client_fiscal_attribute WHERE client_id = ${clientId}
121
+ `;
122
+ const perfil = {};
123
+ for (const r of rows) {
124
+ perfil[r.attribute_key] = r.value_bool !== null ? r.value_bool : r.value_text;
125
+ }
126
+ return perfil;
127
+ }
128
+ async function loadClientJurisdiction(tx, clientId) {
129
+ const [r] = await tx `
130
+ SELECT state_uf, municipality_ibge_code FROM client WHERE id = ${clientId} AND deleted_at IS NULL
131
+ `;
132
+ return { uf: r?.state_uf ?? null, cityIbge: r?.municipality_ibge_code ?? null };
133
+ }
134
+ const iso = (d) => d.toISOString().slice(0, 10);
135
+ const mapRule = (r) => ({
136
+ id: r.id,
137
+ tenantId: r.tenant_id,
138
+ itemTypeId: r.item_type_id,
139
+ version: r.version,
140
+ jurisdiction: {
141
+ scope: r.jurisdiction_scope,
142
+ uf: r.jurisdiction_uf,
143
+ cityIbge: r.jurisdiction_city_ibge,
144
+ },
145
+ validFrom: iso(r.valid_from),
146
+ validUntil: r.valid_until ? iso(r.valid_until) : null,
147
+ status: r.status,
148
+ conditions: r.conditions ?? { op: 'always' },
149
+ dueRule: r.due_rule,
150
+ sourceReference: r.source_reference,
151
+ });
152
+ const RULE_COLS = `
153
+ id, tenant_id, item_type_id, version, jurisdiction_scope, jurisdiction_uf,
154
+ jurisdiction_city_ibge, valid_from, valid_until, status, conditions, due_rule, source_reference
155
+ `;
156
+ /**
157
+ * As regras candidatas para um tipo de item numa competência.
158
+ *
159
+ * **Pré-filtra por jurisdição e vigência no banco**, antes de qualquer
160
+ * avaliação de condição. Avaliar a AST de todas as regras do país para cada
161
+ * cliente seria o desenho ingênuo que a premissa pede para evitar; aqui o
162
+ * índice `fiscal_rule_lookup_idx` reduz o conjunto a um punhado antes de o
163
+ * motor tocar nele.
164
+ *
165
+ * A regra do ESCRITÓRIO tem precedência sobre a global na mesma jurisdição —
166
+ * `DISTINCT ON` com `tenant_id NULLS LAST`, o mesmo padrão de
167
+ * `recurring_item_type`.
168
+ */
169
+ async function candidateRules(tx, input) {
170
+ const rows = await tx `
171
+ SELECT DISTINCT ON (jurisdiction_scope, coalesce(jurisdiction_uf,'-'), coalesce(jurisdiction_city_ibge,'-'))
172
+ ${tx.unsafe(RULE_COLS)}
173
+ FROM fiscal_rule
174
+ WHERE deleted_at IS NULL
175
+ AND item_type_id = ${input.itemTypeId}
176
+ AND valid_from <= ${input.referenceDate}::date
177
+ AND (valid_until IS NULL OR valid_until >= ${input.referenceDate}::date)
178
+ AND (
179
+ jurisdiction_scope = 'federal'
180
+ OR (jurisdiction_scope = 'state'
181
+ AND jurisdiction_uf = ${input.jurisdiction.uf})
182
+ OR (jurisdiction_scope = 'municipal'
183
+ AND jurisdiction_uf = ${input.jurisdiction.uf}
184
+ AND jurisdiction_city_ibge = ${input.jurisdiction.cityIbge})
185
+ )
186
+ ORDER BY jurisdiction_scope, coalesce(jurisdiction_uf,'-'), coalesce(jurisdiction_city_ibge,'-'),
187
+ tenant_id NULLS LAST, version DESC
188
+ `;
189
+ return rows.map(mapRule);
190
+ }
191
+ /**
192
+ * A regra mais específica que alcança o cliente.
193
+ *
194
+ * Municipal vence estadual, que vence federal. Um município que legisla sobre
195
+ * a obrigação está mais perto do fato que a União.
196
+ */
197
+ async function resolveRule(tx, input) {
198
+ const candidatas = await candidateRules(tx, input);
199
+ const ordem = { municipal: 0, state: 1, federal: 2 };
200
+ return ([...candidatas].sort((a, b) => ordem[a.jurisdiction.scope] - ordem[b.jurisdiction.scope])[0] ??
201
+ null);
202
+ }
203
+ /**
204
+ * Cria uma regra.
205
+ *
206
+ * A condição é validada AQUI, na escrita. Gravar uma AST malformada seria
207
+ * empurrar o erro para a madrugada da geração, onde a única saída seria não
208
+ * gerar sem explicar.
209
+ */
210
+ async function createFiscalRule(tx, input) {
211
+ (0, conditions_js_1.parseCondition)(input.conditions ?? { op: 'always' });
212
+ const status = input.status ?? 'pending_validation';
213
+ if (status === 'validated' && !input.validatedBy) {
214
+ throw new Error('Uma regra validada precisa de quem a validou.');
215
+ }
216
+ const validadaEm = status === 'validated' ? new Date() : null;
217
+ const validadaPor = status === 'validated' ? input.validatedBy : null;
218
+ // Três destinos possíveis, e cada um precisa de SQL diferente:
219
+ //
220
+ // `tenantId: null` → regra GLOBAL. Só o provisionamento consegue: a
221
+ // policy recusa `tenant_id NULL` vindo de sessão
222
+ // com tenant, e é essa recusa que impede um
223
+ // escritório de forjar regra nacional.
224
+ // `tenantId: '<uuid>'` → tenant explícito (provisionamento).
225
+ // ausente → o tenant da sessão, lido da GUC.
226
+ //
227
+ // Resolver isso com um único parâmetro misturaria valor e fragmento SQL —
228
+ // que compila e não faz o que parece.
229
+ const global = input.tenantId === null;
230
+ const explicito = typeof input.tenantId === 'string' ? input.tenantId : null;
231
+ const cond = tx.json((input.conditions ?? { op: 'always' }));
232
+ const due = input.dueRule ? tx.json(input.dueRule) : null;
233
+ const rows = global
234
+ ? await tx `
235
+ INSERT INTO fiscal_rule (
236
+ id, tenant_id, item_type_id, jurisdiction_scope, jurisdiction_uf, jurisdiction_city_ibge,
237
+ version, valid_from, valid_until, status, conditions, due_rule, source_reference, note,
238
+ validated_by, validated_at
239
+ ) VALUES (
240
+ ${(0, shared_1.uuidv7)()}, NULL, ${input.itemTypeId}, ${input.jurisdictionScope},
241
+ ${input.jurisdictionUf ?? null}, ${input.jurisdictionCityIbge ?? null},
242
+ ${input.version ?? 1}, ${input.validFrom}, ${input.validUntil ?? null},
243
+ ${status}, ${cond}, ${due},
244
+ ${input.sourceReference ?? null}, ${input.note ?? null}, ${validadaPor}, ${validadaEm}
245
+ )
246
+ RETURNING ${tx.unsafe(RULE_COLS)}
247
+ `
248
+ : await tx `
249
+ INSERT INTO fiscal_rule (
250
+ id, tenant_id, item_type_id, jurisdiction_scope, jurisdiction_uf, jurisdiction_city_ibge,
251
+ version, valid_from, valid_until, status, conditions, due_rule, source_reference, note,
252
+ validated_by, validated_at
253
+ ) VALUES (
254
+ ${(0, shared_1.uuidv7)()},
255
+ ${explicito ?? tx.unsafe("current_setting('app.current_tenant')::uuid")},
256
+ ${input.itemTypeId}, ${input.jurisdictionScope},
257
+ ${input.jurisdictionUf ?? null}, ${input.jurisdictionCityIbge ?? null},
258
+ ${input.version ?? 1}, ${input.validFrom}, ${input.validUntil ?? null},
259
+ ${status}, ${cond}, ${due},
260
+ ${input.sourceReference ?? null}, ${input.note ?? null}, ${validadaPor}, ${validadaEm}
261
+ )
262
+ RETURNING ${tx.unsafe(RULE_COLS)}
263
+ `;
264
+ return mapRule(rows[0]);
265
+ }
266
+ /**
267
+ * Publica uma nova versão, encerrando a anterior.
268
+ *
269
+ * **Não altera a versão antiga.** Ela recebe `valid_until` e continua lá,
270
+ * inteira: é ela que explica as obrigações já geradas. Editar a regra vigente
271
+ * em vez de versioná-la é como a mudança de amanhã reescreve o vencimento de
272
+ * ontem — e ninguém consegue mais dizer por que aquela data foi aquela.
273
+ */
274
+ async function supersedeFiscalRule(tx, input) {
275
+ const [atual] = await tx `
276
+ SELECT ${tx.unsafe(RULE_COLS)} FROM fiscal_rule
277
+ WHERE id = ${input.currentRuleId} AND deleted_at IS NULL
278
+ `;
279
+ if (!atual)
280
+ throw new Error('Regra não encontrada.');
281
+ if (input.validFrom <= iso(atual.valid_from)) {
282
+ throw new Error('A nova versão precisa começar depois do início da anterior.');
283
+ }
284
+ // O dia anterior ao início da nova: sem vão e sem sobreposição.
285
+ const fim = new Date(`${input.validFrom}T00:00:00Z`);
286
+ fim.setUTCDate(fim.getUTCDate() - 1);
287
+ await tx `
288
+ UPDATE fiscal_rule SET valid_until = ${iso(fim)}, updated_at = now()
289
+ WHERE id = ${input.currentRuleId}
290
+ `;
291
+ const proxima = await createFiscalRule(tx, {
292
+ itemTypeId: atual.item_type_id,
293
+ jurisdictionScope: atual.jurisdiction_scope,
294
+ jurisdictionUf: atual.jurisdiction_uf,
295
+ jurisdictionCityIbge: atual.jurisdiction_city_ibge,
296
+ validFrom: input.validFrom,
297
+ version: atual.version + 1,
298
+ tenantId: atual.tenant_id,
299
+ conditions: input.changes.conditions ?? atual.conditions,
300
+ dueRule: input.changes.dueRule ?? atual.due_rule,
301
+ status: input.changes.status ?? 'pending_validation',
302
+ sourceReference: input.changes.sourceReference ?? atual.source_reference,
303
+ ...(input.changes.note !== undefined ? { note: input.changes.note } : {}),
304
+ });
305
+ return { previous: mapRule({ ...atual, valid_until: fim }), next: proxima };
306
+ }
307
+ async function getFiscalRule(tx, id) {
308
+ const [r] = await tx `
309
+ SELECT ${tx.unsafe(RULE_COLS)} FROM fiscal_rule WHERE id = ${id} AND deleted_at IS NULL
310
+ `;
311
+ return r ? mapRule(r) : null;
312
+ }
313
+ async function setTenantRulePolicy(tx, input) {
314
+ await tx `
315
+ INSERT INTO tenant_rule_policy
316
+ (id, tenant_id, item_type_id, internal_lead_days, enabled, note, updated_by)
317
+ VALUES (
318
+ ${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid, ${input.itemTypeId},
319
+ ${input.internalLeadDays ?? null}, ${input.enabled ?? true}, ${input.note ?? null},
320
+ ${input.actorId ?? null}
321
+ )
322
+ ON CONFLICT (tenant_id, item_type_id) DO UPDATE SET
323
+ internal_lead_days = EXCLUDED.internal_lead_days,
324
+ enabled = EXCLUDED.enabled,
325
+ note = EXCLUDED.note,
326
+ updated_by = EXCLUDED.updated_by,
327
+ updated_at = now()
328
+ `;
329
+ }
330
+ async function listTenantRulePolicies(tx) {
331
+ const rows = await tx `
332
+ SELECT item_type_id, internal_lead_days, enabled, note FROM tenant_rule_policy
333
+ `;
334
+ return rows.map((r) => ({
335
+ itemTypeId: r.item_type_id,
336
+ internalLeadDays: r.internal_lead_days,
337
+ enabled: r.enabled,
338
+ note: r.note,
339
+ }));
340
+ }
341
+ /**
342
+ * A fila inteira: global e do escritório, com a procedência de cada linha.
343
+ *
344
+ * Sem filtro de vigência nem de jurisdição, ao contrário de `candidateRules` —
345
+ * são perguntas diferentes. Aquela responde "qual regra vale para este cliente
346
+ * hoje"; esta responde "o que existe e o que ainda não foi conferido", e uma
347
+ * regra vencida ou de outra UF continua sendo trabalho de governança.
348
+ */
349
+ async function listGovernanceRules(tx) {
350
+ const rows = await tx `
351
+ SELECT r.id, r.tenant_id, r.item_type_id,
352
+ t.key AS item_key, t.label AS item_label, t.sphere,
353
+ r.jurisdiction_scope, r.jurisdiction_uf, r.jurisdiction_city_ibge,
354
+ r.version, r.valid_from, r.valid_until, r.status,
355
+ r.source_reference, r.source_url, r.validated_at,
356
+ u.full_name AS validated_by_name, r.note
357
+ FROM fiscal_rule r
358
+ JOIN recurring_item_type t ON t.id = r.item_type_id
359
+ LEFT JOIN "user" u ON u.id = r.validated_by
360
+ WHERE r.deleted_at IS NULL AND t.deleted_at IS NULL
361
+ ORDER BY (r.status <> 'validated') DESC, t.sphere, t.label, r.version DESC
362
+ `;
363
+ return rows.map((r) => ({
364
+ id: r.id,
365
+ itemTypeId: r.item_type_id,
366
+ itemTypeKey: r.item_key,
367
+ itemTypeLabel: r.item_label,
368
+ sphere: r.sphere,
369
+ origin: r.tenant_id === null ? 'global' : 'tenant',
370
+ jurisdiction: {
371
+ scope: r.jurisdiction_scope,
372
+ uf: r.jurisdiction_uf,
373
+ cityIbge: r.jurisdiction_city_ibge,
374
+ },
375
+ version: r.version,
376
+ validFrom: iso(r.valid_from),
377
+ validUntil: r.valid_until ? iso(r.valid_until) : null,
378
+ status: r.status,
379
+ sourceReference: r.source_reference,
380
+ sourceUrl: r.source_url,
381
+ validatedAt: r.validated_at ? r.validated_at.toISOString() : null,
382
+ validatedByName: r.validated_by_name,
383
+ note: r.note,
384
+ // Regra global é do PRODUTO. O escritório lê, cria a própria em cima, e não
385
+ // reescreve a de todo mundo — a RLS já recusaria, e oferecer o botão seria
386
+ // prometer uma ação que o banco nega.
387
+ editable: r.tenant_id !== null,
388
+ }));
389
+ }
390
+ function summarizeGovernance(rules) {
391
+ const byStatus = {};
392
+ for (const r of rules)
393
+ byStatus[r.status] = (byStatus[r.status] ?? 0) + 1;
394
+ const withSource = rules.filter((r) => r.sourceUrl || r.sourceReference).length;
395
+ return {
396
+ total: rules.length,
397
+ byStatus,
398
+ withSource,
399
+ withoutSource: rules.length - withSource,
400
+ /*
401
+ * "Pronta para revisão" NÃO é "validada".
402
+ *
403
+ * Uma regra entra nesta contagem quando está pendente E tem uma fonte
404
+ * oficial anexada — ou seja, quando existe algo concreto para a pessoa
405
+ * conferir. Sem a fonte, pedir conferência é pedir que alguém procure a
406
+ * norma sozinho, e é assim que uma fila de governança vira uma fila parada.
407
+ */
408
+ readyForHumanReview: rules.filter((r) => r.status === 'pending_validation' && Boolean(r.sourceUrl || r.sourceReference)).length,
409
+ };
410
+ }
411
+ /**
412
+ * Registra a fonte e a observação de uma regra DO ESCRITÓRIO.
413
+ *
414
+ * Separado de validar de propósito: anexar evidência é preparação, e quem
415
+ * prepara não carimba. Não toca em `status`.
416
+ */
417
+ async function annotateFiscalRule(tx, input) {
418
+ if (input.sourceUrl && !/^https:\/\/[^\s"'<>]+$/i.test(input.sourceUrl)) {
419
+ throw new shared_1.ValidationError('A fonte precisa ser uma URL https.');
420
+ }
421
+ const rows = await tx `
422
+ UPDATE fiscal_rule
423
+ SET source_url = COALESCE(${input.sourceUrl ?? null}, source_url),
424
+ source_reference = COALESCE(${input.sourceReference ?? null}, source_reference),
425
+ note = COALESCE(${input.note ?? null}, note),
426
+ updated_at = now()
427
+ WHERE id = ${input.id} AND tenant_id IS NOT NULL AND deleted_at IS NULL
428
+ RETURNING id
429
+ `;
430
+ if (!rows[0]) {
431
+ throw new shared_1.ValidationError('Regra não encontrada neste escritório. Regras globais do produto não são editáveis aqui — crie uma regra do escritório para sobrepor.');
432
+ }
433
+ }
434
+ /**
435
+ * O carimbo humano de conferência.
436
+ *
437
+ * Três guardas, e nenhum é redundante:
438
+ *
439
+ * 1. **Só regra do escritório.** A global é do produto; conferi-la para todo o
440
+ * Brasil não é decisão de um tenant.
441
+ * 2. **`validatedBy` obrigatório e vindo da SESSÃO**, nunca do corpo. Uma regra
442
+ * validada precisa responder "quem conferiu" com um nome que a pessoa não
443
+ * escolheu para si.
444
+ * 3. **Fonte obrigatória.** Validar sem apontar a norma é registrar uma opinião
445
+ * com aparência de conferência — e é exatamente o que a trilha não deve
446
+ * permitir que se pareça com evidência depois.
447
+ */
448
+ async function validateFiscalRule(tx, input) {
449
+ const atual = await tx `
450
+ SELECT id, source_url, source_reference FROM fiscal_rule
451
+ WHERE id = ${input.id} AND tenant_id IS NOT NULL AND deleted_at IS NULL
452
+ `;
453
+ const regra = atual[0];
454
+ if (!regra) {
455
+ throw new shared_1.ValidationError('Regra não encontrada neste escritório. Regras globais do produto não são conferidas aqui.');
456
+ }
457
+ if (!regra.source_url && !regra.source_reference) {
458
+ throw new shared_1.ValidationError('Antes de conferir, registre a fonte oficial da regra. Conferência sem fonte não é evidência.');
459
+ }
460
+ await tx `
461
+ UPDATE fiscal_rule
462
+ SET status = 'validated',
463
+ validated_by = ${input.validatedBy},
464
+ validated_at = now(),
465
+ note = COALESCE(${input.note ?? null}, note),
466
+ updated_at = now()
467
+ WHERE id = ${input.id} AND tenant_id IS NOT NULL AND deleted_at IS NULL
468
+ `;
469
+ }
470
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/fiscal/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CIRCUIT_MAX_OPEN_MS = exports.CIRCUIT_BASE_OPEN_MS = exports.CIRCUIT_FAILURE_THRESHOLD = void 0;
4
+ exports.readProviderCircuit = readProviderCircuit;
5
+ exports.recordProviderSuccess = recordProviderSuccess;
6
+ exports.recordProviderFailure = recordProviderFailure;
7
+ const shared_1 = require("@baruk/shared");
8
+ /**
9
+ * Quantas falhas seguidas abrem o disjuntor.
10
+ *
11
+ * Três, e não uma: um `503` isolado é ruído normal de um serviço público, e
12
+ * abrir na primeira faria a automação passar mais tempo desligada do que ligada.
13
+ * Três seguidas já não são ruído.
14
+ */
15
+ exports.CIRCUIT_FAILURE_THRESHOLD = 3;
16
+ /** Espera inicial com o disjuntor aberto; dobra a cada reabertura falha. */
17
+ exports.CIRCUIT_BASE_OPEN_MS = 15 * 60_000;
18
+ exports.CIRCUIT_MAX_OPEN_MS = 4 * 60 * 60_000;
19
+ /**
20
+ * Lê o disjuntor e diz se este ciclo pode chamar o provedor.
21
+ *
22
+ * Ausência de linha é `closed`: um provedor que nunca falhou não precisa de
23
+ * registro para ser confiável, e criar a linha na leitura faria toda consulta
24
+ * escrever.
25
+ */
26
+ async function readProviderCircuit(tx, key, now = new Date()) {
27
+ const [row] = await tx `
28
+ SELECT state, consecutive_failures, open_until, last_error_class
29
+ FROM fiscal_provider_circuit
30
+ WHERE source = ${key.source} AND environment = ${key.environment}
31
+ `;
32
+ if (!row) {
33
+ return {
34
+ state: 'closed',
35
+ consecutiveFailures: 0,
36
+ openUntil: null,
37
+ lastErrorClass: null,
38
+ allows: true,
39
+ probe: false,
40
+ };
41
+ }
42
+ // Aberto com o prazo vencido é meio-aberto NA LEITURA, sem escrita: quem
43
+ // materializa a transição é a primeira tentativa que de fato acontecer.
44
+ // Escrever aqui faria toda leitura de painel mexer no estado do disjuntor.
45
+ const expirou = row.state === 'open' && row.open_until !== null && row.open_until <= now;
46
+ const state = expirou ? 'half_open' : row.state;
47
+ return {
48
+ state,
49
+ consecutiveFailures: row.consecutive_failures,
50
+ openUntil: row.open_until,
51
+ lastErrorClass: row.last_error_class,
52
+ allows: state !== 'open',
53
+ probe: state === 'half_open',
54
+ };
55
+ }
56
+ /**
57
+ * Registra sucesso: fecha o disjuntor e zera o contador.
58
+ *
59
+ * Zera de uma vez, e não gradualmente. Um contador que decai devagar mantém o
60
+ * provedor "quase aberto" por horas depois de ele ter voltado — e a primeira
61
+ * oscilação seguinte o reabre sem motivo.
62
+ */
63
+ async function recordProviderSuccess(tx, key, now = new Date()) {
64
+ await tx `
65
+ INSERT INTO fiscal_provider_circuit (
66
+ id, tenant_id, source, environment, state, consecutive_failures,
67
+ last_error_class, opened_at, open_until, last_success_at, updated_at
68
+ ) VALUES (
69
+ ${(0, shared_1.uuidv7)()}, ${key.tenantId}, ${key.source}, ${key.environment}, 'closed', 0,
70
+ NULL, NULL, NULL, ${now}, now()
71
+ )
72
+ ON CONFLICT (tenant_id, source, environment)
73
+ DO UPDATE SET state = 'closed', consecutive_failures = 0, last_error_class = NULL,
74
+ opened_at = NULL, open_until = NULL, last_success_at = ${now},
75
+ updated_at = now()
76
+ `;
77
+ }
78
+ /**
79
+ * Registra falha atribuível ao provedor. Abre o disjuntor ao atingir o limite.
80
+ *
81
+ * A espera dobra a cada abertura porque um provedor que falha três vezes,
82
+ * volta, e falha três vezes de novo não está oscilando — está fora, e insistir
83
+ * no mesmo intervalo é a rajada de novo, só que espaçada.
84
+ */
85
+ async function recordProviderFailure(tx, key, input) {
86
+ const now = input.now ?? new Date();
87
+ const atual = await readProviderCircuit(tx, key, now);
88
+ const falhas = atual.consecutiveFailures + 1;
89
+ const abre = falhas >= exports.CIRCUIT_FAILURE_THRESHOLD;
90
+ // O expoente conta as aberturas ALÉM do limite, e não as falhas: sem isso a
91
+ // terceira falha já pediria a espera de uma décima segunda.
92
+ const excedente = Math.max(0, falhas - exports.CIRCUIT_FAILURE_THRESHOLD);
93
+ const esperaMs = abre
94
+ ? Math.min(exports.CIRCUIT_BASE_OPEN_MS * 2 ** Math.min(excedente, 4), exports.CIRCUIT_MAX_OPEN_MS)
95
+ : 0;
96
+ const openUntil = abre ? new Date(now.getTime() + esperaMs) : null;
97
+ await tx `
98
+ INSERT INTO fiscal_provider_circuit (
99
+ id, tenant_id, source, environment, state, consecutive_failures,
100
+ last_error_class, opened_at, open_until, last_failure_at, updated_at
101
+ ) VALUES (
102
+ ${(0, shared_1.uuidv7)()}, ${key.tenantId}, ${key.source}, ${key.environment},
103
+ ${abre ? 'open' : 'closed'}, ${falhas}, ${input.errorClass},
104
+ ${abre ? now : null}, ${openUntil}, ${now}, now()
105
+ )
106
+ ON CONFLICT (tenant_id, source, environment)
107
+ DO UPDATE SET state = ${abre ? 'open' : 'closed'},
108
+ consecutive_failures = ${falhas},
109
+ last_error_class = ${input.errorClass},
110
+ opened_at = ${abre ? now : null},
111
+ open_until = ${openUntil},
112
+ last_failure_at = ${now},
113
+ updated_at = now()
114
+ `;
115
+ return {
116
+ state: abre ? 'open' : 'closed',
117
+ consecutiveFailures: falhas,
118
+ openUntil,
119
+ lastErrorClass: input.errorClass,
120
+ allows: !abre,
121
+ probe: false,
122
+ };
123
+ }
124
+ //# sourceMappingURL=circuit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit.js","sourceRoot":"","sources":["../../../../src/fiscal/sync/circuit.ts"],"names":[],"mappings":"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"}