@baruk/core 0.1.0 → 0.2.0

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 (429) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/dist/auth/password-reset.d.ts.map +1 -1
  3. package/dist/auth/password-reset.js +2 -4
  4. package/dist/auth/password-reset.js.map +1 -1
  5. package/dist/auth/password.d.ts +2 -18
  6. package/dist/auth/password.d.ts.map +1 -1
  7. package/dist/auth/password.js +12 -51
  8. package/dist/auth/password.js.map +1 -1
  9. package/dist/auth/service.d.ts +0 -12
  10. package/dist/auth/service.d.ts.map +1 -1
  11. package/dist/auth/service.js +3 -36
  12. package/dist/auth/service.js.map +1 -1
  13. package/dist/auth/session-token.d.ts +5 -2
  14. package/dist/auth/session-token.d.ts.map +1 -1
  15. package/dist/auth/session-token.js +7 -12
  16. package/dist/auth/session-token.js.map +1 -1
  17. package/dist/billing/dunning.d.ts +33 -0
  18. package/dist/billing/dunning.d.ts.map +1 -0
  19. package/dist/billing/dunning.js +49 -0
  20. package/dist/billing/dunning.js.map +1 -0
  21. package/dist/billing/provider/asaas.d.ts +15 -0
  22. package/dist/billing/provider/asaas.d.ts.map +1 -0
  23. package/dist/billing/provider/asaas.js +121 -0
  24. package/dist/billing/provider/asaas.js.map +1 -0
  25. package/dist/billing/provider/manual.d.ts +14 -0
  26. package/dist/billing/provider/manual.d.ts.map +1 -0
  27. package/dist/billing/provider/manual.js +24 -0
  28. package/dist/billing/provider/manual.js.map +1 -0
  29. package/dist/billing/provider/registry.d.ts +12 -0
  30. package/dist/billing/provider/registry.d.ts.map +1 -0
  31. package/dist/billing/provider/registry.js +22 -0
  32. package/dist/billing/provider/registry.js.map +1 -0
  33. package/dist/billing/provider/types.d.ts +76 -0
  34. package/dist/billing/provider/types.d.ts.map +1 -0
  35. package/dist/billing/provider/types.js +9 -0
  36. package/dist/billing/provider/types.js.map +1 -0
  37. package/dist/billing/receivable.d.ts +108 -0
  38. package/dist/billing/receivable.d.ts.map +1 -0
  39. package/dist/billing/receivable.js +2 -0
  40. package/dist/billing/receivable.js.map +1 -0
  41. package/dist/billing/repository.d.ts +97 -0
  42. package/dist/billing/repository.d.ts.map +1 -0
  43. package/dist/billing/repository.js +167 -0
  44. package/dist/billing/repository.js.map +1 -0
  45. package/dist/cjs/audit/audit.js +31 -0
  46. package/dist/cjs/audit/audit.js.map +1 -0
  47. package/dist/cjs/audit/repository.js +32 -0
  48. package/dist/cjs/audit/repository.js.map +1 -0
  49. package/dist/cjs/auth/password-reset.js +58 -0
  50. package/dist/cjs/auth/password-reset.js.map +1 -0
  51. package/dist/cjs/auth/password.js +32 -0
  52. package/dist/cjs/auth/password.js.map +1 -0
  53. package/dist/cjs/auth/service.js +191 -0
  54. package/dist/cjs/auth/service.js.map +1 -0
  55. package/dist/cjs/auth/session-token.js +18 -0
  56. package/dist/cjs/auth/session-token.js.map +1 -0
  57. package/dist/cjs/billing/dunning.js +54 -0
  58. package/dist/cjs/billing/dunning.js.map +1 -0
  59. package/dist/cjs/billing/provider/asaas.js +125 -0
  60. package/dist/cjs/billing/provider/asaas.js.map +1 -0
  61. package/dist/cjs/billing/provider/manual.js +28 -0
  62. package/dist/cjs/billing/provider/manual.js.map +1 -0
  63. package/dist/cjs/billing/provider/registry.js +27 -0
  64. package/dist/cjs/billing/provider/registry.js.map +1 -0
  65. package/dist/cjs/billing/provider/types.js +10 -0
  66. package/dist/cjs/billing/provider/types.js.map +1 -0
  67. package/dist/cjs/billing/receivable.js +3 -0
  68. package/dist/cjs/billing/receivable.js.map +1 -0
  69. package/dist/cjs/billing/repository.js +180 -0
  70. package/dist/cjs/billing/repository.js.map +1 -0
  71. package/dist/cjs/clients/repository.js +123 -0
  72. package/dist/cjs/clients/repository.js.map +1 -0
  73. package/dist/cjs/commercial-catalog/catalog.js +108 -0
  74. package/dist/cjs/commercial-catalog/catalog.js.map +1 -0
  75. package/dist/cjs/commercial-catalog/consumption-contracts.js +10 -0
  76. package/dist/cjs/commercial-catalog/consumption-contracts.js.map +1 -0
  77. package/dist/cjs/commercial-catalog/coupon.js +53 -0
  78. package/dist/cjs/commercial-catalog/coupon.js.map +1 -0
  79. package/dist/cjs/commercial-catalog/index.js +16 -0
  80. package/dist/cjs/commercial-catalog/index.js.map +1 -0
  81. package/dist/cjs/commercial-catalog/offer-application.js +53 -0
  82. package/dist/cjs/commercial-catalog/offer-application.js.map +1 -0
  83. package/dist/cjs/commercial-catalog/types.js +26 -0
  84. package/dist/cjs/commercial-catalog/types.js.map +1 -0
  85. package/dist/cjs/crm/repository.js +195 -0
  86. package/dist/cjs/crm/repository.js.map +1 -0
  87. package/dist/cjs/dashboard/repository.js +39 -0
  88. package/dist/cjs/dashboard/repository.js.map +1 -0
  89. package/dist/cjs/db/client.js +27 -0
  90. package/dist/cjs/db/client.js.map +1 -0
  91. package/dist/cjs/db/context.js +43 -0
  92. package/dist/cjs/db/context.js.map +1 -0
  93. package/dist/cjs/db/load-env.js +47 -0
  94. package/dist/cjs/db/load-env.js.map +1 -0
  95. package/dist/cjs/db/seed.js +69 -0
  96. package/dist/cjs/db/seed.js.map +1 -0
  97. package/dist/cjs/entitlements/decision.js +203 -0
  98. package/dist/cjs/entitlements/decision.js.map +1 -0
  99. package/dist/cjs/entitlements/derive.js +46 -0
  100. package/dist/cjs/entitlements/derive.js.map +1 -0
  101. package/dist/cjs/entitlements/index.js +23 -0
  102. package/dist/cjs/entitlements/index.js.map +1 -0
  103. package/dist/cjs/entitlements/sources.js +60 -0
  104. package/dist/cjs/entitlements/sources.js.map +1 -0
  105. package/dist/cjs/entitlements/standing.js +42 -0
  106. package/dist/cjs/entitlements/standing.js.map +1 -0
  107. package/dist/cjs/entitlements/types.js +16 -0
  108. package/dist/cjs/entitlements/types.js.map +1 -0
  109. package/dist/cjs/import/clients-import.js +147 -0
  110. package/dist/cjs/import/clients-import.js.map +1 -0
  111. package/dist/cjs/index.js +335 -0
  112. package/dist/cjs/index.js.map +1 -0
  113. package/dist/cjs/mail/dedup-store.js +56 -0
  114. package/dist/cjs/mail/dedup-store.js.map +1 -0
  115. package/dist/cjs/mail/index.js +24 -0
  116. package/dist/cjs/mail/index.js.map +1 -0
  117. package/dist/cjs/mail/provider.js +251 -0
  118. package/dist/cjs/mail/provider.js.map +1 -0
  119. package/dist/cjs/mail/resend-client.js +103 -0
  120. package/dist/cjs/mail/resend-client.js.map +1 -0
  121. package/dist/cjs/mail/resend.js +21 -0
  122. package/dist/cjs/mail/resend.js.map +1 -0
  123. package/dist/cjs/mail/sanitize.js +56 -0
  124. package/dist/cjs/mail/sanitize.js.map +1 -0
  125. package/dist/cjs/mail/sender-resolver.js +15 -0
  126. package/dist/cjs/mail/sender-resolver.js.map +1 -0
  127. package/dist/cjs/mail/template-renderer.js +21 -0
  128. package/dist/cjs/mail/template-renderer.js.map +1 -0
  129. package/dist/cjs/mail/types.js +38 -0
  130. package/dist/cjs/mail/types.js.map +1 -0
  131. package/dist/cjs/notifications/repository.js +49 -0
  132. package/dist/cjs/notifications/repository.js.map +1 -0
  133. package/dist/cjs/onboarding/domain.js +370 -0
  134. package/dist/cjs/onboarding/domain.js.map +1 -0
  135. package/dist/cjs/onboarding/interaction-review.js +425 -0
  136. package/dist/cjs/onboarding/interaction-review.js.map +1 -0
  137. package/dist/cjs/onboarding/persistence.js +444 -0
  138. package/dist/cjs/onboarding/persistence.js.map +1 -0
  139. package/dist/cjs/onboarding/portal-actions.js +157 -0
  140. package/dist/cjs/onboarding/portal-actions.js.map +1 -0
  141. package/dist/cjs/onboarding/portal.js +177 -0
  142. package/dist/cjs/onboarding/portal.js.map +1 -0
  143. package/dist/cjs/package.json +3 -0
  144. package/dist/cjs/portal/repository.js +37 -0
  145. package/dist/cjs/portal/repository.js.map +1 -0
  146. package/dist/cjs/pricing-engine/bundle.js +49 -0
  147. package/dist/cjs/pricing-engine/bundle.js.map +1 -0
  148. package/dist/cjs/pricing-engine/errors.js +48 -0
  149. package/dist/cjs/pricing-engine/errors.js.map +1 -0
  150. package/dist/cjs/pricing-engine/index.js +30 -0
  151. package/dist/cjs/pricing-engine/index.js.map +1 -0
  152. package/dist/cjs/pricing-engine/money.js +69 -0
  153. package/dist/cjs/pricing-engine/money.js.map +1 -0
  154. package/dist/cjs/pricing-engine/pipeline.js +330 -0
  155. package/dist/cjs/pricing-engine/pipeline.js.map +1 -0
  156. package/dist/cjs/pricing-engine/proration.js +53 -0
  157. package/dist/cjs/pricing-engine/proration.js.map +1 -0
  158. package/dist/cjs/pricing-engine/shadow.js +58 -0
  159. package/dist/cjs/pricing-engine/shadow.js.map +1 -0
  160. package/dist/cjs/pricing-engine/types.js +34 -0
  161. package/dist/cjs/pricing-engine/types.js.map +1 -0
  162. package/dist/cjs/products/catalog.js +10 -0
  163. package/dist/cjs/products/catalog.js.map +1 -0
  164. package/dist/cjs/products/repository.js +61 -0
  165. package/dist/cjs/products/repository.js.map +1 -0
  166. package/dist/cjs/rbac/authorize.js +36 -0
  167. package/dist/cjs/rbac/authorize.js.map +1 -0
  168. package/dist/cjs/rbac/catalog.js +455 -0
  169. package/dist/cjs/rbac/catalog.js.map +1 -0
  170. package/dist/cjs/requests/repository.js +114 -0
  171. package/dist/cjs/requests/repository.js.map +1 -0
  172. package/dist/cjs/subscription-billing/dunning.js +26 -0
  173. package/dist/cjs/subscription-billing/dunning.js.map +1 -0
  174. package/dist/cjs/subscription-billing/events.js +45 -0
  175. package/dist/cjs/subscription-billing/events.js.map +1 -0
  176. package/dist/cjs/subscription-billing/index.js +62 -0
  177. package/dist/cjs/subscription-billing/index.js.map +1 -0
  178. package/dist/cjs/subscription-billing/plans.js +88 -0
  179. package/dist/cjs/subscription-billing/plans.js.map +1 -0
  180. package/dist/cjs/subscription-billing/product-config.js +54 -0
  181. package/dist/cjs/subscription-billing/product-config.js.map +1 -0
  182. package/dist/cjs/subscription-billing/provider/asaas.js +233 -0
  183. package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -0
  184. package/dist/cjs/subscription-billing/provider/disabled.js +46 -0
  185. package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -0
  186. package/dist/cjs/subscription-billing/provider/registry.js +29 -0
  187. package/dist/cjs/subscription-billing/provider/registry.js.map +1 -0
  188. package/dist/cjs/subscription-billing/reconcile.js +198 -0
  189. package/dist/cjs/subscription-billing/reconcile.js.map +1 -0
  190. package/dist/cjs/subscription-billing/repository.js +359 -0
  191. package/dist/cjs/subscription-billing/repository.js.map +1 -0
  192. package/dist/cjs/subscription-billing/service.js +838 -0
  193. package/dist/cjs/subscription-billing/service.js.map +1 -0
  194. package/dist/cjs/subscription-billing/types.js +28 -0
  195. package/dist/cjs/subscription-billing/types.js.map +1 -0
  196. package/dist/cjs/tenancy/provisioning.js +126 -0
  197. package/dist/cjs/tenancy/provisioning.js.map +1 -0
  198. package/dist/cjs/users/repository.js +83 -0
  199. package/dist/cjs/users/repository.js.map +1 -0
  200. package/dist/cjs/vault/crypto.js +94 -0
  201. package/dist/cjs/vault/crypto.js.map +1 -0
  202. package/dist/cjs/vault/repository.js +120 -0
  203. package/dist/cjs/vault/repository.js.map +1 -0
  204. package/dist/commercial-catalog/catalog.d.ts +27 -0
  205. package/dist/commercial-catalog/catalog.d.ts.map +1 -0
  206. package/dist/commercial-catalog/catalog.js +104 -0
  207. package/dist/commercial-catalog/catalog.js.map +1 -0
  208. package/dist/commercial-catalog/consumption-contracts.d.ts +33 -0
  209. package/dist/commercial-catalog/consumption-contracts.d.ts.map +1 -0
  210. package/dist/commercial-catalog/consumption-contracts.js +9 -0
  211. package/dist/commercial-catalog/consumption-contracts.js.map +1 -0
  212. package/dist/commercial-catalog/coupon.d.ts +27 -0
  213. package/dist/commercial-catalog/coupon.d.ts.map +1 -0
  214. package/dist/commercial-catalog/coupon.js +47 -0
  215. package/dist/commercial-catalog/coupon.js.map +1 -0
  216. package/dist/commercial-catalog/index.d.ts +10 -0
  217. package/dist/commercial-catalog/index.d.ts.map +1 -0
  218. package/dist/commercial-catalog/index.js +5 -0
  219. package/dist/commercial-catalog/index.js.map +1 -0
  220. package/dist/commercial-catalog/offer-application.d.ts +39 -0
  221. package/dist/commercial-catalog/offer-application.d.ts.map +1 -0
  222. package/dist/commercial-catalog/offer-application.js +50 -0
  223. package/dist/commercial-catalog/offer-application.js.map +1 -0
  224. package/dist/commercial-catalog/types.d.ts +155 -0
  225. package/dist/commercial-catalog/types.d.ts.map +1 -0
  226. package/dist/commercial-catalog/types.js +23 -0
  227. package/dist/commercial-catalog/types.js.map +1 -0
  228. package/dist/crm/repository.d.ts +109 -0
  229. package/dist/crm/repository.d.ts.map +1 -0
  230. package/dist/crm/repository.js +181 -0
  231. package/dist/crm/repository.js.map +1 -0
  232. package/dist/db/context.d.ts +2 -0
  233. package/dist/db/context.d.ts.map +1 -1
  234. package/dist/db/context.js +3 -0
  235. package/dist/db/context.js.map +1 -1
  236. package/dist/db/migrate.js +7 -2
  237. package/dist/db/migrate.js.map +1 -1
  238. package/dist/db/seed.js +4 -1
  239. package/dist/db/seed.js.map +1 -1
  240. package/dist/entitlements/decision.d.ts +86 -0
  241. package/dist/entitlements/decision.d.ts.map +1 -0
  242. package/dist/entitlements/decision.js +196 -0
  243. package/dist/entitlements/decision.js.map +1 -0
  244. package/dist/entitlements/derive.d.ts +30 -0
  245. package/dist/entitlements/derive.d.ts.map +1 -0
  246. package/dist/entitlements/derive.js +42 -0
  247. package/dist/entitlements/derive.js.map +1 -0
  248. package/dist/entitlements/index.d.ts +10 -0
  249. package/dist/entitlements/index.d.ts.map +1 -0
  250. package/dist/entitlements/index.js +7 -0
  251. package/dist/entitlements/index.js.map +1 -0
  252. package/dist/entitlements/sources.d.ts +30 -0
  253. package/dist/entitlements/sources.d.ts.map +1 -0
  254. package/dist/entitlements/sources.js +55 -0
  255. package/dist/entitlements/sources.js.map +1 -0
  256. package/dist/entitlements/standing.d.ts +22 -0
  257. package/dist/entitlements/standing.d.ts.map +1 -0
  258. package/dist/entitlements/standing.js +38 -0
  259. package/dist/entitlements/standing.js.map +1 -0
  260. package/dist/entitlements/types.d.ts +26 -0
  261. package/dist/entitlements/types.d.ts.map +1 -0
  262. package/dist/entitlements/types.js +15 -0
  263. package/dist/entitlements/types.js.map +1 -0
  264. package/dist/index.d.ts +74 -3
  265. package/dist/index.d.ts.map +1 -1
  266. package/dist/index.js +51 -4
  267. package/dist/index.js.map +1 -1
  268. package/dist/mail/dedup-store.d.ts +25 -0
  269. package/dist/mail/dedup-store.d.ts.map +1 -0
  270. package/dist/mail/dedup-store.js +51 -0
  271. package/dist/mail/dedup-store.js.map +1 -0
  272. package/dist/mail/index.d.ts +10 -0
  273. package/dist/mail/index.d.ts.map +1 -0
  274. package/dist/mail/index.js +9 -0
  275. package/dist/mail/index.js.map +1 -0
  276. package/dist/mail/provider.d.ts +31 -0
  277. package/dist/mail/provider.d.ts.map +1 -0
  278. package/dist/mail/provider.js +248 -0
  279. package/dist/mail/provider.js.map +1 -0
  280. package/dist/mail/resend-client.d.ts +16 -0
  281. package/dist/mail/resend-client.d.ts.map +1 -0
  282. package/dist/mail/resend-client.js +100 -0
  283. package/dist/mail/resend-client.js.map +1 -0
  284. package/dist/mail/resend.d.ts.map +1 -1
  285. package/dist/mail/resend.js +2 -0
  286. package/dist/mail/resend.js.map +1 -1
  287. package/dist/mail/sanitize.d.ts +17 -0
  288. package/dist/mail/sanitize.d.ts.map +1 -0
  289. package/dist/mail/sanitize.js +51 -0
  290. package/dist/mail/sanitize.js.map +1 -0
  291. package/dist/mail/sender-resolver.d.ts +8 -0
  292. package/dist/mail/sender-resolver.d.ts.map +1 -0
  293. package/dist/mail/sender-resolver.js +11 -0
  294. package/dist/mail/sender-resolver.js.map +1 -0
  295. package/dist/mail/template-renderer.d.ts +10 -0
  296. package/dist/mail/template-renderer.d.ts.map +1 -0
  297. package/dist/mail/template-renderer.js +17 -0
  298. package/dist/mail/template-renderer.js.map +1 -0
  299. package/dist/mail/types.d.ts +143 -0
  300. package/dist/mail/types.d.ts.map +1 -0
  301. package/dist/mail/types.js +34 -0
  302. package/dist/mail/types.js.map +1 -0
  303. package/dist/onboarding/domain.d.ts +146 -0
  304. package/dist/onboarding/domain.d.ts.map +1 -0
  305. package/dist/onboarding/domain.js +348 -0
  306. package/dist/onboarding/domain.js.map +1 -0
  307. package/dist/onboarding/interaction-review.d.ts +123 -0
  308. package/dist/onboarding/interaction-review.d.ts.map +1 -0
  309. package/dist/onboarding/interaction-review.js +413 -0
  310. package/dist/onboarding/interaction-review.js.map +1 -0
  311. package/dist/onboarding/persistence.d.ts +106 -0
  312. package/dist/onboarding/persistence.d.ts.map +1 -0
  313. package/dist/onboarding/persistence.js +430 -0
  314. package/dist/onboarding/persistence.js.map +1 -0
  315. package/dist/onboarding/portal-actions.d.ts +48 -0
  316. package/dist/onboarding/portal-actions.d.ts.map +1 -0
  317. package/dist/onboarding/portal-actions.js +153 -0
  318. package/dist/onboarding/portal-actions.js.map +1 -0
  319. package/dist/onboarding/portal.d.ts +58 -0
  320. package/dist/onboarding/portal.d.ts.map +1 -0
  321. package/dist/onboarding/portal.js +170 -0
  322. package/dist/onboarding/portal.js.map +1 -0
  323. package/dist/pricing-engine/bundle.d.ts +22 -0
  324. package/dist/pricing-engine/bundle.d.ts.map +1 -0
  325. package/dist/pricing-engine/bundle.js +44 -0
  326. package/dist/pricing-engine/bundle.js.map +1 -0
  327. package/dist/pricing-engine/errors.d.ts +32 -0
  328. package/dist/pricing-engine/errors.d.ts.map +1 -0
  329. package/dist/pricing-engine/errors.js +44 -0
  330. package/dist/pricing-engine/errors.js.map +1 -0
  331. package/dist/pricing-engine/index.d.ts +12 -0
  332. package/dist/pricing-engine/index.d.ts.map +1 -0
  333. package/dist/pricing-engine/index.js +8 -0
  334. package/dist/pricing-engine/index.js.map +1 -0
  335. package/dist/pricing-engine/money.d.ts +32 -0
  336. package/dist/pricing-engine/money.d.ts.map +1 -0
  337. package/dist/pricing-engine/money.js +58 -0
  338. package/dist/pricing-engine/money.js.map +1 -0
  339. package/dist/pricing-engine/pipeline.d.ts +3 -0
  340. package/dist/pricing-engine/pipeline.d.ts.map +1 -0
  341. package/dist/pricing-engine/pipeline.js +327 -0
  342. package/dist/pricing-engine/pipeline.js.map +1 -0
  343. package/dist/pricing-engine/proration.d.ts +3 -0
  344. package/dist/pricing-engine/proration.d.ts.map +1 -0
  345. package/dist/pricing-engine/proration.js +50 -0
  346. package/dist/pricing-engine/proration.js.map +1 -0
  347. package/dist/pricing-engine/shadow.d.ts +51 -0
  348. package/dist/pricing-engine/shadow.d.ts.map +1 -0
  349. package/dist/pricing-engine/shadow.js +54 -0
  350. package/dist/pricing-engine/shadow.js.map +1 -0
  351. package/dist/pricing-engine/types.d.ts +184 -0
  352. package/dist/pricing-engine/types.d.ts.map +1 -0
  353. package/dist/pricing-engine/types.js +31 -0
  354. package/dist/pricing-engine/types.js.map +1 -0
  355. package/dist/rbac/authorize.d.ts +3 -6
  356. package/dist/rbac/authorize.d.ts.map +1 -1
  357. package/dist/rbac/authorize.js +4 -8
  358. package/dist/rbac/authorize.js.map +1 -1
  359. package/dist/rbac/catalog.d.ts.map +1 -1
  360. package/dist/rbac/catalog.js +414 -21
  361. package/dist/rbac/catalog.js.map +1 -1
  362. package/dist/subscription-billing/dunning.d.ts +18 -0
  363. package/dist/subscription-billing/dunning.d.ts.map +1 -0
  364. package/dist/subscription-billing/dunning.js +28 -0
  365. package/dist/subscription-billing/dunning.js.map +1 -0
  366. package/dist/subscription-billing/events.d.ts +58 -0
  367. package/dist/subscription-billing/events.d.ts.map +1 -0
  368. package/dist/subscription-billing/events.js +38 -0
  369. package/dist/subscription-billing/events.js.map +1 -0
  370. package/dist/subscription-billing/index.d.ts +18 -0
  371. package/dist/subscription-billing/index.d.ts.map +1 -0
  372. package/dist/subscription-billing/index.js +16 -0
  373. package/dist/subscription-billing/index.js.map +1 -0
  374. package/dist/subscription-billing/plans.d.ts +34 -0
  375. package/dist/subscription-billing/plans.d.ts.map +1 -0
  376. package/dist/subscription-billing/plans.js +85 -0
  377. package/dist/subscription-billing/plans.js.map +1 -0
  378. package/dist/subscription-billing/product-config.d.ts +61 -0
  379. package/dist/subscription-billing/product-config.d.ts.map +1 -0
  380. package/dist/subscription-billing/product-config.js +50 -0
  381. package/dist/subscription-billing/product-config.js.map +1 -0
  382. package/dist/subscription-billing/provider/asaas.d.ts +26 -0
  383. package/dist/subscription-billing/provider/asaas.d.ts.map +1 -0
  384. package/dist/subscription-billing/provider/asaas.js +229 -0
  385. package/dist/subscription-billing/provider/asaas.js.map +1 -0
  386. package/dist/subscription-billing/provider/disabled.d.ts +30 -0
  387. package/dist/subscription-billing/provider/disabled.d.ts.map +1 -0
  388. package/dist/subscription-billing/provider/disabled.js +42 -0
  389. package/dist/subscription-billing/provider/disabled.js.map +1 -0
  390. package/dist/subscription-billing/provider/registry.d.ts +10 -0
  391. package/dist/subscription-billing/provider/registry.d.ts.map +1 -0
  392. package/dist/subscription-billing/provider/registry.js +26 -0
  393. package/dist/subscription-billing/provider/registry.js.map +1 -0
  394. package/dist/subscription-billing/reconcile.d.ts +45 -0
  395. package/dist/subscription-billing/reconcile.d.ts.map +1 -0
  396. package/dist/subscription-billing/reconcile.js +192 -0
  397. package/dist/subscription-billing/reconcile.js.map +1 -0
  398. package/dist/subscription-billing/repository.d.ts +168 -0
  399. package/dist/subscription-billing/repository.d.ts.map +1 -0
  400. package/dist/subscription-billing/repository.js +336 -0
  401. package/dist/subscription-billing/repository.js.map +1 -0
  402. package/dist/subscription-billing/service.d.ts +175 -0
  403. package/dist/subscription-billing/service.d.ts.map +1 -0
  404. package/dist/subscription-billing/service.js +818 -0
  405. package/dist/subscription-billing/service.js.map +1 -0
  406. package/dist/subscription-billing/types.d.ts +161 -0
  407. package/dist/subscription-billing/types.d.ts.map +1 -0
  408. package/dist/subscription-billing/types.js +24 -0
  409. package/dist/subscription-billing/types.js.map +1 -0
  410. package/dist/vault/crypto.d.ts +22 -0
  411. package/dist/vault/crypto.d.ts.map +1 -0
  412. package/dist/vault/crypto.js +88 -0
  413. package/dist/vault/crypto.js.map +1 -0
  414. package/dist/vault/repository.d.ts +45 -0
  415. package/dist/vault/repository.d.ts.map +1 -0
  416. package/dist/vault/repository.js +111 -0
  417. package/dist/vault/repository.js.map +1 -0
  418. package/package.json +23 -13
  419. package/src/db/migrations/0012_vault.sql +51 -0
  420. package/src/db/migrations/0013_crm.sql +67 -0
  421. package/src/db/migrations/0014_billing.sql +146 -0
  422. package/src/db/migrations/0015_merchant_billing_ar.sql +201 -0
  423. package/src/db/migrations/0016_office_onboarding.sql +162 -0
  424. package/src/db/migrations/0017_office_onboarding_api.sql +21 -0
  425. package/src/db/migrations/0018_office_onboarding_portal_actions.sql +60 -0
  426. package/src/db/migrations/0019_office_onboarding_interaction_review.sql +134 -0
  427. package/src/db/migrations/0020_saas_billing.sql +157 -0
  428. package/src/db/migrations/0021_saas_billing_indexes.sql +23 -0
  429. package/src/db/migrations/0022_saas_billing_multi_product.sql +75 -0
@@ -0,0 +1,153 @@
1
+ import { ConflictError, NotFoundError, ValidationError, uuidv7 } from '@baruk/shared';
2
+ import { appendAudit } from '../audit/audit.js';
3
+ import { createNotification } from '../notifications/repository.js';
4
+ function map(row) {
5
+ const status = row.status;
6
+ return {
7
+ id: String(row.id),
8
+ kind: row.kind,
9
+ status,
10
+ text: row.body ? String(row.body) : null,
11
+ channel: row.external_channel ? row.external_channel : null,
12
+ deliveredAt: row.external_delivered_at ? String(row.external_delivered_at) : null,
13
+ createdAt: new Date(String(row.created_at)).toISOString(),
14
+ updatedAt: new Date(String(row.updated_at)).toISOString(),
15
+ publicAuthorLabel: row.public_author_label ? String(row.public_author_label) : 'Você',
16
+ relatedItemId: row.item_id ? String(row.item_id) : null,
17
+ relatedRequirementId: row.document_requirement_id ? String(row.document_requirement_id) : null,
18
+ allowedActions: status === 'submitted' || status === 'needs_clarification' ? ['supplement'] : [],
19
+ };
20
+ }
21
+ function cleanText(value) {
22
+ return Array.from(value.replace(/<[^>]*>/g, ''))
23
+ .filter((character) => {
24
+ const code = character.charCodeAt(0);
25
+ return code > 31 && code !== 127;
26
+ })
27
+ .join('')
28
+ .trim();
29
+ }
30
+ async function target(tx, ctx, onboardingId, itemId, requirementId) {
31
+ const rows = await tx `
32
+ SELECT oi.owner_id
33
+ FROM onboarding_instance oi
34
+ WHERE oi.id = ${onboardingId}
35
+ AND oi.tenant_id = ${ctx.tenantId}
36
+ AND oi.client_id = ${ctx.clientId}
37
+ `;
38
+ if (!rows[0])
39
+ throw new NotFoundError('Onboarding não encontrado');
40
+ if (itemId) {
41
+ const items = await tx `
42
+ SELECT id FROM onboarding_item
43
+ WHERE id = ${itemId} AND onboarding_id = ${onboardingId}
44
+ AND tenant_id = ${ctx.tenantId} AND client_id = ${ctx.clientId} AND visibility = 'portal'
45
+ `;
46
+ if (!items[0])
47
+ throw new NotFoundError('Pendência não encontrada');
48
+ }
49
+ if (requirementId) {
50
+ const docs = await tx `
51
+ SELECT id, status FROM onboarding_document_requirement
52
+ WHERE id = ${requirementId} AND onboarding_id = ${onboardingId}
53
+ AND tenant_id = ${ctx.tenantId} AND client_id = ${ctx.clientId}
54
+ `;
55
+ if (!docs[0])
56
+ throw new NotFoundError('Requisito documental não encontrado');
57
+ if (String(docs[0].status) === 'validated')
58
+ throw new ConflictError('Este requisito já foi validado');
59
+ }
60
+ return { ownerId: rows[0].owner_id };
61
+ }
62
+ async function notifyOwner(tx, ownerId, onboardingId, kind) {
63
+ if (!ownerId)
64
+ return;
65
+ await createNotification(tx, {
66
+ userId: ownerId,
67
+ type: 'action_required',
68
+ title: kind === 'external_delivery_confirmation'
69
+ ? 'Cliente informou envio externo'
70
+ : 'Cliente enviou nova informação',
71
+ body: 'Há uma nova interação pública aguardando revisão.',
72
+ linkRef: { type: 'office_onboarding', id: onboardingId },
73
+ });
74
+ }
75
+ export async function createPortalInteraction(tx, ctx, input) {
76
+ const text = 'text' in input
77
+ ? cleanText(input.text)
78
+ : 'note' in input
79
+ ? cleanText(input.note ?? '') || null
80
+ : null;
81
+ if (text !== null && (!text || text.length > 2000))
82
+ throw new ValidationError('A informação deve ter entre 1 e 2.000 caracteres');
83
+ const owner = await target(tx, ctx, input.onboardingId, input.kind === 'response' ? input.itemId : undefined, input.kind === 'external_delivery_confirmation' ? input.requirementId : undefined);
84
+ if (input.kind === 'response' && input.supersedesId) {
85
+ const previous = await tx `
86
+ SELECT status FROM onboarding_portal_interaction
87
+ WHERE id = ${input.supersedesId} AND onboarding_id = ${input.onboardingId}
88
+ AND client_id = ${ctx.clientId} AND tenant_id = ${ctx.tenantId} AND author_user_id = ${ctx.actorId}
89
+ `;
90
+ if (!previous[0] || !['submitted', 'needs_clarification'].includes(previous[0].status))
91
+ throw new ConflictError('Esta resposta não aceita complemento');
92
+ await tx `UPDATE onboarding_portal_interaction SET status = 'superseded', updated_at = now() WHERE id = ${input.supersedesId}`;
93
+ }
94
+ const id = uuidv7();
95
+ const row = await tx `
96
+ INSERT INTO onboarding_portal_interaction
97
+ (id, tenant_id, onboarding_id, client_id, item_id, document_requirement_id, author_user_id, kind, status, visibility, body, external_channel, external_delivered_at, supersedes_id)
98
+ VALUES
99
+ (${id}, ${ctx.tenantId}, ${input.onboardingId}, ${ctx.clientId},
100
+ ${input.kind === 'response' ? input.itemId : null},
101
+ ${input.kind === 'external_delivery_confirmation' ? input.requirementId : null},
102
+ ${ctx.actorId}, ${input.kind}, 'submitted', 'public_to_client', ${text},
103
+ ${input.kind === 'external_delivery_confirmation' ? input.channel : null},
104
+ ${input.kind === 'external_delivery_confirmation' ? input.deliveredAt : null},
105
+ ${input.kind === 'response' ? (input.supersedesId ?? null) : null})
106
+ RETURNING id, kind, status, body, external_channel, external_delivered_at, created_at, updated_at, item_id, document_requirement_id
107
+ `;
108
+ await appendAudit(tx, {
109
+ actorId: ctx.actorId,
110
+ action: `portal_onboarding_${input.kind}`,
111
+ resourceType: 'onboarding_portal_interaction',
112
+ resourceId: id,
113
+ metadata: {
114
+ onboardingId: input.onboardingId,
115
+ correlationId: ctx.correlationId,
116
+ requestId: ctx.requestId ?? null,
117
+ },
118
+ });
119
+ await tx `
120
+ INSERT INTO onboarding_event
121
+ (event_id, tenant_id, onboarding_id, client_id, actor_id, event_type, event_version, occurred_at, correlation_id, causation_id, entity_type, entity_id, payload, metadata)
122
+ VALUES (${uuidv7()}, ${ctx.tenantId}, ${input.onboardingId}, ${ctx.clientId}, ${ctx.actorId},
123
+ ${input.kind === 'response' ? (input.supersedesId ? 'onboarding.portal_response_supplemented' : 'onboarding.portal_response_submitted') : input.kind === 'comment' ? 'onboarding.portal_comment_created' : 'onboarding.external_delivery_confirmed'},
124
+ 1, now(), ${ctx.correlationId}, null, 'onboarding', ${input.onboardingId},
125
+ ${tx.json({ interactionId: id, kind: input.kind })}, ${tx.json({ visibility: 'public_to_client' })})
126
+ `;
127
+ await notifyOwner(tx, owner.ownerId, input.onboardingId, input.kind);
128
+ return map(row[0]);
129
+ }
130
+ export async function listPortalInteractions(tx, ctx, onboardingId, limit = 50, offset = 0) {
131
+ await target(tx, ctx, onboardingId);
132
+ const rows = await tx `
133
+ SELECT id, kind, status, body, external_channel, external_delivered_at, created_at, updated_at, item_id, document_requirement_id, count(*) OVER() AS total, 'Você' AS public_author_label
134
+ FROM onboarding_portal_interaction
135
+ WHERE tenant_id = ${ctx.tenantId} AND client_id = ${ctx.clientId} AND onboarding_id = ${onboardingId}
136
+ ORDER BY created_at ASC, id ASC LIMIT ${Math.min(limit, 100)} OFFSET ${Math.max(offset, 0)}
137
+ `;
138
+ const replies = await tx `
139
+ SELECT id, 'office_public_reply' AS kind, 'submitted' AS status, body,
140
+ NULL::text AS external_channel, NULL::date AS external_delivered_at,
141
+ created_at, created_at AS updated_at, NULL::uuid AS item_id,
142
+ NULL::uuid AS document_requirement_id, 'Escritório' AS public_author_label
143
+ FROM onboarding_interaction_public_reply
144
+ WHERE tenant_id = ${ctx.tenantId} AND client_id = ${ctx.clientId} AND onboarding_id = ${onboardingId}
145
+ ORDER BY created_at ASC, id ASC
146
+ `;
147
+ const items = [...rows.map(map), ...replies.map(map)].sort((a, b) => a.createdAt.localeCompare(b.createdAt));
148
+ return {
149
+ items: items.slice(0, Math.min(limit, 100)),
150
+ total: Number(rows[0]?.total ?? 0) + replies.length,
151
+ };
152
+ }
153
+ //# sourceMappingURL=portal-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-actions.js","sourceRoot":"","sources":["../../src/onboarding/portal-actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { AppError } from '@baruk/shared';
2
+ import type { Tx } from '../db/client.js';
3
+ export declare class PortalOnboardingFeatureDisabledError extends AppError {
4
+ constructor();
5
+ }
6
+ export interface PortalOnboardingListItem {
7
+ id: string;
8
+ clientDisplayName: string;
9
+ status: 'preparing' | 'in_progress' | 'waiting_for_information' | 'completed' | 'closed';
10
+ progress: {
11
+ completed: number;
12
+ total: number;
13
+ percentage: number;
14
+ };
15
+ dueAt: string | null;
16
+ overdue: boolean;
17
+ pendingItemsCount: number;
18
+ pendingDocumentRequirementsCount: number;
19
+ lastPublicUpdateAt: string;
20
+ }
21
+ export interface PortalOnboardingItem {
22
+ id: string;
23
+ title: string;
24
+ description: string | null;
25
+ status: 'pending' | 'in_progress' | 'completed' | 'rejected' | 'not_applicable';
26
+ required: boolean;
27
+ dueAt: string | null;
28
+ completedAt: string | null;
29
+ }
30
+ export interface PortalDocumentRequirement {
31
+ id: string;
32
+ label: string;
33
+ status: 'requested' | 'received' | 'validated' | 'rejected';
34
+ requestedAt: string;
35
+ receivedAt: string | null;
36
+ validatedAt: string | null;
37
+ expiresAt: string | null;
38
+ }
39
+ export interface PortalTimelineEvent {
40
+ eventType: string;
41
+ summary: string;
42
+ occurredAt: string;
43
+ }
44
+ export interface PortalOnboardingDetail extends PortalOnboardingListItem {
45
+ items: PortalOnboardingItem[];
46
+ documentRequirements: PortalDocumentRequirement[];
47
+ timeline: PortalTimelineEvent[];
48
+ }
49
+ export declare function listPortalOnboardings(tx: Tx, limit?: number, offset?: number): Promise<{
50
+ items: PortalOnboardingListItem[];
51
+ total: number;
52
+ }>;
53
+ export declare function getPortalOnboarding(tx: Tx, id: string): Promise<PortalOnboardingDetail | null>;
54
+ export declare function listPortalTimeline(tx: Tx, id: string, limit?: number, offset?: number): Promise<{
55
+ items: PortalTimelineEvent[];
56
+ total: number;
57
+ }>;
58
+ //# sourceMappingURL=portal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../src/onboarding/portal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C,qBAAa,oCAAqC,SAAQ,QAAQ;;CAOjE;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,WAAW,GAAG,aAAa,GAAG,yBAAyB,GAAG,WAAW,GAAG,QAAQ,CAAC;IACzF,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gCAAgC,EAAE,MAAM,CAAC;IACzC,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,GAAG,gBAAgB,CAAC;IAChF,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAuB,SAAQ,wBAAwB;IACtE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,oBAAoB,EAAE,yBAAyB,EAAE,CAAC;IAClD,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAkFD,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,KAAK,SAAK,EACV,MAAM,SAAI,GACT,OAAO,CAAC;IAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB/D;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CA+CxC;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,MAAM,EACV,KAAK,SAAK,EACV,MAAM,SAAI,GACT,OAAO,CAAC;IAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB1D"}
@@ -0,0 +1,170 @@
1
+ import { AppError } from '@baruk/shared';
2
+ export class PortalOnboardingFeatureDisabledError extends AppError {
3
+ constructor() {
4
+ super('O onboarding do Portal está indisponível', {
5
+ status: 404,
6
+ code: 'PORTAL_ONBOARDING_FEATURE_DISABLED',
7
+ });
8
+ }
9
+ }
10
+ const PUBLIC_EVENT_SUMMARY = {
11
+ 'onboarding.created': 'Seu onboarding foi criado',
12
+ 'onboarding.active': 'O onboarding foi iniciado',
13
+ 'onboarding.blocked': 'O onboarding aguarda informações',
14
+ 'onboarding.cancelled': 'O onboarding foi encerrado',
15
+ 'onboarding.item.created': 'Uma pendência foi adicionada',
16
+ 'onboarding.item.started': 'Uma pendência foi iniciada',
17
+ 'onboarding.item.completed': 'Uma pendência foi concluída',
18
+ 'onboarding.item.not_applicable': 'Uma pendência não se aplica',
19
+ 'onboarding.document.requested': 'Um documento foi solicitado',
20
+ 'onboarding.document.received': 'Um documento foi recebido',
21
+ 'onboarding.document.validated': 'Um documento foi validado',
22
+ 'onboarding.document.rejected': 'Um documento precisa de atenção',
23
+ 'onboarding.completed': 'O onboarding foi concluído',
24
+ 'onboarding.portal_response_submitted': 'Sua resposta foi enviada e aguarda análise do escritório',
25
+ 'onboarding.portal_response_supplemented': 'Sua informação complementar foi enviada e aguarda análise',
26
+ 'onboarding.portal_comment_created': 'Sua mensagem foi enviada ao escritório',
27
+ 'onboarding.external_delivery_confirmed': 'Você informou que enviou um documento por outro canal',
28
+ };
29
+ const PUBLIC_EVENT_TYPES = new Set(Object.keys(PUBLIC_EVENT_SUMMARY));
30
+ function publicStatus(status) {
31
+ if (status === 'draft')
32
+ return 'preparing';
33
+ if (status === 'active')
34
+ return 'in_progress';
35
+ if (status === 'blocked')
36
+ return 'waiting_for_information';
37
+ if (status === 'completed')
38
+ return 'completed';
39
+ return 'closed';
40
+ }
41
+ function iso(value) {
42
+ return value ? new Date(String(value)).toISOString() : null;
43
+ }
44
+ function percentage(completed, total) {
45
+ return total === 0 ? 0 : Math.round((completed / total) * 100);
46
+ }
47
+ async function baseRow(tx, id) {
48
+ const rows = await tx `
49
+ SELECT oi.id, oi.status, oi.due_at, oi.updated_at, oi.created_at,
50
+ c.display_name,
51
+ count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal') AS item_total,
52
+ count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal' AND item.status IN ('completed', 'not_applicable')) AS item_completed,
53
+ count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal' AND item.status NOT IN ('completed', 'not_applicable')) AS item_pending,
54
+ count(DISTINCT dr.id) AS document_total,
55
+ count(DISTINCT dr.id) FILTER (WHERE dr.status NOT IN ('validated')) AS document_pending
56
+ FROM onboarding_instance oi
57
+ JOIN client c ON c.id = oi.client_id AND c.deleted_at IS NULL
58
+ LEFT JOIN onboarding_item item ON item.onboarding_id = oi.id AND item.visibility = 'portal'
59
+ LEFT JOIN onboarding_document_requirement dr ON dr.onboarding_id = oi.id
60
+ WHERE oi.id = ${id ?? null}::uuid
61
+ GROUP BY oi.id, c.display_name
62
+ `;
63
+ return rows[0] ?? null;
64
+ }
65
+ function mapBase(row) {
66
+ const total = Number(row.item_total ?? 0);
67
+ const completed = Number(row.item_completed ?? 0);
68
+ const dueAt = iso(row.due_at);
69
+ const status = publicStatus(String(row.status));
70
+ return {
71
+ id: String(row.id),
72
+ clientDisplayName: String(row.display_name),
73
+ status,
74
+ progress: { completed, total, percentage: percentage(completed, total) },
75
+ dueAt,
76
+ overdue: !!dueAt &&
77
+ new Date(dueAt).getTime() < Date.now() &&
78
+ !['completed', 'closed'].includes(status),
79
+ pendingItemsCount: Number(row.item_pending ?? 0),
80
+ pendingDocumentRequirementsCount: Number(row.document_pending ?? 0),
81
+ lastPublicUpdateAt: iso(row.updated_at) ?? iso(row.created_at),
82
+ };
83
+ }
84
+ export async function listPortalOnboardings(tx, limit = 20, offset = 0) {
85
+ const rows = await tx `
86
+ SELECT oi.id, oi.status, oi.due_at, oi.updated_at, oi.created_at,
87
+ c.display_name,
88
+ count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal') AS item_total,
89
+ count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal' AND item.status IN ('completed', 'not_applicable')) AS item_completed,
90
+ count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal' AND item.status NOT IN ('completed', 'not_applicable')) AS item_pending,
91
+ count(DISTINCT dr.id) AS document_total,
92
+ count(DISTINCT dr.id) FILTER (WHERE dr.status NOT IN ('validated')) AS document_pending,
93
+ count(*) OVER() AS total
94
+ FROM onboarding_instance oi
95
+ JOIN client c ON c.id = oi.client_id AND c.deleted_at IS NULL
96
+ LEFT JOIN onboarding_item item ON item.onboarding_id = oi.id AND item.visibility = 'portal'
97
+ LEFT JOIN onboarding_document_requirement dr ON dr.onboarding_id = oi.id
98
+ GROUP BY oi.id, c.display_name
99
+ ORDER BY oi.updated_at DESC, oi.id
100
+ LIMIT ${Math.min(Math.max(limit, 1), 50)} OFFSET ${Math.max(offset, 0)}
101
+ `;
102
+ return { items: rows.map(mapBase), total: rows[0] ? Number(rows[0].total) : 0 };
103
+ }
104
+ export async function getPortalOnboarding(tx, id) {
105
+ const row = await baseRow(tx, id);
106
+ if (!row)
107
+ return null;
108
+ const items = await tx `
109
+ SELECT id, title, description, status, required, due_at, completed_at
110
+ FROM onboarding_item
111
+ WHERE onboarding_id = ${id} AND visibility = 'portal'
112
+ ORDER BY item_order, created_at
113
+ `;
114
+ const documents = await tx `
115
+ SELECT id, label, status, requested_at, received_at, validated_at, expires_at
116
+ FROM onboarding_document_requirement
117
+ WHERE onboarding_id = ${id}
118
+ ORDER BY requested_at
119
+ `;
120
+ const events = await tx `
121
+ SELECT event_type, occurred_at
122
+ FROM onboarding_event
123
+ WHERE onboarding_id = ${id} AND event_type = ANY(${Array.from(PUBLIC_EVENT_TYPES)})
124
+ ORDER BY occurred_at ASC, event_id ASC
125
+ `;
126
+ return {
127
+ ...mapBase(row),
128
+ items: items.map((item) => ({
129
+ id: String(item.id),
130
+ title: String(item.title),
131
+ description: item.description ? String(item.description) : null,
132
+ status: item.status,
133
+ required: Boolean(item.required),
134
+ dueAt: iso(item.due_at),
135
+ completedAt: iso(item.completed_at),
136
+ })),
137
+ documentRequirements: documents.map((document) => ({
138
+ id: String(document.id),
139
+ label: String(document.label),
140
+ status: document.status,
141
+ requestedAt: iso(document.requested_at),
142
+ receivedAt: iso(document.received_at),
143
+ validatedAt: iso(document.validated_at),
144
+ expiresAt: iso(document.expires_at),
145
+ })),
146
+ timeline: events.map((event) => ({
147
+ eventType: String(event.event_type),
148
+ summary: PUBLIC_EVENT_SUMMARY[String(event.event_type)],
149
+ occurredAt: iso(event.occurred_at),
150
+ })),
151
+ };
152
+ }
153
+ export async function listPortalTimeline(tx, id, limit = 20, offset = 0) {
154
+ const rows = await tx `
155
+ SELECT event_type, occurred_at, count(*) OVER() AS total
156
+ FROM onboarding_event
157
+ WHERE onboarding_id = ${id} AND event_type = ANY(${Array.from(PUBLIC_EVENT_TYPES)})
158
+ ORDER BY occurred_at ASC, event_id ASC
159
+ LIMIT ${Math.min(Math.max(limit, 1), 50)} OFFSET ${Math.max(offset, 0)}
160
+ `;
161
+ return {
162
+ items: rows.map((event) => ({
163
+ eventType: String(event.event_type),
164
+ summary: PUBLIC_EVENT_SUMMARY[String(event.event_type)],
165
+ occurredAt: iso(event.occurred_at),
166
+ })),
167
+ total: rows[0] ? Number(rows[0].total) : 0,
168
+ };
169
+ }
170
+ //# sourceMappingURL=portal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.js","sourceRoot":"","sources":["../../src/onboarding/portal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { BundleRecord } from '../commercial-catalog/types.js';
2
+ import { type Cents } from './money.js';
3
+ import type { BundlePricingRule, PricingQuoteItem } from './types.js';
4
+ /**
5
+ * Bundle (RFC §8 passo 5 / ETAPA 6) — NUNCA dupla cobrança: os módulos já
6
+ * foram precificados 1× cada em `MODULE_PRICE`; o bundle só declara a
7
+ * combinação (`BundleRecord`, em `commercial-catalog/`) e aplica um desconto
8
+ * ou zera o preço de um módulo incluído gratuitamente — nunca soma um novo
9
+ * item cobrável. `BundleRecord.discountRuleRef` é apenas uma referência
10
+ * (Catalog não resolve a regra); `BundlePricingRule` é a regra RESOLVIDA que
11
+ * o consumidor injeta para este cálculo (Catalog permanece intocado).
12
+ */
13
+ export declare function assertBundleModulesCovered(bundle: BundleRecord, chargedModuleCodes: Set<string>): void;
14
+ /** Módulos do bundle marcados `free_module` — usado por `pipeline.ts` para zerar o preço ANTES de somar o subtotal. */
15
+ export declare function freeModuleCodesForBundle(bundle: BundleRecord, rule: BundlePricingRule | undefined): Set<string>;
16
+ /**
17
+ * Desconto (percent/fixed) do bundle sobre o subtotal JÁ precificado dos seus
18
+ * módulos (excluindo os já zerados por `free_module`, que não têm o que
19
+ * descontar de novo). Retorna `null` quando não há regra percent/fixed.
20
+ */
21
+ export declare function resolveBundleDiscount(bundle: BundleRecord, rule: BundlePricingRule | undefined, items: PricingQuoteItem[]): Cents | null;
22
+ //# sourceMappingURL=bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/pricing-engine/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAwC,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtE;;;;;;;;GAQG;AAEH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAQtG;AAED,uHAAuH;AACvH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAS/G;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,iBAAiB,GAAG,SAAS,EACnC,KAAK,EAAE,gBAAgB,EAAE,GACxB,KAAK,GAAG,IAAI,CAWd"}
@@ -0,0 +1,44 @@
1
+ import { addCents, applyPercent, reaisToCents } from './money.js';
2
+ import { PricingEngineError } from './errors.js';
3
+ /**
4
+ * Bundle (RFC §8 passo 5 / ETAPA 6) — NUNCA dupla cobrança: os módulos já
5
+ * foram precificados 1× cada em `MODULE_PRICE`; o bundle só declara a
6
+ * combinação (`BundleRecord`, em `commercial-catalog/`) e aplica um desconto
7
+ * ou zera o preço de um módulo incluído gratuitamente — nunca soma um novo
8
+ * item cobrável. `BundleRecord.discountRuleRef` é apenas uma referência
9
+ * (Catalog não resolve a regra); `BundlePricingRule` é a regra RESOLVIDA que
10
+ * o consumidor injeta para este cálculo (Catalog permanece intocado).
11
+ */
12
+ export function assertBundleModulesCovered(bundle, chargedModuleCodes) {
13
+ const missing = bundle.moduleCodes.filter((m) => !chargedModuleCodes.has(m));
14
+ if (missing.length > 0) {
15
+ throw new PricingEngineError('invalid-bundle', `Bundle "${bundle.code}" exige módulos ausentes na oferta: ${missing.join(', ')}.`);
16
+ }
17
+ }
18
+ /** Módulos do bundle marcados `free_module` — usado por `pipeline.ts` para zerar o preço ANTES de somar o subtotal. */
19
+ export function freeModuleCodesForBundle(bundle, rule) {
20
+ if (!rule || rule.kind !== 'free_module' || !rule.freeModuleCode)
21
+ return new Set();
22
+ if (!bundle.moduleCodes.includes(rule.freeModuleCode)) {
23
+ throw new PricingEngineError('invalid-bundle', `Bundle "${bundle.code}": free_module "${rule.freeModuleCode}" não pertence ao bundle.`);
24
+ }
25
+ return new Set([rule.freeModuleCode]);
26
+ }
27
+ /**
28
+ * Desconto (percent/fixed) do bundle sobre o subtotal JÁ precificado dos seus
29
+ * módulos (excluindo os já zerados por `free_module`, que não têm o que
30
+ * descontar de novo). Retorna `null` quando não há regra percent/fixed.
31
+ */
32
+ export function resolveBundleDiscount(bundle, rule, items) {
33
+ if (!rule || rule.kind === 'free_module')
34
+ return null;
35
+ if (rule.value == null)
36
+ return null;
37
+ const coveredSubtotal = addCents(...items.filter((i) => i.origin === 'module' && bundle.moduleCodes.includes(i.targetCode)).map((i) => i.subtotalCents));
38
+ if (coveredSubtotal <= 0)
39
+ return null;
40
+ if (rule.kind === 'percent')
41
+ return applyPercent(coveredSubtotal, rule.value);
42
+ return Math.min(coveredSubtotal, reaisToCents(rule.value));
43
+ }
44
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/pricing-engine/bundle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGjD;;;;;;;;GAQG;AAEH,MAAM,UAAU,0BAA0B,CAAC,MAAoB,EAAE,kBAA+B;IAC9F,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,kBAAkB,CAC1B,gBAAgB,EAChB,WAAW,MAAM,CAAC,IAAI,uCAAuC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACnF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,uHAAuH;AACvH,MAAM,UAAU,wBAAwB,CAAC,MAAoB,EAAE,IAAmC;IAChG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IACnF,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,kBAAkB,CAC1B,gBAAgB,EAChB,WAAW,MAAM,CAAC,IAAI,mBAAmB,IAAI,CAAC,cAAc,2BAA2B,CACxF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAoB,EACpB,IAAmC,EACnC,KAAyB;IAEzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IACtD,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,eAAe,GAAG,QAAQ,CAC9B,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CACvH,CAAC;IACF,IAAI,eAAe,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Taxonomia de erros do Pricing Engine (RFC-CAPABILITY-PRICING-ENGINE-001 §2/
3
+ * §8, ETAPA 15). Invariante herdada das Capabilities certificadas: um erro de
4
+ * contrato é RETORNADO como dado (`EngineResult`, ver types.ts), nunca
5
+ * lançado silenciosamente para o consumidor — o motor puro não deve expor
6
+ * `throw` na sua fronteira pública. Internamente, helpers podem lançar
7
+ * `PricingEngineError` — `pipeline.ts` captura na borda e converte em
8
+ * `{ ok: false, error }`.
9
+ */
10
+ export type PricingErrorCode = 'catalog-version-not-found' | 'offer-not-found' | 'offer-ineligible' | 'currency-mismatch' | 'conflicting-rules' | 'invalid-bundle' | 'duplicate-charge-item' | 'coupon-invalid' | 'coupon-expired' | 'coupon-not-eligible' | 'campaign-conflict' | 'proration-invalid' | 'negotiated-contract-invalid' | 'price-rule-missing' | 'arithmetic-overflow' | 'invalid-effective-date';
11
+ /**
12
+ * Classificação (ETAPA 15): orienta o consumidor sobre corrigibilidade —
13
+ * `validation`/`operator-correctable` são esperados em uso normal (ex.: cupom
14
+ * expirado); `conflict` exige decisão humana (regras concorrentes); `configuration`
15
+ * e `permanent` indicam dado de catálogo/tabela incoerente, nunca escolha do
16
+ * usuário final.
17
+ */
18
+ export type PricingErrorClass = 'validation' | 'conflict' | 'configuration' | 'permanent' | 'operator-correctable';
19
+ export declare class PricingEngineError extends Error {
20
+ readonly code: PricingErrorCode;
21
+ readonly errorClass: PricingErrorClass;
22
+ /** `ruleId`s envolvidos num conflito (§8) — vazio quando não aplicável. */
23
+ readonly ruleIds: string[];
24
+ constructor(code: PricingErrorCode, message: string, ruleIds?: string[]);
25
+ toJSON(): {
26
+ code: PricingErrorCode;
27
+ errorClass: PricingErrorClass;
28
+ message: string;
29
+ ruleIds: string[];
30
+ };
31
+ }
32
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/pricing-engine/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,gBAAgB,GACxB,2BAA2B,GAC3B,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,GACnB,mBAAmB,GACnB,gBAAgB,GAChB,uBAAuB,GACvB,gBAAgB,GAChB,gBAAgB,GAChB,qBAAqB,GACrB,mBAAmB,GACnB,mBAAmB,GACnB,6BAA6B,GAC7B,oBAAoB,GACpB,qBAAqB,GACrB,wBAAwB,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,UAAU,GAAG,eAAe,GAAG,WAAW,GAAG,sBAAsB,CAAC;AAqBnH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAEf,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,EAAO;IAQ3E,MAAM,IAAI;QAAE,IAAI,EAAE,gBAAgB,CAAC;QAAC,UAAU,EAAE,iBAAiB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE;CAGxG"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Taxonomia de erros do Pricing Engine (RFC-CAPABILITY-PRICING-ENGINE-001 §2/
3
+ * §8, ETAPA 15). Invariante herdada das Capabilities certificadas: um erro de
4
+ * contrato é RETORNADO como dado (`EngineResult`, ver types.ts), nunca
5
+ * lançado silenciosamente para o consumidor — o motor puro não deve expor
6
+ * `throw` na sua fronteira pública. Internamente, helpers podem lançar
7
+ * `PricingEngineError` — `pipeline.ts` captura na borda e converte em
8
+ * `{ ok: false, error }`.
9
+ */
10
+ const ERROR_CLASS = {
11
+ 'catalog-version-not-found': 'configuration',
12
+ 'offer-not-found': 'validation',
13
+ 'offer-ineligible': 'validation',
14
+ 'currency-mismatch': 'permanent',
15
+ 'conflicting-rules': 'conflict',
16
+ 'invalid-bundle': 'configuration',
17
+ 'duplicate-charge-item': 'permanent',
18
+ 'coupon-invalid': 'validation',
19
+ 'coupon-expired': 'operator-correctable',
20
+ 'coupon-not-eligible': 'validation',
21
+ 'campaign-conflict': 'conflict',
22
+ 'proration-invalid': 'validation',
23
+ 'negotiated-contract-invalid': 'configuration',
24
+ 'price-rule-missing': 'configuration',
25
+ 'arithmetic-overflow': 'permanent',
26
+ 'invalid-effective-date': 'validation',
27
+ };
28
+ export class PricingEngineError extends Error {
29
+ code;
30
+ errorClass;
31
+ /** `ruleId`s envolvidos num conflito (§8) — vazio quando não aplicável. */
32
+ ruleIds;
33
+ constructor(code, message, ruleIds = []) {
34
+ super(message);
35
+ this.name = 'PricingEngineError';
36
+ this.code = code;
37
+ this.errorClass = ERROR_CLASS[code];
38
+ this.ruleIds = ruleIds;
39
+ }
40
+ toJSON() {
41
+ return { code: this.code, errorClass: this.errorClass, message: this.message, ruleIds: this.ruleIds };
42
+ }
43
+ }
44
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +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,MAAM,OAAO,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"}
@@ -0,0 +1,12 @@
1
+ export type { Cents } from './money.js';
2
+ export { roundHalfEven, reaisToCents, centsToReais, addCents, subtractCents, multiplyByQuantity, applyPercent, prorateByDays, clampNonNegative, } from './money.js';
3
+ export type { PricingErrorCode, PricingErrorClass } from './errors.js';
4
+ export { PricingEngineError } from './errors.js';
5
+ export type { EngineResult, PricingRuleStep, ItemOrigin, PricingQuoteItem, PricingQuoteDiscount, PricingQuoteTax, TrialContext, NegotiatedContract, BundlePricingRuleKind, BundlePricingRule, PricingCouponRule, PricingCampaignRule, ProrationReason, ProrationTiming, ProrationInput, ProrationResult, PricingRequest, PricingQuote, } from './types.js';
6
+ export { PRICING_ENGINE_VERSION, PRICING_RULE_STEPS_IN_ORDER } from './types.js';
7
+ export { assertBundleModulesCovered, freeModuleCodesForBundle, resolveBundleDiscount } from './bundle.js';
8
+ export { computeProration } from './proration.js';
9
+ export { computePricingQuote } from './pipeline.js';
10
+ export type { ShadowComparisonStatus, NormalizedQuoteForComparison, QuoteItemDiff, ShadowComparisonResult } from './shadow.js';
11
+ export { normalizeCanonicalQuote, compareQuotes } from './shadow.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pricing-engine/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,YAAY,EACV,YAAY,EACZ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,cAAc,EACd,eAAe,EACf,cAAc,EACd,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAEjF,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,YAAY,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC/H,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { roundHalfEven, reaisToCents, centsToReais, addCents, subtractCents, multiplyByQuantity, applyPercent, prorateByDays, clampNonNegative, } from './money.js';
2
+ export { PricingEngineError } from './errors.js';
3
+ export { PRICING_ENGINE_VERSION, PRICING_RULE_STEPS_IN_ORDER } from './types.js';
4
+ export { assertBundleModulesCovered, freeModuleCodesForBundle, resolveBundleDiscount } from './bundle.js';
5
+ export { computeProration } from './proration.js';
6
+ export { computePricingQuote } from './pipeline.js';
7
+ export { normalizeCanonicalQuote, compareQuotes } from './shadow.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pricing-engine/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAsBjD,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAEjF,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}