@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,407 @@
1
+ import { getReceivable, listReceivables, } from '../billing/ar-repository.js';
2
+ import { dueSteps } from './policy.js';
3
+ import { renderCopy } from './copy.js';
4
+ import {} from './email-layout.js';
5
+ import { dispatch, } from '../communication/index.js';
6
+ import { buildCollectionContent, collectionContext, collectionEventType, collectionVariables, } from './communication-bridge.js';
7
+ import { cancelPendingActions, getCollectionPolicy, handledStepKeys, listActions, markEscalated, markFailed, markSent, scheduleAction, } from './repository.js';
8
+ /**
9
+ * Motor de cobrança: RECEIVABLE → EVENT → RULE → ACTION → DELIVERY → STOP.
10
+ *
11
+ * Dois passos separados de propósito:
12
+ *
13
+ * `planCollections` decide o que DEVE acontecer (puro em relação a I/O de
14
+ * provider — só toca o banco)
15
+ * `executeCollections` faz acontecer
16
+ *
17
+ * Separar permite rodar o planejamento em dry-run e mostrar ao escritório o que
18
+ * sairia, antes de qualquer mensagem existir. Numa régua de cobrança isso não é
19
+ * luxo: a primeira execução contra uma carteira real precisa ser inspecionável.
20
+ */
21
+ const MAX_ATTEMPTS = 3;
22
+ /** Um recebível ainda merece cobrança? */
23
+ function isCollectible(r) {
24
+ if (r.status === 'paid' || r.status === 'canceled')
25
+ return false;
26
+ if (r.status === 'renegotiated' || r.status === 'written_off')
27
+ return false;
28
+ // Saldo zero sem status `paid` acontece quando a soma dos pagamentos fecha o
29
+ // valor mas o status ainda não foi reavaliado. Cobrar aqui seria pedir dinheiro
30
+ // de quem já pagou — o pior erro operacional deste motor.
31
+ if (r.outstandingAmount <= 0)
32
+ return false;
33
+ if (!r.dueDate)
34
+ return false;
35
+ return true;
36
+ }
37
+ /**
38
+ * Planeja: cancela o que não deve mais sair e agenda o que a régua manda.
39
+ *
40
+ * A ordem importa. Cancelar ANTES de agendar evita a janela em que um recebível
41
+ * pago recebe uma etapa nova no mesmo ciclo.
42
+ */
43
+ export async function planCollections(tx, today, policyOverride) {
44
+ const policy = policyOverride ?? (await getCollectionPolicy(tx));
45
+ const report = {
46
+ examined: 0,
47
+ scheduled: 0,
48
+ skippedAlreadyHandled: 0,
49
+ canceledByPayment: 0,
50
+ canceledByCancellation: 0,
51
+ };
52
+ // Tudo que não está cancelado — inclusive pago, porque é justamente o pago que
53
+ // precisa ter a régua interrompida.
54
+ const { items } = await listReceivables(tx, { limit: 200 });
55
+ for (const r of items) {
56
+ report.examined += 1;
57
+ if (r.status === 'paid' || r.outstandingAmount <= 0) {
58
+ report.canceledByPayment += await cancelPendingActions(tx, r.id, 'paid');
59
+ continue;
60
+ }
61
+ if (r.status === 'canceled') {
62
+ report.canceledByCancellation += await cancelPendingActions(tx, r.id, 'canceled');
63
+ continue;
64
+ }
65
+ if (!isCollectible(r))
66
+ continue;
67
+ const handled = await handledStepKeys(tx, r.id);
68
+ const due = dueSteps(policy, r.dueDate, today, handled);
69
+ // Quantas etapas a régua já cobriu para este recebível — é o que explica
70
+ // "por que não agendei nada" num ciclo que não criou ação nenhuma.
71
+ report.skippedAlreadyHandled += handled.size;
72
+ for (const { step, scheduledFor } of due) {
73
+ const action = await scheduleAction(tx, {
74
+ receivableId: r.id,
75
+ stepKey: step.key,
76
+ channel: step.channel,
77
+ template: step.templateKey,
78
+ scheduledFor,
79
+ });
80
+ if (action)
81
+ report.scheduled += 1;
82
+ }
83
+ }
84
+ return report;
85
+ }
86
+ /**
87
+ * Monta a cópia da etapa.
88
+ *
89
+ * Extraída para que os dois caminhos de entrega — legado e compartilhado — usem
90
+ * exatamente o mesmo texto. Duas montagens em paralelo divergiriam na primeira
91
+ * correção feita só de um lado, e o defeito apareceria como "o WhatsApp diz uma
92
+ * coisa e o e-mail diz outra" para o mesmo cliente, no mesmo dia.
93
+ */
94
+ async function buildStepCopy(ctx, receivableId, current, step) {
95
+ const description = ctx.describeReceivable ? await ctx.describeReceivable(receivableId) : null;
96
+ const payment = (await ctx.resolvePayment?.(receivableId)) ?? undefined;
97
+ const { subject, block } = renderCopy(step.tone, {
98
+ clientName: current.clientName ?? 'cliente',
99
+ branding: ctx.branding,
100
+ // Saldo de AGORA, não o valor original: depois de uma baixa parcial,
101
+ // anunciar o valor cheio é cobrar duas vezes o que já entrou.
102
+ outstandingAmount: current.outstandingAmount,
103
+ originalAmount: current.amount,
104
+ hasPartialPayment: current.amountPaid > 0,
105
+ dueDate: current.dueDate,
106
+ competence: current.competence,
107
+ description,
108
+ daysOverdue: current.daysOverdue,
109
+ payment,
110
+ });
111
+ return { subject, block, payment };
112
+ }
113
+ const NO_ATTEMPT = {
114
+ sent: 0,
115
+ escalated: 0,
116
+ skippedNoChannel: 0,
117
+ failedPermanent: 0,
118
+ failedTemporary: 0,
119
+ };
120
+ /**
121
+ * Traduz uma etapa da régua em intenção de comunicação e assenta o desfecho.
122
+ *
123
+ * Tudo que é específico da SC (evento, variáveis, cópia) é montado aqui e
124
+ * entregue pronto ao motor; tudo que é específico de canal (identidade,
125
+ * consentimento, template, provider) fica lá. Nenhum dos dois lados precisa
126
+ * conhecer o vocabulário do outro.
127
+ */
128
+ async function sendViaSharedEngine(tx, ctx, comm, action, current, step) {
129
+ const receivableId = action.receivableId;
130
+ const copy = await buildStepCopy(ctx, receivableId, current, step);
131
+ const result = await dispatch({
132
+ ctx: collectionContext(comm.tenantId, comm.brand),
133
+ eventType: collectionEventType(step.key),
134
+ subjectRef: receivableId,
135
+ // A permissão pertence à PESSOA, não ao número: a referência é o cliente.
136
+ recipientRef: current.clientId,
137
+ variables: collectionVariables({
138
+ clientName: current.clientName ?? 'cliente',
139
+ officeName: ctx.branding.officeName,
140
+ outstandingAmount: current.outstandingAmount,
141
+ dueDate: current.dueDate,
142
+ reference: current.competence ?? null,
143
+ paymentUrl: copy.payment?.url,
144
+ }),
145
+ // Sem política declarada, o canal do passo é o único tentado — que é
146
+ // exatamente o comportamento da régua hoje. Ligar fallback é decisão do
147
+ // escritório, nunca default do motor.
148
+ policy: comm.policyFor?.(step) ?? { order: [step.channel] },
149
+ }, {
150
+ channels: comm.channels,
151
+ accounts: comm.accounts,
152
+ templates: comm.templates,
153
+ consent: comm.consent,
154
+ consentPolicy: comm.consentPolicy,
155
+ resolveRecipient: (ref, channel) => ctx.resolveRecipient(ref, channel),
156
+ buildContent: buildCollectionContent({
157
+ branding: ctx.branding,
158
+ subject: copy.subject,
159
+ block: copy.block,
160
+ }),
161
+ claims: comm.claims,
162
+ audit: comm.audit,
163
+ }, { dryRun: comm.dryRun });
164
+ // Ensaio não escreve. Um dry-run que marca a ação como enviada não é ensaio —
165
+ // é a execução real com o envio removido, e cala a etapa para sempre.
166
+ if (comm.dryRun) {
167
+ return { ...NO_ATTEMPT, sent: result.delivered ? 1 : 0, notAttempted: true };
168
+ }
169
+ if (result.invalidContext) {
170
+ // Defeito de integração, não estado do cliente. Escala para humano em vez de
171
+ // fechar a etapa: ninguém deve descobrir isso só quando a dívida prescrever.
172
+ await markEscalated(tx, action.id);
173
+ return { ...NO_ATTEMPT, escalated: 1, skippedNoChannel: 1, notAttempted: true };
174
+ }
175
+ if (result.delivered) {
176
+ const recipient = await ctx.resolveRecipient(current.clientId, result.delivered);
177
+ await markSent(tx, action.id, {
178
+ recipientRef: recipient ?? '',
179
+ amount: current.outstandingAmount,
180
+ providerRef: result.providerRef,
181
+ // A reserva já é a proteção contra reenvio; esta coluna é a JUNÇÃO entre
182
+ // a etapa da régua e a linha de `communication_dispatch`. Sem ela, ver "o
183
+ // que aconteceu com esta cobrança" exigiria adivinhar a chave a partir de
184
+ // sete campos.
185
+ idempotencyKey: result.idempotencyKey,
186
+ });
187
+ return { ...NO_ATTEMPT, sent: 1 };
188
+ }
189
+ const permanentAttempt = result.attempts.find((a) => a.outcome === 'permanent');
190
+ /*
191
+ * `unavailable` entra aqui junto com `temporary`, e a distinção importa.
192
+ *
193
+ * Canal indisponível é falha de INFRAESTRUTURA — cofre fora do ar, credencial
194
+ * ainda não propagada, canal não registrado. Não é uma decisão sobre o
195
+ * cliente, e por isso não pode virar `escalated`, que no domínio significa
196
+ * "sai da automação e vai para a fila humana": a etapa fecharia para sempre,
197
+ * porque `planCollections` não reagenda um `step_key` que já existe e
198
+ * `listActions` só enxerga `scheduled`. Foi o que aconteceu no incidente
199
+ * C1-PROV-R1B-C2 — a infra voltou e as quatro cobranças continuaram mortas.
200
+ *
201
+ * Tratado como temporário, `markFailed` devolve a etapa a `scheduled` e o
202
+ * ciclo seguinte tenta de novo. O teto é o mesmo `MAX_ATTEMPTS` das demais
203
+ * falhas: uma credencial ausente de forma PERMANENTE consome as três
204
+ * tentativas e assenta como `permanent_failure`, em vez de reagendar em
205
+ * silêncio para sempre.
206
+ */
207
+ const temporaryAttempt = result.attempts.find((a) => a.outcome === 'temporary' || a.outcome === 'unavailable');
208
+ if (permanentAttempt || temporaryAttempt) {
209
+ const permanent = Boolean(permanentAttempt) || action.attempts + 1 >= MAX_ATTEMPTS;
210
+ await markFailed(tx, action.id, {
211
+ error: (permanentAttempt ?? temporaryAttempt).detail ?? 'falha de entrega',
212
+ permanent,
213
+ });
214
+ return permanent
215
+ ? { ...NO_ATTEMPT, failedPermanent: 1 }
216
+ : { ...NO_ATTEMPT, failedTemporary: 1 };
217
+ }
218
+ // Reserva negada: a etapa fica exatamente como está. Não é falha, não é
219
+ // escalonamento, e não gasta tentativa — outra execução já entregou, ou está
220
+ // entregando agora, e é ela quem vai assentar o desfecho.
221
+ if (claimRefusedIn(result.attempts)) {
222
+ return { ...NO_ATTEMPT, notAttempted: true };
223
+ }
224
+ // Nada foi enviado e nenhum adapter falhou: todas as portas recusaram antes.
225
+ // O motivo é o que diz ao escritório o que fazer — e cada um exige uma ação
226
+ // diferente, então nenhum deles pode virar um "não enviado" genérico.
227
+ const reason = closeReasonFor(result.attempts);
228
+ await markEscalated(tx, action.id, reason);
229
+ return { ...NO_ATTEMPT, escalated: 1, skippedNoChannel: 1, notAttempted: true };
230
+ }
231
+ function closeReasonFor(attempts) {
232
+ const skips = attempts.map((a) => a.skipped);
233
+ // Opt-out é o mais forte: se QUALQUER canal foi recusado por vontade do
234
+ // cliente, é isso que o escritório precisa ver — não "faltou cadastro".
235
+ if (skips.includes('opted_out'))
236
+ return 'opted_out';
237
+ if (skips.includes('consent_unknown'))
238
+ return 'consent_unknown';
239
+ if (skips.includes('no_recipient') || skips.includes('invalid_recipient')) {
240
+ return 'no_contact_data';
241
+ }
242
+ return 'escalated';
243
+ }
244
+ /**
245
+ * A etapa não saiu porque a RESERVA foi negada — ou seja, o sistema funcionou.
246
+ *
247
+ * Precisa de tratamento próprio: `already_sent` e `claim_in_flight` não são
248
+ * falha, não são cadastro e não são escalonamento. Marcar a ação como escalada
249
+ * mandaria um humano investigar um envio que ou já aconteceu, ou está
250
+ * acontecendo — e encheria a fila operacional de ruído justamente quando a
251
+ * proteção está trabalhando.
252
+ */
253
+ function claimRefusedIn(attempts) {
254
+ return attempts.some((a) => a.skipped === 'already_sent' || a.skipped === 'claim_in_flight');
255
+ }
256
+ /**
257
+ * Executa as ações vencidas.
258
+ *
259
+ * **Revalida o estado no momento do envio.** O agendamento pode ter dias; entre
260
+ * ele e agora o cliente pode ter pago, o recebível pode ter sido cancelado, ou
261
+ * uma baixa parcial pode ter mudado o valor. Confiar no que foi agendado é como
262
+ * o motor manda cobrança de dívida quitada.
263
+ */
264
+ export async function executeCollections(tx, ctx, today, policyOverride) {
265
+ const policy = policyOverride ?? (await getCollectionPolicy(tx));
266
+ const report = {
267
+ attempted: 0,
268
+ sent: 0,
269
+ failedTemporary: 0,
270
+ failedPermanent: 0,
271
+ skippedNoLongerDue: 0,
272
+ skippedNoChannel: 0,
273
+ escalated: 0,
274
+ };
275
+ const pending = await listActions(tx, { dueOnly: true, dueUntil: today, limit: 200 });
276
+ for (const action of pending) {
277
+ if (!action.receivableId)
278
+ continue;
279
+ // Estado atual, não o do agendamento. Busca pelo id — filtrar por cliente e
280
+ // procurar na página seria correto só enquanto a página coubesse.
281
+ const current = await getReceivable(tx, action.receivableId).catch(() => null);
282
+ if (!current || !isCollectible(current)) {
283
+ const reason = current?.status === 'canceled' ? 'canceled' : 'paid';
284
+ await cancelPendingActions(tx, action.receivableId, reason);
285
+ report.skippedNoLongerDue += 1;
286
+ continue;
287
+ }
288
+ const step = policy.steps.find((s) => s.key === action.stepKey);
289
+ if (!step || step.active === false) {
290
+ await cancelPendingActions(tx, action.receivableId, 'rule_disabled');
291
+ report.skippedNoLongerDue += 1;
292
+ continue;
293
+ }
294
+ // Escalonamento é evento interno: fecha a ação e entra na fila humana, sem
295
+ // mensagem ao cliente.
296
+ if (step.tone === 'human_escalation') {
297
+ await markEscalated(tx, action.id);
298
+ report.escalated += 1;
299
+ continue;
300
+ }
301
+ // Caminho ÚNICO. Não há alternativa: `ctx.communication` é obrigatório, e o
302
+ // registry legado de canais saiu do contexto. Enquanto existiam dois, o
303
+ // cron e a rota manual enviavam por vias com idempotências diferentes que
304
+ // não se enxergavam — `LEGACY_SHARED_COEXISTENCE=BLOCKING` na certificação.
305
+ report.attempted += 1;
306
+ const applied = await sendViaSharedEngine(tx, ctx, ctx.communication, action, current, step);
307
+ report.sent += applied.sent;
308
+ report.escalated += applied.escalated;
309
+ report.skippedNoChannel += applied.skippedNoChannel;
310
+ report.failedPermanent += applied.failedPermanent;
311
+ report.failedTemporary += applied.failedTemporary;
312
+ if (applied.notAttempted)
313
+ report.attempted -= 1;
314
+ }
315
+ return report;
316
+ }
317
+ /** Ciclo completo — o que o job roda. */
318
+ export async function runCollectionCycle(tx, ctx, today) {
319
+ const policy = await getCollectionPolicy(tx);
320
+ const plan = await planCollections(tx, today, policy);
321
+ const exec = await executeCollections(tx, ctx, today, policy);
322
+ return { ...plan, ...exec };
323
+ }
324
+ /**
325
+ * Desliga a régua de um recebível que acabou de ser quitado.
326
+ *
327
+ * Existe porque a baixa passou a ter dois caminhos: o job diário, que varre
328
+ * todos os recebíveis, e o webhook, que sabe exatamente qual foi pago. Sem esta
329
+ * função o webhook baixaria o valor e deixaria a comunicação agendada — o
330
+ * cliente pagaria e receberia a cobrança de atraso mesmo assim, que é a pior
331
+ * falha possível numa régua automática.
332
+ *
333
+ * Só o que ainda não saiu é cancelado. Mensagem enviada é histórico.
334
+ */
335
+ export async function cancelDunningForSettled(tx, receivableId) {
336
+ return cancelPendingActions(tx, receivableId, 'paid');
337
+ }
338
+ /**
339
+ * Religa a régua de um recebível cuja liquidação foi anulada.
340
+ *
341
+ * Sem isto, corrigir o saldo não bastaria: `planCollections` não reagenda um
342
+ * passo cujo `step_key` já existe na tabela — a idempotência olha a EXISTÊNCIA
343
+ * da linha, não o status dela. Os passos desligados pela baixa ficariam
344
+ * `canceled` para sempre, e o cliente voltaria a dever sem que ninguém jamais o
345
+ * lembrasse. O saldo estaria certo e a cobrança nunca aconteceria.
346
+ *
347
+ * Reabre **somente** o que foi fechado POR PAGAMENTO. Um passo cancelado porque
348
+ * o recebível foi cancelado, ou já enviado, é história e permanece intocado —
349
+ * reabrir tudo faria a régua reenviar mensagem que o cliente já recebeu.
350
+ */
351
+ /**
352
+ * Religa etapas fechadas por FALHA DE INFRAESTRUTURA, nunca por decisão humana.
353
+ *
354
+ * Existe para o resíduo do incidente C1-PROV-R1B-C2: etapas que o motor fechou
355
+ * como `escalated` porque o canal ficou indisponível (cofre de credenciais fora
356
+ * do ar). A correção em `sendViaSharedEngine` impede que isso volte a
357
+ * acontecer, mas não desfaz o que já foi fechado — e nada mais no domínio
358
+ * consegue, porque `planCollections` não reagenda um `step_key` existente e
359
+ * `listActions` só enxerga `scheduled`.
360
+ *
361
+ * As guardas são deliberadamente estreitas, e cada uma exclui uma classe:
362
+ *
363
+ * - `closed_reason = 'escalated'` — deixa de fora `no_contact_data`,
364
+ * `opted_out`, `consent_unknown`, `paid`, `canceled`, `rule_disabled` e
365
+ * `permanent_failure`. Todas são decisão de negócio e permanecem terminais.
366
+ * - `attempts = 0` — `markEscalated` NUNCA incrementa `attempts`, enquanto
367
+ * `markSent` e `markFailed` sempre incrementam. Zero prova que nenhum adapter
368
+ * chegou a tentar.
369
+ * - `provider_ref IS NULL` e `sent_at IS NULL` — prova que nada saiu. Uma
370
+ * mensagem entregue jamais é reaberta, e o cliente nunca recebe duplicata.
371
+ *
372
+ * O `step_key` é obrigatório: recuperação é pontual e auditável, nunca
373
+ * "reabra tudo deste recebível".
374
+ *
375
+ * O histórico da falha NÃO é apagado. `communication_event`
376
+ * (`dispatch_skipped` / `no_credential`) e `communication_dispatch`
377
+ * (`failed_retryable`) continuam intactos — esta função move apenas o estado da
378
+ * régua, e `last_error` registra a origem da reabertura.
379
+ */
380
+ export async function rearmDunningAfterInfraFailure(tx, receivableId, stepKey, incidentRef) {
381
+ const rows = await tx `
382
+ UPDATE dunning_event
383
+ SET status = 'scheduled', closed_at = NULL, closed_reason = NULL,
384
+ last_error = ${`infra_failure_recovery:${incidentRef}`.slice(0, 300)}
385
+ WHERE receivable_id = ${receivableId}
386
+ AND step_key = ${stepKey}
387
+ AND status = 'escalated'
388
+ AND closed_reason = 'escalated'
389
+ AND attempts = 0
390
+ AND provider_ref IS NULL
391
+ AND sent_at IS NULL
392
+ RETURNING id
393
+ `;
394
+ return rows.length;
395
+ }
396
+ export async function rearmDunningAfterReversal(tx, receivableId) {
397
+ const rows = await tx `
398
+ UPDATE dunning_event
399
+ SET status = 'scheduled', closed_at = NULL, closed_reason = NULL
400
+ WHERE receivable_id = ${receivableId}
401
+ AND status = 'canceled'
402
+ AND closed_reason = 'paid'
403
+ RETURNING id
404
+ `;
405
+ return rows.length;
406
+ }
407
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/collection/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Apresentação para o cliente final.
3
+ *
4
+ * O armazenamento continua canônico — `date` ISO no banco, `numeric(14,2)` no
5
+ * valor. Isto aqui é só a camada de leitura humana: um contribuinte brasileiro
6
+ * lê "15/08/2026", não "2026-08-15", e converter no ponto de exibição evita
7
+ * mexer no dado por causa de idioma.
8
+ */
9
+ /** `2026-08-15` → `15/08/2026`. Entrada inválida volta como veio. */
10
+ export declare function formatDateBR(iso: string | null | undefined): string;
11
+ /**
12
+ * Valor monetário em pt-BR.
13
+ *
14
+ * `Intl` normalmente devolve espaço não separável entre "R$" e o número, o que
15
+ * costuma virar caractere estranho em cliente de e-mail antigo. Montamos o
16
+ * texto à mão para garantir "R$ 1.234,56" em qualquer leitor.
17
+ */
18
+ export declare function formatBRL(value: number): string;
19
+ /** Dias de atraso em linguagem natural. */
20
+ export declare function formatOverdue(days: number): string;
21
+ /**
22
+ * Como a dívida é identificada para o cliente.
23
+ *
24
+ * "Referência: serviço avulso" não diz nada a quem recebe. Com competência,
25
+ * dizemos o mês; sem ela, usamos a descrição do que foi contratado. Nada é
26
+ * inventado — se não houver nem uma nem outra, o campo simplesmente não aparece.
27
+ */
28
+ export declare function describeReference(input: {
29
+ competence?: string | null;
30
+ description?: string | null;
31
+ }): string | null;
32
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/collection/format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAInE;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED,2CAA2C;AAC3C,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,GAAG,MAAM,GAAG,IAAI,CAwBhB"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Apresentação para o cliente final.
3
+ *
4
+ * O armazenamento continua canônico — `date` ISO no banco, `numeric(14,2)` no
5
+ * valor. Isto aqui é só a camada de leitura humana: um contribuinte brasileiro
6
+ * lê "15/08/2026", não "2026-08-15", e converter no ponto de exibição evita
7
+ * mexer no dado por causa de idioma.
8
+ */
9
+ /** `2026-08-15` → `15/08/2026`. Entrada inválida volta como veio. */
10
+ export function formatDateBR(iso) {
11
+ if (!iso)
12
+ return '—';
13
+ const m = /^(\d{4})-(\d{2})-(\d{2})/.exec(iso);
14
+ return m ? `${m[3]}/${m[2]}/${m[1]}` : iso;
15
+ }
16
+ /**
17
+ * Valor monetário em pt-BR.
18
+ *
19
+ * `Intl` normalmente devolve espaço não separável entre "R$" e o número, o que
20
+ * costuma virar caractere estranho em cliente de e-mail antigo. Montamos o
21
+ * texto à mão para garantir "R$ 1.234,56" em qualquer leitor.
22
+ */
23
+ export function formatBRL(value) {
24
+ const fixed = Math.abs(value).toFixed(2);
25
+ const [int, dec] = fixed.split('.');
26
+ const withThousands = int.replace(/\B(?=(\d{3})+(?!\d))/g, '.');
27
+ return `${value < 0 ? '-' : ''}R$ ${withThousands},${dec}`;
28
+ }
29
+ /** Dias de atraso em linguagem natural. */
30
+ export function formatOverdue(days) {
31
+ if (days <= 0)
32
+ return '';
33
+ if (days === 1)
34
+ return 'há 1 dia';
35
+ return `há ${days} dias`;
36
+ }
37
+ /**
38
+ * Como a dívida é identificada para o cliente.
39
+ *
40
+ * "Referência: serviço avulso" não diz nada a quem recebe. Com competência,
41
+ * dizemos o mês; sem ela, usamos a descrição do que foi contratado. Nada é
42
+ * inventado — se não houver nem uma nem outra, o campo simplesmente não aparece.
43
+ */
44
+ export function describeReference(input) {
45
+ if (input.competence) {
46
+ const m = /^(\d{4})-(\d{2})$/.exec(input.competence);
47
+ if (m) {
48
+ const meses = [
49
+ 'janeiro',
50
+ 'fevereiro',
51
+ 'março',
52
+ 'abril',
53
+ 'maio',
54
+ 'junho',
55
+ 'julho',
56
+ 'agosto',
57
+ 'setembro',
58
+ 'outubro',
59
+ 'novembro',
60
+ 'dezembro',
61
+ ];
62
+ const idx = Number(m[2]) - 1;
63
+ if (idx >= 0 && idx < 12)
64
+ return `honorários de ${meses[idx]} de ${m[1]}`;
65
+ }
66
+ return `competência ${input.competence}`;
67
+ }
68
+ return input.description?.trim() || null;
69
+ }
70
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/collection/format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qEAAqE;AACrE,MAAM,UAAU,YAAY,CAAC,GAA8B;IACzD,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,MAAM,CAAC,GAAG,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IACxD,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;IAChE,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,aAAa,IAAI,GAAG,EAAE,CAAC;AAC7D,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACzB,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IAClC,OAAO,MAAM,IAAI,OAAO,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAGjC;IACC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,KAAK,GAAG;gBACZ,SAAS;gBACT,WAAW;gBACX,OAAO;gBACP,OAAO;gBACP,MAAM;gBACN,OAAO;gBACP,OAAO;gBACP,QAAQ;gBACR,UAAU;gBACV,SAAS;gBACT,UAAU;gBACV,UAAU;aACX,CAAC;YACF,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE;gBAAE,OAAO,iBAAiB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,CAAC;QACD,OAAO,eAAe,KAAK,CAAC,UAAU,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Como o cliente paga — a verdade financeira que qualquer canal entrega.
3
+ *
4
+ * Mora aqui, e não no layout do e-mail, porque não é assunto do e-mail. O
5
+ * mesmo bloco alimenta WhatsApp, portal ou qualquer canal futuro: o motor de
6
+ * cobrança resolve o pagamento uma vez por recebível (`resolvePayment`), e cada
7
+ * canal decide como apresentar.
8
+ *
9
+ * A separação importa na prática: um canal que precisasse importar de
10
+ * `email-layout.ts` acabaria herdando decisões de renderização de e-mail — e a
11
+ * primeira regra de negócio duplicada dentro do canal seria a próxima.
12
+ *
13
+ * Tudo opcional porque cada gateway (e cada método) entrega um subconjunto
14
+ * diferente. Quem renderiza mostra o que veio; nada é inventado para preencher.
15
+ */
16
+ export interface PaymentBlock {
17
+ /** Destino do CTA. Sem ele não há botão: um "Pagar agora" que não paga é pior que nada. */
18
+ url?: string;
19
+ pixPayload?: string;
20
+ pixQrCodeImage?: string;
21
+ boletoUrl?: string;
22
+ identificationField?: string;
23
+ }
24
+ //# sourceMappingURL=payment-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-block.d.ts","sourceRoot":"","sources":["../../src/collection/payment-block.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,YAAY;IAC3B,2FAA2F;IAC3F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=payment-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-block.js","sourceRoot":"","sources":["../../src/collection/payment-block.ts"],"names":[],"mappings":""}
@@ -0,0 +1,53 @@
1
+ import type { CollectionChannelKey } from './channel.js';
2
+ /**
3
+ * Política de cobrança do escritório.
4
+ *
5
+ * Os offsets são RELATIVOS ao vencimento e vivem em `dunning_rule.steps` (jsonb,
6
+ * por tenant) — nenhum dia está no código. O padrão abaixo é ponto de partida
7
+ * para quem ainda não configurou nada, jamais política imposta.
8
+ */
9
+ export type StepTiming = 'before_due' | 'on_due_date' | 'after_due';
10
+ /** Tom da etapa. Governa o template, e serve de guarda contra escalada indevida. */
11
+ export type StepTone = 'reminder' | 'due_notice' | 'friendly_collection' | 'overdue_collection' | 'human_escalation';
12
+ export interface CollectionStep {
13
+ /** Chave estável — é o que garante idempotência. Mudar isto reexecuta a etapa. */
14
+ key: string;
15
+ timing: StepTiming;
16
+ /** Dias de distância do vencimento. Sempre positivo; `timing` dá o sinal. */
17
+ offsetDays: number;
18
+ channel: CollectionChannelKey;
19
+ tone: StepTone;
20
+ templateKey: string;
21
+ active?: boolean;
22
+ }
23
+ export interface CollectionPolicy {
24
+ id: string | null;
25
+ name: string;
26
+ steps: CollectionStep[];
27
+ active: boolean;
28
+ }
29
+ /**
30
+ * Régua padrão — sugestão, não regra do produto.
31
+ *
32
+ * Para a última etapa o canal é `notification`: escalar para humano é um evento
33
+ * INTERNO. Mandar ao cliente uma mensagem dizendo que o caso foi escalado seria
34
+ * transformar procedimento interno em pressão, e é exatamente onde cobrança
35
+ * automatizada vira problema jurídico e de relacionamento.
36
+ */
37
+ export declare const DEFAULT_COLLECTION_STEPS: readonly CollectionStep[];
38
+ export declare const DEFAULT_POLICY: CollectionPolicy;
39
+ /** Data em que a etapa deve acontecer, dado o vencimento. */
40
+ export declare function scheduledDateFor(step: CollectionStep, dueDate: string): string;
41
+ /**
42
+ * Etapas já devidas em `today` e ainda não registradas.
43
+ *
44
+ * Pura e determinística: recebe o que já foi executado e devolve o que falta.
45
+ * Nenhum I/O — é o que permite testar a régua inteira sem banco nem provider.
46
+ */
47
+ export declare function dueSteps(policy: CollectionPolicy, dueDate: string, today: string, alreadyHandled: ReadonlySet<string>): {
48
+ step: CollectionStep;
49
+ scheduledFor: string;
50
+ }[];
51
+ /** Validação de política vinda do banco — protege contra jsonb malformado. */
52
+ export declare function parsePolicySteps(raw: unknown): CollectionStep[];
53
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/collection/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;;GAMG;AAEH,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,CAAC;AAEpE,oFAAoF;AACpF,MAAM,MAAM,QAAQ,GAClB,UAAU,GAAG,YAAY,GAAG,qBAAqB,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;AAEhG,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,UAAU,CAAC;IACnB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,cAAc,EAiD7D,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,gBAK5B,CAAC;AAQF,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ9E;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,GAClC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAAE,CAQlD;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,EAAE,CAuC/D"}