@unchainedshop/core 5.0.0-alpha.5 → 5.0.0-alpha.8

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 (56) hide show
  1. package/README.md +92 -546
  2. package/lib/bulk-importer/handlers/product/create.d.ts +132 -29
  3. package/lib/bulk-importer/handlers/product/create.js +31 -14
  4. package/lib/bulk-importer/handlers/product/update.d.ts +60 -30
  5. package/lib/bulk-importer/handlers/product/update.js +5 -48
  6. package/lib/core-index.d.ts +1 -2
  7. package/lib/core-index.js +2 -18
  8. package/lib/directors/BaseDiscountAdapter.d.ts +3 -0
  9. package/lib/directors/BaseDiscountDirector.d.ts +2 -2
  10. package/lib/directors/BaseDiscountDirector.js +7 -9
  11. package/lib/directors/BasePricingDirector.d.ts +2 -2
  12. package/lib/directors/BasePricingDirector.js +3 -6
  13. package/lib/directors/DeliveryDirector.d.ts +1 -1
  14. package/lib/directors/DeliveryDirector.js +2 -12
  15. package/lib/directors/DeliveryPricingDirector.js +1 -10
  16. package/lib/directors/EnrollmentAdapter.js +0 -1
  17. package/lib/directors/EnrollmentDirector.d.ts +1 -1
  18. package/lib/directors/EnrollmentDirector.js +3 -15
  19. package/lib/directors/FileDirector.d.ts +4 -4
  20. package/lib/directors/FileDirector.js +2 -13
  21. package/lib/directors/FilterDirector.d.ts +1 -1
  22. package/lib/directors/FilterDirector.js +2 -14
  23. package/lib/directors/OrderDiscountDirector.d.ts +1 -15
  24. package/lib/directors/OrderDiscountDirector.js +1 -13
  25. package/lib/directors/OrderPricingDirector.js +1 -10
  26. package/lib/directors/OrderPricingSheet.d.ts +1 -0
  27. package/lib/directors/OrderPricingSheet.js +17 -17
  28. package/lib/directors/PaymentDirector.d.ts +1 -1
  29. package/lib/directors/PaymentDirector.js +2 -12
  30. package/lib/directors/PaymentPricingDirector.js +1 -10
  31. package/lib/directors/ProductDiscountDirector.d.ts +1 -15
  32. package/lib/directors/ProductDiscountDirector.js +1 -13
  33. package/lib/directors/ProductPricingDirector.js +1 -10
  34. package/lib/directors/QuotationDirector.d.ts +1 -1
  35. package/lib/directors/QuotationDirector.js +2 -14
  36. package/lib/directors/WarehousingDirector.js +16 -34
  37. package/lib/directors/WorkerDirector.d.ts +1 -1
  38. package/lib/directors/WorkerDirector.js +2 -14
  39. package/lib/directors/registryDirector.d.ts +2 -0
  40. package/lib/directors/registryDirector.js +6 -0
  41. package/lib/factory/registerVirtualWarehousing.js +1 -1
  42. package/lib/plugins/PluginRegistry.d.ts +1 -0
  43. package/lib/plugins/PluginRegistry.js +8 -1
  44. package/lib/services/checkoutOrder.js +4 -0
  45. package/lib/services/index.d.ts +2 -1
  46. package/lib/services/index.js +2 -1
  47. package/lib/services/reserveOrderDiscountsForCheckout.d.ts +5 -0
  48. package/lib/services/reserveOrderDiscountsForCheckout.js +34 -0
  49. package/lib/services/simulateProductDispatching.d.ts +3 -1
  50. package/lib/services/simulateProductDispatching.js +3 -3
  51. package/lib/services/simulateProductInventory.d.ts +3 -1
  52. package/lib/services/simulateProductInventory.js +3 -3
  53. package/lib/services/supportedDeliveryProviders.js +9 -0
  54. package/lib/services/supportedPaymentProviders.js +9 -0
  55. package/lib/services/supportedWarehousingProviders.js +9 -0
  56. package/package.json +22 -22
@@ -1,19 +1,17 @@
1
- import { BaseDirector } from '@unchainedshop/utils';
2
- export const BaseDiscountDirector = (directorName) => {
3
- const baseDirector = BaseDirector(directorName, {
4
- adapterSortKey: 'orderIndex',
5
- });
1
+ import { registryDirector } from "./registryDirector.js";
2
+ export const BaseDiscountDirector = (adapterType) => {
6
3
  const director = {
7
- ...baseDirector,
4
+ ...registryDirector(adapterType),
8
5
  actions: async function (discountContext, unchainedAPI) {
9
6
  const context = { ...discountContext, ...unchainedAPI };
10
7
  return {
11
8
  resolveDiscountAdapterFromStaticCode: async (options) => {
12
9
  if (!context.order)
13
10
  return null;
14
- const discounts = await Promise.all(this.getAdapters()
15
- .filter((Adapter) => Adapter.isManualAdditionAllowed(options?.code))
16
- .map(async (Adapter) => {
11
+ const discounts = await Promise.all(this.getAdapters().map(async (Adapter) => {
12
+ if (!(await Adapter.isManualAdditionAllowed(options?.code))) {
13
+ return { Adapter, isValid: false };
14
+ }
17
15
  const adapter = await Adapter.actions({ context });
18
16
  return {
19
17
  Adapter,
@@ -1,4 +1,4 @@
1
- import { type IBaseDirector, type PricingCalculation } from '@unchainedshop/utils';
1
+ import type { IBaseDirector, PricingCalculation } from '@unchainedshop/utils';
2
2
  import type { BasePricingAdapterContext, BasePricingContext, IPricingAdapter } from './BasePricingAdapter.ts';
3
3
  import type { IPricingSheet } from './BasePricingSheet.ts';
4
4
  import type { Modules } from '../modules.ts';
@@ -13,4 +13,4 @@ export type IPricingDirector<PricingContext extends BasePricingContext, Calculat
13
13
  rebuildCalculation: (pricingContext: PricingContext, unchainedAPI: Context) => Promise<Calculation[]>;
14
14
  calculationSheet: (pricingContext: PricingContext, calculation: Calculation[]) => PricingAdapterSheet;
15
15
  };
16
- export declare const BasePricingDirector: <DirectorContext extends BasePricingContext, AdapterContext extends BasePricingAdapterContext, Calculation extends PricingCalculation, PricingAdapter extends IPricingAdapter<AdapterContext, Calculation, IPricingSheet<Calculation>>>(directorName: string) => IPricingDirector<DirectorContext, Calculation, AdapterContext, IPricingSheet<Calculation>, PricingAdapter>;
16
+ export declare const BasePricingDirector: <DirectorContext extends BasePricingContext, AdapterContext extends BasePricingAdapterContext, Calculation extends PricingCalculation, PricingAdapter extends IPricingAdapter<AdapterContext, Calculation, IPricingSheet<Calculation>>>(adapterType: symbol) => IPricingDirector<DirectorContext, Calculation, AdapterContext, IPricingSheet<Calculation>, PricingAdapter>;
@@ -1,13 +1,10 @@
1
- import { BaseDirector } from '@unchainedshop/utils';
2
1
  import { OrderDiscountDirector } from "./OrderDiscountDirector.js";
2
+ import { registryDirector } from "./registryDirector.js";
3
3
  import { createLogger } from '@unchainedshop/logger';
4
4
  const logger = createLogger('unchained:core');
5
- export const BasePricingDirector = (directorName) => {
6
- const baseDirector = BaseDirector(directorName, {
7
- adapterSortKey: 'orderIndex',
8
- });
5
+ export const BasePricingDirector = (adapterType) => {
9
6
  const director = {
10
- ...baseDirector,
7
+ ...registryDirector(adapterType),
11
8
  buildPricingContext: async () => {
12
9
  throw new Error('Method not implemented');
13
10
  },
@@ -1,4 +1,4 @@
1
- import { type IBaseDirector } from '@unchainedshop/utils';
1
+ import type { IBaseDirector } from '@unchainedshop/utils';
2
2
  import { type DeliveryAdapterActions, type DeliveryContext, type IDeliveryAdapter } from './DeliveryAdapter.ts';
3
3
  import type { DeliveryProvider } from '@unchainedshop/core-delivery';
4
4
  import { type Order } from '@unchainedshop/core-orders';
@@ -1,20 +1,10 @@
1
- import { BaseDirector } from '@unchainedshop/utils';
2
1
  import { DeliveryError, DeliveryAdapter, } from "./DeliveryAdapter.js";
3
2
  import { OrderDeliveryStatus } from '@unchainedshop/core-orders';
4
3
  import { createLogger } from '@unchainedshop/logger';
5
- import { pluginRegistry } from "../plugins/PluginRegistry.js";
4
+ import { registryDirector } from "./registryDirector.js";
6
5
  const logger = createLogger('unchained:core');
7
- const baseDirector = BaseDirector('DeliveryDirector');
8
6
  export const DeliveryDirector = {
9
- ...baseDirector,
10
- getAdapter: (key) => {
11
- const adapters = pluginRegistry.getAdapters(DeliveryAdapter.adapterType);
12
- return adapters.find((adapter) => adapter.key === key) || null;
13
- },
14
- getAdapters: ({ adapterFilter } = {}) => {
15
- const adapters = pluginRegistry.getAdapters(DeliveryAdapter.adapterType);
16
- return adapters.filter(adapterFilter || (() => true));
17
- },
7
+ ...registryDirector(DeliveryAdapter.adapterType),
18
8
  actions: async (deliveryProvider, deliveryContext, unchainedAPI) => {
19
9
  const Adapter = DeliveryDirector.getAdapter(deliveryProvider.adapterKey);
20
10
  if (!Adapter) {
@@ -1,18 +1,9 @@
1
1
  import { DeliveryPricingSheet } from "./DeliveryPricingSheet.js";
2
2
  import { BasePricingDirector } from "./BasePricingDirector.js";
3
3
  import { DeliveryPricingAdapter, } from "./DeliveryPricingAdapter.js";
4
- import { pluginRegistry } from "../plugins/PluginRegistry.js";
5
- const baseDirector = BasePricingDirector('DeliveryPricingDirector');
4
+ const baseDirector = BasePricingDirector(DeliveryPricingAdapter.adapterType);
6
5
  export const DeliveryPricingDirector = {
7
6
  ...baseDirector,
8
- getAdapter: (key) => {
9
- const adapters = pluginRegistry.getAdapters(DeliveryPricingAdapter.adapterType);
10
- return adapters.find((adapter) => adapter.key === key) || null;
11
- },
12
- getAdapters: ({ adapterFilter } = {}) => {
13
- const adapters = pluginRegistry.getAdapters(DeliveryPricingAdapter.adapterType);
14
- return adapters.filter(adapterFilter || (() => true));
15
- },
16
7
  async buildPricingContext(context, unchainedAPI) {
17
8
  const { modules } = unchainedAPI;
18
9
  if ('item' in context) {
@@ -24,7 +24,6 @@ export const EnrollmentAdapter = {
24
24
  },
25
25
  transformOrderItemToEnrollmentPlan: async (item) => {
26
26
  return {
27
- configuration: item.configuration,
28
27
  productId: item.productId,
29
28
  quantity: item.quantity,
30
29
  };
@@ -1,4 +1,4 @@
1
- import { type IBaseDirector } from '@unchainedshop/utils';
1
+ import type { IBaseDirector } from '@unchainedshop/utils';
2
2
  import type { EnrollmentAdapterActions, EnrollmentContext, IEnrollmentAdapter } from './EnrollmentAdapter.ts';
3
3
  import type { OrderPosition } from '@unchainedshop/core-orders';
4
4
  import type { Product } from '@unchainedshop/core-products';
@@ -1,11 +1,7 @@
1
- import { BaseDirector } from '@unchainedshop/utils';
2
1
  import { EnrollmentAdapter } from "./EnrollmentAdapter.js";
3
2
  import { createLogger } from '@unchainedshop/logger';
4
- import { pluginRegistry } from "../plugins/PluginRegistry.js";
3
+ import { registryDirector } from "./registryDirector.js";
5
4
  const logger = createLogger('unchained:core');
6
- const baseDirector = BaseDirector('EnrollmentDirector', {
7
- adapterSortKey: 'orderIndex',
8
- });
9
5
  const findAppropriateAdapters = (productPlan) => EnrollmentDirector.getAdapters({
10
6
  adapterFilter: (Adapter) => {
11
7
  const activated = Adapter.isActivatedFor(productPlan);
@@ -16,15 +12,7 @@ const findAppropriateAdapters = (productPlan) => EnrollmentDirector.getAdapters(
16
12
  },
17
13
  });
18
14
  export const EnrollmentDirector = {
19
- ...baseDirector,
20
- getAdapter: (key) => {
21
- const adapters = pluginRegistry.getAdapters(EnrollmentAdapter.adapterType);
22
- return adapters.find((adapter) => adapter.key === key) || null;
23
- },
24
- getAdapters: ({ adapterFilter } = {}) => {
25
- const adapters = pluginRegistry.getAdapters(EnrollmentAdapter.adapterType);
26
- return adapters.filter(adapterFilter || (() => true));
27
- },
15
+ ...registryDirector(EnrollmentAdapter.adapterType),
28
16
  transformOrderItemToEnrollment: async ({ orderPosition, product }, doc, unchainedAPI) => {
29
17
  const Adapter = findAppropriateAdapters(product.plan)?.[0];
30
18
  if (!Adapter) {
@@ -34,7 +22,7 @@ export const EnrollmentDirector = {
34
22
  return {
35
23
  ...doc,
36
24
  ...enrollmentPlan,
37
- configuration: [],
25
+ configuration: enrollmentPlan.configuration ?? [],
38
26
  };
39
27
  },
40
28
  actions: async (enrollmentContext, unchainedAPI) => {
@@ -1,10 +1,10 @@
1
1
  import type { IFileAdapter, UploadedFile } from '@unchainedshop/core-files';
2
2
  export type UploadFileCallback<UnchainedAPI = unknown> = (file: UploadedFile, unchainedAPI: UnchainedAPI) => Promise<void>;
3
3
  export declare const FileDirector: {
4
- getAdapter: (key: string) => IFileAdapter<unknown> | null;
5
- getAdapters: (options?: {
6
- adapterFilter?: (adapter: IFileAdapter) => boolean;
7
- }) => IFileAdapter<unknown>[];
8
4
  registerFileUploadCallback<UnchainedAPI>(directoryName: string, fn: UploadFileCallback<UnchainedAPI>): void;
9
5
  getFileUploadCallback(directoryName: string): UploadFileCallback<unknown> | null;
6
+ getAdapters: (options?: {
7
+ adapterFilter?: ((adapter: IFileAdapter<unknown>) => boolean) | undefined;
8
+ } | undefined) => IFileAdapter<unknown>[];
9
+ getAdapter: (key: string) => IFileAdapter<unknown> | null;
10
10
  };
@@ -1,19 +1,8 @@
1
- import { BaseDirector } from '@unchainedshop/utils';
2
1
  import { FileAdapter } from '@unchainedshop/core-files';
3
- import { pluginRegistry } from "../plugins/PluginRegistry.js";
2
+ import { registryDirector } from "./registryDirector.js";
4
3
  const FileUploadRegistry = new Map();
5
- const baseDirector = BaseDirector('FileDirector');
6
4
  export const FileDirector = {
7
- ...baseDirector,
8
- getAdapter: (key) => {
9
- const adapters = pluginRegistry.getAdapters(FileAdapter.adapterType);
10
- return adapters.find((adapter) => adapter.key === key) || null;
11
- },
12
- getAdapters: (options) => {
13
- const { adapterFilter } = options || {};
14
- const adapters = pluginRegistry.getAdapters(FileAdapter.adapterType);
15
- return adapters.filter(adapterFilter || (() => true));
16
- },
5
+ ...registryDirector(FileAdapter.adapterType),
17
6
  registerFileUploadCallback(directoryName, fn) {
18
7
  if (!FileUploadRegistry.has(directoryName)) {
19
8
  FileUploadRegistry.set(directoryName, fn);
@@ -1,4 +1,4 @@
1
- import { type IBaseDirector } from '@unchainedshop/utils';
1
+ import type { IBaseDirector } from '@unchainedshop/utils';
2
2
  import type { FilterAdapterActions, FilterContext, IFilterAdapter } from './FilterAdapter.ts';
3
3
  import { type Filter, type SearchConfiguration, type SearchFilterQuery, type SearchQuery } from '@unchainedshop/core-filters';
4
4
  import type { Modules } from '../modules.ts';
@@ -1,25 +1,13 @@
1
1
  import { mongodb } from '@unchainedshop/mongodb';
2
- import { BaseDirector } from '@unchainedshop/utils';
3
2
  import { filterCacheGeneration, filtersSettings, FilterType, } from '@unchainedshop/core-filters';
4
- import { pluginRegistry } from "../plugins/PluginRegistry.js";
3
+ import { registryDirector } from "./registryDirector.js";
5
4
  import { FilterAdapter } from "./FilterAdapter.js";
6
5
  export const parseQueryArray = (query) => (query || []).reduce((accumulator, { key, value }) => ({
7
6
  ...accumulator,
8
7
  [key]: accumulator[key] ? accumulator[key].concat(value) : [value],
9
8
  }), {});
10
- const baseDirector = BaseDirector('FilterDirector', {
11
- adapterSortKey: 'orderIndex',
12
- });
13
9
  export const FilterDirector = {
14
- ...baseDirector,
15
- getAdapter: (key) => {
16
- const adapters = pluginRegistry.getAdapters(FilterAdapter.adapterType);
17
- return adapters.find((adapter) => adapter.key === key) || null;
18
- },
19
- getAdapters: ({ adapterFilter } = {}) => {
20
- const adapters = pluginRegistry.getAdapters(FilterAdapter.adapterType);
21
- return adapters.filter(adapterFilter || (() => true));
22
- },
10
+ ...registryDirector(FilterAdapter.adapterType),
23
11
  actions: async (filterContext, unchainedAPI) => {
24
12
  const context = { ...filterContext, ...unchainedAPI };
25
13
  const adapters = FilterDirector.getAdapters().map((Adapter) => Adapter.actions(context));
@@ -1,16 +1,2 @@
1
- import type { IDiscountAdapter } from './BaseDiscountAdapter.ts';
2
1
  import type { OrderDiscountConfiguration } from './OrderDiscountConfiguration.ts';
3
- export declare const OrderDiscountDirector: {
4
- getAdapter: (key: string) => IDiscountAdapter<OrderDiscountConfiguration> | null;
5
- getAdapters: (options?: {
6
- adapterFilter?: (adapter: any) => boolean;
7
- }) => IDiscountAdapter<OrderDiscountConfiguration>[];
8
- actions: (discountContext: import("./BaseDiscountAdapter.ts").DiscountContext, unchainedAPI: {
9
- modules: import("../modules.ts").Modules;
10
- }) => Promise<{
11
- resolveDiscountAdapterFromStaticCode: (params: {
12
- code: string;
13
- }) => Promise<IDiscountAdapter<OrderDiscountConfiguration> | null>;
14
- findSystemDiscounts: () => Promise<string[]>;
15
- }>;
16
- };
2
+ export declare const OrderDiscountDirector: import("./BaseDiscountDirector.ts").IDiscountDirector<OrderDiscountConfiguration>;
@@ -1,15 +1,3 @@
1
1
  import { BaseDiscountDirector } from "./BaseDiscountDirector.js";
2
2
  import { OrderDiscountAdapter } from "./OrderDiscountAdapter.js";
3
- import { pluginRegistry } from "../plugins/PluginRegistry.js";
4
- const baseDirector = BaseDiscountDirector('OrderDiscountDirector');
5
- export const OrderDiscountDirector = {
6
- ...baseDirector,
7
- getAdapter: (key) => {
8
- const adapters = pluginRegistry.getAdapters(OrderDiscountAdapter.adapterType);
9
- return adapters.find((adapter) => adapter.key === key) || null;
10
- },
11
- getAdapters: (options) => {
12
- const adapters = pluginRegistry.getAdapters(OrderDiscountAdapter.adapterType);
13
- return adapters.filter(options?.adapterFilter || (() => true));
14
- },
15
- };
3
+ export const OrderDiscountDirector = BaseDiscountDirector(OrderDiscountAdapter.adapterType);
@@ -1,18 +1,9 @@
1
1
  import { OrderPricingSheet, } from "./OrderPricingSheet.js";
2
2
  import { OrderPricingAdapter, } from "./OrderPricingAdapter.js";
3
3
  import { BasePricingDirector } from "./BasePricingDirector.js";
4
- import { pluginRegistry } from "../plugins/PluginRegistry.js";
5
- const baseDirector = BasePricingDirector('OrderPricingDirector');
4
+ const baseDirector = BasePricingDirector(OrderPricingAdapter.adapterType);
6
5
  export const OrderPricingDirector = {
7
6
  ...baseDirector,
8
- getAdapter: (key) => {
9
- const adapters = pluginRegistry.getAdapters(OrderPricingAdapter.adapterType);
10
- return adapters.find((adapter) => adapter.key === key) || null;
11
- },
12
- getAdapters: ({ adapterFilter } = {}) => {
13
- const adapters = pluginRegistry.getAdapters(OrderPricingAdapter.adapterType);
14
- return adapters.filter(adapterFilter || (() => true));
15
- },
16
7
  buildPricingContext: async (context, unchainedAPI) => {
17
8
  const { modules } = unchainedAPI;
18
9
  const { order, currencyCode } = context;
@@ -33,5 +33,6 @@ export interface IOrderPricingSheet extends IPricingSheet<OrderPricingCalculatio
33
33
  taxAmount: number;
34
34
  meta?: any;
35
35
  }) => void;
36
+ discountSum: (discountId?: string) => number;
36
37
  }
37
38
  export declare const OrderPricingSheet: (params: PricingSheetParams<OrderPricingCalculation>) => IOrderPricingSheet;
@@ -15,6 +15,7 @@ export const OrderPricingSheet = (params) => {
15
15
  amount: taxAmount,
16
16
  baseCategory: category,
17
17
  discountId,
18
+ isNetPrice: false,
18
19
  meta,
19
20
  });
20
21
  }
@@ -25,6 +26,7 @@ export const OrderPricingSheet = (params) => {
25
26
  basePricingSheet.calculation.push({
26
27
  category: OrderPricingRowCategory.Items,
27
28
  amount,
29
+ isNetPrice: true,
28
30
  meta,
29
31
  });
30
32
  addTaxIfAvailabile(OrderPricingRowCategory.Items, taxAmount, meta);
@@ -34,6 +36,7 @@ export const OrderPricingSheet = (params) => {
34
36
  category: OrderPricingRowCategory.Discounts,
35
37
  amount,
36
38
  discountId,
39
+ isNetPrice: true,
37
40
  meta,
38
41
  });
39
42
  addTaxIfAvailabile(OrderPricingRowCategory.Discounts, taxAmount, meta, discountId);
@@ -42,6 +45,7 @@ export const OrderPricingSheet = (params) => {
42
45
  basePricingSheet.calculation.push({
43
46
  category: OrderPricingRowCategory.Delivery,
44
47
  amount,
48
+ isNetPrice: true,
45
49
  meta,
46
50
  });
47
51
  addTaxIfAvailabile(OrderPricingRowCategory.Delivery, taxAmount, meta);
@@ -50,6 +54,7 @@ export const OrderPricingSheet = (params) => {
50
54
  basePricingSheet.calculation.push({
51
55
  category: OrderPricingRowCategory.Payment,
52
56
  amount,
57
+ isNetPrice: true,
53
58
  meta,
54
59
  });
55
60
  addTaxIfAvailabile(OrderPricingRowCategory.Payment, taxAmount, meta);
@@ -60,20 +65,11 @@ export const OrderPricingSheet = (params) => {
60
65
  ...(filter || {}),
61
66
  });
62
67
  },
63
- gross() {
64
- return basePricingSheet.sum() - this.taxSum();
65
- },
66
- net() {
67
- return basePricingSheet.sum() - this.taxSum() - this.taxSum();
68
- },
69
- total({ category, useNetPrice, discountId } = { useNetPrice: false }) {
70
- const taxAmount = this.taxSum({ baseCategory: category, discountId });
71
- const amount = this.sum({ category, discountId }) - taxAmount;
72
- const netAmount = !category ? amount - taxAmount : amount;
73
- return {
74
- amount: Math.round(useNetPrice ? netAmount : netAmount + taxAmount),
75
- currencyCode: this.currencyCode,
76
- };
68
+ discountSum(discountId) {
69
+ return basePricingSheet.sum({
70
+ category: OrderPricingRowCategory.Discounts,
71
+ discountId,
72
+ });
77
73
  },
78
74
  discountPrices(explicitDiscountId) {
79
75
  const discountIds = pricingSheet
@@ -85,17 +81,21 @@ export const OrderPricingSheet = (params) => {
85
81
  .filter(Boolean);
86
82
  return [...new Set(discountIds)]
87
83
  .map((discountId) => {
88
- const amount = basePricingSheet.sum({
84
+ const amount = pricingSheet.sum({
89
85
  category: OrderPricingRowCategory.Discounts,
90
86
  discountId,
91
- });
87
+ }) +
88
+ pricingSheet.taxSum({
89
+ baseCategory: OrderPricingRowCategory.Discounts,
90
+ discountId,
91
+ });
92
92
  if (!amount) {
93
93
  return null;
94
94
  }
95
95
  return {
96
96
  discountId,
97
97
  amount: Math.round(amount),
98
- currencyCode: basePricingSheet.currencyCode,
98
+ currencyCode: pricingSheet.currencyCode,
99
99
  };
100
100
  })
101
101
  .filter(Boolean);
@@ -1,4 +1,4 @@
1
- import { type IBaseDirector } from '@unchainedshop/utils';
1
+ import type { IBaseDirector } from '@unchainedshop/utils';
2
2
  import { type IPaymentActions, type IPaymentAdapter, type PaymentContext } from './PaymentAdapter.ts';
3
3
  import type { PaymentProvider } from '@unchainedshop/core-payment';
4
4
  import { type Order, type OrderPayment } from '@unchainedshop/core-orders';
@@ -1,8 +1,7 @@
1
- import { BaseDirector } from '@unchainedshop/utils';
2
1
  import { createLogger } from '@unchainedshop/logger';
3
2
  import { PaymentError, PaymentAdapter, } from "./PaymentAdapter.js";
4
3
  import { OrderPaymentStatus } from '@unchainedshop/core-orders';
5
- import { pluginRegistry } from "../plugins/PluginRegistry.js";
4
+ import { registryDirector } from "./registryDirector.js";
6
5
  const buildPaymentProviderActionsContext = (orderPayment, { transactionContext, ...rest }) => ({
7
6
  ...rest,
8
7
  orderPayment,
@@ -12,17 +11,8 @@ const buildPaymentProviderActionsContext = (orderPayment, { transactionContext,
12
11
  },
13
12
  });
14
13
  const logger = createLogger('unchained:core:payment');
15
- const baseDirector = BaseDirector('PaymentDirector');
16
14
  export const PaymentDirector = {
17
- ...baseDirector,
18
- getAdapter: (key) => {
19
- const adapters = pluginRegistry.getAdapters(PaymentAdapter.adapterType);
20
- return adapters.find((adapter) => adapter.key === key) || null;
21
- },
22
- getAdapters: ({ adapterFilter } = {}) => {
23
- const adapters = pluginRegistry.getAdapters(PaymentAdapter.adapterType);
24
- return adapters.filter(adapterFilter || (() => true));
25
- },
15
+ ...registryDirector(PaymentAdapter.adapterType),
26
16
  actions: async (paymentProvider, paymentContext, unchainedAPI) => {
27
17
  const Adapter = PaymentDirector.getAdapter(paymentProvider.adapterKey);
28
18
  if (!Adapter) {
@@ -1,18 +1,9 @@
1
1
  import { BasePricingDirector } from "./BasePricingDirector.js";
2
2
  import { PaymentPricingAdapter, } from "./PaymentPricingAdapter.js";
3
3
  import { PaymentPricingSheet } from "./PaymentPricingSheet.js";
4
- import { pluginRegistry } from "../plugins/PluginRegistry.js";
5
- const baseDirector = BasePricingDirector('PaymentPricingDirector');
4
+ const baseDirector = BasePricingDirector(PaymentPricingAdapter.adapterType);
6
5
  export const PaymentPricingDirector = {
7
6
  ...baseDirector,
8
- getAdapter: (key) => {
9
- const adapters = pluginRegistry.getAdapters(PaymentPricingAdapter.adapterType);
10
- return adapters.find((adapter) => adapter.key === key) || null;
11
- },
12
- getAdapters: ({ adapterFilter } = {}) => {
13
- const adapters = pluginRegistry.getAdapters(PaymentPricingAdapter.adapterType);
14
- return adapters.filter(adapterFilter || (() => true));
15
- },
16
7
  async buildPricingContext(context, unchainedAPI) {
17
8
  const { modules } = unchainedAPI;
18
9
  if ('item' in context) {
@@ -1,16 +1,2 @@
1
1
  import type { ProductDiscountConfiguration } from './ProductDiscountConfiguration.ts';
2
- import type { IDiscountAdapter } from './BaseDiscountAdapter.ts';
3
- export declare const ProductDiscountDirector: {
4
- getAdapter: (key: string) => IDiscountAdapter<ProductDiscountConfiguration> | null;
5
- getAdapters: (options?: {
6
- adapterFilter?: (adapter: any) => boolean;
7
- }) => IDiscountAdapter<ProductDiscountConfiguration>[];
8
- actions: (discountContext: import("./BaseDiscountAdapter.ts").DiscountContext, unchainedAPI: {
9
- modules: import("../modules.ts").Modules;
10
- }) => Promise<{
11
- resolveDiscountAdapterFromStaticCode: (params: {
12
- code: string;
13
- }) => Promise<IDiscountAdapter<ProductDiscountConfiguration> | null>;
14
- findSystemDiscounts: () => Promise<string[]>;
15
- }>;
16
- };
2
+ export declare const ProductDiscountDirector: import("./BaseDiscountDirector.ts").IDiscountDirector<ProductDiscountConfiguration>;
@@ -1,15 +1,3 @@
1
1
  import { BaseDiscountDirector } from "./BaseDiscountDirector.js";
2
2
  import { ProductDiscountAdapter } from "./ProductDiscountAdapter.js";
3
- import { pluginRegistry } from "../plugins/PluginRegistry.js";
4
- const baseDirector = BaseDiscountDirector('ProductDiscountDirector');
5
- export const ProductDiscountDirector = {
6
- ...baseDirector,
7
- getAdapter: (key) => {
8
- const adapters = pluginRegistry.getAdapters(ProductDiscountAdapter.adapterType);
9
- return adapters.find((adapter) => adapter.key === key) || null;
10
- },
11
- getAdapters: (options) => {
12
- const adapters = pluginRegistry.getAdapters(ProductDiscountAdapter.adapterType);
13
- return adapters.filter(options?.adapterFilter || (() => true));
14
- },
15
- };
3
+ export const ProductDiscountDirector = BaseDiscountDirector(ProductDiscountAdapter.adapterType);
@@ -1,18 +1,9 @@
1
1
  import { ProductPricingSheet, } from "./ProductPricingSheet.js";
2
2
  import { ProductPricingAdapter, } from "./ProductPricingAdapter.js";
3
3
  import { BasePricingDirector } from "./BasePricingDirector.js";
4
- import { pluginRegistry } from "../plugins/PluginRegistry.js";
5
- const baseDirector = BasePricingDirector('ProductPricingDirector');
4
+ const baseDirector = BasePricingDirector(ProductPricingAdapter.adapterType);
6
5
  export const ProductPricingDirector = {
7
6
  ...baseDirector,
8
- getAdapter: (key) => {
9
- const adapters = pluginRegistry.getAdapters(ProductPricingAdapter.adapterType);
10
- return adapters.find((adapter) => adapter.key === key) || null;
11
- },
12
- getAdapters: ({ adapterFilter } = {}) => {
13
- const adapters = pluginRegistry.getAdapters(ProductPricingAdapter.adapterType);
14
- return adapters.filter(adapterFilter || (() => true));
15
- },
16
7
  async buildPricingContext(context, unchainedAPI) {
17
8
  const { modules } = unchainedAPI;
18
9
  const { quantity = 1, currencyCode } = context;
@@ -1,4 +1,4 @@
1
- import { type IBaseDirector } from '@unchainedshop/utils';
1
+ import type { IBaseDirector } from '@unchainedshop/utils';
2
2
  import { type IQuotationAdapter, type QuotationAdapterActions, type QuotationContext } from './QuotationAdapter.ts';
3
3
  export type IQuotationDirector = IBaseDirector<IQuotationAdapter> & {
4
4
  actions: (quotationContext: QuotationContext, unchainedAPI: any) => Promise<QuotationAdapterActions>;
@@ -1,11 +1,7 @@
1
- import { BaseDirector } from '@unchainedshop/utils';
2
1
  import { QuotationError, QuotationAdapter, } from "./QuotationAdapter.js";
3
2
  import { createLogger } from '@unchainedshop/logger';
4
- import { pluginRegistry } from "../plugins/PluginRegistry.js";
3
+ import { registryDirector } from "./registryDirector.js";
5
4
  const logger = createLogger('unchained:core');
6
- const baseDirector = BaseDirector('QuotationDirector', {
7
- adapterSortKey: 'orderIndex',
8
- });
9
5
  const findAppropriateAdapters = (quotationContext, unchainedAPI) => QuotationDirector.getAdapters({
10
6
  adapterFilter: (Adapter) => {
11
7
  const activated = Adapter.isActivatedFor(quotationContext, unchainedAPI);
@@ -16,15 +12,7 @@ const findAppropriateAdapters = (quotationContext, unchainedAPI) => QuotationDir
16
12
  },
17
13
  });
18
14
  export const QuotationDirector = {
19
- ...baseDirector,
20
- getAdapter: (key) => {
21
- const adapters = pluginRegistry.getAdapters(QuotationAdapter.adapterType);
22
- return adapters.find((adapter) => adapter.key === key) || null;
23
- },
24
- getAdapters: ({ adapterFilter } = {}) => {
25
- const adapters = pluginRegistry.getAdapters(QuotationAdapter.adapterType);
26
- return adapters.filter(adapterFilter || (() => true));
27
- },
15
+ ...registryDirector(QuotationAdapter.adapterType),
28
16
  actions: async (quotationContext, unchainedAPI) => {
29
17
  const context = { ...quotationContext, ...unchainedAPI };
30
18
  const Adapter = findAppropriateAdapters(quotationContext, unchainedAPI)?.shift();
@@ -1,25 +1,13 @@
1
- import { BaseDirector } from '@unchainedshop/utils';
2
1
  import { createLogger } from '@unchainedshop/logger';
3
2
  const logger = createLogger('unchained:core');
4
3
  import { DeliveryDirector } from "./DeliveryDirector.js";
5
4
  import { WarehousingError, WarehousingAdapter, } from "./WarehousingAdapter.js";
6
- import { pluginRegistry } from "../plugins/PluginRegistry.js";
5
+ import { registryDirector } from "./registryDirector.js";
7
6
  const getReferenceDate = (context) => {
8
7
  return context && context.referenceDate ? context.referenceDate : new Date();
9
8
  };
10
- const baseDirector = BaseDirector('WarehousingDirector', {
11
- adapterSortKey: 'orderIndex',
12
- });
13
9
  export const WarehousingDirector = {
14
- ...baseDirector,
15
- getAdapter: (key) => {
16
- const adapters = pluginRegistry.getAdapters(WarehousingAdapter.adapterType);
17
- return adapters.find((adapter) => adapter.key === key) || null;
18
- },
19
- getAdapters: ({ adapterFilter } = {}) => {
20
- const adapters = pluginRegistry.getAdapters(WarehousingAdapter.adapterType);
21
- return adapters.filter(adapterFilter || (() => true));
22
- },
10
+ ...registryDirector(WarehousingAdapter.adapterType),
23
11
  actions: async (warehousingProvider, warehousingContext, unchainedAPI) => {
24
12
  const Adapter = WarehousingDirector.getAdapter(warehousingProvider.adapterKey);
25
13
  if (!Adapter) {
@@ -145,29 +133,23 @@ export const WarehousingDirector = {
145
133
  };
146
134
  },
147
135
  async tokenMetadata(virtualProviders, warehousingContext, unchainedAPI) {
148
- return virtualProviders.reduce(async (lastPromise, provider) => {
149
- const last = await lastPromise;
150
- if (last)
151
- return last;
152
- const currentDirector = await WarehousingDirector.actions(provider, warehousingContext, unchainedAPI);
153
- const isActive = await currentDirector.isActive();
154
- if (isActive) {
155
- return currentDirector.tokenMetadata(warehousingContext.token.tokenSerialNumber);
156
- }
136
+ const activeActions = await findFirstActiveActions(virtualProviders, warehousingContext, unchainedAPI);
137
+ if (!activeActions)
157
138
  return null;
158
- }, Promise.resolve(null));
139
+ return activeActions.tokenMetadata(warehousingContext.token.tokenSerialNumber);
159
140
  },
160
141
  async isInvalidateable(virtualProviders, warehousingContext, unchainedAPI) {
161
- return virtualProviders.reduce(async (lastPromise, provider) => {
162
- const last = await lastPromise;
163
- if (last)
164
- return last;
165
- const currentDirector = await WarehousingDirector.actions(provider, warehousingContext, unchainedAPI);
166
- const isActive = await currentDirector.isActive();
167
- if (isActive) {
168
- return currentDirector.isInvalidateable(warehousingContext.token.tokenSerialNumber);
169
- }
142
+ const activeActions = await findFirstActiveActions(virtualProviders, warehousingContext, unchainedAPI);
143
+ if (!activeActions)
170
144
  return null;
171
- }, Promise.resolve(null));
145
+ return activeActions.isInvalidateable(warehousingContext.token.tokenSerialNumber);
172
146
  },
173
147
  };
148
+ async function findFirstActiveActions(virtualProviders, warehousingContext, unchainedAPI) {
149
+ for (const provider of virtualProviders) {
150
+ const currentActions = await WarehousingDirector.actions(provider, warehousingContext, unchainedAPI);
151
+ if (currentActions.isActive())
152
+ return currentActions;
153
+ }
154
+ return null;
155
+ }
@@ -1,5 +1,5 @@
1
1
  import type { Work, WorkData, WorkResult } from '@unchainedshop/core-worker';
2
- import { type IBaseDirector } from '@unchainedshop/utils';
2
+ import type { IBaseDirector } from '@unchainedshop/utils';
3
3
  import type { ScheduleData } from '../utils/schedule.ts';
4
4
  import { type IWorkerAdapter } from './WorkerAdapter.ts';
5
5
  import type { Modules } from '../modules.ts';