@unchainedshop/core-orders 4.3.3 → 4.4.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 (160) hide show
  1. package/README.md +137 -3
  2. package/lib/db/OrderDeliveriesCollection.d.ts +8 -8
  3. package/lib/db/OrderDeliveriesCollection.js +6 -9
  4. package/lib/db/OrderDiscountsCollection.d.ts +7 -7
  5. package/lib/db/OrderDiscountsCollection.js +5 -8
  6. package/lib/db/OrderPaymentsCollection.d.ts +8 -8
  7. package/lib/db/OrderPaymentsCollection.js +6 -9
  8. package/lib/db/OrderPositionsCollection.d.ts +2 -3
  9. package/lib/db/OrderPositionsCollection.js +1 -3
  10. package/lib/db/OrdersCollection.d.ts +9 -9
  11. package/lib/db/OrdersCollection.js +7 -10
  12. package/lib/migrations/20250502111800-currency-code.d.ts +1 -2
  13. package/lib/migrations/20250502111800-currency-code.js +1 -2
  14. package/lib/module/buildFindSelector.d.ts +1 -2
  15. package/lib/module/buildFindSelector.js +1 -2
  16. package/lib/module/configureOrderDeliveriesModule.d.ts +2 -3
  17. package/lib/module/configureOrderDeliveriesModule.js +2 -7
  18. package/lib/module/configureOrderDiscountsModule.d.ts +1 -2
  19. package/lib/module/configureOrderDiscountsModule.js +2 -4
  20. package/lib/module/configureOrderPaymentsModule.d.ts +2 -3
  21. package/lib/module/configureOrderPaymentsModule.js +2 -9
  22. package/lib/module/configureOrderPositionsModule.d.ts +2 -3
  23. package/lib/module/configureOrderPositionsModule.js +1 -4
  24. package/lib/module/configureOrdersModule-mutations.d.ts +3 -4
  25. package/lib/module/configureOrdersModule-mutations.js +2 -3
  26. package/lib/module/configureOrdersModule-queries.d.ts +2 -3
  27. package/lib/module/configureOrdersModule-queries.js +3 -3
  28. package/lib/module/configureOrdersModule.d.ts +39 -40
  29. package/lib/module/configureOrdersModule.js +17 -23
  30. package/lib/orders-index.d.ts +13 -14
  31. package/lib/orders-index.js +13 -14
  32. package/lib/orders-settings.d.ts +1 -2
  33. package/lib/orders-settings.js +0 -1
  34. package/package.json +11 -10
  35. package/lib/db/OrderDeliveriesCollection.d.ts.map +0 -1
  36. package/lib/db/OrderDeliveriesCollection.js.map +0 -1
  37. package/lib/db/OrderDeliveriesSchema.d.ts +0 -3
  38. package/lib/db/OrderDeliveriesSchema.d.ts.map +0 -1
  39. package/lib/db/OrderDeliveriesSchema.js +0 -20
  40. package/lib/db/OrderDeliveriesSchema.js.map +0 -1
  41. package/lib/db/OrderDiscountTrigger.d.ts +0 -5
  42. package/lib/db/OrderDiscountTrigger.d.ts.map +0 -1
  43. package/lib/db/OrderDiscountTrigger.js +0 -6
  44. package/lib/db/OrderDiscountTrigger.js.map +0 -1
  45. package/lib/db/OrderDiscountsCollection.d.ts.map +0 -1
  46. package/lib/db/OrderDiscountsCollection.js.map +0 -1
  47. package/lib/db/OrderDiscountsSchema.d.ts +0 -3
  48. package/lib/db/OrderDiscountsSchema.d.ts.map +0 -1
  49. package/lib/db/OrderDiscountsSchema.js +0 -12
  50. package/lib/db/OrderDiscountsSchema.js.map +0 -1
  51. package/lib/db/OrderPaymentsCollection.d.ts.map +0 -1
  52. package/lib/db/OrderPaymentsCollection.js.map +0 -1
  53. package/lib/db/OrderPaymentsSchema.d.ts +0 -3
  54. package/lib/db/OrderPaymentsSchema.d.ts.map +0 -1
  55. package/lib/db/OrderPaymentsSchema.js +0 -20
  56. package/lib/db/OrderPaymentsSchema.js.map +0 -1
  57. package/lib/db/OrderPositionsCollection.d.ts.map +0 -1
  58. package/lib/db/OrderPositionsCollection.js.map +0 -1
  59. package/lib/db/OrderPositionsSchema.d.ts +0 -3
  60. package/lib/db/OrderPositionsSchema.d.ts.map +0 -1
  61. package/lib/db/OrderPositionsSchema.js +0 -37
  62. package/lib/db/OrderPositionsSchema.js.map +0 -1
  63. package/lib/db/OrdersCollection.d.ts.map +0 -1
  64. package/lib/db/OrdersCollection.js.map +0 -1
  65. package/lib/db/OrdersSchema.d.ts +0 -3
  66. package/lib/db/OrdersSchema.d.ts.map +0 -1
  67. package/lib/db/OrdersSchema.js +0 -30
  68. package/lib/db/OrdersSchema.js.map +0 -1
  69. package/lib/director/OrderDiscountAdapter.d.ts +0 -4
  70. package/lib/director/OrderDiscountAdapter.d.ts.map +0 -1
  71. package/lib/director/OrderDiscountAdapter.js +0 -3
  72. package/lib/director/OrderDiscountAdapter.js.map +0 -1
  73. package/lib/director/OrderDiscountConfiguration.d.ts +0 -6
  74. package/lib/director/OrderDiscountConfiguration.d.ts.map +0 -1
  75. package/lib/director/OrderDiscountConfiguration.js +0 -2
  76. package/lib/director/OrderDiscountConfiguration.js.map +0 -1
  77. package/lib/director/OrderDiscountDirector.d.ts +0 -3
  78. package/lib/director/OrderDiscountDirector.d.ts.map +0 -1
  79. package/lib/director/OrderDiscountDirector.js +0 -3
  80. package/lib/director/OrderDiscountDirector.js.map +0 -1
  81. package/lib/director/OrderPricingAdapter.d.ts +0 -4
  82. package/lib/director/OrderPricingAdapter.d.ts.map +0 -1
  83. package/lib/director/OrderPricingAdapter.js +0 -25
  84. package/lib/director/OrderPricingAdapter.js.map +0 -1
  85. package/lib/director/OrderPricingDirector.d.ts +0 -3
  86. package/lib/director/OrderPricingDirector.d.ts.map +0 -1
  87. package/lib/director/OrderPricingDirector.js +0 -39
  88. package/lib/director/OrderPricingDirector.js.map +0 -1
  89. package/lib/director/OrderPricingSheet.d.ts +0 -4
  90. package/lib/director/OrderPricingSheet.d.ts.map +0 -1
  91. package/lib/director/OrderPricingSheet.js +0 -101
  92. package/lib/director/OrderPricingSheet.js.map +0 -1
  93. package/lib/migrations/20250502111800-currency-code copy.d.ts +0 -3
  94. package/lib/migrations/20250502111800-currency-code copy.d.ts.map +0 -1
  95. package/lib/migrations/20250502111800-currency-code copy.js +0 -14
  96. package/lib/migrations/20250502111800-currency-code copy.js.map +0 -1
  97. package/lib/migrations/20250502111800-currency-code.d.ts.map +0 -1
  98. package/lib/migrations/20250502111800-currency-code.js.map +0 -1
  99. package/lib/migrations/20251020080000-position-config.d.ts +0 -3
  100. package/lib/migrations/20251020080000-position-config.d.ts.map +0 -1
  101. package/lib/migrations/20251020080000-position-config.js +0 -14
  102. package/lib/migrations/20251020080000-position-config.js.map +0 -1
  103. package/lib/module/buildFindSelector.d.ts.map +0 -1
  104. package/lib/module/buildFindSelector.js.map +0 -1
  105. package/lib/module/configureOrderDeliveriesModule.d.ts.map +0 -1
  106. package/lib/module/configureOrderDeliveriesModule.js.map +0 -1
  107. package/lib/module/configureOrderDiscountsModule.d.ts.map +0 -1
  108. package/lib/module/configureOrderDiscountsModule.js.map +0 -1
  109. package/lib/module/configureOrderPaymentsModule.d.ts.map +0 -1
  110. package/lib/module/configureOrderPaymentsModule.js.map +0 -1
  111. package/lib/module/configureOrderPositionsModule.d.ts.map +0 -1
  112. package/lib/module/configureOrderPositionsModule.js.map +0 -1
  113. package/lib/module/configureOrdersModule-mutations.d.ts.map +0 -1
  114. package/lib/module/configureOrdersModule-mutations.js.map +0 -1
  115. package/lib/module/configureOrdersModule-processing.d.ts +0 -14
  116. package/lib/module/configureOrdersModule-processing.d.ts.map +0 -1
  117. package/lib/module/configureOrdersModule-processing.js +0 -348
  118. package/lib/module/configureOrdersModule-processing.js.map +0 -1
  119. package/lib/module/configureOrdersModule-queries.d.ts.map +0 -1
  120. package/lib/module/configureOrdersModule-queries.js.map +0 -1
  121. package/lib/module/configureOrdersModule-transformations.d.ts +0 -6
  122. package/lib/module/configureOrdersModule-transformations.d.ts.map +0 -1
  123. package/lib/module/configureOrdersModule-transformations.js +0 -112
  124. package/lib/module/configureOrdersModule-transformations.js.map +0 -1
  125. package/lib/module/configureOrdersModule.d.ts.map +0 -1
  126. package/lib/module/configureOrdersModule.js.map +0 -1
  127. package/lib/orders-index.d.ts.map +0 -1
  128. package/lib/orders-index.js.map +0 -1
  129. package/lib/orders-settings.d.ts.map +0 -1
  130. package/lib/orders-settings.js.map +0 -1
  131. package/lib/service/migrateOrderCartService.d.ts +0 -3
  132. package/lib/service/migrateOrderCartService.d.ts.map +0 -1
  133. package/lib/service/migrateOrderCartService.js +0 -32
  134. package/lib/service/migrateOrderCartService.js.map +0 -1
  135. package/lib/service/nextUserCartService.d.ts +0 -3
  136. package/lib/service/nextUserCartService.d.ts.map +0 -1
  137. package/lib/service/nextUserCartService.js +0 -34
  138. package/lib/service/nextUserCartService.js.map +0 -1
  139. package/lib/service/orderServices.d.ts +0 -3
  140. package/lib/service/orderServices.d.ts.map +0 -1
  141. package/lib/service/orderServices.js +0 -7
  142. package/lib/service/orderServices.js.map +0 -1
  143. package/src/db/OrderDeliveriesCollection.ts +0 -34
  144. package/src/db/OrderDiscountsCollection.ts +0 -30
  145. package/src/db/OrderPaymentsCollection.ts +0 -35
  146. package/src/db/OrderPositionsCollection.ts +0 -32
  147. package/src/db/OrdersCollection.ts +0 -87
  148. package/src/migrations/20250502111800-currency-code.ts +0 -18
  149. package/src/module/buildFindSelector.test.ts +0 -121
  150. package/src/module/buildFindSelector.ts +0 -49
  151. package/src/module/configureOrderDeliveriesModule.ts +0 -157
  152. package/src/module/configureOrderDiscountsModule.ts +0 -95
  153. package/src/module/configureOrderPaymentsModule.ts +0 -224
  154. package/src/module/configureOrderPositionsModule.ts +0 -244
  155. package/src/module/configureOrdersModule-mutations.ts +0 -178
  156. package/src/module/configureOrdersModule-queries.ts +0 -159
  157. package/src/module/configureOrdersModule.ts +0 -257
  158. package/src/orders-index.ts +0 -13
  159. package/src/orders-settings.ts +0 -45
  160. package/tsconfig.json +0 -9
@@ -1,34 +0,0 @@
1
- import { ordersSettings } from '../orders-settings.js';
2
- import { resolveBestCurrency } from '@unchainedshop/utils';
3
- export const nextUserCartService = async ({ user, orderNumber, countryCode, forceCartCreation }, unchainedAPI) => {
4
- const { modules } = unchainedAPI;
5
- const cart = await modules.orders.cart({
6
- countryContext: countryCode || user.lastLogin?.countryCode,
7
- orderNumber,
8
- userId: user._id,
9
- });
10
- if (cart)
11
- return cart;
12
- const shouldCreateNewCart = forceCartCreation || ordersSettings.ensureUserHasCart;
13
- if (!shouldCreateNewCart)
14
- return null;
15
- const countryObject = await modules.countries.findCountry({ isoCode: countryCode });
16
- const currencies = await modules.currencies.findCurrencies({ includeInactive: false });
17
- const currency = resolveBestCurrency(countryObject.defaultCurrencyCode, currencies);
18
- const order = await modules.orders.create({
19
- userId: user._id,
20
- orderNumber,
21
- currency,
22
- countryCode,
23
- billingAddress: user.lastBillingAddress || user.profile?.address,
24
- contact: user.lastContact ||
25
- (!user.guest
26
- ? {
27
- telNumber: user.profile?.phoneMobile,
28
- emailAddress: modules.users.primaryEmail(user)?.address,
29
- }
30
- : {}),
31
- });
32
- return modules.orders.initProviders(order, unchainedAPI);
33
- };
34
- //# sourceMappingURL=nextUserCartService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nextUserCartService.js","sourceRoot":"","sources":["../../src/service/nextUserCartService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,CAAC,MAAM,mBAAmB,GAAwB,KAAK,EAC3D,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,EACrD,YAAY,EACZ,EAAE;IACF,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC;IAEjC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QACrC,cAAc,EAAE,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW;QAC1D,WAAW;QACX,MAAM,EAAE,IAAI,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,mBAAmB,GAAG,iBAAiB,IAAI,cAAc,CAAC,iBAAiB,CAAC;IAClF,IAAI,CAAC,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACpF,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,aAAa,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;IAEpF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QACxC,MAAM,EAAE,IAAI,CAAC,GAAG;QAChB,WAAW;QACX,QAAQ;QACR,WAAW;QACX,cAAc,EAAE,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO;QAChE,OAAO,EACL,IAAI,CAAC,WAAW;YAChB,CAAC,CAAC,IAAI,CAAC,KAAK;gBACV,CAAC,CAAC;oBACE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW;oBACpC,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO;iBACxD;gBACH,CAAC,CAAC,EAAE,CAAC;KACV,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AAC3D,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import { OrderServices } from '@unchainedshop/types/orders.js';
2
- export declare const orderServices: OrderServices;
3
- //# sourceMappingURL=orderServices.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orderServices.d.ts","sourceRoot":"","sources":["../../src/service/orderServices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAI/D,eAAO,MAAM,aAAa,EAAE,aAG3B,CAAC"}
@@ -1,7 +0,0 @@
1
- import { migrateOrderCartsService } from './migrateOrderCartService.js';
2
- import { nextUserCartService } from './nextUserCartService.js';
3
- export const orderServices = {
4
- migrateOrderCarts: migrateOrderCartsService,
5
- nextUserCart: nextUserCartService,
6
- };
7
- //# sourceMappingURL=orderServices.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orderServices.js","sourceRoot":"","sources":["../../src/service/orderServices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,iBAAiB,EAAE,wBAAwB;IAC3C,YAAY,EAAE,mBAAmB;CAClC,CAAC"}
@@ -1,34 +0,0 @@
1
- import { mongodb, buildDbIndexes, LogFields, TimestampFields } from '@unchainedshop/mongodb';
2
- import { Price } from '@unchainedshop/utils';
3
-
4
- export enum OrderDeliveryStatus {
5
- OPEN = 'OPEN', // Null value is mapped to OPEN status
6
- DELIVERED = 'DELIVERED',
7
- RETURNED = 'RETURNED',
8
- }
9
-
10
- export type OrderDelivery = {
11
- _id: string;
12
- orderId: string;
13
- deliveryProviderId: string;
14
- delivered?: Date;
15
- status: OrderDeliveryStatus | null;
16
- context?: any;
17
- calculation: any[];
18
- } & LogFields &
19
- TimestampFields;
20
-
21
- export type OrderDeliveryDiscount = Omit<Price, '_id'> & {
22
- _id: string;
23
- discountId: string;
24
- item: OrderDelivery;
25
- };
26
-
27
- export const OrderDeliveriesCollection = async (db: mongodb.Db) => {
28
- const OrderDeliveries = db.collection<OrderDelivery>('order_deliveries');
29
-
30
- // Order Indexes
31
- await buildDbIndexes<OrderDelivery>(OrderDeliveries, [{ index: { orderId: 1 } }]);
32
-
33
- return OrderDeliveries;
34
- };
@@ -1,30 +0,0 @@
1
- import { mongodb, buildDbIndexes, TimestampFields } from '@unchainedshop/mongodb';
2
- import { Price } from '@unchainedshop/utils';
3
-
4
- export type OrderDiscount = {
5
- _id: string;
6
- orderId: string;
7
- code?: string;
8
- total?: Price;
9
- trigger?: OrderDiscountTrigger;
10
- discountKey: string;
11
- reservation?: any;
12
- context?: any;
13
- } & TimestampFields;
14
-
15
- export const OrderDiscountsCollection = async (db: mongodb.Db) => {
16
- const OrderDiscounts = db.collection<OrderDiscount>('order_discounts');
17
-
18
- // Order Indexes
19
- await buildDbIndexes<OrderDiscount>(OrderDiscounts, [
20
- { index: { orderId: 1 } },
21
- { index: { trigger: 1 } },
22
- ]);
23
-
24
- return OrderDiscounts;
25
- };
26
-
27
- export enum OrderDiscountTrigger {
28
- USER = 'USER',
29
- SYSTEM = 'SYSTEM',
30
- }
@@ -1,35 +0,0 @@
1
- import { mongodb, buildDbIndexes, LogFields, TimestampFields } from '@unchainedshop/mongodb';
2
- import { Price } from '@unchainedshop/utils';
3
-
4
- export enum OrderPaymentStatus {
5
- OPEN = 'OPEN', // Null value is mapped to OPEN status
6
- PAID = 'PAID',
7
- REFUNDED = 'REFUNDED',
8
- }
9
-
10
- export type OrderPayment = {
11
- _id: string;
12
- orderId: string;
13
- context?: any;
14
- paid?: Date;
15
- transactionId?: string;
16
- paymentProviderId: string;
17
- status?: OrderPaymentStatus | null;
18
- calculation?: any[];
19
- } & LogFields &
20
- TimestampFields;
21
-
22
- export type OrderPaymentDiscount = Omit<Price, '_id'> & {
23
- _id: string;
24
- discountId: string;
25
- item: OrderPayment;
26
- };
27
-
28
- export const OrderPaymentsCollection = async (db: mongodb.Db) => {
29
- const OrderPayments = db.collection<OrderPayment>('order_payments');
30
-
31
- // Order Indexes
32
- await buildDbIndexes<OrderPayment>(OrderPayments, [{ index: { orderId: 1 } }]);
33
-
34
- return OrderPayments;
35
- };
@@ -1,32 +0,0 @@
1
- import { mongodb, buildDbIndexes, TimestampFields } from '@unchainedshop/mongodb';
2
- import { Price } from '@unchainedshop/utils';
3
-
4
- export type OrderPosition = {
5
- _id: string;
6
- calculation: any[];
7
- configuration: { key: string; value: string }[] | null;
8
- context?: any;
9
- orderId: string;
10
- originalProductId: string;
11
- productId: string;
12
- quantity: number;
13
- quotationId?: string;
14
- scheduling: any[];
15
- } & TimestampFields;
16
-
17
- export type OrderPositionDiscount = Omit<Price, '_id'> & {
18
- discountId: string;
19
- item: OrderPosition;
20
- };
21
-
22
- export const OrderPositionsCollection = async (db: mongodb.Db) => {
23
- const OrderPositions = db.collection<OrderPosition>('order_positions');
24
-
25
- // Order Indexes
26
- await buildDbIndexes<OrderPosition>(OrderPositions, [
27
- { index: { productId: 1 } },
28
- { index: { orderId: 1 } },
29
- ]);
30
-
31
- return OrderPositions;
32
- };
@@ -1,87 +0,0 @@
1
- import {
2
- mongodb,
3
- buildDbIndexes,
4
- Address,
5
- Contact,
6
- LogFields,
7
- TimestampFields,
8
- isDocumentDBCompatModeEnabled,
9
- } from '@unchainedshop/mongodb';
10
- import { DateFilterInput } from '@unchainedshop/utils';
11
-
12
- export enum OrderStatus {
13
- PENDING = 'PENDING',
14
- CONFIRMED = 'CONFIRMED',
15
- FULLFILLED = 'FULLFILLED',
16
- REJECTED = 'REJECTED',
17
- }
18
-
19
- export type Order = {
20
- _id: string;
21
- billingAddress?: Address;
22
- calculation: any[];
23
- confirmed?: Date;
24
- rejected?: Date;
25
- contact?: Contact;
26
- context?: any;
27
- countryCode: string;
28
- currencyCode: string;
29
- deliveryId?: string;
30
- fullfilled?: Date;
31
- ordered?: Date;
32
- orderNumber?: string;
33
- originEnrollmentId?: string;
34
- paymentId?: string;
35
- status: OrderStatus | null;
36
- userId: string;
37
- } & LogFields &
38
- TimestampFields;
39
-
40
- export interface OrderQuery extends mongodb.Filter<Order> {
41
- includeCarts?: boolean;
42
- queryString?: string;
43
- status?: OrderStatus[];
44
- userId?: string;
45
- deliveryIds?: string[];
46
- paymentIds?: string[];
47
- dateRange?: DateFilterInput;
48
- }
49
-
50
- export const OrdersCollection = async (db: mongodb.Db) => {
51
- const Orders = db.collection<Order>('orders');
52
-
53
- if (!isDocumentDBCompatModeEnabled()) {
54
- await buildDbIndexes<Order>(Orders, [
55
- {
56
- index: {
57
- _id: 'text',
58
- userId: 'text',
59
- orderNumber: 'text',
60
- status: 'text',
61
- 'contact.emailAddress': 'text',
62
- 'contact.telNumber': 'text',
63
- } as any,
64
- options: {
65
- weights: {
66
- _id: 8,
67
- userId: 3,
68
- orderNumber: 6,
69
- 'contact.telNumber': 5,
70
- 'contact.emailAddress': 4,
71
- status: 1,
72
- },
73
- name: 'order_fulltext_search',
74
- },
75
- },
76
- ]);
77
- }
78
-
79
- // Order Indexes
80
- await buildDbIndexes<Order>(Orders, [
81
- { index: { userId: 1 } },
82
- { index: { status: 1 } },
83
- { index: { orderNumber: 1 } },
84
- ]);
85
-
86
- return Orders;
87
- };
@@ -1,18 +0,0 @@
1
- import { MigrationRepository } from '@unchainedshop/mongodb';
2
- import { OrdersCollection } from '../orders-index.js';
3
-
4
- export default function renameCurrencyCode(repository: MigrationRepository) {
5
- repository?.register({
6
- id: 20250502111800,
7
- name: 'Rename order.currency to order.currencyCode',
8
- up: async () => {
9
- const Orders = await OrdersCollection(repository.db);
10
- await Orders.updateMany(
11
- {},
12
- {
13
- $rename: { currency: 'currencyCode' },
14
- },
15
- );
16
- },
17
- });
18
- }
@@ -1,121 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert';
3
- import { OrderStatus } from '../db/OrdersCollection.js';
4
- import { buildFindByIdSelector as buildFindByIdSelectorForDelivery } from './configureOrderDeliveriesModule.js';
5
- import { buildFindOrderDiscountByIdSelector } from './configureOrderDiscountsModule.js';
6
- import {
7
- buildFindOrderPaymentByIdSelector,
8
- buildFindByContextDataSelector,
9
- } from './configureOrderPaymentsModule.js';
10
- import { buildFindOrderPositionByIdSelector } from './configureOrderPositionsModule.js';
11
- import buildFindSelectorForOrder from './buildFindSelector.js';
12
-
13
- describe('OrderPosition', () => {
14
- describe('buildFindSelector', () => {
15
- it('Return filter object when passed no argument', () => {
16
- assert.deepStrictEqual(buildFindSelectorForOrder({}), { status: { $ne: null } });
17
- });
18
-
19
- it('Return filter object when passed includeCarts, queryString, status, userId and (status should take precedence over includeCarts)', () => {
20
- assert.deepStrictEqual(
21
- buildFindSelectorForOrder({
22
- includeCarts: false,
23
- queryString: 'hello world',
24
- status: [OrderStatus.CONFIRMED],
25
- userId: 'admin-id',
26
- }),
27
- {
28
- userId: 'admin-id',
29
- status: {
30
- $in: ['CONFIRMED'],
31
- },
32
- $text: { $search: 'hello world' },
33
- },
34
- );
35
- });
36
-
37
- it('Return filter object when passed includeCarts, queryString, userId', () => {
38
- assert.deepStrictEqual(
39
- buildFindSelectorForOrder({
40
- includeCarts: true,
41
- queryString: 'hello world',
42
- userId: 'admin-id',
43
- }),
44
- {
45
- userId: 'admin-id',
46
- $text: { $search: 'hello world' },
47
- },
48
- );
49
- });
50
-
51
- it('Return filter object when passed queryString, userId', () => {
52
- assert.deepStrictEqual(
53
- buildFindSelectorForOrder({ queryString: 'hello world', userId: 'admin-id' }),
54
- {
55
- userId: 'admin-id',
56
- $text: { $search: 'hello world' },
57
- status: { $ne: null },
58
- },
59
- );
60
- });
61
-
62
- it('Return filter object when passed queryString', () => {
63
- assert.deepStrictEqual(buildFindSelectorForOrder({ queryString: 'hello world' }), {
64
- $text: { $search: 'hello world' },
65
- status: { $ne: null },
66
- });
67
- });
68
- });
69
- });
70
-
71
- describe('OrderDelivery', () => {
72
- describe('buildFindByIdSelector', () => {
73
- it('Return correct db _id selector', () => {
74
- assert.deepStrictEqual(buildFindByIdSelectorForDelivery('order-delivery-id'), {
75
- _id: 'order-delivery-id',
76
- });
77
- });
78
- });
79
- });
80
-
81
- describe('OrderDiscount', () => {
82
- describe('buildFindByIdSelector', () => {
83
- it('Return correct db _id selector', () => {
84
- assert.deepStrictEqual(buildFindOrderDiscountByIdSelector('order-discount-id'), {
85
- _id: 'order-discount-id',
86
- });
87
- });
88
- });
89
- });
90
-
91
- describe('OrderPayment', () => {
92
- describe('buildFindByIdSelector', () => {
93
- it('Return correct db _id selector', () => {
94
- assert.deepStrictEqual(buildFindOrderPaymentByIdSelector('order-payment-id'), {
95
- _id: 'order-payment-id',
96
- });
97
- });
98
- });
99
-
100
- describe('buildFindByContextDataSelector', () => {
101
- it('Return correct db context field selector object', () => {
102
- assert.deepStrictEqual(
103
- buildFindByContextDataSelector({ first: 'first value', second: 'second value' }),
104
- {
105
- 'context.first': 'first value',
106
- 'context.second': 'second value',
107
- },
108
- );
109
- });
110
- });
111
- });
112
-
113
- describe('OrderPosition', () => {
114
- describe('buildFindByIdSelector', () => {
115
- it('Return correct db _id selector', () => {
116
- assert.deepStrictEqual(buildFindOrderPositionByIdSelector('order-position-id'), {
117
- _id: 'order-position-id',
118
- });
119
- });
120
- });
121
- });
@@ -1,49 +0,0 @@
1
- import { OrderQuery, Order } from '../db/OrdersCollection.js';
2
- import { assertDocumentDBCompatMode, mongodb } from '@unchainedshop/mongodb';
3
-
4
- export const buildFindSelector = ({
5
- includeCarts,
6
- status,
7
- userId,
8
- queryString,
9
- paymentIds,
10
- deliveryIds,
11
- dateRange,
12
- ...rest
13
- }: OrderQuery) => {
14
- const selector: mongodb.Filter<Order> = { ...rest };
15
-
16
- if (userId) {
17
- selector.userId = userId;
18
- }
19
- if (dateRange) {
20
- const dateFilter: mongodb.Filter<Order> = {};
21
- if (dateRange.start) dateFilter.$gte = new Date(dateRange.start);
22
- if (dateRange.end) dateFilter.$lte = new Date(dateRange.end);
23
- if (Object.keys(dateFilter).length > 0) {
24
- selector.ordered = dateFilter;
25
- }
26
- }
27
-
28
- if (Array.isArray(deliveryIds) && deliveryIds?.length) {
29
- selector.deliveryId = { $in: deliveryIds };
30
- }
31
-
32
- if (Array.isArray(paymentIds) && paymentIds?.length) {
33
- selector.paymentId = { $in: paymentIds };
34
- }
35
-
36
- if (Array.isArray(status) && status?.length) {
37
- selector.status = { $in: status };
38
- } else if (!includeCarts) {
39
- selector.status = { $ne: null };
40
- }
41
- if (queryString) {
42
- assertDocumentDBCompatMode();
43
- (selector as any).$text = { $search: queryString };
44
- }
45
-
46
- return selector;
47
- };
48
-
49
- export default buildFindSelector;
@@ -1,157 +0,0 @@
1
- import { mongodb, generateDbFilterById, generateDbObjectId } from '@unchainedshop/mongodb';
2
- import { emit, registerEvents } from '@unchainedshop/events';
3
- import { PricingCalculation } from '@unchainedshop/utils';
4
- import { OrderDelivery, OrderDeliveryStatus } from '../db/OrderDeliveriesCollection.js';
5
-
6
- const ORDER_DELIVERY_EVENTS: string[] = ['ORDER_DELIVER', 'ORDER_UPDATE_DELIVERY'];
7
-
8
- export const buildFindByIdSelector = (orderDeliveryId: string) =>
9
- generateDbFilterById(orderDeliveryId) as mongodb.Filter<OrderDelivery>;
10
-
11
- export const configureOrderDeliveriesModule = ({
12
- OrderDeliveries,
13
- }: {
14
- OrderDeliveries: mongodb.Collection<OrderDelivery>;
15
- }) => {
16
- registerEvents(ORDER_DELIVERY_EVENTS);
17
-
18
- const normalizedStatus = (orderDelivery: OrderDelivery) => {
19
- return orderDelivery.status === null
20
- ? OrderDeliveryStatus.OPEN
21
- : (orderDelivery.status as OrderDeliveryStatus);
22
- };
23
-
24
- const updateStatus = async (
25
- orderDeliveryId: string,
26
- { status, info }: { status: OrderDeliveryStatus; info?: string },
27
- ) => {
28
- const date = new Date();
29
- const modifier: mongodb.UpdateFilter<OrderDelivery> = {
30
- $set: { status, updated: new Date() },
31
- $push: {
32
- log: {
33
- date,
34
- status,
35
- info,
36
- },
37
- },
38
- };
39
- if (status === OrderDeliveryStatus.DELIVERED) {
40
- // eslint-disable-next-line
41
- // @ts-ignore
42
- modifier.$set.delivered = date;
43
- }
44
-
45
- const selector = buildFindByIdSelector(orderDeliveryId);
46
- return OrderDeliveries.findOneAndUpdate(selector, modifier, { returnDocument: 'after' });
47
- };
48
-
49
- return {
50
- // Queries
51
- findDelivery: async (
52
- { orderDeliveryId }: { orderDeliveryId: string },
53
- options?: mongodb.FindOptions,
54
- ) => {
55
- return OrderDeliveries.findOne(buildFindByIdSelector(orderDeliveryId), options);
56
- },
57
-
58
- findDeliveryByProvidersId: async (
59
- { deliveryProviderIds }: { deliveryProviderIds: string[] },
60
- options?: mongodb.FindOptions,
61
- ): Promise<OrderDelivery[]> => {
62
- if (!deliveryProviderIds?.length) return [];
63
- return OrderDeliveries.find(
64
- { deliveryProviderId: { $in: deliveryProviderIds } },
65
- options,
66
- ).toArray();
67
- },
68
-
69
- normalizedStatus,
70
-
71
- // Mutations
72
-
73
- create: async (
74
- doc: Omit<OrderDelivery, '_id' | 'created'> & Pick<Partial<OrderDelivery>, '_id' | 'created'>,
75
- ) => {
76
- const { insertedId: orderDeliveryId } = await OrderDeliveries.insertOne({
77
- _id: generateDbObjectId(),
78
- created: new Date(),
79
- ...doc,
80
- context: doc.context || {},
81
- status: null,
82
- });
83
-
84
- const orderDelivery = (await OrderDeliveries.findOne(
85
- buildFindByIdSelector(orderDeliveryId),
86
- )) as OrderDelivery;
87
- return orderDelivery;
88
- },
89
-
90
- delete: async (orderDeliveryId: string) => {
91
- const { deletedCount } = await OrderDeliveries.deleteOne({ _id: orderDeliveryId });
92
- return deletedCount;
93
- },
94
-
95
- markAsDelivered: async (orderDelivery: OrderDelivery) => {
96
- if (normalizedStatus(orderDelivery) !== OrderDeliveryStatus.OPEN) return;
97
- const updatedOrderDelivery = await updateStatus(orderDelivery._id, {
98
- status: OrderDeliveryStatus.DELIVERED,
99
- info: 'mark delivered manually',
100
- });
101
- await emit('ORDER_DELIVER', { orderDelivery: updatedOrderDelivery });
102
- return updatedOrderDelivery;
103
- },
104
-
105
- updateContext: async (orderDeliveryId: string, context: any) => {
106
- const selector = buildFindByIdSelector(orderDeliveryId);
107
- if (!context || Object.keys(context).length === 0) return OrderDeliveries.findOne(selector, {});
108
- const contextSetters = Object.fromEntries(
109
- Object.entries(context).map(([key, value]) => [`context.${key}`, value]),
110
- );
111
-
112
- const orderDelivery = await OrderDeliveries.findOneAndUpdate(
113
- selector,
114
- {
115
- $set: {
116
- ...contextSetters,
117
- updated: new Date(),
118
- },
119
- },
120
- { returnDocument: 'after' },
121
- );
122
-
123
- if (!orderDelivery) return null;
124
- await emit('ORDER_UPDATE_DELIVERY', {
125
- orderDelivery,
126
- });
127
- return orderDelivery;
128
- },
129
-
130
- updateStatus,
131
-
132
- updateCalculation: async <T extends PricingCalculation>(
133
- orderDeliveryId: string,
134
- calculation: T[],
135
- ) => {
136
- return OrderDeliveries.findOneAndUpdate(
137
- { _id: orderDeliveryId },
138
- {
139
- $set: {
140
- calculation,
141
- updated: new Date(),
142
- },
143
- },
144
- {
145
- returnDocument: 'after',
146
- },
147
- );
148
- },
149
-
150
- deleteOrderDeliveries: async (orderId: string) => {
151
- const { deletedCount } = await OrderDeliveries.deleteMany({ orderId });
152
- return deletedCount;
153
- },
154
- };
155
- };
156
-
157
- export type OrderDeliveriesModule = ReturnType<typeof configureOrderDeliveriesModule>;