@unchainedshop/api 4.0.0-rc.10 → 4.0.0-rc.11
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/lib/mcp/index.d.ts.map +1 -1
- package/lib/mcp/index.js +6 -0
- package/lib/mcp/index.js.map +1 -1
- package/lib/mcp/tools/delivery/createDeliveryProviderHandler.d.ts +44 -0
- package/lib/mcp/tools/delivery/createDeliveryProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/createDeliveryProviderHandler.js +50 -0
- package/lib/mcp/tools/delivery/createDeliveryProviderHandler.js.map +1 -0
- package/lib/mcp/tools/delivery/deliveryInterfacesHandler.d.ts +20 -0
- package/lib/mcp/tools/delivery/deliveryInterfacesHandler.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/deliveryInterfacesHandler.js +45 -0
- package/lib/mcp/tools/delivery/deliveryInterfacesHandler.js.map +1 -0
- package/lib/mcp/tools/delivery/deliveryProvider.d.ts +20 -0
- package/lib/mcp/tools/delivery/deliveryProvider.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/deliveryProvider.js +43 -0
- package/lib/mcp/tools/delivery/deliveryProvider.js.map +1 -0
- package/lib/mcp/tools/delivery/deliveryProvidersCountHandler.d.ts +20 -0
- package/lib/mcp/tools/delivery/deliveryProvidersCountHandler.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/deliveryProvidersCountHandler.js +36 -0
- package/lib/mcp/tools/delivery/deliveryProvidersCountHandler.js.map +1 -0
- package/lib/mcp/tools/delivery/deliveryProvidersListHandler.d.ts +24 -0
- package/lib/mcp/tools/delivery/deliveryProvidersListHandler.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/deliveryProvidersListHandler.js +44 -0
- package/lib/mcp/tools/delivery/deliveryProvidersListHandler.js.map +1 -0
- package/lib/mcp/tools/delivery/index.d.ts +4 -0
- package/lib/mcp/tools/delivery/index.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/index.js +17 -0
- package/lib/mcp/tools/delivery/index.js.map +1 -0
- package/lib/mcp/tools/delivery/removeDeliveryProviderHandler.d.ts +20 -0
- package/lib/mcp/tools/delivery/removeDeliveryProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/removeDeliveryProviderHandler.js +37 -0
- package/lib/mcp/tools/delivery/removeDeliveryProviderHandler.js.map +1 -0
- package/lib/mcp/tools/delivery/updateDeliveryProviderHandler.d.ts +96 -0
- package/lib/mcp/tools/delivery/updateDeliveryProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/updateDeliveryProviderHandler.js +54 -0
- package/lib/mcp/tools/delivery/updateDeliveryProviderHandler.js.map +1 -0
- package/lib/mcp/tools/order/getMonthlySalesBreakdownHandler.d.ts +36 -0
- package/lib/mcp/tools/order/getMonthlySalesBreakdownHandler.d.ts.map +1 -0
- package/lib/mcp/tools/order/getMonthlySalesBreakdownHandler.js +89 -0
- package/lib/mcp/tools/order/getMonthlySalesBreakdownHandler.js.map +1 -0
- package/lib/mcp/tools/order/getSalesSummaryHandler.d.ts +40 -0
- package/lib/mcp/tools/order/getSalesSummaryHandler.d.ts.map +1 -0
- package/lib/mcp/tools/order/getSalesSummaryHandler.js +90 -0
- package/lib/mcp/tools/order/getSalesSummaryHandler.js.map +1 -0
- package/lib/mcp/tools/order/getTopCustomersHandler.d.ts +52 -0
- package/lib/mcp/tools/order/getTopCustomersHandler.d.ts.map +1 -0
- package/lib/mcp/tools/order/getTopCustomersHandler.js +111 -0
- package/lib/mcp/tools/order/getTopCustomersHandler.js.map +1 -0
- package/lib/mcp/tools/order/getTopSellingProductsHandler.d.ts +28 -0
- package/lib/mcp/tools/order/getTopSellingProductsHandler.d.ts.map +1 -0
- package/lib/mcp/tools/order/getTopSellingProductsHandler.js +99 -0
- package/lib/mcp/tools/order/getTopSellingProductsHandler.js.map +1 -0
- package/lib/mcp/tools/order/index.d.ts +4 -0
- package/lib/mcp/tools/order/index.d.ts.map +1 -0
- package/lib/mcp/tools/order/index.js +13 -0
- package/lib/mcp/tools/order/index.js.map +1 -0
- package/lib/mcp/tools/order/ordersListHandler.d.ts +108 -0
- package/lib/mcp/tools/order/ordersListHandler.d.ts.map +1 -0
- package/lib/mcp/tools/order/ordersListHandler.js +91 -0
- package/lib/mcp/tools/order/ordersListHandler.js.map +1 -0
- package/lib/mcp/tools/payment/createPaymentProviderHandler.d.ts.map +1 -1
- package/lib/mcp/tools/payment/createPaymentProviderHandler.js +5 -2
- package/lib/mcp/tools/payment/createPaymentProviderHandler.js.map +1 -1
- package/lib/mcp/tools/payment/index.js +1 -1
- package/lib/mcp/tools/payment/index.js.map +1 -1
- package/lib/mcp/tools/payment/paymentInterfacesHandler.d.ts +2 -2
- package/lib/mcp/tools/payment/paymentInterfacesHandler.d.ts.map +1 -1
- package/lib/mcp/tools/payment/paymentInterfacesHandler.js +7 -5
- package/lib/mcp/tools/payment/paymentInterfacesHandler.js.map +1 -1
- package/lib/mcp/tools/payment/paymentProviderByIdHandler.js +1 -1
- package/lib/mcp/tools/payment/paymentProviderByIdHandler.js.map +1 -1
- package/lib/mcp/tools/payment/paymentProvidersListHandler.d.ts +4 -0
- package/lib/mcp/tools/payment/paymentProvidersListHandler.d.ts.map +1 -1
- package/lib/mcp/tools/payment/paymentProvidersListHandler.js +12 -3
- package/lib/mcp/tools/payment/paymentProvidersListHandler.js.map +1 -1
- package/lib/mcp/tools/payment/removePaymentProviderHandler.d.ts.map +1 -1
- package/lib/mcp/tools/payment/removePaymentProviderHandler.js +5 -4
- package/lib/mcp/tools/payment/removePaymentProviderHandler.js.map +1 -1
- package/lib/mcp/tools/payment/updatePaymentProviderHandler.d.ts +66 -10
- package/lib/mcp/tools/payment/updatePaymentProviderHandler.d.ts.map +1 -1
- package/lib/mcp/tools/payment/updatePaymentProviderHandler.js +18 -3
- package/lib/mcp/tools/payment/updatePaymentProviderHandler.js.map +1 -1
- package/lib/mcp/tools/warehousing/createWarehousingProviderHandler.d.ts +44 -0
- package/lib/mcp/tools/warehousing/createWarehousingProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/createWarehousingProviderHandler.js +48 -0
- package/lib/mcp/tools/warehousing/createWarehousingProviderHandler.js.map +1 -0
- package/lib/mcp/tools/warehousing/index.d.ts +4 -0
- package/lib/mcp/tools/warehousing/index.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/index.js +17 -0
- package/lib/mcp/tools/warehousing/index.js.map +1 -0
- package/lib/mcp/tools/warehousing/removeWarehousingProviderHandler.d.ts +20 -0
- package/lib/mcp/tools/warehousing/removeWarehousingProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/removeWarehousingProviderHandler.js +39 -0
- package/lib/mcp/tools/warehousing/removeWarehousingProviderHandler.js.map +1 -0
- package/lib/mcp/tools/warehousing/updateWarehousingProviderHandler.d.ts +96 -0
- package/lib/mcp/tools/warehousing/updateWarehousingProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/updateWarehousingProviderHandler.js +58 -0
- package/lib/mcp/tools/warehousing/updateWarehousingProviderHandler.js.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingInterfacesHandler.d.ts +20 -0
- package/lib/mcp/tools/warehousing/warehousingInterfacesHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingInterfacesHandler.js +45 -0
- package/lib/mcp/tools/warehousing/warehousingInterfacesHandler.js.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingProviderHandler.d.ts +20 -0
- package/lib/mcp/tools/warehousing/warehousingProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingProviderHandler.js +45 -0
- package/lib/mcp/tools/warehousing/warehousingProviderHandler.js.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersCountHandler.d.ts +20 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersCountHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersCountHandler.js +36 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersCountHandler.js.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersListHandler.d.ts +24 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersListHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersListHandler.js +44 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersListHandler.js.map +1 -0
- package/lib/mcp/utils/orderFilters.d.ts +22 -0
- package/lib/mcp/utils/orderFilters.d.ts.map +1 -0
- package/lib/mcp/utils/orderFilters.js +34 -0
- package/lib/mcp/utils/orderFilters.js.map +1 -0
- package/lib/mcp/utils/sharedSchemas.d.ts +11 -0
- package/lib/mcp/utils/sharedSchemas.d.ts.map +1 -0
- package/lib/mcp/utils/sharedSchemas.js +11 -0
- package/lib/mcp/utils/sharedSchemas.js.map +1 -0
- package/lib/resolvers/queries/orders/orders.d.ts.map +1 -1
- package/lib/resolvers/queries/orders/orders.js +33 -4
- package/lib/resolvers/queries/orders/orders.js.map +1 -1
- package/lib/resolvers/queries/orders/ordersCount.d.ts.map +1 -1
- package/lib/resolvers/queries/orders/ordersCount.js +29 -1
- package/lib/resolvers/queries/orders/ordersCount.js.map +1 -1
- package/lib/schema/query.d.ts.map +1 -1
- package/lib/schema/query.js +11 -1
- package/lib/schema/query.js.map +1 -1
- package/package.json +1 -1
- package/src/mcp/index.ts +6 -1
- package/src/mcp/tools/delivery/createDeliveryProviderHandler.ts +62 -0
- package/src/mcp/tools/delivery/deliveryInterfacesHandler.ts +56 -0
- package/src/mcp/tools/delivery/deliveryProvider.ts +51 -0
- package/src/mcp/tools/delivery/deliveryProvidersCountHandler.ts +46 -0
- package/src/mcp/tools/delivery/deliveryProvidersListHandler.ts +54 -0
- package/src/mcp/tools/delivery/index.ts +74 -0
- package/src/mcp/tools/delivery/removeDeliveryProviderHandler.ts +45 -0
- package/src/mcp/tools/delivery/updateDeliveryProviderHandler.ts +68 -0
- package/src/mcp/tools/order/getMonthlySalesBreakdownHandler.ts +106 -0
- package/src/mcp/tools/order/getSalesSummaryHandler.ts +103 -0
- package/src/mcp/tools/order/getTopCustomersHandler.ts +123 -0
- package/src/mcp/tools/order/getTopSellingProductsHandler.ts +112 -0
- package/src/mcp/tools/order/index.ts +50 -0
- package/src/mcp/tools/order/ordersListHandler.ts +119 -0
- package/src/mcp/tools/payment/createPaymentProviderHandler.ts +7 -2
- package/src/mcp/tools/payment/index.ts +1 -1
- package/src/mcp/tools/payment/paymentInterfacesHandler.ts +13 -10
- package/src/mcp/tools/payment/paymentProviderByIdHandler.ts +1 -1
- package/src/mcp/tools/payment/paymentProvidersListHandler.ts +14 -4
- package/src/mcp/tools/payment/removePaymentProviderHandler.ts +6 -8
- package/src/mcp/tools/payment/updatePaymentProviderHandler.ts +23 -4
- package/src/mcp/tools/warehousing/createWarehousingProviderHandler.ts +61 -0
- package/src/mcp/tools/warehousing/index.ts +81 -0
- package/src/mcp/tools/warehousing/removeWarehousingProviderHandler.ts +46 -0
- package/src/mcp/tools/warehousing/updateWarehousingProviderHandler.ts +72 -0
- package/src/mcp/tools/warehousing/warehousingInterfacesHandler.ts +58 -0
- package/src/mcp/tools/warehousing/warehousingProviderHandler.ts +55 -0
- package/src/mcp/tools/warehousing/warehousingProvidersCountHandler.ts +46 -0
- package/src/mcp/tools/warehousing/warehousingProvidersListHandler.ts +55 -0
- package/src/mcp/utils/orderFilters.ts +52 -0
- package/src/mcp/utils/sharedSchemas.ts +12 -0
- package/src/resolvers/queries/orders/orders.ts +46 -5
- package/src/resolvers/queries/orders/ordersCount.ts +42 -1
- package/src/schema/query.ts +11 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateDeliveryProviderHandler.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/delivery/updateDeliveryProviderHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAS9C,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmBxC,CAAC;AAEF,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAyC,CAAC;AACtF,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAE3F,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,4BAA4B;;;;;GA+BrC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { log } from '@unchainedshop/logger';
|
|
3
|
+
import { DeliverProviderNotFoundError } from '../../../errors.js';
|
|
4
|
+
const ConfigurationEntry = z.object({
|
|
5
|
+
key: z.string().min(1).describe('Configuration key'),
|
|
6
|
+
value: z.any().describe('Configuration value'),
|
|
7
|
+
});
|
|
8
|
+
export const UpdateDeliveryProviderSchema = {
|
|
9
|
+
deliveryProviderId: z.string().min(1).describe('ID of the delivery provider to update'),
|
|
10
|
+
deliveryProvider: z
|
|
11
|
+
.object({
|
|
12
|
+
configuration: z
|
|
13
|
+
.array(ConfigurationEntry)
|
|
14
|
+
.optional()
|
|
15
|
+
.describe('List of key-value configuration entries'),
|
|
16
|
+
})
|
|
17
|
+
.refine((data) => {
|
|
18
|
+
const keys = data.configuration?.map((entry) => entry.key) || [];
|
|
19
|
+
return new Set(keys).size === keys.length;
|
|
20
|
+
}, {
|
|
21
|
+
message: 'Duplicate keys are not allowed in configuration.',
|
|
22
|
+
path: ['configuration'],
|
|
23
|
+
}),
|
|
24
|
+
};
|
|
25
|
+
export const UpdateDeliveryProviderZodSchema = z.object(UpdateDeliveryProviderSchema);
|
|
26
|
+
export async function updateDeliveryProviderHandler(context, params) {
|
|
27
|
+
const { modules, userId } = context;
|
|
28
|
+
const { deliveryProviderId, deliveryProvider } = params;
|
|
29
|
+
try {
|
|
30
|
+
log('handler updateDeliveryProviderHandler', { userId, deliveryProviderId, deliveryProvider });
|
|
31
|
+
if (!(await modules.delivery.providerExists({ deliveryProviderId })))
|
|
32
|
+
throw new DeliverProviderNotFoundError({ deliveryProviderId });
|
|
33
|
+
const updated = await modules.delivery.update(deliveryProviderId, deliveryProvider);
|
|
34
|
+
return {
|
|
35
|
+
content: [
|
|
36
|
+
{
|
|
37
|
+
type: 'text',
|
|
38
|
+
text: JSON.stringify({ provider: updated }),
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
return {
|
|
45
|
+
content: [
|
|
46
|
+
{
|
|
47
|
+
type: 'text',
|
|
48
|
+
text: `Error updating delivery provider: ${error.message}`,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=updateDeliveryProviderHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateDeliveryProviderHandler.js","sourceRoot":"","sources":["../../../../src/mcp/tools/delivery/updateDeliveryProviderHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAElE,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IACpD,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CAC/C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACvF,gBAAgB,EAAE,CAAC;SAChB,MAAM,CAAC;QACN,aAAa,EAAE,CAAC;aACb,KAAK,CAAC,kBAAkB,CAAC;aACzB,QAAQ,EAAE;aACV,QAAQ,CAAC,yCAAyC,CAAC;KACvD,CAAC;SACD,MAAM,CACL,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACjE,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC;IAC5C,CAAC,EACD;QACE,OAAO,EAAE,kDAAkD;QAC3D,IAAI,EAAE,CAAC,eAAe,CAAC;KACxB,CACF;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;AAGtF,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,OAAgB,EAChB,MAAoC;IAEpC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACpC,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;IAExD,IAAI,CAAC;QACH,GAAG,CAAC,uCAAuC,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAE/F,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAClE,MAAM,IAAI,4BAA4B,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAEjE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,gBAAuB,CAAC,CAAC;QAE3F,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;iBAC5C;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,qCAAsC,KAAe,CAAC,OAAO,EAAE;iBACtE;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Context } from '../../../context.js';
|
|
3
|
+
export declare const MonthlySalesBreakdownSchema: {
|
|
4
|
+
paymentProviderIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
5
|
+
deliveryProviderIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
6
|
+
status: z.ZodOptional<z.ZodArray<z.ZodEnum<["PENDING", "CONFIRMED", "SHIPPED", "DELIVERED", "CANCELLED"]>, "many">>;
|
|
7
|
+
from: z.ZodOptional<z.ZodString>;
|
|
8
|
+
to: z.ZodOptional<z.ZodString>;
|
|
9
|
+
};
|
|
10
|
+
export declare const MonthlySalesBreakdownZodSchema: z.ZodObject<{
|
|
11
|
+
paymentProviderIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
12
|
+
deliveryProviderIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
13
|
+
status: z.ZodOptional<z.ZodArray<z.ZodEnum<["PENDING", "CONFIRMED", "SHIPPED", "DELIVERED", "CANCELLED"]>, "many">>;
|
|
14
|
+
from: z.ZodOptional<z.ZodString>;
|
|
15
|
+
to: z.ZodOptional<z.ZodString>;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
status?: ("PENDING" | "CONFIRMED" | "SHIPPED" | "DELIVERED" | "CANCELLED")[];
|
|
18
|
+
from?: string;
|
|
19
|
+
paymentProviderIds?: string[];
|
|
20
|
+
deliveryProviderIds?: string[];
|
|
21
|
+
to?: string;
|
|
22
|
+
}, {
|
|
23
|
+
status?: ("PENDING" | "CONFIRMED" | "SHIPPED" | "DELIVERED" | "CANCELLED")[];
|
|
24
|
+
from?: string;
|
|
25
|
+
paymentProviderIds?: string[];
|
|
26
|
+
deliveryProviderIds?: string[];
|
|
27
|
+
to?: string;
|
|
28
|
+
}>;
|
|
29
|
+
export type MonthlySalesBreakdownParams = z.infer<typeof MonthlySalesBreakdownZodSchema>;
|
|
30
|
+
export declare function getMonthlySalesBreakdownHandler(context: Context, params: MonthlySalesBreakdownParams): Promise<{
|
|
31
|
+
content: {
|
|
32
|
+
type: "text";
|
|
33
|
+
text: string;
|
|
34
|
+
}[];
|
|
35
|
+
}>;
|
|
36
|
+
//# sourceMappingURL=getMonthlySalesBreakdownHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getMonthlySalesBreakdownHandler.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/order/getMonthlySalesBreakdownHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAK9C,eAAO,MAAM,2BAA2B;;;;;;CAGvC,CAAC;AAEF,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;EAAwC,CAAC;AACpF,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEzF,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,2BAA2B;;;;;GAyFpC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { log } from '@unchainedshop/logger';
|
|
3
|
+
import { DateRangeSchema, OrderFilterSchema } from '../../utils/sharedSchemas.js';
|
|
4
|
+
import { formatSummaryMap, resolveDateRange, resolveOrderFilters } from '../../utils/orderFilters.js';
|
|
5
|
+
export const MonthlySalesBreakdownSchema = {
|
|
6
|
+
...DateRangeSchema,
|
|
7
|
+
...OrderFilterSchema,
|
|
8
|
+
};
|
|
9
|
+
export const MonthlySalesBreakdownZodSchema = z.object(MonthlySalesBreakdownSchema);
|
|
10
|
+
export async function getMonthlySalesBreakdownHandler(context, params) {
|
|
11
|
+
const { modules, userId } = context;
|
|
12
|
+
try {
|
|
13
|
+
log('handler getMonthlySalesBreakdownHandler', { userId, params });
|
|
14
|
+
const { from, to, paymentProviderIds, deliveryProviderIds, status } = params;
|
|
15
|
+
const { startDate, endDate } = resolveDateRange(from, to);
|
|
16
|
+
const filters = await resolveOrderFilters(modules, { paymentProviderIds, deliveryProviderIds });
|
|
17
|
+
if (!filters) {
|
|
18
|
+
return {
|
|
19
|
+
content: [
|
|
20
|
+
{
|
|
21
|
+
type: 'text',
|
|
22
|
+
text: JSON.stringify({
|
|
23
|
+
totalSalesAmount: 0,
|
|
24
|
+
orderCount: 0,
|
|
25
|
+
averageOrderValue: 0,
|
|
26
|
+
currencyCode: null,
|
|
27
|
+
summary: [],
|
|
28
|
+
dateRange: { start: startDate.toISOString(), end: endDate.toISOString() },
|
|
29
|
+
}),
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const orders = await modules.orders.findOrders({
|
|
35
|
+
dateRange: { start: startDate.toISOString(), end: endDate.toISOString() },
|
|
36
|
+
status,
|
|
37
|
+
...filters,
|
|
38
|
+
});
|
|
39
|
+
let totalSalesAmount = 0;
|
|
40
|
+
let orderCount = 0;
|
|
41
|
+
const monthlyMap = new Map();
|
|
42
|
+
for (let i = 0; i < 12; i++) {
|
|
43
|
+
const date = new Date(endDate.getFullYear(), endDate.getMonth() - i, 1);
|
|
44
|
+
const label = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;
|
|
45
|
+
monthlyMap.set(label, { sales: 0, orders: 0 });
|
|
46
|
+
}
|
|
47
|
+
for (const order of orders) {
|
|
48
|
+
const orderDate = new Date(order.created);
|
|
49
|
+
if (orderDate < startDate || orderDate > endDate)
|
|
50
|
+
continue;
|
|
51
|
+
orderCount++;
|
|
52
|
+
const itemsAmount = order.calculation?.find((c) => c.category === 'ITEMS')?.amount || 0;
|
|
53
|
+
totalSalesAmount += itemsAmount;
|
|
54
|
+
const label = `${orderDate.getFullYear()}-${String(orderDate.getMonth() + 1).padStart(2, '0')}`;
|
|
55
|
+
const entry = monthlyMap.get(label);
|
|
56
|
+
if (entry) {
|
|
57
|
+
entry.sales += itemsAmount;
|
|
58
|
+
entry.orders += 1;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const averageOrderValue = orderCount > 0 ? totalSalesAmount / orderCount : 0;
|
|
62
|
+
return {
|
|
63
|
+
content: [
|
|
64
|
+
{
|
|
65
|
+
type: 'text',
|
|
66
|
+
text: JSON.stringify({
|
|
67
|
+
totalSalesAmount,
|
|
68
|
+
orderCount,
|
|
69
|
+
averageOrderValue,
|
|
70
|
+
currencyCode: orders[0]?.currencyCode ?? null,
|
|
71
|
+
summary: formatSummaryMap(monthlyMap),
|
|
72
|
+
dateRange: { start: startDate.toISOString(), end: endDate.toISOString() },
|
|
73
|
+
}),
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
return {
|
|
80
|
+
content: [
|
|
81
|
+
{
|
|
82
|
+
type: 'text',
|
|
83
|
+
text: `Error fetching monthly sales breakdown: ${error.message}`,
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=getMonthlySalesBreakdownHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getMonthlySalesBreakdownHandler.js","sourceRoot":"","sources":["../../../../src/mcp/tools/order/getMonthlySalesBreakdownHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Context } from '../../../context.js';
|
|
3
|
+
export declare const SalesSummarySchema: {
|
|
4
|
+
days: z.ZodOptional<z.ZodNumber>;
|
|
5
|
+
paymentProviderIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
6
|
+
deliveryProviderIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
7
|
+
status: z.ZodOptional<z.ZodArray<z.ZodEnum<["PENDING", "CONFIRMED", "SHIPPED", "DELIVERED", "CANCELLED"]>, "many">>;
|
|
8
|
+
from: z.ZodOptional<z.ZodString>;
|
|
9
|
+
to: z.ZodOptional<z.ZodString>;
|
|
10
|
+
};
|
|
11
|
+
export declare const SalesSummaryZodSchema: z.ZodObject<{
|
|
12
|
+
days: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
paymentProviderIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
14
|
+
deliveryProviderIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
15
|
+
status: z.ZodOptional<z.ZodArray<z.ZodEnum<["PENDING", "CONFIRMED", "SHIPPED", "DELIVERED", "CANCELLED"]>, "many">>;
|
|
16
|
+
from: z.ZodOptional<z.ZodString>;
|
|
17
|
+
to: z.ZodOptional<z.ZodString>;
|
|
18
|
+
}, "strip", z.ZodTypeAny, {
|
|
19
|
+
status?: ("PENDING" | "CONFIRMED" | "SHIPPED" | "DELIVERED" | "CANCELLED")[];
|
|
20
|
+
from?: string;
|
|
21
|
+
paymentProviderIds?: string[];
|
|
22
|
+
deliveryProviderIds?: string[];
|
|
23
|
+
to?: string;
|
|
24
|
+
days?: number;
|
|
25
|
+
}, {
|
|
26
|
+
status?: ("PENDING" | "CONFIRMED" | "SHIPPED" | "DELIVERED" | "CANCELLED")[];
|
|
27
|
+
from?: string;
|
|
28
|
+
paymentProviderIds?: string[];
|
|
29
|
+
deliveryProviderIds?: string[];
|
|
30
|
+
to?: string;
|
|
31
|
+
days?: number;
|
|
32
|
+
}>;
|
|
33
|
+
export type SalesSummaryParams = z.infer<typeof SalesSummaryZodSchema>;
|
|
34
|
+
export declare function getSalesSummaryHandler(context: Context, params: SalesSummaryParams): Promise<{
|
|
35
|
+
content: {
|
|
36
|
+
type: "text";
|
|
37
|
+
text: string;
|
|
38
|
+
}[];
|
|
39
|
+
}>;
|
|
40
|
+
//# sourceMappingURL=getSalesSummaryHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSalesSummaryHandler.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/order/getSalesSummaryHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAK9C,eAAO,MAAM,kBAAkB;;;;;;;CAI9B,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;EAA+B,CAAC;AAClE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEvE,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB;;;;;GAuFxF"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { log } from '@unchainedshop/logger';
|
|
3
|
+
import { DateRangeSchema, OrderFilterSchema } from '../../utils/sharedSchemas.js';
|
|
4
|
+
import { formatSummaryMap, resolveDateRange, resolveOrderFilters } from '../../utils/orderFilters.js';
|
|
5
|
+
export const SalesSummarySchema = {
|
|
6
|
+
...DateRangeSchema,
|
|
7
|
+
...OrderFilterSchema,
|
|
8
|
+
days: z.number().int().min(1).max(365).optional(),
|
|
9
|
+
};
|
|
10
|
+
export const SalesSummaryZodSchema = z.object(SalesSummarySchema);
|
|
11
|
+
export async function getSalesSummaryHandler(context, params) {
|
|
12
|
+
const { modules, userId } = context;
|
|
13
|
+
try {
|
|
14
|
+
log('handler getSalesSummaryHandler', { userId, params });
|
|
15
|
+
const { from, to, days = 30, paymentProviderIds, deliveryProviderIds, status } = params;
|
|
16
|
+
const { startDate, endDate } = resolveDateRange(from, to, days);
|
|
17
|
+
const filters = await resolveOrderFilters(modules, { paymentProviderIds, deliveryProviderIds });
|
|
18
|
+
if (!filters) {
|
|
19
|
+
return {
|
|
20
|
+
content: [
|
|
21
|
+
{
|
|
22
|
+
type: 'text',
|
|
23
|
+
text: JSON.stringify({
|
|
24
|
+
totalSalesAmount: 0,
|
|
25
|
+
orderCount: 0,
|
|
26
|
+
averageOrderValue: 0,
|
|
27
|
+
currencyCode: null,
|
|
28
|
+
summary: [],
|
|
29
|
+
dateRange: { start: startDate.toISOString(), end: endDate.toISOString() },
|
|
30
|
+
}),
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const orders = await modules.orders.findOrders({
|
|
36
|
+
dateRange: { start: startDate.toISOString(), end: endDate.toISOString() },
|
|
37
|
+
...filters,
|
|
38
|
+
status,
|
|
39
|
+
});
|
|
40
|
+
let totalSalesAmount = 0;
|
|
41
|
+
let orderCount = 0;
|
|
42
|
+
const dateMap = new Map();
|
|
43
|
+
for (let i = 0; i < days; i++) {
|
|
44
|
+
const date = new Date(endDate.getTime() - i * 86400000);
|
|
45
|
+
const label = date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
|
|
46
|
+
dateMap.set(label, { sales: 0, orders: 0 });
|
|
47
|
+
}
|
|
48
|
+
for (const order of orders) {
|
|
49
|
+
const orderDate = new Date(order.created);
|
|
50
|
+
if (orderDate < startDate || orderDate > endDate)
|
|
51
|
+
continue;
|
|
52
|
+
orderCount++;
|
|
53
|
+
const itemsAmount = order.calculation?.find((c) => c.category === 'ITEMS')?.amount || 0;
|
|
54
|
+
totalSalesAmount += itemsAmount;
|
|
55
|
+
const label = orderDate.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
|
|
56
|
+
const entry = dateMap.get(label);
|
|
57
|
+
if (entry) {
|
|
58
|
+
entry.sales += itemsAmount;
|
|
59
|
+
entry.orders += 1;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const averageOrderValue = orderCount > 0 ? totalSalesAmount / orderCount : 0;
|
|
63
|
+
return {
|
|
64
|
+
content: [
|
|
65
|
+
{
|
|
66
|
+
type: 'text',
|
|
67
|
+
text: JSON.stringify({
|
|
68
|
+
totalSalesAmount,
|
|
69
|
+
orderCount,
|
|
70
|
+
averageOrderValue,
|
|
71
|
+
currencyCode: orders[0]?.currencyCode ?? null,
|
|
72
|
+
summary: formatSummaryMap(dateMap),
|
|
73
|
+
dateRange: { start: startDate.toISOString(), end: endDate.toISOString() },
|
|
74
|
+
}),
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
return {
|
|
81
|
+
content: [
|
|
82
|
+
{
|
|
83
|
+
type: 'text',
|
|
84
|
+
text: `Error fetching sales summary: ${error.message}`,
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=getSalesSummaryHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSalesSummaryHandler.js","sourceRoot":"","sources":["../../../../src/mcp/tools/order/getSalesSummaryHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Context } from '../../../context.js';
|
|
3
|
+
export declare const GetTopCustomersSchema: {
|
|
4
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
5
|
+
status: z.ZodOptional<z.ZodString>;
|
|
6
|
+
dateRange: z.ZodOptional<z.ZodObject<{
|
|
7
|
+
start: z.ZodOptional<z.ZodString>;
|
|
8
|
+
end: z.ZodOptional<z.ZodString>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
end?: string;
|
|
11
|
+
start?: string;
|
|
12
|
+
}, {
|
|
13
|
+
end?: string;
|
|
14
|
+
start?: string;
|
|
15
|
+
}>>;
|
|
16
|
+
};
|
|
17
|
+
export declare const GetTopCustomersZodSchema: z.ZodObject<{
|
|
18
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
19
|
+
status: z.ZodOptional<z.ZodString>;
|
|
20
|
+
dateRange: z.ZodOptional<z.ZodObject<{
|
|
21
|
+
start: z.ZodOptional<z.ZodString>;
|
|
22
|
+
end: z.ZodOptional<z.ZodString>;
|
|
23
|
+
}, "strip", z.ZodTypeAny, {
|
|
24
|
+
end?: string;
|
|
25
|
+
start?: string;
|
|
26
|
+
}, {
|
|
27
|
+
end?: string;
|
|
28
|
+
start?: string;
|
|
29
|
+
}>>;
|
|
30
|
+
}, "strip", z.ZodTypeAny, {
|
|
31
|
+
status?: string;
|
|
32
|
+
limit?: number;
|
|
33
|
+
dateRange?: {
|
|
34
|
+
end?: string;
|
|
35
|
+
start?: string;
|
|
36
|
+
};
|
|
37
|
+
}, {
|
|
38
|
+
status?: string;
|
|
39
|
+
limit?: number;
|
|
40
|
+
dateRange?: {
|
|
41
|
+
end?: string;
|
|
42
|
+
start?: string;
|
|
43
|
+
};
|
|
44
|
+
}>;
|
|
45
|
+
export type GetTopCustomersParams = z.infer<typeof GetTopCustomersZodSchema>;
|
|
46
|
+
export declare function getTopCustomersHandler(context: Context, params: GetTopCustomersParams): Promise<{
|
|
47
|
+
content: {
|
|
48
|
+
type: "text";
|
|
49
|
+
text: string;
|
|
50
|
+
}[];
|
|
51
|
+
}>;
|
|
52
|
+
//# sourceMappingURL=getTopCustomersHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getTopCustomersHandler.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/order/getTopCustomersHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAK9C,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;CAUjC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAkC,CAAC;AACxE,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE7E,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB;;;;;GAqG3F"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { log } from '@unchainedshop/logger';
|
|
3
|
+
import { resolveDateRange } from '../../utils/orderFilters.js';
|
|
4
|
+
import { OrderStatus } from '@unchainedshop/core-orders';
|
|
5
|
+
export const GetTopCustomersSchema = {
|
|
6
|
+
limit: z.number().int().min(1).max(100).optional().describe('Max number of customers to return'),
|
|
7
|
+
status: z.string().optional().describe('Order status to filter by (e.g., CONFIRMED, DELIVERED)'),
|
|
8
|
+
dateRange: z
|
|
9
|
+
.object({
|
|
10
|
+
start: z.string().datetime().optional(),
|
|
11
|
+
end: z.string().datetime().optional(),
|
|
12
|
+
})
|
|
13
|
+
.optional()
|
|
14
|
+
.describe('Optional date range to filter orders'),
|
|
15
|
+
};
|
|
16
|
+
export const GetTopCustomersZodSchema = z.object(GetTopCustomersSchema);
|
|
17
|
+
export async function getTopCustomersHandler(context, params) {
|
|
18
|
+
const { modules, userId, loaders } = context;
|
|
19
|
+
const { status, dateRange, limit = 10 } = params;
|
|
20
|
+
try {
|
|
21
|
+
log('handler getTopCustomersHandler', { userId, params });
|
|
22
|
+
const match = { status };
|
|
23
|
+
const { startDate, endDate } = resolveDateRange(dateRange.start, dateRange.end);
|
|
24
|
+
const orders = await modules.orders.findOrders({
|
|
25
|
+
status: [OrderStatus.CONFIRMED, OrderStatus.FULLFILLED],
|
|
26
|
+
dateRange: { start: startDate.toISOString(), end: endDate.toISOString() },
|
|
27
|
+
}, {
|
|
28
|
+
projection: {
|
|
29
|
+
_id: 1,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
const orderIds = orders.map(({ _id }) => _id);
|
|
33
|
+
if (startDate)
|
|
34
|
+
match.created = { ...(match.created || {}), $gte: startDate.toISOString() };
|
|
35
|
+
if (endDate)
|
|
36
|
+
match.created = { ...(match.created || {}), $lte: endDate.toISOString() };
|
|
37
|
+
if (orderIds?.length)
|
|
38
|
+
match._id = { $in: orderIds };
|
|
39
|
+
const topCustomers = await modules.orders.aggregateOrders({
|
|
40
|
+
match,
|
|
41
|
+
project: {
|
|
42
|
+
userId: 1,
|
|
43
|
+
created: 1,
|
|
44
|
+
itemAmount: {
|
|
45
|
+
$let: {
|
|
46
|
+
vars: {
|
|
47
|
+
item: {
|
|
48
|
+
$first: {
|
|
49
|
+
$filter: {
|
|
50
|
+
input: '$calculation',
|
|
51
|
+
as: 'c',
|
|
52
|
+
cond: { $eq: ['$$c.category', 'ITEMS'] },
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
in: '$$item.amount',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
group: {
|
|
62
|
+
_id: '$userId',
|
|
63
|
+
totalSpent: { $sum: '$itemAmount' },
|
|
64
|
+
orderCount: { $sum: 1 },
|
|
65
|
+
lastOrderDate: { $max: '$created' },
|
|
66
|
+
},
|
|
67
|
+
addFields: {
|
|
68
|
+
averageOrderValue: {
|
|
69
|
+
$cond: [{ $eq: ['$orderCount', 0] }, 0, { $divide: ['$totalSpent', '$orderCount'] }],
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
sort: { totalSpent: -1 },
|
|
73
|
+
limit,
|
|
74
|
+
});
|
|
75
|
+
const normalizedCustomers = await Promise.all(topCustomers.map(async (c) => {
|
|
76
|
+
const user = await modules.users.findUserById(c._id);
|
|
77
|
+
const avatar = await loaders.fileLoader.load({
|
|
78
|
+
fileId: user?.avatarId,
|
|
79
|
+
});
|
|
80
|
+
return {
|
|
81
|
+
userId: c._id?.toString?.() ?? null,
|
|
82
|
+
user: {
|
|
83
|
+
avatar,
|
|
84
|
+
},
|
|
85
|
+
totalSpent: c.totalSpent,
|
|
86
|
+
orderCount: c.orderCount,
|
|
87
|
+
lastOrderDate: c.lastOrderDate,
|
|
88
|
+
averageOrderValue: Math.round(c.averageOrderValue),
|
|
89
|
+
};
|
|
90
|
+
}));
|
|
91
|
+
return {
|
|
92
|
+
content: [
|
|
93
|
+
{
|
|
94
|
+
type: 'text',
|
|
95
|
+
text: JSON.stringify({ customers: normalizedCustomers }),
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
return {
|
|
102
|
+
content: [
|
|
103
|
+
{
|
|
104
|
+
type: 'text',
|
|
105
|
+
text: `Error fetching top customers: ${error.message}`,
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=getTopCustomersHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getTopCustomersHandler.js","sourceRoot":"","sources":["../../../../src/mcp/tools/order/getTopCustomersHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Context } from '../../../context.js';
|
|
3
|
+
export declare const TopSellingProductsSchema: {
|
|
4
|
+
from: z.ZodOptional<z.ZodString>;
|
|
5
|
+
to: z.ZodOptional<z.ZodString>;
|
|
6
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
7
|
+
};
|
|
8
|
+
export declare const TopSellingProductsZodSchema: z.ZodObject<{
|
|
9
|
+
from: z.ZodOptional<z.ZodString>;
|
|
10
|
+
to: z.ZodOptional<z.ZodString>;
|
|
11
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
limit?: number;
|
|
14
|
+
from?: string;
|
|
15
|
+
to?: string;
|
|
16
|
+
}, {
|
|
17
|
+
limit?: number;
|
|
18
|
+
from?: string;
|
|
19
|
+
to?: string;
|
|
20
|
+
}>;
|
|
21
|
+
export type TopSellingProductsParams = z.infer<typeof TopSellingProductsZodSchema>;
|
|
22
|
+
export declare function getTopSellingProductsHandler(context: Context, params: TopSellingProductsParams): Promise<{
|
|
23
|
+
content: {
|
|
24
|
+
type: "text";
|
|
25
|
+
text: string;
|
|
26
|
+
}[];
|
|
27
|
+
}>;
|
|
28
|
+
//# sourceMappingURL=getTopSellingProductsHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getTopSellingProductsHandler.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/order/getTopSellingProductsHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAM9C,eAAO,MAAM,wBAAwB;;;;CAIpC,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;;;;;;;;;;EAAqC,CAAC;AAC9E,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEnF,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAwB;;;;;GA+FpG"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { log } from '@unchainedshop/logger';
|
|
3
|
+
import { getNormalizedProductDetails } from '../../utils/getNormalizedProductDetails.js';
|
|
4
|
+
import { OrderStatus } from '@unchainedshop/core-orders';
|
|
5
|
+
import { resolveDateRange } from '../../utils/orderFilters.js';
|
|
6
|
+
export const TopSellingProductsSchema = {
|
|
7
|
+
from: z.string().datetime().optional().describe('Start date (ISO format)'),
|
|
8
|
+
to: z.string().datetime().optional().describe('End date (ISO format)'),
|
|
9
|
+
limit: z.number().int().min(1).max(100).optional().default(10),
|
|
10
|
+
};
|
|
11
|
+
export const TopSellingProductsZodSchema = z.object(TopSellingProductsSchema);
|
|
12
|
+
export async function getTopSellingProductsHandler(context, params) {
|
|
13
|
+
const { modules, userId } = context;
|
|
14
|
+
const { from, to, limit } = params;
|
|
15
|
+
try {
|
|
16
|
+
log('handler getTopSellingProductsHandler', { userId, params });
|
|
17
|
+
const match = {};
|
|
18
|
+
const { startDate, endDate } = resolveDateRange(from, to);
|
|
19
|
+
const orders = await modules.orders.findOrders({
|
|
20
|
+
status: [OrderStatus.CONFIRMED, OrderStatus.FULLFILLED],
|
|
21
|
+
dateRange: { start: startDate.toISOString(), end: endDate.toISOString() },
|
|
22
|
+
}, {
|
|
23
|
+
projection: {
|
|
24
|
+
_id: 1,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
const orderIds = orders.map(({ _id }) => _id);
|
|
28
|
+
if (startDate)
|
|
29
|
+
match.created = { ...(match.created || {}), $gte: startDate.toISOString() };
|
|
30
|
+
if (endDate)
|
|
31
|
+
match.created = { ...(match.created || {}), $lte: endDate.toISOString() };
|
|
32
|
+
if (orderIds?.length)
|
|
33
|
+
match.orderId = { $in: orderIds };
|
|
34
|
+
const topProducts = await modules.orders.positions.aggregatePositions({
|
|
35
|
+
match,
|
|
36
|
+
project: {
|
|
37
|
+
productId: 1,
|
|
38
|
+
quantity: 1,
|
|
39
|
+
itemAmount: {
|
|
40
|
+
$let: {
|
|
41
|
+
vars: {
|
|
42
|
+
item: {
|
|
43
|
+
$first: {
|
|
44
|
+
$filter: {
|
|
45
|
+
input: '$calculation',
|
|
46
|
+
as: 'c',
|
|
47
|
+
cond: { $eq: ['$$c.category', 'ITEM'] },
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
in: '$$item.amount',
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
group: {
|
|
57
|
+
_id: '$productId',
|
|
58
|
+
totalSold: { $sum: '$quantity' },
|
|
59
|
+
totalRevenue: { $sum: '$itemAmount' },
|
|
60
|
+
},
|
|
61
|
+
sort: { totalSold: -1 },
|
|
62
|
+
limit,
|
|
63
|
+
});
|
|
64
|
+
const normalizedTopSellingProducts = await Promise.all(topProducts.map(async (p) => {
|
|
65
|
+
const product = await getNormalizedProductDetails(p._id, context);
|
|
66
|
+
return {
|
|
67
|
+
productId: p._id?.toString?.() ?? null,
|
|
68
|
+
product,
|
|
69
|
+
totalSold: p.totalSold,
|
|
70
|
+
totalRevenue: p.totalRevenue,
|
|
71
|
+
};
|
|
72
|
+
}));
|
|
73
|
+
return {
|
|
74
|
+
content: [
|
|
75
|
+
{
|
|
76
|
+
type: 'text',
|
|
77
|
+
text: JSON.stringify({
|
|
78
|
+
products: normalizedTopSellingProducts,
|
|
79
|
+
dateRange: {
|
|
80
|
+
start: from ? new Date(from).toISOString() : null,
|
|
81
|
+
end: to ? new Date(to).toISOString() : null,
|
|
82
|
+
},
|
|
83
|
+
}),
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
return {
|
|
90
|
+
content: [
|
|
91
|
+
{
|
|
92
|
+
type: 'text',
|
|
93
|
+
text: `Error fetching top-selling products: ${error.message}`,
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=getTopSellingProductsHandler.js.map
|