@baruk/core 0.3.1 → 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 (1047) hide show
  1. package/.baruk-provenance.json +10 -0
  2. package/CHANGELOG.md +127 -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/password-reset.d.ts +30 -1
  8. package/dist/auth/password-reset.d.ts.map +1 -1
  9. package/dist/auth/password-reset.js +139 -11
  10. package/dist/auth/password-reset.js.map +1 -1
  11. package/dist/auth/service.d.ts +60 -2
  12. package/dist/auth/service.d.ts.map +1 -1
  13. package/dist/auth/service.js +121 -11
  14. package/dist/auth/service.js.map +1 -1
  15. package/dist/billing/ar-repository.d.ts +374 -0
  16. package/dist/billing/ar-repository.d.ts.map +1 -0
  17. package/dist/billing/ar-repository.js +783 -0
  18. package/dist/billing/ar-repository.js.map +1 -0
  19. package/dist/billing/auto-generation.d.ts +87 -0
  20. package/dist/billing/auto-generation.d.ts.map +1 -0
  21. package/dist/billing/auto-generation.js +181 -0
  22. package/dist/billing/auto-generation.js.map +1 -0
  23. package/dist/billing/live-guard.d.ts +64 -0
  24. package/dist/billing/live-guard.d.ts.map +1 -0
  25. package/dist/billing/live-guard.js +68 -0
  26. package/dist/billing/live-guard.js.map +1 -0
  27. package/dist/billing/payment-means-catalog.d.ts +17 -0
  28. package/dist/billing/payment-means-catalog.d.ts.map +1 -0
  29. package/dist/billing/payment-means-catalog.js +21 -0
  30. package/dist/billing/payment-means-catalog.js.map +1 -0
  31. package/dist/billing/payment-means.d.ts +38 -0
  32. package/dist/billing/payment-means.d.ts.map +1 -0
  33. package/dist/billing/payment-means.js +29 -0
  34. package/dist/billing/payment-means.js.map +1 -0
  35. package/dist/billing/payment-rail.d.ts +118 -0
  36. package/dist/billing/payment-rail.d.ts.map +1 -0
  37. package/dist/billing/payment-rail.js +295 -0
  38. package/dist/billing/payment-rail.js.map +1 -0
  39. package/dist/billing/provider/asaas.d.ts +46 -1
  40. package/dist/billing/provider/asaas.d.ts.map +1 -1
  41. package/dist/billing/provider/asaas.js +194 -14
  42. package/dist/billing/provider/asaas.js.map +1 -1
  43. package/dist/billing/provider/manual.js +1 -1
  44. package/dist/billing/provider/manual.js.map +1 -1
  45. package/dist/billing/provider/types.d.ts +115 -8
  46. package/dist/billing/provider/types.d.ts.map +1 -1
  47. package/dist/billing/provider-account.d.ts +127 -0
  48. package/dist/billing/provider-account.d.ts.map +1 -0
  49. package/dist/billing/provider-account.js +217 -0
  50. package/dist/billing/provider-account.js.map +1 -0
  51. package/dist/billing/provider-onboarding.d.ts +67 -0
  52. package/dist/billing/provider-onboarding.d.ts.map +1 -0
  53. package/dist/billing/provider-onboarding.js +234 -0
  54. package/dist/billing/provider-onboarding.js.map +1 -0
  55. package/dist/billing/receivable.d.ts +5 -1
  56. package/dist/billing/receivable.d.ts.map +1 -1
  57. package/dist/billing/reconcile.d.ts +58 -0
  58. package/dist/billing/reconcile.d.ts.map +1 -0
  59. package/dist/billing/reconcile.js +138 -0
  60. package/dist/billing/reconcile.js.map +1 -0
  61. package/dist/billing/repository.d.ts +134 -1
  62. package/dist/billing/repository.d.ts.map +1 -1
  63. package/dist/billing/repository.js +193 -20
  64. package/dist/billing/repository.js.map +1 -1
  65. package/dist/cjs/audit/repository.js +41 -7
  66. package/dist/cjs/audit/repository.js.map +1 -1
  67. package/dist/cjs/auth/password-reset.js +141 -11
  68. package/dist/cjs/auth/password-reset.js.map +1 -1
  69. package/dist/cjs/auth/service.js +121 -10
  70. package/dist/cjs/auth/service.js.map +1 -1
  71. package/dist/cjs/billing/ar-repository.js +804 -0
  72. package/dist/cjs/billing/ar-repository.js.map +1 -0
  73. package/dist/cjs/billing/auto-generation.js +186 -0
  74. package/dist/cjs/billing/auto-generation.js.map +1 -0
  75. package/dist/cjs/billing/live-guard.js +72 -0
  76. package/dist/cjs/billing/live-guard.js.map +1 -0
  77. package/dist/cjs/billing/payment-means-catalog.js +25 -0
  78. package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
  79. package/dist/cjs/billing/payment-means.js +33 -0
  80. package/dist/cjs/billing/payment-means.js.map +1 -0
  81. package/dist/cjs/billing/payment-rail.js +301 -0
  82. package/dist/cjs/billing/payment-rail.js.map +1 -0
  83. package/dist/cjs/billing/provider/asaas.js +194 -14
  84. package/dist/cjs/billing/provider/asaas.js.map +1 -1
  85. package/dist/cjs/billing/provider/manual.js +1 -1
  86. package/dist/cjs/billing/provider/manual.js.map +1 -1
  87. package/dist/cjs/billing/provider-account.js +229 -0
  88. package/dist/cjs/billing/provider-account.js.map +1 -0
  89. package/dist/cjs/billing/provider-onboarding.js +239 -0
  90. package/dist/cjs/billing/provider-onboarding.js.map +1 -0
  91. package/dist/cjs/billing/reconcile.js +143 -0
  92. package/dist/cjs/billing/reconcile.js.map +1 -0
  93. package/dist/cjs/billing/repository.js +197 -19
  94. package/dist/cjs/billing/repository.js.map +1 -1
  95. package/dist/cjs/clients/ibge.js +103 -0
  96. package/dist/cjs/clients/ibge.js.map +1 -0
  97. package/dist/cjs/clients/repository.js +276 -23
  98. package/dist/cjs/clients/repository.js.map +1 -1
  99. package/dist/cjs/collection/branding.js +330 -0
  100. package/dist/cjs/collection/branding.js.map +1 -0
  101. package/dist/cjs/collection/channel-accounts.js +137 -0
  102. package/dist/cjs/collection/channel-accounts.js.map +1 -0
  103. package/dist/cjs/collection/channel.js +17 -0
  104. package/dist/cjs/collection/channel.js.map +1 -0
  105. package/dist/cjs/collection/clearance-store.js +74 -0
  106. package/dist/cjs/collection/clearance-store.js.map +1 -0
  107. package/dist/cjs/collection/communication-bridge.js +140 -0
  108. package/dist/cjs/collection/communication-bridge.js.map +1 -0
  109. package/dist/cjs/collection/communication-runtime.js +256 -0
  110. package/dist/cjs/collection/communication-runtime.js.map +1 -0
  111. package/dist/cjs/collection/consent-repository.js +84 -0
  112. package/dist/cjs/collection/consent-repository.js.map +1 -0
  113. package/dist/cjs/collection/copy.js +125 -0
  114. package/dist/cjs/collection/copy.js.map +1 -0
  115. package/dist/cjs/collection/delivery-callback.js +151 -0
  116. package/dist/cjs/collection/delivery-callback.js.map +1 -0
  117. package/dist/cjs/collection/email-layout.js +252 -0
  118. package/dist/cjs/collection/email-layout.js.map +1 -0
  119. package/dist/cjs/collection/engine.js +434 -0
  120. package/dist/cjs/collection/engine.js.map +1 -0
  121. package/dist/cjs/collection/format.js +76 -0
  122. package/dist/cjs/collection/format.js.map +1 -0
  123. package/dist/cjs/collection/payment-block.js +3 -0
  124. package/dist/cjs/collection/payment-block.js.map +1 -0
  125. package/dist/cjs/collection/policy.js +175 -0
  126. package/dist/cjs/collection/policy.js.map +1 -0
  127. package/dist/cjs/collection/repository.js +260 -0
  128. package/dist/cjs/collection/repository.js.map +1 -0
  129. package/dist/cjs/collection/subject.js +104 -0
  130. package/dist/cjs/collection/subject.js.map +1 -0
  131. package/dist/cjs/collection/template-catalog.js +165 -0
  132. package/dist/cjs/collection/template-catalog.js.map +1 -0
  133. package/dist/cjs/collection/template.js +78 -0
  134. package/dist/cjs/collection/template.js.map +1 -0
  135. package/dist/cjs/communication/adapters/email.js +132 -0
  136. package/dist/cjs/communication/adapters/email.js.map +1 -0
  137. package/dist/cjs/communication/adapters/sms.js +127 -0
  138. package/dist/cjs/communication/adapters/sms.js.map +1 -0
  139. package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
  140. package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
  141. package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
  142. package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
  143. package/dist/cjs/communication/adapters/whatsapp.js +213 -0
  144. package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
  145. package/dist/cjs/communication/audit.js +61 -0
  146. package/dist/cjs/communication/audit.js.map +1 -0
  147. package/dist/cjs/communication/capabilities.js +76 -0
  148. package/dist/cjs/communication/capabilities.js.map +1 -0
  149. package/dist/cjs/communication/channel.js +53 -0
  150. package/dist/cjs/communication/channel.js.map +1 -0
  151. package/dist/cjs/communication/claim.js +228 -0
  152. package/dist/cjs/communication/claim.js.map +1 -0
  153. package/dist/cjs/communication/clearance.js +18 -0
  154. package/dist/cjs/communication/clearance.js.map +1 -0
  155. package/dist/cjs/communication/consent.js +43 -0
  156. package/dist/cjs/communication/consent.js.map +1 -0
  157. package/dist/cjs/communication/context.js +45 -0
  158. package/dist/cjs/communication/context.js.map +1 -0
  159. package/dist/cjs/communication/credentials.js +121 -0
  160. package/dist/cjs/communication/credentials.js.map +1 -0
  161. package/dist/cjs/communication/dry-run-scenario.js +166 -0
  162. package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
  163. package/dist/cjs/communication/dry-run.js +97 -0
  164. package/dist/cjs/communication/dry-run.js.map +1 -0
  165. package/dist/cjs/communication/engine.js +495 -0
  166. package/dist/cjs/communication/engine.js.map +1 -0
  167. package/dist/cjs/communication/graph.js +50 -0
  168. package/dist/cjs/communication/graph.js.map +1 -0
  169. package/dist/cjs/communication/idempotency.js +26 -0
  170. package/dist/cjs/communication/idempotency.js.map +1 -0
  171. package/dist/cjs/communication/identity.js +110 -0
  172. package/dist/cjs/communication/identity.js.map +1 -0
  173. package/dist/cjs/communication/index.js +135 -0
  174. package/dist/cjs/communication/index.js.map +1 -0
  175. package/dist/cjs/communication/onboarding.js +297 -0
  176. package/dist/cjs/communication/onboarding.js.map +1 -0
  177. package/dist/cjs/communication/policy.js +16 -0
  178. package/dist/cjs/communication/policy.js.map +1 -0
  179. package/dist/cjs/communication/routing.js +77 -0
  180. package/dist/cjs/communication/routing.js.map +1 -0
  181. package/dist/cjs/communication/sender-profile.js +128 -0
  182. package/dist/cjs/communication/sender-profile.js.map +1 -0
  183. package/dist/cjs/communication/status.js +86 -0
  184. package/dist/cjs/communication/status.js.map +1 -0
  185. package/dist/cjs/communication/stores/onboarding.js +135 -0
  186. package/dist/cjs/communication/stores/onboarding.js.map +1 -0
  187. package/dist/cjs/communication/stores/postgres.js +458 -0
  188. package/dist/cjs/communication/stores/postgres.js.map +1 -0
  189. package/dist/cjs/communication/stores/routing.js +334 -0
  190. package/dist/cjs/communication/stores/routing.js.map +1 -0
  191. package/dist/cjs/communication/stores/secrets.js +126 -0
  192. package/dist/cjs/communication/stores/secrets.js.map +1 -0
  193. package/dist/cjs/communication/template-provider.js +22 -0
  194. package/dist/cjs/communication/template-provider.js.map +1 -0
  195. package/dist/cjs/communication/template.js +63 -0
  196. package/dist/cjs/communication/template.js.map +1 -0
  197. package/dist/cjs/communication/webhook-subscription.js +258 -0
  198. package/dist/cjs/communication/webhook-subscription.js.map +1 -0
  199. package/dist/cjs/communication/webhook.js +292 -0
  200. package/dist/cjs/communication/webhook.js.map +1 -0
  201. package/dist/cjs/competence/business-days.js +155 -0
  202. package/dist/cjs/competence/business-days.js.map +1 -0
  203. package/dist/cjs/competence/catalog-validation.js +174 -0
  204. package/dist/cjs/competence/catalog-validation.js.map +1 -0
  205. package/dist/cjs/competence/obligation-preview.js +190 -0
  206. package/dist/cjs/competence/obligation-preview.js.map +1 -0
  207. package/dist/cjs/competence/repository.js +622 -0
  208. package/dist/cjs/competence/repository.js.map +1 -0
  209. package/dist/cjs/contacts/phone.js +192 -0
  210. package/dist/cjs/contacts/phone.js.map +1 -0
  211. package/dist/cjs/dashboard/pilot-panel.js +90 -0
  212. package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
  213. package/dist/cjs/dashboard/repository.js +11 -1
  214. package/dist/cjs/dashboard/repository.js.map +1 -1
  215. package/dist/cjs/db/client.js +17 -11
  216. package/dist/cjs/db/client.js.map +1 -1
  217. package/dist/cjs/db/provision-e2e-identity.js +111 -0
  218. package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
  219. package/dist/cjs/db/seed-catalog.js +48 -0
  220. package/dist/cjs/db/seed-catalog.js.map +1 -0
  221. package/dist/cjs/db/seed.js +15 -7
  222. package/dist/cjs/db/seed.js.map +1 -1
  223. package/dist/cjs/documents/repository.js +244 -0
  224. package/dist/cjs/documents/repository.js.map +1 -0
  225. package/dist/cjs/documents/requests.js +136 -0
  226. package/dist/cjs/documents/requests.js.map +1 -0
  227. package/dist/cjs/fiscal/applicability.js +164 -0
  228. package/dist/cjs/fiscal/applicability.js.map +1 -0
  229. package/dist/cjs/fiscal/conditions.js +198 -0
  230. package/dist/cjs/fiscal/conditions.js.map +1 -0
  231. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
  232. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  233. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
  234. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  235. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
  236. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  237. package/dist/cjs/fiscal/coverage/model.js +127 -0
  238. package/dist/cjs/fiscal/coverage/model.js.map +1 -0
  239. package/dist/cjs/fiscal/coverage/requests.js +99 -0
  240. package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
  241. package/dist/cjs/fiscal/credentials/material.js +168 -0
  242. package/dist/cjs/fiscal/credentials/material.js.map +1 -0
  243. package/dist/cjs/fiscal/credentials/readiness.js +163 -0
  244. package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
  245. package/dist/cjs/fiscal/eligibility.js +199 -0
  246. package/dist/cjs/fiscal/eligibility.js.map +1 -0
  247. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
  248. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  249. package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
  250. package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
  251. package/dist/cjs/fiscal/ingestion/direction.js +36 -0
  252. package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
  253. package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
  254. package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
  255. package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
  256. package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
  257. package/dist/cjs/fiscal/ingestion/provider.js +51 -0
  258. package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
  259. package/dist/cjs/fiscal/ingestion/repository.js +132 -0
  260. package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
  261. package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
  262. package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
  263. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
  264. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  265. package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
  266. package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
  267. package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
  268. package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
  269. package/dist/cjs/fiscal/repository.js +470 -0
  270. package/dist/cjs/fiscal/repository.js.map +1 -0
  271. package/dist/cjs/fiscal/sync/circuit.js +124 -0
  272. package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
  273. package/dist/cjs/fiscal/sync/intervention.js +140 -0
  274. package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
  275. package/dist/cjs/fiscal/sync/lease.js +146 -0
  276. package/dist/cjs/fiscal/sync/lease.js.map +1 -0
  277. package/dist/cjs/fiscal/sync/observability.js +244 -0
  278. package/dist/cjs/fiscal/sync/observability.js.map +1 -0
  279. package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
  280. package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
  281. package/dist/cjs/fiscal/sync/policy.js +143 -0
  282. package/dist/cjs/fiscal/sync/policy.js.map +1 -0
  283. package/dist/cjs/fiscal/sync/reprocess.js +241 -0
  284. package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
  285. package/dist/cjs/fiscal/sync/retry.js +183 -0
  286. package/dist/cjs/fiscal/sync/retry.js.map +1 -0
  287. package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
  288. package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
  289. package/dist/cjs/fiscal/transport/https.js +309 -0
  290. package/dist/cjs/fiscal/transport/https.js.map +1 -0
  291. package/dist/cjs/fiscal/transport/synthetic-tls.js +328 -0
  292. package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
  293. package/dist/cjs/fiscal/transport/types.js +93 -0
  294. package/dist/cjs/fiscal/transport/types.js.map +1 -0
  295. package/dist/cjs/import/br-documents.js +85 -0
  296. package/dist/cjs/import/br-documents.js.map +1 -0
  297. package/dist/cjs/import/clients-import.js +347 -40
  298. package/dist/cjs/import/clients-import.js.map +1 -1
  299. package/dist/cjs/index.js +711 -39
  300. package/dist/cjs/index.js.map +1 -1
  301. package/dist/cjs/legal/documents.js +224 -17
  302. package/dist/cjs/legal/documents.js.map +1 -1
  303. package/dist/cjs/legal/index.js +3 -1
  304. package/dist/cjs/legal/index.js.map +1 -1
  305. package/dist/cjs/legal/types.js +1 -0
  306. package/dist/cjs/legal/types.js.map +1 -1
  307. package/dist/cjs/mail/auth-templates.js +29 -0
  308. package/dist/cjs/mail/auth-templates.js.map +1 -0
  309. package/dist/cjs/mail/dedup-store.js +12 -51
  310. package/dist/cjs/mail/dedup-store.js.map +1 -1
  311. package/dist/cjs/mail/index.js +16 -4
  312. package/dist/cjs/mail/index.js.map +1 -1
  313. package/dist/cjs/mail/provider.js +12 -247
  314. package/dist/cjs/mail/provider.js.map +1 -1
  315. package/dist/cjs/mail/resend.js +14 -18
  316. package/dist/cjs/mail/resend.js.map +1 -1
  317. package/dist/cjs/mail/sender-resolver.js +12 -11
  318. package/dist/cjs/mail/sender-resolver.js.map +1 -1
  319. package/dist/cjs/mail/template-renderer.js +11 -16
  320. package/dist/cjs/mail/template-renderer.js.map +1 -1
  321. package/dist/cjs/mail/transactional-outbound.js +117 -0
  322. package/dist/cjs/mail/transactional-outbound.js.map +1 -0
  323. package/dist/cjs/mail/types.js +8 -35
  324. package/dist/cjs/mail/types.js.map +1 -1
  325. package/dist/cjs/onboarding/persistence.js +4 -4
  326. package/dist/cjs/onboarding/persistence.js.map +1 -1
  327. package/dist/cjs/pilot/go-live-checklist.js +212 -0
  328. package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
  329. package/dist/cjs/pilot/milestone.js +79 -0
  330. package/dist/cjs/pilot/milestone.js.map +1 -0
  331. package/dist/cjs/platform/capabilities.js +144 -0
  332. package/dist/cjs/platform/capabilities.js.map +1 -0
  333. package/dist/cjs/platform/job-contract.js +411 -0
  334. package/dist/cjs/platform/job-contract.js.map +1 -0
  335. package/dist/cjs/portal/provisioning.js +144 -0
  336. package/dist/cjs/portal/provisioning.js.map +1 -0
  337. package/dist/cjs/pricing-engine/canonical.js +42 -0
  338. package/dist/cjs/pricing-engine/canonical.js.map +1 -0
  339. package/dist/cjs/pricing-engine/errors.js +6 -1
  340. package/dist/cjs/pricing-engine/errors.js.map +1 -1
  341. package/dist/cjs/pricing-engine/index.js +12 -1
  342. package/dist/cjs/pricing-engine/index.js.map +1 -1
  343. package/dist/cjs/pricing-engine/pipeline.js +200 -26
  344. package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
  345. package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
  346. package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
  347. package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
  348. package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
  349. package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
  350. package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
  351. package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
  352. package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
  353. package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
  354. package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
  355. package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
  356. package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
  357. package/dist/cjs/rbac/authorize.js +28 -0
  358. package/dist/cjs/rbac/authorize.js.map +1 -1
  359. package/dist/cjs/rbac/catalog.js +101 -1
  360. package/dist/cjs/rbac/catalog.js.map +1 -1
  361. package/dist/cjs/rbac/workload-provisioning.js +160 -0
  362. package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
  363. package/dist/cjs/rbac/workload.js +191 -0
  364. package/dist/cjs/rbac/workload.js.map +1 -0
  365. package/dist/cjs/storage/checksum.js +15 -0
  366. package/dist/cjs/storage/checksum.js.map +1 -0
  367. package/dist/cjs/storage/key.js +72 -0
  368. package/dist/cjs/storage/key.js.map +1 -0
  369. package/dist/cjs/storage/local.js +100 -0
  370. package/dist/cjs/storage/local.js.map +1 -0
  371. package/dist/cjs/storage/r2.js +181 -0
  372. package/dist/cjs/storage/r2.js.map +1 -0
  373. package/dist/cjs/storage/registry.js +41 -0
  374. package/dist/cjs/storage/registry.js.map +1 -0
  375. package/dist/cjs/storage/types.js +50 -0
  376. package/dist/cjs/storage/types.js.map +1 -0
  377. package/dist/cjs/subscription-billing/index.js +2 -1
  378. package/dist/cjs/subscription-billing/index.js.map +1 -1
  379. package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
  380. package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
  381. package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
  382. package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
  383. package/dist/cjs/subscription-billing/provider/registry.js +17 -0
  384. package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
  385. package/dist/cjs/subscription-billing/service.js +208 -83
  386. package/dist/cjs/subscription-billing/service.js.map +1 -1
  387. package/dist/cjs/subscription-billing/types.js.map +1 -1
  388. package/dist/cjs/tenancy/features.js +131 -0
  389. package/dist/cjs/tenancy/features.js.map +1 -0
  390. package/dist/cjs/tenancy/provisioning.js +32 -8
  391. package/dist/cjs/tenancy/provisioning.js.map +1 -1
  392. package/dist/cjs/tenancy/settings.js +224 -0
  393. package/dist/cjs/tenancy/settings.js.map +1 -0
  394. package/dist/cjs/users/repository.js +143 -3
  395. package/dist/cjs/users/repository.js.map +1 -1
  396. package/dist/cjs/vault/repository.js +81 -0
  397. package/dist/cjs/vault/repository.js.map +1 -1
  398. package/dist/clients/ibge.d.ts +17 -0
  399. package/dist/clients/ibge.d.ts.map +1 -0
  400. package/dist/clients/ibge.js +98 -0
  401. package/dist/clients/ibge.js.map +1 -0
  402. package/dist/clients/repository.d.ts +196 -0
  403. package/dist/clients/repository.d.ts.map +1 -1
  404. package/dist/clients/repository.js +270 -24
  405. package/dist/clients/repository.js.map +1 -1
  406. package/dist/collection/branding.d.ts +137 -0
  407. package/dist/collection/branding.d.ts.map +1 -0
  408. package/dist/collection/branding.js +322 -0
  409. package/dist/collection/branding.js.map +1 -0
  410. package/dist/collection/channel-accounts.d.ts +57 -0
  411. package/dist/collection/channel-accounts.d.ts.map +1 -0
  412. package/dist/collection/channel-accounts.js +133 -0
  413. package/dist/collection/channel-accounts.js.map +1 -0
  414. package/dist/collection/channel.d.ts +24 -0
  415. package/dist/collection/channel.d.ts.map +1 -0
  416. package/dist/collection/channel.js +16 -0
  417. package/dist/collection/channel.js.map +1 -0
  418. package/dist/collection/clearance-store.d.ts +39 -0
  419. package/dist/collection/clearance-store.d.ts.map +1 -0
  420. package/dist/collection/clearance-store.js +69 -0
  421. package/dist/collection/clearance-store.js.map +1 -0
  422. package/dist/collection/communication-bridge.d.ts +66 -0
  423. package/dist/collection/communication-bridge.d.ts.map +1 -0
  424. package/dist/collection/communication-bridge.js +134 -0
  425. package/dist/collection/communication-bridge.js.map +1 -0
  426. package/dist/collection/communication-runtime.d.ts +132 -0
  427. package/dist/collection/communication-runtime.d.ts.map +1 -0
  428. package/dist/collection/communication-runtime.js +249 -0
  429. package/dist/collection/communication-runtime.js.map +1 -0
  430. package/dist/collection/consent-repository.d.ts +32 -0
  431. package/dist/collection/consent-repository.d.ts.map +1 -0
  432. package/dist/collection/consent-repository.js +79 -0
  433. package/dist/collection/consent-repository.js.map +1 -0
  434. package/dist/collection/copy.d.ts +50 -0
  435. package/dist/collection/copy.d.ts.map +1 -0
  436. package/dist/collection/copy.js +122 -0
  437. package/dist/collection/copy.js.map +1 -0
  438. package/dist/collection/delivery-callback.d.ts +49 -0
  439. package/dist/collection/delivery-callback.d.ts.map +1 -0
  440. package/dist/collection/delivery-callback.js +147 -0
  441. package/dist/collection/delivery-callback.js.map +1 -0
  442. package/dist/collection/email-layout.d.ts +45 -0
  443. package/dist/collection/email-layout.d.ts.map +1 -0
  444. package/dist/collection/email-layout.js +247 -0
  445. package/dist/collection/email-layout.js.map +1 -0
  446. package/dist/collection/engine.d.ts +200 -0
  447. package/dist/collection/engine.d.ts.map +1 -0
  448. package/dist/collection/engine.js +427 -0
  449. package/dist/collection/engine.js.map +1 -0
  450. package/dist/collection/format.d.ts +32 -0
  451. package/dist/collection/format.d.ts.map +1 -0
  452. package/dist/collection/format.js +70 -0
  453. package/dist/collection/format.js.map +1 -0
  454. package/dist/collection/payment-block.d.ts +24 -0
  455. package/dist/collection/payment-block.d.ts.map +1 -0
  456. package/dist/collection/payment-block.js +2 -0
  457. package/dist/collection/payment-block.js.map +1 -0
  458. package/dist/collection/policy.d.ts +78 -0
  459. package/dist/collection/policy.d.ts.map +1 -0
  460. package/dist/collection/policy.js +168 -0
  461. package/dist/collection/policy.js.map +1 -0
  462. package/dist/collection/repository.d.ts +129 -0
  463. package/dist/collection/repository.d.ts.map +1 -0
  464. package/dist/collection/repository.js +246 -0
  465. package/dist/collection/repository.js.map +1 -0
  466. package/dist/collection/subject.d.ts +66 -0
  467. package/dist/collection/subject.d.ts.map +1 -0
  468. package/dist/collection/subject.js +99 -0
  469. package/dist/collection/subject.js.map +1 -0
  470. package/dist/collection/template-catalog.d.ts +16 -0
  471. package/dist/collection/template-catalog.d.ts.map +1 -0
  472. package/dist/collection/template-catalog.js +162 -0
  473. package/dist/collection/template-catalog.js.map +1 -0
  474. package/dist/collection/template.d.ts +37 -0
  475. package/dist/collection/template.d.ts.map +1 -0
  476. package/dist/collection/template.js +73 -0
  477. package/dist/collection/template.js.map +1 -0
  478. package/dist/communication/adapters/email.d.ts +28 -0
  479. package/dist/communication/adapters/email.d.ts.map +1 -0
  480. package/dist/communication/adapters/email.js +129 -0
  481. package/dist/communication/adapters/email.js.map +1 -0
  482. package/dist/communication/adapters/sms.d.ts +95 -0
  483. package/dist/communication/adapters/sms.d.ts.map +1 -0
  484. package/dist/communication/adapters/sms.js +121 -0
  485. package/dist/communication/adapters/sms.js.map +1 -0
  486. package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
  487. package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
  488. package/dist/communication/adapters/whatsapp-language.js +36 -0
  489. package/dist/communication/adapters/whatsapp-language.js.map +1 -0
  490. package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
  491. package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
  492. package/dist/communication/adapters/whatsapp-templates.js +97 -0
  493. package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
  494. package/dist/communication/adapters/whatsapp.d.ts +29 -0
  495. package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
  496. package/dist/communication/adapters/whatsapp.js +210 -0
  497. package/dist/communication/adapters/whatsapp.js.map +1 -0
  498. package/dist/communication/audit.d.ts +105 -0
  499. package/dist/communication/audit.d.ts.map +1 -0
  500. package/dist/communication/audit.js +56 -0
  501. package/dist/communication/audit.js.map +1 -0
  502. package/dist/communication/capabilities.d.ts +88 -0
  503. package/dist/communication/capabilities.d.ts.map +1 -0
  504. package/dist/communication/capabilities.js +72 -0
  505. package/dist/communication/capabilities.js.map +1 -0
  506. package/dist/communication/channel.d.ts +125 -0
  507. package/dist/communication/channel.d.ts.map +1 -0
  508. package/dist/communication/channel.js +47 -0
  509. package/dist/communication/channel.js.map +1 -0
  510. package/dist/communication/claim.d.ts +368 -0
  511. package/dist/communication/claim.d.ts.map +1 -0
  512. package/dist/communication/claim.js +224 -0
  513. package/dist/communication/claim.js.map +1 -0
  514. package/dist/communication/clearance.d.ts +53 -0
  515. package/dist/communication/clearance.d.ts.map +1 -0
  516. package/dist/communication/clearance.js +15 -0
  517. package/dist/communication/clearance.js.map +1 -0
  518. package/dist/communication/consent.d.ts +65 -0
  519. package/dist/communication/consent.d.ts.map +1 -0
  520. package/dist/communication/consent.js +40 -0
  521. package/dist/communication/consent.js.map +1 -0
  522. package/dist/communication/context.d.ts +48 -0
  523. package/dist/communication/context.d.ts.map +1 -0
  524. package/dist/communication/context.js +41 -0
  525. package/dist/communication/context.js.map +1 -0
  526. package/dist/communication/credentials.d.ts +74 -0
  527. package/dist/communication/credentials.d.ts.map +1 -0
  528. package/dist/communication/credentials.js +115 -0
  529. package/dist/communication/credentials.js.map +1 -0
  530. package/dist/communication/dry-run-scenario.d.ts +37 -0
  531. package/dist/communication/dry-run-scenario.d.ts.map +1 -0
  532. package/dist/communication/dry-run-scenario.js +163 -0
  533. package/dist/communication/dry-run-scenario.js.map +1 -0
  534. package/dist/communication/dry-run.d.ts +40 -0
  535. package/dist/communication/dry-run.d.ts.map +1 -0
  536. package/dist/communication/dry-run.js +92 -0
  537. package/dist/communication/dry-run.js.map +1 -0
  538. package/dist/communication/engine.d.ts +163 -0
  539. package/dist/communication/engine.d.ts.map +1 -0
  540. package/dist/communication/engine.js +492 -0
  541. package/dist/communication/engine.js.map +1 -0
  542. package/dist/communication/graph.d.ts +38 -0
  543. package/dist/communication/graph.d.ts.map +1 -0
  544. package/dist/communication/graph.js +45 -0
  545. package/dist/communication/graph.js.map +1 -0
  546. package/dist/communication/idempotency.d.ts +33 -0
  547. package/dist/communication/idempotency.d.ts.map +1 -0
  548. package/dist/communication/idempotency.js +23 -0
  549. package/dist/communication/idempotency.js.map +1 -0
  550. package/dist/communication/identity.d.ts +127 -0
  551. package/dist/communication/identity.d.ts.map +1 -0
  552. package/dist/communication/identity.js +105 -0
  553. package/dist/communication/identity.js.map +1 -0
  554. package/dist/communication/index.d.ts +66 -0
  555. package/dist/communication/index.d.ts.map +1 -0
  556. package/dist/communication/index.js +42 -0
  557. package/dist/communication/index.js.map +1 -0
  558. package/dist/communication/onboarding.d.ts +223 -0
  559. package/dist/communication/onboarding.d.ts.map +1 -0
  560. package/dist/communication/onboarding.js +287 -0
  561. package/dist/communication/onboarding.js.map +1 -0
  562. package/dist/communication/policy.d.ts +115 -0
  563. package/dist/communication/policy.d.ts.map +1 -0
  564. package/dist/communication/policy.js +13 -0
  565. package/dist/communication/policy.js.map +1 -0
  566. package/dist/communication/routing.d.ts +99 -0
  567. package/dist/communication/routing.d.ts.map +1 -0
  568. package/dist/communication/routing.js +73 -0
  569. package/dist/communication/routing.js.map +1 -0
  570. package/dist/communication/sender-profile.d.ts +100 -0
  571. package/dist/communication/sender-profile.d.ts.map +1 -0
  572. package/dist/communication/sender-profile.js +123 -0
  573. package/dist/communication/sender-profile.js.map +1 -0
  574. package/dist/communication/status.d.ts +48 -0
  575. package/dist/communication/status.d.ts.map +1 -0
  576. package/dist/communication/status.js +79 -0
  577. package/dist/communication/status.js.map +1 -0
  578. package/dist/communication/stores/onboarding.d.ts +88 -0
  579. package/dist/communication/stores/onboarding.d.ts.map +1 -0
  580. package/dist/communication/stores/onboarding.js +127 -0
  581. package/dist/communication/stores/onboarding.js.map +1 -0
  582. package/dist/communication/stores/postgres.d.ts +81 -0
  583. package/dist/communication/stores/postgres.d.ts.map +1 -0
  584. package/dist/communication/stores/postgres.js +453 -0
  585. package/dist/communication/stores/postgres.js.map +1 -0
  586. package/dist/communication/stores/routing.d.ts +169 -0
  587. package/dist/communication/stores/routing.d.ts.map +1 -0
  588. package/dist/communication/stores/routing.js +324 -0
  589. package/dist/communication/stores/routing.js.map +1 -0
  590. package/dist/communication/stores/secrets.d.ts +89 -0
  591. package/dist/communication/stores/secrets.d.ts.map +1 -0
  592. package/dist/communication/stores/secrets.js +122 -0
  593. package/dist/communication/stores/secrets.js.map +1 -0
  594. package/dist/communication/template-provider.d.ts +85 -0
  595. package/dist/communication/template-provider.d.ts.map +1 -0
  596. package/dist/communication/template-provider.js +21 -0
  597. package/dist/communication/template-provider.js.map +1 -0
  598. package/dist/communication/template.d.ts +87 -0
  599. package/dist/communication/template.d.ts.map +1 -0
  600. package/dist/communication/template.js +59 -0
  601. package/dist/communication/template.js.map +1 -0
  602. package/dist/communication/webhook-subscription.d.ts +156 -0
  603. package/dist/communication/webhook-subscription.d.ts.map +1 -0
  604. package/dist/communication/webhook-subscription.js +252 -0
  605. package/dist/communication/webhook-subscription.js.map +1 -0
  606. package/dist/communication/webhook.d.ts +121 -0
  607. package/dist/communication/webhook.d.ts.map +1 -0
  608. package/dist/communication/webhook.js +283 -0
  609. package/dist/communication/webhook.js.map +1 -0
  610. package/dist/competence/business-days.d.ts +51 -0
  611. package/dist/competence/business-days.d.ts.map +1 -0
  612. package/dist/competence/business-days.js +145 -0
  613. package/dist/competence/business-days.js.map +1 -0
  614. package/dist/competence/catalog-validation.d.ts +86 -0
  615. package/dist/competence/catalog-validation.d.ts.map +1 -0
  616. package/dist/competence/catalog-validation.js +168 -0
  617. package/dist/competence/catalog-validation.js.map +1 -0
  618. package/dist/competence/obligation-preview.d.ts +103 -0
  619. package/dist/competence/obligation-preview.d.ts.map +1 -0
  620. package/dist/competence/obligation-preview.js +184 -0
  621. package/dist/competence/obligation-preview.js.map +1 -0
  622. package/dist/competence/repository.d.ts +285 -0
  623. package/dist/competence/repository.d.ts.map +1 -0
  624. package/dist/competence/repository.js +602 -0
  625. package/dist/competence/repository.js.map +1 -0
  626. package/dist/contacts/phone.d.ts +70 -0
  627. package/dist/contacts/phone.d.ts.map +1 -0
  628. package/dist/contacts/phone.js +186 -0
  629. package/dist/contacts/phone.js.map +1 -0
  630. package/dist/dashboard/pilot-panel.d.ts +100 -0
  631. package/dist/dashboard/pilot-panel.d.ts.map +1 -0
  632. package/dist/dashboard/pilot-panel.js +87 -0
  633. package/dist/dashboard/pilot-panel.js.map +1 -0
  634. package/dist/dashboard/repository.d.ts.map +1 -1
  635. package/dist/dashboard/repository.js +11 -1
  636. package/dist/dashboard/repository.js.map +1 -1
  637. package/dist/db/client.d.ts +45 -0
  638. package/dist/db/client.d.ts.map +1 -1
  639. package/dist/db/client.js +16 -11
  640. package/dist/db/client.js.map +1 -1
  641. package/dist/db/migrate.d.ts +36 -1
  642. package/dist/db/migrate.d.ts.map +1 -1
  643. package/dist/db/migrate.js +208 -35
  644. package/dist/db/migrate.js.map +1 -1
  645. package/dist/db/provision-e2e-identity.d.ts +2 -0
  646. package/dist/db/provision-e2e-identity.d.ts.map +1 -0
  647. package/dist/db/provision-e2e-identity.js +109 -0
  648. package/dist/db/provision-e2e-identity.js.map +1 -0
  649. package/dist/db/seed-catalog.d.ts +18 -0
  650. package/dist/db/seed-catalog.d.ts.map +1 -0
  651. package/dist/db/seed-catalog.js +45 -0
  652. package/dist/db/seed-catalog.js.map +1 -0
  653. package/dist/db/seed.js +16 -8
  654. package/dist/db/seed.js.map +1 -1
  655. package/dist/documents/repository.d.ts +97 -0
  656. package/dist/documents/repository.d.ts.map +1 -0
  657. package/dist/documents/repository.js +236 -0
  658. package/dist/documents/repository.js.map +1 -0
  659. package/dist/documents/requests.d.ts +73 -0
  660. package/dist/documents/requests.d.ts.map +1 -0
  661. package/dist/documents/requests.js +127 -0
  662. package/dist/documents/requests.js.map +1 -0
  663. package/dist/fiscal/applicability.d.ts +73 -0
  664. package/dist/fiscal/applicability.d.ts.map +1 -0
  665. package/dist/fiscal/applicability.js +160 -0
  666. package/dist/fiscal/applicability.js.map +1 -0
  667. package/dist/fiscal/conditions.d.ts +99 -0
  668. package/dist/fiscal/conditions.d.ts.map +1 -0
  669. package/dist/fiscal/conditions.js +190 -0
  670. package/dist/fiscal/conditions.js.map +1 -0
  671. package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
  672. package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
  673. package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
  674. package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  675. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
  676. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
  677. package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
  678. package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  679. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
  680. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
  681. package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
  682. package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  683. package/dist/fiscal/coverage/model.d.ts +86 -0
  684. package/dist/fiscal/coverage/model.d.ts.map +1 -0
  685. package/dist/fiscal/coverage/model.js +120 -0
  686. package/dist/fiscal/coverage/model.js.map +1 -0
  687. package/dist/fiscal/coverage/requests.d.ts +70 -0
  688. package/dist/fiscal/coverage/requests.d.ts.map +1 -0
  689. package/dist/fiscal/coverage/requests.js +95 -0
  690. package/dist/fiscal/coverage/requests.js.map +1 -0
  691. package/dist/fiscal/credentials/material.d.ts +81 -0
  692. package/dist/fiscal/credentials/material.d.ts.map +1 -0
  693. package/dist/fiscal/credentials/material.js +164 -0
  694. package/dist/fiscal/credentials/material.js.map +1 -0
  695. package/dist/fiscal/credentials/readiness.d.ts +92 -0
  696. package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
  697. package/dist/fiscal/credentials/readiness.js +159 -0
  698. package/dist/fiscal/credentials/readiness.js.map +1 -0
  699. package/dist/fiscal/eligibility.d.ts +106 -0
  700. package/dist/fiscal/eligibility.d.ts.map +1 -0
  701. package/dist/fiscal/eligibility.js +194 -0
  702. package/dist/fiscal/eligibility.js.map +1 -0
  703. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
  704. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
  705. package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
  706. package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  707. package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
  708. package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
  709. package/dist/fiscal/ingestion/adn-transport.js +220 -0
  710. package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
  711. package/dist/fiscal/ingestion/direction.d.ts +60 -0
  712. package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
  713. package/dist/fiscal/ingestion/direction.js +32 -0
  714. package/dist/fiscal/ingestion/direction.js.map +1 -0
  715. package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
  716. package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
  717. package/dist/fiscal/ingestion/nfse-adn.js +222 -0
  718. package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
  719. package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
  720. package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
  721. package/dist/fiscal/ingestion/pipeline.js +699 -0
  722. package/dist/fiscal/ingestion/pipeline.js.map +1 -0
  723. package/dist/fiscal/ingestion/provider.d.ts +206 -0
  724. package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
  725. package/dist/fiscal/ingestion/provider.js +47 -0
  726. package/dist/fiscal/ingestion/provider.js.map +1 -0
  727. package/dist/fiscal/ingestion/repository.d.ts +82 -0
  728. package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
  729. package/dist/fiscal/ingestion/repository.js +127 -0
  730. package/dist/fiscal/ingestion/repository.js.map +1 -0
  731. package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
  732. package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
  733. package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
  734. package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
  735. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
  736. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
  737. package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
  738. package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  739. package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
  740. package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
  741. package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
  742. package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
  743. package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
  744. package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
  745. package/dist/fiscal/ingestion/xml-reader.js +112 -0
  746. package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
  747. package/dist/fiscal/repository.d.ts +220 -0
  748. package/dist/fiscal/repository.d.ts.map +1 -0
  749. package/dist/fiscal/repository.js +449 -0
  750. package/dist/fiscal/repository.js.map +1 -0
  751. package/dist/fiscal/sync/circuit.d.ts +86 -0
  752. package/dist/fiscal/sync/circuit.d.ts.map +1 -0
  753. package/dist/fiscal/sync/circuit.js +118 -0
  754. package/dist/fiscal/sync/circuit.js.map +1 -0
  755. package/dist/fiscal/sync/intervention.d.ts +81 -0
  756. package/dist/fiscal/sync/intervention.d.ts.map +1 -0
  757. package/dist/fiscal/sync/intervention.js +135 -0
  758. package/dist/fiscal/sync/intervention.js.map +1 -0
  759. package/dist/fiscal/sync/lease.d.ts +118 -0
  760. package/dist/fiscal/sync/lease.d.ts.map +1 -0
  761. package/dist/fiscal/sync/lease.js +139 -0
  762. package/dist/fiscal/sync/lease.js.map +1 -0
  763. package/dist/fiscal/sync/observability.d.ts +148 -0
  764. package/dist/fiscal/sync/observability.d.ts.map +1 -0
  765. package/dist/fiscal/sync/observability.js +239 -0
  766. package/dist/fiscal/sync/observability.js.map +1 -0
  767. package/dist/fiscal/sync/orchestrator.d.ts +132 -0
  768. package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
  769. package/dist/fiscal/sync/orchestrator.js +487 -0
  770. package/dist/fiscal/sync/orchestrator.js.map +1 -0
  771. package/dist/fiscal/sync/policy.d.ts +87 -0
  772. package/dist/fiscal/sync/policy.d.ts.map +1 -0
  773. package/dist/fiscal/sync/policy.js +136 -0
  774. package/dist/fiscal/sync/policy.js.map +1 -0
  775. package/dist/fiscal/sync/reprocess.d.ts +76 -0
  776. package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
  777. package/dist/fiscal/sync/reprocess.js +237 -0
  778. package/dist/fiscal/sync/reprocess.js.map +1 -0
  779. package/dist/fiscal/sync/retry.d.ts +82 -0
  780. package/dist/fiscal/sync/retry.d.ts.map +1 -0
  781. package/dist/fiscal/sync/retry.js +176 -0
  782. package/dist/fiscal/sync/retry.js.map +1 -0
  783. package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
  784. package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
  785. package/dist/fiscal/sync/secret-boundary.js +116 -0
  786. package/dist/fiscal/sync/secret-boundary.js.map +1 -0
  787. package/dist/fiscal/transport/https.d.ts +86 -0
  788. package/dist/fiscal/transport/https.d.ts.map +1 -0
  789. package/dist/fiscal/transport/https.js +303 -0
  790. package/dist/fiscal/transport/https.js.map +1 -0
  791. package/dist/fiscal/transport/synthetic-tls.d.ts +80 -0
  792. package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
  793. package/dist/fiscal/transport/synthetic-tls.js +323 -0
  794. package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
  795. package/dist/fiscal/transport/types.d.ts +134 -0
  796. package/dist/fiscal/transport/types.d.ts.map +1 -0
  797. package/dist/fiscal/transport/types.js +88 -0
  798. package/dist/fiscal/transport/types.js.map +1 -0
  799. package/dist/import/br-documents.d.ts +26 -0
  800. package/dist/import/br-documents.d.ts.map +1 -0
  801. package/dist/import/br-documents.js +78 -0
  802. package/dist/import/br-documents.js.map +1 -0
  803. package/dist/import/clients-import.d.ts +122 -4
  804. package/dist/import/clients-import.d.ts.map +1 -1
  805. package/dist/import/clients-import.js +341 -41
  806. package/dist/import/clients-import.js.map +1 -1
  807. package/dist/index.d.ts +217 -17
  808. package/dist/index.d.ts.map +1 -1
  809. package/dist/index.js +196 -11
  810. package/dist/index.js.map +1 -1
  811. package/dist/legal/documents.d.ts +12 -1
  812. package/dist/legal/documents.d.ts.map +1 -1
  813. package/dist/legal/documents.js +222 -16
  814. package/dist/legal/documents.js.map +1 -1
  815. package/dist/legal/index.d.ts +2 -2
  816. package/dist/legal/index.d.ts.map +1 -1
  817. package/dist/legal/index.js +1 -1
  818. package/dist/legal/index.js.map +1 -1
  819. package/dist/legal/types.d.ts +69 -3
  820. package/dist/legal/types.d.ts.map +1 -1
  821. package/dist/legal/types.js +1 -0
  822. package/dist/legal/types.js.map +1 -1
  823. package/dist/mail/auth-templates.d.ts +15 -0
  824. package/dist/mail/auth-templates.d.ts.map +1 -0
  825. package/dist/mail/auth-templates.js +26 -0
  826. package/dist/mail/auth-templates.js.map +1 -0
  827. package/dist/mail/dedup-store.d.ts +1 -24
  828. package/dist/mail/dedup-store.d.ts.map +1 -1
  829. package/dist/mail/dedup-store.js +9 -48
  830. package/dist/mail/dedup-store.js.map +1 -1
  831. package/dist/mail/index.d.ts +2 -1
  832. package/dist/mail/index.d.ts.map +1 -1
  833. package/dist/mail/index.js +13 -2
  834. package/dist/mail/index.js.map +1 -1
  835. package/dist/mail/provider.d.ts +2 -30
  836. package/dist/mail/provider.d.ts.map +1 -1
  837. package/dist/mail/provider.js +10 -246
  838. package/dist/mail/provider.js.map +1 -1
  839. package/dist/mail/resend.d.ts +2 -12
  840. package/dist/mail/resend.d.ts.map +1 -1
  841. package/dist/mail/resend.js +11 -17
  842. package/dist/mail/resend.js.map +1 -1
  843. package/dist/mail/sender-resolver.d.ts +1 -7
  844. package/dist/mail/sender-resolver.d.ts.map +1 -1
  845. package/dist/mail/sender-resolver.js +11 -10
  846. package/dist/mail/sender-resolver.js.map +1 -1
  847. package/dist/mail/template-renderer.d.ts +1 -9
  848. package/dist/mail/template-renderer.d.ts.map +1 -1
  849. package/dist/mail/template-renderer.js +10 -15
  850. package/dist/mail/template-renderer.js.map +1 -1
  851. package/dist/mail/transactional-outbound.d.ts +115 -0
  852. package/dist/mail/transactional-outbound.d.ts.map +1 -0
  853. package/dist/mail/transactional-outbound.js +113 -0
  854. package/dist/mail/transactional-outbound.js.map +1 -0
  855. package/dist/mail/types.d.ts +2 -142
  856. package/dist/mail/types.d.ts.map +1 -1
  857. package/dist/mail/types.js +1 -33
  858. package/dist/mail/types.js.map +1 -1
  859. package/dist/onboarding/persistence.d.ts +10 -1
  860. package/dist/onboarding/persistence.d.ts.map +1 -1
  861. package/dist/onboarding/persistence.js +4 -4
  862. package/dist/onboarding/persistence.js.map +1 -1
  863. package/dist/pilot/go-live-checklist.d.ts +41 -0
  864. package/dist/pilot/go-live-checklist.d.ts.map +1 -0
  865. package/dist/pilot/go-live-checklist.js +209 -0
  866. package/dist/pilot/go-live-checklist.js.map +1 -0
  867. package/dist/pilot/milestone.d.ts +56 -0
  868. package/dist/pilot/milestone.d.ts.map +1 -0
  869. package/dist/pilot/milestone.js +74 -0
  870. package/dist/pilot/milestone.js.map +1 -0
  871. package/dist/platform/capabilities.d.ts +88 -0
  872. package/dist/platform/capabilities.d.ts.map +1 -0
  873. package/dist/platform/capabilities.js +140 -0
  874. package/dist/platform/capabilities.js.map +1 -0
  875. package/dist/platform/job-contract.d.ts +232 -0
  876. package/dist/platform/job-contract.d.ts.map +1 -0
  877. package/dist/platform/job-contract.js +403 -0
  878. package/dist/platform/job-contract.js.map +1 -0
  879. package/dist/portal/provisioning.d.ts +58 -0
  880. package/dist/portal/provisioning.d.ts.map +1 -0
  881. package/dist/portal/provisioning.js +139 -0
  882. package/dist/portal/provisioning.js.map +1 -0
  883. package/dist/pricing-engine/canonical.d.ts +14 -0
  884. package/dist/pricing-engine/canonical.d.ts.map +1 -0
  885. package/dist/pricing-engine/canonical.js +39 -0
  886. package/dist/pricing-engine/canonical.js.map +1 -0
  887. package/dist/pricing-engine/errors.d.ts.map +1 -1
  888. package/dist/pricing-engine/errors.js +6 -1
  889. package/dist/pricing-engine/errors.js.map +1 -1
  890. package/dist/pricing-engine/index.d.ts +12 -2
  891. package/dist/pricing-engine/index.d.ts.map +1 -1
  892. package/dist/pricing-engine/index.js +6 -1
  893. package/dist/pricing-engine/index.js.map +1 -1
  894. package/dist/pricing-engine/pipeline.d.ts.map +1 -1
  895. package/dist/pricing-engine/pipeline.js +202 -28
  896. package/dist/pricing-engine/pipeline.js.map +1 -1
  897. package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
  898. package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
  899. package/dist/pricing-engine/shadow-adapter.js +75 -0
  900. package/dist/pricing-engine/shadow-adapter.js.map +1 -0
  901. package/dist/pricing-engine/shadow-diff.d.ts +26 -0
  902. package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
  903. package/dist/pricing-engine/shadow-diff.js +52 -0
  904. package/dist/pricing-engine/shadow-diff.js.map +1 -0
  905. package/dist/pricing-engine/shadow-facade.d.ts +42 -0
  906. package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
  907. package/dist/pricing-engine/shadow-facade.js +82 -0
  908. package/dist/pricing-engine/shadow-facade.js.map +1 -0
  909. package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
  910. package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
  911. package/dist/pricing-engine/shadow-legacy-types.js +18 -0
  912. package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
  913. package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
  914. package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
  915. package/dist/pricing-engine/shadow-metrics.js +31 -0
  916. package/dist/pricing-engine/shadow-metrics.js.map +1 -0
  917. package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
  918. package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
  919. package/dist/pricing-engine/shadow-normalizer.js +39 -0
  920. package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
  921. package/dist/pricing-engine/types.d.ts +2 -0
  922. package/dist/pricing-engine/types.d.ts.map +1 -1
  923. package/dist/rbac/authorize.d.ts +12 -0
  924. package/dist/rbac/authorize.d.ts.map +1 -1
  925. package/dist/rbac/authorize.js +27 -0
  926. package/dist/rbac/authorize.js.map +1 -1
  927. package/dist/rbac/catalog.d.ts.map +1 -1
  928. package/dist/rbac/catalog.js +101 -1
  929. package/dist/rbac/catalog.js.map +1 -1
  930. package/dist/rbac/workload-provisioning.d.ts +66 -0
  931. package/dist/rbac/workload-provisioning.d.ts.map +1 -0
  932. package/dist/rbac/workload-provisioning.js +153 -0
  933. package/dist/rbac/workload-provisioning.js.map +1 -0
  934. package/dist/rbac/workload.d.ts +124 -0
  935. package/dist/rbac/workload.d.ts.map +1 -0
  936. package/dist/rbac/workload.js +184 -0
  937. package/dist/rbac/workload.js.map +1 -0
  938. package/dist/storage/checksum.d.ts +9 -0
  939. package/dist/storage/checksum.d.ts.map +1 -0
  940. package/dist/storage/checksum.js +12 -0
  941. package/dist/storage/checksum.js.map +1 -0
  942. package/dist/storage/key.d.ts +37 -0
  943. package/dist/storage/key.d.ts.map +1 -0
  944. package/dist/storage/key.js +67 -0
  945. package/dist/storage/key.js.map +1 -0
  946. package/dist/storage/local.d.ts +40 -0
  947. package/dist/storage/local.d.ts.map +1 -0
  948. package/dist/storage/local.js +96 -0
  949. package/dist/storage/local.js.map +1 -0
  950. package/dist/storage/r2.d.ts +43 -0
  951. package/dist/storage/r2.d.ts.map +1 -0
  952. package/dist/storage/r2.js +177 -0
  953. package/dist/storage/r2.js.map +1 -0
  954. package/dist/storage/registry.d.ts +23 -0
  955. package/dist/storage/registry.d.ts.map +1 -0
  956. package/dist/storage/registry.js +37 -0
  957. package/dist/storage/registry.js.map +1 -0
  958. package/dist/storage/types.d.ts +67 -0
  959. package/dist/storage/types.d.ts.map +1 -0
  960. package/dist/storage/types.js +45 -0
  961. package/dist/storage/types.js.map +1 -0
  962. package/dist/subscription-billing/index.d.ts +6 -5
  963. package/dist/subscription-billing/index.d.ts.map +1 -1
  964. package/dist/subscription-billing/index.js +3 -3
  965. package/dist/subscription-billing/index.js.map +1 -1
  966. package/dist/subscription-billing/provider/asaas.d.ts +14 -0
  967. package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
  968. package/dist/subscription-billing/provider/asaas.js +32 -7
  969. package/dist/subscription-billing/provider/asaas.js.map +1 -1
  970. package/dist/subscription-billing/provider/disabled.d.ts +9 -0
  971. package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
  972. package/dist/subscription-billing/provider/disabled.js +8 -0
  973. package/dist/subscription-billing/provider/disabled.js.map +1 -1
  974. package/dist/subscription-billing/provider/registry.d.ts +10 -0
  975. package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
  976. package/dist/subscription-billing/provider/registry.js +17 -0
  977. package/dist/subscription-billing/provider/registry.js.map +1 -1
  978. package/dist/subscription-billing/service.d.ts +38 -1
  979. package/dist/subscription-billing/service.d.ts.map +1 -1
  980. package/dist/subscription-billing/service.js +147 -23
  981. package/dist/subscription-billing/service.js.map +1 -1
  982. package/dist/subscription-billing/types.d.ts +13 -0
  983. package/dist/subscription-billing/types.d.ts.map +1 -1
  984. package/dist/subscription-billing/types.js.map +1 -1
  985. package/dist/tenancy/features.d.ts +69 -0
  986. package/dist/tenancy/features.d.ts.map +1 -0
  987. package/dist/tenancy/features.js +123 -0
  988. package/dist/tenancy/features.js.map +1 -0
  989. package/dist/tenancy/provisioning.d.ts.map +1 -1
  990. package/dist/tenancy/provisioning.js +32 -8
  991. package/dist/tenancy/provisioning.js.map +1 -1
  992. package/dist/tenancy/settings.d.ts +63 -0
  993. package/dist/tenancy/settings.d.ts.map +1 -0
  994. package/dist/tenancy/settings.js +218 -0
  995. package/dist/tenancy/settings.js.map +1 -0
  996. package/dist/users/repository.d.ts +54 -1
  997. package/dist/users/repository.d.ts.map +1 -1
  998. package/dist/users/repository.js +142 -4
  999. package/dist/users/repository.js.map +1 -1
  1000. package/dist/vault/repository.d.ts +67 -0
  1001. package/dist/vault/repository.d.ts.map +1 -1
  1002. package/dist/vault/repository.js +78 -0
  1003. package/dist/vault/repository.js.map +1 -1
  1004. package/package.json +20 -4
  1005. package/src/db/migrations/0023_user_invite_activation.sql +15 -0
  1006. package/src/db/migrations/0024_set_user_password_function.sql +32 -0
  1007. package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
  1008. package/src/db/migrations/0026_documents_and_competence.sql +353 -0
  1009. package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
  1010. package/src/db/migrations/0028_collection_engine.sql +94 -0
  1011. package/src/db/migrations/0029_payment_rail.sql +107 -0
  1012. package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
  1013. package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
  1014. package/src/db/migrations/0032_settlement_reversal.sql +76 -0
  1015. package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
  1016. package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
  1017. package/src/db/migrations/0035_payment_account_environments.sql +61 -0
  1018. package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
  1019. package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
  1020. package/src/db/migrations/0038_notification_channels.sql +175 -0
  1021. package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
  1022. package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
  1023. package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
  1024. package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
  1025. package/src/db/migrations/0043_workload_identity.sql +105 -0
  1026. package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
  1027. package/src/db/migrations/0045_role_write_scope.sql +122 -0
  1028. package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
  1029. package/src/db/migrations/0047_recipient_clearance.sql +89 -0
  1030. package/src/db/migrations/0048_item_type_note.sql +16 -0
  1031. package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
  1032. package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
  1033. package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
  1034. package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
  1035. package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
  1036. package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
  1037. package/src/db/migrations/0055_job_capability_contract.sql +300 -0
  1038. package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
  1039. package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
  1040. package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
  1041. package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
  1042. package/dist/cjs/mail/resend-client.js +0 -103
  1043. package/dist/cjs/mail/resend-client.js.map +0 -1
  1044. package/dist/mail/resend-client.d.ts +0 -16
  1045. package/dist/mail/resend-client.d.ts.map +0 -1
  1046. package/dist/mail/resend-client.js +0 -100
  1047. package/dist/mail/resend-client.js.map +0 -1
@@ -0,0 +1,246 @@
1
+ import { uuidv7 } from '@baruk/shared';
2
+ import { DEFAULT_POLICY, parsePolicySteps } from './policy.js';
3
+ const iso = (d) => (d ? d.toISOString().slice(0, 10) : null);
4
+ function mapAction(r) {
5
+ return {
6
+ id: r.id,
7
+ receivableId: r.receivable_id,
8
+ clientId: r.client_id,
9
+ clientName: r.client_name,
10
+ stepKey: r.step_key,
11
+ channel: r.channel,
12
+ template: r.template,
13
+ status: r.status,
14
+ scheduledFor: iso(r.scheduled_for),
15
+ attempts: r.attempts,
16
+ lastError: r.last_error,
17
+ sentAt: r.sent_at?.toISOString() ?? null,
18
+ closedAt: r.closed_at?.toISOString() ?? null,
19
+ closedReason: r.closed_reason,
20
+ recipientRef: r.recipient_ref,
21
+ amountAtSend: r.amount_at_send === null ? null : Number(r.amount_at_send),
22
+ createdAt: r.created_at.toISOString(),
23
+ };
24
+ }
25
+ const SELECT_ACTION = `
26
+ SELECT d.id, d.receivable_id, r.client_id, c.display_name AS client_name, d.step_key,
27
+ d.channel, d.template, d.status, d.scheduled_for, d.attempts, d.last_error,
28
+ d.sent_at, d.closed_at, d.closed_reason, d.recipient_ref, d.amount_at_send, d.created_at
29
+ FROM dunning_event d
30
+ LEFT JOIN receivable r ON r.id = d.receivable_id
31
+ LEFT JOIN client c ON c.id = r.client_id AND c.deleted_at IS NULL`;
32
+ // ── Política ────────────────────────────────────────────────────────────────
33
+ /** Política ativa do tenant; cai no padrão do produto quando não há nenhuma. */
34
+ export async function getCollectionPolicy(tx) {
35
+ const rows = await tx `
36
+ SELECT id, name, steps, active FROM dunning_rule
37
+ WHERE active AND is_default
38
+ ORDER BY created_at LIMIT 1
39
+ `;
40
+ const row = rows[0];
41
+ if (!row)
42
+ return DEFAULT_POLICY;
43
+ const steps = parsePolicySteps(row.steps);
44
+ // Política cadastrada mas ilegível não pode virar "sem cobrança nenhuma"
45
+ // silenciosamente: melhor cair no padrão e deixar a régua rodando.
46
+ if (steps.length === 0)
47
+ return { ...DEFAULT_POLICY, id: row.id, name: row.name };
48
+ return { id: row.id, name: row.name, steps, active: row.active };
49
+ }
50
+ export async function upsertCollectionPolicy(tx, input) {
51
+ const steps = parsePolicySteps(input.steps);
52
+ const existing = await tx `
53
+ SELECT id FROM dunning_rule WHERE is_default LIMIT 1
54
+ `;
55
+ if (existing[0]) {
56
+ await tx `
57
+ UPDATE dunning_rule
58
+ SET name = ${input.name}, steps = ${tx.json(steps)},
59
+ active = ${input.active ?? true}, updated_at = now()
60
+ WHERE id = ${existing[0].id}
61
+ `;
62
+ }
63
+ else {
64
+ await tx `
65
+ INSERT INTO dunning_rule (id, tenant_id, name, steps, active, is_default)
66
+ VALUES (${uuidv7()},
67
+ (NULLIF(current_setting('app.current_tenant', true), ''))::uuid,
68
+ ${input.name}, ${tx.json(steps)}, ${input.active ?? true}, true)
69
+ `;
70
+ }
71
+ return getCollectionPolicy(tx);
72
+ }
73
+ // ── Ações ───────────────────────────────────────────────────────────────────
74
+ /**
75
+ * Agenda uma etapa. Idempotente pelo índice único parcial
76
+ * `(tenant, receivable, step_key)` — o `ON CONFLICT DO NOTHING` é o que
77
+ * transforma job repetido, retry, restart de worker e webhook duplicado em
78
+ * uma única ação lógica.
79
+ */
80
+ export async function scheduleAction(tx, input) {
81
+ const rows = await tx `
82
+ INSERT INTO dunning_event (id, tenant_id, receivable_id, step_key, channel, template,
83
+ status, scheduled_for)
84
+ VALUES (${uuidv7()},
85
+ (NULLIF(current_setting('app.current_tenant', true), ''))::uuid,
86
+ ${input.receivableId}, ${input.stepKey}, ${input.channel}, ${input.template},
87
+ 'scheduled', ${input.scheduledFor})
88
+ ON CONFLICT (tenant_id, receivable_id, step_key) WHERE receivable_id IS NOT NULL
89
+ DO NOTHING
90
+ RETURNING id
91
+ `;
92
+ if (!rows[0])
93
+ return null;
94
+ return getAction(tx, rows[0].id);
95
+ }
96
+ export async function getAction(tx, id) {
97
+ const rows = await tx `${tx.unsafe(SELECT_ACTION)} WHERE d.id = ${id}`;
98
+ const row = rows[0];
99
+ if (!row)
100
+ throw new Error('Ação de cobrança não encontrada');
101
+ return mapAction(row);
102
+ }
103
+ export async function listActions(tx, filter = {}) {
104
+ const limit = Math.min(Math.max(filter.limit ?? 100, 1), 500);
105
+ const rows = await tx `
106
+ ${tx.unsafe(SELECT_ACTION)}
107
+ WHERE d.receivable_id IS NOT NULL
108
+ ${filter.status ? tx `AND d.status = ${filter.status}` : tx ``}
109
+ ${filter.receivableId ? tx `AND d.receivable_id = ${filter.receivableId}` : tx ``}
110
+ ${filter.clientId ? tx `AND r.client_id = ${filter.clientId}` : tx ``}
111
+ ${filter.dueOnly
112
+ ? tx `AND d.status = 'scheduled' AND d.scheduled_for <= ${filter.dueUntil ?? tx `CURRENT_DATE`}`
113
+ : tx ``}
114
+ ORDER BY d.scheduled_for NULLS LAST, d.created_at
115
+ LIMIT ${limit}
116
+ `;
117
+ return rows.map(mapAction);
118
+ }
119
+ /** Etapas já registradas para um recebível — alimenta a idempotência da régua. */
120
+ export async function handledStepKeys(tx, receivableId) {
121
+ const rows = await tx `
122
+ SELECT step_key FROM dunning_event WHERE receivable_id = ${receivableId}
123
+ `;
124
+ return new Set(rows.map((r) => r.step_key));
125
+ }
126
+ /**
127
+ * Assenta o envio.
128
+ *
129
+ * O identificador do provider vai para `provider_ref` (migration 0038). Antes
130
+ * ele era espremido em `template` sob COALESCE: como `scheduleAction` sempre
131
+ * grava o template, o id do provider era descartado em silêncio — e, se o
132
+ * template estivesse nulo, ocupava o lugar do nome e corrompia o relatório.
133
+ *
134
+ * Nunca deu problema porque o adapter de e-mail não devolve identificador.
135
+ * WhatsApp e SMS devolvem sempre, e o webhook de entrega chega trazendo APENAS
136
+ * esse id: sem coluna própria e indexada, todo status de entrega se perderia.
137
+ */
138
+ export async function markSent(tx, id, input) {
139
+ await tx `
140
+ UPDATE dunning_event
141
+ SET status = 'sent', sent_at = now(), attempts = attempts + 1,
142
+ recipient_ref = ${input.recipientRef}, amount_at_send = ${input.amount},
143
+ last_error = NULL, closed_at = now(),
144
+ provider_ref = COALESCE(${input.providerRef ?? null}, provider_ref),
145
+ idempotency_key = COALESCE(${input.idempotencyKey ?? null}, idempotency_key)
146
+ WHERE id = ${id}
147
+ `;
148
+ }
149
+ export async function markFailed(tx, id, input) {
150
+ await tx `
151
+ UPDATE dunning_event
152
+ SET status = ${input.permanent ? 'failed' : 'scheduled'},
153
+ attempts = attempts + 1,
154
+ last_error = ${input.error.slice(0, 300)},
155
+ closed_at = ${input.permanent ? tx `now()` : null},
156
+ closed_reason = ${input.permanent ? 'permanent_failure' : null}
157
+ WHERE id = ${id}
158
+ `;
159
+ }
160
+ export async function markEscalated(tx, id, reason = 'escalated') {
161
+ await tx `
162
+ UPDATE dunning_event
163
+ SET status = 'escalated', closed_at = now(), closed_reason = ${reason}
164
+ WHERE id = ${id}
165
+ `;
166
+ }
167
+ /**
168
+ * Cancela ações ainda não enviadas de um recebível.
169
+ *
170
+ * Só toca `scheduled`: o que já saiu é histórico e não se apaga. Retorna quantas
171
+ * foram canceladas para o job poder relatar honestamente o que aconteceu.
172
+ */
173
+ export async function cancelPendingActions(tx, receivableId, reason) {
174
+ const rows = await tx `
175
+ UPDATE dunning_event
176
+ SET status = 'canceled', closed_at = now(), closed_reason = ${reason}
177
+ WHERE receivable_id = ${receivableId} AND status = 'scheduled'
178
+ RETURNING id
179
+ `;
180
+ return rows.length;
181
+ }
182
+ export async function collectionMetrics(tx) {
183
+ const [m] = await tx `
184
+ SELECT
185
+ count(*) FILTER (WHERE status = 'scheduled')::int AS scheduled,
186
+ count(*) FILTER (WHERE status = 'sent')::int AS sent,
187
+ count(*) FILTER (WHERE status = 'failed')::int AS failed,
188
+ count(*) FILTER (WHERE status = 'canceled')::int AS canceled,
189
+ count(*) FILTER (WHERE status = 'canceled' AND closed_reason = 'paid')::int AS stopped_by_payment,
190
+ count(*) FILTER (WHERE status = 'escalated')::int AS escalated,
191
+ count(*) FILTER (WHERE closed_reason = 'no_contact_data')::int AS no_contact_data,
192
+ count(*) FILTER (WHERE status = 'scheduled' AND scheduled_for <= CURRENT_DATE)::int AS due_today
193
+ FROM dunning_event WHERE receivable_id IS NOT NULL
194
+ `;
195
+ const [p] = await tx `
196
+ SELECT COALESCE(sum(r.amount), 0) AS amount
197
+ FROM receivable r
198
+ WHERE r.status = 'paid'
199
+ AND EXISTS (SELECT 1 FROM dunning_event d
200
+ WHERE d.receivable_id = r.id AND d.status = 'sent')
201
+ `;
202
+ return {
203
+ scheduled: m.scheduled,
204
+ sent: m.sent,
205
+ failed: m.failed,
206
+ canceled: m.canceled,
207
+ stoppedByPayment: m.stopped_by_payment,
208
+ escalated: m.escalated,
209
+ noContactData: m.no_contact_data,
210
+ dueToday: m.due_today,
211
+ amountPaidAfterCollection: Number(p.amount),
212
+ };
213
+ }
214
+ export async function clientTimeline(tx, clientId, limit = 100) {
215
+ const rows = await tx `
216
+ SELECT created_at AS at, 'receivable_created' AS kind,
217
+ COALESCE(competence, 'avulso') AS detail, amount, id AS receivable_id
218
+ FROM receivable WHERE client_id = ${clientId} AND deleted_at IS NULL
219
+ UNION ALL
220
+ SELECT p.paid_at, 'payment', p.method, p.amount, p.receivable_id
221
+ FROM payment p JOIN receivable r ON r.id = p.receivable_id
222
+ WHERE r.client_id = ${clientId} AND p.status = 'confirmed'
223
+ UNION ALL
224
+ SELECT d.sent_at, 'collection_sent', d.step_key || ' · ' || d.channel, d.amount_at_send, d.receivable_id
225
+ FROM dunning_event d JOIN receivable r ON r.id = d.receivable_id
226
+ WHERE r.client_id = ${clientId} AND d.status = 'sent' AND d.sent_at IS NOT NULL
227
+ UNION ALL
228
+ SELECT d.closed_at, 'collection_canceled', d.step_key || ' · ' || COALESCE(d.closed_reason, '-'), NULL, d.receivable_id
229
+ FROM dunning_event d JOIN receivable r ON r.id = d.receivable_id
230
+ WHERE r.client_id = ${clientId} AND d.status = 'canceled' AND d.closed_at IS NOT NULL
231
+ UNION ALL
232
+ SELECT d.closed_at, 'collection_escalated', d.step_key, NULL, d.receivable_id
233
+ FROM dunning_event d JOIN receivable r ON r.id = d.receivable_id
234
+ WHERE r.client_id = ${clientId} AND d.status = 'escalated' AND d.closed_at IS NOT NULL
235
+ ORDER BY at DESC
236
+ LIMIT ${limit}
237
+ `;
238
+ return rows.map((r) => ({
239
+ at: r.at.toISOString(),
240
+ kind: r.kind,
241
+ detail: r.detail,
242
+ amount: r.amount === null ? null : Number(r.amount),
243
+ receivableId: r.receivable_id,
244
+ }));
245
+ }
246
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/collection/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Quem é o ASSUNTO de uma cobrança — e se existe um.
3
+ *
4
+ * ## O falso positivo que este módulo existe para matar
5
+ *
6
+ * O preflight de envio avulso respondia `eligible: true` medindo seis portas —
7
+ * identidade, credencial, destinatário, telefone, consentimento, template — e
8
+ * nenhuma delas pergunta **sobre o quê** a mensagem falaria. Um cliente sem
9
+ * recebível nenhum passava nas seis, e a rota de envio recusava logo depois por
10
+ * falta de valor e vencimento.
11
+ *
12
+ * Um preflight que aprova o que a execução recusa é pior que não ter preflight:
13
+ * ele desloca a descoberta do defeito para o momento do disparo, que é
14
+ * exatamente onde ninguém quer descobrir nada.
15
+ *
16
+ * ## Por que aqui, e não no handler
17
+ *
18
+ * "Este recebível está devido na etapa D+3 hoje?" é regra da RÉGUA. Ela já vive
19
+ * em `policy.ts` (`dueSteps`, `scheduledDateFor`) e em `engine.ts`
20
+ * (`isCollectible`), e é usada pelo ciclo automático. Reimplementar a mesma
21
+ * conta dentro de uma rota criaria a segunda derivação de sempre — as duas
22
+ * concordariam no dia da escrita e divergiriam na primeira mudança da régua,
23
+ * com o avulso mandando o que o ciclo não mandaria.
24
+ *
25
+ * Este módulo não decide política nova: ele **lê** a política vigente e responde
26
+ * quem ela alcança, sem escrever nada.
27
+ */
28
+ import type { Tx } from '../db/client.js';
29
+ import { type ReceivableWithBalance } from '../billing/ar-repository.js';
30
+ import { type CollectionPolicy } from './policy.js';
31
+ /**
32
+ * Um recebível ainda merece cobrança?
33
+ *
34
+ * Cópia deliberada da regra de `engine.ts`, que era privada. Exportar de lá e
35
+ * importar aqui criaria ciclo (`engine` já importa deste módulo o suficiente);
36
+ * a duplicação é de UMA função pequena e está coberta pelo teste de
37
+ * equivalência em `collection-subject.test.ts`, que exercita as duas contra os
38
+ * mesmos casos.
39
+ */
40
+ export declare function isCollectibleSubject(r: ReceivableWithBalance): boolean;
41
+ export interface EligibleSubjectQuery {
42
+ clientId: string;
43
+ /** Etapa da régua, como `D+3`. */
44
+ stepKey: string;
45
+ /** Data de referência, `YYYY-MM-DD`. Do chamador — o domínio não lê relógio. */
46
+ today: string;
47
+ policy?: CollectionPolicy;
48
+ }
49
+ /**
50
+ * Os recebíveis do cliente que a etapa alcança HOJE.
51
+ *
52
+ * Vazio quer dizer "não há sobre o que cobrar nesta etapa", e é um desfecho
53
+ * legítimo — não um erro. Cabe a quem chama transformar isso em recusa.
54
+ *
55
+ * A ordem é a mesma da régua (vencimento mais antigo primeiro), para que o
56
+ * avulso e o ciclo escolham o mesmo quando houver mais de um.
57
+ */
58
+ export declare function findEligibleSubjects(tx: Tx, q: EligibleSubjectQuery): Promise<ReceivableWithBalance[]>;
59
+ /**
60
+ * O assunto que o envio avulso usaria, ou `null`.
61
+ *
62
+ * Quando há mais de um, o mais antigo — mesma preferência da régua. Escolher o
63
+ * mais recente faria a dívida velha envelhecer sem cobrança.
64
+ */
65
+ export declare function resolveSubjectForStep(tx: Tx, q: EligibleSubjectQuery): Promise<ReceivableWithBalance | null>;
66
+ //# sourceMappingURL=subject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../src/collection/subject.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAmB,KAAK,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAAY,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG9D;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAQtE;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,EAAE,EACN,CAAC,EAAE,oBAAoB,GACtB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CA2BlC;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,CAAC,EAAE,oBAAoB,GACtB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAGvC"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Quem é o ASSUNTO de uma cobrança — e se existe um.
3
+ *
4
+ * ## O falso positivo que este módulo existe para matar
5
+ *
6
+ * O preflight de envio avulso respondia `eligible: true` medindo seis portas —
7
+ * identidade, credencial, destinatário, telefone, consentimento, template — e
8
+ * nenhuma delas pergunta **sobre o quê** a mensagem falaria. Um cliente sem
9
+ * recebível nenhum passava nas seis, e a rota de envio recusava logo depois por
10
+ * falta de valor e vencimento.
11
+ *
12
+ * Um preflight que aprova o que a execução recusa é pior que não ter preflight:
13
+ * ele desloca a descoberta do defeito para o momento do disparo, que é
14
+ * exatamente onde ninguém quer descobrir nada.
15
+ *
16
+ * ## Por que aqui, e não no handler
17
+ *
18
+ * "Este recebível está devido na etapa D+3 hoje?" é regra da RÉGUA. Ela já vive
19
+ * em `policy.ts` (`dueSteps`, `scheduledDateFor`) e em `engine.ts`
20
+ * (`isCollectible`), e é usada pelo ciclo automático. Reimplementar a mesma
21
+ * conta dentro de uma rota criaria a segunda derivação de sempre — as duas
22
+ * concordariam no dia da escrita e divergiriam na primeira mudança da régua,
23
+ * com o avulso mandando o que o ciclo não mandaria.
24
+ *
25
+ * Este módulo não decide política nova: ele **lê** a política vigente e responde
26
+ * quem ela alcança, sem escrever nada.
27
+ */
28
+ import { listReceivables } from '../billing/ar-repository.js';
29
+ import { dueSteps } from './policy.js';
30
+ import { getCollectionPolicy, handledStepKeys } from './repository.js';
31
+ /**
32
+ * Um recebível ainda merece cobrança?
33
+ *
34
+ * Cópia deliberada da regra de `engine.ts`, que era privada. Exportar de lá e
35
+ * importar aqui criaria ciclo (`engine` já importa deste módulo o suficiente);
36
+ * a duplicação é de UMA função pequena e está coberta pelo teste de
37
+ * equivalência em `collection-subject.test.ts`, que exercita as duas contra os
38
+ * mesmos casos.
39
+ */
40
+ export function isCollectibleSubject(r) {
41
+ if (r.status === 'paid' || r.status === 'canceled')
42
+ return false;
43
+ if (r.status === 'renegotiated' || r.status === 'written_off')
44
+ return false;
45
+ // Saldo zero sem status `paid` é quem já pagou e o status não foi reavaliado.
46
+ // Cobrar aqui é o pior erro operacional deste motor.
47
+ if (r.outstandingAmount <= 0)
48
+ return false;
49
+ if (!r.dueDate)
50
+ return false;
51
+ return true;
52
+ }
53
+ /**
54
+ * Os recebíveis do cliente que a etapa alcança HOJE.
55
+ *
56
+ * Vazio quer dizer "não há sobre o que cobrar nesta etapa", e é um desfecho
57
+ * legítimo — não um erro. Cabe a quem chama transformar isso em recusa.
58
+ *
59
+ * A ordem é a mesma da régua (vencimento mais antigo primeiro), para que o
60
+ * avulso e o ciclo escolham o mesmo quando houver mais de um.
61
+ */
62
+ export async function findEligibleSubjects(tx, q) {
63
+ const policy = q.policy ?? (await getCollectionPolicy(tx));
64
+ /*
65
+ * Nenhuma checagem própria de política ou de etapa aqui.
66
+ *
67
+ * A primeira versão tinha duas — "a régua está ativa" e "a etapa existe e
68
+ * está ativa" — e o teste de mutação derrubou as duas: removê-las não quebrava
69
+ * caso nenhum, porque `dueSteps` já decide exatamente isso. Guard que nenhum
70
+ * teste consegue distinguir não é guard: é uma segunda codificação da mesma
71
+ * regra, esperando para divergir da primeira.
72
+ *
73
+ * O que sobra deste módulo é o que ele de fato acrescenta: recortar por
74
+ * cliente, aplicar `isCollectibleSubject` e perguntar à régua. `dueSteps`
75
+ * continua sendo a única autoridade sobre quando uma etapa vence.
76
+ */
77
+ const { items } = await listReceivables(tx, { clientId: q.clientId, limit: 200 });
78
+ const elegiveis = [];
79
+ for (const r of items) {
80
+ if (!isCollectibleSubject(r))
81
+ continue;
82
+ const handled = await handledStepKeys(tx, r.id);
83
+ const due = dueSteps(policy, r.dueDate, q.today, handled);
84
+ if (due.some((d) => d.step.key === q.stepKey))
85
+ elegiveis.push(r);
86
+ }
87
+ return elegiveis;
88
+ }
89
+ /**
90
+ * O assunto que o envio avulso usaria, ou `null`.
91
+ *
92
+ * Quando há mais de um, o mais antigo — mesma preferência da régua. Escolher o
93
+ * mais recente faria a dívida velha envelhecer sem cobrança.
94
+ */
95
+ export async function resolveSubjectForStep(tx, q) {
96
+ const todos = await findEligibleSubjects(tx, q);
97
+ return todos[0] ?? null;
98
+ }
99
+ //# sourceMappingURL=subject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subject.js","sourceRoot":"","sources":["../../src/collection/subject.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EAAE,eAAe,EAA8B,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAyB,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvE;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,CAAwB;IAC3D,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IACjE,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,CAAC,MAAM,KAAK,aAAa;QAAE,OAAO,KAAK,CAAC;IAC5E,8EAA8E;IAC9E,qDAAqD;IACrD,IAAI,CAAC,CAAC,iBAAiB,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC,CAAC,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAWD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAM,EACN,CAAuB;IAEvB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3D;;;;;;;;;;;;OAYG;IAEH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAElF,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAAE,SAAS;QACvC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,OAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3D,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,EAAM,EACN,CAAuB;IAEvB,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Catálogo de templates da COBRANÇA — do produto, não do motor.
3
+ *
4
+ * O motor sabe resolver template (escopo, versão, aprovação); ele não conhece
5
+ * nenhum. Os textos e os nomes registrados no provider vivem aqui, ao lado da
6
+ * régua que os usa.
7
+ *
8
+ * O corpo dos e-mails continua vindo de `copy.ts`/`email-layout.ts`: este
9
+ * catálogo declara QUAL template vale para cada etapa e canal, e as variáveis
10
+ * que ele consome. Duplicar o texto aqui criaria duas fontes para a mesma
11
+ * mensagem, e a segunda ficaria para trás na primeira correção.
12
+ */
13
+ import type { Tx } from '../db/client.js';
14
+ import type { TemplateStore } from '../communication/index.js';
15
+ export declare function createCollectionTemplateStore(tx: Tx): TemplateStore;
16
+ //# sourceMappingURL=template-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-catalog.d.ts","sourceRoot":"","sources":["../../src/collection/template-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAA8B,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA6I3F,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,EAAE,GAAG,aAAa,CAsBnE"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Catálogo de templates da COBRANÇA — do produto, não do motor.
3
+ *
4
+ * O motor sabe resolver template (escopo, versão, aprovação); ele não conhece
5
+ * nenhum. Os textos e os nomes registrados no provider vivem aqui, ao lado da
6
+ * régua que os usa.
7
+ *
8
+ * O corpo dos e-mails continua vindo de `copy.ts`/`email-layout.ts`: este
9
+ * catálogo declara QUAL template vale para cada etapa e canal, e as variáveis
10
+ * que ele consome. Duplicar o texto aqui criaria duas fontes para a mesma
11
+ * mensagem, e a segunda ficaria para trás na primeira correção.
12
+ */
13
+ import { SC_PRODUCT } from './communication-bridge.js';
14
+ const LOCALE = 'pt-BR';
15
+ /**
16
+ * Variáveis da cobrança, na ordem em que os templates de WhatsApp as declaram.
17
+ *
18
+ * A ordem é contrato com o template aprovado no provider: `{{1}}` é o nome,
19
+ * `{{2}}` o valor, `{{3}}` o vencimento. Trocar a ordem aqui sem re-aprovar o
20
+ * template lá manda o valor no lugar do nome — e a Meta aceita, porque para ela
21
+ * são três strings.
22
+ */
23
+ const COLLECTION_VARS = ['clientName', 'amount', 'dueDate'];
24
+ /**
25
+ * Sufixo do nome REGISTRADO NO PROVIDER.
26
+ *
27
+ * Muda **somente** quando um template novo é submetido e aprovado do lado da
28
+ * Meta. Mexer aqui sem submeter faz o despacho pedir um nome que não existe — e
29
+ * a Meta responde `132001`, que fala de "translation" e manda quem investiga
30
+ * procurar no lugar errado.
31
+ */
32
+ const PROVIDER_TEMPLATE_SUFFIX = 'v1';
33
+ /**
34
+ * Revisão INTERNA do catálogo de WhatsApp. **Nunca chega ao provider.**
35
+ *
36
+ * Entra na chave de idempotência (`buildIdempotencyKey` recebe
37
+ * `templateVersion`), e é o único jeito legítimo de dizer "esta é outra
38
+ * tentativa lógica" sem tocar no template aprovado.
39
+ *
40
+ * ## Por que os dois existem separados
41
+ *
42
+ * Eram dois literais `'v1'` — um em `version`, outro dentro da interpolação de
43
+ * `providerTemplateName` —, independentes de fato e idênticos na aparência. A
44
+ * primeira pessoa que precisasse de uma chave nova bumparia o que estivesse
45
+ * mais à mão, e havia 50% de chance de o despacho passar a pedir
46
+ * `billing_dunning_dplus3_v2` à Meta, que não tem esse template.
47
+ *
48
+ * `v2` aqui porque a revisão `v1` foi consumida: em 2026-09-01 a primeira
49
+ * tentativa real assentou a chave como `failed_permanent`, e o motor recusa
50
+ * repetição sobre chave assentada — corretamente. O template aprovado continua
51
+ * sendo `billing_dunning_dplus3_v1`.
52
+ *
53
+ * E-mail e SMS **não** bumpam: os dois têm despacho real em produção, e mudar a
54
+ * versão deles reabriria chaves já assentadas de 89 avisos que já saíram.
55
+ */
56
+ const WHATSAPP_CATALOG_REVISION = 'v2';
57
+ /**
58
+ * E-mail: sempre disponível, porque o corpo é montado pelo produto.
59
+ *
60
+ * `approved` aqui não significa "aprovado por um provider" — e-mail não tem
61
+ * registro prévio. Significa "utilizável", que é o que o motor precisa saber.
62
+ */
63
+ function emailTemplate(eventType) {
64
+ return {
65
+ tenantId: null,
66
+ product: SC_PRODUCT,
67
+ brand: null,
68
+ channel: 'email',
69
+ eventType,
70
+ locale: LOCALE,
71
+ version: 'v1',
72
+ status: 'approved',
73
+ variables: [...COLLECTION_VARS],
74
+ };
75
+ }
76
+ /**
77
+ * WhatsApp: só existe se o escritório tiver registrado o template no provider.
78
+ *
79
+ * O nome segue o evento (`billing.dunning.dplus3` → `billing_dunning_dplus3_v1`)
80
+ * porque é a única convenção que não exige uma segunda tabela de-para que
81
+ * alguém precisaria manter sincronizada com o painel da Meta.
82
+ *
83
+ * **Não é declarado aprovado por padrão.** Um template que este código afirma
84
+ * existir e que ninguém registrou vira recusa do provider a cada etapa da régua
85
+ * — e a recusa chega como falha de entrega, sugerindo problema no cliente.
86
+ */
87
+ function whatsappTemplate(eventType, approved) {
88
+ return {
89
+ tenantId: null,
90
+ product: SC_PRODUCT,
91
+ brand: null,
92
+ channel: 'whatsapp',
93
+ eventType,
94
+ locale: LOCALE,
95
+ // Revisão interna — some antes da fronteira do provider.
96
+ version: WHATSAPP_CATALOG_REVISION,
97
+ status: approved ? 'approved' : 'pending_approval',
98
+ // Nome no provider — o sufixo é o do TEMPLATE APROVADO, não o da revisão.
99
+ providerTemplateName: `${eventType.replace(/\./g, '_')}_${PROVIDER_TEMPLATE_SUFFIX}`,
100
+ variables: [...COLLECTION_VARS],
101
+ };
102
+ }
103
+ function smsTemplate(eventType, approved) {
104
+ return {
105
+ tenantId: null,
106
+ product: SC_PRODUCT,
107
+ brand: null,
108
+ channel: 'sms',
109
+ eventType,
110
+ locale: LOCALE,
111
+ version: 'v1',
112
+ status: approved ? 'approved' : 'pending_approval',
113
+ variables: [...COLLECTION_VARS],
114
+ // Curto de propósito: cada segmento é cobrado, e o link é o que faz o
115
+ // cliente agir. Sem link, a mensagem só informa.
116
+ body: '{{clientName}}, consta {{amount}} com vencimento {{dueDate}}.',
117
+ };
118
+ }
119
+ /**
120
+ * Quais eventos o escritório tem registrados em cada canal.
121
+ *
122
+ * Vem de `tenant.settings.channels.<canal>.approvedEvents`. Ausente = nenhum, e
123
+ * o e-mail segue funcionando: ligar um canal novo nunca pode desligar o que já
124
+ * funcionava.
125
+ */
126
+ // `tenant` não tem RLS — é a tabela raiz, define a fronteira em vez de ser
127
+ // protegida por ela. Toda leitura dela exige a amarra explícita na GUC da
128
+ // sessão; sem isso, o `tenantId` do parâmetro é a única coisa que separa um
129
+ // escritório do outro, e um parâmetro não é uma fronteira.
130
+ async function approvedEvents(tx, tenantId, channel) {
131
+ const rows = await tx `
132
+ SELECT settings FROM tenant
133
+ WHERE id = ${tenantId}
134
+ AND id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
135
+ LIMIT 1
136
+ `;
137
+ const channels = (rows[0]?.settings?.channels ?? {});
138
+ const list = channels[channel]?.approvedEvents;
139
+ return new Set(Array.isArray(list) ? list.filter((v) => typeof v === 'string') : []);
140
+ }
141
+ export function createCollectionTemplateStore(tx) {
142
+ return {
143
+ async candidates(ctx, channel, eventType, locale) {
144
+ if (ctx.product !== SC_PRODUCT || locale !== LOCALE)
145
+ return [];
146
+ if (channel === 'email')
147
+ return [emailTemplate(eventType)];
148
+ if (channel === 'whatsapp') {
149
+ const approved = await approvedEvents(tx, ctx.tenantId, 'whatsapp');
150
+ return [whatsappTemplate(eventType, approved.has(eventType))];
151
+ }
152
+ if (channel === 'sms') {
153
+ const approved = await approvedEvents(tx, ctx.tenantId, 'sms');
154
+ return [smsTemplate(eventType, approved.has(eventType))];
155
+ }
156
+ // `notification` é evento interno e não passa pelo motor: a régua o
157
+ // resolve antes, escalando para a fila humana sem mensagem ao cliente.
158
+ return [];
159
+ },
160
+ };
161
+ }
162
+ //# sourceMappingURL=template-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-catalog.js","sourceRoot":"","sources":["../../src/collection/template-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { StepTone } from './policy.js';
2
+ /**
3
+ * Templates de cobrança.
4
+ *
5
+ * Substituição é por ALLOWLIST de variáveis, não por interpolação livre: o
6
+ * template vem de configuração de tenant, e um `${...}` avaliado seria execução
7
+ * arbitrária a partir de dado editável pelo usuário. Aqui, `{{x}}` só resolve se
8
+ * `x` estiver na lista; qualquer outra coisa fica literal e visível — falha à
9
+ * vista, nunca silenciosa.
10
+ */
11
+ export interface TemplateVars {
12
+ clientName: string;
13
+ officeName: string;
14
+ dueDate: string;
15
+ outstandingAmount: string;
16
+ reference: string;
17
+ }
18
+ export declare const TEMPLATE_VARIABLES: readonly (keyof TemplateVars)[];
19
+ export interface CollectionTemplate {
20
+ subject: string;
21
+ body: string;
22
+ }
23
+ /**
24
+ * Textos padrão por tom.
25
+ *
26
+ * Nenhum deles ameaça, cita medida judicial, negativação ou consequência legal.
27
+ * Cobrança automatizada que produz esse tipo de texto sem revisão humana é risco
28
+ * jurídico e de relacionamento — a etapa mais dura da régua padrão escala para
29
+ * uma pessoa em vez de escrever por conta própria.
30
+ */
31
+ declare const DEFAULT_TEMPLATES: Record<string, CollectionTemplate>;
32
+ /** Resolve o template; cai no padrão do tom quando o tenant não tem o seu. */
33
+ export declare function resolveTemplate(templateKey: string, tone: StepTone, overrides?: Record<string, CollectionTemplate>): CollectionTemplate;
34
+ /** Substitui `{{var}}` pelas variáveis da allowlist. O resto fica literal. */
35
+ export declare function renderTemplate(text: string, vars: TemplateVars): string;
36
+ export { DEFAULT_TEMPLATES };
37
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/collection/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;GAQG;AAEH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,MAAM,YAAY,CAAC,EAM7D,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,QAAA,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAyCzD,CAAC;AAUF,8EAA8E;AAC9E,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,QAAQ,EACd,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAC7C,kBAAkB,CAMpB;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAMvE;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}