@endora-commerce/mod-organizations 0.100.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 (288) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -0
  3. package/dist/admin/components/OrganizationSalesRepsTab.d.ts +27 -0
  4. package/dist/admin/components/OrganizationSalesRepsTab.d.ts.map +1 -0
  5. package/dist/admin/components/OrganizationSalesRepsTab.js +170 -0
  6. package/dist/admin/components/OrganizationSalesRepsTab.js.map +1 -0
  7. package/dist/admin/index.d.ts +30 -0
  8. package/dist/admin/index.d.ts.map +1 -0
  9. package/dist/admin/index.js +59 -0
  10. package/dist/admin/index.js.map +1 -0
  11. package/dist/admin/pages/OrganizationDetail.d.ts +9 -0
  12. package/dist/admin/pages/OrganizationDetail.d.ts.map +1 -0
  13. package/dist/admin/pages/OrganizationDetail.js +247 -0
  14. package/dist/admin/pages/OrganizationDetail.js.map +1 -0
  15. package/dist/admin/pages/OrganizationsList.d.ts +9 -0
  16. package/dist/admin/pages/OrganizationsList.d.ts.map +1 -0
  17. package/dist/admin/pages/OrganizationsList.js +73 -0
  18. package/dist/admin/pages/OrganizationsList.js.map +1 -0
  19. package/dist/admin/panels/ApplicablePriceListsPanel.d.ts +12 -0
  20. package/dist/admin/panels/ApplicablePriceListsPanel.d.ts.map +1 -0
  21. package/dist/admin/panels/ApplicablePriceListsPanel.js +49 -0
  22. package/dist/admin/panels/ApplicablePriceListsPanel.js.map +1 -0
  23. package/dist/admin/panels/FulfilmentStrategyPanel.d.ts +16 -0
  24. package/dist/admin/panels/FulfilmentStrategyPanel.d.ts.map +1 -0
  25. package/dist/admin/panels/FulfilmentStrategyPanel.js +29 -0
  26. package/dist/admin/panels/FulfilmentStrategyPanel.js.map +1 -0
  27. package/dist/admin/panels/HierarchyPanel.d.ts +15 -0
  28. package/dist/admin/panels/HierarchyPanel.d.ts.map +1 -0
  29. package/dist/admin/panels/HierarchyPanel.js +65 -0
  30. package/dist/admin/panels/HierarchyPanel.js.map +1 -0
  31. package/dist/admin/panels/ModerationActionsPanel.d.ts +28 -0
  32. package/dist/admin/panels/ModerationActionsPanel.d.ts.map +1 -0
  33. package/dist/admin/panels/ModerationActionsPanel.js +111 -0
  34. package/dist/admin/panels/ModerationActionsPanel.js.map +1 -0
  35. package/dist/admin/panels/RestrictionsPanel.d.ts +24 -0
  36. package/dist/admin/panels/RestrictionsPanel.d.ts.map +1 -0
  37. package/dist/admin/panels/RestrictionsPanel.js +121 -0
  38. package/dist/admin/panels/RestrictionsPanel.js.map +1 -0
  39. package/dist/admin/panels/VatValidationPanel.d.ts +28 -0
  40. package/dist/admin/panels/VatValidationPanel.d.ts.map +1 -0
  41. package/dist/admin/panels/VatValidationPanel.js +79 -0
  42. package/dist/admin/panels/VatValidationPanel.js.map +1 -0
  43. package/dist/backend/commands/move.command.d.ts +11 -0
  44. package/dist/backend/commands/move.command.d.ts.map +1 -0
  45. package/dist/backend/commands/move.command.js +11 -0
  46. package/dist/backend/commands/move.command.js.map +1 -0
  47. package/dist/backend/commands/set-cart-approval-policy.command.d.ts +31 -0
  48. package/dist/backend/commands/set-cart-approval-policy.command.d.ts.map +1 -0
  49. package/dist/backend/commands/set-cart-approval-policy.command.js +56 -0
  50. package/dist/backend/commands/set-cart-approval-policy.command.js.map +1 -0
  51. package/dist/backend/commands/set-credit-mode.command.d.ts +16 -0
  52. package/dist/backend/commands/set-credit-mode.command.d.ts.map +1 -0
  53. package/dist/backend/commands/set-credit-mode.command.js +25 -0
  54. package/dist/backend/commands/set-credit-mode.command.js.map +1 -0
  55. package/dist/backend/commands/set-parent.command.d.ts +26 -0
  56. package/dist/backend/commands/set-parent.command.d.ts.map +1 -0
  57. package/dist/backend/commands/set-parent.command.js +51 -0
  58. package/dist/backend/commands/set-parent.command.js.map +1 -0
  59. package/dist/backend/demo/reset.d.ts +20 -0
  60. package/dist/backend/demo/reset.d.ts.map +1 -0
  61. package/dist/backend/demo/reset.js +11 -0
  62. package/dist/backend/demo/reset.js.map +1 -0
  63. package/dist/backend/demo/rows.d.ts +44 -0
  64. package/dist/backend/demo/rows.d.ts.map +1 -0
  65. package/dist/backend/demo/rows.js +44 -0
  66. package/dist/backend/demo/rows.js.map +1 -0
  67. package/dist/backend/demo/seed.d.ts +20 -0
  68. package/dist/backend/demo/seed.d.ts.map +1 -0
  69. package/dist/backend/demo/seed.js +28 -0
  70. package/dist/backend/demo/seed.js.map +1 -0
  71. package/dist/backend/email-templates/invitation.d.ts +23 -0
  72. package/dist/backend/email-templates/invitation.d.ts.map +1 -0
  73. package/dist/backend/email-templates/invitation.js +35 -0
  74. package/dist/backend/email-templates/invitation.js.map +1 -0
  75. package/dist/backend/email-templates/transactional-defaults.d.ts +54 -0
  76. package/dist/backend/email-templates/transactional-defaults.d.ts.map +1 -0
  77. package/dist/backend/email-templates/transactional-defaults.js +242 -0
  78. package/dist/backend/email-templates/transactional-defaults.js.map +1 -0
  79. package/dist/backend/email-templates/verification.d.ts +14 -0
  80. package/dist/backend/email-templates/verification.d.ts.map +1 -0
  81. package/dist/backend/email-templates/verification.js +34 -0
  82. package/dist/backend/email-templates/verification.js.map +1 -0
  83. package/dist/backend/entities/email-verification-token.entity.d.ts +17 -0
  84. package/dist/backend/entities/email-verification-token.entity.d.ts.map +1 -0
  85. package/dist/backend/entities/email-verification-token.entity.js +60 -0
  86. package/dist/backend/entities/email-verification-token.entity.js.map +1 -0
  87. package/dist/backend/entities/organization-delivery-method-link.entity.d.ts +14 -0
  88. package/dist/backend/entities/organization-delivery-method-link.entity.d.ts.map +1 -0
  89. package/dist/backend/entities/organization-delivery-method-link.entity.js +41 -0
  90. package/dist/backend/entities/organization-delivery-method-link.entity.js.map +1 -0
  91. package/dist/backend/entities/organization-invitation.entity.d.ts +21 -0
  92. package/dist/backend/entities/organization-invitation.entity.d.ts.map +1 -0
  93. package/dist/backend/entities/organization-invitation.entity.js +85 -0
  94. package/dist/backend/entities/organization-invitation.entity.js.map +1 -0
  95. package/dist/backend/entities/organization-payment-method-link.entity.d.ts +14 -0
  96. package/dist/backend/entities/organization-payment-method-link.entity.d.ts.map +1 -0
  97. package/dist/backend/entities/organization-payment-method-link.entity.js +41 -0
  98. package/dist/backend/entities/organization-payment-method-link.entity.js.map +1 -0
  99. package/dist/backend/entities/organization-sales-rep-assignment.entity.d.ts +17 -0
  100. package/dist/backend/entities/organization-sales-rep-assignment.entity.d.ts.map +1 -0
  101. package/dist/backend/entities/organization-sales-rep-assignment.entity.js +56 -0
  102. package/dist/backend/entities/organization-sales-rep-assignment.entity.js.map +1 -0
  103. package/dist/backend/entities/organization-tax-id-validation.entity.d.ts +29 -0
  104. package/dist/backend/entities/organization-tax-id-validation.entity.d.ts.map +1 -0
  105. package/dist/backend/entities/organization-tax-id-validation.entity.js +78 -0
  106. package/dist/backend/entities/organization-tax-id-validation.entity.js.map +1 -0
  107. package/dist/backend/entities/organization-warehouse-link.entity.d.ts +15 -0
  108. package/dist/backend/entities/organization-warehouse-link.entity.d.ts.map +1 -0
  109. package/dist/backend/entities/organization-warehouse-link.entity.js +42 -0
  110. package/dist/backend/entities/organization-warehouse-link.entity.js.map +1 -0
  111. package/dist/backend/entities/organization.entity.d.ts +125 -0
  112. package/dist/backend/entities/organization.entity.d.ts.map +1 -0
  113. package/dist/backend/entities/organization.entity.js +282 -0
  114. package/dist/backend/entities/organization.entity.js.map +1 -0
  115. package/dist/backend/index.d.ts +250 -0
  116. package/dist/backend/index.d.ts.map +1 -0
  117. package/dist/backend/index.js +506 -0
  118. package/dist/backend/index.js.map +1 -0
  119. package/dist/backend/integrations/ministerstwo-finansow-client.d.ts +22 -0
  120. package/dist/backend/integrations/ministerstwo-finansow-client.d.ts.map +1 -0
  121. package/dist/backend/integrations/ministerstwo-finansow-client.js +172 -0
  122. package/dist/backend/integrations/ministerstwo-finansow-client.js.map +1 -0
  123. package/dist/backend/integrations/vies-client.d.ts +18 -0
  124. package/dist/backend/integrations/vies-client.d.ts.map +1 -0
  125. package/dist/backend/integrations/vies-client.js +133 -0
  126. package/dist/backend/integrations/vies-client.js.map +1 -0
  127. package/dist/backend/plugin.d.ts +126 -0
  128. package/dist/backend/plugin.d.ts.map +1 -0
  129. package/dist/backend/plugin.js +139 -0
  130. package/dist/backend/plugin.js.map +1 -0
  131. package/dist/backend/routes.admin.d.ts +66 -0
  132. package/dist/backend/routes.admin.d.ts.map +1 -0
  133. package/dist/backend/routes.admin.js +711 -0
  134. package/dist/backend/routes.admin.js.map +1 -0
  135. package/dist/backend/routes.customer.d.ts +33 -0
  136. package/dist/backend/routes.customer.d.ts.map +1 -0
  137. package/dist/backend/routes.customer.js +139 -0
  138. package/dist/backend/routes.customer.js.map +1 -0
  139. package/dist/backend/routes.members.d.ts +31 -0
  140. package/dist/backend/routes.members.d.ts.map +1 -0
  141. package/dist/backend/routes.members.js +109 -0
  142. package/dist/backend/routes.members.js.map +1 -0
  143. package/dist/backend/routes.public.d.ts +49 -0
  144. package/dist/backend/routes.public.d.ts.map +1 -0
  145. package/dist/backend/routes.public.js +220 -0
  146. package/dist/backend/routes.public.js.map +1 -0
  147. package/dist/backend/routes.sales-reps.d.ts +46 -0
  148. package/dist/backend/routes.sales-reps.d.ts.map +1 -0
  149. package/dist/backend/routes.sales-reps.js +114 -0
  150. package/dist/backend/routes.sales-reps.js.map +1 -0
  151. package/dist/backend/routes.storefront.d.ts +25 -0
  152. package/dist/backend/routes.storefront.d.ts.map +1 -0
  153. package/dist/backend/routes.storefront.js +65 -0
  154. package/dist/backend/routes.storefront.js.map +1 -0
  155. package/dist/backend/schemas/organization.d.ts +59 -0
  156. package/dist/backend/schemas/organization.d.ts.map +1 -0
  157. package/dist/backend/schemas/organization.js +55 -0
  158. package/dist/backend/schemas/organization.js.map +1 -0
  159. package/dist/backend/schemas/settings.d.ts +30 -0
  160. package/dist/backend/schemas/settings.d.ts.map +1 -0
  161. package/dist/backend/schemas/settings.js +35 -0
  162. package/dist/backend/schemas/settings.js.map +1 -0
  163. package/dist/backend/services/email-verification-service.d.ts +45 -0
  164. package/dist/backend/services/email-verification-service.d.ts.map +1 -0
  165. package/dist/backend/services/email-verification-service.js +95 -0
  166. package/dist/backend/services/email-verification-service.js.map +1 -0
  167. package/dist/backend/services/invitation-service.d.ts +85 -0
  168. package/dist/backend/services/invitation-service.d.ts.map +1 -0
  169. package/dist/backend/services/invitation-service.js +266 -0
  170. package/dist/backend/services/invitation-service.js.map +1 -0
  171. package/dist/backend/services/normalize-name.d.ts +14 -0
  172. package/dist/backend/services/normalize-name.d.ts.map +1 -0
  173. package/dist/backend/services/normalize-name.js +14 -0
  174. package/dist/backend/services/normalize-name.js.map +1 -0
  175. package/dist/backend/services/org-registration-notifier.d.ts +36 -0
  176. package/dist/backend/services/org-registration-notifier.d.ts.map +1 -0
  177. package/dist/backend/services/org-registration-notifier.js +109 -0
  178. package/dist/backend/services/org-registration-notifier.js.map +1 -0
  179. package/dist/backend/services/org-template-email.d.ts +18 -0
  180. package/dist/backend/services/org-template-email.d.ts.map +1 -0
  181. package/dist/backend/services/org-template-email.js +16 -0
  182. package/dist/backend/services/org-template-email.js.map +1 -0
  183. package/dist/backend/services/organization-context-service.d.ts +52 -0
  184. package/dist/backend/services/organization-context-service.d.ts.map +1 -0
  185. package/dist/backend/services/organization-context-service.js +70 -0
  186. package/dist/backend/services/organization-context-service.js.map +1 -0
  187. package/dist/backend/services/organization-country-reference.d.ts +11 -0
  188. package/dist/backend/services/organization-country-reference.d.ts.map +1 -0
  189. package/dist/backend/services/organization-country-reference.js +24 -0
  190. package/dist/backend/services/organization-country-reference.js.map +1 -0
  191. package/dist/backend/services/organization-details-port.d.ts +33 -0
  192. package/dist/backend/services/organization-details-port.d.ts.map +1 -0
  193. package/dist/backend/services/organization-details-port.js +95 -0
  194. package/dist/backend/services/organization-details-port.js.map +1 -0
  195. package/dist/backend/services/organization-effective-pricelists-service.d.ts +50 -0
  196. package/dist/backend/services/organization-effective-pricelists-service.d.ts.map +1 -0
  197. package/dist/backend/services/organization-effective-pricelists-service.js +68 -0
  198. package/dist/backend/services/organization-effective-pricelists-service.js.map +1 -0
  199. package/dist/backend/services/organization-inheritance-service.d.ts +73 -0
  200. package/dist/backend/services/organization-inheritance-service.d.ts.map +1 -0
  201. package/dist/backend/services/organization-inheritance-service.js +63 -0
  202. package/dist/backend/services/organization-inheritance-service.js.map +1 -0
  203. package/dist/backend/services/organization-moderation-service.d.ts +124 -0
  204. package/dist/backend/services/organization-moderation-service.d.ts.map +1 -0
  205. package/dist/backend/services/organization-moderation-service.js +337 -0
  206. package/dist/backend/services/organization-moderation-service.js.map +1 -0
  207. package/dist/backend/services/organization-restriction-service.d.ts +70 -0
  208. package/dist/backend/services/organization-restriction-service.d.ts.map +1 -0
  209. package/dist/backend/services/organization-restriction-service.js +210 -0
  210. package/dist/backend/services/organization-restriction-service.js.map +1 -0
  211. package/dist/backend/services/organization-tax-id-validation-service.d.ts +59 -0
  212. package/dist/backend/services/organization-tax-id-validation-service.d.ts.map +1 -0
  213. package/dist/backend/services/organization-tax-id-validation-service.js +115 -0
  214. package/dist/backend/services/organization-tax-id-validation-service.js.map +1 -0
  215. package/dist/backend/services/organization-tree-service.d.ts +102 -0
  216. package/dist/backend/services/organization-tree-service.d.ts.map +1 -0
  217. package/dist/backend/services/organization-tree-service.js +184 -0
  218. package/dist/backend/services/organization-tree-service.js.map +1 -0
  219. package/dist/backend/services/personal-organization-service.d.ts +130 -0
  220. package/dist/backend/services/personal-organization-service.d.ts.map +1 -0
  221. package/dist/backend/services/personal-organization-service.js +207 -0
  222. package/dist/backend/services/personal-organization-service.js.map +1 -0
  223. package/dist/backend/services/registration-service.d.ts +80 -0
  224. package/dist/backend/services/registration-service.d.ts.map +1 -0
  225. package/dist/backend/services/registration-service.js +126 -0
  226. package/dist/backend/services/registration-service.js.map +1 -0
  227. package/dist/backend/services/sales-rep-assignment-service.d.ts +89 -0
  228. package/dist/backend/services/sales-rep-assignment-service.d.ts.map +1 -0
  229. package/dist/backend/services/sales-rep-assignment-service.js +176 -0
  230. package/dist/backend/services/sales-rep-assignment-service.js.map +1 -0
  231. package/dist/backend/services/vat-validator-port.d.ts +20 -0
  232. package/dist/backend/services/vat-validator-port.d.ts.map +1 -0
  233. package/dist/backend/services/vat-validator-port.js +2 -0
  234. package/dist/backend/services/vat-validator-port.js.map +1 -0
  235. package/dist/manifest.d.ts +176 -0
  236. package/dist/manifest.d.ts.map +1 -0
  237. package/dist/manifest.js +503 -0
  238. package/dist/manifest.js.map +1 -0
  239. package/dist/migrations/20260424T205317_organizations_init.d.ts +13 -0
  240. package/dist/migrations/20260424T205317_organizations_init.d.ts.map +1 -0
  241. package/dist/migrations/20260424T205317_organizations_init.js +100 -0
  242. package/dist/migrations/20260424T205317_organizations_init.js.map +1 -0
  243. package/dist/migrations/20260425T051700_organizations_invitations_init.d.ts +13 -0
  244. package/dist/migrations/20260425T051700_organizations_invitations_init.d.ts.map +1 -0
  245. package/dist/migrations/20260425T051700_organizations_invitations_init.js +39 -0
  246. package/dist/migrations/20260425T051700_organizations_invitations_init.js.map +1 -0
  247. package/dist/migrations/20260611T140349_organizations_consolidation.d.ts +35 -0
  248. package/dist/migrations/20260611T140349_organizations_consolidation.d.ts.map +1 -0
  249. package/dist/migrations/20260611T140349_organizations_consolidation.js +180 -0
  250. package/dist/migrations/20260611T140349_organizations_consolidation.js.map +1 -0
  251. package/dist/migrations/20260611T140358_organizations_org_order_confirmation_emails.d.ts +10 -0
  252. package/dist/migrations/20260611T140358_organizations_org_order_confirmation_emails.d.ts.map +1 -0
  253. package/dist/migrations/20260611T140358_organizations_org_order_confirmation_emails.js +14 -0
  254. package/dist/migrations/20260611T140358_organizations_org_order_confirmation_emails.js.map +1 -0
  255. package/dist/migrations/20260611T140402_organizations_org_fulfilment_strategy.d.ts +14 -0
  256. package/dist/migrations/20260611T140402_organizations_org_fulfilment_strategy.d.ts.map +1 -0
  257. package/dist/migrations/20260611T140402_organizations_org_fulfilment_strategy.js +20 -0
  258. package/dist/migrations/20260611T140402_organizations_org_fulfilment_strategy.js.map +1 -0
  259. package/dist/migrations/20260717T151403_organizations_personal_organizations.d.ts +24 -0
  260. package/dist/migrations/20260717T151403_organizations_personal_organizations.d.ts.map +1 -0
  261. package/dist/migrations/20260717T151403_organizations_personal_organizations.js +63 -0
  262. package/dist/migrations/20260717T151403_organizations_personal_organizations.js.map +1 -0
  263. package/dist/migrations/20260718T200340_organizations_organization_custom_field_values.d.ts +12 -0
  264. package/dist/migrations/20260718T200340_organizations_organization_custom_field_values.d.ts.map +1 -0
  265. package/dist/migrations/20260718T200340_organizations_organization_custom_field_values.js +16 -0
  266. package/dist/migrations/20260718T200340_organizations_organization_custom_field_values.js.map +1 -0
  267. package/dist/migrations/20260720T044254_organizations_org_hierarchy.d.ts +23 -0
  268. package/dist/migrations/20260720T044254_organizations_org_hierarchy.d.ts.map +1 -0
  269. package/dist/migrations/20260720T044254_organizations_org_hierarchy.js +37 -0
  270. package/dist/migrations/20260720T044254_organizations_org_hierarchy.js.map +1 -0
  271. package/dist/migrations/20260912T094646_organizations_sales_channel_organizations.d.ts +27 -0
  272. package/dist/migrations/20260912T094646_organizations_sales_channel_organizations.d.ts.map +1 -0
  273. package/dist/migrations/20260912T094646_organizations_sales_channel_organizations.js +44 -0
  274. package/dist/migrations/20260912T094646_organizations_sales_channel_organizations.js.map +1 -0
  275. package/dist/migrations/index.d.ts +35 -0
  276. package/dist/migrations/index.d.ts.map +1 -0
  277. package/dist/migrations/index.js +45 -0
  278. package/dist/migrations/index.js.map +1 -0
  279. package/dist/ports/index.d.ts +53 -0
  280. package/dist/ports/index.d.ts.map +1 -0
  281. package/dist/ports/index.js +2 -0
  282. package/dist/ports/index.js.map +1 -0
  283. package/docs/organization-hierarchy.md +117 -0
  284. package/docs/organizations.md +312 -0
  285. package/i18n/en.json +17 -0
  286. package/i18n/pl.json +17 -0
  287. package/package.json +107 -0
  288. package/tailwind.css +14 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Endora sp. z o.o. and the Endora Commerce contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,62 @@
1
+ <!-- Generated by `pnpm --filter backend run manifests:generate`. Delete this line to take the file over; a README without it is never regenerated. -->
2
+
3
+ # @endora-commerce/mod-organizations
4
+
5
+ B2B organization records, members, addresses, sales-rep assignment, moderation lifecycle, and per-org commercial scoping.
6
+
7
+ ## What this is
8
+
9
+ An **Endora Commerce module package**. Its module id is `organizations` — the identity of record in the platform's registries, in its migrations and in its setting, permission and translation codes.
10
+
11
+ A module is not imported by application code. The platform discovers the extension packages an instance has installed, reads the manifest on the root subpath and composes the module from it, so installing this package and starting the instance is the whole integration.
12
+
13
+ ## Entry points
14
+
15
+ | Import | Contents |
16
+ | --- | --- |
17
+ | `@endora-commerce/mod-organizations` | the module manifest — its id, version, dependencies, settings and activation |
18
+ | `@endora-commerce/mod-organizations/admin` | the Admin UI contribution: the screens, navigation and palette actions it adds |
19
+ | `@endora-commerce/mod-organizations/backend` | the composition root the platform calls, with the entities, services, routes and workers it registers |
20
+ | `@endora-commerce/mod-organizations/migrations` | the module’s own schema migrations, in the order the platform runs them |
21
+ | `@endora-commerce/mod-organizations/ports` | type-only — the port interfaces other modules resolve this one through |
22
+ | `@endora-commerce/mod-organizations/tailwind.css` | the Tailwind source declaration for the admin code above |
23
+
24
+ ## Depends on
25
+
26
+ Everything below is a **peer** dependency, so the application resolves exactly one copy of each — two copies of a host or of React are a runtime failure rather than a type error. An entry marked *optional* is needed only by the layers that use it.
27
+
28
+ **Endora packages**
29
+
30
+ - `@endora-commerce/admin-kit` — *optional*
31
+ - `@endora-commerce/contracts`
32
+ - `@endora-commerce/email-components`
33
+ - `@endora-commerce/platform`
34
+
35
+ **Third-party**
36
+
37
+ - `@fastify/cookie` ^11
38
+ - `@mikro-orm/core` ^6
39
+ - `@mikro-orm/migrations` ^6
40
+ - `@mikro-orm/postgresql` ^6
41
+ - `fastify` ^5
42
+ - `lucide-react` ^1 — *optional*
43
+ - `react` ^19 — *optional*
44
+ - `react-router-dom` ^7 — *optional*
45
+ - `zod` ^4
46
+
47
+ ## What the tarball carries
48
+
49
+ - `dist/` — the compiled JavaScript and its type declarations
50
+ - `i18n/` — the translation bundles this package ships (`en`, `pl`), loaded by the platform
51
+ - `docs/` — the package’s own pages in the Endora Commerce documentation site
52
+ - `tailwind.css` — the Tailwind source declaration
53
+
54
+ ## Install
55
+
56
+ ```bash
57
+ pnpm add @endora-commerce/mod-organizations
58
+ ```
59
+
60
+ ## Licence
61
+
62
+ MIT — the text is in `LICENSE`, beside this file.
@@ -0,0 +1,27 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * The gate, and the reason it is here rather than at the call site (D-166).
4
+ *
5
+ * The panel used to be mounted unconditionally, so an operator whose role does
6
+ * not hold the code saw the card and then a red 403 banner inside it, and — while
7
+ * the three endpoints were still registered by `quote_requests` — an operator who
8
+ * had switched quote requests off saw a 503 `MODULE_DISABLED` banner on the
9
+ * organisation screen instead. Constitution XVII item 5 says a module that is
10
+ * off contributes no tab; a tab that renders its own refusal is the opposite.
11
+ *
12
+ * `useSurfaceVisibility` is the predicate the sidebar, the palette and the
13
+ * dashboard quick actions already share (issue #230), so this is not a fourth
14
+ * answer to the same question. The **module** is `organizations`, which is where
15
+ * the three endpoints have belonged since D-166: it is `nonDeactivatable`, so the
16
+ * presence half cannot close today, and it is written anyway because the honest
17
+ * gate is "the module that owns these routes", not "the module that happens to
18
+ * be switchable".
19
+ *
20
+ * A wrapper rather than an early return inside the body: hooks cannot be
21
+ * skipped conditionally, and the body's first effect fetches. Hidden has to mean
22
+ * *nothing requested*, or every organisation opened logs a 403.
23
+ */
24
+ export declare function OrganizationSalesRepsTab(props: {
25
+ organizationId: string;
26
+ }): ReactNode;
27
+ //# sourceMappingURL=OrganizationSalesRepsTab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationSalesRepsTab.d.ts","sourceRoot":"","sources":["../../../src/admin/components/OrganizationSalesRepsTab.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAkD1F;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAWrF"}
@@ -0,0 +1,170 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { Trash2, UserPlus } from 'lucide-react';
4
+ import { ApiError, apiClient, useSurfaceVisibility } from '@endora-commerce/admin-kit/lib';
5
+ import { Alert, AlertDescription, Button, Card, CardContent, CardHeader, CardTitle, Combobox, Label, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@endora-commerce/admin-kit/ui';
6
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
7
+ const SEARCH_DEBOUNCE_MS = 250;
8
+ const SEARCH_PAGE_SIZE = 20;
9
+ function adminUserToOption(u) {
10
+ const fullName = `${u.firstName} ${u.lastName}`.trim();
11
+ return {
12
+ value: u.id,
13
+ label: fullName.length > 0 ? fullName : u.email,
14
+ description: fullName.length > 0 ? u.email : undefined,
15
+ };
16
+ }
17
+ /**
18
+ * The gate, and the reason it is here rather than at the call site (D-166).
19
+ *
20
+ * The panel used to be mounted unconditionally, so an operator whose role does
21
+ * not hold the code saw the card and then a red 403 banner inside it, and — while
22
+ * the three endpoints were still registered by `quote_requests` — an operator who
23
+ * had switched quote requests off saw a 503 `MODULE_DISABLED` banner on the
24
+ * organisation screen instead. Constitution XVII item 5 says a module that is
25
+ * off contributes no tab; a tab that renders its own refusal is the opposite.
26
+ *
27
+ * `useSurfaceVisibility` is the predicate the sidebar, the palette and the
28
+ * dashboard quick actions already share (issue #230), so this is not a fourth
29
+ * answer to the same question. The **module** is `organizations`, which is where
30
+ * the three endpoints have belonged since D-166: it is `nonDeactivatable`, so the
31
+ * presence half cannot close today, and it is written anyway because the honest
32
+ * gate is "the module that owns these routes", not "the module that happens to
33
+ * be switchable".
34
+ *
35
+ * A wrapper rather than an early return inside the body: hooks cannot be
36
+ * skipped conditionally, and the body's first effect fetches. Hidden has to mean
37
+ * *nothing requested*, or every organisation opened logs a 403.
38
+ */
39
+ export function OrganizationSalesRepsTab(props) {
40
+ const isVisible = useSurfaceVisibility();
41
+ if (!isVisible({
42
+ module: 'organizations',
43
+ requiredPermission: 'organizations:assign-sales-rep',
44
+ })) {
45
+ return null;
46
+ }
47
+ return _jsx(OrganizationSalesRepsPanel, { organizationId: props.organizationId });
48
+ }
49
+ function OrganizationSalesRepsPanel({ organizationId, }) {
50
+ const t = useTranslation('core');
51
+ const [rows, setRows] = useState([]);
52
+ const [loading, setLoading] = useState(true);
53
+ const [error, setError] = useState(null);
54
+ const [info, setInfo] = useState(null);
55
+ const [selectedAdminUserId, setSelectedAdminUserId] = useState(null);
56
+ const [selectedLabel, setSelectedLabel] = useState('');
57
+ const [busy, setBusy] = useState(false);
58
+ const [pickerOptions, setPickerOptions] = useState([]);
59
+ const [pickerSearching, setPickerSearching] = useState(false);
60
+ const refresh = useCallback(async () => {
61
+ setLoading(true);
62
+ setError(null);
63
+ try {
64
+ const reps = await apiClient.get(`/api/v1/admin/organizations/${organizationId}/sales-reps`);
65
+ setRows(reps.data);
66
+ }
67
+ catch (err) {
68
+ setError(err instanceof ApiError ? err.envelope.error.message : t('organizations.salesReps.error.load'));
69
+ }
70
+ finally {
71
+ setLoading(false);
72
+ }
73
+ }, [organizationId, t]);
74
+ useEffect(() => {
75
+ void refresh();
76
+ }, [refresh]);
77
+ const assignedIds = useMemo(() => new Set(rows.map((r) => r.adminUserId)), [rows]);
78
+ // Debounced server-side search. The latest request id wins so out-of-order
79
+ // responses (slow first request, fast second) don't overwrite fresh state.
80
+ const searchTimerRef = useRef(null);
81
+ const searchSeqRef = useRef(0);
82
+ useEffect(() => () => {
83
+ if (searchTimerRef.current !== null)
84
+ clearTimeout(searchTimerRef.current);
85
+ }, []);
86
+ const runSearch = useCallback(async (query, seq) => {
87
+ setPickerSearching(true);
88
+ try {
89
+ const params = new URLSearchParams();
90
+ params.set('page', '0');
91
+ params.set('pageSize', String(SEARCH_PAGE_SIZE));
92
+ if (query.trim().length > 0)
93
+ params.set('q', query.trim());
94
+ const res = await apiClient.get(`/api/v1/admin/admin-users?${params.toString()}`);
95
+ if (seq !== searchSeqRef.current)
96
+ return; // stale response
97
+ const filtered = res.data
98
+ .filter((u) => u.status === 'active' && !assignedIds.has(u.id))
99
+ .map(adminUserToOption);
100
+ setPickerOptions(filtered);
101
+ }
102
+ catch (err) {
103
+ if (seq !== searchSeqRef.current)
104
+ return;
105
+ setError(err instanceof ApiError ? err.envelope.error.message : t('organizations.salesReps.error.search'));
106
+ setPickerOptions([]);
107
+ }
108
+ finally {
109
+ if (seq === searchSeqRef.current)
110
+ setPickerSearching(false);
111
+ }
112
+ }, [assignedIds, t]);
113
+ const handleSearchChange = useCallback((query) => {
114
+ if (searchTimerRef.current !== null)
115
+ clearTimeout(searchTimerRef.current);
116
+ const seq = ++searchSeqRef.current;
117
+ searchTimerRef.current = setTimeout(() => {
118
+ void runSearch(query, seq);
119
+ }, SEARCH_DEBOUNCE_MS);
120
+ }, [runSearch]);
121
+ const handlePickerChange = useCallback((next) => {
122
+ setSelectedAdminUserId(next);
123
+ if (next === null) {
124
+ setSelectedLabel('');
125
+ return;
126
+ }
127
+ const opt = pickerOptions.find((o) => o.value === next);
128
+ if (opt)
129
+ setSelectedLabel(opt.label);
130
+ }, [pickerOptions]);
131
+ const assign = async () => {
132
+ if (selectedAdminUserId === null)
133
+ return;
134
+ setBusy(true);
135
+ setError(null);
136
+ setInfo(null);
137
+ try {
138
+ await apiClient.post(`/api/v1/admin/organizations/${organizationId}/sales-reps`, { adminUserId: selectedAdminUserId });
139
+ setInfo(t('organizations.salesReps.info.assigned'));
140
+ setSelectedAdminUserId(null);
141
+ setSelectedLabel('');
142
+ setPickerOptions([]);
143
+ await refresh();
144
+ }
145
+ catch (err) {
146
+ setError(err instanceof ApiError ? err.envelope.error.message : t('organizations.salesReps.error.assign'));
147
+ }
148
+ finally {
149
+ setBusy(false);
150
+ }
151
+ };
152
+ const unassign = async (id) => {
153
+ setBusy(true);
154
+ setError(null);
155
+ setInfo(null);
156
+ try {
157
+ await apiClient.delete(`/api/v1/admin/organizations/${organizationId}/sales-reps/${id}`);
158
+ setInfo(t('organizations.salesReps.info.unassigned'));
159
+ await refresh();
160
+ }
161
+ catch (err) {
162
+ setError(err instanceof ApiError ? err.envelope.error.message : t('organizations.salesReps.error.unassign'));
163
+ }
164
+ finally {
165
+ setBusy(false);
166
+ }
167
+ };
168
+ return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('organizations.salesReps.title') }) }), _jsxs(CardContent, { style: { display: 'flex', flexDirection: 'column', gap: 16 }, children: [error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null, info ? (_jsx(Alert, { children: _jsx(AlertDescription, { children: info }) })) : null, rows.length === 0 && !loading ? (_jsx("p", { style: { color: 'var(--b2b-muted)', fontSize: 13 }, children: t('organizations.salesReps.empty') })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: t('organizations.salesReps.column.name') }), _jsx(TableHead, { children: t('organizations.salesReps.column.email') }), _jsx(TableHead, { children: t('organizations.salesReps.column.assignedAt') }), _jsx(TableHead, { style: { width: 60 } })] }) }), _jsx(TableBody, { children: rows.map((r) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: r.displayName }), _jsx(TableCell, { children: r.email }), _jsx(TableCell, { children: new Date(r.assignedAt).toLocaleDateString('pl-PL') }), _jsx(TableCell, { children: _jsx(Button, { variant: "ghost", size: "sm", onClick: () => void unassign(r.adminUserId), disabled: busy, children: _jsx(Trash2, { size: 14 }) }) })] }, r.id))) })] })), _jsxs("div", { style: { display: 'flex', gap: 8, alignItems: 'flex-end' }, children: [_jsxs("div", { style: { flex: 1 }, children: [_jsx(Label, { htmlFor: "rep-picker", children: t('organizations.salesReps.assignLabel') }), _jsx(Combobox, { id: "rep-picker", options: pickerOptions, value: selectedAdminUserId, selectedLabel: selectedLabel, onChange: handlePickerChange, onSearchChange: handleSearchChange, manualFilter: true, loading: pickerSearching, placeholder: t('organizations.salesReps.searchPlaceholder'), disabled: busy, emptyMessage: pickerSearching ? t('organizations.salesReps.searching') : t('organizations.salesReps.noMatch') })] }), _jsxs(Button, { onClick: () => void assign(), disabled: busy || loading || selectedAdminUserId === null, children: [_jsx(UserPlus, { size: 14, style: { marginRight: 4 } }), " ", t('organizations.salesReps.assign')] })] })] })] }));
169
+ }
170
+ //# sourceMappingURL=OrganizationSalesRepsTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationSalesRepsTab.js","sourceRoot":"","sources":["../../../src/admin/components/OrganizationSalesRepsTab.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `organizations`' admin surface — two routes and one sidebar entry (feature
3
+ * 091, Phase 4 batch 14).
4
+ *
5
+ * **This module is a zone *host*, and the busiest one in the feature.**
6
+ * `OrganizationDetail.tsx` renders `organization.detail.after`, the member P7b
7
+ * published for it, and **four** modules contribute there: `sales_channels`'
8
+ * channel membership at 100, `price_lists`' display-mode override at 200,
9
+ * `quick_order`'s ordering defaults at 300 and `carts`' approval policy at 400.
10
+ * The publication is what freed this directory to move —
11
+ * `check:admin-registrations` counts routes and nav entries and a zone is
12
+ * neither, so a host may move whether or not its contributors have.
13
+ *
14
+ * **What it drains: nothing, and the zero is measured rather than assumed.**
15
+ * Before anything moved on this branch, this module owned no
16
+ * `backend/scripts/ledgers/cross-module-imports/` shard, was named as a target
17
+ * by none, had no key in `admin-surface.ts` (which is empty) and none in
18
+ * `foreign-module-ids.ts` — its one key there, `CartApprovalPolicyPanel.tsx`'s
19
+ * `module-namespace:carts`, retired in P7b, which is what the four
20
+ * contributions above cost that merge request instead of costing this one.
21
+ * `check:module-boundary` reads `cross-module reaches=7 ledger-size=7 shards=4`
22
+ * on both sides of the move, and that agreement is the measurement rather than
23
+ * a silence.
24
+ *
25
+ * **This entry exports data and nothing else** (R2); every component is a
26
+ * dynamic-import factory (R6).
27
+ */
28
+ import type { AdminContributions } from '@endora-commerce/admin-kit/contributions';
29
+ export declare const contributions: AdminContributions;
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAsBnF,eAAO,MAAM,aAAa,EAAE,kBAuC3B,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * The codes that open the two screens, **any-of** because the route is any-of.
3
+ *
4
+ * `packages/modules/organizations/src/backend/routes.admin.ts:169` builds one
5
+ * `requireAdminAny(['customers:read', 'customers:manage'])` gate and reads
6
+ * every organization endpoint through it; the sixteen writes below it enforce
7
+ * `customers:manage` alone. Naming only the read code — as the sidebar row did
8
+ * until 2026-08-29 — hid the screen from a role holding just
9
+ * `customers:manage`, which is why `AdminNavDeclaration.requiredPermission`
10
+ * takes a `PermissionRequirement` and not a bare string.
11
+ *
12
+ * Both codes are this module's own declaration (`manifest.ts`, D-173), so an
13
+ * operator switching `customers` off does not make them ungrantable while these
14
+ * screens — owned by a module that cannot be switched off — go on answering.
15
+ */
16
+ const READ_PERMISSION = ['customers:read', 'customers:manage'];
17
+ /** The module's landing route: the organization roster. */
18
+ const ROUTE_PATH = '/organizations';
19
+ export const contributions = {
20
+ routes: [
21
+ {
22
+ path: ROUTE_PATH,
23
+ component: () => import('./pages/OrganizationsList.js'),
24
+ requiredPermission: [...READ_PERMISSION],
25
+ index: true,
26
+ },
27
+ {
28
+ path: `${ROUTE_PATH}/:id`,
29
+ component: () => import('./pages/OrganizationDetail.js'),
30
+ requiredPermission: [...READ_PERMISSION],
31
+ },
32
+ ],
33
+ // One row for two screens, and the one without it is deliberate:
34
+ // `/organizations/:id` is a detail reached from the roster. A route is what
35
+ // `App.tsx` used to hold; a row in a table is not a route.
36
+ nav: [
37
+ {
38
+ to: ROUTE_PATH,
39
+ // Module-relative (R8), resolved in this module's own namespace out of
40
+ // `packages/modules/organizations/i18n/`. It was
41
+ // `appShell.nav.organizations` in the shared `_i18n` bundle, one of the
42
+ // four shared files a module author had to edit — and this module's
43
+ // bundle held nothing but error sentences until now.
44
+ labelKey: 'nav.organizations.label',
45
+ // The glyph `AppShell.tsx` rendered by hand, and already on
46
+ // `KnownIconNameSchema` — the palette action this batch declares names
47
+ // the same one.
48
+ icon: 'Building2',
49
+ section: 'customers',
50
+ // Third in *Customers*, which is where the hand-written table put it:
51
+ // after `customers`' two rows (100 and 200, declared in this same batch)
52
+ // and before `customer_accounts`' and `credit_limits`' 400 and
53
+ // `comparisons`' 600.
54
+ weight: 300,
55
+ requiredPermission: [...READ_PERMISSION],
56
+ },
57
+ ],
58
+ };
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AA6BA;;;;;;;;;;;;;;GAcG;AACH,MAAM,eAAe,GAA8B,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;AAE1F,2DAA2D;AAC3D,MAAM,UAAU,GAAG,gBAAgB,CAAC;AAEpC,MAAM,CAAC,MAAM,aAAa,GAAuB;IAC/C,MAAM,EAAE;QACN;YACE,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC;YACvD,kBAAkB,EAAE,CAAC,GAAG,eAAe,CAAC;YACxC,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,GAAG,UAAU,MAAM;YACzB,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,+BAA+B,CAAC;YACxD,kBAAkB,EAAE,CAAC,GAAG,eAAe,CAAC;SACzC;KACF;IACD,iEAAiE;IACjE,4EAA4E;IAC5E,2DAA2D;IAC3D,GAAG,EAAE;QACH;YACE,EAAE,EAAE,UAAU;YACd,uEAAuE;YACvE,iDAAiD;YACjD,wEAAwE;YACxE,oEAAoE;YACpE,qDAAqD;YACrD,QAAQ,EAAE,yBAAyB;YACnC,4DAA4D;YAC5D,uEAAuE;YACvE,gBAAgB;YAChB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,WAAW;YACpB,sEAAsE;YACtE,yEAAyE;YACzE,+DAA+D;YAC/D,sBAAsB;YACtB,MAAM,EAAE,GAAG;YACX,kBAAkB,EAAE,CAAC,GAAG,eAAe,CAAC;SACzC;KACF;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function OrganizationDetail(): ReactNode;
3
+ /**
4
+ * The registry loads a route component through a dynamic-import factory and
5
+ * reads its default export (feature 091, FR-013). The named export stays: it is
6
+ * the spelling this module's own code and its tests use.
7
+ */
8
+ export default OrganizationDetail;
9
+ //# sourceMappingURL=OrganizationDetail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationDetail.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/OrganizationDetail.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA+DzE,wBAAgB,kBAAkB,IAAI,SAAS,CAwoB9C;AAED;;;;GAIG;AACH,eAAe,kBAAkB,CAAC"}