@baruk/core 0.1.0 → 0.3.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 +63 -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 +43 -0
  213. package/dist/commercial-catalog/coupon.d.ts.map +1 -0
  214. package/dist/commercial-catalog/coupon.js +57 -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 +175 -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,104 @@
1
+ /**
2
+ * Resolução pura do Commercial Catalog — sem DB, sem `Date.now()` interno (o
3
+ * instante e a `productLine` já resolvida do tenant são sempre injetados pelo
4
+ * consumidor). Espelha o papel de `reconcile.ts` no subscription-billing.
5
+ */
6
+ function isEligible(eligibility, productLine) {
7
+ return !eligibility || eligibility.length === 0 || eligibility.includes(productLine);
8
+ }
9
+ /**
10
+ * Valida uma Offer contra o catálogo: elegibilidade de linha (plano/módulos),
11
+ * dependências reais de módulo (nunca artificiais — só o que o próprio
12
+ * `ModuleRecord.requiredModuleCodes` declarar), e que módulos de bundle
13
+ * referenciados existam entre os módulos da oferta.
14
+ */
15
+ export function validateOffer(input) {
16
+ const { offer, plan, modules, bundles, productLine } = input;
17
+ const errors = [];
18
+ const moduleByCode = new Map(modules.map((m) => [m.code, m]));
19
+ if (!isEligible(plan.productLineEligibility, productLine)) {
20
+ errors.push({ code: 'plan_not_eligible', message: `Plano "${plan.code}" não elegível para a linha "${productLine}".` });
21
+ }
22
+ if (!isEligible(offer.productLineEligibility, productLine)) {
23
+ errors.push({ code: 'offer_not_eligible', message: `Oferta "${offer.code}" não elegível para a linha "${productLine}".` });
24
+ }
25
+ for (const moduleCode of offer.moduleCodes) {
26
+ const mod = moduleByCode.get(moduleCode);
27
+ if (!mod) {
28
+ errors.push({ code: 'module_not_found', message: `Módulo "${moduleCode}" não existe no catálogo.` });
29
+ continue;
30
+ }
31
+ if (!mod.isActive) {
32
+ errors.push({ code: 'module_inactive', message: `Módulo "${moduleCode}" está inativo.` });
33
+ }
34
+ if (!isEligible(mod.productLineEligibility, productLine)) {
35
+ errors.push({ code: 'module_not_eligible', message: `Módulo "${moduleCode}" não elegível para a linha "${productLine}".` });
36
+ }
37
+ for (const req of mod.requiredModuleCodes) {
38
+ if (!offer.moduleCodes.includes(req)) {
39
+ errors.push({
40
+ code: 'module_dependency_missing',
41
+ message: `Módulo "${moduleCode}" requer "${req}", que não está na oferta.`,
42
+ });
43
+ }
44
+ }
45
+ }
46
+ for (const bundleCode of offer.bundleCodes) {
47
+ const bundle = bundles.find((b) => b.code === bundleCode);
48
+ if (!bundle) {
49
+ errors.push({ code: 'bundle_not_found', message: `Bundle "${bundleCode}" não existe no catálogo.` });
50
+ continue;
51
+ }
52
+ for (const moduleCode of bundle.moduleCodes) {
53
+ if (!offer.moduleCodes.includes(moduleCode)) {
54
+ errors.push({
55
+ code: 'bundle_module_missing',
56
+ message: `Bundle "${bundleCode}" exige o módulo "${moduleCode}", que não está na oferta.`,
57
+ });
58
+ }
59
+ }
60
+ }
61
+ return errors;
62
+ }
63
+ /**
64
+ * Resolve o `PriceQuote` de uma Offer contra uma `CommercialPriceTable` vigente
65
+ * na data `now`. Não aplica cupom (isso é `coupon.ts`, sobre o quote resolvido).
66
+ * Precedência de escopo: maior `priority` primeiro; sem escopo casando, usa o
67
+ * item sem filtro de escopo (ALL implícito).
68
+ */
69
+ export function resolvePriceQuote(offer, table, now) {
70
+ if (table.code !== offer.priceTableCode) {
71
+ throw new Error(`Offer "${offer.code}" referencia a tabela "${offer.priceTableCode}", recebida "${table.code}".`);
72
+ }
73
+ if (table.status !== 'active') {
74
+ throw new Error(`Tabela "${table.code}" não está ativa (status="${table.status}").`);
75
+ }
76
+ if (now < table.effectiveFrom || (table.effectiveTo != null && now > table.effectiveTo)) {
77
+ throw new Error(`Tabela "${table.code}" fora de vigência em ${now}.`);
78
+ }
79
+ // Bundle NÃO é alvo precificável aqui (RFC §4.4: "não calcula, só declara a
80
+ // combinação e a intenção de desconto"). O desconto de bundle é resolvido
81
+ // pelo Pricing Engine (regra sobre os módulos já precificados), fora deste
82
+ // MVP — por isso `bundleCodes` não entra na lista de alvos obrigatórios.
83
+ const targets = [
84
+ { targetType: 'PLAN', targetCode: offer.planCode },
85
+ ...offer.moduleCodes.map((code) => ({ targetType: 'MODULE', targetCode: code })),
86
+ ...offer.addonCodes.map((code) => ({ targetType: 'ADDON', targetCode: code })),
87
+ ];
88
+ const items = targets.map(({ targetType, targetCode }) => {
89
+ const found = table.items.find((i) => i.targetType === targetType && i.targetCode === targetCode);
90
+ if (!found) {
91
+ throw new Error(`Sem preço para ${targetType}:${targetCode} na tabela "${table.code}" v${table.version}.`);
92
+ }
93
+ return { targetType, targetCode, amount: found.amount };
94
+ });
95
+ const total = items.reduce((sum, i) => sum + i.amount, 0);
96
+ return {
97
+ currency: table.currency,
98
+ items,
99
+ total,
100
+ priceTableCode: table.code,
101
+ priceTableVersion: table.version,
102
+ };
103
+ }
104
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/commercial-catalog/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Contratos de consumo — SOMENTE TIPOS (ETAPA 10 do Track A1, RFC-COMMERCIAL-
3
+ * MODEL-001 §8/§22). Prepara IA/WhatsApp/e-mail/storage/OCR/automações/APIs
4
+ * para a camada de Usage/Rating — NÃO implementa Baruk Wallet nem o Rating
5
+ * Engine aqui (marcos posteriores do mesmo Track A, RFC-COMMERCIAL-MODEL-001
6
+ * §24). Unidade comercial única: crédito (o cliente nunca vê token/provedor).
7
+ */
8
+ /** As famílias de consumo já evidenciadas (RFC §28.9) — cada uma um `usageType`. */
9
+ export type ConsumptionUsageType = 'ai.email_generation' | 'ai.whatsapp_generation' | 'ai.customer_summary' | 'ai.commercial_assistant' | 'voice.call_center_ai_per_min' | 'ocr.per_page' | 'image.processing' | 'comm.whatsapp_conversation' | 'comm.sms' | 'comm.bulk_email_per_1k' | 'automation.run' | 'api.external_call';
10
+ /**
11
+ * O fato de consumo — o que o Usage Metering (marco posterior) vai emitir.
12
+ * `provider`/`model` nunca chegam ao cliente (unidade comercial = crédito).
13
+ */
14
+ export interface ConsumptionEventContract {
15
+ usageType: ConsumptionUsageType;
16
+ tenantId: string;
17
+ quantity: number;
18
+ /** Instante do fato — injetado (mesma disciplina do subscription-billing). */
19
+ occurredAt: string;
20
+ /** Idempotência — obrigatória quando o Rating Engine existir (marco posterior). */
21
+ idempotencyKey: string;
22
+ }
23
+ /** Franquia incluída por ciclo — resolvida do Plan (§ commercial-catalog types.ts). */
24
+ export interface ConsumptionFranchise {
25
+ usageType: ConsumptionUsageType | 'storage_bytes' | 'credits_generic';
26
+ includedPerCycle: number;
27
+ }
28
+ export type ExcessPolicy = 'block' | 'metered';
29
+ export interface ConsumptionExcessRule {
30
+ usageType: ConsumptionUsageType | 'storage_bytes' | 'credits_generic';
31
+ policy: ExcessPolicy;
32
+ }
33
+ //# sourceMappingURL=consumption-contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumption-contracts.d.ts","sourceRoot":"","sources":["../../src/commercial-catalog/consumption-contracts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oFAAoF;AACpF,MAAM,MAAM,oBAAoB,GAC5B,qBAAqB,GACrB,wBAAwB,GACxB,qBAAqB,GACrB,yBAAyB,GACzB,8BAA8B,GAC9B,cAAc,GACd,kBAAkB,GAClB,4BAA4B,GAC5B,UAAU,GACV,wBAAwB,GACxB,gBAAgB,GAChB,mBAAmB,CAAC;AAExB;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,oBAAoB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,uFAAuF;AACvF,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,oBAAoB,GAAG,eAAe,GAAG,iBAAiB,CAAC;IACtE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/C,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,oBAAoB,GAAG,eAAe,GAAG,iBAAiB,CAAC;IACtE,MAAM,EAAE,YAAY,CAAC;CACtB"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Contratos de consumo — SOMENTE TIPOS (ETAPA 10 do Track A1, RFC-COMMERCIAL-
3
+ * MODEL-001 §8/§22). Prepara IA/WhatsApp/e-mail/storage/OCR/automações/APIs
4
+ * para a camada de Usage/Rating — NÃO implementa Baruk Wallet nem o Rating
5
+ * Engine aqui (marcos posteriores do mesmo Track A, RFC-COMMERCIAL-MODEL-001
6
+ * §24). Unidade comercial única: crédito (o cliente nunca vê token/provedor).
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=consumption-contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumption-contracts.js","sourceRoot":"","sources":["../../src/commercial-catalog/consumption-contracts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,43 @@
1
+ import type { CouponRecord, PriceQuote } from './types.js';
2
+ /**
3
+ * Cupons — MVP (RFC-COMMERCIAL-MODEL-001 §18/§29.8): apenas os 5 efeitos já
4
+ * cobertos pelo `CouponRecord` (percent_off, amount_off, trial_extension,
5
+ * free_module_period, promotional_credit). Generalização para "Campaign" fica
6
+ * para quando houver variedade real de campanha (Framework Evolution Policy) —
7
+ * não construído aqui.
8
+ */
9
+ export interface CouponApplicationError {
10
+ code: string;
11
+ message: string;
12
+ }
13
+ /**
14
+ * Contexto do resgate. Os dois campos são opcionais: um consumidor que não os
15
+ * informa mantém exatamente o comportamento anterior.
16
+ */
17
+ export interface CouponValidationContext {
18
+ planCode: string;
19
+ moduleCodes: string[];
20
+ /**
21
+ * true quando quem resgata é o CADASTRO PÚBLICO. Endurece a regra: só passa
22
+ * cupom marcado para onboarding, e nunca um interno.
23
+ *
24
+ * Sem esta distinção, qualquer código descoberto por um visitante vale no
25
+ * cadastro — inclusive os de retenção, emitidos caso a caso para segurar um
26
+ * cliente específico.
27
+ */
28
+ publicSignup?: boolean;
29
+ /** Tenant do resgate, quando existe. Necessário para cupom com escopo. */
30
+ tenantId?: string | null;
31
+ }
32
+ /** Valida um cupom contra a data corrente e o alvo (plano/módulos da oferta). */
33
+ export declare function validateCoupon(coupon: CouponRecord, now: string, context: CouponValidationContext): CouponApplicationError[];
34
+ /** Aplica o efeito monetário do cupom (percent_off/amount_off) sobre um PriceQuote já resolvido. */
35
+ export declare function applyCouponToQuote(quote: PriceQuote, coupon: CouponRecord): PriceQuote;
36
+ /** Dias de trial adicionais concedidos pelo cupom (0 se o efeito não for trial_extension). */
37
+ export declare function couponTrialExtensionDays(coupon: CouponRecord | undefined): number;
38
+ /** Módulo liberado temporariamente pelo cupom, se houver (free_module_period). */
39
+ export declare function couponFreeModule(coupon: CouponRecord | undefined): {
40
+ moduleCode: string;
41
+ periodDays: number;
42
+ } | null;
43
+ //# sourceMappingURL=coupon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coupon.d.ts","sourceRoot":"","sources":["../../src/commercial-catalog/coupon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;;GAMG;AAEH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,uBAAuB,GAC/B,sBAAsB,EAAE,CA6B1B;AAED,oGAAoG;AACpG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,GAAG,UAAU,CAYtF;AAED,8FAA8F;AAC9F,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,CAEjF;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGpH"}
@@ -0,0 +1,57 @@
1
+ /** Valida um cupom contra a data corrente e o alvo (plano/módulos da oferta). */
2
+ export function validateCoupon(coupon, now, context) {
3
+ const errors = [];
4
+ if (!coupon.isActive)
5
+ errors.push({ code: 'coupon_inactive', message: `Cupom "${coupon.code}" está inativo.` });
6
+ if (now < coupon.validFrom || (coupon.validTo != null && now > coupon.validTo)) {
7
+ errors.push({ code: 'coupon_out_of_validity', message: `Cupom "${coupon.code}" fora da validade em ${now}.` });
8
+ }
9
+ if (coupon.maxRedemptions != null && (coupon.redemptionsCount ?? 0) >= coupon.maxRedemptions) {
10
+ errors.push({ code: 'coupon_redemptions_exhausted', message: `Cupom "${coupon.code}" atingiu o limite de resgates.` });
11
+ }
12
+ if (coupon.appliesToPlanCodes && coupon.appliesToPlanCodes.length > 0 && !coupon.appliesToPlanCodes.includes(context.planCode)) {
13
+ errors.push({ code: 'coupon_plan_not_eligible', message: `Cupom "${coupon.code}" não se aplica ao plano "${context.planCode}".` });
14
+ }
15
+ if (coupon.appliesToModuleCodes && coupon.appliesToModuleCodes.length > 0) {
16
+ const hasAny = coupon.appliesToModuleCodes.some((m) => context.moduleCodes.includes(m));
17
+ if (!hasAny) {
18
+ errors.push({ code: 'coupon_modules_not_eligible', message: `Cupom "${coupon.code}" não se aplica aos módulos da oferta.` });
19
+ }
20
+ }
21
+ // Cadastro público é mais restrito que resgate administrativo: o operador
22
+ // pode aplicar um cupom interno a um cliente; um visitante, nunca.
23
+ if (context.publicSignup === true && (coupon.appliesAtOnboarding !== true || coupon.isInternalPromo === true)) {
24
+ errors.push({ code: 'coupon_not_for_public_signup', message: `Cupom "${coupon.code}" não está disponível para cadastro.` });
25
+ }
26
+ // Cupom com escopo vale só no tenant do acordo — um desconto negociado
27
+ // individualmente não pode vazar para os demais.
28
+ if (coupon.tenantScopeId != null && coupon.tenantScopeId !== context.tenantId) {
29
+ errors.push({ code: 'coupon_other_tenant', message: `Cupom "${coupon.code}" não está disponível para esta conta.` });
30
+ }
31
+ return errors;
32
+ }
33
+ /** Aplica o efeito monetário do cupom (percent_off/amount_off) sobre um PriceQuote já resolvido. */
34
+ export function applyCouponToQuote(quote, coupon) {
35
+ if (coupon.effectType === 'percent_off' && coupon.percentOff != null) {
36
+ const factor = 1 - coupon.percentOff / 100;
37
+ return { ...quote, total: Math.round(quote.total * factor * 100) / 100 };
38
+ }
39
+ if (coupon.effectType === 'amount_off' && coupon.amountOff != null) {
40
+ return { ...quote, total: Math.max(0, quote.total - coupon.amountOff) };
41
+ }
42
+ // trial_extension / free_module_period / promotional_credit não alteram o
43
+ // preço do quote — afetam a duração do trial (ver `offer-application.ts`) ou
44
+ // concedem crédito/módulo (fora do escopo de preço).
45
+ return quote;
46
+ }
47
+ /** Dias de trial adicionais concedidos pelo cupom (0 se o efeito não for trial_extension). */
48
+ export function couponTrialExtensionDays(coupon) {
49
+ return coupon?.effectType === 'trial_extension' ? (coupon.trialExtensionDays ?? 0) : 0;
50
+ }
51
+ /** Módulo liberado temporariamente pelo cupom, se houver (free_module_period). */
52
+ export function couponFreeModule(coupon) {
53
+ if (coupon?.effectType !== 'free_module_period' || !coupon.freeModuleCode)
54
+ return null;
55
+ return { moduleCode: coupon.freeModuleCode, periodDays: coupon.freeModulePeriodDays ?? 30 };
56
+ }
57
+ //# sourceMappingURL=coupon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coupon.js","sourceRoot":"","sources":["../../src/commercial-catalog/coupon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type { ProductLineCode, ProductLineStatus, ProductLineRecord, PlanFranchises, CommercialPlan, ModuleClass, ModuleRecord, BundleRecord, CouponEffectType, CouponRecord, CommercialPriceTableStatus, CommercialPriceTargetType, CommercialPriceItem, CommercialPriceScope, CommercialPriceTable, OfferRecord, PriceQuote, } from './types.js';
2
+ export { KNOWN_ACTIVE_PRODUCT_LINES } from './types.js';
3
+ export type { CatalogValidationError, OfferValidationInput } from './catalog.js';
4
+ export { validateOffer, resolvePriceQuote } from './catalog.js';
5
+ export type { CouponApplicationError } from './coupon.js';
6
+ export { validateCoupon, applyCouponToQuote, couponTrialExtensionDays, couponFreeModule } from './coupon.js';
7
+ export type { ApplyOfferInput, ApplyOfferResult } from './offer-application.js';
8
+ export { applyOffer } from './offer-application.js';
9
+ export type { ConsumptionUsageType, ConsumptionEventContract, ConsumptionFranchise, ExcessPolicy, ConsumptionExcessRule, } from './consumption-contracts.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commercial-catalog/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,0BAA0B,EAC1B,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAExD,YAAY,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEhE,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE7G,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,YAAY,EACV,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,GACtB,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { KNOWN_ACTIVE_PRODUCT_LINES } from './types.js';
2
+ export { validateOffer, resolvePriceQuote } from './catalog.js';
3
+ export { validateCoupon, applyCouponToQuote, couponTrialExtensionDays, couponFreeModule } from './coupon.js';
4
+ export { applyOffer } from './offer-application.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commercial-catalog/index.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGhE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG7G,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { type ReconcileResult } from '../subscription-billing/reconcile.js';
2
+ import type { Subscription } from '../subscription-billing/types.js';
3
+ import { type EntitlementRecord } from '../entitlements/index.js';
4
+ import { type CatalogValidationError } from './catalog.js';
5
+ import type { BundleRecord, CommercialPlan, CommercialPriceTable, CouponRecord, ModuleRecord, OfferRecord, PriceQuote, ProductLineCode } from './types.js';
6
+ /**
7
+ * Orquestração de "aceitar uma Offer" — o seam central do Track A1
8
+ * (RFC-CAPABILITY-COMMERCIAL-CATALOG-001 §8): Offer compõe, cada domínio
9
+ * calcula a sua parte, nenhum duplica regra do outro.
10
+ *
11
+ * Catálogo (valida elegibilidade/dependências + resolve preço)
12
+ * → Cupom (ajusta preço/trial/módulo grátis, se houver)
13
+ * → Subscription Billing CERTIFICADO (`startTrial` — não reimplementado aqui)
14
+ * → Entitlements (deriva o que fica habilitado)
15
+ */
16
+ export interface ApplyOfferInput {
17
+ tenantId: string;
18
+ /** A linha já resolvida pelo consumidor (equivalente a `tenant.productLine`/`product_tenant` — nunca resolvida aqui). */
19
+ productLine: ProductLineCode;
20
+ offer: OfferRecord;
21
+ plan: CommercialPlan;
22
+ modules: ModuleRecord[];
23
+ bundles: BundleRecord[];
24
+ priceTable: CommercialPriceTable;
25
+ coupon?: CouponRecord;
26
+ currentEntitlements: EntitlementRecord[];
27
+ /** Instante do fato, ISO — injetado (nunca `Date.now()` aqui, mesma disciplina do subscription-billing). */
28
+ now: string;
29
+ }
30
+ export interface ApplyOfferResult {
31
+ subscription: Subscription;
32
+ domainEvents: ReconcileResult['domainEvents'];
33
+ entitlements: EntitlementRecord[];
34
+ quote: PriceQuote;
35
+ /** Não-vazio → o consumidor NÃO deve persistir subscription/entitlements (aceitação inválida). */
36
+ errors: CatalogValidationError[];
37
+ }
38
+ export declare function applyOffer(input: ApplyOfferInput): ApplyOfferResult;
39
+ //# sourceMappingURL=offer-application.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offer-application.d.ts","sourceRoot":"","sources":["../../src/commercial-catalog/offer-application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAsB,KAAK,iBAAiB,EAA0B,MAAM,0BAA0B,CAAC;AAC9G,OAAO,EAAoC,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE7F,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;GASG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,yHAAyH;IACzH,WAAW,EAAE,eAAe,CAAC;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,oBAAoB,CAAC;IACjC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;IACzC,4GAA4G;IAC5G,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IAC9C,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,KAAK,EAAE,UAAU,CAAC;IAClB,kGAAkG;IAClG,MAAM,EAAE,sBAAsB,EAAE,CAAC;CAClC;AAaD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAyCnE"}
@@ -0,0 +1,50 @@
1
+ import { startTrial } from '../subscription-billing/reconcile.js';
2
+ import { deriveEntitlements } from '../entitlements/index.js';
3
+ import { resolvePriceQuote, validateOffer } from './catalog.js';
4
+ import { validateCoupon, applyCouponToQuote, couponTrialExtensionDays, couponFreeModule } from './coupon.js';
5
+ /** Aceita data pura (`YYYY-MM-DD`) ou datetime ISO completo (mesma normalização do subscription-billing). */
6
+ function parseIso(iso) {
7
+ return /^\d{4}-\d{2}-\d{2}$/.test(iso) ? new Date(`${iso}T00:00:00Z`) : new Date(iso);
8
+ }
9
+ function addDaysIso(iso, days) {
10
+ const d = parseIso(iso);
11
+ d.setUTCDate(d.getUTCDate() + days);
12
+ return d.toISOString();
13
+ }
14
+ export function applyOffer(input) {
15
+ const { tenantId, productLine, offer, plan, modules, bundles, priceTable, coupon, currentEntitlements, now } = input;
16
+ const errors = validateOffer({ offer, plan, modules, bundles, productLine });
17
+ if (coupon) {
18
+ errors.push(...validateCoupon(coupon, now, { planCode: offer.planCode, moduleCodes: offer.moduleCodes }));
19
+ }
20
+ let quote = resolvePriceQuote(offer, priceTable, now);
21
+ if (coupon)
22
+ quote = applyCouponToQuote(quote, coupon);
23
+ // Trial é política da ASSINATURA, não do Plano (RFC §19): default do plano,
24
+ // sobrescrito pela Offer, estendido por cupom — nunca uma constante fixa.
25
+ const trialDays = (offer.trialDaysOverride ?? plan.defaultTrialDays) + couponTrialExtensionDays(coupon);
26
+ const trialEndsAt = addDaysIso(now, trialDays);
27
+ const { subscription, domainEvents } = startTrial(tenantId, offer.planCode, trialEndsAt, now);
28
+ const targetGrants = offer.moduleCodes.map((moduleCode) => ({
29
+ moduleCode,
30
+ source: 'PLAN',
31
+ expiresAt: null,
32
+ }));
33
+ const freeModule = couponFreeModule(coupon);
34
+ if (freeModule && !offer.moduleCodes.includes(freeModule.moduleCode)) {
35
+ targetGrants.push({
36
+ moduleCode: freeModule.moduleCode,
37
+ source: 'COUPON',
38
+ expiresAt: addDaysIso(now, freeModule.periodDays),
39
+ });
40
+ }
41
+ const entitlements = deriveEntitlements({
42
+ tenantId,
43
+ subscriptionId: subscription.subscriptionId,
44
+ targetGrants,
45
+ current: currentEntitlements,
46
+ now,
47
+ });
48
+ return { subscription, domainEvents, entitlements, quote, errors };
49
+ }
50
+ //# sourceMappingURL=offer-application.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offer-application.js","sourceRoot":"","sources":["../../src/commercial-catalog/offer-application.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Commercial Catalog — contrato canônico (Track A1, derivado de
3
+ * RFC-CAPABILITY-COMMERCIAL-CATALOG-001 §4/§7 + RFC-COMMERCIAL-MODEL-001).
4
+ * Escopo: Baruk.app Representante + Indústria. Domínio PURO (sem DB, sem
5
+ * `Date.now()` interno) — mesmo padrão de `subscription-billing/`.
6
+ *
7
+ * Princípio transversal (nunca colapsar): Identidade (`code` estável / `name`
8
+ * editável) ≠ Precificação (vive na `CommercialPriceTable` versionada, NUNCA no
9
+ * Plan/Module) ≠ Vigência (da tabela/campanha/oferta) ≠ Elegibilidade (regras
10
+ * de quem pode contratar).
11
+ *
12
+ * Reconciliação Reality-First (achado do Track A1, 2026-07-22): o schema real
13
+ * de `manga-verde-bi` guarda `productLine` no TENANT (`tenant.productLine:
14
+ * 'rep' | 'ind'`, resolvido por precedência — coluna explícita > regra de
15
+ * founder-tenant-id), NÃO no Plan. Portanto este módulo NÃO amarra um Plan/
16
+ * Module a uma única linha fixa — `productLineEligibility` é uma lista
17
+ * OPCIONAL (undefined/vazio = elegível a todas as linhas ativas). Qual linha
18
+ * um tenant específico roda é resolvido pelo CONSUMIDOR (equivalente ao
19
+ * `product/tenant_product` do `baruk-platform`, ou ao `tenant.productLine` do
20
+ * mvb) — este módulo recebe a linha já resolvida, nunca a resolve sozinho.
21
+ */
22
+ /**
23
+ * Linhas ATIVAS hoje (evidência real: `product-line.ts` do mvb só implementa
24
+ * 'rep'|'ind'). 'varejo' e futuras (contabilidade/saúde/agro/educação) entram
25
+ * como REGISTRO NOVO — nunca exigem união de tipo nova no domínio, por isso o
26
+ * tipo abaixo é `string` com as ativas apenas documentadas, não um union fechado.
27
+ */
28
+ export type ProductLineCode = string;
29
+ export declare const KNOWN_ACTIVE_PRODUCT_LINES: readonly ProductLineCode[];
30
+ export type ProductLineStatus = 'active' | 'reserved';
31
+ export interface ProductLineRecord {
32
+ code: ProductLineCode;
33
+ name: string;
34
+ status: ProductLineStatus;
35
+ metadata?: Record<string, unknown>;
36
+ }
37
+ export interface PlanFranchises {
38
+ includedUsers: number;
39
+ storageIncludedBytes: number;
40
+ includedCreditsPerCycle: number;
41
+ }
42
+ /**
43
+ * Envelope comercial. `code` é a identidade ESTÁVEL (persistida em
44
+ * `Subscription.items[].planKey` do subscription-billing); `name` é dado
45
+ * editável (Pricing Studio) — nunca usar `name` como chave.
46
+ */
47
+ export interface CommercialPlan {
48
+ code: string;
49
+ name: string;
50
+ tier: number;
51
+ franchises: PlanFranchises;
52
+ /** Duração padrão de trial (dias) — política, sobrescrita por Coupon/campanha (§ trial). */
53
+ defaultTrialDays: number;
54
+ /** Undefined/vazio = elegível a qualquer ProductLine ativa. */
55
+ productLineEligibility?: ProductLineCode[];
56
+ isPublic: boolean;
57
+ isActive: boolean;
58
+ metadata?: Record<string, unknown>;
59
+ }
60
+ export type ModuleClass = 'CORE' | 'ADD_ON' | 'PREMIUM' | 'ENTERPRISE';
61
+ export interface ModuleRecord {
62
+ code: string;
63
+ name: string;
64
+ class: ModuleClass;
65
+ /** Ex.: 'communication' — o rótulo organizador "Communication Hub" (RFC §29.4). */
66
+ category?: string;
67
+ /** Dependências reais — nunca artificiais (restrição explícita). */
68
+ requiredModuleCodes: string[];
69
+ productLineEligibility?: ProductLineCode[];
70
+ marketplaceVisible: boolean;
71
+ isActive: boolean;
72
+ }
73
+ export interface BundleRecord {
74
+ code: string;
75
+ name: string;
76
+ moduleCodes: string[];
77
+ /** Referência à regra de desconto resolvida pelo Pricing Engine (não aqui). */
78
+ discountRuleRef?: string;
79
+ isActive: boolean;
80
+ }
81
+ export type CouponEffectType = 'percent_off' | 'amount_off' | 'trial_extension' | 'free_module_period' | 'promotional_credit';
82
+ export interface CouponRecord {
83
+ code: string;
84
+ effectType: CouponEffectType;
85
+ /** 0-100, só para percent_off. */
86
+ percentOff?: number;
87
+ /** Valor absoluto, só para amount_off (mesma unidade da CommercialPriceTable). */
88
+ amountOff?: number;
89
+ /** Dias adicionais de trial, só para trial_extension. */
90
+ trialExtensionDays?: number;
91
+ /** Módulo liberado temporariamente, só para free_module_period. */
92
+ freeModuleCode?: string;
93
+ freeModulePeriodDays?: number;
94
+ /** Créditos promocionais concedidos, só para promotional_credit. */
95
+ promotionalCredits?: number;
96
+ appliesToPlanCodes?: string[];
97
+ appliesToModuleCodes?: string[];
98
+ maxRedemptions?: number | null;
99
+ /** Contagem de resgates já feitos — injetada pelo consumidor (persistência fora deste domínio). */
100
+ redemptionsCount?: number;
101
+ validFrom: string;
102
+ validTo: string | null;
103
+ isActive: boolean;
104
+ /**
105
+ * Cupom oferecível no CADASTRO PÚBLICO. Ausente ou `false` → o cupom existe,
106
+ * mas não é resgatável por quem está criando conta.
107
+ *
108
+ * Existe porque sem esta distinção qualquer código descoberto por um visitante
109
+ * vale no cadastro — inclusive os de retenção, que são emitidos caso a caso
110
+ * para segurar um cliente específico. Opcional para não quebrar consumidor
111
+ * existente: só é exigido quando o chamador declara contexto público.
112
+ */
113
+ appliesAtOnboarding?: boolean;
114
+ /**
115
+ * Cupom interno (retenção, cortesia, correção comercial). Nunca resgatável no
116
+ * cadastro público, mesmo que `appliesAtOnboarding` esteja ligado.
117
+ */
118
+ isInternalPromo?: boolean;
119
+ /**
120
+ * Restringe o cupom a um tenant específico. Usado em acordo individual — um
121
+ * desconto negociado com um cliente não pode valer para os demais.
122
+ */
123
+ tenantScopeId?: string | null;
124
+ }
125
+ export type CommercialPriceTableStatus = 'draft' | 'scheduled' | 'active' | 'superseded' | 'archived';
126
+ export type CommercialPriceTargetType = 'PLAN' | 'MODULE' | 'BUNDLE' | 'ADDON' | 'CREDIT_PACKAGE' | 'SEAT';
127
+ export interface CommercialPriceItem {
128
+ targetType: CommercialPriceTargetType;
129
+ targetCode: string;
130
+ amount: number;
131
+ interval: 'monthly' | 'yearly' | 'one_time';
132
+ }
133
+ export interface CommercialPriceScope {
134
+ /** Ex.: productLine, segment, tenantId — precedência por `priority` (maior vence). */
135
+ scopeType: 'PRODUCT_LINE' | 'SEGMENT' | 'TENANT' | 'ALL';
136
+ matchValue?: string;
137
+ priority: number;
138
+ }
139
+ export interface CommercialPriceTable {
140
+ code: string;
141
+ currency: string;
142
+ status: CommercialPriceTableStatus;
143
+ version: number;
144
+ effectiveFrom: string;
145
+ effectiveTo: string | null;
146
+ scopes: CommercialPriceScope[];
147
+ items: CommercialPriceItem[];
148
+ }
149
+ export interface OfferRecord {
150
+ code: string;
151
+ name: string;
152
+ planCode: string;
153
+ moduleCodes: string[];
154
+ bundleCodes: string[];
155
+ addonCodes: string[];
156
+ couponCode?: string;
157
+ /** Sobrescreve `CommercialPlan.defaultTrialDays` quando definido (trial é política da Offer/Subscription). */
158
+ trialDaysOverride?: number;
159
+ priceTableCode: string;
160
+ productLineEligibility?: ProductLineCode[];
161
+ isActive: boolean;
162
+ }
163
+ /** Resultado de resolução de preço — o `PriceQuote` referenciado pela RFC. */
164
+ export interface PriceQuote {
165
+ currency: string;
166
+ items: Array<{
167
+ targetType: CommercialPriceTargetType;
168
+ targetCode: string;
169
+ amount: number;
170
+ }>;
171
+ total: number;
172
+ priceTableCode: string;
173
+ priceTableVersion: number;
174
+ }
175
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/commercial-catalog/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AAErC,eAAO,MAAM,0BAA0B,EAAE,SAAS,eAAe,EAAmB,CAAC;AAErF,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAID,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,cAAc,CAAC;IAC3B,4FAA4F;IAC5F,gBAAgB,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,sBAAsB,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAID,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,sBAAsB,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3C,kBAAkB,EAAE,OAAO,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAID,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAID,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,YAAY,GACZ,iBAAiB,GACjB,oBAAoB,GACpB,oBAAoB,CAAC;AAEzB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,gBAAgB,CAAC;IAC7B,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,mGAAmG;IACnG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAElB;;;;;;;;OAQG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAID,MAAM,MAAM,0BAA0B,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;AACtG,MAAM,MAAM,yBAAyB,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAE3G,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,yBAAyB,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;CAC7C;AAED,MAAM,WAAW,oBAAoB;IACnC,sFAAsF;IACtF,SAAS,EAAE,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,0BAA0B,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,KAAK,EAAE,mBAAmB,EAAE,CAAC;CAC9B;AAID,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8GAA8G;IAC9G,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,yBAAyB,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5F,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Commercial Catalog — contrato canônico (Track A1, derivado de
3
+ * RFC-CAPABILITY-COMMERCIAL-CATALOG-001 §4/§7 + RFC-COMMERCIAL-MODEL-001).
4
+ * Escopo: Baruk.app Representante + Indústria. Domínio PURO (sem DB, sem
5
+ * `Date.now()` interno) — mesmo padrão de `subscription-billing/`.
6
+ *
7
+ * Princípio transversal (nunca colapsar): Identidade (`code` estável / `name`
8
+ * editável) ≠ Precificação (vive na `CommercialPriceTable` versionada, NUNCA no
9
+ * Plan/Module) ≠ Vigência (da tabela/campanha/oferta) ≠ Elegibilidade (regras
10
+ * de quem pode contratar).
11
+ *
12
+ * Reconciliação Reality-First (achado do Track A1, 2026-07-22): o schema real
13
+ * de `manga-verde-bi` guarda `productLine` no TENANT (`tenant.productLine:
14
+ * 'rep' | 'ind'`, resolvido por precedência — coluna explícita > regra de
15
+ * founder-tenant-id), NÃO no Plan. Portanto este módulo NÃO amarra um Plan/
16
+ * Module a uma única linha fixa — `productLineEligibility` é uma lista
17
+ * OPCIONAL (undefined/vazio = elegível a todas as linhas ativas). Qual linha
18
+ * um tenant específico roda é resolvido pelo CONSUMIDOR (equivalente ao
19
+ * `product/tenant_product` do `baruk-platform`, ou ao `tenant.productLine` do
20
+ * mvb) — este módulo recebe a linha já resolvida, nunca a resolve sozinho.
21
+ */
22
+ export const KNOWN_ACTIVE_PRODUCT_LINES = ['rep', 'ind'];
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/commercial-catalog/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAYH,MAAM,CAAC,MAAM,0BAA0B,GAA+B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC"}