@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.
- package/README.md +137 -3
- package/lib/db/OrderDeliveriesCollection.d.ts +8 -8
- package/lib/db/OrderDeliveriesCollection.js +6 -9
- package/lib/db/OrderDiscountsCollection.d.ts +7 -7
- package/lib/db/OrderDiscountsCollection.js +5 -8
- package/lib/db/OrderPaymentsCollection.d.ts +8 -8
- package/lib/db/OrderPaymentsCollection.js +6 -9
- package/lib/db/OrderPositionsCollection.d.ts +2 -3
- package/lib/db/OrderPositionsCollection.js +1 -3
- package/lib/db/OrdersCollection.d.ts +9 -9
- package/lib/db/OrdersCollection.js +7 -10
- package/lib/migrations/20250502111800-currency-code.d.ts +1 -2
- package/lib/migrations/20250502111800-currency-code.js +1 -2
- package/lib/module/buildFindSelector.d.ts +1 -2
- package/lib/module/buildFindSelector.js +1 -2
- package/lib/module/configureOrderDeliveriesModule.d.ts +2 -3
- package/lib/module/configureOrderDeliveriesModule.js +2 -7
- package/lib/module/configureOrderDiscountsModule.d.ts +1 -2
- package/lib/module/configureOrderDiscountsModule.js +2 -4
- package/lib/module/configureOrderPaymentsModule.d.ts +2 -3
- package/lib/module/configureOrderPaymentsModule.js +2 -9
- package/lib/module/configureOrderPositionsModule.d.ts +2 -3
- package/lib/module/configureOrderPositionsModule.js +1 -4
- package/lib/module/configureOrdersModule-mutations.d.ts +3 -4
- package/lib/module/configureOrdersModule-mutations.js +2 -3
- package/lib/module/configureOrdersModule-queries.d.ts +2 -3
- package/lib/module/configureOrdersModule-queries.js +3 -3
- package/lib/module/configureOrdersModule.d.ts +39 -40
- package/lib/module/configureOrdersModule.js +17 -23
- package/lib/orders-index.d.ts +13 -14
- package/lib/orders-index.js +13 -14
- package/lib/orders-settings.d.ts +1 -2
- package/lib/orders-settings.js +0 -1
- package/package.json +11 -10
- package/lib/db/OrderDeliveriesCollection.d.ts.map +0 -1
- package/lib/db/OrderDeliveriesCollection.js.map +0 -1
- package/lib/db/OrderDeliveriesSchema.d.ts +0 -3
- package/lib/db/OrderDeliveriesSchema.d.ts.map +0 -1
- package/lib/db/OrderDeliveriesSchema.js +0 -20
- package/lib/db/OrderDeliveriesSchema.js.map +0 -1
- package/lib/db/OrderDiscountTrigger.d.ts +0 -5
- package/lib/db/OrderDiscountTrigger.d.ts.map +0 -1
- package/lib/db/OrderDiscountTrigger.js +0 -6
- package/lib/db/OrderDiscountTrigger.js.map +0 -1
- package/lib/db/OrderDiscountsCollection.d.ts.map +0 -1
- package/lib/db/OrderDiscountsCollection.js.map +0 -1
- package/lib/db/OrderDiscountsSchema.d.ts +0 -3
- package/lib/db/OrderDiscountsSchema.d.ts.map +0 -1
- package/lib/db/OrderDiscountsSchema.js +0 -12
- package/lib/db/OrderDiscountsSchema.js.map +0 -1
- package/lib/db/OrderPaymentsCollection.d.ts.map +0 -1
- package/lib/db/OrderPaymentsCollection.js.map +0 -1
- package/lib/db/OrderPaymentsSchema.d.ts +0 -3
- package/lib/db/OrderPaymentsSchema.d.ts.map +0 -1
- package/lib/db/OrderPaymentsSchema.js +0 -20
- package/lib/db/OrderPaymentsSchema.js.map +0 -1
- package/lib/db/OrderPositionsCollection.d.ts.map +0 -1
- package/lib/db/OrderPositionsCollection.js.map +0 -1
- package/lib/db/OrderPositionsSchema.d.ts +0 -3
- package/lib/db/OrderPositionsSchema.d.ts.map +0 -1
- package/lib/db/OrderPositionsSchema.js +0 -37
- package/lib/db/OrderPositionsSchema.js.map +0 -1
- package/lib/db/OrdersCollection.d.ts.map +0 -1
- package/lib/db/OrdersCollection.js.map +0 -1
- package/lib/db/OrdersSchema.d.ts +0 -3
- package/lib/db/OrdersSchema.d.ts.map +0 -1
- package/lib/db/OrdersSchema.js +0 -30
- package/lib/db/OrdersSchema.js.map +0 -1
- package/lib/director/OrderDiscountAdapter.d.ts +0 -4
- package/lib/director/OrderDiscountAdapter.d.ts.map +0 -1
- package/lib/director/OrderDiscountAdapter.js +0 -3
- package/lib/director/OrderDiscountAdapter.js.map +0 -1
- package/lib/director/OrderDiscountConfiguration.d.ts +0 -6
- package/lib/director/OrderDiscountConfiguration.d.ts.map +0 -1
- package/lib/director/OrderDiscountConfiguration.js +0 -2
- package/lib/director/OrderDiscountConfiguration.js.map +0 -1
- package/lib/director/OrderDiscountDirector.d.ts +0 -3
- package/lib/director/OrderDiscountDirector.d.ts.map +0 -1
- package/lib/director/OrderDiscountDirector.js +0 -3
- package/lib/director/OrderDiscountDirector.js.map +0 -1
- package/lib/director/OrderPricingAdapter.d.ts +0 -4
- package/lib/director/OrderPricingAdapter.d.ts.map +0 -1
- package/lib/director/OrderPricingAdapter.js +0 -25
- package/lib/director/OrderPricingAdapter.js.map +0 -1
- package/lib/director/OrderPricingDirector.d.ts +0 -3
- package/lib/director/OrderPricingDirector.d.ts.map +0 -1
- package/lib/director/OrderPricingDirector.js +0 -39
- package/lib/director/OrderPricingDirector.js.map +0 -1
- package/lib/director/OrderPricingSheet.d.ts +0 -4
- package/lib/director/OrderPricingSheet.d.ts.map +0 -1
- package/lib/director/OrderPricingSheet.js +0 -101
- package/lib/director/OrderPricingSheet.js.map +0 -1
- package/lib/migrations/20250502111800-currency-code copy.d.ts +0 -3
- package/lib/migrations/20250502111800-currency-code copy.d.ts.map +0 -1
- package/lib/migrations/20250502111800-currency-code copy.js +0 -14
- package/lib/migrations/20250502111800-currency-code copy.js.map +0 -1
- package/lib/migrations/20250502111800-currency-code.d.ts.map +0 -1
- package/lib/migrations/20250502111800-currency-code.js.map +0 -1
- package/lib/migrations/20251020080000-position-config.d.ts +0 -3
- package/lib/migrations/20251020080000-position-config.d.ts.map +0 -1
- package/lib/migrations/20251020080000-position-config.js +0 -14
- package/lib/migrations/20251020080000-position-config.js.map +0 -1
- package/lib/module/buildFindSelector.d.ts.map +0 -1
- package/lib/module/buildFindSelector.js.map +0 -1
- package/lib/module/configureOrderDeliveriesModule.d.ts.map +0 -1
- package/lib/module/configureOrderDeliveriesModule.js.map +0 -1
- package/lib/module/configureOrderDiscountsModule.d.ts.map +0 -1
- package/lib/module/configureOrderDiscountsModule.js.map +0 -1
- package/lib/module/configureOrderPaymentsModule.d.ts.map +0 -1
- package/lib/module/configureOrderPaymentsModule.js.map +0 -1
- package/lib/module/configureOrderPositionsModule.d.ts.map +0 -1
- package/lib/module/configureOrderPositionsModule.js.map +0 -1
- package/lib/module/configureOrdersModule-mutations.d.ts.map +0 -1
- package/lib/module/configureOrdersModule-mutations.js.map +0 -1
- package/lib/module/configureOrdersModule-processing.d.ts +0 -14
- package/lib/module/configureOrdersModule-processing.d.ts.map +0 -1
- package/lib/module/configureOrdersModule-processing.js +0 -348
- package/lib/module/configureOrdersModule-processing.js.map +0 -1
- package/lib/module/configureOrdersModule-queries.d.ts.map +0 -1
- package/lib/module/configureOrdersModule-queries.js.map +0 -1
- package/lib/module/configureOrdersModule-transformations.d.ts +0 -6
- package/lib/module/configureOrdersModule-transformations.d.ts.map +0 -1
- package/lib/module/configureOrdersModule-transformations.js +0 -112
- package/lib/module/configureOrdersModule-transformations.js.map +0 -1
- package/lib/module/configureOrdersModule.d.ts.map +0 -1
- package/lib/module/configureOrdersModule.js.map +0 -1
- package/lib/orders-index.d.ts.map +0 -1
- package/lib/orders-index.js.map +0 -1
- package/lib/orders-settings.d.ts.map +0 -1
- package/lib/orders-settings.js.map +0 -1
- package/lib/service/migrateOrderCartService.d.ts +0 -3
- package/lib/service/migrateOrderCartService.d.ts.map +0 -1
- package/lib/service/migrateOrderCartService.js +0 -32
- package/lib/service/migrateOrderCartService.js.map +0 -1
- package/lib/service/nextUserCartService.d.ts +0 -3
- package/lib/service/nextUserCartService.d.ts.map +0 -1
- package/lib/service/nextUserCartService.js +0 -34
- package/lib/service/nextUserCartService.js.map +0 -1
- package/lib/service/orderServices.d.ts +0 -3
- package/lib/service/orderServices.d.ts.map +0 -1
- package/lib/service/orderServices.js +0 -7
- package/lib/service/orderServices.js.map +0 -1
- package/src/db/OrderDeliveriesCollection.ts +0 -34
- package/src/db/OrderDiscountsCollection.ts +0 -30
- package/src/db/OrderPaymentsCollection.ts +0 -35
- package/src/db/OrderPositionsCollection.ts +0 -32
- package/src/db/OrdersCollection.ts +0 -87
- package/src/migrations/20250502111800-currency-code.ts +0 -18
- package/src/module/buildFindSelector.test.ts +0 -121
- package/src/module/buildFindSelector.ts +0 -49
- package/src/module/configureOrderDeliveriesModule.ts +0 -157
- package/src/module/configureOrderDiscountsModule.ts +0 -95
- package/src/module/configureOrderPaymentsModule.ts +0 -224
- package/src/module/configureOrderPositionsModule.ts +0 -244
- package/src/module/configureOrdersModule-mutations.ts +0 -178
- package/src/module/configureOrdersModule-queries.ts +0 -159
- package/src/module/configureOrdersModule.ts +0 -257
- package/src/orders-index.ts +0 -13
- package/src/orders-settings.ts +0 -45
- 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 +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>;
|