@endora-commerce/mod-customers 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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/admin/index.d.ts +26 -0
  4. package/dist/admin/index.d.ts.map +1 -0
  5. package/dist/admin/index.js +68 -0
  6. package/dist/admin/index.js.map +1 -0
  7. package/dist/admin/pages/CustomerDetail.d.ts +9 -0
  8. package/dist/admin/pages/CustomerDetail.d.ts.map +1 -0
  9. package/dist/admin/pages/CustomerDetail.js +72 -0
  10. package/dist/admin/pages/CustomerDetail.js.map +1 -0
  11. package/dist/admin/pages/CustomersList.d.ts +9 -0
  12. package/dist/admin/pages/CustomersList.d.ts.map +1 -0
  13. package/dist/admin/pages/CustomersList.js +115 -0
  14. package/dist/admin/pages/CustomersList.js.map +1 -0
  15. package/dist/admin/pages/OnlineCustomers.d.ts +9 -0
  16. package/dist/admin/pages/OnlineCustomers.d.ts.map +1 -0
  17. package/dist/admin/pages/OnlineCustomers.js +77 -0
  18. package/dist/admin/pages/OnlineCustomers.js.map +1 -0
  19. package/dist/admin/panels/HistoryPanels.d.ts +11 -0
  20. package/dist/admin/panels/HistoryPanels.d.ts.map +1 -0
  21. package/dist/admin/panels/HistoryPanels.js +64 -0
  22. package/dist/admin/panels/HistoryPanels.js.map +1 -0
  23. package/dist/admin/panels/ManagementPanels.d.ts +14 -0
  24. package/dist/admin/panels/ManagementPanels.d.ts.map +1 -0
  25. package/dist/admin/panels/ManagementPanels.js +93 -0
  26. package/dist/admin/panels/ManagementPanels.js.map +1 -0
  27. package/dist/backend/entities/customer-address.entity.d.ts +25 -0
  28. package/dist/backend/entities/customer-address.entity.d.ts.map +1 -0
  29. package/dist/backend/entities/customer-address.entity.js +95 -0
  30. package/dist/backend/entities/customer-address.entity.js.map +1 -0
  31. package/dist/backend/index.d.ts +91 -0
  32. package/dist/backend/index.d.ts.map +1 -0
  33. package/dist/backend/index.js +201 -0
  34. package/dist/backend/index.js.map +1 -0
  35. package/dist/backend/plugin.d.ts +168 -0
  36. package/dist/backend/plugin.d.ts.map +1 -0
  37. package/dist/backend/plugin.js +83 -0
  38. package/dist/backend/plugin.js.map +1 -0
  39. package/dist/backend/routes.admin.d.ts +70 -0
  40. package/dist/backend/routes.admin.d.ts.map +1 -0
  41. package/dist/backend/routes.admin.js +313 -0
  42. package/dist/backend/routes.admin.js.map +1 -0
  43. package/dist/backend/routes.register.d.ts +12 -0
  44. package/dist/backend/routes.register.d.ts.map +1 -0
  45. package/dist/backend/routes.register.js +40 -0
  46. package/dist/backend/routes.register.js.map +1 -0
  47. package/dist/backend/routes.self.d.ts +46 -0
  48. package/dist/backend/routes.self.d.ts.map +1 -0
  49. package/dist/backend/routes.self.js +145 -0
  50. package/dist/backend/routes.self.js.map +1 -0
  51. package/dist/backend/serializers.d.ts +13 -0
  52. package/dist/backend/serializers.d.ts.map +1 -0
  53. package/dist/backend/serializers.js +39 -0
  54. package/dist/backend/serializers.js.map +1 -0
  55. package/dist/backend/services/customer-address-read-port.d.ts +29 -0
  56. package/dist/backend/services/customer-address-read-port.d.ts.map +1 -0
  57. package/dist/backend/services/customer-address-read-port.js +53 -0
  58. package/dist/backend/services/customer-address-read-port.js.map +1 -0
  59. package/dist/backend/services/customer-address-service.d.ts +94 -0
  60. package/dist/backend/services/customer-address-service.d.ts.map +1 -0
  61. package/dist/backend/services/customer-address-service.js +176 -0
  62. package/dist/backend/services/customer-address-service.js.map +1 -0
  63. package/dist/backend/services/customer-admin-query-service.d.ts +57 -0
  64. package/dist/backend/services/customer-admin-query-service.d.ts.map +1 -0
  65. package/dist/backend/services/customer-admin-query-service.js +97 -0
  66. package/dist/backend/services/customer-admin-query-service.js.map +1 -0
  67. package/dist/backend/services/customer-authority-service.d.ts +46 -0
  68. package/dist/backend/services/customer-authority-service.d.ts.map +1 -0
  69. package/dist/backend/services/customer-authority-service.js +42 -0
  70. package/dist/backend/services/customer-authority-service.js.map +1 -0
  71. package/dist/backend/services/customer-defaults-service.d.ts +48 -0
  72. package/dist/backend/services/customer-defaults-service.d.ts.map +1 -0
  73. package/dist/backend/services/customer-defaults-service.js +71 -0
  74. package/dist/backend/services/customer-defaults-service.js.map +1 -0
  75. package/dist/backend/services/customer-deletion-service.d.ts +39 -0
  76. package/dist/backend/services/customer-deletion-service.d.ts.map +1 -0
  77. package/dist/backend/services/customer-deletion-service.js +94 -0
  78. package/dist/backend/services/customer-deletion-service.js.map +1 -0
  79. package/dist/backend/services/customer-moderation-service.d.ts +58 -0
  80. package/dist/backend/services/customer-moderation-service.d.ts.map +1 -0
  81. package/dist/backend/services/customer-moderation-service.js +70 -0
  82. package/dist/backend/services/customer-moderation-service.js.map +1 -0
  83. package/dist/backend/services/customer-org-assignment-service.d.ts +52 -0
  84. package/dist/backend/services/customer-org-assignment-service.d.ts.map +1 -0
  85. package/dist/backend/services/customer-org-assignment-service.js +106 -0
  86. package/dist/backend/services/customer-org-assignment-service.js.map +1 -0
  87. package/dist/backend/services/customer-presence-service.d.ts +44 -0
  88. package/dist/backend/services/customer-presence-service.d.ts.map +1 -0
  89. package/dist/backend/services/customer-presence-service.js +47 -0
  90. package/dist/backend/services/customer-presence-service.js.map +1 -0
  91. package/dist/backend/services/customer-registration-service.d.ts +56 -0
  92. package/dist/backend/services/customer-registration-service.d.ts.map +1 -0
  93. package/dist/backend/services/customer-registration-service.js +43 -0
  94. package/dist/backend/services/customer-registration-service.js.map +1 -0
  95. package/dist/backend/workers/anonymization-sweep-worker.d.ts +15 -0
  96. package/dist/backend/workers/anonymization-sweep-worker.d.ts.map +1 -0
  97. package/dist/backend/workers/anonymization-sweep-worker.js +20 -0
  98. package/dist/backend/workers/anonymization-sweep-worker.js.map +1 -0
  99. package/dist/manifest.d.ts +181 -0
  100. package/dist/manifest.d.ts.map +1 -0
  101. package/dist/manifest.js +192 -0
  102. package/dist/manifest.js.map +1 -0
  103. package/dist/migrations/20260611T140404_customers_customer_addresses_init.d.ts +14 -0
  104. package/dist/migrations/20260611T140404_customers_customer_addresses_init.d.ts.map +1 -0
  105. package/dist/migrations/20260611T140404_customers_customer_addresses_init.js +40 -0
  106. package/dist/migrations/20260611T140404_customers_customer_addresses_init.js.map +1 -0
  107. package/dist/migrations/index.d.ts +27 -0
  108. package/dist/migrations/index.d.ts.map +1 -0
  109. package/dist/migrations/index.js +29 -0
  110. package/dist/migrations/index.js.map +1 -0
  111. package/docs/customers.md +108 -0
  112. package/i18n/en.json +94 -0
  113. package/i18n/pl.json +94 -0
  114. package/package.json +101 -0
  115. package/tailwind.css +14 -0
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { Link } from 'react-router-dom';
4
+ import { ApiError, apiClient, formatDateTime } from '@endora-commerce/admin-kit/lib';
5
+ import { Card, CardContent, CardHeader, CardTitle } from '@endora-commerce/admin-kit/ui';
6
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
7
+ /** Generic read-only fetch-on-mount panel for the customer-detail history views. */
8
+ function usePanelData(path, enabled) {
9
+ const t = useTranslation('customers');
10
+ const [rows, setRows] = useState([]);
11
+ const [loading, setLoading] = useState(true);
12
+ const [error, setError] = useState(null);
13
+ const load = useCallback(async () => {
14
+ if (!enabled)
15
+ return;
16
+ setLoading(true);
17
+ setError(null);
18
+ try {
19
+ const res = await apiClient.get(path);
20
+ setRows(res.data);
21
+ }
22
+ catch (err) {
23
+ setError(err instanceof ApiError ? err.envelope.error.message : t('detail.panel.error'));
24
+ }
25
+ finally {
26
+ setLoading(false);
27
+ }
28
+ }, [path, enabled, t]);
29
+ useEffect(() => {
30
+ void load();
31
+ }, [load]);
32
+ return { rows, loading, error };
33
+ }
34
+ export function OrdersPanel({ customerId }) {
35
+ const t = useTranslation('customers');
36
+ const { rows, loading, error } = usePanelData(`/api/v1/admin/customers/${customerId}/orders`, true);
37
+ return (_jsxs(Card, { className: "mb-4", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('detail.orders.title') }) }), _jsx(CardContent, { children: loading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('detail.panel.loading') })) : error ? (_jsx("p", { className: "text-sm text-destructive", children: error })) : rows.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('detail.orders.empty') })) : (_jsx("ul", { className: "divide-y text-sm", children: rows.map((o) => (_jsxs("li", { className: "flex justify-between py-2", children: [_jsx(Link, { to: `/orders/${o.id}`, className: "font-mono underline underline-offset-2", children: o.businessId }), _jsx("span", { children: o.status }), _jsxs("span", { children: [o.total, " ", o.currency] }), _jsx("span", { className: "text-muted-foreground", children: formatDateTime(o.placedAt) })] }, o.id))) })) })] }));
38
+ }
39
+ export function QuoteRequestsPanel({ customerId }) {
40
+ const t = useTranslation('customers');
41
+ const { rows, loading, error } = usePanelData(`/api/v1/admin/customers/${customerId}/quote-requests`, true);
42
+ return (_jsxs(Card, { className: "mb-4", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('detail.rfqs.title') }) }), _jsx(CardContent, { children: loading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('detail.panel.loading') })) : error ? (_jsx("p", { className: "text-sm text-destructive", children: error })) : rows.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('detail.rfqs.empty') })) : (_jsx("ul", { className: "divide-y text-sm", children: rows.map((r) => (_jsxs("li", { className: "flex justify-between py-2", children: [_jsx(Link, { to: `/quote-requests/${r.id}`, className: "font-mono text-xs underline underline-offset-2", children: r.businessId ?? r.id.slice(0, 8) }), _jsx("span", { children: r.status })] }, r.id))) })) })] }));
43
+ }
44
+ export function CartsPanel({ customerId }) {
45
+ const t = useTranslation('customers');
46
+ const [data, setData] = useState(null);
47
+ const [error, setError] = useState(null);
48
+ const load = useCallback(async () => {
49
+ setError(null);
50
+ try {
51
+ const res = await apiClient.get(`/api/v1/admin/customers/${customerId}/carts`);
52
+ setData(res.data);
53
+ }
54
+ catch (err) {
55
+ setError(err instanceof ApiError ? err.envelope.error.message : t('detail.panel.error'));
56
+ }
57
+ }, [customerId, t]);
58
+ useEffect(() => {
59
+ void load();
60
+ }, [load]);
61
+ const renderCart = (c) => (_jsxs("div", { className: "rounded border p-3", children: [_jsxs("p", { className: "mb-2 text-xs text-muted-foreground", children: [c.status, " \u00B7 ", c.items.length, " ", t('detail.carts.items')] }), _jsx("ul", { className: "text-sm", children: c.items.map((it, i) => (_jsxs("li", { className: "flex justify-between py-1", children: [_jsx("span", { className: "font-mono text-xs", children: it.productId.slice(0, 8) }), _jsxs("span", { children: ["\u00D7 ", it.quantity] }), _jsxs("span", { children: [it.unitPrice, " ", it.currency] })] }, `${c.id}-${i}`))) })] }, c.id));
62
+ return (_jsxs(Card, { className: "mb-4", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('detail.carts.title') }) }), _jsx(CardContent, { className: "space-y-3", children: error ? (_jsx("p", { className: "text-sm text-destructive", children: error })) : !data ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('detail.panel.loading') })) : (_jsxs(_Fragment, { children: [data.current ? renderCart(data.current) : (_jsx("p", { className: "text-sm text-muted-foreground", children: t('detail.carts.noCurrent') })), data.abandoned.map(renderCart)] })) })] }));
63
+ }
64
+ //# sourceMappingURL=HistoryPanels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HistoryPanels.js","sourceRoot":"","sources":["../../../src/admin/panels/HistoryPanels.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type ReactNode } from 'react';
2
+ interface CommonProps {
3
+ customerId: string;
4
+ onChanged: () => void;
5
+ }
6
+ export declare function OrganizationAssignmentPanel({ customerId, organizationId, onChanged, }: CommonProps & {
7
+ organizationId: string | null;
8
+ }): ReactNode;
9
+ export declare function CustomerGroupPanel({ customerId, customerGroupId, onChanged, }: CommonProps & {
10
+ customerGroupId: string | null;
11
+ }): ReactNode;
12
+ export declare function AddressesPanel({ customerId, onChanged }: CommonProps): ReactNode;
13
+ export {};
14
+ //# sourceMappingURL=ManagementPanels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ManagementPanels.d.ts","sourceRoot":"","sources":["../../../src/admin/panels/ManagementPanels.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAMzE,UAAU,WAAW;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AA4BD,wBAAgB,2BAA2B,CAAC,EAC1C,UAAU,EACV,cAAc,EACd,SAAS,GACV,EAAE,WAAW,GAAG;IAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,CAmD7D;AAED,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,eAAe,EACf,SAAS,GACV,EAAE,WAAW,GAAG;IAAE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,CA6C9D;AAaD,wBAAgB,cAAc,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,WAAW,GAAG,SAAS,CAkGhF"}
@@ -0,0 +1,93 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { ApiError, apiClient, useUnsavedChangesPrompt } from '@endora-commerce/admin-kit/lib';
4
+ import { Alert, AlertDescription, Button, Card, CardContent, CardHeader, CardTitle, Input, Label, Select } from '@endora-commerce/admin-kit/ui';
5
+ import { OrganizationPicker, CustomerGroupPicker } from '@endora-commerce/admin-kit/components';
6
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
7
+ function useAction(onChanged) {
8
+ const t = useTranslation('customers');
9
+ const [busy, setBusy] = useState(false);
10
+ const [error, setError] = useState(null);
11
+ const run = useCallback(async (fn) => {
12
+ setBusy(true);
13
+ setError(null);
14
+ try {
15
+ await fn();
16
+ onChanged();
17
+ }
18
+ catch (err) {
19
+ setError(err instanceof ApiError ? err.envelope.error.message : t('detail.actionError'));
20
+ }
21
+ finally {
22
+ setBusy(false);
23
+ }
24
+ }, [onChanged, t]);
25
+ return { busy, error, run };
26
+ }
27
+ export function OrganizationAssignmentPanel({ customerId, organizationId, onChanged, }) {
28
+ const t = useTranslation('customers');
29
+ const { busy, error, run } = useAction(onChanged);
30
+ const [orgId, setOrgId] = useState(null);
31
+ return (_jsxs(Card, { className: "mb-4", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('detail.org.title') }) }), _jsxs(CardContent, { className: "space-y-3", children: [error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null, _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "assign-org", children: t('detail.org.assignLabel') }), _jsxs("div", { className: "flex gap-2", children: [_jsx(OrganizationPicker, { id: "assign-org", value: orgId, onChange: setOrgId, className: "flex-1" }), _jsx(Button, { disabled: busy || !orgId, onClick: () => {
32
+ if (!orgId)
33
+ return;
34
+ void run(() => apiClient.post(`/api/v1/admin/customers/${customerId}/organization`, { organizationId: orgId }));
35
+ }, children: t('detail.org.assign') })] })] }), organizationId ? (_jsxs("div", { className: "space-y-1", children: [_jsx(Button, { variant: "outline", disabled: busy, onClick: () => void run(() => apiClient.delete(`/api/v1/admin/customers/${customerId}/organization`)), children: t('detail.org.unassign') }), _jsx("p", { className: "text-sm text-muted-foreground", children: t('detail.org.unassignHint') })] })) : null] })] }));
36
+ }
37
+ export function CustomerGroupPanel({ customerId, customerGroupId, onChanged, }) {
38
+ const t = useTranslation('customers');
39
+ const { busy, error, run } = useAction(onChanged);
40
+ const [groupId, setGroupId] = useState(null);
41
+ return (_jsxs(Card, { className: "mb-4", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('detail.group.title') }) }), _jsxs(CardContent, { className: "space-y-3", children: [error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null, _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "set-group", children: t('detail.group.setLabel') }), _jsxs("div", { className: "flex gap-2", children: [_jsx(CustomerGroupPicker, { id: "set-group", value: groupId, onChange: setGroupId, className: "flex-1" }), _jsx(Button, { disabled: busy || !groupId, onClick: () => {
42
+ if (!groupId)
43
+ return;
44
+ void run(() => apiClient.put(`/api/v1/admin/customers/${customerId}/customer-group`, { customerGroupId: groupId }));
45
+ }, children: t('detail.group.set') })] })] }), customerGroupId ? (_jsx(Button, { variant: "outline", disabled: busy, onClick: () => void run(() => apiClient.put(`/api/v1/admin/customers/${customerId}/customer-group`, { customerGroupId: null })), children: t('detail.group.clear') })) : null] })] }));
46
+ }
47
+ export function AddressesPanel({ customerId, onChanged }) {
48
+ const t = useTranslation('customers');
49
+ const { busy, error, run } = useAction(onChanged);
50
+ const [personal, setPersonal] = useState([]);
51
+ const [form, setForm] = useState({
52
+ kind: 'delivery',
53
+ recipientName: '',
54
+ street: '',
55
+ city: '',
56
+ postalCode: '',
57
+ country: 'PL',
58
+ });
59
+ // Warn before leaving with a partially-filled new-address form.
60
+ useUnsavedChangesPrompt(form.recipientName !== '' ||
61
+ form.street !== '' ||
62
+ form.city !== '' ||
63
+ form.postalCode !== '');
64
+ const load = useCallback(async () => {
65
+ try {
66
+ const res = await apiClient.get(`/api/v1/admin/customers/${customerId}/addresses`);
67
+ setPersonal(res.data.personal);
68
+ }
69
+ catch {
70
+ /* surfaced by useAction on mutations */
71
+ }
72
+ }, [customerId]);
73
+ useEffect(() => {
74
+ void load();
75
+ }, [load]);
76
+ const reload = () => {
77
+ void load();
78
+ onChanged();
79
+ };
80
+ return (_jsxs(Card, { className: "mb-4", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('detail.addresses.title') }) }), _jsxs(CardContent, { className: "space-y-3", children: [error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null, personal.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('detail.addresses.empty') })) : (_jsx("ul", { className: "divide-y text-sm", children: personal.map((a) => (_jsxs("li", { className: "py-2", children: [_jsx("span", { className: "text-muted-foreground", children: a.kind }), " \u00B7 ", a.recipientName, " \u2014 ", a.street, ",", ' ', a.postalCode, " ", a.city, ", ", a.country, a.isDefault ? ` (${t('detail.addresses.default')})` : ''] }, a.id))) })), _jsxs("div", { className: "grid gap-2 sm:grid-cols-2", children: [_jsxs(Select, { value: form.kind, onChange: (e) => setForm({ ...form, kind: e.target.value }), children: [_jsx("option", { value: "delivery", children: "delivery" }), _jsx("option", { value: "billing", children: "billing" })] }), _jsx(Input, { placeholder: t('detail.addresses.recipient'), value: form.recipientName, onChange: (e) => setForm({ ...form, recipientName: e.target.value }) }), _jsx(Input, { placeholder: t('detail.addresses.street'), value: form.street, onChange: (e) => setForm({ ...form, street: e.target.value }) }), _jsx(Input, { placeholder: t('detail.addresses.city'), value: form.city, onChange: (e) => setForm({ ...form, city: e.target.value }) }), _jsx(Input, { placeholder: t('detail.addresses.postal'), value: form.postalCode, onChange: (e) => setForm({ ...form, postalCode: e.target.value }) }), _jsx(Input, { placeholder: t('detail.addresses.country'), value: form.country, maxLength: 2, onChange: (e) => setForm({ ...form, country: e.target.value.toUpperCase() }) })] }), _jsx(Button, { disabled: busy || !form.recipientName || !form.street, onClick: () => void run(async () => {
81
+ await apiClient.post(`/api/v1/admin/customers/${customerId}/addresses`, form);
82
+ setForm({
83
+ kind: 'delivery',
84
+ recipientName: '',
85
+ street: '',
86
+ city: '',
87
+ postalCode: '',
88
+ country: 'PL',
89
+ });
90
+ reload();
91
+ }), children: t('detail.addresses.add') })] })] }));
92
+ }
93
+ //# sourceMappingURL=ManagementPanels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ManagementPanels.js","sourceRoot":"","sources":["../../../src/admin/panels/ManagementPanels.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /**
3
+ * CustomerAddress — a delivery or billing address in a Customer's personal
4
+ * address book (feature 040, US2 / FR-008/FR-038). Works for both org-bound
5
+ * and standalone customers. The partial unique index
6
+ * "one default per (customer, kind)" is enforced in the migration, mirroring
7
+ * the org-level `addresses` table.
8
+ */
9
+ export declare class CustomerAddress {
10
+ [OptionalProps]?: 'id' | 'createdAt' | 'updatedAt' | 'isDefault' | 'phone' | 'deletedAt';
11
+ id: string;
12
+ customerAccountId: string;
13
+ kind: 'delivery' | 'billing';
14
+ recipientName: string;
15
+ street: string;
16
+ city: string;
17
+ postalCode: string;
18
+ country: string;
19
+ phone?: string | null;
20
+ isDefault: boolean;
21
+ createdAt: Date;
22
+ updatedAt: Date;
23
+ deletedAt?: Date | null;
24
+ }
25
+ //# sourceMappingURL=customer-address.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer-address.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/customer-address.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAIrF;;;;;;GAMG;AACH,qBAEa,eAAe;IAC1B,CAAC,aAAa,CAAC,CAAC,EACZ,IAAI,GACJ,WAAW,GACX,WAAW,GACX,WAAW,GACX,OAAO,GACP,WAAW,CAAC;IAGhB,EAAE,EAAE,MAAM,CAAgB;IAI1B,iBAAiB,EAAG,MAAM,CAAC;IAI3B,IAAI,EAAG,UAAU,GAAG,SAAS,CAAC;IAG9B,aAAa,EAAG,MAAM,CAAC;IAGvB,MAAM,EAAG,MAAM,CAAC;IAGhB,IAAI,EAAG,MAAM,CAAC;IAGd,UAAU,EAAG,MAAM,CAAC;IAGpB,OAAO,EAAG,MAAM,CAAC;IAGjB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGtB,SAAS,EAAE,OAAO,CAAS;IAG3B,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB"}
@@ -0,0 +1,95 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, Index, OptionalProps, PrimaryKey, Property } from '@mikro-orm/core';
11
+ import { CustomerScoped } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /**
14
+ * CustomerAddress — a delivery or billing address in a Customer's personal
15
+ * address book (feature 040, US2 / FR-008/FR-038). Works for both org-bound
16
+ * and standalone customers. The partial unique index
17
+ * "one default per (customer, kind)" is enforced in the migration, mirroring
18
+ * the org-level `addresses` table.
19
+ */
20
+ let CustomerAddress = class CustomerAddress {
21
+ [OptionalProps];
22
+ id = randomUUID();
23
+ customerAccountId;
24
+ kind;
25
+ recipientName;
26
+ street;
27
+ city;
28
+ postalCode;
29
+ country;
30
+ phone;
31
+ isDefault = false;
32
+ createdAt = new Date();
33
+ updatedAt = new Date();
34
+ deletedAt;
35
+ };
36
+ __decorate([
37
+ PrimaryKey({ type: 'uuid' }),
38
+ __metadata("design:type", String)
39
+ ], CustomerAddress.prototype, "id", void 0);
40
+ __decorate([
41
+ Property({ type: 'uuid' }),
42
+ Index(),
43
+ __metadata("design:type", String)
44
+ ], CustomerAddress.prototype, "customerAccountId", void 0);
45
+ __decorate([
46
+ Property({ type: 'string', length: 16 }),
47
+ Index(),
48
+ __metadata("design:type", String)
49
+ ], CustomerAddress.prototype, "kind", void 0);
50
+ __decorate([
51
+ Property({ type: 'string', length: 160 }),
52
+ __metadata("design:type", String)
53
+ ], CustomerAddress.prototype, "recipientName", void 0);
54
+ __decorate([
55
+ Property({ type: 'string', length: 255 }),
56
+ __metadata("design:type", String)
57
+ ], CustomerAddress.prototype, "street", void 0);
58
+ __decorate([
59
+ Property({ type: 'string', length: 120 }),
60
+ __metadata("design:type", String)
61
+ ], CustomerAddress.prototype, "city", void 0);
62
+ __decorate([
63
+ Property({ type: 'string', length: 20 }),
64
+ __metadata("design:type", String)
65
+ ], CustomerAddress.prototype, "postalCode", void 0);
66
+ __decorate([
67
+ Property({ type: 'string', length: 2 }),
68
+ __metadata("design:type", String)
69
+ ], CustomerAddress.prototype, "country", void 0);
70
+ __decorate([
71
+ Property({ type: 'string', length: 32, nullable: true }),
72
+ __metadata("design:type", Object)
73
+ ], CustomerAddress.prototype, "phone", void 0);
74
+ __decorate([
75
+ Property({ type: 'boolean' }),
76
+ __metadata("design:type", Boolean)
77
+ ], CustomerAddress.prototype, "isDefault", void 0);
78
+ __decorate([
79
+ Property({ type: 'datetime', onCreate: () => new Date() }),
80
+ __metadata("design:type", Date)
81
+ ], CustomerAddress.prototype, "createdAt", void 0);
82
+ __decorate([
83
+ Property({ type: 'datetime', onUpdate: () => new Date() }),
84
+ __metadata("design:type", Date)
85
+ ], CustomerAddress.prototype, "updatedAt", void 0);
86
+ __decorate([
87
+ Property({ type: 'datetime', nullable: true }),
88
+ __metadata("design:type", Object)
89
+ ], CustomerAddress.prototype, "deletedAt", void 0);
90
+ CustomerAddress = __decorate([
91
+ CustomerScoped(),
92
+ Entity({ tableName: 'customer_addresses' })
93
+ ], CustomerAddress);
94
+ export { CustomerAddress };
95
+ //# sourceMappingURL=customer-address.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer-address.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/customer-address.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;;;;GAMG;AAGI,IAAM,eAAe,GAArB,MAAM,eAAe;IAC1B,CAAC,aAAa,CAAC,CAMC;IAGhB,EAAE,GAAW,UAAU,EAAE,CAAC;IAI1B,iBAAiB,CAAU;IAI3B,IAAI,CAA0B;IAG9B,aAAa,CAAU;IAGvB,MAAM,CAAU;IAGhB,IAAI,CAAU;IAGd,UAAU,CAAU;IAGpB,OAAO,CAAU;IAGjB,KAAK,CAAiB;IAGtB,SAAS,GAAY,KAAK,CAAC;IAG3B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,CAAe;CACzB,CAAA;AAvCC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;2CACH;AAI1B;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,EAAE;;0DACmB;AAI3B;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACxC,KAAK,EAAE;;6CACsB;AAG9B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;sDACnB;AAGvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;+CAC1B;AAGhB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;6CAC5B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;mDACrB;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;;gDACvB;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CACnC;AAGtB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;kDACH;AAG3B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;kDAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;kDAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDACvB;AAhDb,eAAe;IAF3B,cAAc,EAAE;IAChB,MAAM,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;GAC/B,eAAe,CAiD3B"}
@@ -0,0 +1,91 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql';
2
+ import type { AuditPort } from '@endora-commerce/platform/kernel';
3
+ import type { CustomFieldValuePort, EmailMailerPort, RfqCustomerPort } from '@endora-commerce/contracts';
4
+ import type { ModuleContext } from '@endora-commerce/platform/kernel';
5
+ import type { RequireAdminFactory } from '@endora-commerce/platform/kernel';
6
+ import type { SalesChannelResolutionPort } from '@endora-commerce/platform/kernel';
7
+ import type { SettingsReadPort } from '@endora-commerce/platform/kernel';
8
+ import { customersModule, type CustomersModuleOptions } from './plugin.js';
9
+ import { CustomerAddress } from './entities/customer-address.entity.js';
10
+ /**
11
+ * `customers` — three settings reads that only production performed
12
+ * (feature 072, wave 4, T140).
13
+ *
14
+ * `resolveAllowRegistrationWithoutOrganization`, `resolveDeletionRetentionDays`
15
+ * and `resolvePresenceFreshnessMinutes` all read this module's own settings
16
+ * against the system-default channel. Production spelled each as an inline
17
+ * try/catch closure; the harness passed `async () => 365` and
18
+ * `async () => 10` for the last two, and a **bare string literal** for the
19
+ * first where production used `CUSTOMERS_SETTING_CODES`.
20
+ *
21
+ * The retention one matters beyond tidiness. It is how long a deleted
22
+ * customer's data survives before the anonymization sweep makes the deletion
23
+ * irreversible — a GDPR-facing number an operator configures — and the read was
24
+ * exercised by nothing. A regression in the read, in the channel resolution, or
25
+ * in the schema shipped green. Third instance of this exact shape after
26
+ * `inventory` (T129) and `shopping_lists` (T133).
27
+ *
28
+ * All three are read here now, through the settings port, against the resolved
29
+ * system-default channel. Both compositions run the same code.
30
+ *
31
+ * **The VAT validator is `organizations`' to supply** (feature 076, D-86).
32
+ * This module used to construct `new ViesClient()` from an import of that
33
+ * module's `integrations/` directory, over a contribution point of its own —
34
+ * a statement that `customers` knows how the platform talks to VIES. It does
35
+ * not. `organizations` publishes `vatValidatorPort` over the same object its
36
+ * own tax-ID service uses, so the fake a harness contributes reaches both
37
+ * consumers by construction rather than by two roots agreeing to pass it —
38
+ * which is what the note this paragraph replaces claimed and the mechanism did
39
+ * not deliver.
40
+ *
41
+ * Two names stay a composition's, both actor-shaped and both owned by `auth` in
42
+ * principle: who the calling customer is, and who the moderating admin is. They
43
+ * join the four `auth` entries already in `HOST_REGISTERED_PORTS` and drain with
44
+ * them. The order-list getter used to be a third: it was late-bound because
45
+ * `orders` builds the service inside its plugin body and a root bridged the
46
+ * accessor. Feature 075's cut resolves `orderListPort` instead — the port keeps
47
+ * that timing and answers a too-early call with a 503, so the late binding is
48
+ * the owner's problem rather than a name two roots have to agree on.
49
+ */
50
+ /** What `customers` resolves from the container, and the names it owns. */
51
+ export interface CustomersCradle {
52
+ readonly emFactory: () => EntityManager;
53
+ readonly auditLogService: AuditPort;
54
+ readonly settingsReadPort: SettingsReadPort;
55
+ readonly salesChannelResolutionPort: SalesChannelResolutionPort;
56
+ readonly requireAdmin: RequireAdminFactory;
57
+ readonly requireCustomer: CustomersModuleOptions['requireCustomer'];
58
+ readonly customerAuthService: CustomersModuleOptions['customerAuthService'];
59
+ readonly passwordResetService: CustomersModuleOptions['passwordResetService'];
60
+ readonly customFieldValueService: CustomFieldValuePort;
61
+ readonly rfqService: RfqCustomerPort;
62
+ /** Owned by `organizations`: which organizations a staff member may act on. */
63
+ readonly organizationSalesRepScopePort: CustomersModuleOptions['salesRepVisibility'];
64
+ readonly emailMailer: EmailMailerPort;
65
+ /** The storefront origin the set-password link points at. */
66
+ readonly storefrontBaseUrl: string;
67
+ /** Root-shaped, owner `auth`: who is asking, with a nullable organisation. */
68
+ readonly customerActorResolver: CustomersModuleOptions['resolveCustomerActor'];
69
+ /**
70
+ * The moderating admin and the scope they see, defaulted by this module since
71
+ * `specs/117-instance-bring-up/` Phase 6 — see `registerModerationActor`
72
+ * below. A root that answers differently still contributes over it; the test
73
+ * harness does.
74
+ */
75
+ readonly customerModerationActorResolver: CustomersModuleOptions['resolveModerationActor'];
76
+ readonly customers: ReturnType<typeof customersModule>;
77
+ }
78
+ export declare function registerModule(ctx: ModuleContext): void;
79
+ /**
80
+ * The module's persisted entity classes, on the `./backend` subpath, as one
81
+ * array and **no named class export** (D-168).
82
+ *
83
+ * This is the shape the platform reads when the package is *installed*: the
84
+ * boot-time loader (`src/packages/package-runtime.ts`, `exported['entities']`)
85
+ * and the static declaration reader (`scripts/lib/package-declarations.ts`),
86
+ * which is the third source of `check:module-boundary`'s `table→owner` map and
87
+ * the package pass of `check-entity-tenant-classification`. A missing array is
88
+ * answered with `[]` — zero entities registered, no error anywhere.
89
+ */
90
+ export declare const entities: (typeof CustomerAddress)[];
91
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAGlE,OAAO,KAAK,EAQV,oBAAoB,EASpB,eAAe,EAMf,eAAe,EAGhB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AACnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,aAAa,CAAC;IACxC,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAC;IACpC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,0BAA0B,EAAE,0BAA0B,CAAC;IAChE,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;IACpE,QAAQ,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,qBAAqB,CAAC,CAAC;IAC5E,QAAQ,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,sBAAsB,CAAC,CAAC;IAC9E,QAAQ,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;IACvD,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,+EAA+E;IAC/E,QAAQ,CAAC,6BAA6B,EAAE,sBAAsB,CAAC,oBAAoB,CAAC,CAAC;IACrF,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,6DAA6D;IAC7D,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,8EAA8E;IAC9E,QAAQ,CAAC,qBAAqB,EAAE,sBAAsB,CAAC,sBAAsB,CAAC,CAAC;IAC/E;;;;;OAKG;IACH,QAAQ,CAAC,+BAA+B,EAAE,sBAAsB,CAAC,wBAAwB,CAAC,CAAC;IAC3F,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;CACxD;AAoDD,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAkLvD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,4BAEpB,CAAC"}