@unchainedshop/core-orders 2.0.0-beta7 → 2.0.0-beta9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/jest.config.js +9 -0
- package/lib/director/OrderPricingDirector.js +5 -5
- package/lib/director/OrderPricingDirector.js.map +1 -1
- package/lib/module/configureOrderDeliveriesModule.d.ts +2 -1
- package/lib/module/configureOrderDeliveriesModule.js +30 -28
- package/lib/module/configureOrderDeliveriesModule.js.map +1 -1
- package/lib/module/configureOrderDiscountsModule.d.ts +2 -1
- package/lib/module/configureOrderDiscountsModule.js +40 -40
- package/lib/module/configureOrderDiscountsModule.js.map +1 -1
- package/lib/module/configureOrderPaymentsModule.d.ts +3 -1
- package/lib/module/configureOrderPaymentsModule.js +65 -39
- package/lib/module/configureOrderPaymentsModule.js.map +1 -1
- package/lib/module/configureOrderPositionsModule.d.ts +2 -1
- package/lib/module/configureOrderPositionsModule.js +39 -33
- package/lib/module/configureOrderPositionsModule.js.map +1 -1
- package/lib/module/configureOrdersModule-mutations.js +28 -33
- package/lib/module/configureOrdersModule-mutations.js.map +1 -1
- package/lib/module/configureOrdersModule-processing.js +55 -61
- package/lib/module/configureOrdersModule-processing.js.map +1 -1
- package/lib/module/configureOrdersModule-queries.d.ts +3 -2
- package/lib/module/configureOrdersModule-queries.js +1 -1
- package/lib/module/configureOrdersModule-queries.js.map +1 -1
- package/lib/module/configureOrdersModule-transformations.js +10 -10
- package/lib/module/configureOrdersModule-transformations.js.map +1 -1
- package/lib/module/configureOrdersModule.js +24 -26
- package/lib/module/configureOrdersModule.js.map +1 -1
- package/lib/service/createUserCartService.js +8 -8
- package/lib/service/createUserCartService.js.map +1 -1
- package/lib/service/migrateOrderCartService.js +3 -9
- package/lib/service/migrateOrderCartService.js.map +1 -1
- package/package.json +10 -9
- package/src/director/OrderPricingDirector.ts +5 -5
- package/src/module/configureOrderDeliveriesModule.ts +36 -46
- package/src/module/configureOrderDiscountsModule.ts +47 -59
- package/src/module/configureOrderPaymentsModule.ts +95 -78
- package/src/module/configureOrderPositionsModule.ts +61 -50
- package/src/module/configureOrdersModule-mutations.ts +50 -65
- package/src/module/configureOrdersModule-processing.ts +78 -88
- package/src/module/configureOrdersModule-queries.ts +1 -1
- package/src/module/configureOrdersModule-transformations.ts +10 -10
- package/src/module/configureOrdersModule.ts +29 -42
- package/src/service/createUserCartService.ts +20 -24
- package/src/service/migrateOrderCartService.ts +3 -11
- package/tests/orders-index.test.ts +103 -48
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Context } from '@unchainedshop/types/api';
|
|
2
1
|
import { Collection } from '@unchainedshop/types/common';
|
|
3
2
|
import { Order, OrderStatus, OrderProcessing, OrdersModule } from '@unchainedshop/types/orders';
|
|
4
3
|
import { OrderDelivery } from '@unchainedshop/types/orders.deliveries';
|
|
@@ -8,6 +7,7 @@ import { emit, registerEvents } from '@unchainedshop/events';
|
|
|
8
7
|
import { log } from '@unchainedshop/logger';
|
|
9
8
|
import { generateDbFilterById } from '@unchainedshop/utils';
|
|
10
9
|
import { ProductType } from '@unchainedshop/types/products';
|
|
10
|
+
import { UnchainedCore } from '@unchainedshop/types/core';
|
|
11
11
|
import { ordersSettings } from '../orders-settings';
|
|
12
12
|
|
|
13
13
|
const ORDER_PROCESSING_EVENTS: string[] = ['ORDER_CHECKOUT', 'ORDER_CONFIRMED', 'ORDER_FULLFILLED'];
|
|
@@ -48,7 +48,7 @@ export const configureOrderModuleProcessing = ({
|
|
|
48
48
|
return errors;
|
|
49
49
|
};
|
|
50
50
|
|
|
51
|
-
const itemValidationErrors = async (order: Order, { modules }:
|
|
51
|
+
const itemValidationErrors = async (order: Order, { modules }: UnchainedCore) => {
|
|
52
52
|
// Check if items are valid
|
|
53
53
|
const orderPositions = await findOrderPositions(order);
|
|
54
54
|
if (orderPositions.length === 0) {
|
|
@@ -87,8 +87,8 @@ export const configureOrderModuleProcessing = ({
|
|
|
87
87
|
return validationErrors.flatMap((f) => f);
|
|
88
88
|
};
|
|
89
89
|
|
|
90
|
-
const isAutoConfirmationEnabled = async (order: Order,
|
|
91
|
-
const { modules } =
|
|
90
|
+
const isAutoConfirmationEnabled = async (order: Order, unchainedAPI: UnchainedCore) => {
|
|
91
|
+
const { modules } = unchainedAPI;
|
|
92
92
|
|
|
93
93
|
if (order.status === OrderStatus.FULLFILLED || order.status === OrderStatus.CONFIRMED) {
|
|
94
94
|
return false;
|
|
@@ -97,20 +97,20 @@ export const configureOrderModuleProcessing = ({
|
|
|
97
97
|
const orderPayment = await findOrderPayment(order);
|
|
98
98
|
let isBlockingOrderConfirmation =
|
|
99
99
|
orderPayment &&
|
|
100
|
-
(await modules.orders.payments.isBlockingOrderConfirmation(orderPayment,
|
|
100
|
+
(await modules.orders.payments.isBlockingOrderConfirmation(orderPayment, unchainedAPI));
|
|
101
101
|
if (isBlockingOrderConfirmation) return false;
|
|
102
102
|
|
|
103
103
|
const orderDelivery = await findOrderDelivery(order);
|
|
104
104
|
isBlockingOrderConfirmation =
|
|
105
105
|
orderDelivery &&
|
|
106
|
-
(await modules.orders.deliveries.isBlockingOrderConfirmation(orderDelivery,
|
|
106
|
+
(await modules.orders.deliveries.isBlockingOrderConfirmation(orderDelivery, unchainedAPI));
|
|
107
107
|
if (isBlockingOrderConfirmation) return false;
|
|
108
108
|
|
|
109
109
|
return true;
|
|
110
110
|
};
|
|
111
111
|
|
|
112
|
-
const isAutoFullfillmentEnabled = async (order: Order,
|
|
113
|
-
const { modules } =
|
|
112
|
+
const isAutoFullfillmentEnabled = async (order: Order, unchainedAPI: UnchainedCore) => {
|
|
113
|
+
const { modules } = unchainedAPI;
|
|
114
114
|
|
|
115
115
|
const orderPayment = await findOrderPayment(order);
|
|
116
116
|
let isBlockingOrderFullfillment =
|
|
@@ -134,26 +134,26 @@ export const configureOrderModuleProcessing = ({
|
|
|
134
134
|
const findNextStatus = async (
|
|
135
135
|
status: OrderStatus | null,
|
|
136
136
|
order: Order,
|
|
137
|
-
|
|
137
|
+
unchainedAPI: UnchainedCore,
|
|
138
138
|
): Promise<OrderStatus> => {
|
|
139
139
|
if (status === null) {
|
|
140
140
|
if ((await missingInputDataForCheckout(order)).length === 0) {
|
|
141
|
-
emit('ORDER_CHECKOUT', { order });
|
|
141
|
+
await emit('ORDER_CHECKOUT', { order });
|
|
142
142
|
return OrderStatus.PENDING;
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
if (status === OrderStatus.PENDING) {
|
|
147
|
-
if (await isAutoConfirmationEnabled(order,
|
|
148
|
-
emit('ORDER_CONFIRMED', { order });
|
|
147
|
+
if (await isAutoConfirmationEnabled(order, unchainedAPI)) {
|
|
148
|
+
await emit('ORDER_CONFIRMED', { order });
|
|
149
149
|
return OrderStatus.CONFIRMED;
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
if (status === OrderStatus.CONFIRMED) {
|
|
154
|
-
const isFullfilled = await isAutoFullfillmentEnabled(order,
|
|
154
|
+
const isFullfilled = await isAutoFullfillmentEnabled(order, unchainedAPI);
|
|
155
155
|
if (isFullfilled) {
|
|
156
|
-
emit('ORDER_FULLFILLED', { order });
|
|
156
|
+
await emit('ORDER_FULLFILLED', { order });
|
|
157
157
|
return OrderStatus.FULLFILLED;
|
|
158
158
|
}
|
|
159
159
|
}
|
|
@@ -162,17 +162,17 @@ export const configureOrderModuleProcessing = ({
|
|
|
162
162
|
};
|
|
163
163
|
|
|
164
164
|
return {
|
|
165
|
-
checkout: async (orderId, { orderContext, paymentContext, deliveryContext },
|
|
166
|
-
const { modules
|
|
165
|
+
checkout: async (orderId, { orderContext, paymentContext, deliveryContext }, unchainedAPI) => {
|
|
166
|
+
const { modules } = unchainedAPI;
|
|
167
167
|
|
|
168
|
-
await modules.orders.updateContext(orderId, orderContext,
|
|
168
|
+
await modules.orders.updateContext(orderId, orderContext, unchainedAPI);
|
|
169
169
|
let order = await modules.orders.findOrder({ orderId });
|
|
170
170
|
|
|
171
171
|
if (order.status !== null) return order;
|
|
172
172
|
|
|
173
173
|
const errors = [
|
|
174
174
|
...(await missingInputDataForCheckout(order)),
|
|
175
|
-
...(await itemValidationErrors(order,
|
|
175
|
+
...(await itemValidationErrors(order, unchainedAPI)),
|
|
176
176
|
].filter(Boolean);
|
|
177
177
|
|
|
178
178
|
if (errors.length > 0) {
|
|
@@ -186,33 +186,31 @@ export const configureOrderModuleProcessing = ({
|
|
|
186
186
|
paymentContext,
|
|
187
187
|
deliveryContext,
|
|
188
188
|
},
|
|
189
|
-
|
|
189
|
+
unchainedAPI,
|
|
190
190
|
);
|
|
191
191
|
|
|
192
192
|
// After checkout, store last checkout information on user
|
|
193
|
-
await modules.users.updateLastBillingAddress(order.userId, order.billingAddress
|
|
194
|
-
await modules.users.updateLastContact(order.userId, order.contact
|
|
193
|
+
await modules.users.updateLastBillingAddress(order.userId, order.billingAddress);
|
|
194
|
+
await modules.users.updateLastContact(order.userId, order.contact);
|
|
195
195
|
|
|
196
196
|
// Then ensure new cart is created before we return from checkout
|
|
197
197
|
const user = await modules.users.findUserById(order.userId);
|
|
198
|
-
const locale = modules.users.userLocale(user
|
|
199
|
-
localeContext,
|
|
200
|
-
});
|
|
198
|
+
const locale = modules.users.userLocale(user);
|
|
201
199
|
await modules.orders.ensureCartForUser(
|
|
202
200
|
{
|
|
203
201
|
user,
|
|
204
202
|
countryCode: locale.country,
|
|
205
203
|
},
|
|
206
|
-
|
|
204
|
+
unchainedAPI,
|
|
207
205
|
);
|
|
208
206
|
|
|
209
207
|
return order;
|
|
210
208
|
},
|
|
211
209
|
|
|
212
|
-
confirm: async (orderId, { orderContext, paymentContext, deliveryContext },
|
|
213
|
-
const { modules } =
|
|
210
|
+
confirm: async (orderId, { orderContext, paymentContext, deliveryContext }, unchainedAPI) => {
|
|
211
|
+
const { modules } = unchainedAPI;
|
|
214
212
|
|
|
215
|
-
await modules.orders.updateContext(orderId, orderContext,
|
|
213
|
+
await modules.orders.updateContext(orderId, orderContext, unchainedAPI);
|
|
216
214
|
const order = await modules.orders.findOrder({ orderId });
|
|
217
215
|
|
|
218
216
|
if (order.status !== OrderStatus.PENDING) return order;
|
|
@@ -224,14 +222,14 @@ export const configureOrderModuleProcessing = ({
|
|
|
224
222
|
deliveryContext,
|
|
225
223
|
nextStatus: OrderStatus.CONFIRMED,
|
|
226
224
|
},
|
|
227
|
-
|
|
225
|
+
unchainedAPI,
|
|
228
226
|
);
|
|
229
227
|
},
|
|
230
228
|
|
|
231
|
-
reject: async (orderId, { orderContext, paymentContext, deliveryContext },
|
|
232
|
-
const { modules } =
|
|
229
|
+
reject: async (orderId, { orderContext, paymentContext, deliveryContext }, unchainedAPI) => {
|
|
230
|
+
const { modules } = unchainedAPI;
|
|
233
231
|
|
|
234
|
-
await modules.orders.updateContext(orderId, orderContext,
|
|
232
|
+
await modules.orders.updateContext(orderId, orderContext, unchainedAPI);
|
|
235
233
|
const order = await modules.orders.findOrder({ orderId });
|
|
236
234
|
|
|
237
235
|
if (order.status !== OrderStatus.PENDING) return order;
|
|
@@ -243,12 +241,12 @@ export const configureOrderModuleProcessing = ({
|
|
|
243
241
|
deliveryContext,
|
|
244
242
|
nextStatus: OrderStatus.REJECTED,
|
|
245
243
|
},
|
|
246
|
-
|
|
244
|
+
unchainedAPI,
|
|
247
245
|
);
|
|
248
246
|
},
|
|
249
247
|
|
|
250
|
-
ensureCartForUser: async ({ user, countryCode },
|
|
251
|
-
const { modules, services } =
|
|
248
|
+
ensureCartForUser: async ({ user, countryCode }, unchainedAPI) => {
|
|
249
|
+
const { modules, services } = unchainedAPI;
|
|
252
250
|
|
|
253
251
|
if (!ordersSettings.ensureUserHasCart) return null;
|
|
254
252
|
|
|
@@ -260,7 +258,7 @@ export const configureOrderModuleProcessing = ({
|
|
|
260
258
|
user,
|
|
261
259
|
countryCode,
|
|
262
260
|
},
|
|
263
|
-
|
|
261
|
+
unchainedAPI,
|
|
264
262
|
);
|
|
265
263
|
},
|
|
266
264
|
|
|
@@ -283,14 +281,14 @@ export const configureOrderModuleProcessing = ({
|
|
|
283
281
|
);
|
|
284
282
|
},
|
|
285
283
|
|
|
286
|
-
processOrder: async (initialOrder, params,
|
|
287
|
-
const { modules } =
|
|
284
|
+
processOrder: async (initialOrder, params, unchainedAPI) => {
|
|
285
|
+
const { modules } = unchainedAPI;
|
|
288
286
|
const { paymentContext, deliveryContext, nextStatus: forceNextStatus } = params;
|
|
289
287
|
|
|
290
288
|
const orderId = initialOrder._id;
|
|
291
289
|
let order = initialOrder;
|
|
292
290
|
let nextStatus =
|
|
293
|
-
forceNextStatus || (await findNextStatus(initialOrder.status, order,
|
|
291
|
+
forceNextStatus || (await findNextStatus(initialOrder.status, order, unchainedAPI));
|
|
294
292
|
|
|
295
293
|
if (nextStatus === OrderStatus.PENDING) {
|
|
296
294
|
// auto charge during transition to pending
|
|
@@ -300,10 +298,10 @@ export const configureOrderModuleProcessing = ({
|
|
|
300
298
|
|
|
301
299
|
await modules.orders.payments.charge(
|
|
302
300
|
orderPayment,
|
|
303
|
-
{ transactionContext: paymentContext },
|
|
304
|
-
|
|
301
|
+
{ userId: order.userId, transactionContext: paymentContext },
|
|
302
|
+
unchainedAPI,
|
|
305
303
|
);
|
|
306
|
-
nextStatus = await findNextStatus(nextStatus, order,
|
|
304
|
+
nextStatus = await findNextStatus(nextStatus, order, unchainedAPI);
|
|
307
305
|
}
|
|
308
306
|
|
|
309
307
|
if (nextStatus === OrderStatus.REJECTED) {
|
|
@@ -313,10 +311,10 @@ export const configureOrderModuleProcessing = ({
|
|
|
313
311
|
});
|
|
314
312
|
await modules.orders.payments.cancel(
|
|
315
313
|
orderPayment,
|
|
316
|
-
{ transactionContext: paymentContext },
|
|
317
|
-
|
|
314
|
+
{ userId: order.userId, transactionContext: paymentContext },
|
|
315
|
+
unchainedAPI,
|
|
318
316
|
);
|
|
319
|
-
nextStatus = await findNextStatus(nextStatus, order,
|
|
317
|
+
nextStatus = await findNextStatus(nextStatus, order, unchainedAPI);
|
|
320
318
|
}
|
|
321
319
|
|
|
322
320
|
if (nextStatus === OrderStatus.CONFIRMED) {
|
|
@@ -326,8 +324,8 @@ export const configureOrderModuleProcessing = ({
|
|
|
326
324
|
});
|
|
327
325
|
await modules.orders.payments.confirm(
|
|
328
326
|
orderPayment,
|
|
329
|
-
{ transactionContext: paymentContext },
|
|
330
|
-
|
|
327
|
+
{ userId: order.userId, transactionContext: paymentContext },
|
|
328
|
+
unchainedAPI,
|
|
331
329
|
);
|
|
332
330
|
|
|
333
331
|
const orderDelivery = await modules.orders.deliveries.findDelivery({
|
|
@@ -343,7 +341,7 @@ export const configureOrderModuleProcessing = ({
|
|
|
343
341
|
status: OrderStatus.CONFIRMED,
|
|
344
342
|
info: 'before delivery',
|
|
345
343
|
},
|
|
346
|
-
|
|
344
|
+
unchainedAPI,
|
|
347
345
|
);
|
|
348
346
|
|
|
349
347
|
await modules.orders.deliveries.send(
|
|
@@ -352,7 +350,7 @@ export const configureOrderModuleProcessing = ({
|
|
|
352
350
|
order,
|
|
353
351
|
deliveryContext,
|
|
354
352
|
},
|
|
355
|
-
|
|
353
|
+
unchainedAPI,
|
|
356
354
|
);
|
|
357
355
|
|
|
358
356
|
const orderPositions = await findOrderPositions(order);
|
|
@@ -377,7 +375,7 @@ export const configureOrderModuleProcessing = ({
|
|
|
377
375
|
{
|
|
378
376
|
items: tokenizedItems,
|
|
379
377
|
},
|
|
380
|
-
|
|
378
|
+
unchainedAPI,
|
|
381
379
|
);
|
|
382
380
|
}
|
|
383
381
|
|
|
@@ -395,7 +393,7 @@ export const configureOrderModuleProcessing = ({
|
|
|
395
393
|
deliveryContext,
|
|
396
394
|
},
|
|
397
395
|
},
|
|
398
|
-
|
|
396
|
+
unchainedAPI,
|
|
399
397
|
);
|
|
400
398
|
}
|
|
401
399
|
|
|
@@ -411,7 +409,7 @@ export const configureOrderModuleProcessing = ({
|
|
|
411
409
|
orderId,
|
|
412
410
|
orderPositionId: orderPosition._id,
|
|
413
411
|
},
|
|
414
|
-
|
|
412
|
+
unchainedAPI,
|
|
415
413
|
);
|
|
416
414
|
}),
|
|
417
415
|
);
|
|
@@ -422,66 +420,58 @@ export const configureOrderModuleProcessing = ({
|
|
|
422
420
|
// ???
|
|
423
421
|
}
|
|
424
422
|
|
|
425
|
-
nextStatus = await findNextStatus(nextStatus, order,
|
|
423
|
+
nextStatus = await findNextStatus(nextStatus, order, unchainedAPI);
|
|
426
424
|
}
|
|
427
425
|
|
|
428
426
|
order = await updateStatus(
|
|
429
427
|
order._id,
|
|
430
428
|
{ status: nextStatus, info: 'order processed' },
|
|
431
|
-
|
|
429
|
+
unchainedAPI,
|
|
432
430
|
);
|
|
433
431
|
|
|
434
432
|
if (initialOrder.status !== order.status) {
|
|
435
433
|
if (order.status === OrderStatus.REJECTED) {
|
|
436
|
-
await modules.orders.sendOrderRejectionToCustomer(order, params,
|
|
434
|
+
await modules.orders.sendOrderRejectionToCustomer(order, params, unchainedAPI);
|
|
437
435
|
} else {
|
|
438
|
-
await modules.orders.sendOrderConfirmationToCustomer(order, params,
|
|
436
|
+
await modules.orders.sendOrderConfirmationToCustomer(order, params, unchainedAPI);
|
|
439
437
|
}
|
|
440
438
|
}
|
|
441
439
|
|
|
442
440
|
return order;
|
|
443
441
|
},
|
|
444
442
|
|
|
445
|
-
sendOrderConfirmationToCustomer: async (order, params, { modules
|
|
443
|
+
sendOrderConfirmationToCustomer: async (order, params, { modules }) => {
|
|
446
444
|
const user = await modules.users.findUserById(order.userId);
|
|
447
|
-
const locale = modules.users.userLocale(user
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
template: 'ORDER_CONFIRMATION',
|
|
458
|
-
orderId: order._id,
|
|
459
|
-
},
|
|
445
|
+
const locale = modules.users.userLocale(user);
|
|
446
|
+
|
|
447
|
+
await modules.worker.addWork({
|
|
448
|
+
type: 'MESSAGE',
|
|
449
|
+
retries: 0,
|
|
450
|
+
input: {
|
|
451
|
+
...params,
|
|
452
|
+
locale,
|
|
453
|
+
template: 'ORDER_CONFIRMATION',
|
|
454
|
+
orderId: order._id,
|
|
460
455
|
},
|
|
461
|
-
|
|
462
|
-
);
|
|
456
|
+
});
|
|
463
457
|
|
|
464
458
|
return order;
|
|
465
459
|
},
|
|
466
460
|
|
|
467
|
-
sendOrderRejectionToCustomer: async (order, params, { modules
|
|
461
|
+
sendOrderRejectionToCustomer: async (order, params, { modules }) => {
|
|
468
462
|
const user = await modules.users.findUserById(order.userId);
|
|
469
|
-
const locale = modules.users.userLocale(user
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
template: 'ORDER_REJECTION',
|
|
480
|
-
orderId: order._id,
|
|
481
|
-
},
|
|
463
|
+
const locale = modules.users.userLocale(user);
|
|
464
|
+
|
|
465
|
+
await modules.worker.addWork({
|
|
466
|
+
type: 'MESSAGE',
|
|
467
|
+
retries: 0,
|
|
468
|
+
input: {
|
|
469
|
+
...params,
|
|
470
|
+
locale,
|
|
471
|
+
template: 'ORDER_REJECTION',
|
|
472
|
+
orderId: order._id,
|
|
482
473
|
},
|
|
483
|
-
|
|
484
|
-
);
|
|
474
|
+
});
|
|
485
475
|
|
|
486
476
|
return order;
|
|
487
477
|
},
|
|
@@ -3,7 +3,7 @@ import { Collection, FindOptions, Query } from '@unchainedshop/types/common';
|
|
|
3
3
|
import { Order, OrderQueries, OrderQuery } from '@unchainedshop/types/orders';
|
|
4
4
|
import { generateDbFilterById, buildSortOptions } from '@unchainedshop/utils';
|
|
5
5
|
|
|
6
|
-
const buildFindSelector = ({ includeCarts, status, userId, queryString }: OrderQuery) => {
|
|
6
|
+
export const buildFindSelector = ({ includeCarts, status, userId, queryString }: OrderQuery) => {
|
|
7
7
|
const selector: Query = {};
|
|
8
8
|
|
|
9
9
|
if (userId) {
|
|
@@ -8,8 +8,8 @@ export const configureOrderModuleTransformations = ({
|
|
|
8
8
|
Orders: Collection<Order>;
|
|
9
9
|
}): OrderTransformations => {
|
|
10
10
|
return {
|
|
11
|
-
discounted: async (order, orderDiscount,
|
|
12
|
-
const { modules } =
|
|
11
|
+
discounted: async (order, orderDiscount, unchainedAPI) => {
|
|
12
|
+
const { modules } = unchainedAPI;
|
|
13
13
|
|
|
14
14
|
// Delivery discounts
|
|
15
15
|
const orderDelivery = await modules.orders.deliveries.findDelivery({
|
|
@@ -18,7 +18,7 @@ export const configureOrderModuleTransformations = ({
|
|
|
18
18
|
const orderDeliveryDiscounts = modules.orders.deliveries.discounts(
|
|
19
19
|
orderDelivery,
|
|
20
20
|
{ order, orderDiscount },
|
|
21
|
-
|
|
21
|
+
unchainedAPI,
|
|
22
22
|
);
|
|
23
23
|
|
|
24
24
|
// Payment discounts
|
|
@@ -28,7 +28,7 @@ export const configureOrderModuleTransformations = ({
|
|
|
28
28
|
const orderPaymentDiscounts = modules.orders.payments.discounts(
|
|
29
29
|
orderPayment,
|
|
30
30
|
{ order, orderDiscount },
|
|
31
|
-
|
|
31
|
+
unchainedAPI,
|
|
32
32
|
);
|
|
33
33
|
|
|
34
34
|
// Position discounts
|
|
@@ -36,7 +36,7 @@ export const configureOrderModuleTransformations = ({
|
|
|
36
36
|
orderId: order._id,
|
|
37
37
|
});
|
|
38
38
|
const orderPositionDiscounts = orderPositions.flatMap((orderPosition) =>
|
|
39
|
-
modules.orders.positions.discounts(orderPosition, { order, orderDiscount },
|
|
39
|
+
modules.orders.positions.discounts(orderPosition, { order, orderDiscount }, unchainedAPI),
|
|
40
40
|
);
|
|
41
41
|
|
|
42
42
|
// order discounts
|
|
@@ -60,8 +60,8 @@ export const configureOrderModuleTransformations = ({
|
|
|
60
60
|
return discounted;
|
|
61
61
|
},
|
|
62
62
|
|
|
63
|
-
discountTotal: async (order, orderDiscount,
|
|
64
|
-
const { modules } =
|
|
63
|
+
discountTotal: async (order, orderDiscount, unchainedAPI) => {
|
|
64
|
+
const { modules } = unchainedAPI;
|
|
65
65
|
const orderDiscountId = orderDiscount._id;
|
|
66
66
|
|
|
67
67
|
// Delivery discounts
|
|
@@ -71,7 +71,7 @@ export const configureOrderModuleTransformations = ({
|
|
|
71
71
|
const orderDeliveryDiscountSum =
|
|
72
72
|
orderDelivery &&
|
|
73
73
|
modules.orders.deliveries
|
|
74
|
-
.pricingSheet(orderDelivery, order.currency,
|
|
74
|
+
.pricingSheet(orderDelivery, order.currency, unchainedAPI)
|
|
75
75
|
.discountSum(orderDiscountId);
|
|
76
76
|
|
|
77
77
|
// Payment discounts
|
|
@@ -81,7 +81,7 @@ export const configureOrderModuleTransformations = ({
|
|
|
81
81
|
const orderPaymentDiscountSum =
|
|
82
82
|
orderPayment &&
|
|
83
83
|
modules.orders.payments
|
|
84
|
-
.pricingSheet(orderPayment, order.currency,
|
|
84
|
+
.pricingSheet(orderPayment, order.currency, unchainedAPI)
|
|
85
85
|
.discountSum(orderDiscountId);
|
|
86
86
|
|
|
87
87
|
// Position discounts
|
|
@@ -90,7 +90,7 @@ export const configureOrderModuleTransformations = ({
|
|
|
90
90
|
});
|
|
91
91
|
const orderPositionDiscounts = orderPositions.map((orderPosition) =>
|
|
92
92
|
modules.orders.positions
|
|
93
|
-
.pricingSheet(orderPosition, order.currency,
|
|
93
|
+
.pricingSheet(orderPosition, order.currency, unchainedAPI)
|
|
94
94
|
.discountSum(orderDiscountId),
|
|
95
95
|
);
|
|
96
96
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { Context } from '@unchainedshop/types/api';
|
|
2
1
|
import { Update } from '@unchainedshop/types/common';
|
|
3
|
-
import { ModuleInput } from '@unchainedshop/types/core';
|
|
2
|
+
import { ModuleInput, UnchainedCore } from '@unchainedshop/types/core';
|
|
4
3
|
import { Order, OrderStatus, OrdersModule, OrdersSettingsOptions } from '@unchainedshop/types/orders';
|
|
5
4
|
import { OrderDelivery } from '@unchainedshop/types/orders.deliveries';
|
|
6
5
|
import { OrderPayment } from '@unchainedshop/types/orders.payments';
|
|
@@ -60,11 +59,7 @@ export const configureOrdersModule = async ({
|
|
|
60
59
|
return findNewOrderNumber(order, index + 1);
|
|
61
60
|
};
|
|
62
61
|
|
|
63
|
-
const updateStatus: OrdersModule['updateStatus'] = async (
|
|
64
|
-
orderId,
|
|
65
|
-
{ status, info },
|
|
66
|
-
requestContext,
|
|
67
|
-
) => {
|
|
62
|
+
const updateStatus: OrdersModule['updateStatus'] = async (orderId, { status, info }) => {
|
|
68
63
|
const selector = generateDbFilterById(orderId);
|
|
69
64
|
const order = await Orders.findOne(selector, {});
|
|
70
65
|
|
|
@@ -74,7 +69,6 @@ export const configureOrdersModule = async ({
|
|
|
74
69
|
const $set: Partial<Order> = {
|
|
75
70
|
status,
|
|
76
71
|
updated: new Date(),
|
|
77
|
-
updatedBy: requestContext.userId,
|
|
78
72
|
};
|
|
79
73
|
|
|
80
74
|
switch (status) {
|
|
@@ -122,8 +116,8 @@ export const configureOrdersModule = async ({
|
|
|
122
116
|
return Orders.findOne(selector, {});
|
|
123
117
|
};
|
|
124
118
|
|
|
125
|
-
const updateDiscounts = async (order: Order,
|
|
126
|
-
const { modules } =
|
|
119
|
+
const updateDiscounts = async (order: Order, unchainedAPI: UnchainedCore) => {
|
|
120
|
+
const { modules } = unchainedAPI;
|
|
127
121
|
|
|
128
122
|
// 1. go through existing order-discounts and check if discount still valid,
|
|
129
123
|
// those who are not valid anymore should get removed
|
|
@@ -133,10 +127,10 @@ export const configureOrdersModule = async ({
|
|
|
133
127
|
|
|
134
128
|
await Promise.all(
|
|
135
129
|
discounts.map(async (discount) => {
|
|
136
|
-
const isValid = await modules.orders.discounts.isValid(discount,
|
|
130
|
+
const isValid = await modules.orders.discounts.isValid(discount, unchainedAPI);
|
|
137
131
|
|
|
138
132
|
if (!isValid) {
|
|
139
|
-
await modules.orders.discounts.delete(discount._id,
|
|
133
|
+
await modules.orders.discounts.delete(discount._id, unchainedAPI);
|
|
140
134
|
}
|
|
141
135
|
}),
|
|
142
136
|
);
|
|
@@ -148,34 +142,31 @@ export const configureOrdersModule = async ({
|
|
|
148
142
|
|
|
149
143
|
const currentDiscountKeys = cleanedDiscounts.map(({ discountKey }) => discountKey);
|
|
150
144
|
|
|
151
|
-
const director = await OrderDiscountDirector.actions({ order, code: null },
|
|
145
|
+
const director = await OrderDiscountDirector.actions({ order, code: null }, unchainedAPI);
|
|
152
146
|
const systemDiscounts = await director.findSystemDiscounts();
|
|
153
147
|
|
|
154
148
|
await Promise.all(
|
|
155
149
|
systemDiscounts
|
|
156
150
|
.filter((key) => currentDiscountKeys.indexOf(key) === -1)
|
|
157
151
|
.map((discountKey) =>
|
|
158
|
-
modules.orders.discounts.create(
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
},
|
|
164
|
-
requestContext.userId,
|
|
165
|
-
),
|
|
152
|
+
modules.orders.discounts.create({
|
|
153
|
+
orderId: order._id,
|
|
154
|
+
discountKey,
|
|
155
|
+
trigger: OrderDiscountTrigger.SYSTEM,
|
|
156
|
+
}),
|
|
166
157
|
),
|
|
167
158
|
);
|
|
168
159
|
};
|
|
169
160
|
|
|
170
|
-
const initProviders = async (order: Order,
|
|
171
|
-
const { modules } =
|
|
161
|
+
const initProviders = async (order: Order, unchainedAPI: UnchainedCore) => {
|
|
162
|
+
const { modules } = unchainedAPI;
|
|
172
163
|
|
|
173
164
|
let updatedOrder = order;
|
|
174
165
|
|
|
175
166
|
// Init delivery provider
|
|
176
167
|
const supportedDeliveryProviders = await modules.delivery.findSupported(
|
|
177
168
|
{ order: updatedOrder },
|
|
178
|
-
|
|
169
|
+
unchainedAPI,
|
|
179
170
|
);
|
|
180
171
|
|
|
181
172
|
const orderDelivery = await modules.orders.deliveries.findDelivery({
|
|
@@ -193,13 +184,13 @@ export const configureOrdersModule = async ({
|
|
|
193
184
|
const defaultOrderDeliveryProvider = await modules.delivery.determineDefault(
|
|
194
185
|
supportedDeliveryProviders,
|
|
195
186
|
{ order: updatedOrder },
|
|
196
|
-
|
|
187
|
+
unchainedAPI,
|
|
197
188
|
);
|
|
198
189
|
if (defaultOrderDeliveryProvider) {
|
|
199
190
|
updatedOrder = await modules.orders.setDeliveryProvider(
|
|
200
191
|
updatedOrder._id,
|
|
201
192
|
defaultOrderDeliveryProvider._id,
|
|
202
|
-
|
|
193
|
+
unchainedAPI,
|
|
203
194
|
);
|
|
204
195
|
}
|
|
205
196
|
}
|
|
@@ -207,7 +198,7 @@ export const configureOrdersModule = async ({
|
|
|
207
198
|
// Init payment provider
|
|
208
199
|
const supportedPaymentProviders = await modules.payment.paymentProviders.findSupported(
|
|
209
200
|
{ order: updatedOrder },
|
|
210
|
-
|
|
201
|
+
unchainedAPI,
|
|
211
202
|
);
|
|
212
203
|
|
|
213
204
|
const orderPayment = await modules.orders.payments.findOrderPayment({
|
|
@@ -234,22 +225,22 @@ export const configureOrdersModule = async ({
|
|
|
234
225
|
const defaultOrderPaymentProvider = await modules.payment.paymentProviders.determineDefault(
|
|
235
226
|
supportedPaymentProviders,
|
|
236
227
|
{ order: updatedOrder, paymentCredentials },
|
|
237
|
-
|
|
228
|
+
unchainedAPI,
|
|
238
229
|
);
|
|
239
230
|
|
|
240
231
|
if (defaultOrderPaymentProvider) {
|
|
241
232
|
updatedOrder = await modules.orders.setPaymentProvider(
|
|
242
233
|
updatedOrder._id,
|
|
243
234
|
defaultOrderPaymentProvider._id,
|
|
244
|
-
|
|
235
|
+
unchainedAPI,
|
|
245
236
|
);
|
|
246
237
|
}
|
|
247
238
|
}
|
|
248
239
|
return updatedOrder;
|
|
249
240
|
};
|
|
250
241
|
|
|
251
|
-
const updateCalculation: OrdersModule['updateCalculation'] = async (orderId,
|
|
252
|
-
const { modules } =
|
|
242
|
+
const updateCalculation: OrdersModule['updateCalculation'] = async (orderId, unchainedAPI) => {
|
|
243
|
+
const { modules } = unchainedAPI;
|
|
253
244
|
|
|
254
245
|
const selector = generateDbFilterById(orderId);
|
|
255
246
|
let order = (await Orders.findOne(selector, {})) as Order;
|
|
@@ -257,38 +248,35 @@ export const configureOrdersModule = async ({
|
|
|
257
248
|
// Don't recalculate orders, only carts
|
|
258
249
|
if (order.status !== null) return order;
|
|
259
250
|
|
|
260
|
-
await updateDiscounts(order,
|
|
251
|
+
await updateDiscounts(order, unchainedAPI);
|
|
261
252
|
|
|
262
|
-
order = await initProviders(order,
|
|
253
|
+
order = await initProviders(order, unchainedAPI);
|
|
263
254
|
|
|
264
255
|
let orderPositions = (await findOrderPositions(order)) as OrderPosition[];
|
|
265
256
|
orderPositions = await Promise.all(
|
|
266
257
|
orderPositions.map(async (orderPosition) =>
|
|
267
|
-
modules.orders.positions.updateCalculation(orderPosition,
|
|
258
|
+
modules.orders.positions.updateCalculation(orderPosition, unchainedAPI),
|
|
268
259
|
),
|
|
269
260
|
);
|
|
270
261
|
|
|
271
262
|
let orderDelivery = (await findOrderDelivery(order)) as OrderDelivery;
|
|
272
263
|
if (orderDelivery) {
|
|
273
|
-
orderDelivery = await modules.orders.deliveries.updateCalculation(orderDelivery,
|
|
264
|
+
orderDelivery = await modules.orders.deliveries.updateCalculation(orderDelivery, unchainedAPI);
|
|
274
265
|
}
|
|
275
266
|
let orderPayment = (await findOrderPayment(order)) as OrderPayment;
|
|
276
267
|
if (orderPayment) {
|
|
277
|
-
orderPayment = await modules.orders.payments.updateCalculation(orderPayment,
|
|
268
|
+
orderPayment = await modules.orders.payments.updateCalculation(orderPayment, unchainedAPI);
|
|
278
269
|
}
|
|
279
270
|
|
|
280
271
|
orderPositions = await Promise.all(
|
|
281
272
|
orderPositions.map(async (orderPosition) =>
|
|
282
|
-
modules.orders.positions.updateScheduling(
|
|
283
|
-
{ order, orderDelivery, orderPosition },
|
|
284
|
-
requestContext,
|
|
285
|
-
),
|
|
273
|
+
modules.orders.positions.updateScheduling({ order, orderDelivery, orderPosition }, unchainedAPI),
|
|
286
274
|
),
|
|
287
275
|
);
|
|
288
276
|
|
|
289
277
|
const pricing = await OrderPricingDirector.actions(
|
|
290
278
|
{ order, orderPositions, orderDelivery, orderPayment },
|
|
291
|
-
|
|
279
|
+
unchainedAPI,
|
|
292
280
|
);
|
|
293
281
|
|
|
294
282
|
const calculation = await pricing.calculate();
|
|
@@ -297,7 +285,6 @@ export const configureOrdersModule = async ({
|
|
|
297
285
|
$set: {
|
|
298
286
|
calculation,
|
|
299
287
|
updated: new Date(),
|
|
300
|
-
updatedBy: requestContext.userId,
|
|
301
288
|
},
|
|
302
289
|
});
|
|
303
290
|
|