@baruk/core 0.3.1 → 0.4.2

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 (696) hide show
  1. package/.baruk-provenance.json +10 -0
  2. package/CHANGELOG.md +85 -0
  3. package/dist/auth/password-reset.d.ts +30 -1
  4. package/dist/auth/password-reset.d.ts.map +1 -1
  5. package/dist/auth/password-reset.js +139 -11
  6. package/dist/auth/password-reset.js.map +1 -1
  7. package/dist/auth/service.d.ts +39 -2
  8. package/dist/auth/service.d.ts.map +1 -1
  9. package/dist/auth/service.js +75 -10
  10. package/dist/auth/service.js.map +1 -1
  11. package/dist/billing/ar-repository.d.ts +334 -0
  12. package/dist/billing/ar-repository.d.ts.map +1 -0
  13. package/dist/billing/ar-repository.js +707 -0
  14. package/dist/billing/ar-repository.js.map +1 -0
  15. package/dist/billing/auto-generation.d.ts +87 -0
  16. package/dist/billing/auto-generation.d.ts.map +1 -0
  17. package/dist/billing/auto-generation.js +181 -0
  18. package/dist/billing/auto-generation.js.map +1 -0
  19. package/dist/billing/live-guard.d.ts +64 -0
  20. package/dist/billing/live-guard.d.ts.map +1 -0
  21. package/dist/billing/live-guard.js +68 -0
  22. package/dist/billing/live-guard.js.map +1 -0
  23. package/dist/billing/payment-means-catalog.d.ts +17 -0
  24. package/dist/billing/payment-means-catalog.d.ts.map +1 -0
  25. package/dist/billing/payment-means-catalog.js +21 -0
  26. package/dist/billing/payment-means-catalog.js.map +1 -0
  27. package/dist/billing/payment-means.d.ts +38 -0
  28. package/dist/billing/payment-means.d.ts.map +1 -0
  29. package/dist/billing/payment-means.js +29 -0
  30. package/dist/billing/payment-means.js.map +1 -0
  31. package/dist/billing/payment-rail.d.ts +118 -0
  32. package/dist/billing/payment-rail.d.ts.map +1 -0
  33. package/dist/billing/payment-rail.js +295 -0
  34. package/dist/billing/payment-rail.js.map +1 -0
  35. package/dist/billing/provider/asaas.d.ts +46 -1
  36. package/dist/billing/provider/asaas.d.ts.map +1 -1
  37. package/dist/billing/provider/asaas.js +194 -14
  38. package/dist/billing/provider/asaas.js.map +1 -1
  39. package/dist/billing/provider/manual.js +1 -1
  40. package/dist/billing/provider/manual.js.map +1 -1
  41. package/dist/billing/provider/types.d.ts +115 -8
  42. package/dist/billing/provider/types.d.ts.map +1 -1
  43. package/dist/billing/provider-account.d.ts +89 -0
  44. package/dist/billing/provider-account.d.ts.map +1 -0
  45. package/dist/billing/provider-account.js +161 -0
  46. package/dist/billing/provider-account.js.map +1 -0
  47. package/dist/billing/provider-onboarding.d.ts +67 -0
  48. package/dist/billing/provider-onboarding.d.ts.map +1 -0
  49. package/dist/billing/provider-onboarding.js +234 -0
  50. package/dist/billing/provider-onboarding.js.map +1 -0
  51. package/dist/billing/receivable.d.ts +5 -1
  52. package/dist/billing/receivable.d.ts.map +1 -1
  53. package/dist/billing/reconcile.d.ts +58 -0
  54. package/dist/billing/reconcile.d.ts.map +1 -0
  55. package/dist/billing/reconcile.js +138 -0
  56. package/dist/billing/reconcile.js.map +1 -0
  57. package/dist/billing/repository.d.ts +90 -1
  58. package/dist/billing/repository.d.ts.map +1 -1
  59. package/dist/billing/repository.js +148 -19
  60. package/dist/billing/repository.js.map +1 -1
  61. package/dist/cjs/auth/password-reset.js +141 -11
  62. package/dist/cjs/auth/password-reset.js.map +1 -1
  63. package/dist/cjs/auth/service.js +75 -9
  64. package/dist/cjs/auth/service.js.map +1 -1
  65. package/dist/cjs/billing/ar-repository.js +728 -0
  66. package/dist/cjs/billing/ar-repository.js.map +1 -0
  67. package/dist/cjs/billing/auto-generation.js +186 -0
  68. package/dist/cjs/billing/auto-generation.js.map +1 -0
  69. package/dist/cjs/billing/live-guard.js +72 -0
  70. package/dist/cjs/billing/live-guard.js.map +1 -0
  71. package/dist/cjs/billing/payment-means-catalog.js +25 -0
  72. package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
  73. package/dist/cjs/billing/payment-means.js +33 -0
  74. package/dist/cjs/billing/payment-means.js.map +1 -0
  75. package/dist/cjs/billing/payment-rail.js +301 -0
  76. package/dist/cjs/billing/payment-rail.js.map +1 -0
  77. package/dist/cjs/billing/provider/asaas.js +194 -14
  78. package/dist/cjs/billing/provider/asaas.js.map +1 -1
  79. package/dist/cjs/billing/provider/manual.js +1 -1
  80. package/dist/cjs/billing/provider/manual.js.map +1 -1
  81. package/dist/cjs/billing/provider-account.js +170 -0
  82. package/dist/cjs/billing/provider-account.js.map +1 -0
  83. package/dist/cjs/billing/provider-onboarding.js +239 -0
  84. package/dist/cjs/billing/provider-onboarding.js.map +1 -0
  85. package/dist/cjs/billing/reconcile.js +143 -0
  86. package/dist/cjs/billing/reconcile.js.map +1 -0
  87. package/dist/cjs/billing/repository.js +150 -18
  88. package/dist/cjs/billing/repository.js.map +1 -1
  89. package/dist/cjs/clients/repository.js +96 -20
  90. package/dist/cjs/clients/repository.js.map +1 -1
  91. package/dist/cjs/collection/branding.js +140 -0
  92. package/dist/cjs/collection/branding.js.map +1 -0
  93. package/dist/cjs/collection/channel-accounts.js +137 -0
  94. package/dist/cjs/collection/channel-accounts.js.map +1 -0
  95. package/dist/cjs/collection/channel.js +17 -0
  96. package/dist/cjs/collection/channel.js.map +1 -0
  97. package/dist/cjs/collection/communication-bridge.js +140 -0
  98. package/dist/cjs/collection/communication-bridge.js.map +1 -0
  99. package/dist/cjs/collection/communication-runtime.js +193 -0
  100. package/dist/cjs/collection/communication-runtime.js.map +1 -0
  101. package/dist/cjs/collection/consent-repository.js +84 -0
  102. package/dist/cjs/collection/consent-repository.js.map +1 -0
  103. package/dist/cjs/collection/copy.js +125 -0
  104. package/dist/cjs/collection/copy.js.map +1 -0
  105. package/dist/cjs/collection/delivery-callback.js +151 -0
  106. package/dist/cjs/collection/delivery-callback.js.map +1 -0
  107. package/dist/cjs/collection/email-layout.js +252 -0
  108. package/dist/cjs/collection/email-layout.js.map +1 -0
  109. package/dist/cjs/collection/engine.js +414 -0
  110. package/dist/cjs/collection/engine.js.map +1 -0
  111. package/dist/cjs/collection/format.js +76 -0
  112. package/dist/cjs/collection/format.js.map +1 -0
  113. package/dist/cjs/collection/payment-block.js +3 -0
  114. package/dist/cjs/collection/payment-block.js.map +1 -0
  115. package/dist/cjs/collection/policy.js +147 -0
  116. package/dist/cjs/collection/policy.js.map +1 -0
  117. package/dist/cjs/collection/repository.js +260 -0
  118. package/dist/cjs/collection/repository.js.map +1 -0
  119. package/dist/cjs/collection/subject.js +104 -0
  120. package/dist/cjs/collection/subject.js.map +1 -0
  121. package/dist/cjs/collection/template-catalog.js +165 -0
  122. package/dist/cjs/collection/template-catalog.js.map +1 -0
  123. package/dist/cjs/collection/template.js +78 -0
  124. package/dist/cjs/collection/template.js.map +1 -0
  125. package/dist/cjs/communication/adapters/email.js +132 -0
  126. package/dist/cjs/communication/adapters/email.js.map +1 -0
  127. package/dist/cjs/communication/adapters/sms.js +127 -0
  128. package/dist/cjs/communication/adapters/sms.js.map +1 -0
  129. package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
  130. package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
  131. package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
  132. package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
  133. package/dist/cjs/communication/adapters/whatsapp.js +213 -0
  134. package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
  135. package/dist/cjs/communication/audit.js +61 -0
  136. package/dist/cjs/communication/audit.js.map +1 -0
  137. package/dist/cjs/communication/capabilities.js +76 -0
  138. package/dist/cjs/communication/capabilities.js.map +1 -0
  139. package/dist/cjs/communication/channel.js +53 -0
  140. package/dist/cjs/communication/channel.js.map +1 -0
  141. package/dist/cjs/communication/claim.js +228 -0
  142. package/dist/cjs/communication/claim.js.map +1 -0
  143. package/dist/cjs/communication/consent.js +43 -0
  144. package/dist/cjs/communication/consent.js.map +1 -0
  145. package/dist/cjs/communication/context.js +45 -0
  146. package/dist/cjs/communication/context.js.map +1 -0
  147. package/dist/cjs/communication/credentials.js +121 -0
  148. package/dist/cjs/communication/credentials.js.map +1 -0
  149. package/dist/cjs/communication/dry-run-scenario.js +161 -0
  150. package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
  151. package/dist/cjs/communication/dry-run.js +97 -0
  152. package/dist/cjs/communication/dry-run.js.map +1 -0
  153. package/dist/cjs/communication/engine.js +483 -0
  154. package/dist/cjs/communication/engine.js.map +1 -0
  155. package/dist/cjs/communication/graph.js +50 -0
  156. package/dist/cjs/communication/graph.js.map +1 -0
  157. package/dist/cjs/communication/idempotency.js +26 -0
  158. package/dist/cjs/communication/idempotency.js.map +1 -0
  159. package/dist/cjs/communication/identity.js +110 -0
  160. package/dist/cjs/communication/identity.js.map +1 -0
  161. package/dist/cjs/communication/index.js +135 -0
  162. package/dist/cjs/communication/index.js.map +1 -0
  163. package/dist/cjs/communication/onboarding.js +297 -0
  164. package/dist/cjs/communication/onboarding.js.map +1 -0
  165. package/dist/cjs/communication/policy.js +16 -0
  166. package/dist/cjs/communication/policy.js.map +1 -0
  167. package/dist/cjs/communication/routing.js +77 -0
  168. package/dist/cjs/communication/routing.js.map +1 -0
  169. package/dist/cjs/communication/sender-profile.js +128 -0
  170. package/dist/cjs/communication/sender-profile.js.map +1 -0
  171. package/dist/cjs/communication/status.js +86 -0
  172. package/dist/cjs/communication/status.js.map +1 -0
  173. package/dist/cjs/communication/stores/onboarding.js +135 -0
  174. package/dist/cjs/communication/stores/onboarding.js.map +1 -0
  175. package/dist/cjs/communication/stores/postgres.js +458 -0
  176. package/dist/cjs/communication/stores/postgres.js.map +1 -0
  177. package/dist/cjs/communication/stores/routing.js +334 -0
  178. package/dist/cjs/communication/stores/routing.js.map +1 -0
  179. package/dist/cjs/communication/stores/secrets.js +126 -0
  180. package/dist/cjs/communication/stores/secrets.js.map +1 -0
  181. package/dist/cjs/communication/template-provider.js +22 -0
  182. package/dist/cjs/communication/template-provider.js.map +1 -0
  183. package/dist/cjs/communication/template.js +63 -0
  184. package/dist/cjs/communication/template.js.map +1 -0
  185. package/dist/cjs/communication/webhook-subscription.js +258 -0
  186. package/dist/cjs/communication/webhook-subscription.js.map +1 -0
  187. package/dist/cjs/communication/webhook.js +292 -0
  188. package/dist/cjs/communication/webhook.js.map +1 -0
  189. package/dist/cjs/competence/repository.js +309 -0
  190. package/dist/cjs/competence/repository.js.map +1 -0
  191. package/dist/cjs/contacts/phone.js +192 -0
  192. package/dist/cjs/contacts/phone.js.map +1 -0
  193. package/dist/cjs/db/seed-catalog.js +48 -0
  194. package/dist/cjs/db/seed-catalog.js.map +1 -0
  195. package/dist/cjs/db/seed.js +15 -7
  196. package/dist/cjs/db/seed.js.map +1 -1
  197. package/dist/cjs/documents/repository.js +244 -0
  198. package/dist/cjs/documents/repository.js.map +1 -0
  199. package/dist/cjs/documents/requests.js +136 -0
  200. package/dist/cjs/documents/requests.js.map +1 -0
  201. package/dist/cjs/index.js +406 -39
  202. package/dist/cjs/index.js.map +1 -1
  203. package/dist/cjs/legal/documents.js +125 -3
  204. package/dist/cjs/legal/documents.js.map +1 -1
  205. package/dist/cjs/legal/types.js +1 -0
  206. package/dist/cjs/legal/types.js.map +1 -1
  207. package/dist/cjs/mail/auth-templates.js +29 -0
  208. package/dist/cjs/mail/auth-templates.js.map +1 -0
  209. package/dist/cjs/mail/dedup-store.js +12 -51
  210. package/dist/cjs/mail/dedup-store.js.map +1 -1
  211. package/dist/cjs/mail/index.js +16 -4
  212. package/dist/cjs/mail/index.js.map +1 -1
  213. package/dist/cjs/mail/provider.js +12 -247
  214. package/dist/cjs/mail/provider.js.map +1 -1
  215. package/dist/cjs/mail/resend.js +14 -18
  216. package/dist/cjs/mail/resend.js.map +1 -1
  217. package/dist/cjs/mail/sender-resolver.js +12 -11
  218. package/dist/cjs/mail/sender-resolver.js.map +1 -1
  219. package/dist/cjs/mail/template-renderer.js +11 -16
  220. package/dist/cjs/mail/template-renderer.js.map +1 -1
  221. package/dist/cjs/mail/transactional-outbound.js +117 -0
  222. package/dist/cjs/mail/transactional-outbound.js.map +1 -0
  223. package/dist/cjs/mail/types.js +8 -35
  224. package/dist/cjs/mail/types.js.map +1 -1
  225. package/dist/cjs/portal/provisioning.js +144 -0
  226. package/dist/cjs/portal/provisioning.js.map +1 -0
  227. package/dist/cjs/pricing-engine/canonical.js +42 -0
  228. package/dist/cjs/pricing-engine/canonical.js.map +1 -0
  229. package/dist/cjs/pricing-engine/errors.js +6 -1
  230. package/dist/cjs/pricing-engine/errors.js.map +1 -1
  231. package/dist/cjs/pricing-engine/index.js +12 -1
  232. package/dist/cjs/pricing-engine/index.js.map +1 -1
  233. package/dist/cjs/pricing-engine/pipeline.js +200 -26
  234. package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
  235. package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
  236. package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
  237. package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
  238. package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
  239. package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
  240. package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
  241. package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
  242. package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
  243. package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
  244. package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
  245. package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
  246. package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
  247. package/dist/cjs/rbac/authorize.js +28 -0
  248. package/dist/cjs/rbac/authorize.js.map +1 -1
  249. package/dist/cjs/rbac/catalog.js +67 -1
  250. package/dist/cjs/rbac/catalog.js.map +1 -1
  251. package/dist/cjs/rbac/workload-provisioning.js +160 -0
  252. package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
  253. package/dist/cjs/rbac/workload.js +191 -0
  254. package/dist/cjs/rbac/workload.js.map +1 -0
  255. package/dist/cjs/storage/checksum.js +15 -0
  256. package/dist/cjs/storage/checksum.js.map +1 -0
  257. package/dist/cjs/storage/key.js +72 -0
  258. package/dist/cjs/storage/key.js.map +1 -0
  259. package/dist/cjs/storage/local.js +100 -0
  260. package/dist/cjs/storage/local.js.map +1 -0
  261. package/dist/cjs/storage/r2.js +181 -0
  262. package/dist/cjs/storage/r2.js.map +1 -0
  263. package/dist/cjs/storage/registry.js +41 -0
  264. package/dist/cjs/storage/registry.js.map +1 -0
  265. package/dist/cjs/storage/types.js +50 -0
  266. package/dist/cjs/storage/types.js.map +1 -0
  267. package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
  268. package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
  269. package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
  270. package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
  271. package/dist/cjs/subscription-billing/provider/registry.js +17 -0
  272. package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
  273. package/dist/cjs/subscription-billing/service.js +57 -8
  274. package/dist/cjs/subscription-billing/service.js.map +1 -1
  275. package/dist/cjs/subscription-billing/types.js.map +1 -1
  276. package/dist/cjs/tenancy/provisioning.js +32 -8
  277. package/dist/cjs/tenancy/provisioning.js.map +1 -1
  278. package/dist/cjs/users/repository.js +119 -2
  279. package/dist/cjs/users/repository.js.map +1 -1
  280. package/dist/cjs/vault/repository.js +81 -0
  281. package/dist/cjs/vault/repository.js.map +1 -1
  282. package/dist/clients/repository.d.ts +42 -0
  283. package/dist/clients/repository.d.ts.map +1 -1
  284. package/dist/clients/repository.js +94 -21
  285. package/dist/clients/repository.js.map +1 -1
  286. package/dist/collection/branding.d.ts +72 -0
  287. package/dist/collection/branding.d.ts.map +1 -0
  288. package/dist/collection/branding.js +136 -0
  289. package/dist/collection/branding.js.map +1 -0
  290. package/dist/collection/channel-accounts.d.ts +57 -0
  291. package/dist/collection/channel-accounts.d.ts.map +1 -0
  292. package/dist/collection/channel-accounts.js +133 -0
  293. package/dist/collection/channel-accounts.js.map +1 -0
  294. package/dist/collection/channel.d.ts +24 -0
  295. package/dist/collection/channel.d.ts.map +1 -0
  296. package/dist/collection/channel.js +16 -0
  297. package/dist/collection/channel.js.map +1 -0
  298. package/dist/collection/communication-bridge.d.ts +66 -0
  299. package/dist/collection/communication-bridge.d.ts.map +1 -0
  300. package/dist/collection/communication-bridge.js +134 -0
  301. package/dist/collection/communication-bridge.js.map +1 -0
  302. package/dist/collection/communication-runtime.d.ts +95 -0
  303. package/dist/collection/communication-runtime.d.ts.map +1 -0
  304. package/dist/collection/communication-runtime.js +187 -0
  305. package/dist/collection/communication-runtime.js.map +1 -0
  306. package/dist/collection/consent-repository.d.ts +32 -0
  307. package/dist/collection/consent-repository.d.ts.map +1 -0
  308. package/dist/collection/consent-repository.js +79 -0
  309. package/dist/collection/consent-repository.js.map +1 -0
  310. package/dist/collection/copy.d.ts +50 -0
  311. package/dist/collection/copy.d.ts.map +1 -0
  312. package/dist/collection/copy.js +122 -0
  313. package/dist/collection/copy.js.map +1 -0
  314. package/dist/collection/delivery-callback.d.ts +49 -0
  315. package/dist/collection/delivery-callback.d.ts.map +1 -0
  316. package/dist/collection/delivery-callback.js +147 -0
  317. package/dist/collection/delivery-callback.js.map +1 -0
  318. package/dist/collection/email-layout.d.ts +45 -0
  319. package/dist/collection/email-layout.d.ts.map +1 -0
  320. package/dist/collection/email-layout.js +247 -0
  321. package/dist/collection/email-layout.js.map +1 -0
  322. package/dist/collection/engine.d.ts +177 -0
  323. package/dist/collection/engine.d.ts.map +1 -0
  324. package/dist/collection/engine.js +407 -0
  325. package/dist/collection/engine.js.map +1 -0
  326. package/dist/collection/format.d.ts +32 -0
  327. package/dist/collection/format.d.ts.map +1 -0
  328. package/dist/collection/format.js +70 -0
  329. package/dist/collection/format.js.map +1 -0
  330. package/dist/collection/payment-block.d.ts +24 -0
  331. package/dist/collection/payment-block.d.ts.map +1 -0
  332. package/dist/collection/payment-block.js +2 -0
  333. package/dist/collection/payment-block.js.map +1 -0
  334. package/dist/collection/policy.d.ts +53 -0
  335. package/dist/collection/policy.d.ts.map +1 -0
  336. package/dist/collection/policy.js +141 -0
  337. package/dist/collection/policy.js.map +1 -0
  338. package/dist/collection/repository.d.ts +129 -0
  339. package/dist/collection/repository.d.ts.map +1 -0
  340. package/dist/collection/repository.js +246 -0
  341. package/dist/collection/repository.js.map +1 -0
  342. package/dist/collection/subject.d.ts +66 -0
  343. package/dist/collection/subject.d.ts.map +1 -0
  344. package/dist/collection/subject.js +99 -0
  345. package/dist/collection/subject.js.map +1 -0
  346. package/dist/collection/template-catalog.d.ts +16 -0
  347. package/dist/collection/template-catalog.d.ts.map +1 -0
  348. package/dist/collection/template-catalog.js +162 -0
  349. package/dist/collection/template-catalog.js.map +1 -0
  350. package/dist/collection/template.d.ts +37 -0
  351. package/dist/collection/template.d.ts.map +1 -0
  352. package/dist/collection/template.js +73 -0
  353. package/dist/collection/template.js.map +1 -0
  354. package/dist/communication/adapters/email.d.ts +28 -0
  355. package/dist/communication/adapters/email.d.ts.map +1 -0
  356. package/dist/communication/adapters/email.js +129 -0
  357. package/dist/communication/adapters/email.js.map +1 -0
  358. package/dist/communication/adapters/sms.d.ts +95 -0
  359. package/dist/communication/adapters/sms.d.ts.map +1 -0
  360. package/dist/communication/adapters/sms.js +121 -0
  361. package/dist/communication/adapters/sms.js.map +1 -0
  362. package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
  363. package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
  364. package/dist/communication/adapters/whatsapp-language.js +36 -0
  365. package/dist/communication/adapters/whatsapp-language.js.map +1 -0
  366. package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
  367. package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
  368. package/dist/communication/adapters/whatsapp-templates.js +97 -0
  369. package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
  370. package/dist/communication/adapters/whatsapp.d.ts +29 -0
  371. package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
  372. package/dist/communication/adapters/whatsapp.js +210 -0
  373. package/dist/communication/adapters/whatsapp.js.map +1 -0
  374. package/dist/communication/audit.d.ts +105 -0
  375. package/dist/communication/audit.d.ts.map +1 -0
  376. package/dist/communication/audit.js +56 -0
  377. package/dist/communication/audit.js.map +1 -0
  378. package/dist/communication/capabilities.d.ts +88 -0
  379. package/dist/communication/capabilities.d.ts.map +1 -0
  380. package/dist/communication/capabilities.js +72 -0
  381. package/dist/communication/capabilities.js.map +1 -0
  382. package/dist/communication/channel.d.ts +125 -0
  383. package/dist/communication/channel.d.ts.map +1 -0
  384. package/dist/communication/channel.js +47 -0
  385. package/dist/communication/channel.js.map +1 -0
  386. package/dist/communication/claim.d.ts +368 -0
  387. package/dist/communication/claim.d.ts.map +1 -0
  388. package/dist/communication/claim.js +224 -0
  389. package/dist/communication/claim.js.map +1 -0
  390. package/dist/communication/consent.d.ts +65 -0
  391. package/dist/communication/consent.d.ts.map +1 -0
  392. package/dist/communication/consent.js +40 -0
  393. package/dist/communication/consent.js.map +1 -0
  394. package/dist/communication/context.d.ts +48 -0
  395. package/dist/communication/context.d.ts.map +1 -0
  396. package/dist/communication/context.js +41 -0
  397. package/dist/communication/context.js.map +1 -0
  398. package/dist/communication/credentials.d.ts +74 -0
  399. package/dist/communication/credentials.d.ts.map +1 -0
  400. package/dist/communication/credentials.js +115 -0
  401. package/dist/communication/credentials.js.map +1 -0
  402. package/dist/communication/dry-run-scenario.d.ts +37 -0
  403. package/dist/communication/dry-run-scenario.d.ts.map +1 -0
  404. package/dist/communication/dry-run-scenario.js +158 -0
  405. package/dist/communication/dry-run-scenario.js.map +1 -0
  406. package/dist/communication/dry-run.d.ts +40 -0
  407. package/dist/communication/dry-run.d.ts.map +1 -0
  408. package/dist/communication/dry-run.js +92 -0
  409. package/dist/communication/dry-run.js.map +1 -0
  410. package/dist/communication/engine.d.ts +153 -0
  411. package/dist/communication/engine.d.ts.map +1 -0
  412. package/dist/communication/engine.js +480 -0
  413. package/dist/communication/engine.js.map +1 -0
  414. package/dist/communication/graph.d.ts +38 -0
  415. package/dist/communication/graph.d.ts.map +1 -0
  416. package/dist/communication/graph.js +45 -0
  417. package/dist/communication/graph.js.map +1 -0
  418. package/dist/communication/idempotency.d.ts +33 -0
  419. package/dist/communication/idempotency.d.ts.map +1 -0
  420. package/dist/communication/idempotency.js +23 -0
  421. package/dist/communication/idempotency.js.map +1 -0
  422. package/dist/communication/identity.d.ts +127 -0
  423. package/dist/communication/identity.d.ts.map +1 -0
  424. package/dist/communication/identity.js +105 -0
  425. package/dist/communication/identity.js.map +1 -0
  426. package/dist/communication/index.d.ts +66 -0
  427. package/dist/communication/index.d.ts.map +1 -0
  428. package/dist/communication/index.js +42 -0
  429. package/dist/communication/index.js.map +1 -0
  430. package/dist/communication/onboarding.d.ts +223 -0
  431. package/dist/communication/onboarding.d.ts.map +1 -0
  432. package/dist/communication/onboarding.js +287 -0
  433. package/dist/communication/onboarding.js.map +1 -0
  434. package/dist/communication/policy.d.ts +99 -0
  435. package/dist/communication/policy.d.ts.map +1 -0
  436. package/dist/communication/policy.js +13 -0
  437. package/dist/communication/policy.js.map +1 -0
  438. package/dist/communication/routing.d.ts +99 -0
  439. package/dist/communication/routing.d.ts.map +1 -0
  440. package/dist/communication/routing.js +73 -0
  441. package/dist/communication/routing.js.map +1 -0
  442. package/dist/communication/sender-profile.d.ts +100 -0
  443. package/dist/communication/sender-profile.d.ts.map +1 -0
  444. package/dist/communication/sender-profile.js +123 -0
  445. package/dist/communication/sender-profile.js.map +1 -0
  446. package/dist/communication/status.d.ts +48 -0
  447. package/dist/communication/status.d.ts.map +1 -0
  448. package/dist/communication/status.js +79 -0
  449. package/dist/communication/status.js.map +1 -0
  450. package/dist/communication/stores/onboarding.d.ts +88 -0
  451. package/dist/communication/stores/onboarding.d.ts.map +1 -0
  452. package/dist/communication/stores/onboarding.js +127 -0
  453. package/dist/communication/stores/onboarding.js.map +1 -0
  454. package/dist/communication/stores/postgres.d.ts +81 -0
  455. package/dist/communication/stores/postgres.d.ts.map +1 -0
  456. package/dist/communication/stores/postgres.js +453 -0
  457. package/dist/communication/stores/postgres.js.map +1 -0
  458. package/dist/communication/stores/routing.d.ts +169 -0
  459. package/dist/communication/stores/routing.d.ts.map +1 -0
  460. package/dist/communication/stores/routing.js +324 -0
  461. package/dist/communication/stores/routing.js.map +1 -0
  462. package/dist/communication/stores/secrets.d.ts +89 -0
  463. package/dist/communication/stores/secrets.d.ts.map +1 -0
  464. package/dist/communication/stores/secrets.js +122 -0
  465. package/dist/communication/stores/secrets.js.map +1 -0
  466. package/dist/communication/template-provider.d.ts +85 -0
  467. package/dist/communication/template-provider.d.ts.map +1 -0
  468. package/dist/communication/template-provider.js +21 -0
  469. package/dist/communication/template-provider.js.map +1 -0
  470. package/dist/communication/template.d.ts +87 -0
  471. package/dist/communication/template.d.ts.map +1 -0
  472. package/dist/communication/template.js +59 -0
  473. package/dist/communication/template.js.map +1 -0
  474. package/dist/communication/webhook-subscription.d.ts +156 -0
  475. package/dist/communication/webhook-subscription.d.ts.map +1 -0
  476. package/dist/communication/webhook-subscription.js +252 -0
  477. package/dist/communication/webhook-subscription.js.map +1 -0
  478. package/dist/communication/webhook.d.ts +121 -0
  479. package/dist/communication/webhook.d.ts.map +1 -0
  480. package/dist/communication/webhook.js +283 -0
  481. package/dist/communication/webhook.js.map +1 -0
  482. package/dist/competence/repository.d.ts +147 -0
  483. package/dist/competence/repository.d.ts.map +1 -0
  484. package/dist/competence/repository.js +294 -0
  485. package/dist/competence/repository.js.map +1 -0
  486. package/dist/contacts/phone.d.ts +70 -0
  487. package/dist/contacts/phone.d.ts.map +1 -0
  488. package/dist/contacts/phone.js +186 -0
  489. package/dist/contacts/phone.js.map +1 -0
  490. package/dist/db/migrate.js +17 -11
  491. package/dist/db/migrate.js.map +1 -1
  492. package/dist/db/seed-catalog.d.ts +18 -0
  493. package/dist/db/seed-catalog.d.ts.map +1 -0
  494. package/dist/db/seed-catalog.js +45 -0
  495. package/dist/db/seed-catalog.js.map +1 -0
  496. package/dist/db/seed.js +16 -8
  497. package/dist/db/seed.js.map +1 -1
  498. package/dist/documents/repository.d.ts +97 -0
  499. package/dist/documents/repository.d.ts.map +1 -0
  500. package/dist/documents/repository.js +236 -0
  501. package/dist/documents/repository.js.map +1 -0
  502. package/dist/documents/requests.d.ts +73 -0
  503. package/dist/documents/requests.d.ts.map +1 -0
  504. package/dist/documents/requests.js +127 -0
  505. package/dist/documents/requests.js.map +1 -0
  506. package/dist/index.d.ts +109 -13
  507. package/dist/index.d.ts.map +1 -1
  508. package/dist/index.js +100 -8
  509. package/dist/index.js.map +1 -1
  510. package/dist/legal/documents.d.ts.map +1 -1
  511. package/dist/legal/documents.js +125 -3
  512. package/dist/legal/documents.js.map +1 -1
  513. package/dist/legal/index.d.ts +1 -1
  514. package/dist/legal/index.d.ts.map +1 -1
  515. package/dist/legal/types.d.ts +32 -1
  516. package/dist/legal/types.d.ts.map +1 -1
  517. package/dist/legal/types.js +1 -0
  518. package/dist/legal/types.js.map +1 -1
  519. package/dist/mail/auth-templates.d.ts +15 -0
  520. package/dist/mail/auth-templates.d.ts.map +1 -0
  521. package/dist/mail/auth-templates.js +26 -0
  522. package/dist/mail/auth-templates.js.map +1 -0
  523. package/dist/mail/dedup-store.d.ts +1 -24
  524. package/dist/mail/dedup-store.d.ts.map +1 -1
  525. package/dist/mail/dedup-store.js +9 -48
  526. package/dist/mail/dedup-store.js.map +1 -1
  527. package/dist/mail/index.d.ts +2 -1
  528. package/dist/mail/index.d.ts.map +1 -1
  529. package/dist/mail/index.js +13 -2
  530. package/dist/mail/index.js.map +1 -1
  531. package/dist/mail/provider.d.ts +2 -30
  532. package/dist/mail/provider.d.ts.map +1 -1
  533. package/dist/mail/provider.js +10 -246
  534. package/dist/mail/provider.js.map +1 -1
  535. package/dist/mail/resend.d.ts +2 -12
  536. package/dist/mail/resend.d.ts.map +1 -1
  537. package/dist/mail/resend.js +11 -17
  538. package/dist/mail/resend.js.map +1 -1
  539. package/dist/mail/sender-resolver.d.ts +1 -7
  540. package/dist/mail/sender-resolver.d.ts.map +1 -1
  541. package/dist/mail/sender-resolver.js +11 -10
  542. package/dist/mail/sender-resolver.js.map +1 -1
  543. package/dist/mail/template-renderer.d.ts +1 -9
  544. package/dist/mail/template-renderer.d.ts.map +1 -1
  545. package/dist/mail/template-renderer.js +10 -15
  546. package/dist/mail/template-renderer.js.map +1 -1
  547. package/dist/mail/transactional-outbound.d.ts +115 -0
  548. package/dist/mail/transactional-outbound.d.ts.map +1 -0
  549. package/dist/mail/transactional-outbound.js +113 -0
  550. package/dist/mail/transactional-outbound.js.map +1 -0
  551. package/dist/mail/types.d.ts +2 -142
  552. package/dist/mail/types.d.ts.map +1 -1
  553. package/dist/mail/types.js +1 -33
  554. package/dist/mail/types.js.map +1 -1
  555. package/dist/portal/provisioning.d.ts +58 -0
  556. package/dist/portal/provisioning.d.ts.map +1 -0
  557. package/dist/portal/provisioning.js +139 -0
  558. package/dist/portal/provisioning.js.map +1 -0
  559. package/dist/pricing-engine/canonical.d.ts +14 -0
  560. package/dist/pricing-engine/canonical.d.ts.map +1 -0
  561. package/dist/pricing-engine/canonical.js +39 -0
  562. package/dist/pricing-engine/canonical.js.map +1 -0
  563. package/dist/pricing-engine/errors.d.ts.map +1 -1
  564. package/dist/pricing-engine/errors.js +6 -1
  565. package/dist/pricing-engine/errors.js.map +1 -1
  566. package/dist/pricing-engine/index.d.ts +12 -2
  567. package/dist/pricing-engine/index.d.ts.map +1 -1
  568. package/dist/pricing-engine/index.js +6 -1
  569. package/dist/pricing-engine/index.js.map +1 -1
  570. package/dist/pricing-engine/pipeline.d.ts.map +1 -1
  571. package/dist/pricing-engine/pipeline.js +202 -28
  572. package/dist/pricing-engine/pipeline.js.map +1 -1
  573. package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
  574. package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
  575. package/dist/pricing-engine/shadow-adapter.js +75 -0
  576. package/dist/pricing-engine/shadow-adapter.js.map +1 -0
  577. package/dist/pricing-engine/shadow-diff.d.ts +26 -0
  578. package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
  579. package/dist/pricing-engine/shadow-diff.js +52 -0
  580. package/dist/pricing-engine/shadow-diff.js.map +1 -0
  581. package/dist/pricing-engine/shadow-facade.d.ts +42 -0
  582. package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
  583. package/dist/pricing-engine/shadow-facade.js +82 -0
  584. package/dist/pricing-engine/shadow-facade.js.map +1 -0
  585. package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
  586. package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
  587. package/dist/pricing-engine/shadow-legacy-types.js +18 -0
  588. package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
  589. package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
  590. package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
  591. package/dist/pricing-engine/shadow-metrics.js +31 -0
  592. package/dist/pricing-engine/shadow-metrics.js.map +1 -0
  593. package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
  594. package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
  595. package/dist/pricing-engine/shadow-normalizer.js +39 -0
  596. package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
  597. package/dist/pricing-engine/types.d.ts +2 -0
  598. package/dist/pricing-engine/types.d.ts.map +1 -1
  599. package/dist/rbac/authorize.d.ts +12 -0
  600. package/dist/rbac/authorize.d.ts.map +1 -1
  601. package/dist/rbac/authorize.js +27 -0
  602. package/dist/rbac/authorize.js.map +1 -1
  603. package/dist/rbac/catalog.d.ts.map +1 -1
  604. package/dist/rbac/catalog.js +67 -1
  605. package/dist/rbac/catalog.js.map +1 -1
  606. package/dist/rbac/workload-provisioning.d.ts +66 -0
  607. package/dist/rbac/workload-provisioning.d.ts.map +1 -0
  608. package/dist/rbac/workload-provisioning.js +153 -0
  609. package/dist/rbac/workload-provisioning.js.map +1 -0
  610. package/dist/rbac/workload.d.ts +124 -0
  611. package/dist/rbac/workload.d.ts.map +1 -0
  612. package/dist/rbac/workload.js +184 -0
  613. package/dist/rbac/workload.js.map +1 -0
  614. package/dist/storage/checksum.d.ts +9 -0
  615. package/dist/storage/checksum.d.ts.map +1 -0
  616. package/dist/storage/checksum.js +12 -0
  617. package/dist/storage/checksum.js.map +1 -0
  618. package/dist/storage/key.d.ts +37 -0
  619. package/dist/storage/key.d.ts.map +1 -0
  620. package/dist/storage/key.js +67 -0
  621. package/dist/storage/key.js.map +1 -0
  622. package/dist/storage/local.d.ts +40 -0
  623. package/dist/storage/local.d.ts.map +1 -0
  624. package/dist/storage/local.js +96 -0
  625. package/dist/storage/local.js.map +1 -0
  626. package/dist/storage/r2.d.ts +43 -0
  627. package/dist/storage/r2.d.ts.map +1 -0
  628. package/dist/storage/r2.js +177 -0
  629. package/dist/storage/r2.js.map +1 -0
  630. package/dist/storage/registry.d.ts +23 -0
  631. package/dist/storage/registry.d.ts.map +1 -0
  632. package/dist/storage/registry.js +37 -0
  633. package/dist/storage/registry.js.map +1 -0
  634. package/dist/storage/types.d.ts +67 -0
  635. package/dist/storage/types.d.ts.map +1 -0
  636. package/dist/storage/types.js +45 -0
  637. package/dist/storage/types.js.map +1 -0
  638. package/dist/subscription-billing/provider/asaas.d.ts +14 -0
  639. package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
  640. package/dist/subscription-billing/provider/asaas.js +32 -7
  641. package/dist/subscription-billing/provider/asaas.js.map +1 -1
  642. package/dist/subscription-billing/provider/disabled.d.ts +9 -0
  643. package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
  644. package/dist/subscription-billing/provider/disabled.js +8 -0
  645. package/dist/subscription-billing/provider/disabled.js.map +1 -1
  646. package/dist/subscription-billing/provider/registry.d.ts +10 -0
  647. package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
  648. package/dist/subscription-billing/provider/registry.js +17 -0
  649. package/dist/subscription-billing/provider/registry.js.map +1 -1
  650. package/dist/subscription-billing/service.d.ts +17 -1
  651. package/dist/subscription-billing/service.d.ts.map +1 -1
  652. package/dist/subscription-billing/service.js +57 -8
  653. package/dist/subscription-billing/service.js.map +1 -1
  654. package/dist/subscription-billing/types.d.ts +13 -0
  655. package/dist/subscription-billing/types.d.ts.map +1 -1
  656. package/dist/subscription-billing/types.js.map +1 -1
  657. package/dist/tenancy/provisioning.d.ts.map +1 -1
  658. package/dist/tenancy/provisioning.js +32 -8
  659. package/dist/tenancy/provisioning.js.map +1 -1
  660. package/dist/users/repository.d.ts +38 -0
  661. package/dist/users/repository.d.ts.map +1 -1
  662. package/dist/users/repository.js +118 -3
  663. package/dist/users/repository.js.map +1 -1
  664. package/dist/vault/repository.d.ts +67 -0
  665. package/dist/vault/repository.d.ts.map +1 -1
  666. package/dist/vault/repository.js +78 -0
  667. package/dist/vault/repository.js.map +1 -1
  668. package/package.json +13 -4
  669. package/src/db/migrations/0023_user_invite_activation.sql +15 -0
  670. package/src/db/migrations/0024_set_user_password_function.sql +32 -0
  671. package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
  672. package/src/db/migrations/0026_documents_and_competence.sql +353 -0
  673. package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
  674. package/src/db/migrations/0028_collection_engine.sql +94 -0
  675. package/src/db/migrations/0029_payment_rail.sql +107 -0
  676. package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
  677. package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
  678. package/src/db/migrations/0032_settlement_reversal.sql +76 -0
  679. package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
  680. package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
  681. package/src/db/migrations/0035_payment_account_environments.sql +61 -0
  682. package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
  683. package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
  684. package/src/db/migrations/0038_notification_channels.sql +175 -0
  685. package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
  686. package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
  687. package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
  688. package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
  689. package/src/db/migrations/0043_workload_identity.sql +105 -0
  690. package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
  691. package/dist/cjs/mail/resend-client.js +0 -103
  692. package/dist/cjs/mail/resend-client.js.map +0 -1
  693. package/dist/mail/resend-client.d.ts +0 -16
  694. package/dist/mail/resend-client.d.ts.map +0 -1
  695. package/dist/mail/resend-client.js +0 -100
  696. package/dist/mail/resend-client.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/collection/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCollectionPolicy = getCollectionPolicy;
4
+ exports.upsertCollectionPolicy = upsertCollectionPolicy;
5
+ exports.scheduleAction = scheduleAction;
6
+ exports.getAction = getAction;
7
+ exports.listActions = listActions;
8
+ exports.handledStepKeys = handledStepKeys;
9
+ exports.markSent = markSent;
10
+ exports.markFailed = markFailed;
11
+ exports.markEscalated = markEscalated;
12
+ exports.cancelPendingActions = cancelPendingActions;
13
+ exports.collectionMetrics = collectionMetrics;
14
+ exports.clientTimeline = clientTimeline;
15
+ const shared_1 = require("@baruk/shared");
16
+ const policy_js_1 = require("./policy.js");
17
+ const iso = (d) => (d ? d.toISOString().slice(0, 10) : null);
18
+ function mapAction(r) {
19
+ return {
20
+ id: r.id,
21
+ receivableId: r.receivable_id,
22
+ clientId: r.client_id,
23
+ clientName: r.client_name,
24
+ stepKey: r.step_key,
25
+ channel: r.channel,
26
+ template: r.template,
27
+ status: r.status,
28
+ scheduledFor: iso(r.scheduled_for),
29
+ attempts: r.attempts,
30
+ lastError: r.last_error,
31
+ sentAt: r.sent_at?.toISOString() ?? null,
32
+ closedAt: r.closed_at?.toISOString() ?? null,
33
+ closedReason: r.closed_reason,
34
+ recipientRef: r.recipient_ref,
35
+ amountAtSend: r.amount_at_send === null ? null : Number(r.amount_at_send),
36
+ createdAt: r.created_at.toISOString(),
37
+ };
38
+ }
39
+ const SELECT_ACTION = `
40
+ SELECT d.id, d.receivable_id, r.client_id, c.display_name AS client_name, d.step_key,
41
+ d.channel, d.template, d.status, d.scheduled_for, d.attempts, d.last_error,
42
+ d.sent_at, d.closed_at, d.closed_reason, d.recipient_ref, d.amount_at_send, d.created_at
43
+ FROM dunning_event d
44
+ LEFT JOIN receivable r ON r.id = d.receivable_id
45
+ LEFT JOIN client c ON c.id = r.client_id AND c.deleted_at IS NULL`;
46
+ // ── Política ────────────────────────────────────────────────────────────────
47
+ /** Política ativa do tenant; cai no padrão do produto quando não há nenhuma. */
48
+ async function getCollectionPolicy(tx) {
49
+ const rows = await tx `
50
+ SELECT id, name, steps, active FROM dunning_rule
51
+ WHERE active AND is_default
52
+ ORDER BY created_at LIMIT 1
53
+ `;
54
+ const row = rows[0];
55
+ if (!row)
56
+ return policy_js_1.DEFAULT_POLICY;
57
+ const steps = (0, policy_js_1.parsePolicySteps)(row.steps);
58
+ // Política cadastrada mas ilegível não pode virar "sem cobrança nenhuma"
59
+ // silenciosamente: melhor cair no padrão e deixar a régua rodando.
60
+ if (steps.length === 0)
61
+ return { ...policy_js_1.DEFAULT_POLICY, id: row.id, name: row.name };
62
+ return { id: row.id, name: row.name, steps, active: row.active };
63
+ }
64
+ async function upsertCollectionPolicy(tx, input) {
65
+ const steps = (0, policy_js_1.parsePolicySteps)(input.steps);
66
+ const existing = await tx `
67
+ SELECT id FROM dunning_rule WHERE is_default LIMIT 1
68
+ `;
69
+ if (existing[0]) {
70
+ await tx `
71
+ UPDATE dunning_rule
72
+ SET name = ${input.name}, steps = ${tx.json(steps)},
73
+ active = ${input.active ?? true}, updated_at = now()
74
+ WHERE id = ${existing[0].id}
75
+ `;
76
+ }
77
+ else {
78
+ await tx `
79
+ INSERT INTO dunning_rule (id, tenant_id, name, steps, active, is_default)
80
+ VALUES (${(0, shared_1.uuidv7)()},
81
+ (NULLIF(current_setting('app.current_tenant', true), ''))::uuid,
82
+ ${input.name}, ${tx.json(steps)}, ${input.active ?? true}, true)
83
+ `;
84
+ }
85
+ return getCollectionPolicy(tx);
86
+ }
87
+ // ── Ações ───────────────────────────────────────────────────────────────────
88
+ /**
89
+ * Agenda uma etapa. Idempotente pelo índice único parcial
90
+ * `(tenant, receivable, step_key)` — o `ON CONFLICT DO NOTHING` é o que
91
+ * transforma job repetido, retry, restart de worker e webhook duplicado em
92
+ * uma única ação lógica.
93
+ */
94
+ async function scheduleAction(tx, input) {
95
+ const rows = await tx `
96
+ INSERT INTO dunning_event (id, tenant_id, receivable_id, step_key, channel, template,
97
+ status, scheduled_for)
98
+ VALUES (${(0, shared_1.uuidv7)()},
99
+ (NULLIF(current_setting('app.current_tenant', true), ''))::uuid,
100
+ ${input.receivableId}, ${input.stepKey}, ${input.channel}, ${input.template},
101
+ 'scheduled', ${input.scheduledFor})
102
+ ON CONFLICT (tenant_id, receivable_id, step_key) WHERE receivable_id IS NOT NULL
103
+ DO NOTHING
104
+ RETURNING id
105
+ `;
106
+ if (!rows[0])
107
+ return null;
108
+ return getAction(tx, rows[0].id);
109
+ }
110
+ async function getAction(tx, id) {
111
+ const rows = await tx `${tx.unsafe(SELECT_ACTION)} WHERE d.id = ${id}`;
112
+ const row = rows[0];
113
+ if (!row)
114
+ throw new Error('Ação de cobrança não encontrada');
115
+ return mapAction(row);
116
+ }
117
+ async function listActions(tx, filter = {}) {
118
+ const limit = Math.min(Math.max(filter.limit ?? 100, 1), 500);
119
+ const rows = await tx `
120
+ ${tx.unsafe(SELECT_ACTION)}
121
+ WHERE d.receivable_id IS NOT NULL
122
+ ${filter.status ? tx `AND d.status = ${filter.status}` : tx ``}
123
+ ${filter.receivableId ? tx `AND d.receivable_id = ${filter.receivableId}` : tx ``}
124
+ ${filter.clientId ? tx `AND r.client_id = ${filter.clientId}` : tx ``}
125
+ ${filter.dueOnly
126
+ ? tx `AND d.status = 'scheduled' AND d.scheduled_for <= ${filter.dueUntil ?? tx `CURRENT_DATE`}`
127
+ : tx ``}
128
+ ORDER BY d.scheduled_for NULLS LAST, d.created_at
129
+ LIMIT ${limit}
130
+ `;
131
+ return rows.map(mapAction);
132
+ }
133
+ /** Etapas já registradas para um recebível — alimenta a idempotência da régua. */
134
+ async function handledStepKeys(tx, receivableId) {
135
+ const rows = await tx `
136
+ SELECT step_key FROM dunning_event WHERE receivable_id = ${receivableId}
137
+ `;
138
+ return new Set(rows.map((r) => r.step_key));
139
+ }
140
+ /**
141
+ * Assenta o envio.
142
+ *
143
+ * O identificador do provider vai para `provider_ref` (migration 0038). Antes
144
+ * ele era espremido em `template` sob COALESCE: como `scheduleAction` sempre
145
+ * grava o template, o id do provider era descartado em silêncio — e, se o
146
+ * template estivesse nulo, ocupava o lugar do nome e corrompia o relatório.
147
+ *
148
+ * Nunca deu problema porque o adapter de e-mail não devolve identificador.
149
+ * WhatsApp e SMS devolvem sempre, e o webhook de entrega chega trazendo APENAS
150
+ * esse id: sem coluna própria e indexada, todo status de entrega se perderia.
151
+ */
152
+ async function markSent(tx, id, input) {
153
+ await tx `
154
+ UPDATE dunning_event
155
+ SET status = 'sent', sent_at = now(), attempts = attempts + 1,
156
+ recipient_ref = ${input.recipientRef}, amount_at_send = ${input.amount},
157
+ last_error = NULL, closed_at = now(),
158
+ provider_ref = COALESCE(${input.providerRef ?? null}, provider_ref),
159
+ idempotency_key = COALESCE(${input.idempotencyKey ?? null}, idempotency_key)
160
+ WHERE id = ${id}
161
+ `;
162
+ }
163
+ async function markFailed(tx, id, input) {
164
+ await tx `
165
+ UPDATE dunning_event
166
+ SET status = ${input.permanent ? 'failed' : 'scheduled'},
167
+ attempts = attempts + 1,
168
+ last_error = ${input.error.slice(0, 300)},
169
+ closed_at = ${input.permanent ? tx `now()` : null},
170
+ closed_reason = ${input.permanent ? 'permanent_failure' : null}
171
+ WHERE id = ${id}
172
+ `;
173
+ }
174
+ async function markEscalated(tx, id, reason = 'escalated') {
175
+ await tx `
176
+ UPDATE dunning_event
177
+ SET status = 'escalated', closed_at = now(), closed_reason = ${reason}
178
+ WHERE id = ${id}
179
+ `;
180
+ }
181
+ /**
182
+ * Cancela ações ainda não enviadas de um recebível.
183
+ *
184
+ * Só toca `scheduled`: o que já saiu é histórico e não se apaga. Retorna quantas
185
+ * foram canceladas para o job poder relatar honestamente o que aconteceu.
186
+ */
187
+ async function cancelPendingActions(tx, receivableId, reason) {
188
+ const rows = await tx `
189
+ UPDATE dunning_event
190
+ SET status = 'canceled', closed_at = now(), closed_reason = ${reason}
191
+ WHERE receivable_id = ${receivableId} AND status = 'scheduled'
192
+ RETURNING id
193
+ `;
194
+ return rows.length;
195
+ }
196
+ async function collectionMetrics(tx) {
197
+ const [m] = await tx `
198
+ SELECT
199
+ count(*) FILTER (WHERE status = 'scheduled')::int AS scheduled,
200
+ count(*) FILTER (WHERE status = 'sent')::int AS sent,
201
+ count(*) FILTER (WHERE status = 'failed')::int AS failed,
202
+ count(*) FILTER (WHERE status = 'canceled')::int AS canceled,
203
+ count(*) FILTER (WHERE status = 'canceled' AND closed_reason = 'paid')::int AS stopped_by_payment,
204
+ count(*) FILTER (WHERE status = 'escalated')::int AS escalated,
205
+ count(*) FILTER (WHERE closed_reason = 'no_contact_data')::int AS no_contact_data,
206
+ count(*) FILTER (WHERE status = 'scheduled' AND scheduled_for <= CURRENT_DATE)::int AS due_today
207
+ FROM dunning_event WHERE receivable_id IS NOT NULL
208
+ `;
209
+ const [p] = await tx `
210
+ SELECT COALESCE(sum(r.amount), 0) AS amount
211
+ FROM receivable r
212
+ WHERE r.status = 'paid'
213
+ AND EXISTS (SELECT 1 FROM dunning_event d
214
+ WHERE d.receivable_id = r.id AND d.status = 'sent')
215
+ `;
216
+ return {
217
+ scheduled: m.scheduled,
218
+ sent: m.sent,
219
+ failed: m.failed,
220
+ canceled: m.canceled,
221
+ stoppedByPayment: m.stopped_by_payment,
222
+ escalated: m.escalated,
223
+ noContactData: m.no_contact_data,
224
+ dueToday: m.due_today,
225
+ amountPaidAfterCollection: Number(p.amount),
226
+ };
227
+ }
228
+ async function clientTimeline(tx, clientId, limit = 100) {
229
+ const rows = await tx `
230
+ SELECT created_at AS at, 'receivable_created' AS kind,
231
+ COALESCE(competence, 'avulso') AS detail, amount, id AS receivable_id
232
+ FROM receivable WHERE client_id = ${clientId} AND deleted_at IS NULL
233
+ UNION ALL
234
+ SELECT p.paid_at, 'payment', p.method, p.amount, p.receivable_id
235
+ FROM payment p JOIN receivable r ON r.id = p.receivable_id
236
+ WHERE r.client_id = ${clientId} AND p.status = 'confirmed'
237
+ UNION ALL
238
+ SELECT d.sent_at, 'collection_sent', d.step_key || ' · ' || d.channel, d.amount_at_send, d.receivable_id
239
+ FROM dunning_event d JOIN receivable r ON r.id = d.receivable_id
240
+ WHERE r.client_id = ${clientId} AND d.status = 'sent' AND d.sent_at IS NOT NULL
241
+ UNION ALL
242
+ SELECT d.closed_at, 'collection_canceled', d.step_key || ' · ' || COALESCE(d.closed_reason, '-'), NULL, d.receivable_id
243
+ FROM dunning_event d JOIN receivable r ON r.id = d.receivable_id
244
+ WHERE r.client_id = ${clientId} AND d.status = 'canceled' AND d.closed_at IS NOT NULL
245
+ UNION ALL
246
+ SELECT d.closed_at, 'collection_escalated', d.step_key, NULL, d.receivable_id
247
+ FROM dunning_event d JOIN receivable r ON r.id = d.receivable_id
248
+ WHERE r.client_id = ${clientId} AND d.status = 'escalated' AND d.closed_at IS NOT NULL
249
+ ORDER BY at DESC
250
+ LIMIT ${limit}
251
+ `;
252
+ return rows.map((r) => ({
253
+ at: r.at.toISOString(),
254
+ kind: r.kind,
255
+ detail: r.detail,
256
+ amount: r.amount === null ? null : Number(r.amount),
257
+ receivableId: r.receivable_id,
258
+ }));
259
+ }
260
+ //# 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,104 @@
1
+ "use strict";
2
+ /**
3
+ * Quem é o ASSUNTO de uma cobrança — e se existe um.
4
+ *
5
+ * ## O falso positivo que este módulo existe para matar
6
+ *
7
+ * O preflight de envio avulso respondia `eligible: true` medindo seis portas —
8
+ * identidade, credencial, destinatário, telefone, consentimento, template — e
9
+ * nenhuma delas pergunta **sobre o quê** a mensagem falaria. Um cliente sem
10
+ * recebível nenhum passava nas seis, e a rota de envio recusava logo depois por
11
+ * falta de valor e vencimento.
12
+ *
13
+ * Um preflight que aprova o que a execução recusa é pior que não ter preflight:
14
+ * ele desloca a descoberta do defeito para o momento do disparo, que é
15
+ * exatamente onde ninguém quer descobrir nada.
16
+ *
17
+ * ## Por que aqui, e não no handler
18
+ *
19
+ * "Este recebível está devido na etapa D+3 hoje?" é regra da RÉGUA. Ela já vive
20
+ * em `policy.ts` (`dueSteps`, `scheduledDateFor`) e em `engine.ts`
21
+ * (`isCollectible`), e é usada pelo ciclo automático. Reimplementar a mesma
22
+ * conta dentro de uma rota criaria a segunda derivação de sempre — as duas
23
+ * concordariam no dia da escrita e divergiriam na primeira mudança da régua,
24
+ * com o avulso mandando o que o ciclo não mandaria.
25
+ *
26
+ * Este módulo não decide política nova: ele **lê** a política vigente e responde
27
+ * quem ela alcança, sem escrever nada.
28
+ */
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.isCollectibleSubject = isCollectibleSubject;
31
+ exports.findEligibleSubjects = findEligibleSubjects;
32
+ exports.resolveSubjectForStep = resolveSubjectForStep;
33
+ const ar_repository_js_1 = require("../billing/ar-repository.js");
34
+ const policy_js_1 = require("./policy.js");
35
+ const repository_js_1 = require("./repository.js");
36
+ /**
37
+ * Um recebível ainda merece cobrança?
38
+ *
39
+ * Cópia deliberada da regra de `engine.ts`, que era privada. Exportar de lá e
40
+ * importar aqui criaria ciclo (`engine` já importa deste módulo o suficiente);
41
+ * a duplicação é de UMA função pequena e está coberta pelo teste de
42
+ * equivalência em `collection-subject.test.ts`, que exercita as duas contra os
43
+ * mesmos casos.
44
+ */
45
+ function isCollectibleSubject(r) {
46
+ if (r.status === 'paid' || r.status === 'canceled')
47
+ return false;
48
+ if (r.status === 'renegotiated' || r.status === 'written_off')
49
+ return false;
50
+ // Saldo zero sem status `paid` é quem já pagou e o status não foi reavaliado.
51
+ // Cobrar aqui é o pior erro operacional deste motor.
52
+ if (r.outstandingAmount <= 0)
53
+ return false;
54
+ if (!r.dueDate)
55
+ return false;
56
+ return true;
57
+ }
58
+ /**
59
+ * Os recebíveis do cliente que a etapa alcança HOJE.
60
+ *
61
+ * Vazio quer dizer "não há sobre o que cobrar nesta etapa", e é um desfecho
62
+ * legítimo — não um erro. Cabe a quem chama transformar isso em recusa.
63
+ *
64
+ * A ordem é a mesma da régua (vencimento mais antigo primeiro), para que o
65
+ * avulso e o ciclo escolham o mesmo quando houver mais de um.
66
+ */
67
+ async function findEligibleSubjects(tx, q) {
68
+ const policy = q.policy ?? (await (0, repository_js_1.getCollectionPolicy)(tx));
69
+ /*
70
+ * Nenhuma checagem própria de política ou de etapa aqui.
71
+ *
72
+ * A primeira versão tinha duas — "a régua está ativa" e "a etapa existe e
73
+ * está ativa" — e o teste de mutação derrubou as duas: removê-las não quebrava
74
+ * caso nenhum, porque `dueSteps` já decide exatamente isso. Guard que nenhum
75
+ * teste consegue distinguir não é guard: é uma segunda codificação da mesma
76
+ * regra, esperando para divergir da primeira.
77
+ *
78
+ * O que sobra deste módulo é o que ele de fato acrescenta: recortar por
79
+ * cliente, aplicar `isCollectibleSubject` e perguntar à régua. `dueSteps`
80
+ * continua sendo a única autoridade sobre quando uma etapa vence.
81
+ */
82
+ const { items } = await (0, ar_repository_js_1.listReceivables)(tx, { clientId: q.clientId, limit: 200 });
83
+ const elegiveis = [];
84
+ for (const r of items) {
85
+ if (!isCollectibleSubject(r))
86
+ continue;
87
+ const handled = await (0, repository_js_1.handledStepKeys)(tx, r.id);
88
+ const due = (0, policy_js_1.dueSteps)(policy, r.dueDate, q.today, handled);
89
+ if (due.some((d) => d.step.key === q.stepKey))
90
+ elegiveis.push(r);
91
+ }
92
+ return elegiveis;
93
+ }
94
+ /**
95
+ * O assunto que o envio avulso usaria, ou `null`.
96
+ *
97
+ * Quando há mais de um, o mais antigo — mesma preferência da régua. Escolher o
98
+ * mais recente faria a dívida velha envelhecer sem cobrança.
99
+ */
100
+ async function resolveSubjectForStep(tx, q) {
101
+ const todos = await findEligibleSubjects(tx, q);
102
+ return todos[0] ?? null;
103
+ }
104
+ //# sourceMappingURL=subject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subject.js","sourceRoot":"","sources":["../../../src/collection/subject.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;;AAgBH,oDAQC;AAoBD,oDA8BC;AAQD,sDAMC;AArFD,kEAA0F;AAC1F,2CAA8D;AAC9D,mDAAuE;AAEvE;;;;;;;;GAQG;AACH,SAAgB,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;AACI,KAAK,UAAU,oBAAoB,CACxC,EAAM,EACN,CAAuB;IAEvB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,IAAA,mCAAmB,EAAC,EAAE,CAAC,CAAC,CAAC;IAE3D;;;;;;;;;;;;OAYG;IAEH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,kCAAe,EAAC,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,IAAA,+BAAe,EAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,IAAA,oBAAQ,EAAC,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;AACI,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,165 @@
1
+ "use strict";
2
+ /**
3
+ * Catálogo de templates da COBRANÇA — do produto, não do motor.
4
+ *
5
+ * O motor sabe resolver template (escopo, versão, aprovação); ele não conhece
6
+ * nenhum. Os textos e os nomes registrados no provider vivem aqui, ao lado da
7
+ * régua que os usa.
8
+ *
9
+ * O corpo dos e-mails continua vindo de `copy.ts`/`email-layout.ts`: este
10
+ * catálogo declara QUAL template vale para cada etapa e canal, e as variáveis
11
+ * que ele consome. Duplicar o texto aqui criaria duas fontes para a mesma
12
+ * mensagem, e a segunda ficaria para trás na primeira correção.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.createCollectionTemplateStore = createCollectionTemplateStore;
16
+ const communication_bridge_js_1 = require("./communication-bridge.js");
17
+ const LOCALE = 'pt-BR';
18
+ /**
19
+ * Variáveis da cobrança, na ordem em que os templates de WhatsApp as declaram.
20
+ *
21
+ * A ordem é contrato com o template aprovado no provider: `{{1}}` é o nome,
22
+ * `{{2}}` o valor, `{{3}}` o vencimento. Trocar a ordem aqui sem re-aprovar o
23
+ * template lá manda o valor no lugar do nome — e a Meta aceita, porque para ela
24
+ * são três strings.
25
+ */
26
+ const COLLECTION_VARS = ['clientName', 'amount', 'dueDate'];
27
+ /**
28
+ * Sufixo do nome REGISTRADO NO PROVIDER.
29
+ *
30
+ * Muda **somente** quando um template novo é submetido e aprovado do lado da
31
+ * Meta. Mexer aqui sem submeter faz o despacho pedir um nome que não existe — e
32
+ * a Meta responde `132001`, que fala de "translation" e manda quem investiga
33
+ * procurar no lugar errado.
34
+ */
35
+ const PROVIDER_TEMPLATE_SUFFIX = 'v1';
36
+ /**
37
+ * Revisão INTERNA do catálogo de WhatsApp. **Nunca chega ao provider.**
38
+ *
39
+ * Entra na chave de idempotência (`buildIdempotencyKey` recebe
40
+ * `templateVersion`), e é o único jeito legítimo de dizer "esta é outra
41
+ * tentativa lógica" sem tocar no template aprovado.
42
+ *
43
+ * ## Por que os dois existem separados
44
+ *
45
+ * Eram dois literais `'v1'` — um em `version`, outro dentro da interpolação de
46
+ * `providerTemplateName` —, independentes de fato e idênticos na aparência. A
47
+ * primeira pessoa que precisasse de uma chave nova bumparia o que estivesse
48
+ * mais à mão, e havia 50% de chance de o despacho passar a pedir
49
+ * `billing_dunning_dplus3_v2` à Meta, que não tem esse template.
50
+ *
51
+ * `v2` aqui porque a revisão `v1` foi consumida: em 2026-09-01 a primeira
52
+ * tentativa real assentou a chave como `failed_permanent`, e o motor recusa
53
+ * repetição sobre chave assentada — corretamente. O template aprovado continua
54
+ * sendo `billing_dunning_dplus3_v1`.
55
+ *
56
+ * E-mail e SMS **não** bumpam: os dois têm despacho real em produção, e mudar a
57
+ * versão deles reabriria chaves já assentadas de 89 avisos que já saíram.
58
+ */
59
+ const WHATSAPP_CATALOG_REVISION = 'v2';
60
+ /**
61
+ * E-mail: sempre disponível, porque o corpo é montado pelo produto.
62
+ *
63
+ * `approved` aqui não significa "aprovado por um provider" — e-mail não tem
64
+ * registro prévio. Significa "utilizável", que é o que o motor precisa saber.
65
+ */
66
+ function emailTemplate(eventType) {
67
+ return {
68
+ tenantId: null,
69
+ product: communication_bridge_js_1.SC_PRODUCT,
70
+ brand: null,
71
+ channel: 'email',
72
+ eventType,
73
+ locale: LOCALE,
74
+ version: 'v1',
75
+ status: 'approved',
76
+ variables: [...COLLECTION_VARS],
77
+ };
78
+ }
79
+ /**
80
+ * WhatsApp: só existe se o escritório tiver registrado o template no provider.
81
+ *
82
+ * O nome segue o evento (`billing.dunning.dplus3` → `billing_dunning_dplus3_v1`)
83
+ * porque é a única convenção que não exige uma segunda tabela de-para que
84
+ * alguém precisaria manter sincronizada com o painel da Meta.
85
+ *
86
+ * **Não é declarado aprovado por padrão.** Um template que este código afirma
87
+ * existir e que ninguém registrou vira recusa do provider a cada etapa da régua
88
+ * — e a recusa chega como falha de entrega, sugerindo problema no cliente.
89
+ */
90
+ function whatsappTemplate(eventType, approved) {
91
+ return {
92
+ tenantId: null,
93
+ product: communication_bridge_js_1.SC_PRODUCT,
94
+ brand: null,
95
+ channel: 'whatsapp',
96
+ eventType,
97
+ locale: LOCALE,
98
+ // Revisão interna — some antes da fronteira do provider.
99
+ version: WHATSAPP_CATALOG_REVISION,
100
+ status: approved ? 'approved' : 'pending_approval',
101
+ // Nome no provider — o sufixo é o do TEMPLATE APROVADO, não o da revisão.
102
+ providerTemplateName: `${eventType.replace(/\./g, '_')}_${PROVIDER_TEMPLATE_SUFFIX}`,
103
+ variables: [...COLLECTION_VARS],
104
+ };
105
+ }
106
+ function smsTemplate(eventType, approved) {
107
+ return {
108
+ tenantId: null,
109
+ product: communication_bridge_js_1.SC_PRODUCT,
110
+ brand: null,
111
+ channel: 'sms',
112
+ eventType,
113
+ locale: LOCALE,
114
+ version: 'v1',
115
+ status: approved ? 'approved' : 'pending_approval',
116
+ variables: [...COLLECTION_VARS],
117
+ // Curto de propósito: cada segmento é cobrado, e o link é o que faz o
118
+ // cliente agir. Sem link, a mensagem só informa.
119
+ body: '{{clientName}}, consta {{amount}} com vencimento {{dueDate}}.',
120
+ };
121
+ }
122
+ /**
123
+ * Quais eventos o escritório tem registrados em cada canal.
124
+ *
125
+ * Vem de `tenant.settings.channels.<canal>.approvedEvents`. Ausente = nenhum, e
126
+ * o e-mail segue funcionando: ligar um canal novo nunca pode desligar o que já
127
+ * funcionava.
128
+ */
129
+ // `tenant` não tem RLS — é a tabela raiz, define a fronteira em vez de ser
130
+ // protegida por ela. Toda leitura dela exige a amarra explícita na GUC da
131
+ // sessão; sem isso, o `tenantId` do parâmetro é a única coisa que separa um
132
+ // escritório do outro, e um parâmetro não é uma fronteira.
133
+ async function approvedEvents(tx, tenantId, channel) {
134
+ const rows = await tx `
135
+ SELECT settings FROM tenant
136
+ WHERE id = ${tenantId}
137
+ AND id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
138
+ LIMIT 1
139
+ `;
140
+ const channels = (rows[0]?.settings?.channels ?? {});
141
+ const list = channels[channel]?.approvedEvents;
142
+ return new Set(Array.isArray(list) ? list.filter((v) => typeof v === 'string') : []);
143
+ }
144
+ function createCollectionTemplateStore(tx) {
145
+ return {
146
+ async candidates(ctx, channel, eventType, locale) {
147
+ if (ctx.product !== communication_bridge_js_1.SC_PRODUCT || locale !== LOCALE)
148
+ return [];
149
+ if (channel === 'email')
150
+ return [emailTemplate(eventType)];
151
+ if (channel === 'whatsapp') {
152
+ const approved = await approvedEvents(tx, ctx.tenantId, 'whatsapp');
153
+ return [whatsappTemplate(eventType, approved.has(eventType))];
154
+ }
155
+ if (channel === 'sms') {
156
+ const approved = await approvedEvents(tx, ctx.tenantId, 'sms');
157
+ return [smsTemplate(eventType, approved.has(eventType))];
158
+ }
159
+ // `notification` é evento interno e não passa pelo motor: a régua o
160
+ // resolve antes, escalando para a fila humana sem mensagem ao cliente.
161
+ return [];
162
+ },
163
+ };
164
+ }
165
+ //# 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,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_TEMPLATES = exports.TEMPLATE_VARIABLES = void 0;
4
+ exports.resolveTemplate = resolveTemplate;
5
+ exports.renderTemplate = renderTemplate;
6
+ exports.TEMPLATE_VARIABLES = [
7
+ 'clientName',
8
+ 'officeName',
9
+ 'dueDate',
10
+ 'outstandingAmount',
11
+ 'reference',
12
+ ];
13
+ /**
14
+ * Textos padrão por tom.
15
+ *
16
+ * Nenhum deles ameaça, cita medida judicial, negativação ou consequência legal.
17
+ * Cobrança automatizada que produz esse tipo de texto sem revisão humana é risco
18
+ * jurídico e de relacionamento — a etapa mais dura da régua padrão escala para
19
+ * uma pessoa em vez de escrever por conta própria.
20
+ */
21
+ const DEFAULT_TEMPLATES = {
22
+ 'collection.reminder': {
23
+ subject: 'Lembrete: vencimento em {{dueDate}}',
24
+ body: 'Olá, {{clientName}}.\n\n' +
25
+ 'Passando para lembrar que o valor de {{outstandingAmount}} vence em {{dueDate}}.\n' +
26
+ 'Referência: {{reference}}.\n\n' +
27
+ 'Se já tiver pago, desconsidere esta mensagem.\n\n{{officeName}}',
28
+ },
29
+ 'collection.due': {
30
+ subject: 'Vence hoje: {{outstandingAmount}}',
31
+ body: 'Olá, {{clientName}}.\n\n' +
32
+ 'O valor de {{outstandingAmount}} vence hoje ({{dueDate}}).\n' +
33
+ 'Referência: {{reference}}.\n\n' +
34
+ 'Se já tiver pago, desconsidere esta mensagem.\n\n{{officeName}}',
35
+ },
36
+ 'collection.overdue_soft': {
37
+ subject: 'Pendência em aberto — {{reference}}',
38
+ body: 'Olá, {{clientName}}.\n\n' +
39
+ 'Consta em aberto o valor de {{outstandingAmount}}, com vencimento em {{dueDate}}.\n' +
40
+ 'Se o pagamento já foi feito, por favor nos avise para darmos baixa.\n\n' +
41
+ 'Qualquer dúvida, estamos à disposição.\n\n{{officeName}}',
42
+ },
43
+ 'collection.overdue': {
44
+ subject: 'Pendência em aberto desde {{dueDate}}',
45
+ body: 'Olá, {{clientName}}.\n\n' +
46
+ 'O valor de {{outstandingAmount}}, vencido em {{dueDate}}, segue em aberto.\n' +
47
+ 'Referência: {{reference}}.\n\n' +
48
+ 'Pedimos que entre em contato para regularizarmos ou combinarmos a melhor forma.\n\n' +
49
+ '{{officeName}}',
50
+ },
51
+ // Interno: nunca vai ao cliente. Ver a nota em `policy.ts`.
52
+ 'collection.escalate': {
53
+ subject: 'Cobrança escalada para atendimento humano — {{clientName}}',
54
+ body: 'A régua automática chegou ao fim para {{clientName}} ({{reference}}), com ' +
55
+ '{{outstandingAmount}} em aberto desde {{dueDate}}. A partir daqui a condução é humana.',
56
+ },
57
+ };
58
+ exports.DEFAULT_TEMPLATES = DEFAULT_TEMPLATES;
59
+ const TONE_FALLBACK = {
60
+ reminder: 'collection.reminder',
61
+ due_notice: 'collection.due',
62
+ friendly_collection: 'collection.overdue_soft',
63
+ overdue_collection: 'collection.overdue',
64
+ human_escalation: 'collection.escalate',
65
+ };
66
+ /** Resolve o template; cai no padrão do tom quando o tenant não tem o seu. */
67
+ function resolveTemplate(templateKey, tone, overrides) {
68
+ return (overrides?.[templateKey] ??
69
+ DEFAULT_TEMPLATES[templateKey] ??
70
+ DEFAULT_TEMPLATES[TONE_FALLBACK[tone]]);
71
+ }
72
+ /** Substitui `{{var}}` pelas variáveis da allowlist. O resto fica literal. */
73
+ function renderTemplate(text, vars) {
74
+ return text.replace(/\{\{\s*([a-zA-Z]+)\s*\}\}/g, (whole, name) => exports.TEMPLATE_VARIABLES.includes(name)
75
+ ? String(vars[name] ?? '')
76
+ : whole);
77
+ }
78
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/collection/template.ts"],"names":[],"mappings":";;;AA6FA,0CAUC;AAGD,wCAMC;AA5FY,QAAA,kBAAkB,GAAoC;IACjE,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,mBAAmB;IACnB,WAAW;CACZ,CAAC;AAOF;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAuC;IAC5D,qBAAqB,EAAE;QACrB,OAAO,EAAE,qCAAqC;QAC9C,IAAI,EACF,0BAA0B;YAC1B,oFAAoF;YACpF,gCAAgC;YAChC,iEAAiE;KACpE;IACD,gBAAgB,EAAE;QAChB,OAAO,EAAE,mCAAmC;QAC5C,IAAI,EACF,0BAA0B;YAC1B,8DAA8D;YAC9D,gCAAgC;YAChC,iEAAiE;KACpE;IACD,yBAAyB,EAAE;QACzB,OAAO,EAAE,qCAAqC;QAC9C,IAAI,EACF,0BAA0B;YAC1B,qFAAqF;YACrF,yEAAyE;YACzE,0DAA0D;KAC7D;IACD,oBAAoB,EAAE;QACpB,OAAO,EAAE,uCAAuC;QAChD,IAAI,EACF,0BAA0B;YAC1B,8EAA8E;YAC9E,gCAAgC;YAChC,qFAAqF;YACrF,gBAAgB;KACnB;IACD,4DAA4D;IAC5D,qBAAqB,EAAE;QACrB,OAAO,EAAE,4DAA4D;QACrE,IAAI,EACF,4EAA4E;YAC5E,wFAAwF;KAC3F;CACF,CAAC;AAgCO,8CAAiB;AA9B1B,MAAM,aAAa,GAA6B;IAC9C,QAAQ,EAAE,qBAAqB;IAC/B,UAAU,EAAE,gBAAgB;IAC5B,mBAAmB,EAAE,yBAAyB;IAC9C,kBAAkB,EAAE,oBAAoB;IACxC,gBAAgB,EAAE,qBAAqB;CACxC,CAAC;AAEF,8EAA8E;AAC9E,SAAgB,eAAe,CAC7B,WAAmB,EACnB,IAAc,EACd,SAA8C;IAE9C,OAAO,CACL,SAAS,EAAE,CAAC,WAAW,CAAC;QACxB,iBAAiB,CAAC,WAAW,CAAC;QAC9B,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAE,CACxC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAgB,cAAc,CAAC,IAAY,EAAE,IAAkB;IAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CACvE,0BAAwC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAA0B,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC,CAAC,KAAK,CACV,CAAC;AACJ,CAAC"}