@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
@@ -3,20 +3,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.contactabilityOf = contactabilityOf;
4
4
  exports.normalizeEmail = normalizeEmail;
5
5
  exports.normalizePhone = normalizePhone;
6
+ exports.normalizeUf = normalizeUf;
6
7
  exports.createClient = createClient;
7
8
  exports.listClients = listClients;
8
9
  exports.getClient = getClient;
9
10
  exports.renameClient = renameClient;
11
+ exports.tenantHasPhoneChannel = tenantHasPhoneChannel;
10
12
  exports.listClientsPaged = listClientsPaged;
11
13
  exports.updateClient = updateClient;
12
14
  exports.softDeleteClient = softDeleteClient;
13
15
  exports.findClientIdByDocument = findClientIdByDocument;
16
+ exports.assignClientResponsible = assignClientResponsible;
17
+ exports.portfolioByResponsible = portfolioByResponsible;
14
18
  const shared_1 = require("@baruk/shared");
15
19
  const phone_js_1 = require("../contacts/phone.js");
16
- function contactabilityOf(input) {
20
+ const ibge_js_1 = require("./ibge.js");
21
+ function contactabilityOf(input,
22
+ /**
23
+ * Canais que o ESCRITÓRIO tem operacionais. Omitido = só e-mail, que é o
24
+ * estado de quem ainda não conectou telefone — e é o padrão hoje.
25
+ */
26
+ channels = {}) {
17
27
  const email = input.email?.trim() ? 'ready' : 'missing';
18
28
  const phone = input.phone?.trim() ? 'ready' : 'missing';
19
- return { email, phone, reachable: email === 'ready' || phone === 'ready' };
29
+ const phoneChannelLigado = channels.phone === true;
30
+ const status = email === 'ready'
31
+ ? 'email_ready'
32
+ : phone === 'ready'
33
+ ? phoneChannelLigado
34
+ ? 'phone_only'
35
+ : 'phone_no_channel'
36
+ : 'no_channel';
37
+ return {
38
+ email,
39
+ phone,
40
+ // `reachable` mantém o significado antigo — "tem contato cadastrado" — para
41
+ // não mudar o comportamento de quem já o consulta. Quem quer saber se a
42
+ // automação alcança usa `automated`.
43
+ reachable: email === 'ready' || phone === 'ready',
44
+ status,
45
+ automated: status === 'email_ready' || status === 'phone_only',
46
+ };
20
47
  }
21
48
  /**
22
49
  * Normalização de contato.
@@ -41,7 +68,12 @@ function normalizePhone(v) {
41
68
  return null;
42
69
  return plus ? `+${digits}` : digits;
43
70
  }
44
- function mapRow(r) {
71
+ /** UF só entra em caixa alta; o banco recusa o resto, e recusar cedo dá erro melhor. */
72
+ function normalizeUf(v) {
73
+ const t = v?.trim().toUpperCase();
74
+ return t && /^[A-Z]{2}$/.test(t) ? t : null;
75
+ }
76
+ function mapRow(r, channels = {}) {
45
77
  return {
46
78
  id: r.id,
47
79
  tenantId: r.tenant_id,
@@ -52,7 +84,16 @@ function mapRow(r) {
52
84
  phone: r.phone ?? null,
53
85
  status: r.status,
54
86
  createdAt: r.created_at.toISOString(),
55
- contactability: contactabilityOf({ email: r.email, phone: r.phone }),
87
+ responsibleUserId: r.responsible_user_id ?? null,
88
+ municipality: r.municipality ?? null,
89
+ stateUf: r.state_uf ?? null,
90
+ legalName: r.legal_name ?? null,
91
+ addressLine: r.address_line ?? null,
92
+ postalCode: r.postal_code ?? null,
93
+ notes: r.notes ?? null,
94
+ municipalityIbgeCode: r.municipality_ibge_code ?? null,
95
+ communicationClearedAt: r.communication_cleared_at?.toISOString() ?? null,
96
+ contactability: contactabilityOf({ email: r.email, phone: r.phone }, channels),
56
97
  };
57
98
  }
58
99
  /**
@@ -70,21 +111,37 @@ function asDuplicateDocument(err) {
70
111
  }
71
112
  }
72
113
  async function createClient(tx, input) {
114
+ // Antes de gravar: o código IBGE não pode contradizer a UF. Aqui o estado
115
+ // resultante é o próprio input — não há linha anterior com que se misturar.
116
+ (0, ibge_js_1.assertIbgeCoherent)(input.municipalityIbgeCode?.trim() || null, normalizeUf(input.stateUf));
73
117
  // tenant_id vem da GUC — nunca do input. A WITH CHECK da RLS recusa qualquer
74
118
  // tentativa de gravar fora do tenant corrente.
75
119
  try {
76
120
  const rows = await tx `
77
- INSERT INTO client (id, tenant_id, client_type, display_name, document_number,
78
- email, phone, phone_e164, created_by)
121
+ INSERT INTO client (id, tenant_id, client_type, display_name, legal_name, document_number,
122
+ email, phone, phone_e164, address_line, municipality, state_uf,
123
+ municipality_ibge_code,
124
+ postal_code, notes, responsible_user_id, contract_started_on,
125
+ import_batch_id, created_by)
79
126
  VALUES (
80
127
  ${(0, shared_1.uuidv7)()},
81
128
  current_setting('app.current_tenant')::uuid,
82
129
  ${input.clientType ?? 'pj'},
83
130
  ${input.displayName},
131
+ ${input.legalName?.trim() || null},
84
132
  ${input.documentNumber ?? null},
85
133
  ${normalizeEmail(input.email)},
86
134
  ${normalizePhone(input.phone)},
87
135
  ${(0, phone_js_1.toE164OrNull)(input.phone)},
136
+ ${input.addressLine?.trim() || null},
137
+ ${input.municipality?.trim() || null},
138
+ ${normalizeUf(input.stateUf)},
139
+ ${input.municipalityIbgeCode?.trim() || null},
140
+ ${input.postalCode?.trim() || null},
141
+ ${input.notes?.trim() || null},
142
+ ${input.responsibleUserId ?? null},
143
+ ${input.contractStartedOn ?? null},
144
+ ${input.importBatchId ?? null},
88
145
  ${input.createdBy ?? null}
89
146
  )
90
147
  RETURNING id, tenant_id, client_type, display_name, document_number, email, phone,
@@ -108,7 +165,9 @@ async function listClients(tx) {
108
165
  }
109
166
  async function getClient(tx, id) {
110
167
  const rows = await tx `
111
- SELECT id, tenant_id, client_type, display_name, document_number, email, phone, status, created_at
168
+ SELECT id, tenant_id, client_type, display_name, legal_name, document_number, email, phone,
169
+ status, created_at, responsible_user_id, address_line, municipality, state_uf,
170
+ municipality_ibge_code, postal_code, notes
112
171
  FROM client
113
172
  WHERE id = ${id} AND deleted_at IS NULL
114
173
  `;
@@ -129,24 +188,68 @@ async function renameClient(tx, id, displayName) {
129
188
  `;
130
189
  return rows.count;
131
190
  }
191
+ /**
192
+ * O escritório tem canal de telefone operacional?
193
+ *
194
+ * Decide se um cliente que só tem telefone é `phone_only` (situação normal) ou
195
+ * `phone_no_channel` (pendência). A consulta roda sob RLS, então enxerga só o
196
+ * `channel_binding` do tenant do contexto.
197
+ *
198
+ * Uma consulta por listagem, não uma por linha: a resposta é a mesma para todos
199
+ * os clientes do escritório.
200
+ */
201
+ async function tenantHasPhoneChannel(tx) {
202
+ const rows = await tx `
203
+ SELECT count(*)::int AS n FROM channel_binding
204
+ WHERE channel IN ('whatsapp', 'sms') AND revoked_at IS NULL
205
+ `;
206
+ return (rows[0]?.n ?? 0) > 0;
207
+ }
132
208
  async function listClientsPaged(tx, filter = {}) {
133
209
  const limit = Math.min(filter.limit ?? 20, 100);
134
210
  const offset = filter.offset ?? 0;
135
211
  const like = filter.search ? `%${filter.search}%` : null;
136
212
  const rows = await tx `
137
213
  SELECT id, tenant_id, client_type, display_name, document_number, email, phone, status, created_at,
214
+ responsible_user_id, municipality, state_uf, communication_cleared_at,
138
215
  count(*) OVER() AS total
139
216
  FROM client
140
217
  WHERE deleted_at IS NULL
141
218
  AND (${filter.status ?? null}::text IS NULL OR status = ${filter.status ?? null})
142
219
  AND (${like}::text IS NULL OR display_name ILIKE ${like} OR document_number ILIKE ${like})
220
+ AND (${filter.responsibleUserId ?? null}::text IS NULL
221
+ OR (${filter.responsibleUserId ?? null} = 'unassigned' AND responsible_user_id IS NULL)
222
+ OR responsible_user_id::text = ${filter.responsibleUserId ?? null})
143
223
  ORDER BY created_at DESC
144
224
  LIMIT ${limit} OFFSET ${offset}
145
225
  `;
146
226
  const total = rows[0] ? Number(rows[0].total) : 0;
147
- return { items: rows.map((r) => mapRow(r)), total };
227
+ const phone = await tenantHasPhoneChannel(tx);
228
+ return { items: rows.map((r) => mapRow(r, { phone })), total };
148
229
  }
149
230
  async function updateClient(tx, id, input) {
231
+ // Coerência IBGE↔UF do ESTADO RESULTANTE, não do corpo da requisição.
232
+ //
233
+ // Um PATCH que manda só `stateUf` deixa no banco o código IBGE de antes;
234
+ // validar apenas o payload aprovaria trocar a UF de GO para SP mantendo o
235
+ // município goiano gravado. Por isso lemos a linha e mesclamos antes.
236
+ //
237
+ // O SELECT só acontece quando um dos dois campos está no corpo: o PATCH
238
+ // comum (nome, telefone, status) continua sendo uma única query.
239
+ if ('municipalityIbgeCode' in input || 'stateUf' in input) {
240
+ const [atual] = await tx `
241
+ SELECT state_uf, municipality_ibge_code FROM client WHERE id = ${id} AND deleted_at IS NULL
242
+ `;
243
+ // Sem linha, quem responde é o UPDATE abaixo com 0 afetadas (404). Recusar
244
+ // aqui por validação transformaria "cliente não existe" em "dado inválido".
245
+ if (atual) {
246
+ const code = 'municipalityIbgeCode' in input
247
+ ? input.municipalityIbgeCode?.trim() || null
248
+ : atual.municipality_ibge_code;
249
+ const uf = 'stateUf' in input ? normalizeUf(input.stateUf) : atual.state_uf;
250
+ (0, ibge_js_1.assertIbgeCoherent)(code, uf);
251
+ }
252
+ }
150
253
  // Corrigir um documento para um que já existe cai na mesma violação — e o
151
254
  // escritório precisa da mesma explicação, não de um 500.
152
255
  // Casts explícitos: parâmetros NULL sem tipo quebram COALESCE ("could not
@@ -155,7 +258,7 @@ async function updateClient(tx, id, input) {
155
258
  const rows = await tx `
156
259
  UPDATE client SET
157
260
  display_name = COALESCE(${input.displayName ?? null}::text, display_name),
158
- legal_name = COALESCE(${input.legalName ?? null}::text, legal_name),
261
+ legal_name = CASE WHEN ${'legalName' in input} THEN ${input.legalName?.trim() || null}::text ELSE legal_name END,
159
262
  document_number = COALESCE(${input.documentNumber ?? null}::text, document_number),
160
263
  email = COALESCE(${normalizeEmail(input.email)}::citext, email),
161
264
  phone = COALESCE(${normalizePhone(input.phone)}::text, phone),
@@ -167,6 +270,14 @@ async function updateClient(tx, id, input) {
167
270
  phone_e164 = CASE WHEN ${input.phone ?? null}::text IS NULL THEN phone_e164
168
271
  ELSE ${(0, phone_js_1.toE164OrNull)(input.phone)}::text END,
169
272
  status = COALESCE(${input.status ?? null}::text, status),
273
+ -- Presença, nao valor: ausente preserva, null apaga. Um COALESCE aqui
274
+ -- tornaria a UF errada permanente -- so daria para troca-la por outra.
275
+ address_line = CASE WHEN ${'addressLine' in input} THEN ${input.addressLine?.trim() || null}::text ELSE address_line END,
276
+ municipality = CASE WHEN ${'municipality' in input} THEN ${input.municipality?.trim() || null}::text ELSE municipality END,
277
+ municipality_ibge_code = CASE WHEN ${'municipalityIbgeCode' in input} THEN ${input.municipalityIbgeCode?.trim() || null}::text ELSE municipality_ibge_code END,
278
+ state_uf = CASE WHEN ${'stateUf' in input} THEN ${normalizeUf(input.stateUf)}::text ELSE state_uf END,
279
+ postal_code = CASE WHEN ${'postalCode' in input} THEN ${input.postalCode?.trim() || null}::text ELSE postal_code END,
280
+ notes = CASE WHEN ${'notes' in input} THEN ${input.notes?.trim() || null}::text ELSE notes END,
170
281
  updated_by = ${input.updatedBy ?? null}::uuid,
171
282
  updated_at = now(),
172
283
  version = version + 1
@@ -196,4 +307,70 @@ async function findClientIdByDocument(tx, documentNumber) {
196
307
  `;
197
308
  return rows[0]?.id ?? null;
198
309
  }
310
+ /**
311
+ * Troca o responsável pela carteira de um cliente.
312
+ *
313
+ * Devolve quem era e quem passou a ser, para que a auditoria registre a
314
+ * TRANSIÇÃO e não apenas o destino. "Passou a ser da Ana" não responde a
315
+ * pergunta que se faz meses depois — "saiu de quem?" — e é essa que importa
316
+ * quando um cliente deixa de ser atendido.
317
+ *
318
+ * O usuário precisa ser membro ativo do escritório. Sem essa checagem, a FK
319
+ * aceitaria qualquer `user.id` do banco inteiro, inclusive de outro tenant:
320
+ * FKs ignoram RLS, então a barreira tem de ser explícita aqui.
321
+ */
322
+ async function assignClientResponsible(tx, input) {
323
+ if (input.responsibleUserId) {
324
+ const [m] = await tx `
325
+ SELECT count(*)::int AS n FROM membership
326
+ WHERE user_id = ${input.responsibleUserId}
327
+ AND status = 'active' AND deleted_at IS NULL
328
+ `;
329
+ if ((m?.n ?? 0) === 0) {
330
+ throw new shared_1.NotFoundError('Usuário não é membro ativo deste escritório.');
331
+ }
332
+ }
333
+ const [before] = await tx `
334
+ SELECT responsible_user_id FROM client WHERE id = ${input.clientId} AND deleted_at IS NULL
335
+ `;
336
+ if (!before)
337
+ throw new shared_1.NotFoundError('Cliente não encontrado.');
338
+ await tx `
339
+ UPDATE client
340
+ SET responsible_user_id = ${input.responsibleUserId}, updated_at = now()
341
+ WHERE id = ${input.clientId} AND deleted_at IS NULL
342
+ `;
343
+ return {
344
+ clientId: input.clientId,
345
+ from: before.responsible_user_id,
346
+ to: input.responsibleUserId,
347
+ };
348
+ }
349
+ /**
350
+ * A carteira dividida por responsável.
351
+ *
352
+ * O balde `null` — clientes sem dono — vem junto, e vem por último, em vez de
353
+ * ser omitido. Uma carteira recém-importada é inteiramente desse balde, e uma
354
+ * tela que só lista responsáveis existentes mostraria zero clientes num
355
+ * escritório com trezentos.
356
+ */
357
+ async function portfolioByResponsible(tx) {
358
+ const rows = await tx `
359
+ SELECT c.responsible_user_id,
360
+ u.full_name,
361
+ count(*)::int AS clients,
362
+ count(*) FILTER (WHERE c.email IS NULL)::int AS sem_canal
363
+ FROM client c
364
+ LEFT JOIN "user" u ON u.id = c.responsible_user_id
365
+ WHERE c.deleted_at IS NULL
366
+ GROUP BY c.responsible_user_id, u.full_name
367
+ ORDER BY (c.responsible_user_id IS NULL), u.full_name NULLS LAST
368
+ `;
369
+ return rows.map((r) => ({
370
+ responsibleUserId: r.responsible_user_id,
371
+ responsibleName: r.full_name,
372
+ clients: r.clients,
373
+ semCanalAutomatico: r.sem_canal,
374
+ }));
375
+ }
199
376
  //# sourceMappingURL=repository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/clients/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/clients/repository.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BRANDING_KEYS = exports.BrandingValidationError = void 0;
3
4
  exports.getTenantBranding = getTenantBranding;
4
5
  exports.senderFor = senderFor;
6
+ exports.parseBrandingInput = parseBrandingInput;
7
+ exports.updateTenantBranding = updateTenantBranding;
8
+ const shared_1 = require("@baruk/shared");
5
9
  /**
6
10
  * Padrão neutro do produto — deliberadamente SEM marca.
7
11
  *
@@ -137,4 +141,190 @@ function senderFor(branding, fallbackFrom) {
137
141
  const name = branding.officeName.replace(/["<>\\]/g, '').trim();
138
142
  return name ? `${name} <${address}>` : fallbackFrom;
139
143
  }
144
+ /**
145
+ * Erro de validação de marca.
146
+ *
147
+ * Estende `ValidationError` de propósito, em vez de ser um `Error` próprio: a
148
+ * borda HTTP já mapeia todo `AppError` para o status certo, e um erro fora
149
+ * dessa hierarquia sairia como 500 — culpando o servidor por um campo mal
150
+ * preenchido, e escondendo do formulário qual campo foi. O `field` viaja em
151
+ * `details` para a tela poder apontar a linha errada.
152
+ */
153
+ class BrandingValidationError extends shared_1.ValidationError {
154
+ field;
155
+ constructor(field, message) {
156
+ super(message, { field });
157
+ this.field = field;
158
+ }
159
+ }
160
+ exports.BrandingValidationError = BrandingValidationError;
161
+ function strictColor(field, v) {
162
+ if (typeof v !== 'string' || !/^#[0-9a-fA-F]{6}$/.test(v)) {
163
+ throw new BrandingValidationError(field, `${field}: use uma cor no formato #RRGGBB.`);
164
+ }
165
+ return v;
166
+ }
167
+ function strictText(field, v, max) {
168
+ if (typeof v !== 'string') {
169
+ throw new BrandingValidationError(field, `${field}: texto inválido.`);
170
+ }
171
+ const t = v.trim();
172
+ if (!t)
173
+ throw new BrandingValidationError(field, `${field}: não pode ficar em branco.`);
174
+ if (t.length > max) {
175
+ throw new BrandingValidationError(field, `${field}: máximo de ${max} caracteres.`);
176
+ }
177
+ return t;
178
+ }
179
+ function strictHttpsUrl(field, v) {
180
+ const t = typeof v === 'string' ? v.trim() : '';
181
+ if (!/^https:\/\/[^\s"'<>]+$/i.test(t)) {
182
+ throw new BrandingValidationError(field, `${field}: informe uma URL https válida.`);
183
+ }
184
+ return t;
185
+ }
186
+ function strictLogoUrl(v) {
187
+ const url = strictHttpsUrl('logoUrl', v);
188
+ const path = url.split(/[?#]/)[0] ?? '';
189
+ if (!/\.(png|jpe?g)$/i.test(path)) {
190
+ // A recusa é específica de propósito: SVG é o formato em que os kits de
191
+ // marca vivem, e é exatamente o que Gmail e Outlook não desenham. Aceitar
192
+ // produziria um cabeçalho vazio — sem imagem e sem o nome que o fallback
193
+ // teria escrito.
194
+ throw new BrandingValidationError('logoUrl', 'logoUrl: a logomarca precisa ser .png, .jpg ou .jpeg. SVG não é renderizado por clientes de e-mail — rasterize antes.');
195
+ }
196
+ return url;
197
+ }
198
+ function strictFontFamily(v) {
199
+ const t = strictText('fontFamily', v, 160);
200
+ if (!/^[A-Za-z0-9 ,.'-]+$/.test(t)) {
201
+ throw new BrandingValidationError('fontFamily', 'fontFamily: use apenas letras, dígitos, espaço, vírgula, ponto, hífen e aspa simples. A stack vai para dentro de um atributo style, e os demais caracteres permitiriam escrever CSS na mensagem.');
202
+ }
203
+ return t;
204
+ }
205
+ /** Campos de cor, para não repetir a lista em dois lugares. */
206
+ const COLOR_FIELDS = [
207
+ 'primaryColor',
208
+ 'secondaryColor',
209
+ 'accentColor',
210
+ 'backgroundColor',
211
+ 'textColor',
212
+ 'mutedColor',
213
+ ];
214
+ /**
215
+ * Valida a entrada e devolve o objeto a persistir em `tenant.settings.branding`.
216
+ *
217
+ * Só as chaves PRESENTES na entrada aparecem no resultado — quem manda três
218
+ * campos altera três campos. `null` vira ausência do campo no armazenado, que é
219
+ * como o leitor representa "não configurado".
220
+ */
221
+ function parseBrandingInput(input) {
222
+ const out = {};
223
+ const set = (k, v) => {
224
+ if (v !== null)
225
+ out[k] = v;
226
+ };
227
+ if ('officeName' in input) {
228
+ set('officeName', input.officeName === null ? null : strictText('officeName', input.officeName, 160));
229
+ }
230
+ if ('signatureName' in input) {
231
+ set('signatureName', input.signatureName === null ? null : strictText('signatureName', input.signatureName, 160));
232
+ }
233
+ if ('tagline' in input) {
234
+ set('tagline', input.tagline === null ? null : strictText('tagline', input.tagline, 120));
235
+ }
236
+ if ('logoUrl' in input) {
237
+ set('logoUrl', input.logoUrl === null ? null : strictLogoUrl(input.logoUrl));
238
+ }
239
+ if ('logoKind' in input) {
240
+ if (input.logoKind === null)
241
+ set('logoKind', null);
242
+ else if (input.logoKind === 'symbol' || input.logoKind === 'lockup')
243
+ out.logoKind = input.logoKind;
244
+ else
245
+ throw new BrandingValidationError('logoKind', "logoKind: use 'symbol' ou 'lockup'.");
246
+ }
247
+ for (const field of COLOR_FIELDS) {
248
+ if (field in input) {
249
+ const v = input[field];
250
+ set(field, v === null ? null : strictColor(field, v));
251
+ }
252
+ }
253
+ if ('fontFamily' in input) {
254
+ set('fontFamily', input.fontFamily === null ? null : strictFontFamily(input.fontFamily));
255
+ }
256
+ if ('supportEmail' in input) {
257
+ if (input.supportEmail === null)
258
+ set('supportEmail', null);
259
+ else {
260
+ const t = strictText('supportEmail', input.supportEmail, 120);
261
+ if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(t)) {
262
+ throw new BrandingValidationError('supportEmail', 'supportEmail: e-mail inválido.');
263
+ }
264
+ out.supportEmail = t;
265
+ }
266
+ }
267
+ if ('supportPhone' in input) {
268
+ set('supportPhone', input.supportPhone === null ? null : strictText('supportPhone', input.supportPhone, 40));
269
+ }
270
+ if ('website' in input) {
271
+ set('website', input.website === null ? null : strictHttpsUrl('website', input.website));
272
+ }
273
+ return out;
274
+ }
275
+ /**
276
+ * Chaves que a marca ocupa dentro de `tenant.settings.branding`. Serve para o
277
+ * `null` REMOVER a chave em vez de gravar um nulo que o leitor teria de
278
+ * distinguir de ausente.
279
+ */
280
+ exports.BRANDING_KEYS = [
281
+ 'officeName',
282
+ 'signatureName',
283
+ 'tagline',
284
+ 'logoUrl',
285
+ 'logoKind',
286
+ ...COLOR_FIELDS,
287
+ 'fontFamily',
288
+ 'supportEmail',
289
+ 'supportPhone',
290
+ 'website',
291
+ ];
292
+ /**
293
+ * Grava a marca do tenant CORRENTE.
294
+ *
295
+ * Dois pontos que a implementação não pode perder de vista:
296
+ *
297
+ * 1. **`tenant` não tem RLS.** É a tabela raiz — a fonte da fronteira, não uma
298
+ * linha protegida por ela. Por isso o `WHERE` amarra na GUC e a função NÃO
299
+ * aceita `tenantId` por parâmetro: parâmetro é pedido do chamador, e pedido
300
+ * do chamador não é fronteira. Sem contexto, zero linhas e erro.
301
+ *
302
+ * 2. **O merge acontece no banco, não na aplicação.** `settings` guarda mais
303
+ * que a marca. Ler-modificar-escrever perderia a escrita concorrente de
304
+ * outra chave; `jsonb ||` resolve dentro da própria instrução.
305
+ */
306
+ async function updateTenantBranding(tx, input) {
307
+ const patch = parseBrandingInput(input);
308
+ const removals = Object.entries(input)
309
+ .filter(([k, v]) => v === null && exports.BRANDING_KEYS.includes(k))
310
+ .map(([k]) => k);
311
+ const rows = await tx `
312
+ UPDATE tenant
313
+ SET settings = jsonb_set(
314
+ settings,
315
+ '{branding}',
316
+ (COALESCE(settings -> 'branding', '{}'::jsonb) - ${removals}::text[])
317
+ || ${tx.json(patch)}::jsonb,
318
+ true
319
+ ),
320
+ updated_at = now()
321
+ WHERE id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
322
+ AND deleted_at IS NULL
323
+ RETURNING id
324
+ `;
325
+ if (!rows[0]) {
326
+ throw new BrandingValidationError('tenant', 'Sem contexto de escritório: a marca não pode ser gravada.');
327
+ }
328
+ return getTenantBranding(tx);
329
+ }
140
330
  //# sourceMappingURL=branding.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"branding.js","sourceRoot":"","sources":["../../../src/collection/branding.ts"],"names":[],"mappings":";;AA2IA,8CAmDC;AAUD,8BAKC;AA5ID;;;;;;GAMG;AACH,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,MAAM,cAAc,GAAG,SAAS,CAAC;AACjC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AACrC,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,gFAAgF;AAChF,MAAM,kBAAkB,GAAG,qDAAqD,CAAC;AAEjF;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,CAAU,EAAE,QAAgB;IAC7C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7E,CAAC;AAED,iFAAiF;AACjF,SAAS,OAAO,CAAC,CAAU;IACzB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,CAAU;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,CAAU;IAChC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,kBAAkB,CAAC;IACrD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,kBAAkB,CAAC;IACpE,8EAA8E;IAC9E,0EAA0E;IAC1E,OAAO,GAAG,CAAC,IAAI,kBAAkB,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,YAAY,CAAC,CAAU;IAC9B,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC9C,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU,EAAE,GAAG,GAAG,GAAG;IACrC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtB,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,EAAM;IAC5C;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAsE;;;;GAI1F,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAA4B,CAAC;IAEvE,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,YAAY,IAAI,yBAAyB,CAAC;IAC9F,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAE7D,OAAO;QACL,UAAU;QACV,aAAa,EAAE,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,UAAU;QACxD,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;QACnC,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;QACjC,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;QACpC,YAAY,EAAE,OAAO;QACrB,uEAAuE;QACvE,kEAAkE;QAClE,cAAc,EAAE,SAAS,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC;QACtD,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC;QACvD,eAAe,EAAE,SAAS,CAAC,GAAG,CAAC,eAAe,EAAE,kBAAkB,CAAC;QACnE,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC;QACjD,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC;QACpD,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC;QAC1C,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC;QAC7C,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;QAC5C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QAC7B,MAAM,EAAE,OAAO;KAChB,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,SAAS,CAAC,QAAwB,EAAE,YAAoB;IACtE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;IACpE,wDAAwD;IACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"branding.js","sourceRoot":"","sources":["../../../src/collection/branding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createClientClearanceStore = createClientClearanceStore;
4
+ exports.setClientClearance = setClientClearance;
5
+ exports.clearanceSummary = clearanceSummary;
6
+ /**
7
+ * Liberação lida da ficha do cliente.
8
+ *
9
+ * `recipientRef` é o id do cliente — a mesma referência que o consentimento e a
10
+ * idempotência usam. A liberação é do CLIENTE, não do canal: quem confere o
11
+ * cadastro confere a pessoa, e um escritório que liberou o e-mail e não o
12
+ * WhatsApp está descrevendo qual canal quer usar, não quem já foi conferido.
13
+ * Se um dia a distinção por canal for necessária, ela entra aqui sem mexer no
14
+ * motor.
15
+ */
16
+ function createClientClearanceStore(tx) {
17
+ return {
18
+ async find(recipientRef, _channel) {
19
+ const rows = await tx `
20
+ SELECT communication_cleared_at
21
+ FROM client
22
+ WHERE id = ${recipientRef} AND deleted_at IS NULL
23
+ `;
24
+ // Cliente inexistente ou apagado não é "liberado por omissão": é um
25
+ // destinatário que o sistema não conhece, e o motor deve pular.
26
+ const at = rows[0]?.communication_cleared_at ?? null;
27
+ return { cleared: at !== null, clearedAt: at?.toISOString() ?? null };
28
+ },
29
+ };
30
+ }
31
+ /**
32
+ * Libera (ou revoga) um cliente para comunicação externa.
33
+ *
34
+ * Revogar é possível e deliberado: um endereço que voltou errado precisa poder
35
+ * sair da régua sem que alguém tenha de apagar o e-mail do cadastro — apagar o
36
+ * dado para parar o envio destrói a informação de contato junto.
37
+ */
38
+ async function setClientClearance(tx, input) {
39
+ const rows = await tx `
40
+ UPDATE client
41
+ SET communication_cleared_at = ${input.cleared ? new Date() : null},
42
+ communication_cleared_by = ${input.cleared ? input.actorId : null},
43
+ updated_at = now()
44
+ WHERE id = ${input.clientId} AND deleted_at IS NULL
45
+ RETURNING id, communication_cleared_at
46
+ `;
47
+ const row = rows[0];
48
+ if (!row)
49
+ throw new Error('Cliente não encontrado neste escritório.');
50
+ return {
51
+ clientId: row.id,
52
+ cleared: row.communication_cleared_at !== null,
53
+ clearedAt: row.communication_cleared_at?.toISOString() ?? null,
54
+ };
55
+ }
56
+ async function clearanceSummary(tx) {
57
+ const [r] = await tx `
58
+ SELECT count(*)::int AS total,
59
+ count(*) FILTER (WHERE communication_cleared_at IS NOT NULL)::int AS cleared,
60
+ count(*) FILTER (WHERE communication_cleared_at IS NULL
61
+ AND email IS NOT NULL)::int AS pending_email
62
+ FROM client
63
+ WHERE deleted_at IS NULL AND status = 'active'
64
+ `;
65
+ const total = r?.total ?? 0;
66
+ const cleared = r?.cleared ?? 0;
67
+ return {
68
+ total,
69
+ cleared,
70
+ pending: total - cleared,
71
+ pendingWithEmail: r?.pending_email ?? 0,
72
+ };
73
+ }
74
+ //# sourceMappingURL=clearance-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clearance-store.js","sourceRoot":"","sources":["../../../src/collection/clearance-store.ts"],"names":[],"mappings":";;AAcA,gEAcC;AAeD,gDAmBC;AAUD,4CAiBC;AArFD;;;;;;;;;GASG;AACH,SAAgB,0BAA0B,CAAC,EAAM;IAC/C,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,YAAoB,EAAE,QAAoB;YACnD,MAAM,IAAI,GAAG,MAAM,EAAE,CAA6C;;;sBAGlD,YAAY;OAC3B,CAAC;YACF,oEAAoE;YACpE,gEAAgE;YAChE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,wBAAwB,IAAI,IAAI,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;QACxE,CAAC;KACF,CAAC;AACJ,CAAC;AAQD;;;;;;GAMG;AACI,KAAK,UAAU,kBAAkB,CACtC,EAAM,EACN,KAAqE;IAErE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAyD;;wCAExC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;wCACjC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;;kBAE1D,KAAK,CAAC,QAAQ;;GAE7B,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACtE,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,EAAE;QAChB,OAAO,EAAE,GAAG,CAAC,wBAAwB,KAAK,IAAI;QAC9C,SAAS,EAAE,GAAG,CAAC,wBAAwB,EAAE,WAAW,EAAE,IAAI,IAAI;KAC/D,CAAC;AACJ,CAAC;AAUM,KAAK,UAAU,gBAAgB,CAAC,EAAM;IAC3C,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAA6D;;;;;;;GAOhF,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;IAChC,OAAO;QACL,KAAK;QACL,OAAO;QACP,OAAO,EAAE,KAAK,GAAG,OAAO;QACxB,gBAAgB,EAAE,CAAC,EAAE,aAAa,IAAI,CAAC;KACxC,CAAC;AACJ,CAAC"}