@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,118 @@
1
+ import type { Tx } from '../db/client.js';
2
+ import type { PaymentInstructions } from './provider/types.js';
3
+ import type { BillingMethod, BillingProvider } from './provider/types.js';
4
+ import type { ProviderAccount } from './provider-account.js';
5
+ /**
6
+ * Payment Rail — do recebível interno até a cobrança pagável.
7
+ *
8
+ * O domínio continua falando de `receivable`; quem conhece gateway é o adapter.
9
+ * Este módulo é a costura entre os dois, e o lugar onde mora a idempotência.
10
+ *
11
+ * Nada aqui é específico de Asaas. Trocar de provider é trocar o adapter
12
+ * registrado — o fluxo (garantir pagador → emitir → guardar instruções →
13
+ * reconciliar) é o mesmo em qualquer gateway brasileiro.
14
+ */
15
+ export interface PayableCharge {
16
+ id: string;
17
+ receivableId: string;
18
+ provider: string;
19
+ externalId: string | null;
20
+ method: BillingMethod;
21
+ amount: number;
22
+ status: string;
23
+ instructions: PaymentInstructions;
24
+ }
25
+ /**
26
+ * Cobrança viva de um recebível.
27
+ *
28
+ * "Viva" exclui cancelada e estornada — é a mesma definição do índice único da
29
+ * migration, e as duas precisam concordar: se divergirem, o código busca uma
30
+ * cobrança que o banco considera livre e a emissão seguinte estoura.
31
+ */
32
+ export declare function findActiveCharge(tx: Tx, receivableId: string): Promise<PayableCharge | null>;
33
+ export interface EnsureChargeInput {
34
+ receivableId: string;
35
+ clientId: string;
36
+ amount: number;
37
+ dueDate: string | null;
38
+ description: string | null;
39
+ method: BillingMethod;
40
+ customer: {
41
+ name: string;
42
+ documentNumber?: string | null;
43
+ email?: string | null;
44
+ phone?: string | null;
45
+ };
46
+ /** Data de referência. Injetada para o comportamento ser determinístico. */
47
+ today?: string;
48
+ }
49
+ export interface EnsureChargeResult {
50
+ charge: PayableCharge;
51
+ /** `false` quando a cobrança já existia — o chamador não deve auditar de novo. */
52
+ created: boolean;
53
+ /**
54
+ * O que aconteceu com o cadastro do pagador no provedor.
55
+ *
56
+ * Sai daqui para a trilha de auditoria: "reconciliado" é um fato sobre um
57
+ * sistema externo, e sem registrá-lo não há como responder depois por que uma
58
+ * emissão que falhava passou a funcionar.
59
+ */
60
+ customerSync: CustomerReconcileOutcome['action'];
61
+ }
62
+ /**
63
+ * Emite a cobrança de um recebível, ou devolve a que já existe.
64
+ *
65
+ * Três camadas de proteção contra duplicidade, porque cada uma falha num caso
66
+ * diferente:
67
+ *
68
+ * 1. **Busca antes de emitir** — resolve o caso comum (clique repetido, job que
69
+ * roda de novo depois de concluir).
70
+ * 2. **`externalReference` determinístico** — o gateway recebe sempre a mesma
71
+ * referência para o mesmo recebível, o que dá rastreabilidade de ida e volta.
72
+ * 3. **Índice único parcial** — resolve a corrida real: dois processos que
73
+ * passaram juntos pela busca. O segundo leva erro do banco e relê.
74
+ *
75
+ * Só a terceira é garantia; as duas primeiras existem para que a terceira quase
76
+ * nunca precise disparar.
77
+ */
78
+ export declare function ensureChargeForReceivable(tx: Tx, deps: {
79
+ provider: BillingProvider;
80
+ account: ProviderAccount;
81
+ }, input: EnsureChargeInput): Promise<EnsureChargeResult>;
82
+ /**
83
+ * Digest dos campos cadastrais que o provedor recebe.
84
+ *
85
+ * É o que permite responder "mudou desde a última sincronização?" sem manter uma
86
+ * segunda cópia de dado pessoal. Só entram os campos que o adapter realmente
87
+ * envia — incluir um campo que ninguém sincroniza faria a impressão digital
88
+ * mudar sem nada para reconciliar, e o sistema chamaria o gateway à toa.
89
+ *
90
+ * Normalização antes do hash: `null`, `undefined` e string vazia são a mesma
91
+ * ausência, e " Fulano " é o mesmo nome que "Fulano". Sem isso, salvar a ficha
92
+ * sem editar nada dispararia uma sincronização.
93
+ */
94
+ export declare function customerFingerprint(c: {
95
+ name: string;
96
+ documentNumber?: string | null;
97
+ email?: string | null;
98
+ phone?: string | null;
99
+ }): string;
100
+ export interface CustomerReconcileOutcome {
101
+ externalId: string | null;
102
+ /** `created` = pagador novo · `reconciled` = existia e foi atualizado · `unchanged` = já correspondia. */
103
+ action: 'created' | 'reconciled' | 'unchanged' | 'unsupported';
104
+ }
105
+ /**
106
+ * QR do PIX de uma cobrança, em PNG.
107
+ *
108
+ * O gateway entrega o QR como base64, e base64 embutido no e-mail não funciona:
109
+ * o Gmail serve toda imagem pelo próprio proxy, que só busca http(s). Guardamos
110
+ * o base64 e servimos por URL — o mesmo dado, num endereço que o cliente de
111
+ * e-mail consegue buscar.
112
+ *
113
+ * Devolve `null` quando a cobrança não tem QR (boleto, cobrança antiga, gateway
114
+ * que não expõe). Quem chama responde 404, e o e-mail simplesmente não mostra
115
+ * imagem.
116
+ */
117
+ export declare function pixQrPngOf(tx: Tx, chargeId: string): Promise<Buffer | null>;
118
+ //# sourceMappingURL=payment-rail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-rail.d.ts","sourceRoot":"","sources":["../../src/billing/payment-rail.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,mBAAmB,CAAC;CACnC;AA0CD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,EAAE,EACN,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAU/B;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACvB,CAAC;IACF,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,aAAa,CAAC;IACtB,kFAAkF;IAClF,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;OAMG;IACH,YAAY,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;CAClD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,EAAE,EACN,IAAI,EAAE;IAAE,QAAQ,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,EAC7D,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,kBAAkB,CAAC,CA6E7B;AAoDD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,GAAG,MAAM,CAMT;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0GAA0G;IAC1G,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,aAAa,CAAC;CAChE;AAoFD;;;;;;;;;;;GAWG;AACH,wBAAsB,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWjF"}
@@ -0,0 +1,295 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { assertLiveProviderAllowed, readLiveRuntime } from './live-guard.js';
3
+ const toCharge = (r) => ({
4
+ id: r.id,
5
+ receivableId: r.receivable_id,
6
+ provider: r.provider,
7
+ externalId: r.external_id,
8
+ method: r.method,
9
+ amount: Number(r.amount),
10
+ status: r.status,
11
+ instructions: r.metadata ?? {},
12
+ });
13
+ /**
14
+ * Vencimento que o gateway aceita.
15
+ *
16
+ * Gateway não emite cobrança vencida — o Asaas recusa com `invalid_dueDate`. E
17
+ * recebível vencido é justamente o caso em que a cobrança mais importa: sem
18
+ * isto, quem está atrasado recebe o e-mail de cobrança **sem botão de pagar**,
19
+ * que é o oposto do que a régua existe para fazer.
20
+ *
21
+ * A data do gateway é empurrada para hoje; o vencimento REAL do recebível não
22
+ * muda, e é ele que o e-mail anuncia. O cliente vê "venceu em 10/08" no texto e
23
+ * uma cobrança pagável hoje — que é a verdade dos dois lados.
24
+ */
25
+ function gatewayDueDate(dueDate, today) {
26
+ if (!dueDate)
27
+ return null;
28
+ const hoje = today ?? new Date().toISOString().slice(0, 10);
29
+ return dueDate < hoje ? hoje : dueDate;
30
+ }
31
+ /**
32
+ * Cobrança viva de um recebível.
33
+ *
34
+ * "Viva" exclui cancelada e estornada — é a mesma definição do índice único da
35
+ * migration, e as duas precisam concordar: se divergirem, o código busca uma
36
+ * cobrança que o banco considera livre e a emissão seguinte estoura.
37
+ */
38
+ export async function findActiveCharge(tx, receivableId) {
39
+ const rows = await tx `
40
+ SELECT id, receivable_id, provider, external_id, method, amount, status, metadata
41
+ FROM charge
42
+ WHERE receivable_id = ${receivableId}
43
+ AND deleted_at IS NULL
44
+ AND status NOT IN ('canceled', 'refunded')
45
+ LIMIT 1
46
+ `;
47
+ return rows[0] ? toCharge(rows[0]) : null;
48
+ }
49
+ /**
50
+ * Emite a cobrança de um recebível, ou devolve a que já existe.
51
+ *
52
+ * Três camadas de proteção contra duplicidade, porque cada uma falha num caso
53
+ * diferente:
54
+ *
55
+ * 1. **Busca antes de emitir** — resolve o caso comum (clique repetido, job que
56
+ * roda de novo depois de concluir).
57
+ * 2. **`externalReference` determinístico** — o gateway recebe sempre a mesma
58
+ * referência para o mesmo recebível, o que dá rastreabilidade de ida e volta.
59
+ * 3. **Índice único parcial** — resolve a corrida real: dois processos que
60
+ * passaram juntos pela busca. O segundo leva erro do banco e relê.
61
+ *
62
+ * Só a terceira é garantia; as duas primeiras existem para que a terceira quase
63
+ * nunca precise disparar.
64
+ */
65
+ export async function ensureChargeForReceivable(tx, deps, input) {
66
+ // A chave geral vale para EMISSÃO NOVA, e só. Uma cobrança que já existe
67
+ // continua sendo devolvida, e o dinheiro que entrar continua sendo baixado:
68
+ // pausar emissão não pode significar parar de reconhecer pagamento.
69
+ // O escopo é o recebível: uma autorização nomeada libera a emissão DESTE
70
+ // lançamento e de nenhum outro, com a chave geral seguindo armada.
71
+ assertLiveProviderAllowed(deps.account.environment, readLiveRuntime(), 'charge', input.receivableId);
72
+ const existing = await findActiveCharge(tx, input.receivableId);
73
+ if (existing) {
74
+ return {
75
+ charge: await refreshInstructionsIfIncomplete(tx, deps, existing),
76
+ created: false,
77
+ customerSync: 'unchanged',
78
+ };
79
+ }
80
+ // Reconciliação ANTES da emissão, e não depois: o gateway valida o pagador no
81
+ // momento em que a cobrança é criada. Corrigir o cadastro depois de a emissão
82
+ // ser recusada não ajudaria ninguém.
83
+ const customerSync = await ensurePaymentCustomer(tx, deps, input);
84
+ const customerExternalId = customerSync.externalId;
85
+ const emitted = await deps.provider.createCharge({
86
+ // Determinístico: o mesmo recebível produz sempre a mesma referência, o que
87
+ // permite reconciliar manualmente no painel do gateway sem consultar o banco.
88
+ referenceId: `receivable:${input.receivableId}`,
89
+ amount: input.amount,
90
+ method: input.method,
91
+ dueDate: gatewayDueDate(input.dueDate, input.today),
92
+ description: input.description,
93
+ customer: input.customer,
94
+ customerExternalId,
95
+ });
96
+ const id = randomUUID();
97
+ const inserted = await tx `
98
+ INSERT INTO charge (
99
+ id, tenant_id, client_id, receivable_id, provider_account_id, provider,
100
+ external_id, method, amount, status, description, due_date, metadata
101
+ ) VALUES (
102
+ ${id},
103
+ NULLIF(current_setting('app.current_tenant', true), '')::uuid,
104
+ ${input.clientId}, ${input.receivableId}, ${deps.account.id}, ${deps.provider.key},
105
+ ${emitted.externalId}, ${input.method}, ${input.amount}, ${emitted.status},
106
+ ${input.description}, ${input.dueDate}, ${tx.json((emitted.payment ?? {}))}
107
+ )
108
+ -- O alvo do ON CONFLICT é EXPLÍCITO, e não um "DO NOTHING" genérico.
109
+ -- Genérico engoliria também um external_id repetido — que não é corrida, é
110
+ -- defeito do adapter — e o trataria como "alguém chegou primeiro",
111
+ -- cancelando no gateway uma cobrança legítima. Aqui, só a duplicata de
112
+ -- cobrança viva é tolerada; qualquer outro conflito estoura e aparece.
113
+ ON CONFLICT (tenant_id, receivable_id)
114
+ WHERE receivable_id IS NOT NULL
115
+ AND deleted_at IS NULL
116
+ AND status NOT IN ('canceled', 'refunded')
117
+ DO NOTHING
118
+ RETURNING id, receivable_id, provider, external_id, method, amount, status, metadata
119
+ `;
120
+ if (inserted[0])
121
+ return { charge: toCharge(inserted[0]), created: true, customerSync: customerSync.action };
122
+ // Perdemos a corrida: outro processo inseriu entre a busca e o INSERT. A
123
+ // cobrança que acabamos de emitir no gateway fica órfã — por isso ela é
124
+ // cancelada, em vez de deixarmos duas cobranças ativas para o mesmo valor.
125
+ if (emitted.externalId) {
126
+ await deps.provider.cancelCharge(emitted.externalId).catch(() => undefined);
127
+ }
128
+ const winner = await findActiveCharge(tx, input.receivableId);
129
+ if (!winner)
130
+ throw new Error('charge_conflict_without_winner');
131
+ return { charge: winner, created: false, customerSync: customerSync.action };
132
+ }
133
+ /**
134
+ * Completa as instruções de pagamento que faltaram na emissão.
135
+ *
136
+ * O QR do PIX vem de um endpoint separado, e essa chamada é tolerante a falha
137
+ * de propósito — derrubar a emissão inteira por causa de um extra trocaria uma
138
+ * cobrança incompleta por nenhuma cobrança. Só que, sem este refresh, a
139
+ * cobrança ficava incompleta **para sempre**: nada voltava a buscar.
140
+ *
141
+ * Aconteceu de verdade na primeira cobrança da conta sandbox da SC, enquanto a
142
+ * chave PIX ainda era provisionada do lado do gateway. A segunda emissão veio
143
+ * completa; a primeira teria seguido sem QR até alguém notar.
144
+ *
145
+ * Roda só quando falta algo e o provider sabe reconsultar — uma cobrança
146
+ * completa não gasta chamada nenhuma.
147
+ */
148
+ async function refreshInstructionsIfIncomplete(tx, deps, charge) {
149
+ if (!deps.provider.fetchPaymentInstructions || !charge.externalId)
150
+ return charge;
151
+ if (!isIncomplete(charge))
152
+ return charge;
153
+ const fresh = await deps.provider
154
+ .fetchPaymentInstructions(charge.externalId, charge.method)
155
+ .catch(() => null);
156
+ if (!fresh)
157
+ return charge;
158
+ // Mescla em vez de substituir: o que já estava gravado não pode sumir porque
159
+ // uma reconsulta veio mais pobre que a original.
160
+ const merged = { ...charge.instructions, ...pruneEmpty(fresh) };
161
+ await tx `
162
+ UPDATE charge SET metadata = ${tx.json(merged)}, updated_at = now()
163
+ WHERE id = ${charge.id}
164
+ `;
165
+ return { ...charge, instructions: merged };
166
+ }
167
+ /** O que cada método precisa ter para o e-mail ficar completo. */
168
+ function isIncomplete(charge) {
169
+ const i = charge.instructions;
170
+ if (charge.method === 'pix')
171
+ return !i.pixPayload || !i.pixQrCodeImage;
172
+ if (charge.method === 'boleto')
173
+ return !i.boletoUrl || !i.identificationField;
174
+ return !i.invoiceUrl;
175
+ }
176
+ function pruneEmpty(i) {
177
+ return Object.fromEntries(Object.entries(i).filter(([, v]) => v));
178
+ }
179
+ /**
180
+ * Digest dos campos cadastrais que o provedor recebe.
181
+ *
182
+ * É o que permite responder "mudou desde a última sincronização?" sem manter uma
183
+ * segunda cópia de dado pessoal. Só entram os campos que o adapter realmente
184
+ * envia — incluir um campo que ninguém sincroniza faria a impressão digital
185
+ * mudar sem nada para reconciliar, e o sistema chamaria o gateway à toa.
186
+ *
187
+ * Normalização antes do hash: `null`, `undefined` e string vazia são a mesma
188
+ * ausência, e " Fulano " é o mesmo nome que "Fulano". Sem isso, salvar a ficha
189
+ * sem editar nada dispararia uma sincronização.
190
+ */
191
+ export function customerFingerprint(c) {
192
+ const norm = (v) => (v ?? '').trim().toLowerCase();
193
+ const digits = (v) => (v ?? '').replace(/\D/g, '');
194
+ return createHash('sha256')
195
+ .update([norm(c.name), digits(c.documentNumber), norm(c.email), digits(c.phone)].join('\u0000'))
196
+ .digest('hex');
197
+ }
198
+ /**
199
+ * Garante que o pagador EXISTE no gateway e que ele está CORRETO.
200
+ *
201
+ * O mapa local continua evitando ida ao gateway na maioria das emissões — mas
202
+ * ele deixa de significar "existe, logo está certo para sempre", que era a
203
+ * dívida R. Agora ele guarda também a impressão digital do que foi sincronizado,
204
+ * e a decisão passa a ser:
205
+ *
206
+ * sem registro → cria (o adapter ainda busca antes, para não duplicar)
207
+ * registro coerente → devolve, sem tocar na rede
208
+ * registro divergente → ATUALIZA no gateway, e só então grava a nova digital
209
+ *
210
+ * Digital nula é tratada como divergente de propósito: é o estado das linhas
211
+ * anteriores a esta correção, e é assim que a base existente se cura na primeira
212
+ * emissão de cada cliente, sem backfill adivinhando o que o gateway tem.
213
+ *
214
+ * Falha de atualização NÃO é engolida e NÃO grava digital. O Office não pode
215
+ * registrar que sincronizou o que não sincronizou — na próxima tentativa, ele
216
+ * tenta de novo.
217
+ */
218
+ async function ensurePaymentCustomer(tx, deps, input) {
219
+ if (!deps.provider.ensureCustomer)
220
+ return { externalId: null, action: 'unsupported' };
221
+ const customer = { ...input.customer, referenceId: `client:${input.clientId}` };
222
+ const fingerprint = customerFingerprint(input.customer);
223
+ const rows = await tx `
224
+ SELECT external_id, synced_fingerprint FROM payment_customer
225
+ WHERE provider_account_id = ${deps.account.id} AND client_id = ${input.clientId}
226
+ LIMIT 1
227
+ `;
228
+ if (rows[0]) {
229
+ if (rows[0].synced_fingerprint === fingerprint) {
230
+ return { externalId: rows[0].external_id, action: 'unchanged' };
231
+ }
232
+ if (!deps.provider.updateCustomer) {
233
+ // Provider sem atualização: devolver o id calado faria o Office parecer
234
+ // sincronizado. Melhor dizer que não é suportado e deixar quem chamou
235
+ // decidir — a alternativa é a dívida R de volta, silenciosa.
236
+ return { externalId: rows[0].external_id, action: 'unsupported' };
237
+ }
238
+ await deps.provider.updateCustomer(rows[0].external_id, customer);
239
+ await tx `
240
+ UPDATE payment_customer
241
+ SET synced_fingerprint = ${fingerprint}, synced_at = now(), updated_at = now()
242
+ WHERE provider_account_id = ${deps.account.id} AND client_id = ${input.clientId}
243
+ `;
244
+ return { externalId: rows[0].external_id, action: 'reconciled' };
245
+ }
246
+ const ensured = await deps.provider.ensureCustomer(customer);
247
+ // O adapter distingue "criei" de "encontrei e reconciliei"; o rail não teria
248
+ // como. Sem isto, a trilha registrava `created` para um pagador que já existia
249
+ // no gateway e acabara de ser corrigido — o histórico dizia a coisa errada
250
+ // justamente no caso que mais importa auditar.
251
+ const externalId = typeof ensured === 'string' ? ensured : ensured.externalId;
252
+ const action = typeof ensured === 'string' ? 'created' : ensured.action;
253
+ await tx `
254
+ INSERT INTO payment_customer (
255
+ id, tenant_id, client_id, provider_account_id, provider, external_id,
256
+ synced_fingerprint, synced_at
257
+ ) VALUES (
258
+ ${randomUUID()},
259
+ NULLIF(current_setting('app.current_tenant', true), '')::uuid,
260
+ ${input.clientId}, ${deps.account.id}, ${deps.provider.key}, ${externalId},
261
+ ${fingerprint}, now()
262
+ )
263
+ ON CONFLICT (tenant_id, provider_account_id, client_id) DO UPDATE
264
+ SET synced_fingerprint = EXCLUDED.synced_fingerprint,
265
+ synced_at = EXCLUDED.synced_at,
266
+ updated_at = now()
267
+ `;
268
+ return { externalId, action };
269
+ }
270
+ /**
271
+ * QR do PIX de uma cobrança, em PNG.
272
+ *
273
+ * O gateway entrega o QR como base64, e base64 embutido no e-mail não funciona:
274
+ * o Gmail serve toda imagem pelo próprio proxy, que só busca http(s). Guardamos
275
+ * o base64 e servimos por URL — o mesmo dado, num endereço que o cliente de
276
+ * e-mail consegue buscar.
277
+ *
278
+ * Devolve `null` quando a cobrança não tem QR (boleto, cobrança antiga, gateway
279
+ * que não expõe). Quem chama responde 404, e o e-mail simplesmente não mostra
280
+ * imagem.
281
+ */
282
+ export async function pixQrPngOf(tx, chargeId) {
283
+ const rows = await tx `
284
+ SELECT metadata FROM charge WHERE id = ${chargeId} AND deleted_at IS NULL
285
+ `;
286
+ const raw = rows[0]?.metadata?.pixQrCodeImage;
287
+ if (!raw)
288
+ return null;
289
+ // Aceita tanto o data URI (formato em que o adapter guarda) quanto base64 cru.
290
+ const base64 = raw.startsWith('data:') ? (raw.split(',')[1] ?? '') : raw;
291
+ if (!/^[A-Za-z0-9+/]+={0,2}$/.test(base64))
292
+ return null;
293
+ return Buffer.from(base64, 'base64');
294
+ }
295
+ //# sourceMappingURL=payment-rail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-rail.js","sourceRoot":"","sources":["../../src/billing/payment-rail.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,60 @@
1
- import type { BillingProvider, ChargeRequest, ChargeResult, ProviderConfig, SubscriptionRequest, SubscriptionResult, WebhookEvent } from './types.js';
1
+ import type { EnsureCustomerResult, BillingMethod, BillingProvider, ChargeRequest, ChargeResult, CustomerRequest, PaymentInstructions, ProviderAccountIdentity, ProviderConfig, SubscriptionRequest, SubscriptionResult, WebhookEvent } from './types.js';
2
2
  export declare class AsaasProvider implements BillingProvider {
3
3
  readonly key = "asaas";
4
4
  private readonly apiKey;
5
5
  private readonly baseUrl;
6
+ private readonly webhookSecret;
6
7
  private readonly fetchImpl;
7
8
  constructor(config: ProviderConfig);
8
9
  private call;
10
+ /**
11
+ * Provisiona (ou reencontra) o pagador na conta do escritório.
12
+ *
13
+ * `externalReference` é o id interno do cliente, e a busca por ele vem ANTES
14
+ * do POST: sem isso, cada emissão criaria um cadastro novo na conta do
15
+ * escritório, e o histórico do cliente lá dentro viraria uma lista de
16
+ * homônimos. O mapa local (`payment_customer`) evita a maioria das chamadas;
17
+ * esta busca é a rede de segurança para quando o mapa e o gateway divergirem.
18
+ */
19
+ ensureCustomer(req: CustomerRequest): Promise<EnsureCustomerResult>;
20
+ /**
21
+ * Atualiza o pagador existente. Mesmo payload da criação, mesmo endpoint com
22
+ * id — no Asaas, `POST /customers/{id}` é a atualização.
23
+ *
24
+ * Sem `externalReference` no corpo: ele é a âncora que liga o pagador ao
25
+ * cliente do Office, e reescrevê-lo a cada sincronização abriria a chance de
26
+ * apontar para outro cliente por um erro de chamada.
27
+ */
28
+ updateCustomer(externalId: string, req: CustomerRequest): Promise<void>;
29
+ describeAccount(): Promise<ProviderAccountIdentity>;
9
30
  createCharge(req: ChargeRequest): Promise<ChargeResult>;
31
+ fetchPaymentInstructions(externalId: string, method: BillingMethod): Promise<PaymentInstructions>;
32
+ /**
33
+ * O QR Code e a linha digitável vivem em endpoints próprios.
34
+ *
35
+ * Eles são buscados no provider, nunca gerados aqui: um BR Code montado por
36
+ * nós apontaria para uma chave PIX que o gateway não conhece, e o pagamento
37
+ * cairia fora da cobrança — dinheiro que entra sem baixar nada.
38
+ *
39
+ * A falha é tolerada de propósito. Se o QR não vier, o cliente ainda tem a
40
+ * página de pagamento; derrubar a emissão inteira por causa de um extra seria
41
+ * trocar uma cobrança incompleta por nenhuma cobrança.
42
+ */
43
+ private instructionsFor;
10
44
  cancelCharge(externalId: string): Promise<void>;
11
45
  createSubscription(req: SubscriptionRequest): Promise<SubscriptionResult>;
12
46
  cancelSubscription(externalId: string): Promise<void>;
47
+ /**
48
+ * Autenticação do webhook.
49
+ *
50
+ * O Asaas envia o token configurado na fila em `asaas-access-token`. A
51
+ * comparação é de tempo constante — um `===` sobre segredo vaza, byte a byte,
52
+ * quanto do prefixo está correto para quem consegue medir o tempo da resposta.
53
+ *
54
+ * Sem segredo configurado, reprova. Fail-closed é o único default aceitável
55
+ * numa rota pública que dá baixa em dinheiro.
56
+ */
57
+ verifyWebhook(_payload: unknown, headers?: Record<string, string>): boolean;
13
58
  parseWebhook(payload: unknown): WebhookEvent;
14
59
  }
15
60
  //# sourceMappingURL=asaas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"asaas.d.ts","sourceRoot":"","sources":["../../../src/billing/provider/asaas.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACb,MAAM,YAAY,CAAC;AAyBpB,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,GAAG,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,MAAM,EAAE,cAAc;YAOpB,IAAI;IAaZ,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAwBvD,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkBzE,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY;CAiB7C"}
1
+ {"version":3,"file":"asaas.d.ts","sourceRoot":"","sources":["../../../src/billing/provider/asaas.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,aAAa,EACb,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACb,MAAM,YAAY,CAAC;AA6BpB,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,GAAG,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,MAAM,EAAE,cAAc;YAQpB,IAAI;IAalB;;;;;;;;OAQG;IACG,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAyBzE;;;;;;;OAOG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvE,eAAe,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAoBnD,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAsBvD,wBAAwB,CAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,mBAAmB,CAAC;IAK/B;;;;;;;;;;OAUG;YACW,eAAe;IA6BvB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA0BzE,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D;;;;;;;;;OASG;IACH,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO;IAM/E,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY;CAkD7C"}