@baruk/core 0.3.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (708) hide show
  1. package/.baruk-provenance.json +10 -0
  2. package/CHANGELOG.md +97 -0
  3. package/README.md +9 -2
  4. package/dist/auth/password-reset.d.ts +30 -1
  5. package/dist/auth/password-reset.d.ts.map +1 -1
  6. package/dist/auth/password-reset.js +139 -11
  7. package/dist/auth/password-reset.js.map +1 -1
  8. package/dist/auth/service.d.ts +39 -2
  9. package/dist/auth/service.d.ts.map +1 -1
  10. package/dist/auth/service.js +75 -10
  11. package/dist/auth/service.js.map +1 -1
  12. package/dist/billing/ar-repository.d.ts +334 -0
  13. package/dist/billing/ar-repository.d.ts.map +1 -0
  14. package/dist/billing/ar-repository.js +707 -0
  15. package/dist/billing/ar-repository.js.map +1 -0
  16. package/dist/billing/auto-generation.d.ts +87 -0
  17. package/dist/billing/auto-generation.d.ts.map +1 -0
  18. package/dist/billing/auto-generation.js +181 -0
  19. package/dist/billing/auto-generation.js.map +1 -0
  20. package/dist/billing/live-guard.d.ts +64 -0
  21. package/dist/billing/live-guard.d.ts.map +1 -0
  22. package/dist/billing/live-guard.js +68 -0
  23. package/dist/billing/live-guard.js.map +1 -0
  24. package/dist/billing/payment-means-catalog.d.ts +17 -0
  25. package/dist/billing/payment-means-catalog.d.ts.map +1 -0
  26. package/dist/billing/payment-means-catalog.js +21 -0
  27. package/dist/billing/payment-means-catalog.js.map +1 -0
  28. package/dist/billing/payment-means.d.ts +38 -0
  29. package/dist/billing/payment-means.d.ts.map +1 -0
  30. package/dist/billing/payment-means.js +29 -0
  31. package/dist/billing/payment-means.js.map +1 -0
  32. package/dist/billing/payment-rail.d.ts +118 -0
  33. package/dist/billing/payment-rail.d.ts.map +1 -0
  34. package/dist/billing/payment-rail.js +295 -0
  35. package/dist/billing/payment-rail.js.map +1 -0
  36. package/dist/billing/provider/asaas.d.ts +46 -1
  37. package/dist/billing/provider/asaas.d.ts.map +1 -1
  38. package/dist/billing/provider/asaas.js +194 -14
  39. package/dist/billing/provider/asaas.js.map +1 -1
  40. package/dist/billing/provider/manual.js +1 -1
  41. package/dist/billing/provider/manual.js.map +1 -1
  42. package/dist/billing/provider/types.d.ts +115 -8
  43. package/dist/billing/provider/types.d.ts.map +1 -1
  44. package/dist/billing/provider-account.d.ts +89 -0
  45. package/dist/billing/provider-account.d.ts.map +1 -0
  46. package/dist/billing/provider-account.js +161 -0
  47. package/dist/billing/provider-account.js.map +1 -0
  48. package/dist/billing/provider-onboarding.d.ts +67 -0
  49. package/dist/billing/provider-onboarding.d.ts.map +1 -0
  50. package/dist/billing/provider-onboarding.js +234 -0
  51. package/dist/billing/provider-onboarding.js.map +1 -0
  52. package/dist/billing/receivable.d.ts +5 -1
  53. package/dist/billing/receivable.d.ts.map +1 -1
  54. package/dist/billing/reconcile.d.ts +58 -0
  55. package/dist/billing/reconcile.d.ts.map +1 -0
  56. package/dist/billing/reconcile.js +138 -0
  57. package/dist/billing/reconcile.js.map +1 -0
  58. package/dist/billing/repository.d.ts +90 -1
  59. package/dist/billing/repository.d.ts.map +1 -1
  60. package/dist/billing/repository.js +148 -19
  61. package/dist/billing/repository.js.map +1 -1
  62. package/dist/cjs/auth/password-reset.js +141 -11
  63. package/dist/cjs/auth/password-reset.js.map +1 -1
  64. package/dist/cjs/auth/service.js +75 -9
  65. package/dist/cjs/auth/service.js.map +1 -1
  66. package/dist/cjs/billing/ar-repository.js +728 -0
  67. package/dist/cjs/billing/ar-repository.js.map +1 -0
  68. package/dist/cjs/billing/auto-generation.js +186 -0
  69. package/dist/cjs/billing/auto-generation.js.map +1 -0
  70. package/dist/cjs/billing/live-guard.js +72 -0
  71. package/dist/cjs/billing/live-guard.js.map +1 -0
  72. package/dist/cjs/billing/payment-means-catalog.js +25 -0
  73. package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
  74. package/dist/cjs/billing/payment-means.js +33 -0
  75. package/dist/cjs/billing/payment-means.js.map +1 -0
  76. package/dist/cjs/billing/payment-rail.js +301 -0
  77. package/dist/cjs/billing/payment-rail.js.map +1 -0
  78. package/dist/cjs/billing/provider/asaas.js +194 -14
  79. package/dist/cjs/billing/provider/asaas.js.map +1 -1
  80. package/dist/cjs/billing/provider/manual.js +1 -1
  81. package/dist/cjs/billing/provider/manual.js.map +1 -1
  82. package/dist/cjs/billing/provider-account.js +170 -0
  83. package/dist/cjs/billing/provider-account.js.map +1 -0
  84. package/dist/cjs/billing/provider-onboarding.js +239 -0
  85. package/dist/cjs/billing/provider-onboarding.js.map +1 -0
  86. package/dist/cjs/billing/reconcile.js +143 -0
  87. package/dist/cjs/billing/reconcile.js.map +1 -0
  88. package/dist/cjs/billing/repository.js +150 -18
  89. package/dist/cjs/billing/repository.js.map +1 -1
  90. package/dist/cjs/clients/repository.js +96 -20
  91. package/dist/cjs/clients/repository.js.map +1 -1
  92. package/dist/cjs/collection/branding.js +140 -0
  93. package/dist/cjs/collection/branding.js.map +1 -0
  94. package/dist/cjs/collection/channel-accounts.js +137 -0
  95. package/dist/cjs/collection/channel-accounts.js.map +1 -0
  96. package/dist/cjs/collection/channel.js +17 -0
  97. package/dist/cjs/collection/channel.js.map +1 -0
  98. package/dist/cjs/collection/communication-bridge.js +140 -0
  99. package/dist/cjs/collection/communication-bridge.js.map +1 -0
  100. package/dist/cjs/collection/communication-runtime.js +193 -0
  101. package/dist/cjs/collection/communication-runtime.js.map +1 -0
  102. package/dist/cjs/collection/consent-repository.js +84 -0
  103. package/dist/cjs/collection/consent-repository.js.map +1 -0
  104. package/dist/cjs/collection/copy.js +125 -0
  105. package/dist/cjs/collection/copy.js.map +1 -0
  106. package/dist/cjs/collection/delivery-callback.js +151 -0
  107. package/dist/cjs/collection/delivery-callback.js.map +1 -0
  108. package/dist/cjs/collection/email-layout.js +252 -0
  109. package/dist/cjs/collection/email-layout.js.map +1 -0
  110. package/dist/cjs/collection/engine.js +414 -0
  111. package/dist/cjs/collection/engine.js.map +1 -0
  112. package/dist/cjs/collection/format.js +76 -0
  113. package/dist/cjs/collection/format.js.map +1 -0
  114. package/dist/cjs/collection/payment-block.js +3 -0
  115. package/dist/cjs/collection/payment-block.js.map +1 -0
  116. package/dist/cjs/collection/policy.js +147 -0
  117. package/dist/cjs/collection/policy.js.map +1 -0
  118. package/dist/cjs/collection/repository.js +260 -0
  119. package/dist/cjs/collection/repository.js.map +1 -0
  120. package/dist/cjs/collection/subject.js +104 -0
  121. package/dist/cjs/collection/subject.js.map +1 -0
  122. package/dist/cjs/collection/template-catalog.js +165 -0
  123. package/dist/cjs/collection/template-catalog.js.map +1 -0
  124. package/dist/cjs/collection/template.js +78 -0
  125. package/dist/cjs/collection/template.js.map +1 -0
  126. package/dist/cjs/communication/adapters/email.js +132 -0
  127. package/dist/cjs/communication/adapters/email.js.map +1 -0
  128. package/dist/cjs/communication/adapters/sms.js +127 -0
  129. package/dist/cjs/communication/adapters/sms.js.map +1 -0
  130. package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
  131. package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
  132. package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
  133. package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
  134. package/dist/cjs/communication/adapters/whatsapp.js +213 -0
  135. package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
  136. package/dist/cjs/communication/audit.js +61 -0
  137. package/dist/cjs/communication/audit.js.map +1 -0
  138. package/dist/cjs/communication/capabilities.js +76 -0
  139. package/dist/cjs/communication/capabilities.js.map +1 -0
  140. package/dist/cjs/communication/channel.js +53 -0
  141. package/dist/cjs/communication/channel.js.map +1 -0
  142. package/dist/cjs/communication/claim.js +228 -0
  143. package/dist/cjs/communication/claim.js.map +1 -0
  144. package/dist/cjs/communication/consent.js +43 -0
  145. package/dist/cjs/communication/consent.js.map +1 -0
  146. package/dist/cjs/communication/context.js +45 -0
  147. package/dist/cjs/communication/context.js.map +1 -0
  148. package/dist/cjs/communication/credentials.js +121 -0
  149. package/dist/cjs/communication/credentials.js.map +1 -0
  150. package/dist/cjs/communication/dry-run-scenario.js +161 -0
  151. package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
  152. package/dist/cjs/communication/dry-run.js +97 -0
  153. package/dist/cjs/communication/dry-run.js.map +1 -0
  154. package/dist/cjs/communication/engine.js +483 -0
  155. package/dist/cjs/communication/engine.js.map +1 -0
  156. package/dist/cjs/communication/graph.js +50 -0
  157. package/dist/cjs/communication/graph.js.map +1 -0
  158. package/dist/cjs/communication/idempotency.js +26 -0
  159. package/dist/cjs/communication/idempotency.js.map +1 -0
  160. package/dist/cjs/communication/identity.js +110 -0
  161. package/dist/cjs/communication/identity.js.map +1 -0
  162. package/dist/cjs/communication/index.js +135 -0
  163. package/dist/cjs/communication/index.js.map +1 -0
  164. package/dist/cjs/communication/onboarding.js +297 -0
  165. package/dist/cjs/communication/onboarding.js.map +1 -0
  166. package/dist/cjs/communication/policy.js +16 -0
  167. package/dist/cjs/communication/policy.js.map +1 -0
  168. package/dist/cjs/communication/routing.js +77 -0
  169. package/dist/cjs/communication/routing.js.map +1 -0
  170. package/dist/cjs/communication/sender-profile.js +128 -0
  171. package/dist/cjs/communication/sender-profile.js.map +1 -0
  172. package/dist/cjs/communication/status.js +86 -0
  173. package/dist/cjs/communication/status.js.map +1 -0
  174. package/dist/cjs/communication/stores/onboarding.js +135 -0
  175. package/dist/cjs/communication/stores/onboarding.js.map +1 -0
  176. package/dist/cjs/communication/stores/postgres.js +458 -0
  177. package/dist/cjs/communication/stores/postgres.js.map +1 -0
  178. package/dist/cjs/communication/stores/routing.js +334 -0
  179. package/dist/cjs/communication/stores/routing.js.map +1 -0
  180. package/dist/cjs/communication/stores/secrets.js +126 -0
  181. package/dist/cjs/communication/stores/secrets.js.map +1 -0
  182. package/dist/cjs/communication/template-provider.js +22 -0
  183. package/dist/cjs/communication/template-provider.js.map +1 -0
  184. package/dist/cjs/communication/template.js +63 -0
  185. package/dist/cjs/communication/template.js.map +1 -0
  186. package/dist/cjs/communication/webhook-subscription.js +258 -0
  187. package/dist/cjs/communication/webhook-subscription.js.map +1 -0
  188. package/dist/cjs/communication/webhook.js +292 -0
  189. package/dist/cjs/communication/webhook.js.map +1 -0
  190. package/dist/cjs/competence/repository.js +309 -0
  191. package/dist/cjs/competence/repository.js.map +1 -0
  192. package/dist/cjs/contacts/phone.js +192 -0
  193. package/dist/cjs/contacts/phone.js.map +1 -0
  194. package/dist/cjs/db/seed-catalog.js +48 -0
  195. package/dist/cjs/db/seed-catalog.js.map +1 -0
  196. package/dist/cjs/db/seed.js +15 -7
  197. package/dist/cjs/db/seed.js.map +1 -1
  198. package/dist/cjs/documents/repository.js +244 -0
  199. package/dist/cjs/documents/repository.js.map +1 -0
  200. package/dist/cjs/documents/requests.js +136 -0
  201. package/dist/cjs/documents/requests.js.map +1 -0
  202. package/dist/cjs/index.js +427 -48
  203. package/dist/cjs/index.js.map +1 -1
  204. package/dist/cjs/legal/company.js +36 -0
  205. package/dist/cjs/legal/company.js.map +1 -0
  206. package/dist/cjs/legal/documents.js +671 -0
  207. package/dist/cjs/legal/documents.js.map +1 -0
  208. package/dist/cjs/legal/index.js +15 -0
  209. package/dist/cjs/legal/index.js.map +1 -0
  210. package/dist/cjs/legal/types.js +34 -0
  211. package/dist/cjs/legal/types.js.map +1 -0
  212. package/dist/cjs/mail/auth-templates.js +29 -0
  213. package/dist/cjs/mail/auth-templates.js.map +1 -0
  214. package/dist/cjs/mail/dedup-store.js +12 -51
  215. package/dist/cjs/mail/dedup-store.js.map +1 -1
  216. package/dist/cjs/mail/index.js +16 -4
  217. package/dist/cjs/mail/index.js.map +1 -1
  218. package/dist/cjs/mail/provider.js +12 -247
  219. package/dist/cjs/mail/provider.js.map +1 -1
  220. package/dist/cjs/mail/resend.js +14 -18
  221. package/dist/cjs/mail/resend.js.map +1 -1
  222. package/dist/cjs/mail/sender-resolver.js +12 -11
  223. package/dist/cjs/mail/sender-resolver.js.map +1 -1
  224. package/dist/cjs/mail/template-renderer.js +11 -16
  225. package/dist/cjs/mail/template-renderer.js.map +1 -1
  226. package/dist/cjs/mail/transactional-outbound.js +117 -0
  227. package/dist/cjs/mail/transactional-outbound.js.map +1 -0
  228. package/dist/cjs/mail/types.js +8 -35
  229. package/dist/cjs/mail/types.js.map +1 -1
  230. package/dist/cjs/portal/provisioning.js +144 -0
  231. package/dist/cjs/portal/provisioning.js.map +1 -0
  232. package/dist/cjs/pricing-engine/canonical.js +42 -0
  233. package/dist/cjs/pricing-engine/canonical.js.map +1 -0
  234. package/dist/cjs/pricing-engine/errors.js +6 -1
  235. package/dist/cjs/pricing-engine/errors.js.map +1 -1
  236. package/dist/cjs/pricing-engine/index.js +12 -1
  237. package/dist/cjs/pricing-engine/index.js.map +1 -1
  238. package/dist/cjs/pricing-engine/pipeline.js +200 -26
  239. package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
  240. package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
  241. package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
  242. package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
  243. package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
  244. package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
  245. package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
  246. package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
  247. package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
  248. package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
  249. package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
  250. package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
  251. package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
  252. package/dist/cjs/rbac/authorize.js +28 -0
  253. package/dist/cjs/rbac/authorize.js.map +1 -1
  254. package/dist/cjs/rbac/catalog.js +67 -1
  255. package/dist/cjs/rbac/catalog.js.map +1 -1
  256. package/dist/cjs/rbac/workload-provisioning.js +160 -0
  257. package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
  258. package/dist/cjs/rbac/workload.js +191 -0
  259. package/dist/cjs/rbac/workload.js.map +1 -0
  260. package/dist/cjs/storage/checksum.js +15 -0
  261. package/dist/cjs/storage/checksum.js.map +1 -0
  262. package/dist/cjs/storage/key.js +72 -0
  263. package/dist/cjs/storage/key.js.map +1 -0
  264. package/dist/cjs/storage/local.js +100 -0
  265. package/dist/cjs/storage/local.js.map +1 -0
  266. package/dist/cjs/storage/r2.js +181 -0
  267. package/dist/cjs/storage/r2.js.map +1 -0
  268. package/dist/cjs/storage/registry.js +41 -0
  269. package/dist/cjs/storage/registry.js.map +1 -0
  270. package/dist/cjs/storage/types.js +50 -0
  271. package/dist/cjs/storage/types.js.map +1 -0
  272. package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
  273. package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
  274. package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
  275. package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
  276. package/dist/cjs/subscription-billing/provider/registry.js +17 -0
  277. package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
  278. package/dist/cjs/subscription-billing/service.js +57 -8
  279. package/dist/cjs/subscription-billing/service.js.map +1 -1
  280. package/dist/cjs/subscription-billing/types.js.map +1 -1
  281. package/dist/cjs/tenancy/provisioning.js +32 -8
  282. package/dist/cjs/tenancy/provisioning.js.map +1 -1
  283. package/dist/cjs/users/repository.js +119 -2
  284. package/dist/cjs/users/repository.js.map +1 -1
  285. package/dist/cjs/vault/repository.js +81 -0
  286. package/dist/cjs/vault/repository.js.map +1 -1
  287. package/dist/clients/repository.d.ts +42 -0
  288. package/dist/clients/repository.d.ts.map +1 -1
  289. package/dist/clients/repository.js +94 -21
  290. package/dist/clients/repository.js.map +1 -1
  291. package/dist/collection/branding.d.ts +72 -0
  292. package/dist/collection/branding.d.ts.map +1 -0
  293. package/dist/collection/branding.js +136 -0
  294. package/dist/collection/branding.js.map +1 -0
  295. package/dist/collection/channel-accounts.d.ts +57 -0
  296. package/dist/collection/channel-accounts.d.ts.map +1 -0
  297. package/dist/collection/channel-accounts.js +133 -0
  298. package/dist/collection/channel-accounts.js.map +1 -0
  299. package/dist/collection/channel.d.ts +24 -0
  300. package/dist/collection/channel.d.ts.map +1 -0
  301. package/dist/collection/channel.js +16 -0
  302. package/dist/collection/channel.js.map +1 -0
  303. package/dist/collection/communication-bridge.d.ts +66 -0
  304. package/dist/collection/communication-bridge.d.ts.map +1 -0
  305. package/dist/collection/communication-bridge.js +134 -0
  306. package/dist/collection/communication-bridge.js.map +1 -0
  307. package/dist/collection/communication-runtime.d.ts +95 -0
  308. package/dist/collection/communication-runtime.d.ts.map +1 -0
  309. package/dist/collection/communication-runtime.js +187 -0
  310. package/dist/collection/communication-runtime.js.map +1 -0
  311. package/dist/collection/consent-repository.d.ts +32 -0
  312. package/dist/collection/consent-repository.d.ts.map +1 -0
  313. package/dist/collection/consent-repository.js +79 -0
  314. package/dist/collection/consent-repository.js.map +1 -0
  315. package/dist/collection/copy.d.ts +50 -0
  316. package/dist/collection/copy.d.ts.map +1 -0
  317. package/dist/collection/copy.js +122 -0
  318. package/dist/collection/copy.js.map +1 -0
  319. package/dist/collection/delivery-callback.d.ts +49 -0
  320. package/dist/collection/delivery-callback.d.ts.map +1 -0
  321. package/dist/collection/delivery-callback.js +147 -0
  322. package/dist/collection/delivery-callback.js.map +1 -0
  323. package/dist/collection/email-layout.d.ts +45 -0
  324. package/dist/collection/email-layout.d.ts.map +1 -0
  325. package/dist/collection/email-layout.js +247 -0
  326. package/dist/collection/email-layout.js.map +1 -0
  327. package/dist/collection/engine.d.ts +177 -0
  328. package/dist/collection/engine.d.ts.map +1 -0
  329. package/dist/collection/engine.js +407 -0
  330. package/dist/collection/engine.js.map +1 -0
  331. package/dist/collection/format.d.ts +32 -0
  332. package/dist/collection/format.d.ts.map +1 -0
  333. package/dist/collection/format.js +70 -0
  334. package/dist/collection/format.js.map +1 -0
  335. package/dist/collection/payment-block.d.ts +24 -0
  336. package/dist/collection/payment-block.d.ts.map +1 -0
  337. package/dist/collection/payment-block.js +2 -0
  338. package/dist/collection/payment-block.js.map +1 -0
  339. package/dist/collection/policy.d.ts +53 -0
  340. package/dist/collection/policy.d.ts.map +1 -0
  341. package/dist/collection/policy.js +141 -0
  342. package/dist/collection/policy.js.map +1 -0
  343. package/dist/collection/repository.d.ts +129 -0
  344. package/dist/collection/repository.d.ts.map +1 -0
  345. package/dist/collection/repository.js +246 -0
  346. package/dist/collection/repository.js.map +1 -0
  347. package/dist/collection/subject.d.ts +66 -0
  348. package/dist/collection/subject.d.ts.map +1 -0
  349. package/dist/collection/subject.js +99 -0
  350. package/dist/collection/subject.js.map +1 -0
  351. package/dist/collection/template-catalog.d.ts +16 -0
  352. package/dist/collection/template-catalog.d.ts.map +1 -0
  353. package/dist/collection/template-catalog.js +162 -0
  354. package/dist/collection/template-catalog.js.map +1 -0
  355. package/dist/collection/template.d.ts +37 -0
  356. package/dist/collection/template.d.ts.map +1 -0
  357. package/dist/collection/template.js +73 -0
  358. package/dist/collection/template.js.map +1 -0
  359. package/dist/communication/adapters/email.d.ts +28 -0
  360. package/dist/communication/adapters/email.d.ts.map +1 -0
  361. package/dist/communication/adapters/email.js +129 -0
  362. package/dist/communication/adapters/email.js.map +1 -0
  363. package/dist/communication/adapters/sms.d.ts +95 -0
  364. package/dist/communication/adapters/sms.d.ts.map +1 -0
  365. package/dist/communication/adapters/sms.js +121 -0
  366. package/dist/communication/adapters/sms.js.map +1 -0
  367. package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
  368. package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
  369. package/dist/communication/adapters/whatsapp-language.js +36 -0
  370. package/dist/communication/adapters/whatsapp-language.js.map +1 -0
  371. package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
  372. package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
  373. package/dist/communication/adapters/whatsapp-templates.js +97 -0
  374. package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
  375. package/dist/communication/adapters/whatsapp.d.ts +29 -0
  376. package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
  377. package/dist/communication/adapters/whatsapp.js +210 -0
  378. package/dist/communication/adapters/whatsapp.js.map +1 -0
  379. package/dist/communication/audit.d.ts +105 -0
  380. package/dist/communication/audit.d.ts.map +1 -0
  381. package/dist/communication/audit.js +56 -0
  382. package/dist/communication/audit.js.map +1 -0
  383. package/dist/communication/capabilities.d.ts +88 -0
  384. package/dist/communication/capabilities.d.ts.map +1 -0
  385. package/dist/communication/capabilities.js +72 -0
  386. package/dist/communication/capabilities.js.map +1 -0
  387. package/dist/communication/channel.d.ts +125 -0
  388. package/dist/communication/channel.d.ts.map +1 -0
  389. package/dist/communication/channel.js +47 -0
  390. package/dist/communication/channel.js.map +1 -0
  391. package/dist/communication/claim.d.ts +368 -0
  392. package/dist/communication/claim.d.ts.map +1 -0
  393. package/dist/communication/claim.js +224 -0
  394. package/dist/communication/claim.js.map +1 -0
  395. package/dist/communication/consent.d.ts +65 -0
  396. package/dist/communication/consent.d.ts.map +1 -0
  397. package/dist/communication/consent.js +40 -0
  398. package/dist/communication/consent.js.map +1 -0
  399. package/dist/communication/context.d.ts +48 -0
  400. package/dist/communication/context.d.ts.map +1 -0
  401. package/dist/communication/context.js +41 -0
  402. package/dist/communication/context.js.map +1 -0
  403. package/dist/communication/credentials.d.ts +74 -0
  404. package/dist/communication/credentials.d.ts.map +1 -0
  405. package/dist/communication/credentials.js +115 -0
  406. package/dist/communication/credentials.js.map +1 -0
  407. package/dist/communication/dry-run-scenario.d.ts +37 -0
  408. package/dist/communication/dry-run-scenario.d.ts.map +1 -0
  409. package/dist/communication/dry-run-scenario.js +158 -0
  410. package/dist/communication/dry-run-scenario.js.map +1 -0
  411. package/dist/communication/dry-run.d.ts +40 -0
  412. package/dist/communication/dry-run.d.ts.map +1 -0
  413. package/dist/communication/dry-run.js +92 -0
  414. package/dist/communication/dry-run.js.map +1 -0
  415. package/dist/communication/engine.d.ts +153 -0
  416. package/dist/communication/engine.d.ts.map +1 -0
  417. package/dist/communication/engine.js +480 -0
  418. package/dist/communication/engine.js.map +1 -0
  419. package/dist/communication/graph.d.ts +38 -0
  420. package/dist/communication/graph.d.ts.map +1 -0
  421. package/dist/communication/graph.js +45 -0
  422. package/dist/communication/graph.js.map +1 -0
  423. package/dist/communication/idempotency.d.ts +33 -0
  424. package/dist/communication/idempotency.d.ts.map +1 -0
  425. package/dist/communication/idempotency.js +23 -0
  426. package/dist/communication/idempotency.js.map +1 -0
  427. package/dist/communication/identity.d.ts +127 -0
  428. package/dist/communication/identity.d.ts.map +1 -0
  429. package/dist/communication/identity.js +105 -0
  430. package/dist/communication/identity.js.map +1 -0
  431. package/dist/communication/index.d.ts +66 -0
  432. package/dist/communication/index.d.ts.map +1 -0
  433. package/dist/communication/index.js +42 -0
  434. package/dist/communication/index.js.map +1 -0
  435. package/dist/communication/onboarding.d.ts +223 -0
  436. package/dist/communication/onboarding.d.ts.map +1 -0
  437. package/dist/communication/onboarding.js +287 -0
  438. package/dist/communication/onboarding.js.map +1 -0
  439. package/dist/communication/policy.d.ts +99 -0
  440. package/dist/communication/policy.d.ts.map +1 -0
  441. package/dist/communication/policy.js +13 -0
  442. package/dist/communication/policy.js.map +1 -0
  443. package/dist/communication/routing.d.ts +99 -0
  444. package/dist/communication/routing.d.ts.map +1 -0
  445. package/dist/communication/routing.js +73 -0
  446. package/dist/communication/routing.js.map +1 -0
  447. package/dist/communication/sender-profile.d.ts +100 -0
  448. package/dist/communication/sender-profile.d.ts.map +1 -0
  449. package/dist/communication/sender-profile.js +123 -0
  450. package/dist/communication/sender-profile.js.map +1 -0
  451. package/dist/communication/status.d.ts +48 -0
  452. package/dist/communication/status.d.ts.map +1 -0
  453. package/dist/communication/status.js +79 -0
  454. package/dist/communication/status.js.map +1 -0
  455. package/dist/communication/stores/onboarding.d.ts +88 -0
  456. package/dist/communication/stores/onboarding.d.ts.map +1 -0
  457. package/dist/communication/stores/onboarding.js +127 -0
  458. package/dist/communication/stores/onboarding.js.map +1 -0
  459. package/dist/communication/stores/postgres.d.ts +81 -0
  460. package/dist/communication/stores/postgres.d.ts.map +1 -0
  461. package/dist/communication/stores/postgres.js +453 -0
  462. package/dist/communication/stores/postgres.js.map +1 -0
  463. package/dist/communication/stores/routing.d.ts +169 -0
  464. package/dist/communication/stores/routing.d.ts.map +1 -0
  465. package/dist/communication/stores/routing.js +324 -0
  466. package/dist/communication/stores/routing.js.map +1 -0
  467. package/dist/communication/stores/secrets.d.ts +89 -0
  468. package/dist/communication/stores/secrets.d.ts.map +1 -0
  469. package/dist/communication/stores/secrets.js +122 -0
  470. package/dist/communication/stores/secrets.js.map +1 -0
  471. package/dist/communication/template-provider.d.ts +85 -0
  472. package/dist/communication/template-provider.d.ts.map +1 -0
  473. package/dist/communication/template-provider.js +21 -0
  474. package/dist/communication/template-provider.js.map +1 -0
  475. package/dist/communication/template.d.ts +87 -0
  476. package/dist/communication/template.d.ts.map +1 -0
  477. package/dist/communication/template.js +59 -0
  478. package/dist/communication/template.js.map +1 -0
  479. package/dist/communication/webhook-subscription.d.ts +156 -0
  480. package/dist/communication/webhook-subscription.d.ts.map +1 -0
  481. package/dist/communication/webhook-subscription.js +252 -0
  482. package/dist/communication/webhook-subscription.js.map +1 -0
  483. package/dist/communication/webhook.d.ts +121 -0
  484. package/dist/communication/webhook.d.ts.map +1 -0
  485. package/dist/communication/webhook.js +283 -0
  486. package/dist/communication/webhook.js.map +1 -0
  487. package/dist/competence/repository.d.ts +147 -0
  488. package/dist/competence/repository.d.ts.map +1 -0
  489. package/dist/competence/repository.js +294 -0
  490. package/dist/competence/repository.js.map +1 -0
  491. package/dist/contacts/phone.d.ts +70 -0
  492. package/dist/contacts/phone.d.ts.map +1 -0
  493. package/dist/contacts/phone.js +186 -0
  494. package/dist/contacts/phone.js.map +1 -0
  495. package/dist/db/migrate.js +17 -11
  496. package/dist/db/migrate.js.map +1 -1
  497. package/dist/db/seed-catalog.d.ts +18 -0
  498. package/dist/db/seed-catalog.d.ts.map +1 -0
  499. package/dist/db/seed-catalog.js +45 -0
  500. package/dist/db/seed-catalog.js.map +1 -0
  501. package/dist/db/seed.js +16 -8
  502. package/dist/db/seed.js.map +1 -1
  503. package/dist/documents/repository.d.ts +97 -0
  504. package/dist/documents/repository.d.ts.map +1 -0
  505. package/dist/documents/repository.js +236 -0
  506. package/dist/documents/repository.js.map +1 -0
  507. package/dist/documents/requests.d.ts +73 -0
  508. package/dist/documents/requests.d.ts.map +1 -0
  509. package/dist/documents/requests.js +127 -0
  510. package/dist/documents/requests.js.map +1 -0
  511. package/dist/index.d.ts +113 -13
  512. package/dist/index.d.ts.map +1 -1
  513. package/dist/index.js +104 -8
  514. package/dist/index.js.map +1 -1
  515. package/dist/legal/company.d.ts +32 -0
  516. package/dist/legal/company.d.ts.map +1 -0
  517. package/dist/legal/company.js +33 -0
  518. package/dist/legal/company.js.map +1 -0
  519. package/dist/legal/documents.d.ts +30 -0
  520. package/dist/legal/documents.d.ts.map +1 -0
  521. package/dist/legal/documents.js +666 -0
  522. package/dist/legal/documents.js.map +1 -0
  523. package/dist/legal/index.d.ts +5 -0
  524. package/dist/legal/index.d.ts.map +1 -0
  525. package/dist/legal/index.js +4 -0
  526. package/dist/legal/index.js.map +1 -0
  527. package/dist/legal/types.d.ts +145 -0
  528. package/dist/legal/types.d.ts.map +1 -0
  529. package/dist/legal/types.js +31 -0
  530. package/dist/legal/types.js.map +1 -0
  531. package/dist/mail/auth-templates.d.ts +15 -0
  532. package/dist/mail/auth-templates.d.ts.map +1 -0
  533. package/dist/mail/auth-templates.js +26 -0
  534. package/dist/mail/auth-templates.js.map +1 -0
  535. package/dist/mail/dedup-store.d.ts +1 -24
  536. package/dist/mail/dedup-store.d.ts.map +1 -1
  537. package/dist/mail/dedup-store.js +9 -48
  538. package/dist/mail/dedup-store.js.map +1 -1
  539. package/dist/mail/index.d.ts +2 -1
  540. package/dist/mail/index.d.ts.map +1 -1
  541. package/dist/mail/index.js +13 -2
  542. package/dist/mail/index.js.map +1 -1
  543. package/dist/mail/provider.d.ts +2 -30
  544. package/dist/mail/provider.d.ts.map +1 -1
  545. package/dist/mail/provider.js +10 -246
  546. package/dist/mail/provider.js.map +1 -1
  547. package/dist/mail/resend.d.ts +2 -12
  548. package/dist/mail/resend.d.ts.map +1 -1
  549. package/dist/mail/resend.js +11 -17
  550. package/dist/mail/resend.js.map +1 -1
  551. package/dist/mail/sender-resolver.d.ts +1 -7
  552. package/dist/mail/sender-resolver.d.ts.map +1 -1
  553. package/dist/mail/sender-resolver.js +11 -10
  554. package/dist/mail/sender-resolver.js.map +1 -1
  555. package/dist/mail/template-renderer.d.ts +1 -9
  556. package/dist/mail/template-renderer.d.ts.map +1 -1
  557. package/dist/mail/template-renderer.js +10 -15
  558. package/dist/mail/template-renderer.js.map +1 -1
  559. package/dist/mail/transactional-outbound.d.ts +115 -0
  560. package/dist/mail/transactional-outbound.d.ts.map +1 -0
  561. package/dist/mail/transactional-outbound.js +113 -0
  562. package/dist/mail/transactional-outbound.js.map +1 -0
  563. package/dist/mail/types.d.ts +2 -142
  564. package/dist/mail/types.d.ts.map +1 -1
  565. package/dist/mail/types.js +1 -33
  566. package/dist/mail/types.js.map +1 -1
  567. package/dist/portal/provisioning.d.ts +58 -0
  568. package/dist/portal/provisioning.d.ts.map +1 -0
  569. package/dist/portal/provisioning.js +139 -0
  570. package/dist/portal/provisioning.js.map +1 -0
  571. package/dist/pricing-engine/canonical.d.ts +14 -0
  572. package/dist/pricing-engine/canonical.d.ts.map +1 -0
  573. package/dist/pricing-engine/canonical.js +39 -0
  574. package/dist/pricing-engine/canonical.js.map +1 -0
  575. package/dist/pricing-engine/errors.d.ts.map +1 -1
  576. package/dist/pricing-engine/errors.js +6 -1
  577. package/dist/pricing-engine/errors.js.map +1 -1
  578. package/dist/pricing-engine/index.d.ts +12 -2
  579. package/dist/pricing-engine/index.d.ts.map +1 -1
  580. package/dist/pricing-engine/index.js +6 -1
  581. package/dist/pricing-engine/index.js.map +1 -1
  582. package/dist/pricing-engine/pipeline.d.ts.map +1 -1
  583. package/dist/pricing-engine/pipeline.js +202 -28
  584. package/dist/pricing-engine/pipeline.js.map +1 -1
  585. package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
  586. package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
  587. package/dist/pricing-engine/shadow-adapter.js +75 -0
  588. package/dist/pricing-engine/shadow-adapter.js.map +1 -0
  589. package/dist/pricing-engine/shadow-diff.d.ts +26 -0
  590. package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
  591. package/dist/pricing-engine/shadow-diff.js +52 -0
  592. package/dist/pricing-engine/shadow-diff.js.map +1 -0
  593. package/dist/pricing-engine/shadow-facade.d.ts +42 -0
  594. package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
  595. package/dist/pricing-engine/shadow-facade.js +82 -0
  596. package/dist/pricing-engine/shadow-facade.js.map +1 -0
  597. package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
  598. package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
  599. package/dist/pricing-engine/shadow-legacy-types.js +18 -0
  600. package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
  601. package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
  602. package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
  603. package/dist/pricing-engine/shadow-metrics.js +31 -0
  604. package/dist/pricing-engine/shadow-metrics.js.map +1 -0
  605. package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
  606. package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
  607. package/dist/pricing-engine/shadow-normalizer.js +39 -0
  608. package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
  609. package/dist/pricing-engine/types.d.ts +2 -0
  610. package/dist/pricing-engine/types.d.ts.map +1 -1
  611. package/dist/rbac/authorize.d.ts +12 -0
  612. package/dist/rbac/authorize.d.ts.map +1 -1
  613. package/dist/rbac/authorize.js +27 -0
  614. package/dist/rbac/authorize.js.map +1 -1
  615. package/dist/rbac/catalog.d.ts.map +1 -1
  616. package/dist/rbac/catalog.js +67 -1
  617. package/dist/rbac/catalog.js.map +1 -1
  618. package/dist/rbac/workload-provisioning.d.ts +66 -0
  619. package/dist/rbac/workload-provisioning.d.ts.map +1 -0
  620. package/dist/rbac/workload-provisioning.js +153 -0
  621. package/dist/rbac/workload-provisioning.js.map +1 -0
  622. package/dist/rbac/workload.d.ts +124 -0
  623. package/dist/rbac/workload.d.ts.map +1 -0
  624. package/dist/rbac/workload.js +184 -0
  625. package/dist/rbac/workload.js.map +1 -0
  626. package/dist/storage/checksum.d.ts +9 -0
  627. package/dist/storage/checksum.d.ts.map +1 -0
  628. package/dist/storage/checksum.js +12 -0
  629. package/dist/storage/checksum.js.map +1 -0
  630. package/dist/storage/key.d.ts +37 -0
  631. package/dist/storage/key.d.ts.map +1 -0
  632. package/dist/storage/key.js +67 -0
  633. package/dist/storage/key.js.map +1 -0
  634. package/dist/storage/local.d.ts +40 -0
  635. package/dist/storage/local.d.ts.map +1 -0
  636. package/dist/storage/local.js +96 -0
  637. package/dist/storage/local.js.map +1 -0
  638. package/dist/storage/r2.d.ts +43 -0
  639. package/dist/storage/r2.d.ts.map +1 -0
  640. package/dist/storage/r2.js +177 -0
  641. package/dist/storage/r2.js.map +1 -0
  642. package/dist/storage/registry.d.ts +23 -0
  643. package/dist/storage/registry.d.ts.map +1 -0
  644. package/dist/storage/registry.js +37 -0
  645. package/dist/storage/registry.js.map +1 -0
  646. package/dist/storage/types.d.ts +67 -0
  647. package/dist/storage/types.d.ts.map +1 -0
  648. package/dist/storage/types.js +45 -0
  649. package/dist/storage/types.js.map +1 -0
  650. package/dist/subscription-billing/provider/asaas.d.ts +14 -0
  651. package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
  652. package/dist/subscription-billing/provider/asaas.js +32 -7
  653. package/dist/subscription-billing/provider/asaas.js.map +1 -1
  654. package/dist/subscription-billing/provider/disabled.d.ts +9 -0
  655. package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
  656. package/dist/subscription-billing/provider/disabled.js +8 -0
  657. package/dist/subscription-billing/provider/disabled.js.map +1 -1
  658. package/dist/subscription-billing/provider/registry.d.ts +10 -0
  659. package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
  660. package/dist/subscription-billing/provider/registry.js +17 -0
  661. package/dist/subscription-billing/provider/registry.js.map +1 -1
  662. package/dist/subscription-billing/service.d.ts +17 -1
  663. package/dist/subscription-billing/service.d.ts.map +1 -1
  664. package/dist/subscription-billing/service.js +57 -8
  665. package/dist/subscription-billing/service.js.map +1 -1
  666. package/dist/subscription-billing/types.d.ts +13 -0
  667. package/dist/subscription-billing/types.d.ts.map +1 -1
  668. package/dist/subscription-billing/types.js.map +1 -1
  669. package/dist/tenancy/provisioning.d.ts.map +1 -1
  670. package/dist/tenancy/provisioning.js +32 -8
  671. package/dist/tenancy/provisioning.js.map +1 -1
  672. package/dist/users/repository.d.ts +38 -0
  673. package/dist/users/repository.d.ts.map +1 -1
  674. package/dist/users/repository.js +118 -3
  675. package/dist/users/repository.js.map +1 -1
  676. package/dist/vault/repository.d.ts +67 -0
  677. package/dist/vault/repository.d.ts.map +1 -1
  678. package/dist/vault/repository.js +78 -0
  679. package/dist/vault/repository.js.map +1 -1
  680. package/package.json +19 -4
  681. package/src/db/migrations/0023_user_invite_activation.sql +15 -0
  682. package/src/db/migrations/0024_set_user_password_function.sql +32 -0
  683. package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
  684. package/src/db/migrations/0026_documents_and_competence.sql +353 -0
  685. package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
  686. package/src/db/migrations/0028_collection_engine.sql +94 -0
  687. package/src/db/migrations/0029_payment_rail.sql +107 -0
  688. package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
  689. package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
  690. package/src/db/migrations/0032_settlement_reversal.sql +76 -0
  691. package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
  692. package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
  693. package/src/db/migrations/0035_payment_account_environments.sql +61 -0
  694. package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
  695. package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
  696. package/src/db/migrations/0038_notification_channels.sql +175 -0
  697. package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
  698. package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
  699. package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
  700. package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
  701. package/src/db/migrations/0043_workload_identity.sql +105 -0
  702. package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
  703. package/dist/cjs/mail/resend-client.js +0 -103
  704. package/dist/cjs/mail/resend-client.js.map +0 -1
  705. package/dist/mail/resend-client.d.ts +0 -16
  706. package/dist/mail/resend-client.d.ts.map +0 -1
  707. package/dist/mail/resend-client.js +0 -100
  708. package/dist/mail/resend-client.js.map +0 -1
@@ -3,7 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.listTenantMembers = listTenantMembers;
4
4
  exports.setUserRole = setUserRole;
5
5
  exports.setMembershipStatus = setMembershipStatus;
6
+ exports.inviteUser = inviteUser;
7
+ exports.reissueStaffActivation = reissueStaffActivation;
6
8
  const shared_1 = require("@baruk/shared");
9
+ const password_reset_js_1 = require("../auth/password-reset.js");
10
+ const audit_js_1 = require("../audit/audit.js");
7
11
  const ADMIN_ROLE_KEYS = ['owner', 'admin'];
8
12
  async function listTenantMembers(tx) {
9
13
  const rows = await tx `
@@ -43,7 +47,9 @@ async function countActiveAdmins(tx, excludeUserId) {
43
47
  async function setUserRole(tx, userId, roleKey) {
44
48
  // Guard: não permitir rebaixar o último admin.
45
49
  const isAdminTarget = ADMIN_ROLE_KEYS.includes(roleKey);
46
- if (!isAdminTarget && (await isUserAdmin(tx, userId)) && (await countActiveAdmins(tx, userId)) === 0) {
50
+ if (!isAdminTarget &&
51
+ (await isUserAdmin(tx, userId)) &&
52
+ (await countActiveAdmins(tx, userId)) === 0) {
47
53
  throw new shared_1.ConflictError('Não é possível rebaixar o último administrador do tenant');
48
54
  }
49
55
  const role = await tx `SELECT id FROM role WHERE key = ${roleKey} AND tenant_id IS NULL`;
@@ -69,7 +75,9 @@ async function isUserAdmin(tx, userId) {
69
75
  }
70
76
  /** Ativa/desativa (ou revoga) a membership. Bloqueia desativar o último admin. */
71
77
  async function setMembershipStatus(tx, userId, status) {
72
- if (status !== 'active' && (await isUserAdmin(tx, userId)) && (await countActiveAdmins(tx, userId)) === 0) {
78
+ if (status !== 'active' &&
79
+ (await isUserAdmin(tx, userId)) &&
80
+ (await countActiveAdmins(tx, userId)) === 0) {
73
81
  throw new shared_1.ConflictError('Não é possível desativar o último administrador do tenant');
74
82
  }
75
83
  const rows = await tx `
@@ -80,4 +88,113 @@ async function setMembershipStatus(tx, userId, status) {
80
88
  `;
81
89
  return rows.count;
82
90
  }
91
+ /**
92
+ * Convida um usuário para o tenant corrente: cria (ou reaproveita, se o
93
+ * e-mail já existe em outro tenant — identidade é global/SSO) o registro de
94
+ * `user`, a `membership` em status `invited` e o papel. Para usuário novo,
95
+ * emite o token de ativação; a camada HTTP compõe o link e envia o e-mail
96
+ * (core não conhece BARUK_HUB_URL/Resend — mesma separação de
97
+ * `requestPasswordReset`).
98
+ */
99
+ async function inviteUser(tx, input) {
100
+ const tenantId = await currentTenantId(tx);
101
+ const existing = await tx `
102
+ SELECT id, full_name, status, user_type FROM "user" WHERE email = ${input.email} AND deleted_at IS NULL
103
+ `;
104
+ let userId;
105
+ let fullName;
106
+ let isNewUser;
107
+ if (existing[0]) {
108
+ // Uma identidade de contribuinte não pode ser promovida para staff por
109
+ // convite. Os fluxos têm permissões, superfície e ciclo de recuperação
110
+ // próprios; misturá-los aqui criaria uma conta dual-role insegura.
111
+ if (existing[0].user_type !== 'staff') {
112
+ throw new shared_1.ConflictError('Este e-mail já pertence a uma identidade do Portal. Use uma identidade staff distinta.');
113
+ }
114
+ userId = existing[0].id;
115
+ fullName = existing[0].full_name;
116
+ isNewUser = false;
117
+ const already = await tx `
118
+ SELECT id FROM membership WHERE user_id = ${userId} AND tenant_id = ${tenantId} AND deleted_at IS NULL
119
+ `;
120
+ if (already[0])
121
+ throw new shared_1.ConflictError('Usuário já pertence a este tenant');
122
+ }
123
+ else {
124
+ userId = (0, shared_1.uuidv7)();
125
+ fullName = input.fullName;
126
+ isNewUser = true;
127
+ await tx `
128
+ INSERT INTO "user" (id, email, full_name, user_type, status, auth_provider)
129
+ VALUES (${userId}, ${input.email}, ${input.fullName}, 'staff', 'invited', 'password')
130
+ `;
131
+ }
132
+ await tx `
133
+ INSERT INTO membership (id, tenant_id, user_id, status, invited_by)
134
+ VALUES (${(0, shared_1.uuidv7)()}, ${tenantId}, ${userId}, 'invited', ${input.invitedBy})
135
+ `;
136
+ await setUserRole(tx, userId, input.roleKey);
137
+ let activationToken = null;
138
+ if (isNewUser) {
139
+ const activation = await (0, password_reset_js_1.createActivationToken)(tx, { userId, tenantId });
140
+ activationToken = activation.token;
141
+ }
142
+ await (0, audit_js_1.appendAudit)(tx, {
143
+ actorId: input.invitedBy,
144
+ action: 'user_invited',
145
+ resourceType: 'user',
146
+ resourceId: userId,
147
+ metadata: { email: input.email, roleKey: input.roleKey, isNewUser },
148
+ });
149
+ return { userId, email: input.email, fullName, activationToken };
150
+ }
151
+ /**
152
+ * Reemite o convite de primeiro acesso exclusivamente para staff que ainda
153
+ * está pendente neste tenant. A emissão substitui (e invalida) o link anterior
154
+ * para que um token exposto nunca continue utilizável após o reenvio.
155
+ */
156
+ async function reissueStaffActivation(tx, input) {
157
+ const tenantId = await currentTenantId(tx);
158
+ const rows = await tx `
159
+ SELECT
160
+ u.email,
161
+ u.full_name,
162
+ u.user_type,
163
+ u.status AS user_status,
164
+ m.status AS membership_status
165
+ FROM membership m
166
+ JOIN "user" u ON u.id = m.user_id
167
+ WHERE m.tenant_id = ${tenantId}
168
+ AND m.user_id = ${input.userId}
169
+ AND m.deleted_at IS NULL
170
+ AND u.deleted_at IS NULL
171
+ LIMIT 1
172
+ `;
173
+ const member = rows[0];
174
+ if (!member)
175
+ throw new shared_1.NotFoundError('Usuário não encontrado neste tenant');
176
+ if (member.user_type !== 'staff' ||
177
+ member.user_status !== 'invited' ||
178
+ member.membership_status !== 'invited') {
179
+ throw new shared_1.ConflictError('Convite não pode ser reenviado neste estado');
180
+ }
181
+ const activation = await (0, password_reset_js_1.createActivationToken)(tx, { userId: input.userId, tenantId });
182
+ await (0, audit_js_1.appendAudit)(tx, {
183
+ actorId: input.invitedBy,
184
+ action: 'user_invite_reissued',
185
+ resourceType: 'user',
186
+ resourceId: input.userId,
187
+ metadata: { email: member.email },
188
+ });
189
+ return {
190
+ userId: input.userId,
191
+ email: member.email,
192
+ fullName: member.full_name,
193
+ activationToken: activation.token,
194
+ };
195
+ }
196
+ async function currentTenantId(tx) {
197
+ const rows = await tx `SELECT current_setting('app.current_tenant')::uuid AS tenant_id`;
198
+ return rows[0].tenant_id;
199
+ }
83
200
  //# sourceMappingURL=repository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/users/repository.ts"],"names":[],"mappings":";;AAkBA,8CAuBC;AAgBD,kCAiBC;AAYD,kDAeC;AArGD,0CAAsD;AAgBtD,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAEpC,KAAK,UAAU,iBAAiB,CAAC,EAAM;IAC5C,MAAM,IAAI,GAAG,MAAM,EAAE,CAEpB;;;;;;;;;;;GAWA,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,MAAM,EAAE,CAAC,CAAC,OAAO;QACjB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,QAAQ,EAAE,CAAC,CAAC,SAAS;QACrB,QAAQ,EAAE,CAAC,CAAC,SAAS;QACrB,gBAAgB,EAAE,CAAC,CAAC,MAAM;QAC1B,KAAK,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;KACzB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,EAAM,EAAE,aAAsB;IAC7D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAiB;;;;;;wBAMhB,eAAe;aAC1B,aAAa,IAAI,IAAI,kCAAkC,aAAa,IAAI,IAAI;GACtF,CAAC;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,kFAAkF;AAC3E,KAAK,UAAU,WAAW,CAAC,EAAM,EAAE,MAAc,EAAE,OAAe;IACvE,+CAA+C;IAC/C,MAAM,aAAa,GAAG,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACrG,MAAM,IAAI,sBAAa,CAAC,0DAA0D,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAkB,mCAAmC,OAAO,wBAAwB,CAAC;IAC1G,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,sBAAa,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;IACxE,MAAM,EAAE,CAAA;;sBAEY,MAAM;;GAEzB,CAAC;IACF,MAAM,EAAE,CAAA;;cAEI,IAAA,eAAM,GAAE,kDAAkD,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;GAC1F,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,EAAM,EAAE,MAAc;IAC/C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAiB;;;yBAGf,MAAM,8CAA8C,eAAe;GACzF,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,kFAAkF;AAC3E,KAAK,UAAU,mBAAmB,CACvC,EAAM,EACN,MAAc,EACd,MAAwC;IAExC,IAAI,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1G,MAAM,IAAI,sBAAa,CAAC,2DAA2D,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;qCACc,MAAM;sBACrB,MAAM;;;GAGzB,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/users/repository.ts"],"names":[],"mappings":"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"}
@@ -4,9 +4,12 @@ exports.createCredential = createCredential;
4
4
  exports.listCredentials = listCredentials;
5
5
  exports.getCredentialMeta = getCredentialMeta;
6
6
  exports.revealSecret = revealSecret;
7
+ exports.revealSecretByName = revealSecretByName;
7
8
  exports.rotateSecret = rotateSecret;
8
9
  exports.softDeleteCredential = softDeleteCredential;
9
10
  exports.listExpiringCredentials = listExpiringCredentials;
11
+ exports.findCredentialExpiryByName = findCredentialExpiryByName;
12
+ exports.findCredentialIdByName = findCredentialIdByName;
10
13
  const shared_1 = require("@baruk/shared");
11
14
  const crypto_js_1 = require("./crypto.js");
12
15
  function mapMeta(r) {
@@ -86,6 +89,38 @@ async function revealSecret(tx, keyring, tenantId, id) {
86
89
  });
87
90
  return { meta: mapMeta(r), secret };
88
91
  }
92
+ /**
93
+ * Busca e decifra uma credencial de NÍVEL DE TENANT (nunca amarrada a um
94
+ * `client_id`) pelo nome — o vocabulário que `channel_binding.credential_ref`
95
+ * usa (`vault://<name>`). Só enxerga o que a RLS permitir: um `tenantId`
96
+ * incorreto não lança, devolve `null` como se o nome não existisse.
97
+ *
98
+ * NUNCA lança por ausência/expiração — a diferença com `revealSecret` (por
99
+ * `id`), que lança `NotFoundError`, é deliberada: aquele é chamado por uma rota
100
+ * que já sabe que o `id` deveria existir; este é chamado por um resolvedor de
101
+ * canal que trata "não configurado" como estado normal.
102
+ */
103
+ async function revealSecretByName(tx, keyring, tenantId, name) {
104
+ const rows = await tx `
105
+ SELECT ${tx.unsafe(META_COLUMNS)}, ciphertext, iv, auth_tag
106
+ FROM vault_credential
107
+ WHERE client_id IS NULL AND lower(name) = lower(${name}) AND deleted_at IS NULL
108
+ `;
109
+ const r = rows[0];
110
+ if (!r)
111
+ return null;
112
+ const meta = mapMeta(r);
113
+ if (r.expires_at && r.expires_at.getTime() <= Date.now()) {
114
+ return { status: 'expired', meta };
115
+ }
116
+ const secret = (0, crypto_js_1.decryptSecret)(keyring, tenantId, {
117
+ ciphertext: r.ciphertext,
118
+ iv: r.iv,
119
+ authTag: r.auth_tag,
120
+ keyVersion: r.key_version,
121
+ });
122
+ return { status: 'ok', meta, secret };
123
+ }
89
124
  async function rotateSecret(tx, keyring, tenantId, id, newSecret, updatedBy) {
90
125
  const enc = (0, crypto_js_1.encryptSecret)(keyring, tenantId, newSecret);
91
126
  const rows = await tx `
@@ -117,4 +152,50 @@ async function listExpiringCredentials(tx, days = 30) {
117
152
  `;
118
153
  return rows.map(mapMeta);
119
154
  }
155
+ /**
156
+ * O `id` da credencial de nível de tenant com este nome, ou `null`.
157
+ *
158
+ * Existe para o caminho de **reconexão**: o índice único
159
+ * `(tenant, client, lower(name))` recusa um segundo `INSERT` com o mesmo nome, e
160
+ * um onboarding refeito — número reconectado, token revogado e reemitido pelo
161
+ * cliente — precisa ROTACIONAR a credencial existente, não criar outra.
162
+ *
163
+ * Devolve só o identificador. Uma função que devolvesse o metadado inteiro
164
+ * convidaria quem chama a decidir com base nele; a única pergunta legítima aqui
165
+ * é "já existe?".
166
+ */
167
+ /**
168
+ * Vencimento de uma credencial de nível de tenant, pelo NOME. Sem decifrar.
169
+ *
170
+ * Existe porque a tela precisa avisar ANTES: o token que o Embedded Signup emite
171
+ * na configuração canônica desta casa vive **60 dias**, e o comportamento no
172
+ * vencimento já é o correto — `revealSecretByName` devolve `expired`, o store
173
+ * audita e nega, o canal fica indisponível. O que faltava era alguém olhar.
174
+ *
175
+ * Descobrir o vencimento por uma cobrança que não saiu é o mesmo modo de falha
176
+ * do token colado que esta frente existe para eliminar, só que com prazo.
177
+ *
178
+ * Devolve `undefined` quando não há credencial com esse nome, e `null` no
179
+ * `expiresAt` quando ela não vence — os dois casos são diferentes para quem
180
+ * mostra a tela, e colapsá-los faria "não configurado" parecer "não vence".
181
+ */
182
+ async function findCredentialExpiryByName(tx, name) {
183
+ const rows = await tx `
184
+ SELECT id, expires_at FROM vault_credential
185
+ WHERE client_id IS NULL AND lower(name) = lower(${name}) AND deleted_at IS NULL
186
+ LIMIT 1
187
+ `;
188
+ const r = rows[0];
189
+ if (!r)
190
+ return undefined;
191
+ return { id: r.id, expiresAt: r.expires_at ? r.expires_at.toISOString() : null };
192
+ }
193
+ async function findCredentialIdByName(tx, name) {
194
+ const rows = await tx `
195
+ SELECT id FROM vault_credential
196
+ WHERE client_id IS NULL AND lower(name) = lower(${name}) AND deleted_at IS NULL
197
+ LIMIT 1
198
+ `;
199
+ return rows[0]?.id ?? null;
200
+ }
120
201
  //# sourceMappingURL=repository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/vault/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/vault/repository.ts"],"names":[],"mappings":"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"}
@@ -11,13 +11,48 @@ export interface ClientRecord {
11
11
  clientType: 'pf' | 'pj';
12
12
  displayName: string;
13
13
  documentNumber: string | null;
14
+ email: string | null;
15
+ phone: string | null;
14
16
  status: string;
15
17
  createdAt: string;
18
+ /**
19
+ * Por quais canais dá para falar com este cliente.
20
+ *
21
+ * Derivado, nunca armazenado: contactabilidade é consequência dos contatos
22
+ * cadastrados, e guardar uma cópia criaria um segundo lugar para ficar
23
+ * desatualizado. A régua de cobrança consulta isto ANTES de agendar, em vez de
24
+ * descobrir a ausência de canal só na hora de enviar.
25
+ */
26
+ contactability: Contactability;
16
27
  }
28
+ export type ContactChannelState = 'ready' | 'missing';
29
+ export interface Contactability {
30
+ email: ContactChannelState;
31
+ phone: ContactChannelState;
32
+ /** Nenhum canal utilizável — o caso que exige atualização cadastral. */
33
+ reachable: boolean;
34
+ }
35
+ export declare function contactabilityOf(input: {
36
+ email?: string | null;
37
+ phone?: string | null;
38
+ }): Contactability;
39
+ /**
40
+ * Normalização de contato.
41
+ *
42
+ * E-mail vira minúsculo e sem espaços — a coluna é `citext`, mas quem lê o dado
43
+ * fora do banco não herda essa insensibilidade. Telefone guarda só dígitos e um
44
+ * `+` inicial: máscara é apresentação, e comparar "(62) 99999-9999" com
45
+ * "+5562999999999" é o tipo de divergência que só aparece quando a mensagem não
46
+ * chega.
47
+ */
48
+ export declare function normalizeEmail(v: string | null | undefined): string | null;
49
+ export declare function normalizePhone(v: string | null | undefined): string | null;
17
50
  export interface CreateClientInput {
18
51
  displayName: string;
19
52
  clientType?: 'pf' | 'pj';
20
53
  documentNumber?: string | null;
54
+ email?: string | null;
55
+ phone?: string | null;
21
56
  createdBy?: string | null;
22
57
  }
23
58
  export declare function createClient(tx: Tx, input: CreateClientInput): Promise<ClientRecord>;
@@ -44,6 +79,13 @@ export interface UpdateClientInput {
44
79
  email?: string | null;
45
80
  phone?: string | null;
46
81
  status?: string;
82
+ /**
83
+ * CPF/CNPJ. Faltava aqui: o cliente nascia com documento e nunca podia
84
+ * corrigi-lo — e é justamente o campo que todo gateway de pagamento exige
85
+ * para aceitar um pagador. Um erro de digitação no cadastro bloqueava a
86
+ * emissão de cobrança para sempre.
87
+ */
88
+ documentNumber?: string | null;
47
89
  updatedBy?: string | null;
48
90
  }
49
91
  export declare function updateClient(tx: Tx, id: string, input: UpdateClientInput): Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAsBD,wBAAsB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAgB1F;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAQjE;AAED,wBAAsB,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAQzE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ3F;AAID,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,EAAE,EACN,MAAM,GAAE,iBAAsB,GAC7B,OAAO,CAAC;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBnD;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBhG;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAOrG;AAED,iFAAiF;AACjF,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMnG"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,33 @@
1
- import { NotFoundError, uuidv7 } from '@baruk/shared';
1
+ import { ConflictError, NotFoundError, uuidv7 } from '@baruk/shared';
2
+ import { toE164OrNull } from '../contacts/phone.js';
3
+ export function contactabilityOf(input) {
4
+ const email = input.email?.trim() ? 'ready' : 'missing';
5
+ const phone = input.phone?.trim() ? 'ready' : 'missing';
6
+ return { email, phone, reachable: email === 'ready' || phone === 'ready' };
7
+ }
8
+ /**
9
+ * Normalização de contato.
10
+ *
11
+ * E-mail vira minúsculo e sem espaços — a coluna é `citext`, mas quem lê o dado
12
+ * fora do banco não herda essa insensibilidade. Telefone guarda só dígitos e um
13
+ * `+` inicial: máscara é apresentação, e comparar "(62) 99999-9999" com
14
+ * "+5562999999999" é o tipo de divergência que só aparece quando a mensagem não
15
+ * chega.
16
+ */
17
+ export function normalizeEmail(v) {
18
+ const t = v?.trim().toLowerCase();
19
+ return t ? t : null;
20
+ }
21
+ export function normalizePhone(v) {
22
+ if (!v)
23
+ return null;
24
+ const trimmed = v.trim();
25
+ const plus = trimmed.startsWith('+');
26
+ const digits = trimmed.replace(/\D/g, '');
27
+ if (!digits)
28
+ return null;
29
+ return plus ? `+${digits}` : digits;
30
+ }
2
31
  function mapRow(r) {
3
32
  return {
4
33
  id: r.id,
@@ -6,30 +35,58 @@ function mapRow(r) {
6
35
  clientType: r.client_type,
7
36
  displayName: r.display_name,
8
37
  documentNumber: r.document_number,
38
+ email: r.email ?? null,
39
+ phone: r.phone ?? null,
9
40
  status: r.status,
10
41
  createdAt: r.created_at.toISOString(),
42
+ contactability: contactabilityOf({ email: r.email, phone: r.phone }),
11
43
  };
12
44
  }
45
+ /**
46
+ * Traduz a violação de documento duplicado.
47
+ *
48
+ * O banco impede dois clientes com o mesmo CPF/CNPJ no tenant — regra correta,
49
+ * e o escritório precisa saber que foi ISSO. Sem tradução, a rota devolvia 500
50
+ * genérico: quem cadastrava via um "erro interno" onde havia um cadastro já
51
+ * existente, e não tinha como descobrir.
52
+ */
53
+ function asDuplicateDocument(err) {
54
+ const e = err;
55
+ if (e?.code === '23505' && (e.constraint_name ?? '').includes('document')) {
56
+ throw new ConflictError('Já existe um cliente com este CPF/CNPJ neste escritório.');
57
+ }
58
+ }
13
59
  export async function createClient(tx, input) {
14
60
  // tenant_id vem da GUC — nunca do input. A WITH CHECK da RLS recusa qualquer
15
61
  // tentativa de gravar fora do tenant corrente.
16
- const rows = await tx `
17
- INSERT INTO client (id, tenant_id, client_type, display_name, document_number, created_by)
18
- VALUES (
19
- ${uuidv7()},
20
- current_setting('app.current_tenant')::uuid,
21
- ${input.clientType ?? 'pj'},
22
- ${input.displayName},
23
- ${input.documentNumber ?? null},
24
- ${input.createdBy ?? null}
25
- )
26
- RETURNING id, tenant_id, client_type, display_name, document_number, status, created_at
27
- `;
28
- return mapRow(rows[0]);
62
+ try {
63
+ const rows = await tx `
64
+ INSERT INTO client (id, tenant_id, client_type, display_name, document_number,
65
+ email, phone, phone_e164, created_by)
66
+ VALUES (
67
+ ${uuidv7()},
68
+ current_setting('app.current_tenant')::uuid,
69
+ ${input.clientType ?? 'pj'},
70
+ ${input.displayName},
71
+ ${input.documentNumber ?? null},
72
+ ${normalizeEmail(input.email)},
73
+ ${normalizePhone(input.phone)},
74
+ ${toE164OrNull(input.phone)},
75
+ ${input.createdBy ?? null}
76
+ )
77
+ RETURNING id, tenant_id, client_type, display_name, document_number, email, phone,
78
+ status, created_at
79
+ `;
80
+ return mapRow(rows[0]);
81
+ }
82
+ catch (err) {
83
+ asDuplicateDocument(err);
84
+ throw err;
85
+ }
29
86
  }
30
87
  export async function listClients(tx) {
31
88
  const rows = await tx `
32
- SELECT id, tenant_id, client_type, display_name, document_number, status, created_at
89
+ SELECT id, tenant_id, client_type, display_name, document_number, email, phone, status, created_at
33
90
  FROM client
34
91
  WHERE deleted_at IS NULL
35
92
  ORDER BY created_at DESC
@@ -38,7 +95,7 @@ export async function listClients(tx) {
38
95
  }
39
96
  export async function getClient(tx, id) {
40
97
  const rows = await tx `
41
- SELECT id, tenant_id, client_type, display_name, document_number, status, created_at
98
+ SELECT id, tenant_id, client_type, display_name, document_number, email, phone, status, created_at
42
99
  FROM client
43
100
  WHERE id = ${id} AND deleted_at IS NULL
44
101
  `;
@@ -64,7 +121,7 @@ export async function listClientsPaged(tx, filter = {}) {
64
121
  const offset = filter.offset ?? 0;
65
122
  const like = filter.search ? `%${filter.search}%` : null;
66
123
  const rows = await tx `
67
- SELECT id, tenant_id, client_type, display_name, document_number, status, created_at,
124
+ SELECT id, tenant_id, client_type, display_name, document_number, email, phone, status, created_at,
68
125
  count(*) OVER() AS total
69
126
  FROM client
70
127
  WHERE deleted_at IS NULL
@@ -77,14 +134,25 @@ export async function listClientsPaged(tx, filter = {}) {
77
134
  return { items: rows.map((r) => mapRow(r)), total };
78
135
  }
79
136
  export async function updateClient(tx, id, input) {
137
+ // Corrigir um documento para um que já existe cai na mesma violação — e o
138
+ // escritório precisa da mesma explicação, não de um 500.
80
139
  // Casts explícitos: parâmetros NULL sem tipo quebram COALESCE ("could not
81
140
  // determine data type of parameter") no PostgreSQL.
82
- const rows = await tx `
141
+ try {
142
+ const rows = await tx `
83
143
  UPDATE client SET
84
144
  display_name = COALESCE(${input.displayName ?? null}::text, display_name),
85
145
  legal_name = COALESCE(${input.legalName ?? null}::text, legal_name),
86
- email = COALESCE(${input.email ?? null}::citext, email),
87
- phone = COALESCE(${input.phone ?? null}::text, phone),
146
+ document_number = COALESCE(${input.documentNumber ?? null}::text, document_number),
147
+ email = COALESCE(${normalizeEmail(input.email)}::citext, email),
148
+ phone = COALESCE(${normalizePhone(input.phone)}::text, phone),
149
+ -- Derivado, nunca digitado. A coluna phone guarda o que o operador
150
+ -- escreveu e continua sendo dele; phone_e164 e a forma que os providers
151
+ -- exigem. So e recalculado quando o telefone vem no corpo: ausente
152
+ -- preserva o valor, e um telefone que nao parseia zera o canonico em vez
153
+ -- de manter um E.164 velho apontando para outro numero.
154
+ phone_e164 = CASE WHEN ${input.phone ?? null}::text IS NULL THEN phone_e164
155
+ ELSE ${toE164OrNull(input.phone)}::text END,
88
156
  status = COALESCE(${input.status ?? null}::text, status),
89
157
  updated_by = ${input.updatedBy ?? null}::uuid,
90
158
  updated_at = now(),
@@ -92,7 +160,12 @@ export async function updateClient(tx, id, input) {
92
160
  WHERE id = ${id} AND deleted_at IS NULL
93
161
  RETURNING id
94
162
  `;
95
- return rows.count;
163
+ return rows.count;
164
+ }
165
+ catch (err) {
166
+ asDuplicateDocument(err);
167
+ throw err;
168
+ }
96
169
  }
97
170
  export async function softDeleteClient(tx, id, deletedBy) {
98
171
  const rows = await tx `
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import type { Tx } from '../db/client.js';
2
+ /**
3
+ * Identidade do escritório para a comunicação transacional.
4
+ *
5
+ * Mora em `tenant.settings.branding` (jsonb que já existia) — sem tabela nem
6
+ * migration. Nenhuma marca está no código: o que aparece no e-mail vem do tenant
7
+ * que está enviando, e um escritório novo entra por configuração.
8
+ *
9
+ * Os valores canônicos de cada marca vivem no **Brand OS**
10
+ * (`frameworks/brand-os/brands/<marca>/creative-engine/brand-kit.json`), que é a
11
+ * fonte de verdade da identidade. Este módulo consome; não redefine.
12
+ */
13
+ /**
14
+ * O que o asset de logo É, do ponto de vista do manual de marca.
15
+ *
16
+ * A distinção não é cosmética: um **lockup** já contém o nome do escritório
17
+ * desenhado; um **símbolo** não. Renderizar os dois do mesmo jeito ou repete o
18
+ * nome duas vezes no cabeçalho, ou deixa a mensagem sem nome quando o leitor
19
+ * bloqueia imagens. O tenant declara qual dos dois enviou.
20
+ */
21
+ export type LogoKind = 'symbol' | 'lockup';
22
+ export interface TenantBranding {
23
+ officeName: string;
24
+ /** Assinatura do rodapé; cai em `officeName` quando não definida. */
25
+ signatureName: string;
26
+ /** Frase curta da marca. Só aparece se o tenant configurar. */
27
+ tagline: string | null;
28
+ /**
29
+ * Logomarca para o cabeçalho — ou seja, o asset que fica sobre `primaryColor`.
30
+ * Um kit de marca sério tem versão clara e escura; o tenant aponta a que
31
+ * combina com o fundo que ele mesmo escolheu.
32
+ *
33
+ * Formato: PNG ou JPG em URL pública. **SVG não serve** — Gmail e Outlook não
34
+ * o renderizam em e-mail. Ausente é estado válido: o cabeçalho vira
35
+ * tipográfico, nunca uma marca inventada.
36
+ */
37
+ logoUrl: string | null;
38
+ logoKind: LogoKind;
39
+ primaryColor: string;
40
+ /** Usada em detalhes; cai na primária quando ausente. */
41
+ secondaryColor: string;
42
+ /** Destaque pontual (valor, borda do card). */
43
+ accentColor: string;
44
+ /** Fundo da página do e-mail (fora do cartão branco). */
45
+ backgroundColor: string;
46
+ /** Cor do texto corrido. */
47
+ textColor: string;
48
+ /** Cor de apoio: rodapé, rótulos, texto secundário. */
49
+ mutedColor: string;
50
+ /**
51
+ * Stack de fontes do corpo. Webfont não carrega no Outlook, então a stack
52
+ * precisa terminar em famílias que todo cliente tem — quem configurar só o
53
+ * nome da fonte da marca recebe a queda automática.
54
+ */
55
+ fontFamily: string;
56
+ supportEmail: string | null;
57
+ supportPhone: string | null;
58
+ /** Site do escritório. Corresponde ao `websiteUrl` do vocabulário de marca. */
59
+ website: string | null;
60
+ locale: 'pt-BR';
61
+ }
62
+ export declare function getTenantBranding(tx: Tx): Promise<TenantBranding>;
63
+ /**
64
+ * Remetente no formato `Nome <endereço>`.
65
+ *
66
+ * O endereço continua sendo o do domínio verificado no provider — trocá-lo
67
+ * quebraria a entrega. O que muda é o NOME exibido: as mensagens saíam como
68
+ * "Baruk Contábil" e assinavam "SC Organização Contábil", o que faz o cliente
69
+ * duvidar de quem está cobrando.
70
+ */
71
+ export declare function senderFor(branding: TenantBranding, fallbackFrom: string): string;
72
+ //# sourceMappingURL=branding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branding.d.ts","sourceRoot":"","sources":["../../src/collection/branding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C;;;;;;;;;;GAUG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;;;;OAQG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,eAAe,EAAE,MAAM,CAAC;IACxB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,+EAA+E;IAC/E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;CACjB;AA4ED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAmDvE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAKhF"}