@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,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Seed do tenant fundador — SC Organização Contábil (tenant 0001).
5
+ *
6
+ * Princípio inegociável (01-multi-tenancy §6): a SC nasce como um tenant COMUM,
7
+ * SEM hardcode estrutural. Este script apenas materializa dados; nenhum `if
8
+ * (tenant === 'SC')` existe no código de produção.
9
+ *
10
+ * Dados legais não confirmados (CNPJ, CRC, sócios) permanecem NULOS — nunca
11
+ * inventados. Apenas um usuário administrador de DESENVOLVIMENTO é criado.
12
+ *
13
+ * Idempotente. Uso: `pnpm db:seed`.
14
+ */
15
+ const index_js_1 = require("../index.js");
16
+ async function main() {
17
+ (0, index_js_1.loadEnv)();
18
+ const ownerUrl = process.env.DATABASE_URL;
19
+ if (!ownerUrl)
20
+ throw new Error('DATABASE_URL (papel owner) não definida.');
21
+ const adminPassword = process.env.SEED_ADMIN_PASSWORD;
22
+ if (!adminPassword)
23
+ throw new Error('SEED_ADMIN_PASSWORD não definida.');
24
+ const db = (0, index_js_1.createDb)(ownerUrl, { role: 'owner', max: 1 });
25
+ try {
26
+ // 1) Catálogos globais: RBAC + produtos do ecossistema.
27
+ await (0, index_js_1.ensureRbacCatalog)(db);
28
+ await (0, index_js_1.ensureProductCatalog)(db);
29
+ console.log('✓ Catálogos garantidos (RBAC + produtos do ecossistema).');
30
+ // 2) Tenant fundador SC — dados legais não confirmados ficam NULOS.
31
+ const tenantId = await (0, index_js_1.ensureTenant)(db, {
32
+ code: 'sc',
33
+ displayName: 'SC Organização Contábil',
34
+ legalName: null, // Razão social/CNPJ não confirmados — jamais inventar.
35
+ status: 'active',
36
+ primaryProduct: 'contabil',
37
+ });
38
+ console.log(`✓ Tenant SC garantido: ${tenantId}`);
39
+ // 3) Organização/unidade default + entitlement do produto Contábil.
40
+ await (0, index_js_1.ensureOrganization)(db, tenantId, 'Matriz');
41
+ await (0, index_js_1.ensureTenantProduct)(db, tenantId, 'contabil');
42
+ console.log('✓ Entitlement do produto Baruk Contábil concedido à SC.');
43
+ // 4) Usuário administrador de DESENVOLVIMENTO (não é dado real de sócio).
44
+ const adminEmail = 'admin@sc.baruk.dev';
45
+ const admin = await (0, index_js_1.upsertUserWithPassword)(db, {
46
+ email: adminEmail,
47
+ fullName: 'Administrador SC (dev)',
48
+ password: adminPassword,
49
+ userType: 'staff',
50
+ });
51
+ console.log(`✓ Usuário admin (dev) garantido: ${admin.email}`);
52
+ // 5) Vínculo + papel Owner.
53
+ await (0, index_js_1.ensureMembership)(db, tenantId, admin.id);
54
+ await (0, index_js_1.assignSystemRole)(db, tenantId, admin.id, 'owner');
55
+ console.log('✓ Membership + papel Owner atribuídos ao admin no tenant SC.');
56
+ // 6) Catálogo de planos do SaaS (BILL-01) — idempotente.
57
+ await (0, index_js_1.seedSaasPlans)(db);
58
+ console.log('✓ Catálogo de planos SaaS garantido (starter/pro/enterprise/pro-anual).');
59
+ console.log('\n✓ Seed concluído. Login dev: admin@sc.baruk.dev / (SEED_ADMIN_PASSWORD)');
60
+ }
61
+ finally {
62
+ await db.end({ timeout: 5 });
63
+ }
64
+ }
65
+ main().catch((err) => {
66
+ console.error('✗ Falha no seed:', err instanceof Error ? err.message : err);
67
+ process.exit(1);
68
+ });
69
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/db/seed.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;GAWG;AACH,0CAYqB;AAErB,KAAK,UAAU,IAAI;IACjB,IAAA,kBAAO,GAAE,CAAC;IACV,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC1C,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC3E,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACtD,IAAI,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAEzE,MAAM,EAAE,GAAG,IAAA,mBAAQ,EAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,wDAAwD;QACxD,MAAM,IAAA,4BAAiB,EAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,IAAA,+BAAoB,EAAC,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QAExE,oEAAoE;QACpE,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAY,EAAC,EAAE,EAAE;YACtC,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,yBAAyB;YACtC,SAAS,EAAE,IAAI,EAAE,uDAAuD;YACxE,MAAM,EAAE,QAAQ;YAChB,cAAc,EAAE,UAAU;SAC3B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QAElD,oEAAoE;QACpE,MAAM,IAAA,6BAAkB,EAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,IAAA,8BAAmB,EAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QAEvE,0EAA0E;QAC1E,MAAM,UAAU,GAAG,oBAAoB,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,IAAA,iCAAsB,EAAC,EAAE,EAAE;YAC7C,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,wBAAwB;YAClC,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAE/D,4BAA4B;QAC5B,MAAM,IAAA,2BAAgB,EAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAA,2BAAgB,EAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAE5E,yDAAyD;QACzD,MAAM,IAAA,wBAAa,EAAC,EAAE,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;QAEvF,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;IAC3F,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ENTITLEMENTS_CONTRACT_VERSION = void 0;
4
+ exports.getEffectiveEntitlements = getEffectiveEntitlements;
5
+ exports.getLimits = getLimits;
6
+ exports.explainDecision = explainDecision;
7
+ exports.can = can;
8
+ const sources_js_1 = require("./sources.js");
9
+ const standing_js_1 = require("./standing.js");
10
+ /**
11
+ * Decision API canônica (contrato 1.0.0 — ENTITLEMENTS_CONTRACT_SPEC_2026-07-27.md
12
+ * §8-§10, §14). EXTENSÃO/facade sobre `deriveEntitlements`/`hasActiveEntitlement`
13
+ * (`derive.ts`, intactas) — pura, determinística, sem DB/rede/NestJS/mvb. Todos
14
+ * os fatos externos (standing, limites, uso, flag operacional) são injetados
15
+ * pelo consumidor via `EntitlementContext` — nunca resolvidos aqui.
16
+ */
17
+ exports.ENTITLEMENTS_CONTRACT_VERSION = '1.0.0';
18
+ /** `moduleCode` normalizado para comparação (trim + lowercase) — §4. Não reescreve os dados persistidos. */
19
+ function normalizeModuleCodeKey(moduleCode) {
20
+ return moduleCode.trim().toLowerCase();
21
+ }
22
+ function isValidModuleCode(moduleCode) {
23
+ return /^[a-z][a-z0-9_-]{1,63}$/i.test(moduleCode.trim());
24
+ }
25
+ function isRecordActiveNow(e, now) {
26
+ if (!e.active)
27
+ return false;
28
+ if (e.expiresAt != null && e.expiresAt < now)
29
+ return false;
30
+ return true;
31
+ }
32
+ function isExplicitDeny(e) {
33
+ // BETA é alias legado de MANUAL (§5). O deny explícito deve ser alias-invariante:
34
+ // avaliar a fonte NORMALIZADA (canonical), nunca o valor bruto persistido — do
35
+ // contrário um grant BETA + `metadata.deny` escaparia do deny e concederia acesso.
36
+ return (0, sources_js_1.normalizeEntitlementSource)(e.source).canonical === 'MANUAL' && e.metadata?.deny === true;
37
+ }
38
+ /** Entitlements ativos do subject, isolados por tenant (nunca vaza entre tenants) — §7/§11. */
39
+ function getEffectiveEntitlements(subject, ctx) {
40
+ if (!subject.tenantId)
41
+ return [];
42
+ return ctx.entitlements.filter((e) => e.tenantId === subject.tenantId && isRecordActiveNow(e, ctx.now));
43
+ }
44
+ /** Composição pura de limite declarado + uso injetado — sem medir, sem enforcement (§14). */
45
+ function getLimits(subject, moduleCode, ctx) {
46
+ if (!subject.tenantId || !ctx.grantedLimits?.length)
47
+ return [];
48
+ const key = normalizeModuleCodeKey(moduleCode);
49
+ return ctx.grantedLimits
50
+ .filter((g) => normalizeModuleCodeKey(g.moduleCode) === key)
51
+ .map((definition) => {
52
+ const usage = ctx.usage?.find((u) => normalizeModuleCodeKey(u.moduleCode) === key && u.limitKey === definition.limitKey);
53
+ if (definition.value == null) {
54
+ return { definition, usage, remaining: null };
55
+ }
56
+ if (!usage) {
57
+ return { definition, usage: undefined, remaining: undefined };
58
+ }
59
+ return { definition, usage, remaining: definition.value - usage.consumed };
60
+ });
61
+ }
62
+ /**
63
+ * Decisão completa e explicável (formaliza `AccessDecision{allowed,reason}` do
64
+ * mvb, adicionando `reasonCode` estável). Ordem de avaliação (§7/§10/§11):
65
+ * tenant context → deny explícito → entitlement (ativo/expirado/ausente) →
66
+ * standing → limite consumível esgotado → flag operacional → allow.
67
+ */
68
+ function explainDecision(subject, moduleCode, ctx) {
69
+ const base = {
70
+ moduleCode,
71
+ tenantId: subject.tenantId,
72
+ standing: ctx.standing,
73
+ policyVersion: exports.ENTITLEMENTS_CONTRACT_VERSION,
74
+ evaluatedAt: ctx.now,
75
+ };
76
+ if (!subject.tenantId || !subject.tenantId.trim()) {
77
+ return {
78
+ ...base,
79
+ allowed: false,
80
+ reasonCode: 'TENANT_CONTEXT_MISSING',
81
+ reason: 'tenantId ausente ou vazio — decisão fina nunca cruza tenants',
82
+ sources: [],
83
+ effectiveUntil: null,
84
+ };
85
+ }
86
+ if (!isValidModuleCode(moduleCode)) {
87
+ return {
88
+ ...base,
89
+ allowed: false,
90
+ reasonCode: 'ENTITLEMENT_MISSING',
91
+ reason: `moduleCode inválido: "${moduleCode}"`,
92
+ sources: [],
93
+ effectiveUntil: null,
94
+ };
95
+ }
96
+ // Tenant isolation: só registros do próprio tenant influenciam a decisão (§11).
97
+ const key = normalizeModuleCodeKey(moduleCode);
98
+ const tenantRecords = ctx.entitlements.filter((e) => e.tenantId === subject.tenantId);
99
+ const matching = tenantRecords.filter((e) => normalizeModuleCodeKey(e.moduleCode) === key);
100
+ const deny = matching.find((e) => isExplicitDeny(e) && isRecordActiveNow(e, ctx.now));
101
+ if (deny) {
102
+ return {
103
+ ...base,
104
+ allowed: false,
105
+ reasonCode: 'EXPLICIT_DENY',
106
+ reason: 'override MANUAL nega explicitamente este módulo',
107
+ sources: ['MANUAL'],
108
+ effectiveUntil: deny.expiresAt,
109
+ };
110
+ }
111
+ // FAIL_OPEN_PRIVILEGED: fato explícito injetado (nunca inferido) — ainda assim
112
+ // respeita um deny explícito (checado acima), mas ignora ausência/expiração.
113
+ if (ctx.failOpenPrivileged) {
114
+ return {
115
+ ...base,
116
+ allowed: true,
117
+ reasonCode: 'FAIL_OPEN_PRIVILEGED',
118
+ reason: 'fail-open: subject privilegiado (fato injetado pelo consumidor)',
119
+ sources: [],
120
+ effectiveUntil: null,
121
+ };
122
+ }
123
+ const active = matching.filter((e) => isRecordActiveNow(e, ctx.now));
124
+ if (active.length === 0) {
125
+ const hadAnyRecord = matching.length > 0;
126
+ return {
127
+ ...base,
128
+ allowed: false,
129
+ reasonCode: hadAnyRecord ? 'ENTITLEMENT_EXPIRED' : 'ENTITLEMENT_MISSING',
130
+ reason: hadAnyRecord
131
+ ? 'entitlement encontrado mas expirado/inativo'
132
+ : 'nenhum entitlement para este módulo',
133
+ sources: [],
134
+ effectiveUntil: null,
135
+ };
136
+ }
137
+ const normalizedSources = active.map((e) => (0, sources_js_1.normalizeEntitlementSource)(e.source));
138
+ const winner = normalizedSources.reduce((best, cur) => (0, sources_js_1.sourcePrecedence)(cur) < (0, sources_js_1.sourcePrecedence)(best) ? cur : best);
139
+ const canonicalSources = Array.from(new Set(normalizedSources
140
+ .filter((s) => s.canonical != null)
141
+ .map((s) => s.canonical)));
142
+ const hasUnboundedGrant = active.some((e) => e.expiresAt == null);
143
+ const effectiveUntil = hasUnboundedGrant
144
+ ? null
145
+ : active.reduce((min, e) => (min == null || e.expiresAt < min ? e.expiresAt : min), null);
146
+ if (!(0, standing_js_1.isStandingOk)(ctx.standing)) {
147
+ return {
148
+ ...base,
149
+ allowed: false,
150
+ reasonCode: 'SUBSCRIPTION_BLOCKED',
151
+ reason: ctx.standing.reasonCode === 'SUBSCRIPTION_RESTRICTED'
152
+ ? 'standing restrito'
153
+ : 'standing bloqueado',
154
+ sources: canonicalSources,
155
+ effectiveUntil,
156
+ };
157
+ }
158
+ if (ctx.standing.accessLevel === 'RESTRICTED') {
159
+ return {
160
+ ...base,
161
+ allowed: false,
162
+ reasonCode: 'SUBSCRIPTION_RESTRICTED',
163
+ reason: 'standing restrito: módulo bloqueado para read/core-only',
164
+ sources: canonicalSources,
165
+ effectiveUntil,
166
+ };
167
+ }
168
+ const limits = getLimits(subject, moduleCode, ctx);
169
+ const exhausted = limits.find((l) => l.definition.value != null && l.remaining != null && l.remaining <= 0);
170
+ if (exhausted) {
171
+ return {
172
+ ...base,
173
+ allowed: false,
174
+ reasonCode: 'LIMIT_REACHED',
175
+ reason: `limite "${exhausted.definition.limitKey}" esgotado`,
176
+ sources: canonicalSources,
177
+ effectiveUntil,
178
+ };
179
+ }
180
+ if (ctx.operationalFlag === false) {
181
+ return {
182
+ ...base,
183
+ allowed: false,
184
+ reasonCode: 'FEATURE_DISABLED_OPERATIONALLY',
185
+ reason: 'kill-switch operacional desabilitado para este módulo',
186
+ sources: canonicalSources,
187
+ effectiveUntil,
188
+ };
189
+ }
190
+ return {
191
+ ...base,
192
+ allowed: true,
193
+ reasonCode: 'ENTITLEMENT_ACTIVE',
194
+ reason: `allowed via ${winner.canonical ?? 'unknown source'}`,
195
+ sources: canonicalSources,
196
+ effectiveUntil,
197
+ };
198
+ }
199
+ /** Facade booleana — composição de `explainDecision` (§8). */
200
+ function can(subject, moduleCode, ctx) {
201
+ return explainDecision(subject, moduleCode, ctx).allowed;
202
+ }
203
+ //# sourceMappingURL=decision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision.js","sourceRoot":"","sources":["../../../src/entitlements/decision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deriveEntitlements = deriveEntitlements;
4
+ exports.hasActiveEntitlement = hasActiveEntitlement;
5
+ /**
6
+ * Resolve o próximo estado de entitlements: ativa o que está no alvo (preserva
7
+ * `grantedAt` original se já existia), desativa (soft-disable) o que não está
8
+ * mais no alvo. Concessões expiradas (`expiresAt < now`) nunca entram ativas.
9
+ */
10
+ function deriveEntitlements(input) {
11
+ const { tenantId, subscriptionId, targetGrants, current, now } = input;
12
+ const currentByModule = new Map(current.map((e) => [e.moduleCode, e]));
13
+ const targetCodes = new Set(targetGrants.map((g) => g.moduleCode));
14
+ const next = [];
15
+ for (const grant of targetGrants) {
16
+ const isExpired = grant.expiresAt != null && grant.expiresAt < now;
17
+ const existing = currentByModule.get(grant.moduleCode);
18
+ next.push({
19
+ tenantId,
20
+ subscriptionId,
21
+ moduleCode: grant.moduleCode,
22
+ source: grant.source,
23
+ active: !isExpired,
24
+ expiresAt: grant.expiresAt,
25
+ grantedAt: existing?.grantedAt ?? now,
26
+ metadata: existing?.metadata,
27
+ });
28
+ }
29
+ // Módulos que o tenant tinha e não estão mais no alvo → soft-disable (nunca remove o registro).
30
+ for (const existing of current) {
31
+ if (!targetCodes.has(existing.moduleCode)) {
32
+ next.push({ ...existing, active: false });
33
+ }
34
+ }
35
+ return next;
36
+ }
37
+ /** True se o tenant tem o módulo ativo agora (lookup rápido, mesmo padrão do `manga-verde-bi/access`). */
38
+ function hasActiveEntitlement(entitlements, moduleCode, now) {
39
+ const e = entitlements.find((x) => x.moduleCode === moduleCode);
40
+ if (!e || !e.active)
41
+ return false;
42
+ if (e.expiresAt != null && e.expiresAt < now)
43
+ return false;
44
+ return true;
45
+ }
46
+ //# sourceMappingURL=derive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.js","sourceRoot":"","sources":["../../../src/entitlements/derive.ts"],"names":[],"mappings":";;AA8BA,gDA8BC;AAGD,oDASC;AA/CD;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,KAA8B;IAC/D,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IACvE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAEnE,MAAM,IAAI,GAAwB,EAAE,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC;QACnE,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC;YACR,QAAQ;YACR,cAAc;YACd,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,CAAC,SAAS;YAClB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;YACrC,QAAQ,EAAE,QAAQ,EAAE,QAAQ;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,gGAAgG;IAChG,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0GAA0G;AAC1G,SAAgB,oBAAoB,CAClC,YAAiC,EACjC,UAAkB,EAClB,GAAW;IAEX,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IAChE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLimits = exports.getEffectiveEntitlements = exports.explainDecision = exports.can = exports.ENTITLEMENTS_CONTRACT_VERSION = exports.isStandingOk = exports.normalizeSubscriptionStanding = exports.sourcePrecedence = exports.normalizeEntitlementSource = exports.LEGACY_SOURCE_ALIAS = exports.CANONICAL_ENTITLEMENT_SOURCES = exports.hasActiveEntitlement = exports.deriveEntitlements = void 0;
4
+ var derive_js_1 = require("./derive.js");
5
+ Object.defineProperty(exports, "deriveEntitlements", { enumerable: true, get: function () { return derive_js_1.deriveEntitlements; } });
6
+ Object.defineProperty(exports, "hasActiveEntitlement", { enumerable: true, get: function () { return derive_js_1.hasActiveEntitlement; } });
7
+ // Contrato canônico 1.0.0 (P2 — Core Contract Alignment, ENTITLEMENTS_CONTRACT_SPEC_2026-07-27.md).
8
+ // Extensão aditiva: deriveEntitlements/hasActiveEntitlement acima permanecem intactas.
9
+ var sources_js_1 = require("./sources.js");
10
+ Object.defineProperty(exports, "CANONICAL_ENTITLEMENT_SOURCES", { enumerable: true, get: function () { return sources_js_1.CANONICAL_ENTITLEMENT_SOURCES; } });
11
+ Object.defineProperty(exports, "LEGACY_SOURCE_ALIAS", { enumerable: true, get: function () { return sources_js_1.LEGACY_SOURCE_ALIAS; } });
12
+ Object.defineProperty(exports, "normalizeEntitlementSource", { enumerable: true, get: function () { return sources_js_1.normalizeEntitlementSource; } });
13
+ Object.defineProperty(exports, "sourcePrecedence", { enumerable: true, get: function () { return sources_js_1.sourcePrecedence; } });
14
+ var standing_js_1 = require("./standing.js");
15
+ Object.defineProperty(exports, "normalizeSubscriptionStanding", { enumerable: true, get: function () { return standing_js_1.normalizeSubscriptionStanding; } });
16
+ Object.defineProperty(exports, "isStandingOk", { enumerable: true, get: function () { return standing_js_1.isStandingOk; } });
17
+ var decision_js_1 = require("./decision.js");
18
+ Object.defineProperty(exports, "ENTITLEMENTS_CONTRACT_VERSION", { enumerable: true, get: function () { return decision_js_1.ENTITLEMENTS_CONTRACT_VERSION; } });
19
+ Object.defineProperty(exports, "can", { enumerable: true, get: function () { return decision_js_1.can; } });
20
+ Object.defineProperty(exports, "explainDecision", { enumerable: true, get: function () { return decision_js_1.explainDecision; } });
21
+ Object.defineProperty(exports, "getEffectiveEntitlements", { enumerable: true, get: function () { return decision_js_1.getEffectiveEntitlements; } });
22
+ Object.defineProperty(exports, "getLimits", { enumerable: true, get: function () { return decision_js_1.getLimits; } });
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/entitlements/index.ts"],"names":[],"mappings":";;;AAIA,yCAAuE;AAA9D,+GAAA,kBAAkB,OAAA;AAAE,iHAAA,oBAAoB,OAAA;AAEjD,oGAAoG;AACpG,uFAAuF;AACvF,2CAKsB;AAJpB,2HAAA,6BAA6B,OAAA;AAC7B,iHAAA,mBAAmB,OAAA;AACnB,wHAAA,0BAA0B,OAAA;AAC1B,8GAAA,gBAAgB,OAAA;AAGlB,6CAA4E;AAAnE,4HAAA,6BAA6B,OAAA;AAAE,2GAAA,YAAY,OAAA;AAEpD,6CAMuB;AALrB,4HAAA,6BAA6B,OAAA;AAC7B,kGAAA,GAAG,OAAA;AACH,8GAAA,eAAe,OAAA;AACf,uHAAA,wBAAwB,OAAA;AACxB,wGAAA,SAAS,OAAA"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LEGACY_SOURCE_ALIAS = exports.CANONICAL_ENTITLEMENT_SOURCES = void 0;
4
+ exports.normalizeEntitlementSource = normalizeEntitlementSource;
5
+ exports.sourcePrecedence = sourcePrecedence;
6
+ /**
7
+ * Fontes canônicas (contrato 1.0.0 — ENTITLEMENTS_CONTRACT_SPEC_2026-07-27.md §5).
8
+ * Superset das 6 já existentes em `types.ts` — nenhuma removida, nenhuma renomeada.
9
+ */
10
+ exports.CANONICAL_ENTITLEMENT_SOURCES = [
11
+ 'PLAN',
12
+ 'ADDON',
13
+ 'COUPON',
14
+ 'CAMPAIGN',
15
+ 'MANUAL',
16
+ 'FEATURE_FLAG',
17
+ ];
18
+ /** Alias legado (mvb `Entitlement.source = 'BETA'`) — nunca reescrito em massa. */
19
+ exports.LEGACY_SOURCE_ALIAS = 'BETA';
20
+ /**
21
+ * Ordem de precedência canônica, maior→menor (§10): `MANUAL > FEATURE_FLAG >
22
+ * ADDON > CAMPAIGN/COUPON > PLAN`. `CAMPAIGN` e `COUPON` são o mesmo nível
23
+ * (grupo "CAMPAIGN/COUPON" no contrato) — nunca uma prevalece sobre a outra
24
+ * por precedência; ambas concedem, ambas aparecem em `sources`. Índice menor
25
+ * = mais forte.
26
+ */
27
+ const PRECEDENCE_TIERS = [
28
+ ['MANUAL'],
29
+ ['FEATURE_FLAG'],
30
+ ['ADDON'],
31
+ ['CAMPAIGN', 'COUPON'],
32
+ ['PLAN'],
33
+ ];
34
+ /** Fonte desconhecida (forward-compat) recebe esta precedência — mínima, abaixo de PLAN. */
35
+ const UNKNOWN_SOURCE_PRECEDENCE = PRECEDENCE_TIERS.length;
36
+ /**
37
+ * Normaliza uma fonte bruta (persistida) para o conjunto canônico.
38
+ * - `BETA` → `MANUAL` + `legacySource: "BETA"` (compat, sem migração destrutiva).
39
+ * - Valor canônico → passthrough.
40
+ * - Valor desconhecido (forward-compat) → `canonical: null`, `isUnknown: true`; o
41
+ * grant continua sendo honrado se `active`, mas nunca finge ser uma fonte
42
+ * canônica — evita ganhar autoridade por acidente (§5/§10 da Contract Spec).
43
+ */
44
+ function normalizeEntitlementSource(raw) {
45
+ if (raw === exports.LEGACY_SOURCE_ALIAS) {
46
+ return { raw, canonical: 'MANUAL', isUnknown: false, legacySource: exports.LEGACY_SOURCE_ALIAS };
47
+ }
48
+ if (exports.CANONICAL_ENTITLEMENT_SOURCES.includes(raw)) {
49
+ return { raw, canonical: raw, isUnknown: false };
50
+ }
51
+ return { raw, canonical: null, isUnknown: true };
52
+ }
53
+ /** Precedência de uma fonte normalizada — menor valor = mais forte; desconhecida = mínima. */
54
+ function sourcePrecedence(source) {
55
+ if (source.isUnknown || source.canonical == null)
56
+ return UNKNOWN_SOURCE_PRECEDENCE;
57
+ const tierIdx = PRECEDENCE_TIERS.findIndex((tier) => tier.includes(source.canonical));
58
+ return tierIdx === -1 ? UNKNOWN_SOURCE_PRECEDENCE : tierIdx;
59
+ }
60
+ //# sourceMappingURL=sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.js","sourceRoot":"","sources":["../../../src/entitlements/sources.ts"],"names":[],"mappings":";;;AAuDA,gEAQC;AAGD,4CAMC;AAtED;;;GAGG;AACU,QAAA,6BAA6B,GAAiC;IACzE,MAAM;IACN,OAAO;IACP,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,cAAc;CACf,CAAC;AAEF,mFAAmF;AACtE,QAAA,mBAAmB,GAAG,MAAM,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,gBAAgB,GAA8C;IAClE,CAAC,QAAQ,CAAC;IACV,CAAC,cAAc,CAAC;IAChB,CAAC,OAAO,CAAC;IACT,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,MAAM,CAAC;CACT,CAAC;AAEF,4FAA4F;AAC5F,MAAM,yBAAyB,GAAG,gBAAgB,CAAC,MAAM,CAAC;AAa1D;;;;;;;GAOG;AACH,SAAgB,0BAA0B,CAAC,GAAW;IACpD,IAAI,GAAG,KAAK,2BAAmB,EAAE,CAAC;QAChC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,2BAAmB,EAAE,CAAC;IAC3F,CAAC;IACD,IAAK,qCAAmD,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,GAAwB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,8FAA8F;AAC9F,SAAgB,gBAAgB,CAAC,MAAwB;IACvD,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI;QAAE,OAAO,yBAAyB,CAAC;IACnF,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CACjD,IAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAmB,CAAC,CACjE,CAAC;IACF,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeSubscriptionStanding = normalizeSubscriptionStanding;
4
+ exports.isStandingOk = isStandingOk;
5
+ /**
6
+ * Mapeamento status → accessLevel (mvb 7 valores + core 5 valores).
7
+ * Desconhecido → BLOCKED (fail-closed — regra de segurança, nunca afrouxa por omissão).
8
+ */
9
+ const STATUS_TO_STANDING = {
10
+ // mvb (SubscriptionStatus do Prisma) + core (subscription-billing) — case-sensitive, ambos os vocabulários.
11
+ TRIALING: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
12
+ trialing: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
13
+ ACTIVE: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
14
+ active: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
15
+ PAST_DUE: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
16
+ past_due: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
17
+ RESTRICTED: { accessLevel: 'RESTRICTED', reasonCode: 'SUBSCRIPTION_RESTRICTED' },
18
+ SUSPENDED: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
19
+ CANCELED: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
20
+ canceled: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
21
+ EXPIRED: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
22
+ paused: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
23
+ NONE: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
24
+ };
25
+ /**
26
+ * Normaliza um status de assinatura (mvb ou core) para o `SubscriptionStanding`
27
+ * canônico. Puro — nenhuma máquina de estados, nenhum I/O. Status desconhecido
28
+ * (incluindo ausente/vazio) → BLOCKED (fail-closed, §6 da Contract Spec).
29
+ */
30
+ function normalizeSubscriptionStanding(status) {
31
+ const key = status ?? 'NONE';
32
+ const mapped = STATUS_TO_STANDING[key];
33
+ if (!mapped) {
34
+ return { accessLevel: 'BLOCKED', statusCanonical: key, reasonCode: 'SUBSCRIPTION_BLOCKED' };
35
+ }
36
+ return { accessLevel: mapped.accessLevel, statusCanonical: key, reasonCode: mapped.reasonCode };
37
+ }
38
+ /** `standingOk` — mesma regra já usada pelo mvb (`accessLevel !== 'BLOCKED'`), ratificada no contrato. */
39
+ function isStandingOk(standing) {
40
+ return standing.accessLevel !== 'BLOCKED';
41
+ }
42
+ //# sourceMappingURL=standing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standing.js","sourceRoot":"","sources":["../../../src/entitlements/standing.ts"],"names":[],"mappings":";;AA0CA,sEASC;AAGD,oCAEC;AAxCD;;;GAGG;AACH,MAAM,kBAAkB,GAAyE;IAC/F,4GAA4G;IAC5G,QAAQ,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACnE,QAAQ,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACnE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACjE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACjE,QAAQ,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACnE,QAAQ,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACnE,UAAU,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,yBAAyB,EAAE;IAChF,SAAS,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACzE,QAAQ,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACxE,QAAQ,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACxE,OAAO,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACvE,MAAM,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACtE,IAAI,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;CACrE,CAAC;AAEF;;;;GAIG;AACH,SAAgB,6BAA6B,CAC3C,MAAiC;IAEjC,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC;IAC7B,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,sBAAsB,EAAE,CAAC;IAC9F,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;AAClG,CAAC;AAED,0GAA0G;AAC1G,SAAgB,YAAY,CAAC,QAA8B;IACzD,OAAO,QAAQ,CAAC,WAAW,KAAK,SAAS,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /**
3
+ * Entitlements (finos) — contrato canônico (Track A1, RFC-CAPABILITY-
4
+ * COMMERCIAL-CATALOG-001 §6). Domínio PURO — sem DB, sem `Date.now()` interno.
5
+ *
6
+ * Distinção dura (nunca confundir — achado Reality-First, §25 do modelo):
7
+ * - Entitlement FINO (este módulo) = "o tenant contratou o módulo X" — deriva
8
+ * da Offer/Subscription, é o que este pacote resolve.
9
+ * - Entitlement GROSSO (`product`/`tenant_product`, já em produção no
10
+ * `baruk-platform`, migração `0010_product_entitlements.sql`) = "o tenant
11
+ * pode abrir este PRODUTO" (IAM). É uma camada DIFERENTE, anterior a esta —
12
+ * o Hub bloqueia o produto pelo grosso; DENTRO do produto, o fino decide
13
+ * quais módulos/capacidades aparecem. Este módulo nunca substitui aquele.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/entitlements/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseClientsCsv = parseClientsCsv;
4
+ exports.planImport = planImport;
5
+ exports.commitImport = commitImport;
6
+ const repository_js_1 = require("../clients/repository.js");
7
+ const HEADER_ALIASES = {
8
+ nome: 'displayName',
9
+ display_name: 'displayName',
10
+ razao_social: 'displayName',
11
+ documento: 'documentNumber',
12
+ document_number: 'documentNumber',
13
+ cnpj: 'documentNumber',
14
+ cpf: 'documentNumber',
15
+ tipo: 'clientType',
16
+ client_type: 'clientType',
17
+ email: 'email',
18
+ telefone: 'phone',
19
+ phone: 'phone',
20
+ };
21
+ function parseCsvRaw(text) {
22
+ const rows = [];
23
+ let field = '';
24
+ let row = [];
25
+ let inQuotes = false;
26
+ const s = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
27
+ for (let i = 0; i < s.length; i++) {
28
+ const c = s[i];
29
+ if (inQuotes) {
30
+ if (c === '"') {
31
+ if (s[i + 1] === '"') {
32
+ field += '"';
33
+ i++;
34
+ }
35
+ else
36
+ inQuotes = false;
37
+ }
38
+ else
39
+ field += c;
40
+ }
41
+ else if (c === '"')
42
+ inQuotes = true;
43
+ else if (c === ',') {
44
+ row.push(field);
45
+ field = '';
46
+ }
47
+ else if (c === '\n') {
48
+ row.push(field);
49
+ rows.push(row);
50
+ row = [];
51
+ field = '';
52
+ }
53
+ else
54
+ field += c;
55
+ }
56
+ if (field.length > 0 || row.length > 0) {
57
+ row.push(field);
58
+ rows.push(row);
59
+ }
60
+ return rows.filter((r) => r.some((cell) => cell.trim() !== ''));
61
+ }
62
+ const onlyDigits = (v) => v.replace(/\D/g, '');
63
+ function parseClientsCsv(text) {
64
+ const raw = parseCsvRaw(text);
65
+ const errors = [];
66
+ if (raw.length === 0)
67
+ return { rows: [], errors: [{ line: 0, message: 'CSV vazio' }] };
68
+ const header = raw[0].map((h) => h.trim().toLowerCase());
69
+ const colMap = header.map((h) => HEADER_ALIASES[h]);
70
+ if (!colMap.includes('displayName')) {
71
+ return { rows: [], errors: [{ line: 1, message: 'Cabeçalho sem coluna de nome (nome/display_name)' }] };
72
+ }
73
+ const rows = [];
74
+ for (let i = 1; i < raw.length; i++) {
75
+ const cells = raw[i];
76
+ const rec = { line: i + 1, clientType: 'pj' };
77
+ colMap.forEach((key, idx) => {
78
+ if (!key)
79
+ return;
80
+ const value = (cells[idx] ?? '').trim();
81
+ if (key === 'documentNumber')
82
+ rec.documentNumber = value ? onlyDigits(value) : null;
83
+ else if (key === 'clientType')
84
+ rec.clientType = value.toLowerCase() === 'pf' ? 'pf' : 'pj';
85
+ else if (key === 'email')
86
+ rec.email = value || null;
87
+ else if (key === 'phone')
88
+ rec.phone = value || null;
89
+ else if (key === 'displayName')
90
+ rec.displayName = value;
91
+ });
92
+ if (!rec.displayName) {
93
+ errors.push({ line: i + 1, message: 'Nome obrigatório ausente' });
94
+ continue;
95
+ }
96
+ if (rec.documentNumber && ![11, 14].includes(rec.documentNumber.length)) {
97
+ errors.push({ line: i + 1, message: `Documento inválido (${rec.documentNumber.length} dígitos)` });
98
+ continue;
99
+ }
100
+ rows.push({
101
+ line: i + 1,
102
+ displayName: rec.displayName,
103
+ documentNumber: rec.documentNumber ?? null,
104
+ clientType: rec.clientType ?? 'pj',
105
+ email: rec.email ?? null,
106
+ phone: rec.phone ?? null,
107
+ });
108
+ }
109
+ return { rows, errors };
110
+ }
111
+ async function planImport(tx, text) {
112
+ const { rows, errors } = parseClientsCsv(text);
113
+ const toCreate = [];
114
+ const duplicates = [];
115
+ const seen = new Set();
116
+ for (const row of rows) {
117
+ if (row.documentNumber) {
118
+ if (seen.has(row.documentNumber)) {
119
+ duplicates.push({ line: row.line, documentNumber: row.documentNumber });
120
+ continue;
121
+ }
122
+ seen.add(row.documentNumber);
123
+ const existing = await (0, repository_js_1.findClientIdByDocument)(tx, row.documentNumber);
124
+ if (existing) {
125
+ duplicates.push({ line: row.line, documentNumber: row.documentNumber });
126
+ continue;
127
+ }
128
+ }
129
+ toCreate.push(row);
130
+ }
131
+ return { total: rows.length, toCreate, duplicates, errors };
132
+ }
133
+ async function commitImport(tx, text, createdBy) {
134
+ const plan = await planImport(tx, text);
135
+ let created = 0;
136
+ for (const row of plan.toCreate) {
137
+ await (0, repository_js_1.createClient)(tx, {
138
+ displayName: row.displayName,
139
+ clientType: row.clientType,
140
+ documentNumber: row.documentNumber,
141
+ createdBy: createdBy ?? null,
142
+ });
143
+ created++;
144
+ }
145
+ return { created, skipped: plan.duplicates.length, errors: plan.errors };
146
+ }
147
+ //# sourceMappingURL=clients-import.js.map