@baruk/core 0.3.0 → 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 (708) hide show
  1. package/.baruk-provenance.json +10 -0
  2. package/CHANGELOG.md +97 -0
  3. package/README.md +9 -2
  4. package/dist/auth/password-reset.d.ts +30 -1
  5. package/dist/auth/password-reset.d.ts.map +1 -1
  6. package/dist/auth/password-reset.js +139 -11
  7. package/dist/auth/password-reset.js.map +1 -1
  8. package/dist/auth/service.d.ts +39 -2
  9. package/dist/auth/service.d.ts.map +1 -1
  10. package/dist/auth/service.js +75 -10
  11. package/dist/auth/service.js.map +1 -1
  12. package/dist/billing/ar-repository.d.ts +334 -0
  13. package/dist/billing/ar-repository.d.ts.map +1 -0
  14. package/dist/billing/ar-repository.js +707 -0
  15. package/dist/billing/ar-repository.js.map +1 -0
  16. package/dist/billing/auto-generation.d.ts +87 -0
  17. package/dist/billing/auto-generation.d.ts.map +1 -0
  18. package/dist/billing/auto-generation.js +181 -0
  19. package/dist/billing/auto-generation.js.map +1 -0
  20. package/dist/billing/live-guard.d.ts +64 -0
  21. package/dist/billing/live-guard.d.ts.map +1 -0
  22. package/dist/billing/live-guard.js +68 -0
  23. package/dist/billing/live-guard.js.map +1 -0
  24. package/dist/billing/payment-means-catalog.d.ts +17 -0
  25. package/dist/billing/payment-means-catalog.d.ts.map +1 -0
  26. package/dist/billing/payment-means-catalog.js +21 -0
  27. package/dist/billing/payment-means-catalog.js.map +1 -0
  28. package/dist/billing/payment-means.d.ts +38 -0
  29. package/dist/billing/payment-means.d.ts.map +1 -0
  30. package/dist/billing/payment-means.js +29 -0
  31. package/dist/billing/payment-means.js.map +1 -0
  32. package/dist/billing/payment-rail.d.ts +118 -0
  33. package/dist/billing/payment-rail.d.ts.map +1 -0
  34. package/dist/billing/payment-rail.js +295 -0
  35. package/dist/billing/payment-rail.js.map +1 -0
  36. package/dist/billing/provider/asaas.d.ts +46 -1
  37. package/dist/billing/provider/asaas.d.ts.map +1 -1
  38. package/dist/billing/provider/asaas.js +194 -14
  39. package/dist/billing/provider/asaas.js.map +1 -1
  40. package/dist/billing/provider/manual.js +1 -1
  41. package/dist/billing/provider/manual.js.map +1 -1
  42. package/dist/billing/provider/types.d.ts +115 -8
  43. package/dist/billing/provider/types.d.ts.map +1 -1
  44. package/dist/billing/provider-account.d.ts +89 -0
  45. package/dist/billing/provider-account.d.ts.map +1 -0
  46. package/dist/billing/provider-account.js +161 -0
  47. package/dist/billing/provider-account.js.map +1 -0
  48. package/dist/billing/provider-onboarding.d.ts +67 -0
  49. package/dist/billing/provider-onboarding.d.ts.map +1 -0
  50. package/dist/billing/provider-onboarding.js +234 -0
  51. package/dist/billing/provider-onboarding.js.map +1 -0
  52. package/dist/billing/receivable.d.ts +5 -1
  53. package/dist/billing/receivable.d.ts.map +1 -1
  54. package/dist/billing/reconcile.d.ts +58 -0
  55. package/dist/billing/reconcile.d.ts.map +1 -0
  56. package/dist/billing/reconcile.js +138 -0
  57. package/dist/billing/reconcile.js.map +1 -0
  58. package/dist/billing/repository.d.ts +90 -1
  59. package/dist/billing/repository.d.ts.map +1 -1
  60. package/dist/billing/repository.js +148 -19
  61. package/dist/billing/repository.js.map +1 -1
  62. package/dist/cjs/auth/password-reset.js +141 -11
  63. package/dist/cjs/auth/password-reset.js.map +1 -1
  64. package/dist/cjs/auth/service.js +75 -9
  65. package/dist/cjs/auth/service.js.map +1 -1
  66. package/dist/cjs/billing/ar-repository.js +728 -0
  67. package/dist/cjs/billing/ar-repository.js.map +1 -0
  68. package/dist/cjs/billing/auto-generation.js +186 -0
  69. package/dist/cjs/billing/auto-generation.js.map +1 -0
  70. package/dist/cjs/billing/live-guard.js +72 -0
  71. package/dist/cjs/billing/live-guard.js.map +1 -0
  72. package/dist/cjs/billing/payment-means-catalog.js +25 -0
  73. package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
  74. package/dist/cjs/billing/payment-means.js +33 -0
  75. package/dist/cjs/billing/payment-means.js.map +1 -0
  76. package/dist/cjs/billing/payment-rail.js +301 -0
  77. package/dist/cjs/billing/payment-rail.js.map +1 -0
  78. package/dist/cjs/billing/provider/asaas.js +194 -14
  79. package/dist/cjs/billing/provider/asaas.js.map +1 -1
  80. package/dist/cjs/billing/provider/manual.js +1 -1
  81. package/dist/cjs/billing/provider/manual.js.map +1 -1
  82. package/dist/cjs/billing/provider-account.js +170 -0
  83. package/dist/cjs/billing/provider-account.js.map +1 -0
  84. package/dist/cjs/billing/provider-onboarding.js +239 -0
  85. package/dist/cjs/billing/provider-onboarding.js.map +1 -0
  86. package/dist/cjs/billing/reconcile.js +143 -0
  87. package/dist/cjs/billing/reconcile.js.map +1 -0
  88. package/dist/cjs/billing/repository.js +150 -18
  89. package/dist/cjs/billing/repository.js.map +1 -1
  90. package/dist/cjs/clients/repository.js +96 -20
  91. package/dist/cjs/clients/repository.js.map +1 -1
  92. package/dist/cjs/collection/branding.js +140 -0
  93. package/dist/cjs/collection/branding.js.map +1 -0
  94. package/dist/cjs/collection/channel-accounts.js +137 -0
  95. package/dist/cjs/collection/channel-accounts.js.map +1 -0
  96. package/dist/cjs/collection/channel.js +17 -0
  97. package/dist/cjs/collection/channel.js.map +1 -0
  98. package/dist/cjs/collection/communication-bridge.js +140 -0
  99. package/dist/cjs/collection/communication-bridge.js.map +1 -0
  100. package/dist/cjs/collection/communication-runtime.js +193 -0
  101. package/dist/cjs/collection/communication-runtime.js.map +1 -0
  102. package/dist/cjs/collection/consent-repository.js +84 -0
  103. package/dist/cjs/collection/consent-repository.js.map +1 -0
  104. package/dist/cjs/collection/copy.js +125 -0
  105. package/dist/cjs/collection/copy.js.map +1 -0
  106. package/dist/cjs/collection/delivery-callback.js +151 -0
  107. package/dist/cjs/collection/delivery-callback.js.map +1 -0
  108. package/dist/cjs/collection/email-layout.js +252 -0
  109. package/dist/cjs/collection/email-layout.js.map +1 -0
  110. package/dist/cjs/collection/engine.js +414 -0
  111. package/dist/cjs/collection/engine.js.map +1 -0
  112. package/dist/cjs/collection/format.js +76 -0
  113. package/dist/cjs/collection/format.js.map +1 -0
  114. package/dist/cjs/collection/payment-block.js +3 -0
  115. package/dist/cjs/collection/payment-block.js.map +1 -0
  116. package/dist/cjs/collection/policy.js +147 -0
  117. package/dist/cjs/collection/policy.js.map +1 -0
  118. package/dist/cjs/collection/repository.js +260 -0
  119. package/dist/cjs/collection/repository.js.map +1 -0
  120. package/dist/cjs/collection/subject.js +104 -0
  121. package/dist/cjs/collection/subject.js.map +1 -0
  122. package/dist/cjs/collection/template-catalog.js +165 -0
  123. package/dist/cjs/collection/template-catalog.js.map +1 -0
  124. package/dist/cjs/collection/template.js +78 -0
  125. package/dist/cjs/collection/template.js.map +1 -0
  126. package/dist/cjs/communication/adapters/email.js +132 -0
  127. package/dist/cjs/communication/adapters/email.js.map +1 -0
  128. package/dist/cjs/communication/adapters/sms.js +127 -0
  129. package/dist/cjs/communication/adapters/sms.js.map +1 -0
  130. package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
  131. package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
  132. package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
  133. package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
  134. package/dist/cjs/communication/adapters/whatsapp.js +213 -0
  135. package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
  136. package/dist/cjs/communication/audit.js +61 -0
  137. package/dist/cjs/communication/audit.js.map +1 -0
  138. package/dist/cjs/communication/capabilities.js +76 -0
  139. package/dist/cjs/communication/capabilities.js.map +1 -0
  140. package/dist/cjs/communication/channel.js +53 -0
  141. package/dist/cjs/communication/channel.js.map +1 -0
  142. package/dist/cjs/communication/claim.js +228 -0
  143. package/dist/cjs/communication/claim.js.map +1 -0
  144. package/dist/cjs/communication/consent.js +43 -0
  145. package/dist/cjs/communication/consent.js.map +1 -0
  146. package/dist/cjs/communication/context.js +45 -0
  147. package/dist/cjs/communication/context.js.map +1 -0
  148. package/dist/cjs/communication/credentials.js +121 -0
  149. package/dist/cjs/communication/credentials.js.map +1 -0
  150. package/dist/cjs/communication/dry-run-scenario.js +161 -0
  151. package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
  152. package/dist/cjs/communication/dry-run.js +97 -0
  153. package/dist/cjs/communication/dry-run.js.map +1 -0
  154. package/dist/cjs/communication/engine.js +483 -0
  155. package/dist/cjs/communication/engine.js.map +1 -0
  156. package/dist/cjs/communication/graph.js +50 -0
  157. package/dist/cjs/communication/graph.js.map +1 -0
  158. package/dist/cjs/communication/idempotency.js +26 -0
  159. package/dist/cjs/communication/idempotency.js.map +1 -0
  160. package/dist/cjs/communication/identity.js +110 -0
  161. package/dist/cjs/communication/identity.js.map +1 -0
  162. package/dist/cjs/communication/index.js +135 -0
  163. package/dist/cjs/communication/index.js.map +1 -0
  164. package/dist/cjs/communication/onboarding.js +297 -0
  165. package/dist/cjs/communication/onboarding.js.map +1 -0
  166. package/dist/cjs/communication/policy.js +16 -0
  167. package/dist/cjs/communication/policy.js.map +1 -0
  168. package/dist/cjs/communication/routing.js +77 -0
  169. package/dist/cjs/communication/routing.js.map +1 -0
  170. package/dist/cjs/communication/sender-profile.js +128 -0
  171. package/dist/cjs/communication/sender-profile.js.map +1 -0
  172. package/dist/cjs/communication/status.js +86 -0
  173. package/dist/cjs/communication/status.js.map +1 -0
  174. package/dist/cjs/communication/stores/onboarding.js +135 -0
  175. package/dist/cjs/communication/stores/onboarding.js.map +1 -0
  176. package/dist/cjs/communication/stores/postgres.js +458 -0
  177. package/dist/cjs/communication/stores/postgres.js.map +1 -0
  178. package/dist/cjs/communication/stores/routing.js +334 -0
  179. package/dist/cjs/communication/stores/routing.js.map +1 -0
  180. package/dist/cjs/communication/stores/secrets.js +126 -0
  181. package/dist/cjs/communication/stores/secrets.js.map +1 -0
  182. package/dist/cjs/communication/template-provider.js +22 -0
  183. package/dist/cjs/communication/template-provider.js.map +1 -0
  184. package/dist/cjs/communication/template.js +63 -0
  185. package/dist/cjs/communication/template.js.map +1 -0
  186. package/dist/cjs/communication/webhook-subscription.js +258 -0
  187. package/dist/cjs/communication/webhook-subscription.js.map +1 -0
  188. package/dist/cjs/communication/webhook.js +292 -0
  189. package/dist/cjs/communication/webhook.js.map +1 -0
  190. package/dist/cjs/competence/repository.js +309 -0
  191. package/dist/cjs/competence/repository.js.map +1 -0
  192. package/dist/cjs/contacts/phone.js +192 -0
  193. package/dist/cjs/contacts/phone.js.map +1 -0
  194. package/dist/cjs/db/seed-catalog.js +48 -0
  195. package/dist/cjs/db/seed-catalog.js.map +1 -0
  196. package/dist/cjs/db/seed.js +15 -7
  197. package/dist/cjs/db/seed.js.map +1 -1
  198. package/dist/cjs/documents/repository.js +244 -0
  199. package/dist/cjs/documents/repository.js.map +1 -0
  200. package/dist/cjs/documents/requests.js +136 -0
  201. package/dist/cjs/documents/requests.js.map +1 -0
  202. package/dist/cjs/index.js +427 -48
  203. package/dist/cjs/index.js.map +1 -1
  204. package/dist/cjs/legal/company.js +36 -0
  205. package/dist/cjs/legal/company.js.map +1 -0
  206. package/dist/cjs/legal/documents.js +671 -0
  207. package/dist/cjs/legal/documents.js.map +1 -0
  208. package/dist/cjs/legal/index.js +15 -0
  209. package/dist/cjs/legal/index.js.map +1 -0
  210. package/dist/cjs/legal/types.js +34 -0
  211. package/dist/cjs/legal/types.js.map +1 -0
  212. package/dist/cjs/mail/auth-templates.js +29 -0
  213. package/dist/cjs/mail/auth-templates.js.map +1 -0
  214. package/dist/cjs/mail/dedup-store.js +12 -51
  215. package/dist/cjs/mail/dedup-store.js.map +1 -1
  216. package/dist/cjs/mail/index.js +16 -4
  217. package/dist/cjs/mail/index.js.map +1 -1
  218. package/dist/cjs/mail/provider.js +12 -247
  219. package/dist/cjs/mail/provider.js.map +1 -1
  220. package/dist/cjs/mail/resend.js +14 -18
  221. package/dist/cjs/mail/resend.js.map +1 -1
  222. package/dist/cjs/mail/sender-resolver.js +12 -11
  223. package/dist/cjs/mail/sender-resolver.js.map +1 -1
  224. package/dist/cjs/mail/template-renderer.js +11 -16
  225. package/dist/cjs/mail/template-renderer.js.map +1 -1
  226. package/dist/cjs/mail/transactional-outbound.js +117 -0
  227. package/dist/cjs/mail/transactional-outbound.js.map +1 -0
  228. package/dist/cjs/mail/types.js +8 -35
  229. package/dist/cjs/mail/types.js.map +1 -1
  230. package/dist/cjs/portal/provisioning.js +144 -0
  231. package/dist/cjs/portal/provisioning.js.map +1 -0
  232. package/dist/cjs/pricing-engine/canonical.js +42 -0
  233. package/dist/cjs/pricing-engine/canonical.js.map +1 -0
  234. package/dist/cjs/pricing-engine/errors.js +6 -1
  235. package/dist/cjs/pricing-engine/errors.js.map +1 -1
  236. package/dist/cjs/pricing-engine/index.js +12 -1
  237. package/dist/cjs/pricing-engine/index.js.map +1 -1
  238. package/dist/cjs/pricing-engine/pipeline.js +200 -26
  239. package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
  240. package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
  241. package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
  242. package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
  243. package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
  244. package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
  245. package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
  246. package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
  247. package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
  248. package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
  249. package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
  250. package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
  251. package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
  252. package/dist/cjs/rbac/authorize.js +28 -0
  253. package/dist/cjs/rbac/authorize.js.map +1 -1
  254. package/dist/cjs/rbac/catalog.js +67 -1
  255. package/dist/cjs/rbac/catalog.js.map +1 -1
  256. package/dist/cjs/rbac/workload-provisioning.js +160 -0
  257. package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
  258. package/dist/cjs/rbac/workload.js +191 -0
  259. package/dist/cjs/rbac/workload.js.map +1 -0
  260. package/dist/cjs/storage/checksum.js +15 -0
  261. package/dist/cjs/storage/checksum.js.map +1 -0
  262. package/dist/cjs/storage/key.js +72 -0
  263. package/dist/cjs/storage/key.js.map +1 -0
  264. package/dist/cjs/storage/local.js +100 -0
  265. package/dist/cjs/storage/local.js.map +1 -0
  266. package/dist/cjs/storage/r2.js +181 -0
  267. package/dist/cjs/storage/r2.js.map +1 -0
  268. package/dist/cjs/storage/registry.js +41 -0
  269. package/dist/cjs/storage/registry.js.map +1 -0
  270. package/dist/cjs/storage/types.js +50 -0
  271. package/dist/cjs/storage/types.js.map +1 -0
  272. package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
  273. package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
  274. package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
  275. package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
  276. package/dist/cjs/subscription-billing/provider/registry.js +17 -0
  277. package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
  278. package/dist/cjs/subscription-billing/service.js +57 -8
  279. package/dist/cjs/subscription-billing/service.js.map +1 -1
  280. package/dist/cjs/subscription-billing/types.js.map +1 -1
  281. package/dist/cjs/tenancy/provisioning.js +32 -8
  282. package/dist/cjs/tenancy/provisioning.js.map +1 -1
  283. package/dist/cjs/users/repository.js +119 -2
  284. package/dist/cjs/users/repository.js.map +1 -1
  285. package/dist/cjs/vault/repository.js +81 -0
  286. package/dist/cjs/vault/repository.js.map +1 -1
  287. package/dist/clients/repository.d.ts +42 -0
  288. package/dist/clients/repository.d.ts.map +1 -1
  289. package/dist/clients/repository.js +94 -21
  290. package/dist/clients/repository.js.map +1 -1
  291. package/dist/collection/branding.d.ts +72 -0
  292. package/dist/collection/branding.d.ts.map +1 -0
  293. package/dist/collection/branding.js +136 -0
  294. package/dist/collection/branding.js.map +1 -0
  295. package/dist/collection/channel-accounts.d.ts +57 -0
  296. package/dist/collection/channel-accounts.d.ts.map +1 -0
  297. package/dist/collection/channel-accounts.js +133 -0
  298. package/dist/collection/channel-accounts.js.map +1 -0
  299. package/dist/collection/channel.d.ts +24 -0
  300. package/dist/collection/channel.d.ts.map +1 -0
  301. package/dist/collection/channel.js +16 -0
  302. package/dist/collection/channel.js.map +1 -0
  303. package/dist/collection/communication-bridge.d.ts +66 -0
  304. package/dist/collection/communication-bridge.d.ts.map +1 -0
  305. package/dist/collection/communication-bridge.js +134 -0
  306. package/dist/collection/communication-bridge.js.map +1 -0
  307. package/dist/collection/communication-runtime.d.ts +95 -0
  308. package/dist/collection/communication-runtime.d.ts.map +1 -0
  309. package/dist/collection/communication-runtime.js +187 -0
  310. package/dist/collection/communication-runtime.js.map +1 -0
  311. package/dist/collection/consent-repository.d.ts +32 -0
  312. package/dist/collection/consent-repository.d.ts.map +1 -0
  313. package/dist/collection/consent-repository.js +79 -0
  314. package/dist/collection/consent-repository.js.map +1 -0
  315. package/dist/collection/copy.d.ts +50 -0
  316. package/dist/collection/copy.d.ts.map +1 -0
  317. package/dist/collection/copy.js +122 -0
  318. package/dist/collection/copy.js.map +1 -0
  319. package/dist/collection/delivery-callback.d.ts +49 -0
  320. package/dist/collection/delivery-callback.d.ts.map +1 -0
  321. package/dist/collection/delivery-callback.js +147 -0
  322. package/dist/collection/delivery-callback.js.map +1 -0
  323. package/dist/collection/email-layout.d.ts +45 -0
  324. package/dist/collection/email-layout.d.ts.map +1 -0
  325. package/dist/collection/email-layout.js +247 -0
  326. package/dist/collection/email-layout.js.map +1 -0
  327. package/dist/collection/engine.d.ts +177 -0
  328. package/dist/collection/engine.d.ts.map +1 -0
  329. package/dist/collection/engine.js +407 -0
  330. package/dist/collection/engine.js.map +1 -0
  331. package/dist/collection/format.d.ts +32 -0
  332. package/dist/collection/format.d.ts.map +1 -0
  333. package/dist/collection/format.js +70 -0
  334. package/dist/collection/format.js.map +1 -0
  335. package/dist/collection/payment-block.d.ts +24 -0
  336. package/dist/collection/payment-block.d.ts.map +1 -0
  337. package/dist/collection/payment-block.js +2 -0
  338. package/dist/collection/payment-block.js.map +1 -0
  339. package/dist/collection/policy.d.ts +53 -0
  340. package/dist/collection/policy.d.ts.map +1 -0
  341. package/dist/collection/policy.js +141 -0
  342. package/dist/collection/policy.js.map +1 -0
  343. package/dist/collection/repository.d.ts +129 -0
  344. package/dist/collection/repository.d.ts.map +1 -0
  345. package/dist/collection/repository.js +246 -0
  346. package/dist/collection/repository.js.map +1 -0
  347. package/dist/collection/subject.d.ts +66 -0
  348. package/dist/collection/subject.d.ts.map +1 -0
  349. package/dist/collection/subject.js +99 -0
  350. package/dist/collection/subject.js.map +1 -0
  351. package/dist/collection/template-catalog.d.ts +16 -0
  352. package/dist/collection/template-catalog.d.ts.map +1 -0
  353. package/dist/collection/template-catalog.js +162 -0
  354. package/dist/collection/template-catalog.js.map +1 -0
  355. package/dist/collection/template.d.ts +37 -0
  356. package/dist/collection/template.d.ts.map +1 -0
  357. package/dist/collection/template.js +73 -0
  358. package/dist/collection/template.js.map +1 -0
  359. package/dist/communication/adapters/email.d.ts +28 -0
  360. package/dist/communication/adapters/email.d.ts.map +1 -0
  361. package/dist/communication/adapters/email.js +129 -0
  362. package/dist/communication/adapters/email.js.map +1 -0
  363. package/dist/communication/adapters/sms.d.ts +95 -0
  364. package/dist/communication/adapters/sms.d.ts.map +1 -0
  365. package/dist/communication/adapters/sms.js +121 -0
  366. package/dist/communication/adapters/sms.js.map +1 -0
  367. package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
  368. package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
  369. package/dist/communication/adapters/whatsapp-language.js +36 -0
  370. package/dist/communication/adapters/whatsapp-language.js.map +1 -0
  371. package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
  372. package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
  373. package/dist/communication/adapters/whatsapp-templates.js +97 -0
  374. package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
  375. package/dist/communication/adapters/whatsapp.d.ts +29 -0
  376. package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
  377. package/dist/communication/adapters/whatsapp.js +210 -0
  378. package/dist/communication/adapters/whatsapp.js.map +1 -0
  379. package/dist/communication/audit.d.ts +105 -0
  380. package/dist/communication/audit.d.ts.map +1 -0
  381. package/dist/communication/audit.js +56 -0
  382. package/dist/communication/audit.js.map +1 -0
  383. package/dist/communication/capabilities.d.ts +88 -0
  384. package/dist/communication/capabilities.d.ts.map +1 -0
  385. package/dist/communication/capabilities.js +72 -0
  386. package/dist/communication/capabilities.js.map +1 -0
  387. package/dist/communication/channel.d.ts +125 -0
  388. package/dist/communication/channel.d.ts.map +1 -0
  389. package/dist/communication/channel.js +47 -0
  390. package/dist/communication/channel.js.map +1 -0
  391. package/dist/communication/claim.d.ts +368 -0
  392. package/dist/communication/claim.d.ts.map +1 -0
  393. package/dist/communication/claim.js +224 -0
  394. package/dist/communication/claim.js.map +1 -0
  395. package/dist/communication/consent.d.ts +65 -0
  396. package/dist/communication/consent.d.ts.map +1 -0
  397. package/dist/communication/consent.js +40 -0
  398. package/dist/communication/consent.js.map +1 -0
  399. package/dist/communication/context.d.ts +48 -0
  400. package/dist/communication/context.d.ts.map +1 -0
  401. package/dist/communication/context.js +41 -0
  402. package/dist/communication/context.js.map +1 -0
  403. package/dist/communication/credentials.d.ts +74 -0
  404. package/dist/communication/credentials.d.ts.map +1 -0
  405. package/dist/communication/credentials.js +115 -0
  406. package/dist/communication/credentials.js.map +1 -0
  407. package/dist/communication/dry-run-scenario.d.ts +37 -0
  408. package/dist/communication/dry-run-scenario.d.ts.map +1 -0
  409. package/dist/communication/dry-run-scenario.js +158 -0
  410. package/dist/communication/dry-run-scenario.js.map +1 -0
  411. package/dist/communication/dry-run.d.ts +40 -0
  412. package/dist/communication/dry-run.d.ts.map +1 -0
  413. package/dist/communication/dry-run.js +92 -0
  414. package/dist/communication/dry-run.js.map +1 -0
  415. package/dist/communication/engine.d.ts +153 -0
  416. package/dist/communication/engine.d.ts.map +1 -0
  417. package/dist/communication/engine.js +480 -0
  418. package/dist/communication/engine.js.map +1 -0
  419. package/dist/communication/graph.d.ts +38 -0
  420. package/dist/communication/graph.d.ts.map +1 -0
  421. package/dist/communication/graph.js +45 -0
  422. package/dist/communication/graph.js.map +1 -0
  423. package/dist/communication/idempotency.d.ts +33 -0
  424. package/dist/communication/idempotency.d.ts.map +1 -0
  425. package/dist/communication/idempotency.js +23 -0
  426. package/dist/communication/idempotency.js.map +1 -0
  427. package/dist/communication/identity.d.ts +127 -0
  428. package/dist/communication/identity.d.ts.map +1 -0
  429. package/dist/communication/identity.js +105 -0
  430. package/dist/communication/identity.js.map +1 -0
  431. package/dist/communication/index.d.ts +66 -0
  432. package/dist/communication/index.d.ts.map +1 -0
  433. package/dist/communication/index.js +42 -0
  434. package/dist/communication/index.js.map +1 -0
  435. package/dist/communication/onboarding.d.ts +223 -0
  436. package/dist/communication/onboarding.d.ts.map +1 -0
  437. package/dist/communication/onboarding.js +287 -0
  438. package/dist/communication/onboarding.js.map +1 -0
  439. package/dist/communication/policy.d.ts +99 -0
  440. package/dist/communication/policy.d.ts.map +1 -0
  441. package/dist/communication/policy.js +13 -0
  442. package/dist/communication/policy.js.map +1 -0
  443. package/dist/communication/routing.d.ts +99 -0
  444. package/dist/communication/routing.d.ts.map +1 -0
  445. package/dist/communication/routing.js +73 -0
  446. package/dist/communication/routing.js.map +1 -0
  447. package/dist/communication/sender-profile.d.ts +100 -0
  448. package/dist/communication/sender-profile.d.ts.map +1 -0
  449. package/dist/communication/sender-profile.js +123 -0
  450. package/dist/communication/sender-profile.js.map +1 -0
  451. package/dist/communication/status.d.ts +48 -0
  452. package/dist/communication/status.d.ts.map +1 -0
  453. package/dist/communication/status.js +79 -0
  454. package/dist/communication/status.js.map +1 -0
  455. package/dist/communication/stores/onboarding.d.ts +88 -0
  456. package/dist/communication/stores/onboarding.d.ts.map +1 -0
  457. package/dist/communication/stores/onboarding.js +127 -0
  458. package/dist/communication/stores/onboarding.js.map +1 -0
  459. package/dist/communication/stores/postgres.d.ts +81 -0
  460. package/dist/communication/stores/postgres.d.ts.map +1 -0
  461. package/dist/communication/stores/postgres.js +453 -0
  462. package/dist/communication/stores/postgres.js.map +1 -0
  463. package/dist/communication/stores/routing.d.ts +169 -0
  464. package/dist/communication/stores/routing.d.ts.map +1 -0
  465. package/dist/communication/stores/routing.js +324 -0
  466. package/dist/communication/stores/routing.js.map +1 -0
  467. package/dist/communication/stores/secrets.d.ts +89 -0
  468. package/dist/communication/stores/secrets.d.ts.map +1 -0
  469. package/dist/communication/stores/secrets.js +122 -0
  470. package/dist/communication/stores/secrets.js.map +1 -0
  471. package/dist/communication/template-provider.d.ts +85 -0
  472. package/dist/communication/template-provider.d.ts.map +1 -0
  473. package/dist/communication/template-provider.js +21 -0
  474. package/dist/communication/template-provider.js.map +1 -0
  475. package/dist/communication/template.d.ts +87 -0
  476. package/dist/communication/template.d.ts.map +1 -0
  477. package/dist/communication/template.js +59 -0
  478. package/dist/communication/template.js.map +1 -0
  479. package/dist/communication/webhook-subscription.d.ts +156 -0
  480. package/dist/communication/webhook-subscription.d.ts.map +1 -0
  481. package/dist/communication/webhook-subscription.js +252 -0
  482. package/dist/communication/webhook-subscription.js.map +1 -0
  483. package/dist/communication/webhook.d.ts +121 -0
  484. package/dist/communication/webhook.d.ts.map +1 -0
  485. package/dist/communication/webhook.js +283 -0
  486. package/dist/communication/webhook.js.map +1 -0
  487. package/dist/competence/repository.d.ts +147 -0
  488. package/dist/competence/repository.d.ts.map +1 -0
  489. package/dist/competence/repository.js +294 -0
  490. package/dist/competence/repository.js.map +1 -0
  491. package/dist/contacts/phone.d.ts +70 -0
  492. package/dist/contacts/phone.d.ts.map +1 -0
  493. package/dist/contacts/phone.js +186 -0
  494. package/dist/contacts/phone.js.map +1 -0
  495. package/dist/db/migrate.js +17 -11
  496. package/dist/db/migrate.js.map +1 -1
  497. package/dist/db/seed-catalog.d.ts +18 -0
  498. package/dist/db/seed-catalog.d.ts.map +1 -0
  499. package/dist/db/seed-catalog.js +45 -0
  500. package/dist/db/seed-catalog.js.map +1 -0
  501. package/dist/db/seed.js +16 -8
  502. package/dist/db/seed.js.map +1 -1
  503. package/dist/documents/repository.d.ts +97 -0
  504. package/dist/documents/repository.d.ts.map +1 -0
  505. package/dist/documents/repository.js +236 -0
  506. package/dist/documents/repository.js.map +1 -0
  507. package/dist/documents/requests.d.ts +73 -0
  508. package/dist/documents/requests.d.ts.map +1 -0
  509. package/dist/documents/requests.js +127 -0
  510. package/dist/documents/requests.js.map +1 -0
  511. package/dist/index.d.ts +113 -13
  512. package/dist/index.d.ts.map +1 -1
  513. package/dist/index.js +104 -8
  514. package/dist/index.js.map +1 -1
  515. package/dist/legal/company.d.ts +32 -0
  516. package/dist/legal/company.d.ts.map +1 -0
  517. package/dist/legal/company.js +33 -0
  518. package/dist/legal/company.js.map +1 -0
  519. package/dist/legal/documents.d.ts +30 -0
  520. package/dist/legal/documents.d.ts.map +1 -0
  521. package/dist/legal/documents.js +666 -0
  522. package/dist/legal/documents.js.map +1 -0
  523. package/dist/legal/index.d.ts +5 -0
  524. package/dist/legal/index.d.ts.map +1 -0
  525. package/dist/legal/index.js +4 -0
  526. package/dist/legal/index.js.map +1 -0
  527. package/dist/legal/types.d.ts +145 -0
  528. package/dist/legal/types.d.ts.map +1 -0
  529. package/dist/legal/types.js +31 -0
  530. package/dist/legal/types.js.map +1 -0
  531. package/dist/mail/auth-templates.d.ts +15 -0
  532. package/dist/mail/auth-templates.d.ts.map +1 -0
  533. package/dist/mail/auth-templates.js +26 -0
  534. package/dist/mail/auth-templates.js.map +1 -0
  535. package/dist/mail/dedup-store.d.ts +1 -24
  536. package/dist/mail/dedup-store.d.ts.map +1 -1
  537. package/dist/mail/dedup-store.js +9 -48
  538. package/dist/mail/dedup-store.js.map +1 -1
  539. package/dist/mail/index.d.ts +2 -1
  540. package/dist/mail/index.d.ts.map +1 -1
  541. package/dist/mail/index.js +13 -2
  542. package/dist/mail/index.js.map +1 -1
  543. package/dist/mail/provider.d.ts +2 -30
  544. package/dist/mail/provider.d.ts.map +1 -1
  545. package/dist/mail/provider.js +10 -246
  546. package/dist/mail/provider.js.map +1 -1
  547. package/dist/mail/resend.d.ts +2 -12
  548. package/dist/mail/resend.d.ts.map +1 -1
  549. package/dist/mail/resend.js +11 -17
  550. package/dist/mail/resend.js.map +1 -1
  551. package/dist/mail/sender-resolver.d.ts +1 -7
  552. package/dist/mail/sender-resolver.d.ts.map +1 -1
  553. package/dist/mail/sender-resolver.js +11 -10
  554. package/dist/mail/sender-resolver.js.map +1 -1
  555. package/dist/mail/template-renderer.d.ts +1 -9
  556. package/dist/mail/template-renderer.d.ts.map +1 -1
  557. package/dist/mail/template-renderer.js +10 -15
  558. package/dist/mail/template-renderer.js.map +1 -1
  559. package/dist/mail/transactional-outbound.d.ts +115 -0
  560. package/dist/mail/transactional-outbound.d.ts.map +1 -0
  561. package/dist/mail/transactional-outbound.js +113 -0
  562. package/dist/mail/transactional-outbound.js.map +1 -0
  563. package/dist/mail/types.d.ts +2 -142
  564. package/dist/mail/types.d.ts.map +1 -1
  565. package/dist/mail/types.js +1 -33
  566. package/dist/mail/types.js.map +1 -1
  567. package/dist/portal/provisioning.d.ts +58 -0
  568. package/dist/portal/provisioning.d.ts.map +1 -0
  569. package/dist/portal/provisioning.js +139 -0
  570. package/dist/portal/provisioning.js.map +1 -0
  571. package/dist/pricing-engine/canonical.d.ts +14 -0
  572. package/dist/pricing-engine/canonical.d.ts.map +1 -0
  573. package/dist/pricing-engine/canonical.js +39 -0
  574. package/dist/pricing-engine/canonical.js.map +1 -0
  575. package/dist/pricing-engine/errors.d.ts.map +1 -1
  576. package/dist/pricing-engine/errors.js +6 -1
  577. package/dist/pricing-engine/errors.js.map +1 -1
  578. package/dist/pricing-engine/index.d.ts +12 -2
  579. package/dist/pricing-engine/index.d.ts.map +1 -1
  580. package/dist/pricing-engine/index.js +6 -1
  581. package/dist/pricing-engine/index.js.map +1 -1
  582. package/dist/pricing-engine/pipeline.d.ts.map +1 -1
  583. package/dist/pricing-engine/pipeline.js +202 -28
  584. package/dist/pricing-engine/pipeline.js.map +1 -1
  585. package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
  586. package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
  587. package/dist/pricing-engine/shadow-adapter.js +75 -0
  588. package/dist/pricing-engine/shadow-adapter.js.map +1 -0
  589. package/dist/pricing-engine/shadow-diff.d.ts +26 -0
  590. package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
  591. package/dist/pricing-engine/shadow-diff.js +52 -0
  592. package/dist/pricing-engine/shadow-diff.js.map +1 -0
  593. package/dist/pricing-engine/shadow-facade.d.ts +42 -0
  594. package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
  595. package/dist/pricing-engine/shadow-facade.js +82 -0
  596. package/dist/pricing-engine/shadow-facade.js.map +1 -0
  597. package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
  598. package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
  599. package/dist/pricing-engine/shadow-legacy-types.js +18 -0
  600. package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
  601. package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
  602. package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
  603. package/dist/pricing-engine/shadow-metrics.js +31 -0
  604. package/dist/pricing-engine/shadow-metrics.js.map +1 -0
  605. package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
  606. package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
  607. package/dist/pricing-engine/shadow-normalizer.js +39 -0
  608. package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
  609. package/dist/pricing-engine/types.d.ts +2 -0
  610. package/dist/pricing-engine/types.d.ts.map +1 -1
  611. package/dist/rbac/authorize.d.ts +12 -0
  612. package/dist/rbac/authorize.d.ts.map +1 -1
  613. package/dist/rbac/authorize.js +27 -0
  614. package/dist/rbac/authorize.js.map +1 -1
  615. package/dist/rbac/catalog.d.ts.map +1 -1
  616. package/dist/rbac/catalog.js +67 -1
  617. package/dist/rbac/catalog.js.map +1 -1
  618. package/dist/rbac/workload-provisioning.d.ts +66 -0
  619. package/dist/rbac/workload-provisioning.d.ts.map +1 -0
  620. package/dist/rbac/workload-provisioning.js +153 -0
  621. package/dist/rbac/workload-provisioning.js.map +1 -0
  622. package/dist/rbac/workload.d.ts +124 -0
  623. package/dist/rbac/workload.d.ts.map +1 -0
  624. package/dist/rbac/workload.js +184 -0
  625. package/dist/rbac/workload.js.map +1 -0
  626. package/dist/storage/checksum.d.ts +9 -0
  627. package/dist/storage/checksum.d.ts.map +1 -0
  628. package/dist/storage/checksum.js +12 -0
  629. package/dist/storage/checksum.js.map +1 -0
  630. package/dist/storage/key.d.ts +37 -0
  631. package/dist/storage/key.d.ts.map +1 -0
  632. package/dist/storage/key.js +67 -0
  633. package/dist/storage/key.js.map +1 -0
  634. package/dist/storage/local.d.ts +40 -0
  635. package/dist/storage/local.d.ts.map +1 -0
  636. package/dist/storage/local.js +96 -0
  637. package/dist/storage/local.js.map +1 -0
  638. package/dist/storage/r2.d.ts +43 -0
  639. package/dist/storage/r2.d.ts.map +1 -0
  640. package/dist/storage/r2.js +177 -0
  641. package/dist/storage/r2.js.map +1 -0
  642. package/dist/storage/registry.d.ts +23 -0
  643. package/dist/storage/registry.d.ts.map +1 -0
  644. package/dist/storage/registry.js +37 -0
  645. package/dist/storage/registry.js.map +1 -0
  646. package/dist/storage/types.d.ts +67 -0
  647. package/dist/storage/types.d.ts.map +1 -0
  648. package/dist/storage/types.js +45 -0
  649. package/dist/storage/types.js.map +1 -0
  650. package/dist/subscription-billing/provider/asaas.d.ts +14 -0
  651. package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
  652. package/dist/subscription-billing/provider/asaas.js +32 -7
  653. package/dist/subscription-billing/provider/asaas.js.map +1 -1
  654. package/dist/subscription-billing/provider/disabled.d.ts +9 -0
  655. package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
  656. package/dist/subscription-billing/provider/disabled.js +8 -0
  657. package/dist/subscription-billing/provider/disabled.js.map +1 -1
  658. package/dist/subscription-billing/provider/registry.d.ts +10 -0
  659. package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
  660. package/dist/subscription-billing/provider/registry.js +17 -0
  661. package/dist/subscription-billing/provider/registry.js.map +1 -1
  662. package/dist/subscription-billing/service.d.ts +17 -1
  663. package/dist/subscription-billing/service.d.ts.map +1 -1
  664. package/dist/subscription-billing/service.js +57 -8
  665. package/dist/subscription-billing/service.js.map +1 -1
  666. package/dist/subscription-billing/types.d.ts +13 -0
  667. package/dist/subscription-billing/types.d.ts.map +1 -1
  668. package/dist/subscription-billing/types.js.map +1 -1
  669. package/dist/tenancy/provisioning.d.ts.map +1 -1
  670. package/dist/tenancy/provisioning.js +32 -8
  671. package/dist/tenancy/provisioning.js.map +1 -1
  672. package/dist/users/repository.d.ts +38 -0
  673. package/dist/users/repository.d.ts.map +1 -1
  674. package/dist/users/repository.js +118 -3
  675. package/dist/users/repository.js.map +1 -1
  676. package/dist/vault/repository.d.ts +67 -0
  677. package/dist/vault/repository.d.ts.map +1 -1
  678. package/dist/vault/repository.js +78 -0
  679. package/dist/vault/repository.js.map +1 -1
  680. package/package.json +19 -4
  681. package/src/db/migrations/0023_user_invite_activation.sql +15 -0
  682. package/src/db/migrations/0024_set_user_password_function.sql +32 -0
  683. package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
  684. package/src/db/migrations/0026_documents_and_competence.sql +353 -0
  685. package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
  686. package/src/db/migrations/0028_collection_engine.sql +94 -0
  687. package/src/db/migrations/0029_payment_rail.sql +107 -0
  688. package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
  689. package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
  690. package/src/db/migrations/0032_settlement_reversal.sql +76 -0
  691. package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
  692. package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
  693. package/src/db/migrations/0035_payment_account_environments.sql +61 -0
  694. package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
  695. package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
  696. package/src/db/migrations/0038_notification_channels.sql +175 -0
  697. package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
  698. package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
  699. package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
  700. package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
  701. package/src/db/migrations/0043_workload_identity.sql +105 -0
  702. package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
  703. package/dist/cjs/mail/resend-client.js +0 -103
  704. package/dist/cjs/mail/resend-client.js.map +0 -1
  705. package/dist/mail/resend-client.d.ts +0 -16
  706. package/dist/mail/resend-client.d.ts.map +0 -1
  707. package/dist/mail/resend-client.js +0 -100
  708. package/dist/mail/resend-client.js.map +0 -1
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderCopy = renderCopy;
4
+ const format_js_1 = require("./format.js");
5
+ /** Frase que identifica a dívida sem inventar dado que não existe. */
6
+ function referenceSentence(ctx) {
7
+ const ref = (0, format_js_1.describeReference)({ competence: ctx.competence, description: ctx.description });
8
+ return ref ? `Referente a ${ref}.` : null;
9
+ }
10
+ /**
11
+ * Quando houve pagamento parcial, o texto precisa dizer isso.
12
+ *
13
+ * Mandar "o valor de X está em aberto" para quem já pagou metade soa como se o
14
+ * pagamento não tivesse sido registrado — e é a mensagem que mais gera ligação
15
+ * irritada para o escritório.
16
+ */
17
+ function partialSentence(ctx) {
18
+ if (!ctx.hasPartialPayment)
19
+ return null;
20
+ return (`Registramos o pagamento parcial de ${(0, format_js_1.formatBRL)(ctx.originalAmount - ctx.outstandingAmount)}. ` +
21
+ `O saldo restante é de ${(0, format_js_1.formatBRL)(ctx.outstandingAmount)}.`);
22
+ }
23
+ /**
24
+ * Anexa o pagamento a qualquer etapa da régua.
25
+ *
26
+ * Fica fora do `switch` de propósito: o bloco de pagamento é o mesmo em D-3, D0
27
+ * e D+3, e cada etapa tendo a própria cópia da regra é a forma garantida de uma
28
+ * delas ficar para trás — foi assim que a etapa de atraso ficaria sem botão.
29
+ */
30
+ function renderCopy(tone, ctx) {
31
+ const rendered = renderCopyBody(tone, ctx);
32
+ if (!ctx.payment)
33
+ return rendered;
34
+ return { ...rendered, block: { ...rendered.block, payment: ctx.payment } };
35
+ }
36
+ function renderCopyBody(tone, ctx) {
37
+ const office = ctx.branding.officeName;
38
+ const amount = (0, format_js_1.formatBRL)(ctx.outstandingAmount);
39
+ const due = (0, format_js_1.formatDateBR)(ctx.dueDate);
40
+ // Razão social brasileira termina em ponto com frequência ("Ltda.", "S.A.",
41
+ // "ME."). Somar o nosso produziria "Olá, Padaria Exemplo Ltda.." — pequeno,
42
+ // mas é a primeira linha que o cliente lê.
43
+ const greeting = `Olá, ${ctx.clientName}${/[.!?…]$/.test(ctx.clientName.trim()) ? '' : '.'}`;
44
+ const ref = referenceSentence(ctx);
45
+ const partial = partialSentence(ctx);
46
+ const highlight = {
47
+ label: ctx.hasPartialPayment ? 'Saldo em aberto' : 'Valor',
48
+ amount,
49
+ dueLabel: tone === 'reminder' ? 'Vencimento em' : 'Vencimento:',
50
+ dueValue: due,
51
+ };
52
+ switch (tone) {
53
+ case 'reminder':
54
+ return {
55
+ subject: `Lembrete de vencimento — ${office}`,
56
+ block: {
57
+ greeting,
58
+ paragraphs: [
59
+ `Passando para lembrar que você tem um valor a vencer em ${due}.`,
60
+ ...(ref ? [ref] : []),
61
+ ...(partial ? [partial] : []),
62
+ ],
63
+ highlight,
64
+ closing: 'Se o pagamento já foi feito, é só desconsiderar.',
65
+ },
66
+ };
67
+ case 'due_notice':
68
+ return {
69
+ subject: `Seu honorário vence hoje — ${office}`,
70
+ block: {
71
+ greeting,
72
+ paragraphs: [
73
+ 'O valor abaixo vence hoje.',
74
+ ...(ref ? [ref] : []),
75
+ ...(partial ? [partial] : []),
76
+ ],
77
+ highlight: { ...highlight, dueLabel: 'Vence hoje,' },
78
+ closing: 'Se o pagamento já foi feito, é só desconsiderar.',
79
+ },
80
+ };
81
+ case 'friendly_collection':
82
+ return {
83
+ subject: `Pendência em aberto — ${office}`,
84
+ block: {
85
+ greeting,
86
+ paragraphs: [
87
+ `Identificamos um valor em aberto, com vencimento em ${due}${ctx.daysOverdue > 0 ? ` — ${(0, format_js_1.formatOverdue)(ctx.daysOverdue)}` : ''}.`,
88
+ ...(ref ? [ref] : []),
89
+ ...(partial ? [partial] : []),
90
+ 'Se já tiver pago, avise-nos para darmos baixa. Se preferir, estamos à disposição para combinar a melhor forma.',
91
+ ],
92
+ highlight,
93
+ },
94
+ };
95
+ case 'overdue_collection':
96
+ return {
97
+ subject: `Regularização de pendência — ${office}`,
98
+ block: {
99
+ greeting,
100
+ paragraphs: [
101
+ `O valor abaixo segue em aberto desde ${due}${ctx.daysOverdue > 0 ? ` (${(0, format_js_1.formatOverdue)(ctx.daysOverdue)})` : ''}.`,
102
+ ...(ref ? [ref] : []),
103
+ ...(partial ? [partial] : []),
104
+ 'Pedimos que entre em contato para regularizarmos. Se houver qualquer dificuldade, fale conosco — encontramos a melhor alternativa juntos.',
105
+ ],
106
+ highlight,
107
+ },
108
+ };
109
+ // Interno: nunca chega ao cliente. Ver a nota em `policy.ts`.
110
+ case 'human_escalation':
111
+ default:
112
+ return {
113
+ subject: `Cobrança para acompanhamento manual — ${ctx.clientName}`,
114
+ block: {
115
+ greeting: 'Aviso interno.',
116
+ paragraphs: [
117
+ `A régua automática chegou ao fim para ${ctx.clientName}, com ${amount} em aberto desde ${due}.`,
118
+ 'A condução a partir daqui é humana.',
119
+ ],
120
+ highlight,
121
+ },
122
+ };
123
+ }
124
+ }
125
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/collection/copy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ /**
3
+ * Aplicação dos callbacks de entrega ao estado do produto.
4
+ *
5
+ * `communication/webhook.ts` traduz o vocabulário do provider e decide se o
6
+ * evento avança o estado; este arquivo é o que ESCREVE. A separação é a mesma de
7
+ * sempre: o motor não conhece `dunning_event`, e a régua não conhece a Meta.
8
+ *
9
+ * Três escritas, e a ordem entre elas importa menos que o fato de estarem na
10
+ * MESMA transação: um callback que atualiza a etapa e falha ao gravar a trilha
11
+ * deixaria a tela dizendo "entregue" sem nada que explique quando nem por qual
12
+ * caminho.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.applyDeliveryCallback = applyDeliveryCallback;
16
+ exports.applyInboundOptOut = applyInboundOptOut;
17
+ const node_crypto_1 = require("node:crypto");
18
+ const index_js_1 = require("../communication/index.js");
19
+ const consent_repository_js_1 = require("./consent-repository.js");
20
+ const communication_bridge_js_1 = require("./communication-bridge.js");
21
+ /** Estados de `dunning_event` que descrevem uma mensagem já entregue ao provider. */
22
+ const DELIVERABLE = ['sent', 'delivered', 'read', 'failed'];
23
+ /**
24
+ * Aplica um callback de entrega.
25
+ *
26
+ * A via de acesso é o `provider_ref` — é a ÚNICA coisa que o webhook traz. Sem
27
+ * a coluna indexada da 0038 isso exigiria varrer a tabela, e a régua de um
28
+ * escritório grande tornaria cada callback caro o bastante para o provider
29
+ * desistir de reentregar.
30
+ */
31
+ async function applyDeliveryCallback(tx, tenantId, event) {
32
+ const rows = await tx `
33
+ SELECT id, receivable_id, status, idempotency_key
34
+ FROM dunning_event
35
+ WHERE provider_ref = ${event.providerRef}
36
+ LIMIT 1
37
+ `;
38
+ const action = rows[0];
39
+ // Sem ação correspondente não há o que atualizar. NÃO é erro: o mesmo número
40
+ // pode ter mandado mensagem por outro sistema, e um 4xx aqui faria o provider
41
+ // reentregar para sempre um evento que nunca vai ser reconhecido.
42
+ if (!action) {
43
+ await recordCallbackEvent(tx, tenantId, event, null, null, 'unknown_message');
44
+ return { outcome: 'unknown_message', receivableId: null, status: null };
45
+ }
46
+ // `advanceStatus` opera sobre estados de ENTREGA. Uma ação `scheduled`,
47
+ // `canceled` ou `escalated` não descreve mensagem entregue, e forçá-la para
48
+ // `delivered` inventaria uma entrega que a régua não fez.
49
+ const current = (DELIVERABLE.includes(action.status) ? action.status : 'sent');
50
+ const decision = (0, index_js_1.applyDeliveryEvent)(current, event);
51
+ if (!decision.apply) {
52
+ await recordCallbackEvent(tx, tenantId, event, action.receivable_id, action.idempotency_key, decision.reason);
53
+ return { outcome: decision.reason, receivableId: action.receivable_id, status: null };
54
+ }
55
+ await tx `
56
+ UPDATE dunning_event
57
+ SET status = ${decision.status},
58
+ delivered_at = CASE
59
+ WHEN ${decision.status} IN ('delivered', 'read') THEN COALESCE(delivered_at, ${event.occurredAt}::timestamptz)
60
+ ELSE delivered_at END,
61
+ read_at = CASE
62
+ WHEN ${decision.status} = 'read' THEN COALESCE(read_at, ${event.occurredAt}::timestamptz)
63
+ ELSE read_at END,
64
+ last_error = CASE
65
+ WHEN ${decision.status} = 'failed' THEN ${(event.detail ?? event.code ?? 'falha reportada pelo provider').slice(0, 300)}
66
+ ELSE last_error END
67
+ WHERE id = ${action.id}
68
+ `;
69
+ await recordCallbackEvent(tx, tenantId, event, action.receivable_id, action.idempotency_key, null, decision.status);
70
+ return {
71
+ outcome: 'applied',
72
+ receivableId: action.receivable_id,
73
+ status: decision.status,
74
+ };
75
+ }
76
+ const CALLBACK_KIND = {
77
+ delivered: 'callback_delivered',
78
+ read: 'callback_read',
79
+ failed: 'callback_failed',
80
+ opted_out: 'opt_out',
81
+ };
82
+ async function recordCallbackEvent(tx, tenantId, event, subjectRef, idempotencyKey, refusal, applied) {
83
+ // Evento recusado também vira linha. É a diferença entre "o provider nunca
84
+ // avisou" e "avisou e nós descartamos" — e só a segunda tem explicação.
85
+ const kind = refusal ? 'dispatch_skipped' : (CALLBACK_KIND[event.status] ?? 'dispatch_skipped');
86
+ await tx `
87
+ INSERT INTO communication_event (
88
+ id, tenant_id, product, brand, kind, channel, event_type, subject_ref,
89
+ recipient_ref, idempotency_key, provider_ref, skip_reason, status, code,
90
+ detail, occurred_at
91
+ ) VALUES (
92
+ ${(0, node_crypto_1.randomUUID)()}, ${tenantId}, ${communication_bridge_js_1.SC_PRODUCT},
93
+ -- A marca vem da RESERVA que produziu a mensagem. Quando não há reserva
94
+ -- correspondente, o evento fica sem marca — é o caso do callback sobre um
95
+ -- identificador que não é nosso, e inventar um valor aqui faria a trilha
96
+ -- atribuir a um escritório algo que ele não enviou.
97
+ (SELECT brand FROM communication_dispatch
98
+ WHERE provider_ref = ${event.providerRef} LIMIT 1),
99
+ ${kind}, ${event.channel}, 'billing.dunning.callback', ${subjectRef},
100
+ NULL, ${idempotencyKey}, ${event.providerRef}, ${refusal},
101
+ ${applied ?? event.status}, ${event.code ?? null},
102
+ ${event.detail ? event.detail.slice(0, 300) : null}, ${event.occurredAt}::timestamptz
103
+ )
104
+ `;
105
+ }
106
+ /**
107
+ * Registra o opt-out que o cliente pediu respondendo no canal.
108
+ *
109
+ * `customer_reply` é a origem mais forte que existe: `recordConsent` impede que
110
+ * um operador a reverta pela tela. Por isso a resolução do telefone para cliente
111
+ * é feita pelo `phone_e164` canônico e nunca pelo campo digitado — casar por
112
+ * texto livre acertaria o cliente errado quando dois cadastros diferem só na
113
+ * pontuação, e bloquearia o canal de quem não pediu nada.
114
+ */
115
+ async function applyInboundOptOut(tx, tenantId, optOut) {
116
+ const e164 = optOut.from.startsWith('+') ? optOut.from : `+${optOut.from}`;
117
+ const rows = await tx `
118
+ SELECT id FROM client
119
+ WHERE phone_e164 = ${e164} AND deleted_at IS NULL
120
+ ORDER BY created_at
121
+ LIMIT 2
122
+ `;
123
+ // Dois clientes com o mesmo telefone é cadastro legítimo (marido e mulher,
124
+ // matriz e filial). Bloquear "o primeiro" seria escolher por sorte quem
125
+ // deixa de ser cobrado. Sem resolução única, nada é registrado — e o evento
126
+ // fica na trilha para um humano decidir.
127
+ if (rows.length !== 1)
128
+ return 'unknown_recipient';
129
+ await (0, consent_repository_js_1.recordConsent)(tx, {
130
+ tenantId,
131
+ clientId: rows[0].id,
132
+ channel: optOut.channel,
133
+ state: 'denied',
134
+ source: 'customer_reply',
135
+ note: 'opt-out recebido no canal',
136
+ });
137
+ await tx `
138
+ INSERT INTO communication_event (
139
+ id, tenant_id, product, brand, kind, channel, event_type, recipient_ref,
140
+ code, occurred_at
141
+ ) VALUES (
142
+ -- Opt-out é do CLIENTE, e vale para todas as marcas do escritório: o
143
+ -- pedido de silêncio não é por linha de produto. Sem marca, portanto.
144
+ ${(0, node_crypto_1.randomUUID)()}, ${tenantId}, ${communication_bridge_js_1.SC_PRODUCT}, NULL, 'opt_out',
145
+ ${optOut.channel}, 'communication.opt_out', ${rows[0].id},
146
+ 'customer_reply', ${optOut.occurredAt}::timestamptz
147
+ )
148
+ `;
149
+ return 'registered';
150
+ }
151
+ //# sourceMappingURL=delivery-callback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-callback.js","sourceRoot":"","sources":["../../../src/collection/delivery-callback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.escapeHtml = escapeHtml;
4
+ exports.renderCollectionEmail = renderCollectionEmail;
5
+ exports.renderCollectionText = renderCollectionText;
6
+ /**
7
+ * A cor é revalidada AQUI, e não só em `getTenantBranding`.
8
+ *
9
+ * Ela é interpolada dentro de um atributo `style`; confiar que o chamador já
10
+ * sanitizou é o tipo de suposição que se perde na primeira refatoração — basta
11
+ * alguém montar o branding à mão para injetar CSS (ou fechar o atributo e
12
+ * injetar markup) na mensagem que sai em nome do escritório.
13
+ */
14
+ function safeColorForRender(v) {
15
+ return /^#[0-9a-fA-F]{6}$/.test(v) ? v : '#1f3a5f';
16
+ }
17
+ /**
18
+ * URL só entra no `href`/`src` se for https.
19
+ *
20
+ * O escape de HTML já impediria a fuga do atributo, mas ele não impede um
21
+ * `javascript:` de continuar sendo `javascript:`. E esta URL vem do metadata da
22
+ * cobrança, que passou por um gateway externo — validar aqui é o mesmo
23
+ * princípio já aplicado à cor: não confiar em quem chama.
24
+ */
25
+ function safeUrlForRender(v) {
26
+ if (!v)
27
+ return null;
28
+ return /^https:\/\/[^\s"'<>]+$/i.test(v) ? v : null;
29
+ }
30
+ /** Mesma razão da cor: a stack de fontes também é interpolada num `style`. */
31
+ function safeFontForRender(v) {
32
+ return /^[A-Za-z0-9 ,.'-]+$/.test(v) ? v : `-apple-system,'Segoe UI',Helvetica,Arial,sans-serif`;
33
+ }
34
+ function escapeHtml(s) {
35
+ return s
36
+ .replace(/&/g, '&amp;')
37
+ .replace(/</g, '&lt;')
38
+ .replace(/>/g, '&gt;')
39
+ .replace(/"/g, '&quot;')
40
+ .replace(/'/g, '&#39;');
41
+ }
42
+ /**
43
+ * Cabeçalho — a assinatura visual institucional da mensagem.
44
+ *
45
+ * Três formas, conforme o que o tenant tem:
46
+ *
47
+ * | `logoUrl` | `logoKind` | Cabeçalho |
48
+ * |---|---|---|
49
+ * | ausente | — | nome + tagline em tipografia |
50
+ * | presente | `symbol` | símbolo à esquerda, nome + tagline à direita |
51
+ * | presente | `lockup` | só a imagem (o nome já está desenhada nela) + tagline |
52
+ *
53
+ * O par símbolo+texto é montado com tabela, não com flex: o Outlook desktop
54
+ * renderiza com o motor do Word e empilharia as duas colunas.
55
+ */
56
+ function header(b) {
57
+ const name = escapeHtml(b.officeName);
58
+ const font = safeFontForRender(b.fontFamily);
59
+ const tagline = b.tagline
60
+ ? `<div style="margin-top:6px;font-family:${font};font-size:12px;line-height:1.4;color:#ffffff;opacity:.72">${escapeHtml(b.tagline)}</div>`
61
+ : '';
62
+ const wordmark = `<span style="font-family:${font};font-size:19px;font-weight:700;color:#ffffff;letter-spacing:-.01em">${name}</span>${tagline}`;
63
+ if (!b.logoUrl)
64
+ return wordmark;
65
+ const src = escapeHtml(b.logoUrl);
66
+ if (b.logoKind === 'lockup') {
67
+ // O lockup já traz o nome desenhado — repetir em texto duplicaria a marca.
68
+ // Por isso o `alt` carrega o nome aqui: com imagens bloqueadas, é a única
69
+ // coisa que sobra no cabeçalho.
70
+ return `<img src="${src}" alt="${name}" height="36"
71
+ style="display:block;border:0;outline:none;text-decoration:none;height:36px;width:auto;max-width:260px" />${tagline}`;
72
+ }
73
+ // Símbolo: 40px, tamanho mínimo do manual de marca com folga, e discreto o
74
+ // bastante para o nome continuar sendo a primeira leitura. `alt` vazio de
75
+ // propósito — o nome está ao lado, e um `alt` repetido faria o leitor de tela
76
+ // (e o cliente com imagens bloqueadas) anunciar o escritório duas vezes.
77
+ return `<table role="presentation" cellpadding="0" cellspacing="0" border="0" style="border-collapse:collapse">
78
+ <tr>
79
+ <td valign="middle" style="padding-right:14px">
80
+ <img src="${src}" alt="" width="40" height="40"
81
+ style="display:block;border:0;outline:none;text-decoration:none;width:40px;height:40px" />
82
+ </td>
83
+ <td valign="middle">${wordmark}</td>
84
+ </tr>
85
+ </table>`;
86
+ }
87
+ /**
88
+ * Bloco de pagamento.
89
+ *
90
+ * Hierarquia deliberada: **um** botão, e o resto discreto abaixo. Dar o mesmo
91
+ * peso visual a PIX, boleto e link transforma a decisão de pagar numa escolha
92
+ * de meio — e quem hesita, adia. O botão é um `<a>` com padding, não um
93
+ * `<button>`: cliente de e-mail não executa formulário, e o Outlook desenha o
94
+ * fundo da tabela mesmo quando ignora o `border-radius`.
95
+ *
96
+ * O copia-e-cola do PIX vai em texto selecionável, sem botão de copiar — não há
97
+ * JavaScript em e-mail, e um botão que não copia nada é uma promessa quebrada.
98
+ */
99
+ function renderPayment(b, t) {
100
+ if (!b)
101
+ return '';
102
+ const target = safeUrlForRender(b.url) ?? safeUrlForRender(b.boletoUrl);
103
+ const cta = target
104
+ ? `<table role="presentation" cellpadding="0" cellspacing="0" border="0" style="border-collapse:collapse;margin:0 0 18px">
105
+ <tr><td align="center" bgcolor="${t.primary}" style="border-radius:6px">
106
+ <a href="${escapeHtml(target)}"
107
+ style="display:inline-block;padding:14px 34px;font-family:${t.font};font-size:15px;font-weight:700;color:#ffffff;text-decoration:none;border-radius:6px">Pagar agora</a>
108
+ </td></tr>
109
+ </table>`
110
+ : '';
111
+ const alternativas = [];
112
+ // O QR precisa ser uma URL **https**.
113
+ //
114
+ // Um `data:` URI parece funcionar no navegador e **não funciona no Gmail**:
115
+ // ele serve toda imagem pelo próprio proxy, que só busca http(s). O resultado
116
+ // é o pior possível — um ícone quebrado onde deveria estar o meio de
117
+ // pagamento, exatamente como apareceu no QA.
118
+ //
119
+ // Sem URL válida, nenhuma `<img>` é emitida: o copia-e-cola abaixo continua
120
+ // pagando a conta, e uma imagem quebrada só faria o e-mail parecer defeituoso.
121
+ const qr = safeUrlForRender(b.pixQrCodeImage);
122
+ if (qr) {
123
+ alternativas.push(`<tr><td align="center" style="padding:4px 0 10px">
124
+ <img src="${escapeHtml(qr)}" alt="QR Code do PIX" width="150" height="150"
125
+ style="display:block;border:0;width:150px;height:150px" />
126
+ </td></tr>`);
127
+ }
128
+ if (b.pixPayload) {
129
+ alternativas.push(`<tr><td style="padding:0 0 10px">
130
+ <div style="font-family:${t.font};font-size:12px;color:${t.muted};margin-bottom:4px">PIX copia e cola</div>
131
+ <div style="font-family:Consolas,'Courier New',monospace;font-size:11px;line-height:1.5;color:#2b3440;word-break:break-all;background:#ffffff;border:1px solid #e3e8ee;border-radius:4px;padding:10px">${escapeHtml(b.pixPayload)}</div>
132
+ </td></tr>`);
133
+ }
134
+ if (b.identificationField) {
135
+ alternativas.push(`<tr><td style="padding:0 0 10px">
136
+ <div style="font-family:${t.font};font-size:12px;color:${t.muted};margin-bottom:4px">Linha digitável do boleto</div>
137
+ <div style="font-family:Consolas,'Courier New',monospace;font-size:12px;line-height:1.5;color:#2b3440;word-break:break-all">${escapeHtml(b.identificationField)}</div>
138
+ </td></tr>`);
139
+ }
140
+ if (!cta && !alternativas.length)
141
+ return '';
142
+ const alt = alternativas.length
143
+ ? `<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%"
144
+ style="border-collapse:collapse;margin:0 0 20px;background:#f6f8fa;border-radius:6px">
145
+ <tr><td style="padding:16px 18px">
146
+ <table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="border-collapse:collapse">
147
+ ${alternativas.join('')}
148
+ </table>
149
+ </td></tr>
150
+ </table>`
151
+ : '';
152
+ return `${cta}${alt}`;
153
+ }
154
+ function renderCollectionEmail(b, block) {
155
+ const name = escapeHtml(b.officeName);
156
+ const primary = safeColorForRender(b.primaryColor);
157
+ const accent = safeColorForRender(b.accentColor);
158
+ const bg = safeColorForRender(b.backgroundColor);
159
+ const text = safeColorForRender(b.textColor);
160
+ const muted = safeColorForRender(b.mutedColor);
161
+ const font = safeFontForRender(b.fontFamily);
162
+ const p = (t) => `<p style="margin:0 0 16px;font-family:${font};font-size:15px;line-height:1.65;color:${text}">${escapeHtml(t)}</p>`;
163
+ const highlight = block.highlight
164
+ ? `<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%"
165
+ style="margin:0 0 24px;border-collapse:collapse;background:#f6f8fa;border-left:3px solid ${accent};border-radius:4px">
166
+ <tr>
167
+ <td style="padding:18px 20px">
168
+ <div style="font-family:${font};font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:${muted};margin-bottom:6px">${escapeHtml(block.highlight.label)}</div>
169
+ <div style="font-family:${font};font-size:26px;font-weight:700;color:#1a2029;line-height:1.2">${escapeHtml(block.highlight.amount)}</div>
170
+ <div style="font-family:${font};font-size:14px;color:#4a5563;margin-top:8px">${escapeHtml(block.highlight.dueLabel)} <strong style="color:#1a2029">${escapeHtml(block.highlight.dueValue)}</strong></div>
171
+ </td>
172
+ </tr>
173
+ </table>`
174
+ : '';
175
+ const payment = renderPayment(block.payment, { primary, accent, muted, font });
176
+ const support = [
177
+ b.supportEmail ? escapeHtml(b.supportEmail) : null,
178
+ b.supportPhone ? escapeHtml(b.supportPhone) : null,
179
+ b.website ? escapeHtml(b.website.replace(/^https:\/\//, '')) : null,
180
+ ].filter(Boolean);
181
+ return `<!doctype html>
182
+ <html lang="pt-BR"><head><meta charset="utf-8" />
183
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
184
+ <meta name="color-scheme" content="light" />
185
+ <title>${name}</title></head>
186
+ <body style="margin:0;padding:0;background:${bg};-webkit-text-size-adjust:100%">
187
+ <table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="background:${bg};border-collapse:collapse">
188
+ <tr><td align="center" style="padding:32px 12px">
189
+ <table role="presentation" cellpadding="0" cellspacing="0" border="0" width="600"
190
+ style="width:600px;max-width:100%;border-collapse:collapse;background:#ffffff;border-radius:8px;overflow:hidden;box-shadow:0 1px 3px rgba(16,24,40,.08)">
191
+
192
+ <tr><td style="background:${primary};padding:24px 32px">${header(b)}</td></tr>
193
+
194
+ <tr><td style="padding:32px">
195
+ ${p(block.greeting)}
196
+ ${block.paragraphs.map(p).join('')}
197
+ ${highlight}
198
+ ${payment}
199
+ ${block.closing ? p(block.closing) : ''}
200
+ <p style="margin:24px 0 0;font-family:${font};font-size:15px;line-height:1.6;color:${text}">
201
+ Atenciosamente,<br /><strong>${escapeHtml(b.signatureName)}</strong>
202
+ </p>
203
+ </td></tr>
204
+
205
+ <tr><td style="padding:20px 32px;background:#f6f8fa;border-top:1px solid #e3e8ee">
206
+ <p style="margin:0;font-family:${font};font-size:12px;line-height:1.6;color:${muted}">
207
+ Mensagem automática enviada por ${name}.${support.length ? ` Para falar conosco: ${support.join(' · ')}.` : ''}<br />
208
+ Se o pagamento já foi realizado, desconsidere este aviso.
209
+ </p>
210
+ </td></tr>
211
+
212
+ </table>
213
+ </td></tr>
214
+ </table>
215
+ </body></html>`;
216
+ }
217
+ /**
218
+ * Versão texto puro.
219
+ *
220
+ * Não é decoração: parte dos leitores prefere `text/plain`, filtros de spam
221
+ * penalizam mensagem só-HTML, e leitores de tela lidam melhor com o texto. O
222
+ * conteúdo tem de ser o MESMO — um plain text resumido faria dois clientes
223
+ * receberem informações diferentes.
224
+ */
225
+ function renderCollectionText(b, block) {
226
+ const parts = [block.greeting, '', ...block.paragraphs];
227
+ if (block.highlight) {
228
+ parts.push('', `${block.highlight.label}: ${block.highlight.amount}`, `${block.highlight.dueLabel} ${block.highlight.dueValue}`);
229
+ }
230
+ if (block.payment) {
231
+ const pay = block.payment;
232
+ const linhas = [];
233
+ const alvo = pay.url ?? pay.boletoUrl;
234
+ if (alvo)
235
+ linhas.push(`Pague aqui: ${alvo}`);
236
+ if (pay.pixPayload)
237
+ linhas.push('', 'PIX copia e cola:', pay.pixPayload);
238
+ if (pay.identificationField)
239
+ linhas.push('', 'Linha digitável:', pay.identificationField);
240
+ if (linhas.length)
241
+ parts.push('', ...linhas);
242
+ }
243
+ if (block.closing)
244
+ parts.push('', block.closing);
245
+ parts.push('', 'Atenciosamente,', b.signatureName);
246
+ const support = [b.supportEmail, b.supportPhone, b.website?.replace(/^https:\/\//, '')]
247
+ .filter(Boolean)
248
+ .join(' · ');
249
+ parts.push('', '---', `Mensagem automática enviada por ${b.officeName}.${support ? ` Para falar conosco: ${support}.` : ''}`, 'Se o pagamento já foi realizado, desconsidere este aviso.');
250
+ return parts.join('\n');
251
+ }
252
+ //# sourceMappingURL=email-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-layout.js","sourceRoot":"","sources":["../../../src/collection/email-layout.ts"],"names":[],"mappings":"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"}