@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.
- package/LICENSE +21 -0
- package/README.md +62 -0
- package/dist/admin/components/OrganizationSalesRepsTab.d.ts +27 -0
- package/dist/admin/components/OrganizationSalesRepsTab.d.ts.map +1 -0
- package/dist/admin/components/OrganizationSalesRepsTab.js +170 -0
- package/dist/admin/components/OrganizationSalesRepsTab.js.map +1 -0
- package/dist/admin/index.d.ts +30 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +59 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/OrganizationDetail.d.ts +9 -0
- package/dist/admin/pages/OrganizationDetail.d.ts.map +1 -0
- package/dist/admin/pages/OrganizationDetail.js +247 -0
- package/dist/admin/pages/OrganizationDetail.js.map +1 -0
- package/dist/admin/pages/OrganizationsList.d.ts +9 -0
- package/dist/admin/pages/OrganizationsList.d.ts.map +1 -0
- package/dist/admin/pages/OrganizationsList.js +73 -0
- package/dist/admin/pages/OrganizationsList.js.map +1 -0
- package/dist/admin/panels/ApplicablePriceListsPanel.d.ts +12 -0
- package/dist/admin/panels/ApplicablePriceListsPanel.d.ts.map +1 -0
- package/dist/admin/panels/ApplicablePriceListsPanel.js +49 -0
- package/dist/admin/panels/ApplicablePriceListsPanel.js.map +1 -0
- package/dist/admin/panels/FulfilmentStrategyPanel.d.ts +16 -0
- package/dist/admin/panels/FulfilmentStrategyPanel.d.ts.map +1 -0
- package/dist/admin/panels/FulfilmentStrategyPanel.js +29 -0
- package/dist/admin/panels/FulfilmentStrategyPanel.js.map +1 -0
- package/dist/admin/panels/HierarchyPanel.d.ts +15 -0
- package/dist/admin/panels/HierarchyPanel.d.ts.map +1 -0
- package/dist/admin/panels/HierarchyPanel.js +65 -0
- package/dist/admin/panels/HierarchyPanel.js.map +1 -0
- package/dist/admin/panels/ModerationActionsPanel.d.ts +28 -0
- package/dist/admin/panels/ModerationActionsPanel.d.ts.map +1 -0
- package/dist/admin/panels/ModerationActionsPanel.js +111 -0
- package/dist/admin/panels/ModerationActionsPanel.js.map +1 -0
- package/dist/admin/panels/RestrictionsPanel.d.ts +24 -0
- package/dist/admin/panels/RestrictionsPanel.d.ts.map +1 -0
- package/dist/admin/panels/RestrictionsPanel.js +121 -0
- package/dist/admin/panels/RestrictionsPanel.js.map +1 -0
- package/dist/admin/panels/VatValidationPanel.d.ts +28 -0
- package/dist/admin/panels/VatValidationPanel.d.ts.map +1 -0
- package/dist/admin/panels/VatValidationPanel.js +79 -0
- package/dist/admin/panels/VatValidationPanel.js.map +1 -0
- package/dist/backend/commands/move.command.d.ts +11 -0
- package/dist/backend/commands/move.command.d.ts.map +1 -0
- package/dist/backend/commands/move.command.js +11 -0
- package/dist/backend/commands/move.command.js.map +1 -0
- package/dist/backend/commands/set-cart-approval-policy.command.d.ts +31 -0
- package/dist/backend/commands/set-cart-approval-policy.command.d.ts.map +1 -0
- package/dist/backend/commands/set-cart-approval-policy.command.js +56 -0
- package/dist/backend/commands/set-cart-approval-policy.command.js.map +1 -0
- package/dist/backend/commands/set-credit-mode.command.d.ts +16 -0
- package/dist/backend/commands/set-credit-mode.command.d.ts.map +1 -0
- package/dist/backend/commands/set-credit-mode.command.js +25 -0
- package/dist/backend/commands/set-credit-mode.command.js.map +1 -0
- package/dist/backend/commands/set-parent.command.d.ts +26 -0
- package/dist/backend/commands/set-parent.command.d.ts.map +1 -0
- package/dist/backend/commands/set-parent.command.js +51 -0
- package/dist/backend/commands/set-parent.command.js.map +1 -0
- package/dist/backend/demo/reset.d.ts +20 -0
- package/dist/backend/demo/reset.d.ts.map +1 -0
- package/dist/backend/demo/reset.js +11 -0
- package/dist/backend/demo/reset.js.map +1 -0
- package/dist/backend/demo/rows.d.ts +44 -0
- package/dist/backend/demo/rows.d.ts.map +1 -0
- package/dist/backend/demo/rows.js +44 -0
- package/dist/backend/demo/rows.js.map +1 -0
- package/dist/backend/demo/seed.d.ts +20 -0
- package/dist/backend/demo/seed.d.ts.map +1 -0
- package/dist/backend/demo/seed.js +28 -0
- package/dist/backend/demo/seed.js.map +1 -0
- package/dist/backend/email-templates/invitation.d.ts +23 -0
- package/dist/backend/email-templates/invitation.d.ts.map +1 -0
- package/dist/backend/email-templates/invitation.js +35 -0
- package/dist/backend/email-templates/invitation.js.map +1 -0
- package/dist/backend/email-templates/transactional-defaults.d.ts +54 -0
- package/dist/backend/email-templates/transactional-defaults.d.ts.map +1 -0
- package/dist/backend/email-templates/transactional-defaults.js +242 -0
- package/dist/backend/email-templates/transactional-defaults.js.map +1 -0
- package/dist/backend/email-templates/verification.d.ts +14 -0
- package/dist/backend/email-templates/verification.d.ts.map +1 -0
- package/dist/backend/email-templates/verification.js +34 -0
- package/dist/backend/email-templates/verification.js.map +1 -0
- package/dist/backend/entities/email-verification-token.entity.d.ts +17 -0
- package/dist/backend/entities/email-verification-token.entity.d.ts.map +1 -0
- package/dist/backend/entities/email-verification-token.entity.js +60 -0
- package/dist/backend/entities/email-verification-token.entity.js.map +1 -0
- package/dist/backend/entities/organization-delivery-method-link.entity.d.ts +14 -0
- package/dist/backend/entities/organization-delivery-method-link.entity.d.ts.map +1 -0
- package/dist/backend/entities/organization-delivery-method-link.entity.js +41 -0
- package/dist/backend/entities/organization-delivery-method-link.entity.js.map +1 -0
- package/dist/backend/entities/organization-invitation.entity.d.ts +21 -0
- package/dist/backend/entities/organization-invitation.entity.d.ts.map +1 -0
- package/dist/backend/entities/organization-invitation.entity.js +85 -0
- package/dist/backend/entities/organization-invitation.entity.js.map +1 -0
- package/dist/backend/entities/organization-payment-method-link.entity.d.ts +14 -0
- package/dist/backend/entities/organization-payment-method-link.entity.d.ts.map +1 -0
- package/dist/backend/entities/organization-payment-method-link.entity.js +41 -0
- package/dist/backend/entities/organization-payment-method-link.entity.js.map +1 -0
- package/dist/backend/entities/organization-sales-rep-assignment.entity.d.ts +17 -0
- package/dist/backend/entities/organization-sales-rep-assignment.entity.d.ts.map +1 -0
- package/dist/backend/entities/organization-sales-rep-assignment.entity.js +56 -0
- package/dist/backend/entities/organization-sales-rep-assignment.entity.js.map +1 -0
- package/dist/backend/entities/organization-tax-id-validation.entity.d.ts +29 -0
- package/dist/backend/entities/organization-tax-id-validation.entity.d.ts.map +1 -0
- package/dist/backend/entities/organization-tax-id-validation.entity.js +78 -0
- package/dist/backend/entities/organization-tax-id-validation.entity.js.map +1 -0
- package/dist/backend/entities/organization-warehouse-link.entity.d.ts +15 -0
- package/dist/backend/entities/organization-warehouse-link.entity.d.ts.map +1 -0
- package/dist/backend/entities/organization-warehouse-link.entity.js +42 -0
- package/dist/backend/entities/organization-warehouse-link.entity.js.map +1 -0
- package/dist/backend/entities/organization.entity.d.ts +125 -0
- package/dist/backend/entities/organization.entity.d.ts.map +1 -0
- package/dist/backend/entities/organization.entity.js +282 -0
- package/dist/backend/entities/organization.entity.js.map +1 -0
- package/dist/backend/index.d.ts +250 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +506 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/integrations/ministerstwo-finansow-client.d.ts +22 -0
- package/dist/backend/integrations/ministerstwo-finansow-client.d.ts.map +1 -0
- package/dist/backend/integrations/ministerstwo-finansow-client.js +172 -0
- package/dist/backend/integrations/ministerstwo-finansow-client.js.map +1 -0
- package/dist/backend/integrations/vies-client.d.ts +18 -0
- package/dist/backend/integrations/vies-client.d.ts.map +1 -0
- package/dist/backend/integrations/vies-client.js +133 -0
- package/dist/backend/integrations/vies-client.js.map +1 -0
- package/dist/backend/plugin.d.ts +126 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +139 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +66 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +711 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/routes.customer.d.ts +33 -0
- package/dist/backend/routes.customer.d.ts.map +1 -0
- package/dist/backend/routes.customer.js +139 -0
- package/dist/backend/routes.customer.js.map +1 -0
- package/dist/backend/routes.members.d.ts +31 -0
- package/dist/backend/routes.members.d.ts.map +1 -0
- package/dist/backend/routes.members.js +109 -0
- package/dist/backend/routes.members.js.map +1 -0
- package/dist/backend/routes.public.d.ts +49 -0
- package/dist/backend/routes.public.d.ts.map +1 -0
- package/dist/backend/routes.public.js +220 -0
- package/dist/backend/routes.public.js.map +1 -0
- package/dist/backend/routes.sales-reps.d.ts +46 -0
- package/dist/backend/routes.sales-reps.d.ts.map +1 -0
- package/dist/backend/routes.sales-reps.js +114 -0
- package/dist/backend/routes.sales-reps.js.map +1 -0
- package/dist/backend/routes.storefront.d.ts +25 -0
- package/dist/backend/routes.storefront.d.ts.map +1 -0
- package/dist/backend/routes.storefront.js +65 -0
- package/dist/backend/routes.storefront.js.map +1 -0
- package/dist/backend/schemas/organization.d.ts +59 -0
- package/dist/backend/schemas/organization.d.ts.map +1 -0
- package/dist/backend/schemas/organization.js +55 -0
- package/dist/backend/schemas/organization.js.map +1 -0
- package/dist/backend/schemas/settings.d.ts +30 -0
- package/dist/backend/schemas/settings.d.ts.map +1 -0
- package/dist/backend/schemas/settings.js +35 -0
- package/dist/backend/schemas/settings.js.map +1 -0
- package/dist/backend/services/email-verification-service.d.ts +45 -0
- package/dist/backend/services/email-verification-service.d.ts.map +1 -0
- package/dist/backend/services/email-verification-service.js +95 -0
- package/dist/backend/services/email-verification-service.js.map +1 -0
- package/dist/backend/services/invitation-service.d.ts +85 -0
- package/dist/backend/services/invitation-service.d.ts.map +1 -0
- package/dist/backend/services/invitation-service.js +266 -0
- package/dist/backend/services/invitation-service.js.map +1 -0
- package/dist/backend/services/normalize-name.d.ts +14 -0
- package/dist/backend/services/normalize-name.d.ts.map +1 -0
- package/dist/backend/services/normalize-name.js +14 -0
- package/dist/backend/services/normalize-name.js.map +1 -0
- package/dist/backend/services/org-registration-notifier.d.ts +36 -0
- package/dist/backend/services/org-registration-notifier.d.ts.map +1 -0
- package/dist/backend/services/org-registration-notifier.js +109 -0
- package/dist/backend/services/org-registration-notifier.js.map +1 -0
- package/dist/backend/services/org-template-email.d.ts +18 -0
- package/dist/backend/services/org-template-email.d.ts.map +1 -0
- package/dist/backend/services/org-template-email.js +16 -0
- package/dist/backend/services/org-template-email.js.map +1 -0
- package/dist/backend/services/organization-context-service.d.ts +52 -0
- package/dist/backend/services/organization-context-service.d.ts.map +1 -0
- package/dist/backend/services/organization-context-service.js +70 -0
- package/dist/backend/services/organization-context-service.js.map +1 -0
- package/dist/backend/services/organization-country-reference.d.ts +11 -0
- package/dist/backend/services/organization-country-reference.d.ts.map +1 -0
- package/dist/backend/services/organization-country-reference.js +24 -0
- package/dist/backend/services/organization-country-reference.js.map +1 -0
- package/dist/backend/services/organization-details-port.d.ts +33 -0
- package/dist/backend/services/organization-details-port.d.ts.map +1 -0
- package/dist/backend/services/organization-details-port.js +95 -0
- package/dist/backend/services/organization-details-port.js.map +1 -0
- package/dist/backend/services/organization-effective-pricelists-service.d.ts +50 -0
- package/dist/backend/services/organization-effective-pricelists-service.d.ts.map +1 -0
- package/dist/backend/services/organization-effective-pricelists-service.js +68 -0
- package/dist/backend/services/organization-effective-pricelists-service.js.map +1 -0
- package/dist/backend/services/organization-inheritance-service.d.ts +73 -0
- package/dist/backend/services/organization-inheritance-service.d.ts.map +1 -0
- package/dist/backend/services/organization-inheritance-service.js +63 -0
- package/dist/backend/services/organization-inheritance-service.js.map +1 -0
- package/dist/backend/services/organization-moderation-service.d.ts +124 -0
- package/dist/backend/services/organization-moderation-service.d.ts.map +1 -0
- package/dist/backend/services/organization-moderation-service.js +337 -0
- package/dist/backend/services/organization-moderation-service.js.map +1 -0
- package/dist/backend/services/organization-restriction-service.d.ts +70 -0
- package/dist/backend/services/organization-restriction-service.d.ts.map +1 -0
- package/dist/backend/services/organization-restriction-service.js +210 -0
- package/dist/backend/services/organization-restriction-service.js.map +1 -0
- package/dist/backend/services/organization-tax-id-validation-service.d.ts +59 -0
- package/dist/backend/services/organization-tax-id-validation-service.d.ts.map +1 -0
- package/dist/backend/services/organization-tax-id-validation-service.js +115 -0
- package/dist/backend/services/organization-tax-id-validation-service.js.map +1 -0
- package/dist/backend/services/organization-tree-service.d.ts +102 -0
- package/dist/backend/services/organization-tree-service.d.ts.map +1 -0
- package/dist/backend/services/organization-tree-service.js +184 -0
- package/dist/backend/services/organization-tree-service.js.map +1 -0
- package/dist/backend/services/personal-organization-service.d.ts +130 -0
- package/dist/backend/services/personal-organization-service.d.ts.map +1 -0
- package/dist/backend/services/personal-organization-service.js +207 -0
- package/dist/backend/services/personal-organization-service.js.map +1 -0
- package/dist/backend/services/registration-service.d.ts +80 -0
- package/dist/backend/services/registration-service.d.ts.map +1 -0
- package/dist/backend/services/registration-service.js +126 -0
- package/dist/backend/services/registration-service.js.map +1 -0
- package/dist/backend/services/sales-rep-assignment-service.d.ts +89 -0
- package/dist/backend/services/sales-rep-assignment-service.d.ts.map +1 -0
- package/dist/backend/services/sales-rep-assignment-service.js +176 -0
- package/dist/backend/services/sales-rep-assignment-service.js.map +1 -0
- package/dist/backend/services/vat-validator-port.d.ts +20 -0
- package/dist/backend/services/vat-validator-port.d.ts.map +1 -0
- package/dist/backend/services/vat-validator-port.js +2 -0
- package/dist/backend/services/vat-validator-port.js.map +1 -0
- package/dist/manifest.d.ts +176 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +503 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260424T205317_organizations_init.d.ts +13 -0
- package/dist/migrations/20260424T205317_organizations_init.d.ts.map +1 -0
- package/dist/migrations/20260424T205317_organizations_init.js +100 -0
- package/dist/migrations/20260424T205317_organizations_init.js.map +1 -0
- package/dist/migrations/20260425T051700_organizations_invitations_init.d.ts +13 -0
- package/dist/migrations/20260425T051700_organizations_invitations_init.d.ts.map +1 -0
- package/dist/migrations/20260425T051700_organizations_invitations_init.js +39 -0
- package/dist/migrations/20260425T051700_organizations_invitations_init.js.map +1 -0
- package/dist/migrations/20260611T140349_organizations_consolidation.d.ts +35 -0
- package/dist/migrations/20260611T140349_organizations_consolidation.d.ts.map +1 -0
- package/dist/migrations/20260611T140349_organizations_consolidation.js +180 -0
- package/dist/migrations/20260611T140349_organizations_consolidation.js.map +1 -0
- package/dist/migrations/20260611T140358_organizations_org_order_confirmation_emails.d.ts +10 -0
- package/dist/migrations/20260611T140358_organizations_org_order_confirmation_emails.d.ts.map +1 -0
- package/dist/migrations/20260611T140358_organizations_org_order_confirmation_emails.js +14 -0
- package/dist/migrations/20260611T140358_organizations_org_order_confirmation_emails.js.map +1 -0
- package/dist/migrations/20260611T140402_organizations_org_fulfilment_strategy.d.ts +14 -0
- package/dist/migrations/20260611T140402_organizations_org_fulfilment_strategy.d.ts.map +1 -0
- package/dist/migrations/20260611T140402_organizations_org_fulfilment_strategy.js +20 -0
- package/dist/migrations/20260611T140402_organizations_org_fulfilment_strategy.js.map +1 -0
- package/dist/migrations/20260717T151403_organizations_personal_organizations.d.ts +24 -0
- package/dist/migrations/20260717T151403_organizations_personal_organizations.d.ts.map +1 -0
- package/dist/migrations/20260717T151403_organizations_personal_organizations.js +63 -0
- package/dist/migrations/20260717T151403_organizations_personal_organizations.js.map +1 -0
- package/dist/migrations/20260718T200340_organizations_organization_custom_field_values.d.ts +12 -0
- package/dist/migrations/20260718T200340_organizations_organization_custom_field_values.d.ts.map +1 -0
- package/dist/migrations/20260718T200340_organizations_organization_custom_field_values.js +16 -0
- package/dist/migrations/20260718T200340_organizations_organization_custom_field_values.js.map +1 -0
- package/dist/migrations/20260720T044254_organizations_org_hierarchy.d.ts +23 -0
- package/dist/migrations/20260720T044254_organizations_org_hierarchy.d.ts.map +1 -0
- package/dist/migrations/20260720T044254_organizations_org_hierarchy.js +37 -0
- package/dist/migrations/20260720T044254_organizations_org_hierarchy.js.map +1 -0
- package/dist/migrations/20260912T094646_organizations_sales_channel_organizations.d.ts +27 -0
- package/dist/migrations/20260912T094646_organizations_sales_channel_organizations.d.ts.map +1 -0
- package/dist/migrations/20260912T094646_organizations_sales_channel_organizations.js +44 -0
- package/dist/migrations/20260912T094646_organizations_sales_channel_organizations.js.map +1 -0
- package/dist/migrations/index.d.ts +35 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +45 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/ports/index.d.ts +53 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +2 -0
- package/dist/ports/index.js.map +1 -0
- package/docs/organization-hierarchy.md +117 -0
- package/docs/organizations.md +312 -0
- package/i18n/en.json +17 -0
- package/i18n/pl.json +17 -0
- package/package.json +107 -0
- package/tailwind.css +14 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { evaluateApplicationRule, } from '@endora-commerce/contracts';
|
|
2
|
+
import { Organization } from '../entities/organization.entity.js';
|
|
3
|
+
/**
|
|
4
|
+
* Returns the set of Price Lists currently applicable to a given
|
|
5
|
+
* Organization, each tagged with the reasons it applies. Implementation
|
|
6
|
+
* reuses the existing application-rule evaluator (no new persistence
|
|
7
|
+
* surface) — see research.md R6.
|
|
8
|
+
*/
|
|
9
|
+
export class OrganizationEffectivePriceListsService {
|
|
10
|
+
deps;
|
|
11
|
+
constructor(deps) {
|
|
12
|
+
this.deps = deps;
|
|
13
|
+
}
|
|
14
|
+
async listApplicable(organizationId) {
|
|
15
|
+
const em = this.deps.emFactory();
|
|
16
|
+
const org = await em.findOne(Organization, { id: organizationId, deletedAt: null });
|
|
17
|
+
if (!org)
|
|
18
|
+
return [];
|
|
19
|
+
const salesChannelId = await this.deps.resolveDefaultSalesChannelId();
|
|
20
|
+
const now = new Date();
|
|
21
|
+
const candidates = await this.deps.priceListRead.listActive();
|
|
22
|
+
const ctx = {
|
|
23
|
+
organizationId: org.id,
|
|
24
|
+
customerGroupId: org.customerGroupId ?? null,
|
|
25
|
+
salesChannelId,
|
|
26
|
+
currencyCode: 'PLN',
|
|
27
|
+
productCategoryIds: new Set(),
|
|
28
|
+
};
|
|
29
|
+
const results = [];
|
|
30
|
+
for (const pl of candidates) {
|
|
31
|
+
// Time-window check: skip lists that haven't started or have expired.
|
|
32
|
+
if (pl.startsAt && pl.startsAt > now)
|
|
33
|
+
continue;
|
|
34
|
+
if (pl.endsAt && pl.endsAt < now)
|
|
35
|
+
continue;
|
|
36
|
+
const evaluation = evaluateApplicationRule(pl.applicationRule, ctx);
|
|
37
|
+
if (!evaluation.matched)
|
|
38
|
+
continue;
|
|
39
|
+
const reasons = [];
|
|
40
|
+
if (evaluation.explicitOn.has('organization'))
|
|
41
|
+
reasons.push('direct_organization_match');
|
|
42
|
+
if (evaluation.explicitOn.has('customerGroup'))
|
|
43
|
+
reasons.push('customer_group_match');
|
|
44
|
+
if (evaluation.explicitOn.has('salesChannel'))
|
|
45
|
+
reasons.push('sales_channel_inheritance');
|
|
46
|
+
if (evaluation.explicitOn.has('category'))
|
|
47
|
+
reasons.push('segment_rule_match');
|
|
48
|
+
// The "all" rule (kind='all') matches without any explicitOn — surface
|
|
49
|
+
// as a segment-rule-match-like blanket entry so the UI shows something.
|
|
50
|
+
if (reasons.length === 0)
|
|
51
|
+
reasons.push('segment_rule_match');
|
|
52
|
+
results.push({
|
|
53
|
+
priceListId: pl.id,
|
|
54
|
+
name: pl.name,
|
|
55
|
+
priority: reasons.length, // higher specificity → higher priority
|
|
56
|
+
reasons,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// Sort by priority desc, then by name asc for stable display.
|
|
60
|
+
results.sort((a, b) => {
|
|
61
|
+
if (b.priority !== a.priority)
|
|
62
|
+
return b.priority - a.priority;
|
|
63
|
+
return a.name.localeCompare(b.name);
|
|
64
|
+
});
|
|
65
|
+
return results;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=organization-effective-pricelists-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization-effective-pricelists-service.js","sourceRoot":"","sources":["../../../src/backend/services/organization-effective-pricelists-service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,GAGxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AA6ClE;;;;;GAKG;AACH,MAAM,OAAO,sCAAsC;IACpB;IAA7B,YAA6B,IAAyC;QAAzC,SAAI,GAAJ,IAAI,CAAqC;IAAG,CAAC;IAE1E,KAAK,CAAC,cAAc,CAAC,cAAsB;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QAEpB,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACtE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAE9D,MAAM,GAAG,GAA+B;YACtC,cAAc,EAAE,GAAG,CAAC,EAAE;YACtB,eAAe,EAAE,GAAG,CAAC,eAAe,IAAI,IAAI;YAC5C,cAAc;YACd,YAAY,EAAE,KAAK;YACnB,kBAAkB,EAAE,IAAI,GAAG,EAAU;SACtC,CAAC;QAEF,MAAM,OAAO,GAA+B,EAAE,CAAC;QAC/C,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,sEAAsE;YACtE,IAAI,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,QAAQ,GAAG,GAAG;gBAAE,SAAS;YAC/C,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,GAAG,GAAG;gBAAE,SAAS;YAE3C,MAAM,UAAU,GAAG,uBAAuB,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YACpE,IAAI,CAAC,UAAU,CAAC,OAAO;gBAAE,SAAS;YAElC,MAAM,OAAO,GAAgC,EAAE,CAAC;YAChD,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACzF,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACrF,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACzF,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC9E,uEAAuE;YACvE,wEAAwE;YACxE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAE7D,OAAO,CAAC,IAAI,CAAC;gBACX,WAAW,EAAE,EAAE,CAAC,EAAE;gBAClB,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,uCAAuC;gBACjE,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,8DAA8D;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACpB,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;gBAAE,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;YAC9D,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql';
|
|
2
|
+
import type { CreditLimitReadPort } from '@endora-commerce/contracts';
|
|
3
|
+
import type { OrganizationTreeService } from './organization-tree-service.js';
|
|
4
|
+
/**
|
|
5
|
+
* OrganizationInheritanceService (feature 056 US3) — the organizations-owned
|
|
6
|
+
* resolution port that the price-list resolver and the credit-limit service
|
|
7
|
+
* call to walk the ancestor chain (Principle I). No schema change to
|
|
8
|
+
* `price_lists` / `credit_limits`; inheritance is resolution semantics (R5/R6).
|
|
9
|
+
*
|
|
10
|
+
* Flat behavior is preserved: for a root org (no ancestors) the price-list org
|
|
11
|
+
* chain is `[orgId]` and `creditOwner` is the org itself (or none), collapsing
|
|
12
|
+
* to today's single-org resolution byte-for-byte (FR-013).
|
|
13
|
+
*/
|
|
14
|
+
export type CreditInheritanceMode = 'shared_pool' | 'independent_default';
|
|
15
|
+
export interface CreditOwner {
|
|
16
|
+
/** Nearest ancestor-or-self holding a `CreditLimit` row, or null when none exists. */
|
|
17
|
+
readonly ownerOrgId: string | null;
|
|
18
|
+
/** Effective mode: the owner's per-org column, else the Settings global default. */
|
|
19
|
+
readonly mode: CreditInheritanceMode;
|
|
20
|
+
}
|
|
21
|
+
export declare class OrganizationInheritanceService {
|
|
22
|
+
private readonly emFactory;
|
|
23
|
+
private readonly treeService;
|
|
24
|
+
/**
|
|
25
|
+
* `creditLimitReadPort`, owned by `credit_limits` — which links of an
|
|
26
|
+
* ancestor chain hold a limit at all (feature 077, D-87).
|
|
27
|
+
*
|
|
28
|
+
* **Required**, and third rather than last, because the optional shape is
|
|
29
|
+
* the one that fails open: a composition that omitted it would answer
|
|
30
|
+
* "nobody in this chain has a limit" for every organisation, which is a
|
|
31
|
+
* plausible reading and the wrong one. The read it replaces was raw SQL
|
|
32
|
+
* against that module's table, so an absent or switched-off owner made no
|
|
33
|
+
* difference to the answer at all.
|
|
34
|
+
*/
|
|
35
|
+
private readonly creditLimits;
|
|
36
|
+
/**
|
|
37
|
+
* Resolves the Settings global default `organizations.hierarchy.credit_inheritance_mode`.
|
|
38
|
+
* Defaults to `shared_pool` (factory default, R6) when not injected.
|
|
39
|
+
*/
|
|
40
|
+
private readonly resolveGlobalCreditMode;
|
|
41
|
+
constructor(emFactory: () => EntityManager, treeService: OrganizationTreeService,
|
|
42
|
+
/**
|
|
43
|
+
* `creditLimitReadPort`, owned by `credit_limits` — which links of an
|
|
44
|
+
* ancestor chain hold a limit at all (feature 077, D-87).
|
|
45
|
+
*
|
|
46
|
+
* **Required**, and third rather than last, because the optional shape is
|
|
47
|
+
* the one that fails open: a composition that omitted it would answer
|
|
48
|
+
* "nobody in this chain has a limit" for every organisation, which is a
|
|
49
|
+
* plausible reading and the wrong one. The read it replaces was raw SQL
|
|
50
|
+
* against that module's table, so an absent or switched-off owner made no
|
|
51
|
+
* difference to the answer at all.
|
|
52
|
+
*/
|
|
53
|
+
creditLimits: CreditLimitReadPort,
|
|
54
|
+
/**
|
|
55
|
+
* Resolves the Settings global default `organizations.hierarchy.credit_inheritance_mode`.
|
|
56
|
+
* Defaults to `shared_pool` (factory default, R6) when not injected.
|
|
57
|
+
*/
|
|
58
|
+
resolveGlobalCreditMode?: () => Promise<CreditInheritanceMode>);
|
|
59
|
+
/** Ancestor ids of `orgId`, nearest-first (parent → … → root). `[]` for a root. */
|
|
60
|
+
ancestorIds(orgId: string): Promise<string[]>;
|
|
61
|
+
/**
|
|
62
|
+
* Ordered org candidate set for price-list resolution: `[orgId, ...ancestorIds]`
|
|
63
|
+
* (nearest-first). A nearer org outranks a farther ancestor (R5).
|
|
64
|
+
*/
|
|
65
|
+
priceListOrgChain(orgId: string): Promise<string[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Nearest ancestor-or-self holding a `CreditLimit` row, plus the effective
|
|
68
|
+
* credit-inheritance mode (the owner's per-org column, else the global default).
|
|
69
|
+
* `ownerOrgId` is null when neither the org nor any ancestor has a limit.
|
|
70
|
+
*/
|
|
71
|
+
creditOwner(orgId: string): Promise<CreditOwner>;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=organization-inheritance-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization-inheritance-service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/organization-inheritance-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE9E;;;;;;;;;GASG;AAEH,MAAM,MAAM,qBAAqB,GAAG,aAAa,GAAG,qBAAqB,CAAC;AAE1E,MAAM,WAAW,WAAW;IAC1B,sFAAsF;IACtF,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,oFAAoF;IACpF,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;CACtC;AAED,qBAAa,8BAA8B;IAEvC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,uBAAuB;gBAlBvB,SAAS,EAAE,MAAM,aAAa,EAC9B,WAAW,EAAE,uBAAuB;IACrD;;;;;;;;;;OAUG;IACc,YAAY,EAAE,mBAAmB;IAClD;;;OAGG;IACc,uBAAuB,GAAE,MAAM,OAAO,CAAC,qBAAqB,CAC9D;IAGjB,mFAAmF;IAC7E,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAInD;;;OAGG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzD;;;;OAIG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAuBvD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export class OrganizationInheritanceService {
|
|
2
|
+
emFactory;
|
|
3
|
+
treeService;
|
|
4
|
+
creditLimits;
|
|
5
|
+
resolveGlobalCreditMode;
|
|
6
|
+
constructor(emFactory, treeService,
|
|
7
|
+
/**
|
|
8
|
+
* `creditLimitReadPort`, owned by `credit_limits` — which links of an
|
|
9
|
+
* ancestor chain hold a limit at all (feature 077, D-87).
|
|
10
|
+
*
|
|
11
|
+
* **Required**, and third rather than last, because the optional shape is
|
|
12
|
+
* the one that fails open: a composition that omitted it would answer
|
|
13
|
+
* "nobody in this chain has a limit" for every organisation, which is a
|
|
14
|
+
* plausible reading and the wrong one. The read it replaces was raw SQL
|
|
15
|
+
* against that module's table, so an absent or switched-off owner made no
|
|
16
|
+
* difference to the answer at all.
|
|
17
|
+
*/
|
|
18
|
+
creditLimits,
|
|
19
|
+
/**
|
|
20
|
+
* Resolves the Settings global default `organizations.hierarchy.credit_inheritance_mode`.
|
|
21
|
+
* Defaults to `shared_pool` (factory default, R6) when not injected.
|
|
22
|
+
*/
|
|
23
|
+
resolveGlobalCreditMode = async () => 'shared_pool') {
|
|
24
|
+
this.emFactory = emFactory;
|
|
25
|
+
this.treeService = treeService;
|
|
26
|
+
this.creditLimits = creditLimits;
|
|
27
|
+
this.resolveGlobalCreditMode = resolveGlobalCreditMode;
|
|
28
|
+
}
|
|
29
|
+
/** Ancestor ids of `orgId`, nearest-first (parent → … → root). `[]` for a root. */
|
|
30
|
+
async ancestorIds(orgId) {
|
|
31
|
+
return this.treeService.ancestorIds(orgId);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Ordered org candidate set for price-list resolution: `[orgId, ...ancestorIds]`
|
|
35
|
+
* (nearest-first). A nearer org outranks a farther ancestor (R5).
|
|
36
|
+
*/
|
|
37
|
+
async priceListOrgChain(orgId) {
|
|
38
|
+
return [orgId, ...(await this.treeService.ancestorIds(orgId))];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Nearest ancestor-or-self holding a `CreditLimit` row, plus the effective
|
|
42
|
+
* credit-inheritance mode (the owner's per-org column, else the global default).
|
|
43
|
+
* `ownerOrgId` is null when neither the org nor any ancestor has a limit.
|
|
44
|
+
*/
|
|
45
|
+
async creditOwner(orgId) {
|
|
46
|
+
const chain = [orgId, ...(await this.treeService.ancestorIds(orgId))]; // nearest-first
|
|
47
|
+
// Which orgs in the chain hold a credit limit? Asked of the module that
|
|
48
|
+
// owns the table, not selected out of it (feature 077, D-87). No `catch`:
|
|
49
|
+
// a switched-off `credit_limits` must refuse here rather than report an
|
|
50
|
+
// empty chain, which downstream reads as "no limit applies".
|
|
51
|
+
const hasLimit = new Set(await this.creditLimits.organizationsWithLimit(chain));
|
|
52
|
+
const ownerOrgId = chain.find((id) => hasLimit.has(id)) ?? null;
|
|
53
|
+
if (!ownerOrgId) {
|
|
54
|
+
return { ownerOrgId: null, mode: await this.resolveGlobalCreditMode() };
|
|
55
|
+
}
|
|
56
|
+
// This module's own table, so it stays a statement here.
|
|
57
|
+
const modeRows = (await this.emFactory().getConnection().execute(`select "credit_inheritance_mode" from "organizations" where "id" = ?`, [ownerOrgId]));
|
|
58
|
+
const ownMode = modeRows[0]?.credit_inheritance_mode ?? null;
|
|
59
|
+
const mode = ownMode ?? (await this.resolveGlobalCreditMode());
|
|
60
|
+
return { ownerOrgId, mode };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=organization-inheritance-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization-inheritance-service.js","sourceRoot":"","sources":["../../../src/backend/services/organization-inheritance-service.ts"],"names":[],"mappings":"AAwBA,MAAM,OAAO,8BAA8B;IAEtB;IACA;IAYA;IAKA;IAnBnB,YACmB,SAA8B,EAC9B,WAAoC;IACrD;;;;;;;;;;OAUG;IACc,YAAiC;IAClD;;;OAGG;IACc,0BAAgE,KAAK,IAAI,EAAE,CAC1F,aAAa;QAnBE,cAAS,GAAT,SAAS,CAAqB;QAC9B,gBAAW,GAAX,WAAW,CAAyB;QAYpC,iBAAY,GAAZ,YAAY,CAAqB;QAKjC,4BAAuB,GAAvB,uBAAuB,CACzB;IACd,CAAC;IAEJ,mFAAmF;IACnF,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CAAC,KAAa;QACnC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB;QAEvF,wEAAwE;QACxE,0EAA0E;QAC1E,wEAAwE;QACxE,6DAA6D;QAC7D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;QAChF,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;QAEhE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QAC1E,CAAC;QAED,yDAAyD;QACzD,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,EAAE,CAAC,OAAO,CAC9D,sEAAsE,EACtE,CAAC,UAAU,CAAC,CACb,CAAqE,CAAC;QACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,uBAAuB,IAAI,IAAI,CAAC;QAC7D,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC;QAC/D,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql';
|
|
2
|
+
import { Organization, type OrganizationStatus } from '../entities/organization.entity.js';
|
|
3
|
+
import type { AuditPort } from '@endora-commerce/platform/kernel';
|
|
4
|
+
import type { CustomerAccountReadPort, EmailMailerPort } from '@endora-commerce/contracts';
|
|
5
|
+
import type { OrganizationEventBus } from './registration-service.js';
|
|
6
|
+
import { type OrgTemplateEmail } from './org-template-email.js';
|
|
7
|
+
/**
|
|
8
|
+
* OrganizationModerationService — owns every status transition on the
|
|
9
|
+
* Organization entity (feature 026 US1 + US3).
|
|
10
|
+
*
|
|
11
|
+
* Lifecycle (see `data-model.md` §3 state diagram):
|
|
12
|
+
* pending_verification -> active via approve()
|
|
13
|
+
* pending_verification -> rejected via reject(reason)
|
|
14
|
+
* active -> blocked via block(reason?)
|
|
15
|
+
* blocked -> active via unblock()
|
|
16
|
+
*
|
|
17
|
+
* Every transition is recorded to `audit_log_entries` with `before/after`
|
|
18
|
+
* snapshots and the actor; emits `organization.status_changed.v1` so the
|
|
19
|
+
* notifier + downstream consumers (pricing cache, sales-rep dashboards)
|
|
20
|
+
* can react. Each write is gated by the Organization's `version` column
|
|
21
|
+
* — mismatch raises `OrganizationVersionMismatchError` which routes map
|
|
22
|
+
* to HTTP 409 with `currentVersion` in the body.
|
|
23
|
+
*
|
|
24
|
+
* The service also exposes `handleNewlyRegistered(orgId)` — invoked by
|
|
25
|
+
* the registration-event subscriber so the moderation-mode setting
|
|
26
|
+
* (`organizations.moderation.mode`) flips the new org straight to
|
|
27
|
+
* `active` when the platform runs in `auto` mode. The subscriber is
|
|
28
|
+
* wired in the composition root.
|
|
29
|
+
*
|
|
30
|
+
* Customer email notifications (approval, rejection) go through the
|
|
31
|
+
* admin-editable transactional template, which resolves them in the
|
|
32
|
+
* recipient's language, and fall back to the English in-code builders below
|
|
33
|
+
* only when the platform holds no definition for the code. The recipient is
|
|
34
|
+
* the Organization's first `organization_admin` Customer account, read through
|
|
35
|
+
* `customer_accounts`' published port (feature 075, D-87).
|
|
36
|
+
*/
|
|
37
|
+
export interface ModerationActorContext {
|
|
38
|
+
actorAdminUserId?: string | null;
|
|
39
|
+
requestId?: string | null;
|
|
40
|
+
}
|
|
41
|
+
export interface ApproveOptions extends ModerationActorContext {
|
|
42
|
+
expectedVersion: number;
|
|
43
|
+
}
|
|
44
|
+
export interface RejectOptions extends ModerationActorContext {
|
|
45
|
+
expectedVersion: number;
|
|
46
|
+
reason: string;
|
|
47
|
+
notifyCustomerEmail?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface BlockOptions extends ModerationActorContext {
|
|
50
|
+
expectedVersion: number;
|
|
51
|
+
reason?: string | null;
|
|
52
|
+
}
|
|
53
|
+
export interface UnblockOptions extends ModerationActorContext {
|
|
54
|
+
expectedVersion: number;
|
|
55
|
+
}
|
|
56
|
+
export declare class OrganizationModerationService {
|
|
57
|
+
private readonly emFactory;
|
|
58
|
+
private readonly auditLogService;
|
|
59
|
+
private readonly events;
|
|
60
|
+
private readonly mailer;
|
|
61
|
+
/**
|
|
62
|
+
* `customer_accounts`' published read, for the one question this service
|
|
63
|
+
* asks it: who receives the approval or rejection message.
|
|
64
|
+
*/
|
|
65
|
+
private readonly customerAccounts;
|
|
66
|
+
/** Resolver for the moderation-mode setting. Returns 'auto' or 'manual'. */
|
|
67
|
+
private readonly resolveModerationMode;
|
|
68
|
+
/**
|
|
69
|
+
* The transactional-template seam, which is where the language comes from.
|
|
70
|
+
*
|
|
71
|
+
* Defaulted to the no-op rather than made required so a composition that
|
|
72
|
+
* does not wire it keeps sending — silence would be worse than the
|
|
73
|
+
* fallback language, which is the whole argument for keeping the in-code
|
|
74
|
+
* builders below.
|
|
75
|
+
*/
|
|
76
|
+
private readonly templateEmail;
|
|
77
|
+
constructor(emFactory: () => EntityManager, auditLogService: AuditPort, events: OrganizationEventBus, mailer: EmailMailerPort,
|
|
78
|
+
/**
|
|
79
|
+
* `customer_accounts`' published read, for the one question this service
|
|
80
|
+
* asks it: who receives the approval or rejection message.
|
|
81
|
+
*/
|
|
82
|
+
customerAccounts: CustomerAccountReadPort,
|
|
83
|
+
/** Resolver for the moderation-mode setting. Returns 'auto' or 'manual'. */
|
|
84
|
+
resolveModerationMode: () => Promise<'auto' | 'manual'>,
|
|
85
|
+
/**
|
|
86
|
+
* The transactional-template seam, which is where the language comes from.
|
|
87
|
+
*
|
|
88
|
+
* Defaulted to the no-op rather than made required so a composition that
|
|
89
|
+
* does not wire it keeps sending — silence would be worse than the
|
|
90
|
+
* fallback language, which is the whole argument for keeping the in-code
|
|
91
|
+
* builders below.
|
|
92
|
+
*/
|
|
93
|
+
templateEmail?: OrgTemplateEmail);
|
|
94
|
+
/**
|
|
95
|
+
* Invoked by the `organization.registered.v1` subscriber. When the
|
|
96
|
+
* setting is `auto`, the freshly created org is approved immediately
|
|
97
|
+
* (system actor = null adminUserId). When `manual`, this is a no-op
|
|
98
|
+
* — the org stays in `pending_verification` until an admin acts.
|
|
99
|
+
*/
|
|
100
|
+
handleNewlyRegistered(organizationId: string): Promise<void>;
|
|
101
|
+
approve(organizationId: string, options: ApproveOptions): Promise<Organization>;
|
|
102
|
+
reject(organizationId: string, options: RejectOptions): Promise<Organization>;
|
|
103
|
+
block(organizationId: string, options: BlockOptions): Promise<Organization>;
|
|
104
|
+
unblock(organizationId: string, options: UnblockOptions): Promise<Organization>;
|
|
105
|
+
private transition;
|
|
106
|
+
private notifyCustomer;
|
|
107
|
+
}
|
|
108
|
+
export declare class OrganizationNotFoundError extends Error {
|
|
109
|
+
readonly organizationId: string;
|
|
110
|
+
constructor(organizationId: string);
|
|
111
|
+
}
|
|
112
|
+
export declare class OrganizationVersionMismatchError extends Error {
|
|
113
|
+
readonly organizationId: string;
|
|
114
|
+
readonly expectedVersion: number;
|
|
115
|
+
readonly currentVersion: number;
|
|
116
|
+
constructor(organizationId: string, expectedVersion: number, currentVersion: number);
|
|
117
|
+
}
|
|
118
|
+
export declare class OrganizationStatusGuardError extends Error {
|
|
119
|
+
readonly organizationId: string;
|
|
120
|
+
readonly currentStatus: OrganizationStatus;
|
|
121
|
+
readonly requiredStatus: OrganizationStatus;
|
|
122
|
+
constructor(organizationId: string, currentStatus: OrganizationStatus, requiredStatus: OrganizationStatus);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=organization-moderation-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization-moderation-service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/organization-moderation-service.ts"],"names":[],"mappings":"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"}
|