@baruk/core 0.3.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (696) hide show
  1. package/.baruk-provenance.json +10 -0
  2. package/CHANGELOG.md +85 -0
  3. package/dist/auth/password-reset.d.ts +30 -1
  4. package/dist/auth/password-reset.d.ts.map +1 -1
  5. package/dist/auth/password-reset.js +139 -11
  6. package/dist/auth/password-reset.js.map +1 -1
  7. package/dist/auth/service.d.ts +39 -2
  8. package/dist/auth/service.d.ts.map +1 -1
  9. package/dist/auth/service.js +75 -10
  10. package/dist/auth/service.js.map +1 -1
  11. package/dist/billing/ar-repository.d.ts +334 -0
  12. package/dist/billing/ar-repository.d.ts.map +1 -0
  13. package/dist/billing/ar-repository.js +707 -0
  14. package/dist/billing/ar-repository.js.map +1 -0
  15. package/dist/billing/auto-generation.d.ts +87 -0
  16. package/dist/billing/auto-generation.d.ts.map +1 -0
  17. package/dist/billing/auto-generation.js +181 -0
  18. package/dist/billing/auto-generation.js.map +1 -0
  19. package/dist/billing/live-guard.d.ts +64 -0
  20. package/dist/billing/live-guard.d.ts.map +1 -0
  21. package/dist/billing/live-guard.js +68 -0
  22. package/dist/billing/live-guard.js.map +1 -0
  23. package/dist/billing/payment-means-catalog.d.ts +17 -0
  24. package/dist/billing/payment-means-catalog.d.ts.map +1 -0
  25. package/dist/billing/payment-means-catalog.js +21 -0
  26. package/dist/billing/payment-means-catalog.js.map +1 -0
  27. package/dist/billing/payment-means.d.ts +38 -0
  28. package/dist/billing/payment-means.d.ts.map +1 -0
  29. package/dist/billing/payment-means.js +29 -0
  30. package/dist/billing/payment-means.js.map +1 -0
  31. package/dist/billing/payment-rail.d.ts +118 -0
  32. package/dist/billing/payment-rail.d.ts.map +1 -0
  33. package/dist/billing/payment-rail.js +295 -0
  34. package/dist/billing/payment-rail.js.map +1 -0
  35. package/dist/billing/provider/asaas.d.ts +46 -1
  36. package/dist/billing/provider/asaas.d.ts.map +1 -1
  37. package/dist/billing/provider/asaas.js +194 -14
  38. package/dist/billing/provider/asaas.js.map +1 -1
  39. package/dist/billing/provider/manual.js +1 -1
  40. package/dist/billing/provider/manual.js.map +1 -1
  41. package/dist/billing/provider/types.d.ts +115 -8
  42. package/dist/billing/provider/types.d.ts.map +1 -1
  43. package/dist/billing/provider-account.d.ts +89 -0
  44. package/dist/billing/provider-account.d.ts.map +1 -0
  45. package/dist/billing/provider-account.js +161 -0
  46. package/dist/billing/provider-account.js.map +1 -0
  47. package/dist/billing/provider-onboarding.d.ts +67 -0
  48. package/dist/billing/provider-onboarding.d.ts.map +1 -0
  49. package/dist/billing/provider-onboarding.js +234 -0
  50. package/dist/billing/provider-onboarding.js.map +1 -0
  51. package/dist/billing/receivable.d.ts +5 -1
  52. package/dist/billing/receivable.d.ts.map +1 -1
  53. package/dist/billing/reconcile.d.ts +58 -0
  54. package/dist/billing/reconcile.d.ts.map +1 -0
  55. package/dist/billing/reconcile.js +138 -0
  56. package/dist/billing/reconcile.js.map +1 -0
  57. package/dist/billing/repository.d.ts +90 -1
  58. package/dist/billing/repository.d.ts.map +1 -1
  59. package/dist/billing/repository.js +148 -19
  60. package/dist/billing/repository.js.map +1 -1
  61. package/dist/cjs/auth/password-reset.js +141 -11
  62. package/dist/cjs/auth/password-reset.js.map +1 -1
  63. package/dist/cjs/auth/service.js +75 -9
  64. package/dist/cjs/auth/service.js.map +1 -1
  65. package/dist/cjs/billing/ar-repository.js +728 -0
  66. package/dist/cjs/billing/ar-repository.js.map +1 -0
  67. package/dist/cjs/billing/auto-generation.js +186 -0
  68. package/dist/cjs/billing/auto-generation.js.map +1 -0
  69. package/dist/cjs/billing/live-guard.js +72 -0
  70. package/dist/cjs/billing/live-guard.js.map +1 -0
  71. package/dist/cjs/billing/payment-means-catalog.js +25 -0
  72. package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
  73. package/dist/cjs/billing/payment-means.js +33 -0
  74. package/dist/cjs/billing/payment-means.js.map +1 -0
  75. package/dist/cjs/billing/payment-rail.js +301 -0
  76. package/dist/cjs/billing/payment-rail.js.map +1 -0
  77. package/dist/cjs/billing/provider/asaas.js +194 -14
  78. package/dist/cjs/billing/provider/asaas.js.map +1 -1
  79. package/dist/cjs/billing/provider/manual.js +1 -1
  80. package/dist/cjs/billing/provider/manual.js.map +1 -1
  81. package/dist/cjs/billing/provider-account.js +170 -0
  82. package/dist/cjs/billing/provider-account.js.map +1 -0
  83. package/dist/cjs/billing/provider-onboarding.js +239 -0
  84. package/dist/cjs/billing/provider-onboarding.js.map +1 -0
  85. package/dist/cjs/billing/reconcile.js +143 -0
  86. package/dist/cjs/billing/reconcile.js.map +1 -0
  87. package/dist/cjs/billing/repository.js +150 -18
  88. package/dist/cjs/billing/repository.js.map +1 -1
  89. package/dist/cjs/clients/repository.js +96 -20
  90. package/dist/cjs/clients/repository.js.map +1 -1
  91. package/dist/cjs/collection/branding.js +140 -0
  92. package/dist/cjs/collection/branding.js.map +1 -0
  93. package/dist/cjs/collection/channel-accounts.js +137 -0
  94. package/dist/cjs/collection/channel-accounts.js.map +1 -0
  95. package/dist/cjs/collection/channel.js +17 -0
  96. package/dist/cjs/collection/channel.js.map +1 -0
  97. package/dist/cjs/collection/communication-bridge.js +140 -0
  98. package/dist/cjs/collection/communication-bridge.js.map +1 -0
  99. package/dist/cjs/collection/communication-runtime.js +193 -0
  100. package/dist/cjs/collection/communication-runtime.js.map +1 -0
  101. package/dist/cjs/collection/consent-repository.js +84 -0
  102. package/dist/cjs/collection/consent-repository.js.map +1 -0
  103. package/dist/cjs/collection/copy.js +125 -0
  104. package/dist/cjs/collection/copy.js.map +1 -0
  105. package/dist/cjs/collection/delivery-callback.js +151 -0
  106. package/dist/cjs/collection/delivery-callback.js.map +1 -0
  107. package/dist/cjs/collection/email-layout.js +252 -0
  108. package/dist/cjs/collection/email-layout.js.map +1 -0
  109. package/dist/cjs/collection/engine.js +414 -0
  110. package/dist/cjs/collection/engine.js.map +1 -0
  111. package/dist/cjs/collection/format.js +76 -0
  112. package/dist/cjs/collection/format.js.map +1 -0
  113. package/dist/cjs/collection/payment-block.js +3 -0
  114. package/dist/cjs/collection/payment-block.js.map +1 -0
  115. package/dist/cjs/collection/policy.js +147 -0
  116. package/dist/cjs/collection/policy.js.map +1 -0
  117. package/dist/cjs/collection/repository.js +260 -0
  118. package/dist/cjs/collection/repository.js.map +1 -0
  119. package/dist/cjs/collection/subject.js +104 -0
  120. package/dist/cjs/collection/subject.js.map +1 -0
  121. package/dist/cjs/collection/template-catalog.js +165 -0
  122. package/dist/cjs/collection/template-catalog.js.map +1 -0
  123. package/dist/cjs/collection/template.js +78 -0
  124. package/dist/cjs/collection/template.js.map +1 -0
  125. package/dist/cjs/communication/adapters/email.js +132 -0
  126. package/dist/cjs/communication/adapters/email.js.map +1 -0
  127. package/dist/cjs/communication/adapters/sms.js +127 -0
  128. package/dist/cjs/communication/adapters/sms.js.map +1 -0
  129. package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
  130. package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
  131. package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
  132. package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
  133. package/dist/cjs/communication/adapters/whatsapp.js +213 -0
  134. package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
  135. package/dist/cjs/communication/audit.js +61 -0
  136. package/dist/cjs/communication/audit.js.map +1 -0
  137. package/dist/cjs/communication/capabilities.js +76 -0
  138. package/dist/cjs/communication/capabilities.js.map +1 -0
  139. package/dist/cjs/communication/channel.js +53 -0
  140. package/dist/cjs/communication/channel.js.map +1 -0
  141. package/dist/cjs/communication/claim.js +228 -0
  142. package/dist/cjs/communication/claim.js.map +1 -0
  143. package/dist/cjs/communication/consent.js +43 -0
  144. package/dist/cjs/communication/consent.js.map +1 -0
  145. package/dist/cjs/communication/context.js +45 -0
  146. package/dist/cjs/communication/context.js.map +1 -0
  147. package/dist/cjs/communication/credentials.js +121 -0
  148. package/dist/cjs/communication/credentials.js.map +1 -0
  149. package/dist/cjs/communication/dry-run-scenario.js +161 -0
  150. package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
  151. package/dist/cjs/communication/dry-run.js +97 -0
  152. package/dist/cjs/communication/dry-run.js.map +1 -0
  153. package/dist/cjs/communication/engine.js +483 -0
  154. package/dist/cjs/communication/engine.js.map +1 -0
  155. package/dist/cjs/communication/graph.js +50 -0
  156. package/dist/cjs/communication/graph.js.map +1 -0
  157. package/dist/cjs/communication/idempotency.js +26 -0
  158. package/dist/cjs/communication/idempotency.js.map +1 -0
  159. package/dist/cjs/communication/identity.js +110 -0
  160. package/dist/cjs/communication/identity.js.map +1 -0
  161. package/dist/cjs/communication/index.js +135 -0
  162. package/dist/cjs/communication/index.js.map +1 -0
  163. package/dist/cjs/communication/onboarding.js +297 -0
  164. package/dist/cjs/communication/onboarding.js.map +1 -0
  165. package/dist/cjs/communication/policy.js +16 -0
  166. package/dist/cjs/communication/policy.js.map +1 -0
  167. package/dist/cjs/communication/routing.js +77 -0
  168. package/dist/cjs/communication/routing.js.map +1 -0
  169. package/dist/cjs/communication/sender-profile.js +128 -0
  170. package/dist/cjs/communication/sender-profile.js.map +1 -0
  171. package/dist/cjs/communication/status.js +86 -0
  172. package/dist/cjs/communication/status.js.map +1 -0
  173. package/dist/cjs/communication/stores/onboarding.js +135 -0
  174. package/dist/cjs/communication/stores/onboarding.js.map +1 -0
  175. package/dist/cjs/communication/stores/postgres.js +458 -0
  176. package/dist/cjs/communication/stores/postgres.js.map +1 -0
  177. package/dist/cjs/communication/stores/routing.js +334 -0
  178. package/dist/cjs/communication/stores/routing.js.map +1 -0
  179. package/dist/cjs/communication/stores/secrets.js +126 -0
  180. package/dist/cjs/communication/stores/secrets.js.map +1 -0
  181. package/dist/cjs/communication/template-provider.js +22 -0
  182. package/dist/cjs/communication/template-provider.js.map +1 -0
  183. package/dist/cjs/communication/template.js +63 -0
  184. package/dist/cjs/communication/template.js.map +1 -0
  185. package/dist/cjs/communication/webhook-subscription.js +258 -0
  186. package/dist/cjs/communication/webhook-subscription.js.map +1 -0
  187. package/dist/cjs/communication/webhook.js +292 -0
  188. package/dist/cjs/communication/webhook.js.map +1 -0
  189. package/dist/cjs/competence/repository.js +309 -0
  190. package/dist/cjs/competence/repository.js.map +1 -0
  191. package/dist/cjs/contacts/phone.js +192 -0
  192. package/dist/cjs/contacts/phone.js.map +1 -0
  193. package/dist/cjs/db/seed-catalog.js +48 -0
  194. package/dist/cjs/db/seed-catalog.js.map +1 -0
  195. package/dist/cjs/db/seed.js +15 -7
  196. package/dist/cjs/db/seed.js.map +1 -1
  197. package/dist/cjs/documents/repository.js +244 -0
  198. package/dist/cjs/documents/repository.js.map +1 -0
  199. package/dist/cjs/documents/requests.js +136 -0
  200. package/dist/cjs/documents/requests.js.map +1 -0
  201. package/dist/cjs/index.js +406 -39
  202. package/dist/cjs/index.js.map +1 -1
  203. package/dist/cjs/legal/documents.js +125 -3
  204. package/dist/cjs/legal/documents.js.map +1 -1
  205. package/dist/cjs/legal/types.js +1 -0
  206. package/dist/cjs/legal/types.js.map +1 -1
  207. package/dist/cjs/mail/auth-templates.js +29 -0
  208. package/dist/cjs/mail/auth-templates.js.map +1 -0
  209. package/dist/cjs/mail/dedup-store.js +12 -51
  210. package/dist/cjs/mail/dedup-store.js.map +1 -1
  211. package/dist/cjs/mail/index.js +16 -4
  212. package/dist/cjs/mail/index.js.map +1 -1
  213. package/dist/cjs/mail/provider.js +12 -247
  214. package/dist/cjs/mail/provider.js.map +1 -1
  215. package/dist/cjs/mail/resend.js +14 -18
  216. package/dist/cjs/mail/resend.js.map +1 -1
  217. package/dist/cjs/mail/sender-resolver.js +12 -11
  218. package/dist/cjs/mail/sender-resolver.js.map +1 -1
  219. package/dist/cjs/mail/template-renderer.js +11 -16
  220. package/dist/cjs/mail/template-renderer.js.map +1 -1
  221. package/dist/cjs/mail/transactional-outbound.js +117 -0
  222. package/dist/cjs/mail/transactional-outbound.js.map +1 -0
  223. package/dist/cjs/mail/types.js +8 -35
  224. package/dist/cjs/mail/types.js.map +1 -1
  225. package/dist/cjs/portal/provisioning.js +144 -0
  226. package/dist/cjs/portal/provisioning.js.map +1 -0
  227. package/dist/cjs/pricing-engine/canonical.js +42 -0
  228. package/dist/cjs/pricing-engine/canonical.js.map +1 -0
  229. package/dist/cjs/pricing-engine/errors.js +6 -1
  230. package/dist/cjs/pricing-engine/errors.js.map +1 -1
  231. package/dist/cjs/pricing-engine/index.js +12 -1
  232. package/dist/cjs/pricing-engine/index.js.map +1 -1
  233. package/dist/cjs/pricing-engine/pipeline.js +200 -26
  234. package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
  235. package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
  236. package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
  237. package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
  238. package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
  239. package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
  240. package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
  241. package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
  242. package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
  243. package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
  244. package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
  245. package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
  246. package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
  247. package/dist/cjs/rbac/authorize.js +28 -0
  248. package/dist/cjs/rbac/authorize.js.map +1 -1
  249. package/dist/cjs/rbac/catalog.js +67 -1
  250. package/dist/cjs/rbac/catalog.js.map +1 -1
  251. package/dist/cjs/rbac/workload-provisioning.js +160 -0
  252. package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
  253. package/dist/cjs/rbac/workload.js +191 -0
  254. package/dist/cjs/rbac/workload.js.map +1 -0
  255. package/dist/cjs/storage/checksum.js +15 -0
  256. package/dist/cjs/storage/checksum.js.map +1 -0
  257. package/dist/cjs/storage/key.js +72 -0
  258. package/dist/cjs/storage/key.js.map +1 -0
  259. package/dist/cjs/storage/local.js +100 -0
  260. package/dist/cjs/storage/local.js.map +1 -0
  261. package/dist/cjs/storage/r2.js +181 -0
  262. package/dist/cjs/storage/r2.js.map +1 -0
  263. package/dist/cjs/storage/registry.js +41 -0
  264. package/dist/cjs/storage/registry.js.map +1 -0
  265. package/dist/cjs/storage/types.js +50 -0
  266. package/dist/cjs/storage/types.js.map +1 -0
  267. package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
  268. package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
  269. package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
  270. package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
  271. package/dist/cjs/subscription-billing/provider/registry.js +17 -0
  272. package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
  273. package/dist/cjs/subscription-billing/service.js +57 -8
  274. package/dist/cjs/subscription-billing/service.js.map +1 -1
  275. package/dist/cjs/subscription-billing/types.js.map +1 -1
  276. package/dist/cjs/tenancy/provisioning.js +32 -8
  277. package/dist/cjs/tenancy/provisioning.js.map +1 -1
  278. package/dist/cjs/users/repository.js +119 -2
  279. package/dist/cjs/users/repository.js.map +1 -1
  280. package/dist/cjs/vault/repository.js +81 -0
  281. package/dist/cjs/vault/repository.js.map +1 -1
  282. package/dist/clients/repository.d.ts +42 -0
  283. package/dist/clients/repository.d.ts.map +1 -1
  284. package/dist/clients/repository.js +94 -21
  285. package/dist/clients/repository.js.map +1 -1
  286. package/dist/collection/branding.d.ts +72 -0
  287. package/dist/collection/branding.d.ts.map +1 -0
  288. package/dist/collection/branding.js +136 -0
  289. package/dist/collection/branding.js.map +1 -0
  290. package/dist/collection/channel-accounts.d.ts +57 -0
  291. package/dist/collection/channel-accounts.d.ts.map +1 -0
  292. package/dist/collection/channel-accounts.js +133 -0
  293. package/dist/collection/channel-accounts.js.map +1 -0
  294. package/dist/collection/channel.d.ts +24 -0
  295. package/dist/collection/channel.d.ts.map +1 -0
  296. package/dist/collection/channel.js +16 -0
  297. package/dist/collection/channel.js.map +1 -0
  298. package/dist/collection/communication-bridge.d.ts +66 -0
  299. package/dist/collection/communication-bridge.d.ts.map +1 -0
  300. package/dist/collection/communication-bridge.js +134 -0
  301. package/dist/collection/communication-bridge.js.map +1 -0
  302. package/dist/collection/communication-runtime.d.ts +95 -0
  303. package/dist/collection/communication-runtime.d.ts.map +1 -0
  304. package/dist/collection/communication-runtime.js +187 -0
  305. package/dist/collection/communication-runtime.js.map +1 -0
  306. package/dist/collection/consent-repository.d.ts +32 -0
  307. package/dist/collection/consent-repository.d.ts.map +1 -0
  308. package/dist/collection/consent-repository.js +79 -0
  309. package/dist/collection/consent-repository.js.map +1 -0
  310. package/dist/collection/copy.d.ts +50 -0
  311. package/dist/collection/copy.d.ts.map +1 -0
  312. package/dist/collection/copy.js +122 -0
  313. package/dist/collection/copy.js.map +1 -0
  314. package/dist/collection/delivery-callback.d.ts +49 -0
  315. package/dist/collection/delivery-callback.d.ts.map +1 -0
  316. package/dist/collection/delivery-callback.js +147 -0
  317. package/dist/collection/delivery-callback.js.map +1 -0
  318. package/dist/collection/email-layout.d.ts +45 -0
  319. package/dist/collection/email-layout.d.ts.map +1 -0
  320. package/dist/collection/email-layout.js +247 -0
  321. package/dist/collection/email-layout.js.map +1 -0
  322. package/dist/collection/engine.d.ts +177 -0
  323. package/dist/collection/engine.d.ts.map +1 -0
  324. package/dist/collection/engine.js +407 -0
  325. package/dist/collection/engine.js.map +1 -0
  326. package/dist/collection/format.d.ts +32 -0
  327. package/dist/collection/format.d.ts.map +1 -0
  328. package/dist/collection/format.js +70 -0
  329. package/dist/collection/format.js.map +1 -0
  330. package/dist/collection/payment-block.d.ts +24 -0
  331. package/dist/collection/payment-block.d.ts.map +1 -0
  332. package/dist/collection/payment-block.js +2 -0
  333. package/dist/collection/payment-block.js.map +1 -0
  334. package/dist/collection/policy.d.ts +53 -0
  335. package/dist/collection/policy.d.ts.map +1 -0
  336. package/dist/collection/policy.js +141 -0
  337. package/dist/collection/policy.js.map +1 -0
  338. package/dist/collection/repository.d.ts +129 -0
  339. package/dist/collection/repository.d.ts.map +1 -0
  340. package/dist/collection/repository.js +246 -0
  341. package/dist/collection/repository.js.map +1 -0
  342. package/dist/collection/subject.d.ts +66 -0
  343. package/dist/collection/subject.d.ts.map +1 -0
  344. package/dist/collection/subject.js +99 -0
  345. package/dist/collection/subject.js.map +1 -0
  346. package/dist/collection/template-catalog.d.ts +16 -0
  347. package/dist/collection/template-catalog.d.ts.map +1 -0
  348. package/dist/collection/template-catalog.js +162 -0
  349. package/dist/collection/template-catalog.js.map +1 -0
  350. package/dist/collection/template.d.ts +37 -0
  351. package/dist/collection/template.d.ts.map +1 -0
  352. package/dist/collection/template.js +73 -0
  353. package/dist/collection/template.js.map +1 -0
  354. package/dist/communication/adapters/email.d.ts +28 -0
  355. package/dist/communication/adapters/email.d.ts.map +1 -0
  356. package/dist/communication/adapters/email.js +129 -0
  357. package/dist/communication/adapters/email.js.map +1 -0
  358. package/dist/communication/adapters/sms.d.ts +95 -0
  359. package/dist/communication/adapters/sms.d.ts.map +1 -0
  360. package/dist/communication/adapters/sms.js +121 -0
  361. package/dist/communication/adapters/sms.js.map +1 -0
  362. package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
  363. package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
  364. package/dist/communication/adapters/whatsapp-language.js +36 -0
  365. package/dist/communication/adapters/whatsapp-language.js.map +1 -0
  366. package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
  367. package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
  368. package/dist/communication/adapters/whatsapp-templates.js +97 -0
  369. package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
  370. package/dist/communication/adapters/whatsapp.d.ts +29 -0
  371. package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
  372. package/dist/communication/adapters/whatsapp.js +210 -0
  373. package/dist/communication/adapters/whatsapp.js.map +1 -0
  374. package/dist/communication/audit.d.ts +105 -0
  375. package/dist/communication/audit.d.ts.map +1 -0
  376. package/dist/communication/audit.js +56 -0
  377. package/dist/communication/audit.js.map +1 -0
  378. package/dist/communication/capabilities.d.ts +88 -0
  379. package/dist/communication/capabilities.d.ts.map +1 -0
  380. package/dist/communication/capabilities.js +72 -0
  381. package/dist/communication/capabilities.js.map +1 -0
  382. package/dist/communication/channel.d.ts +125 -0
  383. package/dist/communication/channel.d.ts.map +1 -0
  384. package/dist/communication/channel.js +47 -0
  385. package/dist/communication/channel.js.map +1 -0
  386. package/dist/communication/claim.d.ts +368 -0
  387. package/dist/communication/claim.d.ts.map +1 -0
  388. package/dist/communication/claim.js +224 -0
  389. package/dist/communication/claim.js.map +1 -0
  390. package/dist/communication/consent.d.ts +65 -0
  391. package/dist/communication/consent.d.ts.map +1 -0
  392. package/dist/communication/consent.js +40 -0
  393. package/dist/communication/consent.js.map +1 -0
  394. package/dist/communication/context.d.ts +48 -0
  395. package/dist/communication/context.d.ts.map +1 -0
  396. package/dist/communication/context.js +41 -0
  397. package/dist/communication/context.js.map +1 -0
  398. package/dist/communication/credentials.d.ts +74 -0
  399. package/dist/communication/credentials.d.ts.map +1 -0
  400. package/dist/communication/credentials.js +115 -0
  401. package/dist/communication/credentials.js.map +1 -0
  402. package/dist/communication/dry-run-scenario.d.ts +37 -0
  403. package/dist/communication/dry-run-scenario.d.ts.map +1 -0
  404. package/dist/communication/dry-run-scenario.js +158 -0
  405. package/dist/communication/dry-run-scenario.js.map +1 -0
  406. package/dist/communication/dry-run.d.ts +40 -0
  407. package/dist/communication/dry-run.d.ts.map +1 -0
  408. package/dist/communication/dry-run.js +92 -0
  409. package/dist/communication/dry-run.js.map +1 -0
  410. package/dist/communication/engine.d.ts +153 -0
  411. package/dist/communication/engine.d.ts.map +1 -0
  412. package/dist/communication/engine.js +480 -0
  413. package/dist/communication/engine.js.map +1 -0
  414. package/dist/communication/graph.d.ts +38 -0
  415. package/dist/communication/graph.d.ts.map +1 -0
  416. package/dist/communication/graph.js +45 -0
  417. package/dist/communication/graph.js.map +1 -0
  418. package/dist/communication/idempotency.d.ts +33 -0
  419. package/dist/communication/idempotency.d.ts.map +1 -0
  420. package/dist/communication/idempotency.js +23 -0
  421. package/dist/communication/idempotency.js.map +1 -0
  422. package/dist/communication/identity.d.ts +127 -0
  423. package/dist/communication/identity.d.ts.map +1 -0
  424. package/dist/communication/identity.js +105 -0
  425. package/dist/communication/identity.js.map +1 -0
  426. package/dist/communication/index.d.ts +66 -0
  427. package/dist/communication/index.d.ts.map +1 -0
  428. package/dist/communication/index.js +42 -0
  429. package/dist/communication/index.js.map +1 -0
  430. package/dist/communication/onboarding.d.ts +223 -0
  431. package/dist/communication/onboarding.d.ts.map +1 -0
  432. package/dist/communication/onboarding.js +287 -0
  433. package/dist/communication/onboarding.js.map +1 -0
  434. package/dist/communication/policy.d.ts +99 -0
  435. package/dist/communication/policy.d.ts.map +1 -0
  436. package/dist/communication/policy.js +13 -0
  437. package/dist/communication/policy.js.map +1 -0
  438. package/dist/communication/routing.d.ts +99 -0
  439. package/dist/communication/routing.d.ts.map +1 -0
  440. package/dist/communication/routing.js +73 -0
  441. package/dist/communication/routing.js.map +1 -0
  442. package/dist/communication/sender-profile.d.ts +100 -0
  443. package/dist/communication/sender-profile.d.ts.map +1 -0
  444. package/dist/communication/sender-profile.js +123 -0
  445. package/dist/communication/sender-profile.js.map +1 -0
  446. package/dist/communication/status.d.ts +48 -0
  447. package/dist/communication/status.d.ts.map +1 -0
  448. package/dist/communication/status.js +79 -0
  449. package/dist/communication/status.js.map +1 -0
  450. package/dist/communication/stores/onboarding.d.ts +88 -0
  451. package/dist/communication/stores/onboarding.d.ts.map +1 -0
  452. package/dist/communication/stores/onboarding.js +127 -0
  453. package/dist/communication/stores/onboarding.js.map +1 -0
  454. package/dist/communication/stores/postgres.d.ts +81 -0
  455. package/dist/communication/stores/postgres.d.ts.map +1 -0
  456. package/dist/communication/stores/postgres.js +453 -0
  457. package/dist/communication/stores/postgres.js.map +1 -0
  458. package/dist/communication/stores/routing.d.ts +169 -0
  459. package/dist/communication/stores/routing.d.ts.map +1 -0
  460. package/dist/communication/stores/routing.js +324 -0
  461. package/dist/communication/stores/routing.js.map +1 -0
  462. package/dist/communication/stores/secrets.d.ts +89 -0
  463. package/dist/communication/stores/secrets.d.ts.map +1 -0
  464. package/dist/communication/stores/secrets.js +122 -0
  465. package/dist/communication/stores/secrets.js.map +1 -0
  466. package/dist/communication/template-provider.d.ts +85 -0
  467. package/dist/communication/template-provider.d.ts.map +1 -0
  468. package/dist/communication/template-provider.js +21 -0
  469. package/dist/communication/template-provider.js.map +1 -0
  470. package/dist/communication/template.d.ts +87 -0
  471. package/dist/communication/template.d.ts.map +1 -0
  472. package/dist/communication/template.js +59 -0
  473. package/dist/communication/template.js.map +1 -0
  474. package/dist/communication/webhook-subscription.d.ts +156 -0
  475. package/dist/communication/webhook-subscription.d.ts.map +1 -0
  476. package/dist/communication/webhook-subscription.js +252 -0
  477. package/dist/communication/webhook-subscription.js.map +1 -0
  478. package/dist/communication/webhook.d.ts +121 -0
  479. package/dist/communication/webhook.d.ts.map +1 -0
  480. package/dist/communication/webhook.js +283 -0
  481. package/dist/communication/webhook.js.map +1 -0
  482. package/dist/competence/repository.d.ts +147 -0
  483. package/dist/competence/repository.d.ts.map +1 -0
  484. package/dist/competence/repository.js +294 -0
  485. package/dist/competence/repository.js.map +1 -0
  486. package/dist/contacts/phone.d.ts +70 -0
  487. package/dist/contacts/phone.d.ts.map +1 -0
  488. package/dist/contacts/phone.js +186 -0
  489. package/dist/contacts/phone.js.map +1 -0
  490. package/dist/db/migrate.js +17 -11
  491. package/dist/db/migrate.js.map +1 -1
  492. package/dist/db/seed-catalog.d.ts +18 -0
  493. package/dist/db/seed-catalog.d.ts.map +1 -0
  494. package/dist/db/seed-catalog.js +45 -0
  495. package/dist/db/seed-catalog.js.map +1 -0
  496. package/dist/db/seed.js +16 -8
  497. package/dist/db/seed.js.map +1 -1
  498. package/dist/documents/repository.d.ts +97 -0
  499. package/dist/documents/repository.d.ts.map +1 -0
  500. package/dist/documents/repository.js +236 -0
  501. package/dist/documents/repository.js.map +1 -0
  502. package/dist/documents/requests.d.ts +73 -0
  503. package/dist/documents/requests.d.ts.map +1 -0
  504. package/dist/documents/requests.js +127 -0
  505. package/dist/documents/requests.js.map +1 -0
  506. package/dist/index.d.ts +109 -13
  507. package/dist/index.d.ts.map +1 -1
  508. package/dist/index.js +100 -8
  509. package/dist/index.js.map +1 -1
  510. package/dist/legal/documents.d.ts.map +1 -1
  511. package/dist/legal/documents.js +125 -3
  512. package/dist/legal/documents.js.map +1 -1
  513. package/dist/legal/index.d.ts +1 -1
  514. package/dist/legal/index.d.ts.map +1 -1
  515. package/dist/legal/types.d.ts +32 -1
  516. package/dist/legal/types.d.ts.map +1 -1
  517. package/dist/legal/types.js +1 -0
  518. package/dist/legal/types.js.map +1 -1
  519. package/dist/mail/auth-templates.d.ts +15 -0
  520. package/dist/mail/auth-templates.d.ts.map +1 -0
  521. package/dist/mail/auth-templates.js +26 -0
  522. package/dist/mail/auth-templates.js.map +1 -0
  523. package/dist/mail/dedup-store.d.ts +1 -24
  524. package/dist/mail/dedup-store.d.ts.map +1 -1
  525. package/dist/mail/dedup-store.js +9 -48
  526. package/dist/mail/dedup-store.js.map +1 -1
  527. package/dist/mail/index.d.ts +2 -1
  528. package/dist/mail/index.d.ts.map +1 -1
  529. package/dist/mail/index.js +13 -2
  530. package/dist/mail/index.js.map +1 -1
  531. package/dist/mail/provider.d.ts +2 -30
  532. package/dist/mail/provider.d.ts.map +1 -1
  533. package/dist/mail/provider.js +10 -246
  534. package/dist/mail/provider.js.map +1 -1
  535. package/dist/mail/resend.d.ts +2 -12
  536. package/dist/mail/resend.d.ts.map +1 -1
  537. package/dist/mail/resend.js +11 -17
  538. package/dist/mail/resend.js.map +1 -1
  539. package/dist/mail/sender-resolver.d.ts +1 -7
  540. package/dist/mail/sender-resolver.d.ts.map +1 -1
  541. package/dist/mail/sender-resolver.js +11 -10
  542. package/dist/mail/sender-resolver.js.map +1 -1
  543. package/dist/mail/template-renderer.d.ts +1 -9
  544. package/dist/mail/template-renderer.d.ts.map +1 -1
  545. package/dist/mail/template-renderer.js +10 -15
  546. package/dist/mail/template-renderer.js.map +1 -1
  547. package/dist/mail/transactional-outbound.d.ts +115 -0
  548. package/dist/mail/transactional-outbound.d.ts.map +1 -0
  549. package/dist/mail/transactional-outbound.js +113 -0
  550. package/dist/mail/transactional-outbound.js.map +1 -0
  551. package/dist/mail/types.d.ts +2 -142
  552. package/dist/mail/types.d.ts.map +1 -1
  553. package/dist/mail/types.js +1 -33
  554. package/dist/mail/types.js.map +1 -1
  555. package/dist/portal/provisioning.d.ts +58 -0
  556. package/dist/portal/provisioning.d.ts.map +1 -0
  557. package/dist/portal/provisioning.js +139 -0
  558. package/dist/portal/provisioning.js.map +1 -0
  559. package/dist/pricing-engine/canonical.d.ts +14 -0
  560. package/dist/pricing-engine/canonical.d.ts.map +1 -0
  561. package/dist/pricing-engine/canonical.js +39 -0
  562. package/dist/pricing-engine/canonical.js.map +1 -0
  563. package/dist/pricing-engine/errors.d.ts.map +1 -1
  564. package/dist/pricing-engine/errors.js +6 -1
  565. package/dist/pricing-engine/errors.js.map +1 -1
  566. package/dist/pricing-engine/index.d.ts +12 -2
  567. package/dist/pricing-engine/index.d.ts.map +1 -1
  568. package/dist/pricing-engine/index.js +6 -1
  569. package/dist/pricing-engine/index.js.map +1 -1
  570. package/dist/pricing-engine/pipeline.d.ts.map +1 -1
  571. package/dist/pricing-engine/pipeline.js +202 -28
  572. package/dist/pricing-engine/pipeline.js.map +1 -1
  573. package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
  574. package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
  575. package/dist/pricing-engine/shadow-adapter.js +75 -0
  576. package/dist/pricing-engine/shadow-adapter.js.map +1 -0
  577. package/dist/pricing-engine/shadow-diff.d.ts +26 -0
  578. package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
  579. package/dist/pricing-engine/shadow-diff.js +52 -0
  580. package/dist/pricing-engine/shadow-diff.js.map +1 -0
  581. package/dist/pricing-engine/shadow-facade.d.ts +42 -0
  582. package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
  583. package/dist/pricing-engine/shadow-facade.js +82 -0
  584. package/dist/pricing-engine/shadow-facade.js.map +1 -0
  585. package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
  586. package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
  587. package/dist/pricing-engine/shadow-legacy-types.js +18 -0
  588. package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
  589. package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
  590. package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
  591. package/dist/pricing-engine/shadow-metrics.js +31 -0
  592. package/dist/pricing-engine/shadow-metrics.js.map +1 -0
  593. package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
  594. package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
  595. package/dist/pricing-engine/shadow-normalizer.js +39 -0
  596. package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
  597. package/dist/pricing-engine/types.d.ts +2 -0
  598. package/dist/pricing-engine/types.d.ts.map +1 -1
  599. package/dist/rbac/authorize.d.ts +12 -0
  600. package/dist/rbac/authorize.d.ts.map +1 -1
  601. package/dist/rbac/authorize.js +27 -0
  602. package/dist/rbac/authorize.js.map +1 -1
  603. package/dist/rbac/catalog.d.ts.map +1 -1
  604. package/dist/rbac/catalog.js +67 -1
  605. package/dist/rbac/catalog.js.map +1 -1
  606. package/dist/rbac/workload-provisioning.d.ts +66 -0
  607. package/dist/rbac/workload-provisioning.d.ts.map +1 -0
  608. package/dist/rbac/workload-provisioning.js +153 -0
  609. package/dist/rbac/workload-provisioning.js.map +1 -0
  610. package/dist/rbac/workload.d.ts +124 -0
  611. package/dist/rbac/workload.d.ts.map +1 -0
  612. package/dist/rbac/workload.js +184 -0
  613. package/dist/rbac/workload.js.map +1 -0
  614. package/dist/storage/checksum.d.ts +9 -0
  615. package/dist/storage/checksum.d.ts.map +1 -0
  616. package/dist/storage/checksum.js +12 -0
  617. package/dist/storage/checksum.js.map +1 -0
  618. package/dist/storage/key.d.ts +37 -0
  619. package/dist/storage/key.d.ts.map +1 -0
  620. package/dist/storage/key.js +67 -0
  621. package/dist/storage/key.js.map +1 -0
  622. package/dist/storage/local.d.ts +40 -0
  623. package/dist/storage/local.d.ts.map +1 -0
  624. package/dist/storage/local.js +96 -0
  625. package/dist/storage/local.js.map +1 -0
  626. package/dist/storage/r2.d.ts +43 -0
  627. package/dist/storage/r2.d.ts.map +1 -0
  628. package/dist/storage/r2.js +177 -0
  629. package/dist/storage/r2.js.map +1 -0
  630. package/dist/storage/registry.d.ts +23 -0
  631. package/dist/storage/registry.d.ts.map +1 -0
  632. package/dist/storage/registry.js +37 -0
  633. package/dist/storage/registry.js.map +1 -0
  634. package/dist/storage/types.d.ts +67 -0
  635. package/dist/storage/types.d.ts.map +1 -0
  636. package/dist/storage/types.js +45 -0
  637. package/dist/storage/types.js.map +1 -0
  638. package/dist/subscription-billing/provider/asaas.d.ts +14 -0
  639. package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
  640. package/dist/subscription-billing/provider/asaas.js +32 -7
  641. package/dist/subscription-billing/provider/asaas.js.map +1 -1
  642. package/dist/subscription-billing/provider/disabled.d.ts +9 -0
  643. package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
  644. package/dist/subscription-billing/provider/disabled.js +8 -0
  645. package/dist/subscription-billing/provider/disabled.js.map +1 -1
  646. package/dist/subscription-billing/provider/registry.d.ts +10 -0
  647. package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
  648. package/dist/subscription-billing/provider/registry.js +17 -0
  649. package/dist/subscription-billing/provider/registry.js.map +1 -1
  650. package/dist/subscription-billing/service.d.ts +17 -1
  651. package/dist/subscription-billing/service.d.ts.map +1 -1
  652. package/dist/subscription-billing/service.js +57 -8
  653. package/dist/subscription-billing/service.js.map +1 -1
  654. package/dist/subscription-billing/types.d.ts +13 -0
  655. package/dist/subscription-billing/types.d.ts.map +1 -1
  656. package/dist/subscription-billing/types.js.map +1 -1
  657. package/dist/tenancy/provisioning.d.ts.map +1 -1
  658. package/dist/tenancy/provisioning.js +32 -8
  659. package/dist/tenancy/provisioning.js.map +1 -1
  660. package/dist/users/repository.d.ts +38 -0
  661. package/dist/users/repository.d.ts.map +1 -1
  662. package/dist/users/repository.js +118 -3
  663. package/dist/users/repository.js.map +1 -1
  664. package/dist/vault/repository.d.ts +67 -0
  665. package/dist/vault/repository.d.ts.map +1 -1
  666. package/dist/vault/repository.js +78 -0
  667. package/dist/vault/repository.js.map +1 -1
  668. package/package.json +13 -4
  669. package/src/db/migrations/0023_user_invite_activation.sql +15 -0
  670. package/src/db/migrations/0024_set_user_password_function.sql +32 -0
  671. package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
  672. package/src/db/migrations/0026_documents_and_competence.sql +353 -0
  673. package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
  674. package/src/db/migrations/0028_collection_engine.sql +94 -0
  675. package/src/db/migrations/0029_payment_rail.sql +107 -0
  676. package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
  677. package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
  678. package/src/db/migrations/0032_settlement_reversal.sql +76 -0
  679. package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
  680. package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
  681. package/src/db/migrations/0035_payment_account_environments.sql +61 -0
  682. package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
  683. package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
  684. package/src/db/migrations/0038_notification_channels.sql +175 -0
  685. package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
  686. package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
  687. package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
  688. package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
  689. package/src/db/migrations/0043_workload_identity.sql +105 -0
  690. package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
  691. package/dist/cjs/mail/resend-client.js +0 -103
  692. package/dist/cjs/mail/resend-client.js.map +0 -1
  693. package/dist/mail/resend-client.d.ts +0 -16
  694. package/dist/mail/resend-client.d.ts.map +0 -1
  695. package/dist/mail/resend-client.js +0 -100
  696. package/dist/mail/resend-client.js.map +0 -1
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.invitePortalUser = invitePortalUser;
4
+ exports.listPortalUsers = listPortalUsers;
5
+ exports.revokePortalAccess = revokePortalAccess;
6
+ const shared_1 = require("@baruk/shared");
7
+ const audit_js_1 = require("../audit/audit.js");
8
+ const password_reset_js_1 = require("../auth/password-reset.js");
9
+ const repository_js_1 = require("../users/repository.js");
10
+ const PORTAL_ROLE_KEY = 'client_titular';
11
+ async function invitePortalUser(tx, input) {
12
+ const tenantId = await currentTenantId(tx);
13
+ // O cliente precisa existir NESTE tenant. A RLS já garantiria, mas uma
14
+ // mensagem clara vale mais que um erro de FK.
15
+ const client = await tx `
16
+ SELECT id FROM client WHERE id = ${input.clientId} AND deleted_at IS NULL
17
+ `;
18
+ if (!client[0])
19
+ throw new shared_1.NotFoundError('Cliente não encontrado');
20
+ const existing = await tx `
21
+ SELECT id, full_name, user_type, status FROM "user"
22
+ WHERE email = ${input.email} AND deleted_at IS NULL
23
+ `;
24
+ let userId;
25
+ let fullName;
26
+ let isNewUser;
27
+ // Reconvidar quem ainda não ativou precisa emitir um token novo. Sem isto o
28
+ // usuário fica preso: o primeiro convite não chegou (ou expirou) e nenhum
29
+ // reenvio produz link, porque só o cadastro inicial emitia token.
30
+ let isPendingActivation = false;
31
+ if (existing[0]) {
32
+ // Um e-mail de staff não vira acesso de portal por convite. Os dois tipos
33
+ // têm superfícies e escopos distintos, e converter silenciosamente daria a
34
+ // um colaborador do escritório uma sessão de cliente.
35
+ if (existing[0].user_type !== 'client_portal') {
36
+ throw new shared_1.ConflictError('Este e-mail já pertence a um usuário interno. Use um e-mail diferente para o acesso do cliente.');
37
+ }
38
+ userId = existing[0].id;
39
+ fullName = existing[0].full_name;
40
+ isNewUser = false;
41
+ // Só quem ainda não ativou recebe token novo. Emitir para um usuário já
42
+ // ativo transformaria o convite em redefinição de senha à revelia do
43
+ // cliente — quem convida não pode provocar isso.
44
+ isPendingActivation = existing[0].status === 'invited';
45
+ }
46
+ else {
47
+ userId = (0, shared_1.uuidv7)();
48
+ fullName = input.fullName;
49
+ isNewUser = true;
50
+ await tx `
51
+ INSERT INTO "user" (id, email, full_name, user_type, status, auth_provider)
52
+ VALUES (${userId}, ${input.email}, ${input.fullName}, 'client_portal', 'invited', 'password')
53
+ `;
54
+ }
55
+ // Membership no tenant — sem ela o usuário não resolve tenant no login.
56
+ const membership = await tx `
57
+ SELECT id FROM membership
58
+ WHERE user_id = ${userId} AND tenant_id = ${tenantId} AND deleted_at IS NULL
59
+ `;
60
+ if (!membership[0]) {
61
+ await tx `
62
+ INSERT INTO membership (id, tenant_id, user_id, status, invited_by)
63
+ VALUES (${(0, shared_1.uuidv7)()}, ${tenantId}, ${userId}, 'invited', ${input.invitedBy})
64
+ `;
65
+ await (0, repository_js_1.setUserRole)(tx, userId, PORTAL_ROLE_KEY);
66
+ }
67
+ // O vínculo com o cliente. Idempotente: reconvidar não duplica.
68
+ const access = await tx `
69
+ INSERT INTO client_portal_access (id, tenant_id, user_id, client_id, status)
70
+ VALUES (${(0, shared_1.uuidv7)()}, ${tenantId}, ${userId}, ${input.clientId}, 'active')
71
+ ON CONFLICT (tenant_id, user_id, client_id) DO UPDATE SET status = 'active'
72
+ RETURNING id
73
+ `;
74
+ let activationToken = null;
75
+ if (isNewUser || isPendingActivation) {
76
+ const activation = await (0, password_reset_js_1.createActivationToken)(tx, { userId, tenantId });
77
+ activationToken = activation.token;
78
+ }
79
+ await (0, audit_js_1.appendAudit)(tx, {
80
+ actorId: input.invitedBy,
81
+ action: 'portal_user_invited',
82
+ resourceType: 'client_portal_access',
83
+ resourceId: access[0].id,
84
+ // O token nunca entra na auditoria, nem em metadata: o registro é lido por
85
+ // gente que não deve poder assumir a conta do cliente.
86
+ metadata: { email: input.email, clientId: input.clientId, isNewUser, isPendingActivation },
87
+ });
88
+ return {
89
+ userId,
90
+ email: input.email,
91
+ fullName,
92
+ clientId: input.clientId,
93
+ activationToken,
94
+ alreadyHadAccess: !isNewUser && membership.length > 0,
95
+ isReinvite: isPendingActivation,
96
+ };
97
+ }
98
+ async function listPortalUsers(tx, clientId) {
99
+ const rows = await tx `
100
+ SELECT u.id AS user_id, u.email, u.full_name, u.status,
101
+ cpa.status AS access_status, u.last_login_at
102
+ FROM client_portal_access cpa
103
+ JOIN "user" u ON u.id = cpa.user_id
104
+ WHERE cpa.client_id = ${clientId} AND u.deleted_at IS NULL
105
+ ORDER BY u.full_name
106
+ `;
107
+ return rows.map((r) => ({
108
+ userId: r.user_id,
109
+ email: r.email,
110
+ fullName: r.full_name,
111
+ status: r.status,
112
+ accessStatus: r.access_status,
113
+ lastLoginAt: r.last_login_at ? r.last_login_at.toISOString() : null,
114
+ }));
115
+ }
116
+ /**
117
+ * Revoga o acesso. Não apaga o usuário nem a trilha: quem enviou um documento
118
+ * continua identificável depois de perder o acesso — é justamente isso que
119
+ * torna a prova utilizável meses depois.
120
+ */
121
+ async function revokePortalAccess(tx, input) {
122
+ const rows = await tx `
123
+ UPDATE client_portal_access
124
+ SET status = 'revoked'
125
+ WHERE client_id = ${input.clientId} AND user_id = ${input.userId} AND status = 'active'
126
+ RETURNING id
127
+ `;
128
+ if (!rows[0])
129
+ throw new shared_1.NotFoundError('Acesso ativo não encontrado');
130
+ await (0, audit_js_1.appendAudit)(tx, {
131
+ actorId: input.revokedBy,
132
+ action: 'portal_access_revoked',
133
+ resourceType: 'client_portal_access',
134
+ resourceId: rows[0].id,
135
+ metadata: { clientId: input.clientId, userId: input.userId },
136
+ });
137
+ }
138
+ async function currentTenantId(tx) {
139
+ const rows = await tx `
140
+ SELECT current_setting('app.current_tenant')::uuid AS tenant_id
141
+ `;
142
+ return rows[0].tenant_id;
143
+ }
144
+ //# sourceMappingURL=provisioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisioning.js","sourceRoot":"","sources":["../../../src/portal/provisioning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * Serialização canônica (RFC-CAPABILITY-PRICING-ENGINE-001 §22.1 F2) — usada
4
+ * exclusivamente para compor o `fingerprint`/`quoteId` (nunca para persistir
5
+ * ou transportar dados). `JSON.stringify` cru depende da ordem de inserção
6
+ * das chaves do objeto — dois `PricingRequest` economicamente idênticos, mas
7
+ * construídos com `addonQuantities`/Records em ordem de chave diferente,
8
+ * produziam hashes diferentes antes deste módulo (achado do Design Review,
9
+ * §22.1). `canonicalize` ordena chaves recursivamente em qualquer nível de
10
+ * objeto/Record/Map aninhado — arrays preservam ordem (a ordem de array é
11
+ * semanticamente relevante quando existe; coleções sem ordem própria, como
12
+ * `bundleRules`, são pré-ordenadas pelo chamador antes de chegar aqui).
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.canonicalStringify = canonicalStringify;
16
+ function canonicalize(value) {
17
+ if (value instanceof Map) {
18
+ const entries = Array.from(value.entries())
19
+ .map(([k, v]) => [String(k), canonicalize(v)])
20
+ .sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));
21
+ const record = {};
22
+ for (const [k, v] of entries)
23
+ record[k] = v;
24
+ return record;
25
+ }
26
+ if (Array.isArray(value)) {
27
+ return value.map(canonicalize);
28
+ }
29
+ if (value !== null && typeof value === 'object') {
30
+ const record = value;
31
+ const result = {};
32
+ for (const key of Object.keys(record).sort()) {
33
+ result[key] = canonicalize(record[key]);
34
+ }
35
+ return result;
36
+ }
37
+ return value;
38
+ }
39
+ function canonicalStringify(value) {
40
+ return JSON.stringify(canonicalize(value));
41
+ }
42
+ //# sourceMappingURL=canonical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../../src/pricing-engine/canonical.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AAyBH,gDAEC;AAzBD,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAU,CAAC;aACtD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO;YAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,kBAAkB,CAAC,KAAc;IAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -41,7 +41,12 @@ class PricingEngineError extends Error {
41
41
  this.ruleIds = ruleIds;
42
42
  }
43
43
  toJSON() {
44
- return { code: this.code, errorClass: this.errorClass, message: this.message, ruleIds: this.ruleIds };
44
+ return {
45
+ code: this.code,
46
+ errorClass: this.errorClass,
47
+ message: this.message,
48
+ ruleIds: this.ruleIds,
49
+ };
45
50
  }
46
51
  }
47
52
  exports.PricingEngineError = PricingEngineError;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/pricing-engine/errors.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AA6BH,MAAM,WAAW,GAAgD;IAC/D,2BAA2B,EAAE,eAAe;IAC5C,iBAAiB,EAAE,YAAY;IAC/B,kBAAkB,EAAE,YAAY;IAChC,mBAAmB,EAAE,WAAW;IAChC,mBAAmB,EAAE,UAAU;IAC/B,gBAAgB,EAAE,eAAe;IACjC,uBAAuB,EAAE,WAAW;IACpC,gBAAgB,EAAE,YAAY;IAC9B,gBAAgB,EAAE,sBAAsB;IACxC,qBAAqB,EAAE,YAAY;IACnC,mBAAmB,EAAE,UAAU;IAC/B,mBAAmB,EAAE,YAAY;IACjC,6BAA6B,EAAE,eAAe;IAC9C,oBAAoB,EAAE,eAAe;IACrC,qBAAqB,EAAE,WAAW;IAClC,wBAAwB,EAAE,YAAY;CACvC,CAAC;AAEF,MAAa,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAmB;IACvB,UAAU,CAAoB;IACvC,2EAA2E;IAClE,OAAO,CAAW;IAE3B,YAAY,IAAsB,EAAE,OAAe,EAAE,UAAoB,EAAE;QACzE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACxG,CAAC;CACF;AAjBD,gDAiBC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/pricing-engine/errors.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AA8BH,MAAM,WAAW,GAAgD;IAC/D,2BAA2B,EAAE,eAAe;IAC5C,iBAAiB,EAAE,YAAY;IAC/B,kBAAkB,EAAE,YAAY;IAChC,mBAAmB,EAAE,WAAW;IAChC,mBAAmB,EAAE,UAAU;IAC/B,gBAAgB,EAAE,eAAe;IACjC,uBAAuB,EAAE,WAAW;IACpC,gBAAgB,EAAE,YAAY;IAC9B,gBAAgB,EAAE,sBAAsB;IACxC,qBAAqB,EAAE,YAAY;IACnC,mBAAmB,EAAE,UAAU;IAC/B,mBAAmB,EAAE,YAAY;IACjC,6BAA6B,EAAE,eAAe;IAC9C,oBAAoB,EAAE,eAAe;IACrC,qBAAqB,EAAE,WAAW;IAClC,wBAAwB,EAAE,YAAY;CACvC,CAAC;AAEF,MAAa,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAmB;IACvB,UAAU,CAAoB;IACvC,2EAA2E;IAClE,OAAO,CAAW;IAE3B,YAAY,IAAsB,EAAE,OAAe,EAAE,UAAoB,EAAE;QACzE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,MAAM;QAMJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;CACF;AA3BD,gDA2BC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.compareQuotes = exports.normalizeCanonicalQuote = exports.computePricingQuote = exports.computeProration = exports.resolveBundleDiscount = exports.freeModuleCodesForBundle = exports.assertBundleModulesCovered = exports.PRICING_RULE_STEPS_IN_ORDER = exports.PRICING_ENGINE_VERSION = exports.PricingEngineError = exports.clampNonNegative = exports.prorateByDays = exports.applyPercent = exports.multiplyByQuantity = exports.subtractCents = exports.addCents = exports.centsToReais = exports.reaisToCents = exports.roundHalfEven = void 0;
3
+ exports.runShadowComparison = exports.computeShadowMetrics = exports.categorizeDiffs = exports.normalizeLegacyQuote = exports.toPricingRequest = exports.STORAGE_ADDON_TARGET_CODE = exports.compareQuotes = exports.normalizeCanonicalQuote = exports.computePricingQuote = exports.computeProration = exports.resolveBundleDiscount = exports.freeModuleCodesForBundle = exports.assertBundleModulesCovered = exports.PRICING_RULE_STEPS_IN_ORDER = exports.PRICING_ENGINE_VERSION = exports.PricingEngineError = exports.clampNonNegative = exports.prorateByDays = exports.applyPercent = exports.multiplyByQuantity = exports.subtractCents = exports.addCents = exports.centsToReais = exports.reaisToCents = exports.roundHalfEven = void 0;
4
4
  var money_js_1 = require("./money.js");
5
5
  Object.defineProperty(exports, "roundHalfEven", { enumerable: true, get: function () { return money_js_1.roundHalfEven; } });
6
6
  Object.defineProperty(exports, "reaisToCents", { enumerable: true, get: function () { return money_js_1.reaisToCents; } });
@@ -27,4 +27,15 @@ Object.defineProperty(exports, "computePricingQuote", { enumerable: true, get: f
27
27
  var shadow_js_1 = require("./shadow.js");
28
28
  Object.defineProperty(exports, "normalizeCanonicalQuote", { enumerable: true, get: function () { return shadow_js_1.normalizeCanonicalQuote; } });
29
29
  Object.defineProperty(exports, "compareQuotes", { enumerable: true, get: function () { return shadow_js_1.compareQuotes; } });
30
+ var shadow_adapter_js_1 = require("./shadow-adapter.js");
31
+ Object.defineProperty(exports, "STORAGE_ADDON_TARGET_CODE", { enumerable: true, get: function () { return shadow_adapter_js_1.STORAGE_ADDON_TARGET_CODE; } });
32
+ Object.defineProperty(exports, "toPricingRequest", { enumerable: true, get: function () { return shadow_adapter_js_1.toPricingRequest; } });
33
+ var shadow_normalizer_js_1 = require("./shadow-normalizer.js");
34
+ Object.defineProperty(exports, "normalizeLegacyQuote", { enumerable: true, get: function () { return shadow_normalizer_js_1.normalizeLegacyQuote; } });
35
+ var shadow_diff_js_1 = require("./shadow-diff.js");
36
+ Object.defineProperty(exports, "categorizeDiffs", { enumerable: true, get: function () { return shadow_diff_js_1.categorizeDiffs; } });
37
+ var shadow_metrics_js_1 = require("./shadow-metrics.js");
38
+ Object.defineProperty(exports, "computeShadowMetrics", { enumerable: true, get: function () { return shadow_metrics_js_1.computeShadowMetrics; } });
39
+ var shadow_facade_js_1 = require("./shadow-facade.js");
40
+ Object.defineProperty(exports, "runShadowComparison", { enumerable: true, get: function () { return shadow_facade_js_1.runShadowComparison; } });
30
41
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pricing-engine/index.ts"],"names":[],"mappings":";;;AACA,uCAUoB;AATlB,yGAAA,aAAa,OAAA;AACb,wGAAA,YAAY,OAAA;AACZ,wGAAA,YAAY,OAAA;AACZ,oGAAA,QAAQ,OAAA;AACR,yGAAA,aAAa,OAAA;AACb,8GAAA,kBAAkB,OAAA;AAClB,wGAAA,YAAY,OAAA;AACZ,yGAAA,aAAa,OAAA;AACb,4GAAA,gBAAgB,OAAA;AAIlB,yCAAiD;AAAxC,+GAAA,kBAAkB,OAAA;AAsB3B,uCAAiF;AAAxE,kHAAA,sBAAsB,OAAA;AAAE,uHAAA,2BAA2B,OAAA;AAE5D,yCAA0G;AAAjG,uHAAA,0BAA0B,OAAA;AAAE,qHAAA,wBAAwB,OAAA;AAAE,kHAAA,qBAAqB,OAAA;AACpF,+CAAkD;AAAzC,gHAAA,gBAAgB,OAAA;AACzB,6CAAoD;AAA3C,kHAAA,mBAAmB,OAAA;AAG5B,yCAAqE;AAA5D,oHAAA,uBAAuB,OAAA;AAAE,0GAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pricing-engine/index.ts"],"names":[],"mappings":";;;AACA,uCAUoB;AATlB,yGAAA,aAAa,OAAA;AACb,wGAAA,YAAY,OAAA;AACZ,wGAAA,YAAY,OAAA;AACZ,oGAAA,QAAQ,OAAA;AACR,yGAAA,aAAa,OAAA;AACb,8GAAA,kBAAkB,OAAA;AAClB,wGAAA,YAAY,OAAA;AACZ,yGAAA,aAAa,OAAA;AACb,4GAAA,gBAAgB,OAAA;AAIlB,yCAAiD;AAAxC,+GAAA,kBAAkB,OAAA;AAsB3B,uCAAiF;AAAxE,kHAAA,sBAAsB,OAAA;AAAE,uHAAA,2BAA2B,OAAA;AAE5D,yCAIqB;AAHnB,uHAAA,0BAA0B,OAAA;AAC1B,qHAAA,wBAAwB,OAAA;AACxB,kHAAA,qBAAqB,OAAA;AAEvB,+CAAkD;AAAzC,gHAAA,gBAAgB,OAAA;AACzB,6CAAoD;AAA3C,kHAAA,mBAAmB,OAAA;AAQ5B,yCAAqE;AAA5D,oHAAA,uBAAuB,OAAA;AAAE,0GAAA,aAAa,OAAA;AAgB/C,yDAAkF;AAAzE,8HAAA,yBAAyB,OAAA;AAAE,qHAAA,gBAAgB,OAAA;AACpD,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA;AAE7B,mDAAmD;AAA1C,iHAAA,eAAe,OAAA;AAExB,yDAA2D;AAAlD,yHAAA,oBAAoB,OAAA;AAE7B,uDAAyD;AAAhD,uHAAA,mBAAmB,OAAA"}
@@ -5,6 +5,8 @@ const node_crypto_1 = require("node:crypto");
5
5
  const money_js_1 = require("./money.js");
6
6
  const errors_js_1 = require("./errors.js");
7
7
  const bundle_js_1 = require("./bundle.js");
8
+ const canonical_js_1 = require("./canonical.js");
9
+ const proration_js_1 = require("./proration.js");
8
10
  const types_js_1 = require("./types.js");
9
11
  /**
10
12
  * Pipeline determinístico do Pricing Engine (RFC-CAPABILITY-PRICING-ENGINE-001
@@ -24,39 +26,152 @@ const types_js_1 = require("./types.js");
24
26
  * internamente usamos `throw PricingEngineError` e capturamos em
25
27
  * `computePricingQuote`.
26
28
  */
29
+ /**
30
+ * Base do fingerprint (RFC §22.1 F1) — deve cobrir TODO campo capaz de alterar
31
+ * o `PricingQuote` resultante (magnitude econômica OU conteúdo devolvido
32
+ * verbatim no quote, como `trial.endsAt`), nunca só os `code`s. Campos
33
+ * conscientemente OMITIDOS porque não influenciam a saída (o gate de vigência
34
+ * do contrato negociado já lança erro ANTES do fingerprint ser calculado, e
35
+ * `NegotiatedContract.priority`/`freeModuleCodes` não são lidos em nenhum
36
+ * ponto do pipeline hoje — dead fields, fora do escopo deste micro-sprint):
37
+ * `negotiatedContract.validFrom`/`validTo`/`priority`/`freeModuleCodes`.
38
+ * Coleções sem ordem própria (`bundleRules`) são pré-ordenadas por chave
39
+ * estável antes de entrar no hash — `canonicalStringify` cuida da ordem de
40
+ * chaves de objeto/Record, não da ordem de arrays.
41
+ */
27
42
  function fingerprintOf(request) {
28
43
  const basis = {
29
44
  tenantId: request.tenantId,
30
45
  productLine: request.productLine,
31
46
  offerCode: request.offer.code,
32
47
  planCode: request.plan.code,
48
+ plan: {
49
+ code: request.plan.code,
50
+ name: request.plan.name,
51
+ tier: request.plan.tier,
52
+ franchises: request.plan.franchises,
53
+ defaultTrialDays: request.plan.defaultTrialDays,
54
+ isPublic: request.plan.isPublic,
55
+ isActive: request.plan.isActive,
56
+ },
33
57
  moduleCodes: [...request.offer.moduleCodes].sort(),
34
58
  bundleCodes: [...request.offer.bundleCodes].sort(),
35
59
  addonCodes: [...request.offer.addonCodes].sort(),
36
- priceTableCode: request.priceTable.code,
37
- priceTableVersion: request.priceTable.version,
60
+ modules: request.modules
61
+ .map((m) => ({
62
+ code: m.code,
63
+ name: m.name,
64
+ class: m.class,
65
+ category: m.category ?? null,
66
+ requiredModuleCodes: [...m.requiredModuleCodes].sort(),
67
+ marketplaceVisible: m.marketplaceVisible,
68
+ isActive: m.isActive,
69
+ }))
70
+ .sort((a, b) => a.code.localeCompare(b.code)),
71
+ bundles: request.bundles
72
+ .map((b) => ({
73
+ code: b.code,
74
+ name: b.name,
75
+ moduleCodes: [...b.moduleCodes].sort(),
76
+ isActive: b.isActive,
77
+ }))
78
+ .sort((a, b) => a.code.localeCompare(b.code)),
79
+ priceTable: {
80
+ code: request.priceTable.code,
81
+ currency: request.priceTable.currency,
82
+ status: request.priceTable.status,
83
+ version: request.priceTable.version,
84
+ effectiveFrom: request.priceTable.effectiveFrom,
85
+ effectiveTo: request.priceTable.effectiveTo,
86
+ scopes: [...(request.priceTable.scopes ?? [])]
87
+ .map((s) => ({
88
+ scopeType: s.scopeType,
89
+ matchValue: s.matchValue,
90
+ priority: s.priority ?? null,
91
+ }))
92
+ .sort((a, b) => `${a.scopeType}:${a.matchValue}:${a.priority}`.localeCompare(`${b.scopeType}:${b.matchValue}:${b.priority}`)),
93
+ items: [...request.priceTable.items]
94
+ .map((i) => ({
95
+ targetType: i.targetType,
96
+ targetCode: i.targetCode,
97
+ amount: i.amount,
98
+ interval: i.interval,
99
+ }))
100
+ .sort((a, b) => `${a.targetType}:${a.targetCode}:${a.interval}`.localeCompare(`${b.targetType}:${b.targetCode}:${b.interval}`)),
101
+ },
38
102
  billingCycle: request.billingCycle,
39
103
  extraSeats: request.extraSeats ?? 0,
40
104
  addonQuantities: request.addonQuantities ?? {},
41
- couponCode: request.coupon?.code ?? null,
42
- campaignCode: request.campaign?.code ?? null,
43
- negotiatedContractTenantId: request.negotiatedContract?.tenantId ?? null,
44
- negotiatedDiscountPercent: request.negotiatedContract?.discountPercent ?? null,
45
- negotiatedFixedTotalCents: request.negotiatedContract?.fixedTotalCents ?? null,
46
- trialActive: request.trial?.active ?? false,
105
+ bundleRules: [...(request.bundleRules ?? [])]
106
+ .map((r) => ({
107
+ bundleCode: r.bundleCode,
108
+ kind: r.kind,
109
+ value: r.value ?? null,
110
+ freeModuleCode: r.freeModuleCode ?? null,
111
+ priority: r.priority ?? null,
112
+ }))
113
+ .sort((a, b) => a.bundleCode.localeCompare(b.bundleCode)),
114
+ coupon: request.coupon
115
+ ? {
116
+ code: request.coupon.code,
117
+ effectType: request.coupon.effectType,
118
+ percentOff: request.coupon.percentOff ?? null,
119
+ amountOffCents: request.coupon.amountOffCents ?? null,
120
+ exclusive: request.coupon.exclusive ?? false,
121
+ priority: request.coupon.priority ?? null,
122
+ }
123
+ : null,
124
+ campaign: request.campaign
125
+ ? {
126
+ code: request.campaign.code,
127
+ effectType: request.campaign.effectType,
128
+ percentOff: request.campaign.percentOff ?? null,
129
+ amountOffCents: request.campaign.amountOffCents ?? null,
130
+ exclusive: request.campaign.exclusive ?? false,
131
+ priority: request.campaign.priority ?? null,
132
+ }
133
+ : null,
134
+ negotiatedContract: request.negotiatedContract
135
+ ? {
136
+ tenantId: request.negotiatedContract.tenantId,
137
+ discountPercent: request.negotiatedContract.discountPercent ?? null,
138
+ fixedTotalCents: request.negotiatedContract.fixedTotalCents ?? null,
139
+ }
140
+ : null,
141
+ trial: request.trial
142
+ ? {
143
+ active: request.trial.active,
144
+ endsAt: request.trial.endsAt,
145
+ reducedFranchises: request.trial.reducedFranchises ?? {},
146
+ }
147
+ : null,
148
+ proration: request.proration
149
+ ? {
150
+ reason: request.proration.reason,
151
+ cycleStart: request.proration.cycleStart,
152
+ cycleEnd: request.proration.cycleEnd,
153
+ now: request.proration.now,
154
+ oldValueCents: request.proration.oldValueCents,
155
+ newValueCents: request.proration.newValueCents,
156
+ timingPolicy: request.proration.timingPolicy ?? null,
157
+ }
158
+ : null,
159
+ quoteValidityHours: request.quoteValidityHours ?? 24,
47
160
  now: request.now,
48
161
  };
49
- return (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(basis)).digest('hex');
162
+ return (0, node_crypto_1.createHash)('sha256').update((0, canonical_js_1.canonicalStringify)(basis)).digest('hex');
50
163
  }
51
164
  function catalogFingerprint(plan, modules, bundles) {
52
165
  const basis = {
53
166
  plan: { code: plan.code, tier: plan.tier, franchises: plan.franchises },
54
- modules: modules.map((m) => ({ code: m.code, class: m.class })).sort((a, b) => a.code.localeCompare(b.code)),
167
+ modules: modules
168
+ .map((m) => ({ code: m.code, class: m.class }))
169
+ .sort((a, b) => a.code.localeCompare(b.code)),
55
170
  bundles: bundles
56
171
  .map((b) => ({ code: b.code, moduleCodes: [...b.moduleCodes].sort() }))
57
172
  .sort((a, b) => a.code.localeCompare(b.code)),
58
173
  };
59
- return (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(basis)).digest('hex');
174
+ return (0, node_crypto_1.createHash)('sha256').update((0, canonical_js_1.canonicalStringify)(basis)).digest('hex');
60
175
  }
61
176
  function addHours(iso, hours) {
62
177
  const d = /^\d{4}-\d{2}-\d{2}$/.test(iso) ? new Date(`${iso}T00:00:00Z`) : new Date(iso);
@@ -64,7 +179,13 @@ function addHours(iso, hours) {
64
179
  return d.toISOString();
65
180
  }
66
181
  function itemOf(origin, targetCode, quantity, unitPriceCents, subtotalCents) {
67
- return { origin, targetCode, quantity, unitPriceCents, subtotalCents: subtotalCents ?? unitPriceCents * quantity };
182
+ return {
183
+ origin,
184
+ targetCode,
185
+ quantity,
186
+ unitPriceCents,
187
+ subtotalCents: subtotalCents ?? unitPriceCents * quantity,
188
+ };
68
189
  }
69
190
  /**
70
191
  * Busca o preço por `targetType`+`targetCode` **filtrado pelo `billingCycle`**
@@ -125,22 +246,34 @@ function computePricingQuote(request) {
125
246
  }
126
247
  }
127
248
  function computeInternal(request) {
128
- const { tenantId, productLine, offer, plan, modules, bundles, priceTable, bundleRules = [], extraSeats = 0, addonQuantities = {}, negotiatedContract, coupon, campaign, trial, now, billingCycle, quoteValidityHours = 24, } = request;
249
+ const { tenantId, productLine, offer, plan, modules, bundles, priceTable, bundleRules = [], extraSeats = 0, addonQuantities = {}, negotiatedContract, coupon, campaign, trial, proration, now, billingCycle, quoteValidityHours = 24, } = request;
129
250
  if (priceTable.code !== offer.priceTableCode) {
130
251
  throw new errors_js_1.PricingEngineError('price-rule-missing', `Offer "${offer.code}" referencia a tabela "${offer.priceTableCode}", recebida "${priceTable.code}".`);
131
252
  }
132
253
  if (priceTable.status !== 'active') {
133
254
  throw new errors_js_1.PricingEngineError('catalog-version-not-found', `Tabela "${priceTable.code}" não está ativa (status="${priceTable.status}").`);
134
255
  }
135
- if (now < priceTable.effectiveFrom || (priceTable.effectiveTo != null && now > priceTable.effectiveTo)) {
256
+ if (now < priceTable.effectiveFrom ||
257
+ (priceTable.effectiveTo != null && now > priceTable.effectiveTo)) {
136
258
  throw new errors_js_1.PricingEngineError('invalid-effective-date', `Tabela "${priceTable.code}" fora de vigência em ${now}.`);
137
259
  }
138
260
  if (!isTableApplicable(priceTable, tenantId, productLine)) {
139
261
  throw new errors_js_1.PricingEngineError('catalog-version-not-found', `Tabela "${priceTable.code}" não se aplica ao escopo tenant="${tenantId}"/productLine="${productLine}".`);
140
262
  }
141
- if (negotiatedContract && (now < negotiatedContract.validFrom || (negotiatedContract.validTo != null && now > negotiatedContract.validTo))) {
263
+ if (negotiatedContract &&
264
+ (now < negotiatedContract.validFrom ||
265
+ (negotiatedContract.validTo != null && now > negotiatedContract.validTo))) {
142
266
  throw new errors_js_1.PricingEngineError('negotiated-contract-invalid', `Contrato negociado do tenant "${negotiatedContract.tenantId}" fora de vigência em ${now}.`);
143
267
  }
268
+ // F3 (RFC §22.1/§22.5): discountPercent (passo 6, NegotiatedDiscount — cumulativo) e
269
+ // fixedTotalCents (passo 10, ContractPriceOverride — substitui o total) são estratégias
270
+ // comerciais mutuamente exclusivas. Coexistindo, `discounts[]` registraria um desconto que
271
+ // o override ignora — `totalDiscount` divergiria de `Σ discounts` (auditoria quebrada).
272
+ if (negotiatedContract &&
273
+ negotiatedContract.discountPercent != null &&
274
+ negotiatedContract.fixedTotalCents != null) {
275
+ throw new errors_js_1.PricingEngineError('negotiated-contract-invalid', `Contrato negociado do tenant "${negotiatedContract.tenantId}" não pode ter discountPercent (NegotiatedDiscount) e fixedTotalCents (ContractPriceOverride) simultaneamente — são estratégias comerciais mutuamente exclusivas.`);
276
+ }
144
277
  const warnings = [];
145
278
  const appliedRules = [];
146
279
  const items = [];
@@ -163,7 +296,9 @@ function computeInternal(request) {
163
296
  throw new errors_js_1.PricingEngineError('duplicate-charge-item', `Módulo "${moduleCode}" duplicado na oferta "${offer.code}".`);
164
297
  }
165
298
  chargedModuleCodes.add(moduleCode);
166
- const unitCents = freeModuleCodes.has(moduleCode) ? 0 : (0, money_js_1.reaisToCents)(findPriceItemReais(priceTable, 'MODULE', moduleCode, billingCycle));
299
+ const unitCents = freeModuleCodes.has(moduleCode)
300
+ ? 0
301
+ : (0, money_js_1.reaisToCents)(findPriceItemReais(priceTable, 'MODULE', moduleCode, billingCycle));
167
302
  items.push(itemOf('module', moduleCode, 1, unitCents));
168
303
  }
169
304
  if (offer.moduleCodes.length > 0)
@@ -191,7 +326,11 @@ function computeInternal(request) {
191
326
  if (coupon?.exclusive)
192
327
  exclusiveCandidates.push({ key: 'coupon', priority: coupon.priority ?? 0, code: coupon.code });
193
328
  if (campaign?.exclusive)
194
- exclusiveCandidates.push({ key: 'campaign', priority: campaign.priority ?? 0, code: campaign.code });
329
+ exclusiveCandidates.push({
330
+ key: 'campaign',
331
+ priority: campaign.priority ?? 0,
332
+ code: campaign.code,
333
+ });
195
334
  let suppressBundleAndNegotiated = false;
196
335
  let ignoredExclusiveKey = null;
197
336
  if (exclusiveCandidates.length === 1) {
@@ -219,7 +358,13 @@ function computeInternal(request) {
219
358
  const amount = (0, bundle_js_1.resolveBundleDiscount)(bundle, rule, items);
220
359
  if (amount != null && amount > 0) {
221
360
  const applied = Math.min(amount, runningCents);
222
- discounts.push({ ruleId: bundleCode, step: 'BUNDLE_DISCOUNT', kind: 'bundle', amountCents: applied, appliesTo: bundle.moduleCodes });
361
+ discounts.push({
362
+ ruleId: bundleCode,
363
+ step: 'BUNDLE_DISCOUNT',
364
+ kind: 'bundle',
365
+ amountCents: applied,
366
+ appliesTo: bundle.moduleCodes,
367
+ });
223
368
  runningCents = (0, money_js_1.subtractCents)(runningCents, applied);
224
369
  }
225
370
  }
@@ -251,9 +396,17 @@ function computeInternal(request) {
251
396
  // Passo 7 — COUPON (sobre o resultado até aqui — RFC §8)
252
397
  if (coupon) {
253
398
  if (ignoredExclusiveKey !== 'coupon') {
254
- const raw = coupon.effectType === 'percent_off' ? (0, money_js_1.applyPercent)(runningCents, coupon.percentOff ?? 0) : (coupon.amountOffCents ?? 0);
399
+ const raw = coupon.effectType === 'percent_off'
400
+ ? (0, money_js_1.applyPercent)(runningCents, coupon.percentOff ?? 0)
401
+ : (coupon.amountOffCents ?? 0);
255
402
  const applied = Math.min(Math.max(raw, 0), runningCents);
256
- discounts.push({ ruleId: coupon.code, step: 'COUPON', kind: coupon.effectType, amountCents: applied, appliesTo: ['*'] });
403
+ discounts.push({
404
+ ruleId: coupon.code,
405
+ step: 'COUPON',
406
+ kind: coupon.effectType,
407
+ amountCents: applied,
408
+ appliesTo: ['*'],
409
+ });
257
410
  runningCents = (0, money_js_1.subtractCents)(runningCents, applied);
258
411
  appliedRules.push('COUPON');
259
412
  }
@@ -264,9 +417,17 @@ function computeInternal(request) {
264
417
  // Passo 8 — CAMPAIGN
265
418
  if (campaign) {
266
419
  if (ignoredExclusiveKey !== 'campaign') {
267
- const raw = campaign.effectType === 'percent_off' ? (0, money_js_1.applyPercent)(runningCents, campaign.percentOff ?? 0) : (campaign.amountOffCents ?? 0);
420
+ const raw = campaign.effectType === 'percent_off'
421
+ ? (0, money_js_1.applyPercent)(runningCents, campaign.percentOff ?? 0)
422
+ : (campaign.amountOffCents ?? 0);
268
423
  const applied = Math.min(Math.max(raw, 0), runningCents);
269
- discounts.push({ ruleId: campaign.code, step: 'CAMPAIGN', kind: campaign.effectType, amountCents: applied, appliesTo: ['*'] });
424
+ discounts.push({
425
+ ruleId: campaign.code,
426
+ step: 'CAMPAIGN',
427
+ kind: campaign.effectType,
428
+ amountCents: applied,
429
+ appliesTo: ['*'],
430
+ });
270
431
  runningCents = (0, money_js_1.subtractCents)(runningCents, applied);
271
432
  appliedRules.push('CAMPAIGN');
272
433
  }
@@ -277,19 +438,32 @@ function computeInternal(request) {
277
438
  // Passo 9 — PROMOTIONAL_CREDIT (reservado — só preenchido quando Wallet/Rating existirem, RFC §12)
278
439
  const promotionalCreditsCents = 0;
279
440
  appliedRules.push('PROMOTIONAL_CREDIT');
441
+ // `totalDiscountCents` é fixado AQUI, antes do passo 10 — precisa refletir exatamente
442
+ // Σ discounts[] (passos 5-8), por construção. O override do passo 10 NÃO é um desconto
443
+ // (RFC §22.1 F3, §22.3: auditado via `appliedRules`, nunca via `discounts[]`); se
444
+ // calculássemos `totalDiscountCents` depois do override (subtotal − running pós-override),
445
+ // ele absorveria silenciosamente o efeito do override sempre que `fixedTotalCents` estiver
446
+ // presente — mesmo isolado, sem `discountPercent` — e `totalDiscountCents` divergiria de
447
+ // `Σ discounts[]` (achado real da Certification, não coberto pela guarda F3, que só cobre a
448
+ // coexistência dos dois campos).
449
+ const totalDiscountCents = (0, money_js_1.clampNonNegative)((0, money_js_1.subtractCents)(subtotalCents, runningCents));
280
450
  // Passo 10 — CONTRACT_OVERRIDE_OR_GRANDFATHERING (fixa/sobrepõe o total — nunca um desconto adicional)
451
+ // O delta econômico do override (positivo = reduz além do computado, negativo = sobretaxa
452
+ // acima do computado) fica em `auditMetadata` para rastreabilidade total sem virar `Discount`.
453
+ let contractOverrideDeltaCents = null;
281
454
  if (negotiatedContract?.fixedTotalCents != null) {
455
+ contractOverrideDeltaCents = (0, money_js_1.subtractCents)(runningCents, negotiatedContract.fixedTotalCents);
282
456
  runningCents = negotiatedContract.fixedTotalCents;
283
457
  appliedRules.push('CONTRACT_OVERRIDE_OR_GRANDFATHERING');
284
458
  }
285
459
  runningCents = (0, money_js_1.clampNonNegative)(runningCents);
286
- const totalDiscountCents = (0, money_js_1.clampNonNegative)((0, money_js_1.subtractCents)(subtotalCents, runningCents));
287
460
  // Passo 11 — TAX (MVP: passthrough/zero configurável — política fiscal fora do escopo, RFC §5)
288
461
  const taxes = [];
289
462
  const totalTaxCents = 0;
290
463
  appliedRules.push('TAX');
291
464
  // Passo 12 — ROUNDING (cada etapa já arredondou half-even no ponto de uso — nada fracionário resta a arredondar)
292
- const totalBeforeTrial = (0, money_js_1.addCents)(runningCents, totalTaxCents);
465
+ const prorationResult = proration ? (0, proration_js_1.computeProration)(proration) : null;
466
+ const totalBeforeTrial = (0, money_js_1.clampNonNegative)((0, money_js_1.addCents)(runningCents, totalTaxCents, prorationResult?.netCents ?? 0));
293
467
  appliedRules.push('ROUNDING');
294
468
  const trialActive = trial?.active ?? false;
295
469
  const totalCents = trialActive ? 0 : totalBeforeTrial;
@@ -323,8 +497,8 @@ function computeInternal(request) {
323
497
  appliedRules,
324
498
  warnings,
325
499
  fingerprint,
326
- auditMetadata: {},
327
- proration: null,
500
+ auditMetadata: contractOverrideDeltaCents != null ? { contractOverrideDeltaCents } : {},
501
+ proration: prorationResult,
328
502
  };
329
503
  }
330
504
  //# sourceMappingURL=pipeline.js.map