@unchainedshop/core-orders 3.0.0-alpha7 → 3.0.0-rc1

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 (190) hide show
  1. package/lib/db/OrderDeliveriesCollection.d.ts +1 -1
  2. package/lib/db/OrderDeliveriesCollection.d.ts.map +1 -1
  3. package/lib/db/OrderDiscountsCollection.d.ts +1 -1
  4. package/lib/db/OrderDiscountsCollection.d.ts.map +1 -1
  5. package/lib/db/OrderPaymentsCollection.d.ts +1 -1
  6. package/lib/db/OrderPaymentsCollection.d.ts.map +1 -1
  7. package/lib/db/OrderPositionsCollection.d.ts +1 -1
  8. package/lib/db/OrderPositionsCollection.d.ts.map +1 -1
  9. package/lib/director/OrderDiscountAdapter.d.ts +2 -2
  10. package/lib/director/OrderDiscountAdapter.d.ts.map +1 -1
  11. package/lib/director/OrderDiscountAdapter.js.map +1 -1
  12. package/lib/director/OrderDiscountDirector.d.ts +1 -1
  13. package/lib/director/OrderDiscountDirector.d.ts.map +1 -1
  14. package/lib/director/OrderDiscountDirector.js.map +1 -1
  15. package/lib/director/OrderPricingAdapter.d.ts +3 -3
  16. package/lib/director/OrderPricingAdapter.d.ts.map +1 -1
  17. package/lib/director/OrderPricingAdapter.js.map +1 -1
  18. package/lib/director/OrderPricingDirector.d.ts +1 -1
  19. package/lib/director/OrderPricingDirector.d.ts.map +1 -1
  20. package/lib/module/buildFindSelector.d.ts +5 -0
  21. package/lib/module/buildFindSelector.d.ts.map +1 -0
  22. package/lib/module/buildFindSelector.js +18 -0
  23. package/lib/module/buildFindSelector.js.map +1 -0
  24. package/lib/module/configureOrderDeliveriesModule.d.ts +14 -27
  25. package/lib/module/configureOrderDeliveriesModule.d.ts.map +1 -1
  26. package/lib/module/configureOrderDeliveriesModule.js +7 -68
  27. package/lib/module/configureOrderDeliveriesModule.js.map +1 -1
  28. package/lib/module/configureOrderDeliveriesModule_BACKUP_54554.d.ts +24 -0
  29. package/lib/module/configureOrderDeliveriesModule_BACKUP_54554.d.ts.map +1 -0
  30. package/lib/module/configureOrderDeliveriesModule_BACKUP_54554.js +101 -0
  31. package/lib/module/configureOrderDeliveriesModule_BACKUP_54554.js.map +1 -0
  32. package/lib/module/configureOrderDeliveriesModule_BASE_54554.d.ts +36 -0
  33. package/lib/module/configureOrderDeliveriesModule_BASE_54554.d.ts.map +1 -0
  34. package/lib/module/configureOrderDeliveriesModule_BASE_54554.js +162 -0
  35. package/lib/module/configureOrderDeliveriesModule_BASE_54554.js.map +1 -0
  36. package/lib/module/configureOrderDeliveriesModule_LOCAL_54554.d.ts +23 -0
  37. package/lib/module/configureOrderDeliveriesModule_LOCAL_54554.d.ts.map +1 -0
  38. package/lib/module/configureOrderDeliveriesModule_LOCAL_54554.js +97 -0
  39. package/lib/module/configureOrderDeliveriesModule_LOCAL_54554.js.map +1 -0
  40. package/lib/module/configureOrderDeliveriesModule_REMOTE_54554.d.ts +37 -0
  41. package/lib/module/configureOrderDeliveriesModule_REMOTE_54554.d.ts.map +1 -0
  42. package/lib/module/configureOrderDeliveriesModule_REMOTE_54554.js +166 -0
  43. package/lib/module/configureOrderDeliveriesModule_REMOTE_54554.js.map +1 -0
  44. package/lib/module/configureOrderDiscountsModule.d.ts +17 -18
  45. package/lib/module/configureOrderDiscountsModule.d.ts.map +1 -1
  46. package/lib/module/configureOrderDiscountsModule.js +31 -140
  47. package/lib/module/configureOrderDiscountsModule.js.map +1 -1
  48. package/lib/module/configureOrderDiscountsModule_BACKUP_55046.d.ts +26 -0
  49. package/lib/module/configureOrderDiscountsModule_BACKUP_55046.d.ts.map +1 -0
  50. package/lib/module/configureOrderDiscountsModule_BACKUP_55046.js +69 -0
  51. package/lib/module/configureOrderDiscountsModule_BACKUP_55046.js.map +1 -0
  52. package/lib/module/configureOrderDiscountsModule_BASE_55046.d.ts +26 -0
  53. package/lib/module/configureOrderDiscountsModule_BASE_55046.d.ts.map +1 -0
  54. package/lib/module/configureOrderDiscountsModule_BASE_55046.js +178 -0
  55. package/lib/module/configureOrderDiscountsModule_BASE_55046.js.map +1 -0
  56. package/lib/module/configureOrderDiscountsModule_LOCAL_55046.d.ts +25 -0
  57. package/lib/module/configureOrderDiscountsModule_LOCAL_55046.d.ts.map +1 -0
  58. package/lib/module/configureOrderDiscountsModule_LOCAL_55046.js +65 -0
  59. package/lib/module/configureOrderDiscountsModule_LOCAL_55046.js.map +1 -0
  60. package/lib/module/configureOrderDiscountsModule_REMOTE_55046.d.ts +27 -0
  61. package/lib/module/configureOrderDiscountsModule_REMOTE_55046.d.ts.map +1 -0
  62. package/lib/module/configureOrderDiscountsModule_REMOTE_55046.js +182 -0
  63. package/lib/module/configureOrderDiscountsModule_REMOTE_55046.js.map +1 -0
  64. package/lib/module/configureOrderPaymentsModule.d.ts +17 -37
  65. package/lib/module/configureOrderPaymentsModule.d.ts.map +1 -1
  66. package/lib/module/configureOrderPaymentsModule.js +10 -118
  67. package/lib/module/configureOrderPaymentsModule.js.map +1 -1
  68. package/lib/module/configureOrderPaymentsModule_BACKUP_55464.d.ts +32 -0
  69. package/lib/module/configureOrderPaymentsModule_BACKUP_55464.d.ts.map +1 -0
  70. package/lib/module/configureOrderPaymentsModule_BACKUP_55464.js +135 -0
  71. package/lib/module/configureOrderPaymentsModule_BACKUP_55464.js.map +1 -0
  72. package/lib/module/configureOrderPaymentsModule_BACKUP_55877.d.ts +32 -0
  73. package/lib/module/configureOrderPaymentsModule_BACKUP_55877.d.ts.map +1 -0
  74. package/lib/module/configureOrderPaymentsModule_BACKUP_55877.js +135 -0
  75. package/lib/module/configureOrderPaymentsModule_BACKUP_55877.js.map +1 -0
  76. package/lib/module/configureOrderPaymentsModule_BASE_55464.d.ts +51 -0
  77. package/lib/module/configureOrderPaymentsModule_BASE_55464.d.ts.map +1 -0
  78. package/lib/module/configureOrderPaymentsModule_BASE_55464.js +243 -0
  79. package/lib/module/configureOrderPaymentsModule_BASE_55464.js.map +1 -0
  80. package/lib/module/configureOrderPaymentsModule_BASE_55877.d.ts +51 -0
  81. package/lib/module/configureOrderPaymentsModule_BASE_55877.d.ts.map +1 -0
  82. package/lib/module/configureOrderPaymentsModule_BASE_55877.js +243 -0
  83. package/lib/module/configureOrderPaymentsModule_BASE_55877.js.map +1 -0
  84. package/lib/module/configureOrderPaymentsModule_LOCAL_55464.d.ts +31 -0
  85. package/lib/module/configureOrderPaymentsModule_LOCAL_55464.d.ts.map +1 -0
  86. package/lib/module/configureOrderPaymentsModule_LOCAL_55464.js +131 -0
  87. package/lib/module/configureOrderPaymentsModule_LOCAL_55464.js.map +1 -0
  88. package/lib/module/configureOrderPaymentsModule_LOCAL_55877.d.ts +31 -0
  89. package/lib/module/configureOrderPaymentsModule_LOCAL_55877.d.ts.map +1 -0
  90. package/lib/module/configureOrderPaymentsModule_LOCAL_55877.js +131 -0
  91. package/lib/module/configureOrderPaymentsModule_LOCAL_55877.js.map +1 -0
  92. package/lib/module/configureOrderPaymentsModule_REMOTE_55464.d.ts +52 -0
  93. package/lib/module/configureOrderPaymentsModule_REMOTE_55464.d.ts.map +1 -0
  94. package/lib/module/configureOrderPaymentsModule_REMOTE_55464.js +247 -0
  95. package/lib/module/configureOrderPaymentsModule_REMOTE_55464.js.map +1 -0
  96. package/lib/module/configureOrderPaymentsModule_REMOTE_55877.d.ts +52 -0
  97. package/lib/module/configureOrderPaymentsModule_REMOTE_55877.d.ts.map +1 -0
  98. package/lib/module/configureOrderPaymentsModule_REMOTE_55877.js +247 -0
  99. package/lib/module/configureOrderPaymentsModule_REMOTE_55877.js.map +1 -0
  100. package/lib/module/configureOrderPositionsModule.d.ts +22 -41
  101. package/lib/module/configureOrderPositionsModule.d.ts.map +1 -1
  102. package/lib/module/configureOrderPositionsModule.js +19 -82
  103. package/lib/module/configureOrderPositionsModule.js.map +1 -1
  104. package/lib/module/configureOrderPositionsModule_BACKUP_56197.d.ts +44 -0
  105. package/lib/module/configureOrderPositionsModule_BACKUP_56197.d.ts.map +1 -0
  106. package/lib/module/configureOrderPositionsModule_BACKUP_56197.js +138 -0
  107. package/lib/module/configureOrderPositionsModule_BACKUP_56197.js.map +1 -0
  108. package/lib/module/configureOrderPositionsModule_BASE_56197.d.ts +60 -0
  109. package/lib/module/configureOrderPositionsModule_BASE_56197.d.ts.map +1 -0
  110. package/lib/module/configureOrderPositionsModule_BASE_56197.js +201 -0
  111. package/lib/module/configureOrderPositionsModule_BASE_56197.js.map +1 -0
  112. package/lib/module/configureOrderPositionsModule_LOCAL_56197.d.ts +43 -0
  113. package/lib/module/configureOrderPositionsModule_LOCAL_56197.d.ts.map +1 -0
  114. package/lib/module/configureOrderPositionsModule_LOCAL_56197.js +134 -0
  115. package/lib/module/configureOrderPositionsModule_LOCAL_56197.js.map +1 -0
  116. package/lib/module/configureOrderPositionsModule_REMOTE_56197.d.ts +61 -0
  117. package/lib/module/configureOrderPositionsModule_REMOTE_56197.d.ts.map +1 -0
  118. package/lib/module/configureOrderPositionsModule_REMOTE_56197.js +205 -0
  119. package/lib/module/configureOrderPositionsModule_REMOTE_56197.js.map +1 -0
  120. package/lib/module/configureOrdersModule-mutations.d.ts +4 -11
  121. package/lib/module/configureOrdersModule-mutations.d.ts.map +1 -1
  122. package/lib/module/configureOrdersModule-mutations.js +10 -49
  123. package/lib/module/configureOrdersModule-mutations.js.map +1 -1
  124. package/lib/module/configureOrdersModule-processing.d.ts +4 -8
  125. package/lib/module/configureOrdersModule-processing.d.ts.map +1 -1
  126. package/lib/module/configureOrdersModule-processing.js +3 -1
  127. package/lib/module/configureOrdersModule-processing.js.map +1 -1
  128. package/lib/module/configureOrdersModule-queries.d.ts +10 -5
  129. package/lib/module/configureOrdersModule-queries.d.ts.map +1 -1
  130. package/lib/module/configureOrdersModule-queries.js +35 -22
  131. package/lib/module/configureOrdersModule-queries.js.map +1 -1
  132. package/lib/module/configureOrdersModule-transformations.d.ts +2 -3
  133. package/lib/module/configureOrdersModule-transformations.d.ts.map +1 -1
  134. package/lib/module/configureOrdersModule-transformations.js +3 -3
  135. package/lib/module/configureOrdersModule-transformations.js.map +1 -1
  136. package/lib/module/configureOrdersModule.d.ts +11 -8
  137. package/lib/module/configureOrdersModule.d.ts.map +1 -1
  138. package/lib/module/configureOrdersModule.js +133 -153
  139. package/lib/module/configureOrdersModule.js.map +1 -1
  140. package/lib/orders-index.d.ts +0 -7
  141. package/lib/orders-index.d.ts.map +1 -1
  142. package/lib/orders-index.js +0 -7
  143. package/lib/orders-index.js.map +1 -1
  144. package/lib/orders-settings.d.ts +3 -7
  145. package/lib/orders-settings.d.ts.map +1 -1
  146. package/lib/orders-settings.js.map +1 -1
  147. package/lib/types.d.ts +8 -9
  148. package/lib/types.d.ts.map +1 -1
  149. package/lib/types.js.map +1 -1
  150. package/package.json +9 -12
  151. package/src/db/OrderDeliveriesCollection.ts +1 -1
  152. package/src/db/OrderDiscountsCollection.ts +1 -1
  153. package/src/db/OrderPaymentsCollection.ts +1 -1
  154. package/src/db/OrderPositionsCollection.ts +1 -1
  155. package/src/module/buildFindSelector.test.ts +1 -1
  156. package/src/module/buildFindSelector.ts +24 -0
  157. package/src/module/configureOrderDeliveriesModule.ts +29 -172
  158. package/src/module/configureOrderDiscountsModule.ts +44 -210
  159. package/src/module/configureOrderPaymentsModule.ts +51 -261
  160. package/src/module/configureOrderPositionsModule.ts +54 -205
  161. package/src/module/configureOrdersModule-mutations.ts +12 -85
  162. package/src/module/configureOrdersModule-queries.ts +53 -29
  163. package/src/module/configureOrdersModule.ts +180 -263
  164. package/src/orders-index.ts +0 -9
  165. package/src/orders-settings.ts +4 -6
  166. package/src/types.ts +8 -9
  167. package/tsconfig.json +5 -7
  168. package/lib/service/migrateOrderCartService.d.ts +0 -10
  169. package/lib/service/migrateOrderCartService.d.ts.map +0 -1
  170. package/lib/service/migrateOrderCartService.js +0 -32
  171. package/lib/service/migrateOrderCartService.js.map +0 -1
  172. package/lib/service/nextUserCartService.d.ts +0 -11
  173. package/lib/service/nextUserCartService.d.ts.map +0 -1
  174. package/lib/service/nextUserCartService.js +0 -34
  175. package/lib/service/nextUserCartService.js.map +0 -1
  176. package/lib/service/orderServices.d.ts +0 -8
  177. package/lib/service/orderServices.d.ts.map +0 -1
  178. package/lib/service/orderServices.js +0 -7
  179. package/lib/service/orderServices.js.map +0 -1
  180. package/src/director/OrderDiscountAdapter.ts +0 -8
  181. package/src/director/OrderDiscountConfiguration.ts +0 -5
  182. package/src/director/OrderDiscountDirector.ts +0 -5
  183. package/src/director/OrderPricingAdapter.ts +0 -61
  184. package/src/director/OrderPricingDirector.ts +0 -72
  185. package/src/director/OrderPricingSheet.ts +0 -146
  186. package/src/module/configureOrdersModule-processing.ts +0 -508
  187. package/src/module/configureOrdersModule-transformations.ts +0 -171
  188. package/src/service/migrateOrderCartService.ts +0 -53
  189. package/src/service/nextUserCartService.ts +0 -54
  190. package/src/service/orderServices.ts +0 -12
@@ -1,16 +1,10 @@
1
- import { UnchainedCore } from '@unchainedshop/core';
2
- import { OrderDelivery } from '@unchainedshop/core-orders';
3
- import { OrderPayment } from '@unchainedshop/core-orders';
4
- import { generateDbFilterById, ModuleInput } from '@unchainedshop/mongodb';
1
+ import { generateDbFilterById, ModuleInput, mongodb } from '@unchainedshop/mongodb';
5
2
  import { createRequire } from 'node:module';
6
3
  import { OrderDeliveriesCollection } from '../db/OrderDeliveriesCollection.js';
7
4
  import { OrderDiscountsCollection } from '../db/OrderDiscountsCollection.js';
8
- import { OrderDiscountTrigger } from '../db/OrderDiscountTrigger.js';
9
5
  import { OrderPaymentsCollection } from '../db/OrderPaymentsCollection.js';
10
6
  import { OrderPositionsCollection } from '../db/OrderPositionsCollection.js';
11
7
  import { OrdersCollection } from '../db/OrdersCollection.js';
12
- import { OrderDiscountDirector } from '../director/OrderDiscountDirector.js';
13
- import { OrderPricingDirector } from '../director/OrderPricingDirector.js';
14
8
  import { ordersSettings, OrdersSettingsOptions } from '../orders-settings.js';
15
9
  import {
16
10
  configureOrderDeliveriesModule,
@@ -20,37 +14,45 @@ import { configureOrderDiscountsModule, OrderDiscountsModule } from './configure
20
14
  import { configureOrderPaymentsModule, OrderPaymentsModule } from './configureOrderPaymentsModule.js';
21
15
  import { configureOrderPositionsModule, OrderPositionsModule } from './configureOrderPositionsModule.js';
22
16
  import { configureOrderModuleMutations, OrderMutations } from './configureOrdersModule-mutations.js';
23
- import { configureOrderModuleProcessing, OrderProcessing } from './configureOrdersModule-processing.js';
24
17
  import { configureOrdersModuleQueries, OrderQueries } from './configureOrdersModule-queries.js';
25
- import {
26
- configureOrderModuleTransformations,
27
- OrderTransformations,
28
- } from './configureOrdersModule-transformations.js';
29
- import { Order, OrderPosition } from '../types.js';
18
+
19
+ import { emit, registerEvents } from '@unchainedshop/events';
20
+ import { Order, OrderStatus } from '../types.js';
30
21
 
31
22
  export type OrdersModule = OrderQueries &
32
- OrderTransformations &
33
- OrderProcessing &
34
23
  OrderMutations & {
35
- // Order context recalculations
36
- initProviders: (order: Order, unchainedAPI: UnchainedCore) => Promise<Order>;
37
- updateCalculation: (orderId: string, unchainedAPI: UnchainedCore) => Promise<Order>;
38
- invalidateProviders: (unchainedAPI: UnchainedCore, maxAgeDays: number) => Promise<void>;
39
-
40
24
  // Sub entities
41
25
  deliveries: OrderDeliveriesModule;
42
26
  discounts: OrderDiscountsModule;
43
27
  positions: OrderPositionsModule;
44
28
  payments: OrderPaymentsModule;
29
+
30
+ updateStatus: (orderId: string, params: { status: OrderStatus; info?: string }) => Promise<Order>;
31
+ acquireLock: (
32
+ orderId: string,
33
+ identifier: string,
34
+ timeout?: number,
35
+ ) => Promise<{ release: () => void }>;
36
+ setDeliveryProvider: (orderId: string, deliveryProviderId: string) => Promise<Order>;
37
+ setPaymentProvider: (orderId: string, paymentProviderId: string) => Promise<Order>;
45
38
  };
46
39
 
47
40
  const require = createRequire(import.meta.url);
48
41
  const { Locker, MongoAdapter } = require('@kontsedal/locco');
49
42
 
43
+ const ORDER_EVENTS: string[] = [
44
+ 'ORDER_CHECKOUT',
45
+ 'ORDER_CONFIRMED',
46
+ 'ORDER_REJECTED',
47
+ 'ORDER_FULLFILLED',
48
+ ];
49
+
50
50
  export const configureOrdersModule = async ({
51
51
  db,
52
52
  options: orderOptions = {},
53
53
  }: ModuleInput<OrdersSettingsOptions>): Promise<OrdersModule> => {
54
+ registerEvents(ORDER_EVENTS);
55
+
54
56
  ordersSettings.configureSettings(orderOptions);
55
57
 
56
58
  const Orders = await OrdersCollection(db);
@@ -69,246 +71,10 @@ export const configureOrdersModule = async ({
69
71
  retrySettings: { retryDelay: 200, retryTimes: 10 },
70
72
  });
71
73
 
72
- const findOrderPositions = async (order: Order) =>
73
- OrderPositions.find(
74
- {
75
- orderId: order._id,
76
- quantity: { $gt: 0 },
77
- },
78
- {},
79
- ).toArray();
80
-
81
- const findOrderDelivery = async (order: Order) =>
82
- OrderDeliveries.findOne(generateDbFilterById(order.deliveryId), {});
83
-
84
- const findOrderPayment = async (order: Order) =>
85
- OrderPayments.findOne(generateDbFilterById(order.paymentId), {});
86
-
87
- const updateDiscounts = async (order: Order, unchainedAPI: UnchainedCore) => {
88
- const { modules } = unchainedAPI;
89
-
90
- // 1. go through existing order-discounts and check if discount still valid,
91
- // those who are not valid anymore should get removed
92
- const discounts = await modules.orders.discounts.findOrderDiscounts({
93
- orderId: order._id,
94
- });
95
-
96
- await Promise.all(
97
- discounts.map(async (discount) => {
98
- const isValid = await modules.orders.discounts.isValid(discount, unchainedAPI);
99
-
100
- if (!isValid) {
101
- await modules.orders.discounts.delete(discount._id, unchainedAPI);
102
- }
103
- }),
104
- );
105
-
106
- // 2. run auto-system discount
107
- const cleanedDiscounts = await modules.orders.discounts.findOrderDiscounts({
108
- orderId: order._id,
109
- });
110
-
111
- const currentDiscountKeys = cleanedDiscounts.map(({ discountKey }) => discountKey);
112
-
113
- const director = await OrderDiscountDirector.actions({ order, code: null }, unchainedAPI);
114
- const systemDiscounts = await director.findSystemDiscounts();
115
-
116
- await Promise.all(
117
- systemDiscounts
118
- .filter((key) => currentDiscountKeys.indexOf(key) === -1)
119
- .map(async (discountKey) =>
120
- modules.orders.discounts.create({
121
- orderId: order._id,
122
- discountKey,
123
- trigger: OrderDiscountTrigger.SYSTEM,
124
- }),
125
- ),
126
- );
127
- };
128
-
129
- const initProviders = async (order: Order, unchainedAPI: UnchainedCore) => {
130
- const { modules } = unchainedAPI;
131
-
132
- let updatedOrder = order;
133
-
134
- // Init delivery provider
135
- const supportedDeliveryProviders = await modules.delivery.findSupported(
136
- { order: updatedOrder },
137
- unchainedAPI,
138
- );
139
-
140
- const orderDelivery = await modules.orders.deliveries.findDelivery({
141
- orderDeliveryId: updatedOrder.deliveryId,
142
- });
143
- const deliveryProviderId = orderDelivery?.deliveryProviderId;
144
-
145
- const isAlreadyInitializedWithSupportedDeliveryProvider = supportedDeliveryProviders?.some(
146
- (provider) => {
147
- return provider._id === deliveryProviderId;
148
- },
149
- );
150
-
151
- if (supportedDeliveryProviders?.length > 0 && !isAlreadyInitializedWithSupportedDeliveryProvider) {
152
- const defaultOrderDeliveryProvider = await modules.delivery.determineDefault(
153
- supportedDeliveryProviders,
154
- { order: updatedOrder },
155
- unchainedAPI,
156
- );
157
- if (defaultOrderDeliveryProvider) {
158
- updatedOrder = await modules.orders.setDeliveryProvider(
159
- updatedOrder._id,
160
- defaultOrderDeliveryProvider._id,
161
- unchainedAPI,
162
- );
163
- }
164
- }
165
-
166
- // Init payment provider
167
- const supportedPaymentProviders = await modules.payment.paymentProviders.findSupported(
168
- { order: updatedOrder },
169
- unchainedAPI,
170
- );
171
-
172
- const orderPayment = await modules.orders.payments.findOrderPayment({
173
- orderPaymentId: updatedOrder.paymentId,
174
- });
175
- const paymentProviderId = orderPayment?.paymentProviderId;
176
-
177
- const isAlreadyInitializedWithSupportedPaymentProvider = supportedPaymentProviders?.some(
178
- (provider) => {
179
- return provider._id === paymentProviderId;
180
- },
181
- );
182
-
183
- if (supportedPaymentProviders?.length > 0 && !isAlreadyInitializedWithSupportedPaymentProvider) {
184
- const paymentCredentials = await modules.payment.paymentCredentials.findPaymentCredentials(
185
- { userId: updatedOrder.userId, isPreferred: true },
186
- {
187
- sort: {
188
- created: -1,
189
- },
190
- },
191
- );
192
-
193
- const defaultOrderPaymentProvider = await modules.payment.paymentProviders.determineDefault(
194
- supportedPaymentProviders,
195
- { order: updatedOrder, paymentCredentials },
196
- unchainedAPI,
197
- );
198
-
199
- if (defaultOrderPaymentProvider) {
200
- updatedOrder = await modules.orders.setPaymentProvider(
201
- updatedOrder._id,
202
- defaultOrderPaymentProvider._id,
203
- unchainedAPI,
204
- );
205
- }
206
- }
207
- return updatedOrder;
208
- };
209
-
210
- const updateCalculation: OrdersModule['updateCalculation'] = async (orderId, unchainedAPI) => {
211
- const { modules } = unchainedAPI;
212
-
213
- const selector = generateDbFilterById(orderId);
214
- const order = (await Orders.findOne(selector, {})) as Order;
215
-
216
- // Don't recalculate orders, only carts
217
- if (order.status !== null) return order;
218
-
219
- await updateDiscounts(order, unchainedAPI);
220
-
221
- let orderPositions = (await findOrderPositions(order)) as OrderPosition[];
222
- orderPositions = await Promise.all(
223
- orderPositions.map(async (orderPosition) =>
224
- modules.orders.positions.updateCalculation(orderPosition, unchainedAPI),
225
- ),
226
- );
227
-
228
- let orderDelivery = (await findOrderDelivery(order)) as OrderDelivery;
229
- if (orderDelivery) {
230
- orderDelivery = await modules.orders.deliveries.updateCalculation(orderDelivery, unchainedAPI);
231
- }
232
- let orderPayment = (await findOrderPayment(order)) as OrderPayment;
233
- if (orderPayment) {
234
- orderPayment = await modules.orders.payments.updateCalculation(orderPayment, unchainedAPI);
235
- }
236
-
237
- orderPositions = await Promise.all(
238
- orderPositions.map(async (orderPosition) =>
239
- modules.orders.positions.updateScheduling({ order, orderDelivery, orderPosition }, unchainedAPI),
240
- ),
241
- );
242
-
243
- const pricing = await OrderPricingDirector.actions(
244
- { order, orderPositions, orderDelivery, orderPayment },
245
- unchainedAPI,
246
- );
247
-
248
- const calculation = await pricing.calculate();
249
- const updated = new Date();
250
-
251
- await Orders.updateOne(selector, {
252
- $set: {
253
- calculation,
254
- updated,
255
- },
256
- });
257
-
258
- /*
259
- // We have to do initProviders after calculation, only then filterSupportedProviders will work correctly and has access to recent pricing
260
- // initProviders calls updateCalculation anyways recursively when a new payment or delivery provider gets set
261
- // Thus, if for example a discount change leads to a free delivery and free payment due to free items amount, the following happens in the stack:
262
- // 1. create discount
263
- // 2. update calculation -> order pricing updated to items 0
264
- // 3. initProviders with updated order -> filterSupportedProviders -> delivery provider is invalid -> set new delivery provider
265
- // 4. update calculation -> order pricing updated to items 0 and delivery 0
266
- // 5. initProviders with updated order -> filterSupportedProviders -> payment provider is invalid -> set new payment provider
267
- // 6. update calculation -> order pricing updated to items 0, delivery 0, payment 0
268
- // 7. initProviders with updated order -> all providers are valid -> return order
269
- */
270
- return initProviders(
271
- {
272
- ...order,
273
- calculation,
274
- updated,
275
- },
276
- unchainedAPI,
277
- );
278
- };
279
-
280
- const invalidateProviders = async (unchainedAPI, maxAgeDays = 30) => {
281
- const ONE_DAY_IN_MILLISECONDS = 86400000;
282
-
283
- const minValidDate = new Date(new Date().getTime() - maxAgeDays * ONE_DAY_IN_MILLISECONDS);
284
-
285
- const orders = await Orders.find({
286
- status: { $eq: null },
287
- updated: { $gte: minValidDate },
288
- }).toArray();
289
-
290
- await Promise.allSettled(
291
- orders.map(async (order) => {
292
- await updateCalculation(order._id, unchainedAPI);
293
- }),
294
- );
295
- };
296
-
297
74
  const orderQueries = configureOrdersModuleQueries({ Orders });
298
- const orderTransformations = configureOrderModuleTransformations({
299
- Orders,
300
- });
301
- const orderProcessing = configureOrderModuleProcessing({
302
- Orders,
303
- OrderDeliveries,
304
- OrderPayments,
305
- OrderPositions,
306
- locker,
307
- });
75
+
308
76
  const orderMutations = configureOrderModuleMutations({
309
77
  Orders,
310
- OrderDeliveries,
311
- OrderPayments,
312
78
  OrderPositions,
313
79
  });
314
80
 
@@ -328,20 +94,171 @@ export const configureOrdersModule = async ({
328
94
  OrderDeliveries,
329
95
  });
330
96
 
97
+ const findNewOrderNumber = async (order: Order, index = 0) => {
98
+ const newHashID = ordersSettings.orderNumberHashFn(order, index);
99
+ if ((await Orders.countDocuments({ orderNumber: newHashID }, { limit: 1 })) === 0) {
100
+ return newHashID;
101
+ }
102
+ return findNewOrderNumber(order, index + 1);
103
+ };
104
+
331
105
  return {
332
106
  ...orderQueries,
333
- ...orderTransformations,
334
- ...orderProcessing,
335
107
  ...orderMutations,
336
108
 
337
- initProviders,
338
- updateCalculation,
339
- invalidateProviders,
340
-
341
109
  // Subentities
342
110
  deliveries: orderDeliveriesModule,
343
111
  discounts: orderDiscountsModule,
344
112
  positions: orderPositionsModule,
345
113
  payments: orderPaymentsModule,
114
+
115
+ updateStatus: async (orderId, { status, info }) => {
116
+ const selector = generateDbFilterById(orderId);
117
+ const order = await Orders.findOne(selector, {});
118
+
119
+ if (order.status === status) return order;
120
+
121
+ const date = new Date();
122
+ const $set: Partial<Order> = {
123
+ status,
124
+ updated: new Date(),
125
+ };
126
+ switch (status) {
127
+ // explicitly use fallthrough here!
128
+ case OrderStatus.FULLFILLED:
129
+ $set.fullfilled = order.fullfilled || date;
130
+ case OrderStatus.REJECTED: // eslint-disable-line no-fallthrough
131
+ case OrderStatus.CONFIRMED: // eslint-disable-line no-fallthrough
132
+ if (status === OrderStatus.REJECTED) {
133
+ $set.rejected = order.rejected || date;
134
+ } else {
135
+ $set.confirmed = order.confirmed || date;
136
+ }
137
+ case OrderStatus.PENDING: // eslint-disable-line no-fallthrough
138
+ $set.ordered = order.ordered || date;
139
+ $set.orderNumber = order.orderNumber || (await findNewOrderNumber(order));
140
+ break;
141
+ default:
142
+ break;
143
+ }
144
+
145
+ const modifier: mongodb.UpdateFilter<Order> = {
146
+ $set,
147
+ $push: {
148
+ log: {
149
+ date,
150
+ status,
151
+ info,
152
+ },
153
+ },
154
+ };
155
+
156
+ const modificationResult = await Orders.findOneAndUpdate(
157
+ {
158
+ ...selector,
159
+ status: { $ne: status }, // Only update if status is different
160
+ },
161
+ modifier,
162
+ {
163
+ returnDocument: 'after',
164
+ includeResultMetadata: true,
165
+ },
166
+ );
167
+
168
+ if (modificationResult.ok) {
169
+ if (order.status === null) {
170
+ // The first time that an order transitions away from cart is a checkout event
171
+ await emit('ORDER_CHECKOUT', { order: modificationResult.value, oldStatus: order.status });
172
+ }
173
+ switch (status) {
174
+ case OrderStatus.FULLFILLED:
175
+ await emit('ORDER_FULLFILLED', { order: modificationResult.value, oldStatus: order.status });
176
+ break;
177
+ case OrderStatus.REJECTED:
178
+ await emit('ORDER_REJECTED', { order: modificationResult.value, oldStatus: order.status });
179
+ break;
180
+ case OrderStatus.CONFIRMED:
181
+ await emit('ORDER_CONFIRMED', { order: modificationResult.value, oldStatus: order.status });
182
+ break;
183
+ default:
184
+ break;
185
+ }
186
+ }
187
+
188
+ return modificationResult.value || Orders.findOne(selector, {});
189
+ },
190
+
191
+ acquireLock: async (orderId: string, identifier: string, timeout = 5000) => {
192
+ return await locker.lock(`order:${identifier}:${orderId}`, timeout).acquire();
193
+ },
194
+
195
+ setDeliveryProvider: async (orderId, deliveryProviderId) => {
196
+ const delivery = await OrderDeliveries.findOne({
197
+ orderId,
198
+ deliveryProviderId,
199
+ });
200
+ const deliveryId =
201
+ delivery?._id ||
202
+ (
203
+ await orderDeliveriesModule.create({
204
+ calculation: [],
205
+ deliveryProviderId,
206
+ log: [],
207
+ orderId,
208
+ status: null,
209
+ })
210
+ )._id;
211
+
212
+ const order = await Orders.findOneAndUpdate(
213
+ { _id: orderId },
214
+ {
215
+ $set: {
216
+ deliveryId,
217
+ updated: new Date(),
218
+ },
219
+ },
220
+ { returnDocument: 'after' },
221
+ );
222
+
223
+ await emit('ORDER_SET_DELIVERY_PROVIDER', {
224
+ order,
225
+ deliveryProviderId,
226
+ });
227
+
228
+ return order;
229
+ },
230
+
231
+ setPaymentProvider: async (orderId, paymentProviderId) => {
232
+ const payment = await OrderPayments.findOne({
233
+ orderId,
234
+ paymentProviderId,
235
+ });
236
+
237
+ const paymentId =
238
+ payment?._id ||
239
+ (
240
+ await orderPaymentsModule.create({
241
+ calculation: [],
242
+ paymentProviderId,
243
+ log: [],
244
+ orderId,
245
+ status: null,
246
+ })
247
+ )._id;
248
+ const order = await Orders.findOneAndUpdate(
249
+ { _id: orderId },
250
+ {
251
+ $set: { paymentId, updated: new Date() },
252
+ },
253
+ { returnDocument: 'after' },
254
+ );
255
+
256
+ await emit('ORDER_SET_PAYMENT_PROVIDER', {
257
+ order,
258
+ paymentProviderId,
259
+ });
260
+
261
+ return order;
262
+ },
346
263
  };
347
264
  };
@@ -1,12 +1,3 @@
1
1
  export * from './types.js';
2
2
  export * from './module/configureOrdersModule.js';
3
- export * from './service/orderServices.js';
4
3
  export * from './orders-settings.js';
5
-
6
- export * from './director/OrderDiscountConfiguration.js';
7
- export * from './director/OrderDiscountAdapter.js';
8
- export * from './director/OrderDiscountDirector.js';
9
-
10
- export * from './director/OrderPricingAdapter.js';
11
- export * from './director/OrderPricingDirector.js';
12
- export * from './director/OrderPricingSheet.js';
@@ -1,9 +1,7 @@
1
1
  import { generateRandomHash } from '@unchainedshop/utils';
2
2
  import { Order } from './types.js';
3
- import { UnchainedCore } from '@unchainedshop/core';
4
- import { Product } from '@unchainedshop/core-products';
5
3
 
6
- export interface OrderSettingsOrderPositionValidation {
4
+ export interface OrderSettingsOrderPositionValidation<Product = unknown> {
7
5
  order: Order;
8
6
  product: Product;
9
7
  quantityDiff?: number;
@@ -13,14 +11,14 @@ export interface OrderSettingsOrderPositionValidation {
13
11
  export interface OrdersSettingsOptions {
14
12
  ensureUserHasCart?: boolean;
15
13
  orderNumberHashFn?: (order: Order, index: number) => string;
16
- validateOrderPosition?: (
14
+ validateOrderPosition?: <UnchainedAPI = unknown>(
17
15
  validationParams: OrderSettingsOrderPositionValidation,
18
- context: UnchainedCore,
16
+ unchainedAPI: UnchainedAPI,
19
17
  ) => Promise<void>;
20
18
  lockOrderDuringCheckout?: boolean;
21
19
  }
22
20
 
23
- export const defaultValidateOrderPosition = async ({ product }, { modules }) => {
21
+ export const defaultValidateOrderPosition = async ({ product }, { modules }: any) => {
24
22
  if (!modules.products.isActive(product)) {
25
23
  throw new Error('This product is inactive');
26
24
  }
package/src/types.ts CHANGED
@@ -1,6 +1,5 @@
1
- import type { ProductPricingCalculation } from '@unchainedshop/core-products';
2
- import type { TimestampFields, LogFields, Address, Contact } from '@unchainedshop/mongodb';
3
- import { OrderPrice } from './director/OrderPricingDirector.js';
1
+ import { TimestampFields, LogFields, Address, Contact } from '@unchainedshop/mongodb';
2
+ import { Price } from '@unchainedshop/utils';
4
3
 
5
4
  export type OrderReport = {
6
5
  newCount: number;
@@ -19,11 +18,11 @@ export enum OrderStatus {
19
18
 
20
19
  export type OrderPosition = {
21
20
  _id?: string;
22
- calculation: Array<ProductPricingCalculation>;
21
+ calculation: Array<any>;
23
22
  configuration: Array<{ key: string; value: string }>;
24
23
  context?: any;
25
24
  orderId: string;
26
- originalProductId?: string;
25
+ originalProductId: string;
27
26
  productId: string;
28
27
  quantity: number;
29
28
  quotationId?: string;
@@ -60,7 +59,7 @@ export type OrderDiscount = {
60
59
  _id?: string;
61
60
  orderId: string;
62
61
  code?: string;
63
- total?: OrderPrice;
62
+ total?: Price;
64
63
  trigger?: OrderDiscountTrigger;
65
64
  discountKey?: string;
66
65
  reservation?: any;
@@ -99,7 +98,7 @@ export type OrderPayment = {
99
98
  } & LogFields &
100
99
  TimestampFields;
101
100
 
102
- export type OrderPaymentDiscount = Omit<OrderPrice, '_id'> & {
101
+ export type OrderPaymentDiscount = Omit<Price, '_id'> & {
103
102
  _id?: string;
104
103
  discountId: string;
105
104
  item: OrderPayment;
@@ -116,13 +115,13 @@ export type OrderDelivery = {
116
115
  } & LogFields &
117
116
  TimestampFields;
118
117
 
119
- export type OrderDeliveryDiscount = Omit<OrderPrice, '_id'> & {
118
+ export type OrderDeliveryDiscount = Omit<Price, '_id'> & {
120
119
  _id?: string;
121
120
  discountId: string;
122
121
  item: OrderDelivery;
123
122
  };
124
123
 
125
- export type OrderPositionDiscount = Omit<OrderPrice, '_id'> & {
124
+ export type OrderPositionDiscount = Omit<Price, '_id'> & {
126
125
  _id?: string;
127
126
  discountId: string;
128
127
  item: OrderPosition;
package/tsconfig.json CHANGED
@@ -1,11 +1,9 @@
1
1
  {
2
2
  "extends": "../shared/base.tsconfig.json",
3
3
  "compilerOptions": {
4
- "rootDir": "src",
5
- "outDir": "lib",
4
+ "declarationDir": "./lib",
5
+ "rootDir": "./src",
6
+ "outDir": "./lib"
6
7
  },
7
- "exclude": ["**/*.test.ts", "**/*.test.js", "tests"],
8
- "include": [
9
- "./src"
10
- ]
11
- }
8
+ "exclude": ["**/*.test.ts", "**/*.test.js", "tests", "lib"]
9
+ }
@@ -1,10 +0,0 @@
1
- import { UnchainedCore } from '@unchainedshop/core';
2
- import { Order } from '../types.js';
3
- export type MigrateOrderCartsService = (params: {
4
- fromUserId: string;
5
- toUserId: string;
6
- shouldMerge: boolean;
7
- countryContext: string;
8
- }, unchainedAPI: UnchainedCore) => Promise<Order>;
9
- export declare const migrateOrderCartsService: MigrateOrderCartsService;
10
- //# sourceMappingURL=migrateOrderCartService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrateOrderCartService.d.ts","sourceRoot":"","sources":["../../src/service/migrateOrderCartService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,MAAM,wBAAwB,GAAG,CACrC,MAAM,EAAE;IACN,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB,EACD,YAAY,EAAE,aAAa,KACxB,OAAO,CAAC,KAAK,CAAC,CAAC;AAEpB,eAAO,MAAM,wBAAwB,EAAE,wBAuCtC,CAAC"}
@@ -1,32 +0,0 @@
1
- export const migrateOrderCartsService = async ({ fromUserId, toUserId, shouldMerge, countryContext }, unchainedAPI) => {
2
- const fromCart = await unchainedAPI.modules.orders.cart({
3
- countryContext,
4
- userId: fromUserId,
5
- });
6
- const toCart = await unchainedAPI.modules.orders.cart({
7
- countryContext,
8
- userId: toUserId,
9
- });
10
- if (!fromCart) {
11
- // No cart, don't copy
12
- return toCart;
13
- }
14
- if (!toCart || !shouldMerge) {
15
- // No destination cart, move whole cart
16
- unchainedAPI.modules.orders.setCartOwner({ orderId: fromCart._id, userId: toUserId });
17
- return unchainedAPI.modules.orders.updateCalculation(fromCart._id, unchainedAPI);
18
- }
19
- // Move positions
20
- unchainedAPI.modules.orders.moveCartPositions({ fromOrderId: fromCart._id, toOrderId: toCart._id });
21
- // Move billing address if target order has none
22
- if (fromCart.billingAddress && !toCart.billingAddress) {
23
- await unchainedAPI.modules.orders.updateBillingAddress(toCart._id, fromCart.billingAddress);
24
- }
25
- // Move contact data if target order has none
26
- if (fromCart.contact && !toCart.contact) {
27
- await unchainedAPI.modules.orders.updateContact(toCart._id, fromCart.contact);
28
- }
29
- await unchainedAPI.modules.orders.updateCalculation(fromCart._id, unchainedAPI);
30
- return unchainedAPI.modules.orders.updateCalculation(toCart._id, unchainedAPI);
31
- };
32
- //# sourceMappingURL=migrateOrderCartService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrateOrderCartService.js","sourceRoot":"","sources":["../../src/service/migrateOrderCartService.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,wBAAwB,GAA6B,KAAK,EACrE,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,EACrD,YAAY,EACZ,EAAE;IACF,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QACtD,cAAc;QACd,MAAM,EAAE,UAAU;KACnB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QACpD,cAAc;QACd,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,sBAAsB;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,uCAAuC;QACvC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtF,OAAO,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACnF,CAAC;IAED,iBAAiB;IACjB,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAEpG,gDAAgD;IAChD,IAAI,QAAQ,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QACtD,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC9F,CAAC;IAED,6CAA6C;IAC7C,IAAI,QAAQ,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAChF,OAAO,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACjF,CAAC,CAAC"}
@@ -1,11 +0,0 @@
1
- import { User } from '@unchainedshop/core-users';
2
- import { UnchainedCore } from '@unchainedshop/core';
3
- import { Order } from '../types.js';
4
- export type NextUserCartService = (params: {
5
- user: User;
6
- orderNumber?: string;
7
- countryCode?: string;
8
- forceCartCreation?: boolean;
9
- }, unchainedAPI: UnchainedCore) => Promise<Order | null>;
10
- export declare const nextUserCartService: NextUserCartService;
11
- //# sourceMappingURL=nextUserCartService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nextUserCartService.d.ts","sourceRoot":"","sources":["../../src/service/nextUserCartService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAGjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,MAAM,mBAAmB,GAAG,CAChC,MAAM,EAAE;IACN,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,EACD,YAAY,EAAE,aAAa,KACxB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;AAE3B,eAAO,MAAM,mBAAmB,EAAE,mBAqCjC,CAAC"}