@virtocommerce/mcp-onx 0.0.1-alpha.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/LICENSE +22 -0
- package/README.md +360 -0
- package/dist/adapter.d.ts +53 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +205 -0
- package/dist/adapter.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/mappers/filter.mappers.d.ts +16 -0
- package/dist/mappers/filter.mappers.d.ts.map +1 -0
- package/dist/mappers/filter.mappers.js +209 -0
- package/dist/mappers/filter.mappers.js.map +1 -0
- package/dist/mappers/index.d.ts +2 -0
- package/dist/mappers/index.d.ts.map +1 -0
- package/dist/mappers/index.js +2 -0
- package/dist/mappers/index.js.map +1 -0
- package/dist/models/base.d.ts +133 -0
- package/dist/models/base.d.ts.map +1 -0
- package/dist/models/base.js +2 -0
- package/dist/models/base.js.map +1 -0
- package/dist/models/catalog.d.ts +180 -0
- package/dist/models/catalog.d.ts.map +1 -0
- package/dist/models/catalog.js +2 -0
- package/dist/models/catalog.js.map +1 -0
- package/dist/models/customer.d.ts +148 -0
- package/dist/models/customer.d.ts.map +1 -0
- package/dist/models/customer.js +2 -0
- package/dist/models/customer.js.map +1 -0
- package/dist/models/index.d.ts +10 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +2 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/inventory.d.ts +34 -0
- package/dist/models/inventory.d.ts.map +1 -0
- package/dist/models/inventory.js +2 -0
- package/dist/models/inventory.js.map +1 -0
- package/dist/models/order.d.ts +158 -0
- package/dist/models/order.d.ts.map +1 -0
- package/dist/models/order.js +2 -0
- package/dist/models/order.js.map +1 -0
- package/dist/models/payment.d.ts +145 -0
- package/dist/models/payment.d.ts.map +1 -0
- package/dist/models/payment.js +2 -0
- package/dist/models/payment.js.map +1 -0
- package/dist/models/return.d.ts +31 -0
- package/dist/models/return.d.ts.map +1 -0
- package/dist/models/return.js +2 -0
- package/dist/models/return.js.map +1 -0
- package/dist/models/search.d.ts +143 -0
- package/dist/models/search.d.ts.map +1 -0
- package/dist/models/search.js +2 -0
- package/dist/models/search.js.map +1 -0
- package/dist/models/shipment.d.ts +70 -0
- package/dist/models/shipment.d.ts.map +1 -0
- package/dist/models/shipment.js +2 -0
- package/dist/models/shipment.js.map +1 -0
- package/dist/services/base.service.d.ts +10 -0
- package/dist/services/base.service.d.ts.map +1 -0
- package/dist/services/base.service.js +25 -0
- package/dist/services/base.service.js.map +1 -0
- package/dist/services/customer.service.d.ts +16 -0
- package/dist/services/customer.service.d.ts.map +1 -0
- package/dist/services/customer.service.js +78 -0
- package/dist/services/customer.service.js.map +1 -0
- package/dist/services/fulfillment.service.d.ts +17 -0
- package/dist/services/fulfillment.service.d.ts.map +1 -0
- package/dist/services/fulfillment.service.js +94 -0
- package/dist/services/fulfillment.service.js.map +1 -0
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +7 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/order.service.d.ts +22 -0
- package/dist/services/order.service.d.ts.map +1 -0
- package/dist/services/order.service.js +153 -0
- package/dist/services/order.service.js.map +1 -0
- package/dist/services/product.service.d.ts +25 -0
- package/dist/services/product.service.d.ts.map +1 -0
- package/dist/services/product.service.js +116 -0
- package/dist/services/product.service.js.map +1 -0
- package/dist/services/return.service.d.ts +17 -0
- package/dist/services/return.service.d.ts.map +1 -0
- package/dist/services/return.service.js +148 -0
- package/dist/services/return.service.js.map +1 -0
- package/dist/transformers/address.transformer.d.ts +11 -0
- package/dist/transformers/address.transformer.d.ts.map +1 -0
- package/dist/transformers/address.transformer.js +75 -0
- package/dist/transformers/address.transformer.js.map +1 -0
- package/dist/transformers/base.d.ts +14 -0
- package/dist/transformers/base.d.ts.map +1 -0
- package/dist/transformers/base.js +44 -0
- package/dist/transformers/base.js.map +1 -0
- package/dist/transformers/customer.transformer.d.ts +16 -0
- package/dist/transformers/customer.transformer.d.ts.map +1 -0
- package/dist/transformers/customer.transformer.js +84 -0
- package/dist/transformers/customer.transformer.js.map +1 -0
- package/dist/transformers/fulfillment.transformer.d.ts +13 -0
- package/dist/transformers/fulfillment.transformer.d.ts.map +1 -0
- package/dist/transformers/fulfillment.transformer.js +93 -0
- package/dist/transformers/fulfillment.transformer.js.map +1 -0
- package/dist/transformers/index.d.ts +8 -0
- package/dist/transformers/index.d.ts.map +1 -0
- package/dist/transformers/index.js +8 -0
- package/dist/transformers/index.js.map +1 -0
- package/dist/transformers/order.transformer.d.ts +26 -0
- package/dist/transformers/order.transformer.d.ts.map +1 -0
- package/dist/transformers/order.transformer.js +201 -0
- package/dist/transformers/order.transformer.js.map +1 -0
- package/dist/transformers/product.transformer.d.ts +19 -0
- package/dist/transformers/product.transformer.d.ts.map +1 -0
- package/dist/transformers/product.transformer.js +202 -0
- package/dist/transformers/product.transformer.js.map +1 -0
- package/dist/transformers/return.transformer.d.ts +12 -0
- package/dist/transformers/return.transformer.d.ts.map +1 -0
- package/dist/transformers/return.transformer.js +83 -0
- package/dist/transformers/return.transformer.js.map +1 -0
- package/dist/types.d.ts +135 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +47 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/api-client.d.ts +31 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +226 -0
- package/dist/utils/api-client.js.map +1 -0
- package/dist/utils/type-guards.d.ts +9 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +21 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { BaseService } from './base.service.js';
|
|
2
|
+
import { OrderTransformer } from '../transformers/order.transformer.js';
|
|
3
|
+
import { CustomerService } from './customer.service.js';
|
|
4
|
+
import { mapOrderFiltersToSearchCriteria } from '../mappers/filter.mappers.js';
|
|
5
|
+
import { getErrorMessage } from '../utils/type-guards.js';
|
|
6
|
+
export class OrderService extends BaseService {
|
|
7
|
+
transformer;
|
|
8
|
+
customerService;
|
|
9
|
+
productService;
|
|
10
|
+
workspace;
|
|
11
|
+
constructor(client, tenantId = 'default-workspace', workspace) {
|
|
12
|
+
super(client);
|
|
13
|
+
this.workspace = workspace;
|
|
14
|
+
this.transformer = new OrderTransformer(tenantId, workspace);
|
|
15
|
+
this.customerService = new CustomerService(client, tenantId);
|
|
16
|
+
}
|
|
17
|
+
setProductService(productService) {
|
|
18
|
+
this.productService = productService;
|
|
19
|
+
}
|
|
20
|
+
setTenantId(tenantId) {
|
|
21
|
+
this.transformer.setTenantId(tenantId);
|
|
22
|
+
this.customerService.setTenantId(tenantId);
|
|
23
|
+
}
|
|
24
|
+
setWorkspace(workspace) {
|
|
25
|
+
this.workspace = workspace;
|
|
26
|
+
this.transformer.setWorkspace(workspace);
|
|
27
|
+
}
|
|
28
|
+
setCatalogId(catalogId) {
|
|
29
|
+
this.transformer.setCatalogId(catalogId);
|
|
30
|
+
}
|
|
31
|
+
async createSalesOrder(input) {
|
|
32
|
+
try {
|
|
33
|
+
const customer = input.order?.customer;
|
|
34
|
+
if (!customer?.id && !customer?.externalId) {
|
|
35
|
+
return this.failure('Customer identification is required to create an order. Provide customer.id or customer.externalId in order.customer.');
|
|
36
|
+
}
|
|
37
|
+
const skus = input.order?.lineItems?.map((li) => li.sku).filter(Boolean) ?? [];
|
|
38
|
+
const skuProductMap = skus.length && this.productService
|
|
39
|
+
? await this.productService.resolveSkuProductMap(skus)
|
|
40
|
+
: new Map();
|
|
41
|
+
console.error(`[OrderService] Resolved SKUs to products: ${JSON.stringify(Object.fromEntries(skuProductMap))}`);
|
|
42
|
+
const payload = this.transformer.fromCreateSalesOrderInput(input, skuProductMap);
|
|
43
|
+
const response = await this.client.post('/api/order/customerOrders', payload);
|
|
44
|
+
if (!response.success || !response.data) {
|
|
45
|
+
return this.failure('Failed to create order', response.error ?? response);
|
|
46
|
+
}
|
|
47
|
+
return this.success({
|
|
48
|
+
order: this.transformer.toMcpOrder(response.data),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return this.failure(`Order creation failed: ${getErrorMessage(error)}`, error);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async cancelOrder(input) {
|
|
56
|
+
if (!input.orderId) {
|
|
57
|
+
return this.failure('orderId is required to cancel an order');
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const fetchResponse = await this.client.get(`/api/order/customerOrders/${input.orderId}`);
|
|
61
|
+
if (!fetchResponse.success || !fetchResponse.data) {
|
|
62
|
+
return this.failure('Order not found', {
|
|
63
|
+
orderId: input.orderId,
|
|
64
|
+
error: fetchResponse.error,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const order = fetchResponse.data;
|
|
68
|
+
if (order.isCancelled) {
|
|
69
|
+
return this.failure('Order is already cancelled', {
|
|
70
|
+
orderId: input.orderId,
|
|
71
|
+
cancelledDate: order.cancelledDate,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const cancelledOrder = {
|
|
75
|
+
...order,
|
|
76
|
+
isCancelled: true,
|
|
77
|
+
cancelledDate: new Date().toISOString(),
|
|
78
|
+
cancelReason: input.reason ?? 'Customer requested cancellation',
|
|
79
|
+
cancelledState: 'Requested',
|
|
80
|
+
status: 'Cancelled',
|
|
81
|
+
comment: input.notes
|
|
82
|
+
? `${order.comment ?? ''}\n[Cancellation] ${input.notes}`.trim().slice(0, 2048)
|
|
83
|
+
: order.comment,
|
|
84
|
+
};
|
|
85
|
+
const saveResponse = await this.client.put('/api/order/customerOrders', cancelledOrder);
|
|
86
|
+
if (!saveResponse.success) {
|
|
87
|
+
return this.failure('Failed to cancel order', saveResponse.error ?? saveResponse);
|
|
88
|
+
}
|
|
89
|
+
const refetchResponse = await this.client.get(`/api/order/customerOrders/${input.orderId}`);
|
|
90
|
+
const savedOrder = refetchResponse.success && refetchResponse.data
|
|
91
|
+
? refetchResponse.data
|
|
92
|
+
: cancelledOrder;
|
|
93
|
+
return this.success({
|
|
94
|
+
order: this.transformer.toMcpOrder(savedOrder),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return this.failure(`Order cancellation failed: ${getErrorMessage(error)}`, error);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async updateOrder(input) {
|
|
102
|
+
if (!input.id) {
|
|
103
|
+
return this.failure('id is required to update an order');
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const fetchResponse = await this.client.get(`/api/order/customerOrders/${input.id}`);
|
|
107
|
+
if (!fetchResponse.success || !fetchResponse.data) {
|
|
108
|
+
return this.failure('Order not found', {
|
|
109
|
+
orderId: input.id,
|
|
110
|
+
error: fetchResponse.error,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const updatedOrder = this.transformer.applyUpdatesToOrder(fetchResponse.data, input.updates);
|
|
114
|
+
const saveResponse = await this.client.put('/api/order/customerOrders', updatedOrder);
|
|
115
|
+
if (!saveResponse.success) {
|
|
116
|
+
return this.failure('Failed to update order', saveResponse.error ?? saveResponse);
|
|
117
|
+
}
|
|
118
|
+
const refetchResponse = await this.client.get(`/api/order/customerOrders/${input.id}`);
|
|
119
|
+
const savedOrder = refetchResponse.success && refetchResponse.data
|
|
120
|
+
? refetchResponse.data
|
|
121
|
+
: updatedOrder;
|
|
122
|
+
return this.success({
|
|
123
|
+
order: this.transformer.toMcpOrder(savedOrder),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
return this.failure(`Order update failed: ${getErrorMessage(error)}`, error);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async getOrders(input) {
|
|
131
|
+
try {
|
|
132
|
+
const searchCriteria = mapOrderFiltersToSearchCriteria(input);
|
|
133
|
+
if (this.workspace) {
|
|
134
|
+
searchCriteria.storeIds = [this.workspace];
|
|
135
|
+
}
|
|
136
|
+
const response = await this.client.post('/api/order/customerOrders/search', searchCriteria);
|
|
137
|
+
if (!response.success) {
|
|
138
|
+
return this.failure('Failed to fetch orders', response.error ?? response);
|
|
139
|
+
}
|
|
140
|
+
const results = response.data?.results ?? [];
|
|
141
|
+
const customerIds = results
|
|
142
|
+
.map((order) => order.customerId)
|
|
143
|
+
.filter((id) => !!id);
|
|
144
|
+
const customerMap = await this.customerService.getCustomersByIds(customerIds);
|
|
145
|
+
const orders = this.transformer.toMcpOrders(results, customerMap);
|
|
146
|
+
return this.success({ orders });
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
return this.failure(`Order lookup failed: ${getErrorMessage(error)}`, error);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=order.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order.service.js","sourceRoot":"","sources":["../../src/services/order.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Product, ProductVariant, InventoryItem, FulfillmentToolResult, GetProductsInput, GetProductVariantsInput, GetInventoryInput } from '@virtocommerce/cof-mcp';
|
|
2
|
+
import { BaseService } from './base.service.js';
|
|
3
|
+
import { ApiClient } from '../utils/api-client.js';
|
|
4
|
+
export declare class ProductService extends BaseService {
|
|
5
|
+
private transformer;
|
|
6
|
+
private catalogId?;
|
|
7
|
+
constructor(client: ApiClient, tenantId?: string);
|
|
8
|
+
setTenantId(tenantId: string): void;
|
|
9
|
+
setCatalogId(catalogId: string): void;
|
|
10
|
+
getProducts(input: GetProductsInput): Promise<FulfillmentToolResult<{
|
|
11
|
+
products: Product[];
|
|
12
|
+
}>>;
|
|
13
|
+
resolveSkuProductMap(skus: string[]): Promise<Map<string, {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
}>>;
|
|
17
|
+
private resolveSkusToIds;
|
|
18
|
+
getProductVariants(input: GetProductVariantsInput): Promise<FulfillmentToolResult<{
|
|
19
|
+
productVariants: ProductVariant[];
|
|
20
|
+
}>>;
|
|
21
|
+
getInventory(input: GetInventoryInput): Promise<FulfillmentToolResult<{
|
|
22
|
+
inventory: InventoryItem[];
|
|
23
|
+
}>>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=product.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product.service.d.ts","sourceRoot":"","sources":["../../src/services/product.service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOhD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,qBAAa,cAAe,SAAQ,WAAW;IAC7C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAE,MAA4B;IAKrE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAInC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI/B,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,qBAAqB,CAAC;QAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAC;IAqC7F,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;YA+BhF,gBAAgB;IAKxB,kBAAkB,CACtB,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,qBAAqB,CAAC;QAAE,eAAe,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC,CAAC;IAgClE,YAAY,CAChB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,qBAAqB,CAAC;QAAE,SAAS,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC,CAAC;CA8DlE"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { BaseService } from './base.service.js';
|
|
2
|
+
import { ProductTransformer } from '../transformers/product.transformer.js';
|
|
3
|
+
import { mapProductFiltersToSearchCriteria, mapProductVariantFiltersToSearchCriteria, } from '../mappers/filter.mappers.js';
|
|
4
|
+
import { getErrorMessage } from '../utils/type-guards.js';
|
|
5
|
+
export class ProductService extends BaseService {
|
|
6
|
+
transformer;
|
|
7
|
+
catalogId;
|
|
8
|
+
constructor(client, tenantId = 'default-workspace') {
|
|
9
|
+
super(client);
|
|
10
|
+
this.transformer = new ProductTransformer(tenantId);
|
|
11
|
+
}
|
|
12
|
+
setTenantId(tenantId) {
|
|
13
|
+
this.transformer.setTenantId(tenantId);
|
|
14
|
+
}
|
|
15
|
+
setCatalogId(catalogId) {
|
|
16
|
+
this.catalogId = catalogId;
|
|
17
|
+
}
|
|
18
|
+
async getProducts(input) {
|
|
19
|
+
try {
|
|
20
|
+
const searchCriteria = mapProductFiltersToSearchCriteria(input);
|
|
21
|
+
if (this.catalogId) {
|
|
22
|
+
searchCriteria.catalogIds = [this.catalogId];
|
|
23
|
+
}
|
|
24
|
+
const response = await this.client.post('/api/catalog/search/products', searchCriteria);
|
|
25
|
+
if (!response.success) {
|
|
26
|
+
return this.failure('Failed to fetch products', response.error ?? response);
|
|
27
|
+
}
|
|
28
|
+
const results = response.data?.items ?? [];
|
|
29
|
+
const products = this.transformer.fromCatalogProducts(results);
|
|
30
|
+
return this.success({ products });
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return this.failure(`Product lookup failed: ${getErrorMessage(error)}`, error);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async resolveSkuProductMap(skus) {
|
|
37
|
+
const map = new Map();
|
|
38
|
+
const response = await this.client.post('/api/catalog/search/products', {
|
|
39
|
+
searchPhrase: `code:${skus.join(',')}`,
|
|
40
|
+
responseGroup: 'None',
|
|
41
|
+
searchInVariations: true,
|
|
42
|
+
catalogIds: this.catalogId ? [this.catalogId] : undefined,
|
|
43
|
+
take: skus.length,
|
|
44
|
+
});
|
|
45
|
+
if (!response.success || !response.data) {
|
|
46
|
+
return map;
|
|
47
|
+
}
|
|
48
|
+
const items = response.data.items ?? [];
|
|
49
|
+
for (const item of items) {
|
|
50
|
+
if (item.id && item.code) {
|
|
51
|
+
map.set(item.code, { id: item.id, name: item.name ?? '' });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return map;
|
|
55
|
+
}
|
|
56
|
+
async resolveSkusToIds(skus) {
|
|
57
|
+
const map = await this.resolveSkuProductMap(skus);
|
|
58
|
+
return Array.from(map.values()).map((v) => v.id);
|
|
59
|
+
}
|
|
60
|
+
async getProductVariants(input) {
|
|
61
|
+
try {
|
|
62
|
+
const searchCriteria = mapProductVariantFiltersToSearchCriteria(input);
|
|
63
|
+
if (this.catalogId) {
|
|
64
|
+
searchCriteria.catalogIds = [this.catalogId];
|
|
65
|
+
}
|
|
66
|
+
const response = await this.client.post('/api/catalog/search/products', searchCriteria);
|
|
67
|
+
if (!response.success) {
|
|
68
|
+
return this.failure('Failed to fetch product variants', response.error ?? response);
|
|
69
|
+
}
|
|
70
|
+
const results = response.data?.items ?? [];
|
|
71
|
+
const productVariants = this.transformer.fromCatalogProductVariants(results);
|
|
72
|
+
return this.success({ productVariants });
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
return this.failure(`Product variant lookup failed: ${getErrorMessage(error)}`, error);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async getInventory(input) {
|
|
79
|
+
try {
|
|
80
|
+
const resolvedIds = await this.resolveSkusToIds(input.skus);
|
|
81
|
+
if (!resolvedIds.length) {
|
|
82
|
+
return this.success({ inventory: [] });
|
|
83
|
+
}
|
|
84
|
+
const catalogResponse = await this.client.post('/api/catalog/search/products', {
|
|
85
|
+
objectIds: resolvedIds,
|
|
86
|
+
responseGroup: 'ItemInfo',
|
|
87
|
+
take: resolvedIds.length,
|
|
88
|
+
});
|
|
89
|
+
const products = catalogResponse.success ? (catalogResponse.data?.items ?? []) : [];
|
|
90
|
+
const skuMap = new Map();
|
|
91
|
+
for (const product of products) {
|
|
92
|
+
if (product.id && product.code) {
|
|
93
|
+
skuMap.set(product.id, product.code);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const inventoryCriteria = {
|
|
97
|
+
productIds: resolvedIds,
|
|
98
|
+
take: resolvedIds.length * 10,
|
|
99
|
+
};
|
|
100
|
+
if (input.locationIds?.length) {
|
|
101
|
+
inventoryCriteria.fulfillmentCenterIds = input.locationIds;
|
|
102
|
+
}
|
|
103
|
+
const inventoryResponse = await this.client.post('/api/inventory/search', inventoryCriteria);
|
|
104
|
+
if (!inventoryResponse.success) {
|
|
105
|
+
return this.failure('Failed to fetch inventory', inventoryResponse.error ?? inventoryResponse);
|
|
106
|
+
}
|
|
107
|
+
const inventoryRecords = inventoryResponse.data?.results ?? [];
|
|
108
|
+
const inventory = this.transformer.fromInventoryInfos(inventoryRecords, skuMap);
|
|
109
|
+
return this.success({ inventory });
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
return this.failure(`Inventory lookup failed: ${getErrorMessage(error)}`, error);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=product.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product.service.js","sourceRoot":"","sources":["../../src/services/product.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Return, ReturnResult, FulfillmentToolResult, CreateReturnInput, GetReturnsInput } from '@virtocommerce/cof-mcp';
|
|
2
|
+
import { BaseService } from './base.service.js';
|
|
3
|
+
import { ApiClient } from '../utils/api-client.js';
|
|
4
|
+
export declare class ReturnService extends BaseService {
|
|
5
|
+
private transformer;
|
|
6
|
+
constructor(client: ApiClient, tenantId?: string);
|
|
7
|
+
setTenantId(tenantId: string): void;
|
|
8
|
+
createReturn(input: CreateReturnInput): Promise<ReturnResult>;
|
|
9
|
+
getReturns(input: GetReturnsInput): Promise<FulfillmentToolResult<{
|
|
10
|
+
returns: Return[];
|
|
11
|
+
}>>;
|
|
12
|
+
private transformAndReturn;
|
|
13
|
+
private applyPostFilters;
|
|
14
|
+
private fetchOrder;
|
|
15
|
+
private fetchReturnById;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=return.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"return.service.d.ts","sourceRoot":"","sources":["../../src/services/return.service.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EAChB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIhD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,qBAAa,aAAc,SAAQ,WAAW;IAC5C,OAAO,CAAC,WAAW,CAAoB;gBAE3B,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAE,MAA4B;IAKrE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI7B,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IAuD7D,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;YAmDjF,kBAAkB;IAoChC,OAAO,CAAC,gBAAgB;YAmDV,UAAU;YAcV,eAAe;CAQ9B"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { BaseService } from './base.service.js';
|
|
2
|
+
import { ReturnTransformer } from '../transformers/return.transformer.js';
|
|
3
|
+
import { mapReturnFiltersToSearchCriteria } from '../mappers/filter.mappers.js';
|
|
4
|
+
import { getErrorMessage } from '../utils/type-guards.js';
|
|
5
|
+
export class ReturnService extends BaseService {
|
|
6
|
+
transformer;
|
|
7
|
+
constructor(client, tenantId = 'default-workspace') {
|
|
8
|
+
super(client);
|
|
9
|
+
this.transformer = new ReturnTransformer(tenantId);
|
|
10
|
+
}
|
|
11
|
+
setTenantId(tenantId) {
|
|
12
|
+
this.transformer.setTenantId(tenantId);
|
|
13
|
+
}
|
|
14
|
+
async createReturn(input) {
|
|
15
|
+
try {
|
|
16
|
+
if (!input.return.orderId) {
|
|
17
|
+
return this.failure('orderId is required to create a return');
|
|
18
|
+
}
|
|
19
|
+
const order = await this.fetchOrder(input.return.orderId);
|
|
20
|
+
if (!order) {
|
|
21
|
+
return this.failure(`Order not found: ${input.return.orderId}`);
|
|
22
|
+
}
|
|
23
|
+
const vcReturn = this.transformer.fromCreateReturnInput(input, order);
|
|
24
|
+
const saveResponse = await this.client.put('/api/return/', vcReturn);
|
|
25
|
+
if (!saveResponse.success || !saveResponse.data) {
|
|
26
|
+
return this.failure('Failed to create return', saveResponse.error ?? saveResponse);
|
|
27
|
+
}
|
|
28
|
+
const savedId = saveResponse.data.id;
|
|
29
|
+
if (!savedId) {
|
|
30
|
+
return this.failure('Return was saved but no ID was returned');
|
|
31
|
+
}
|
|
32
|
+
const created = await this.fetchReturnById(savedId);
|
|
33
|
+
if (!created) {
|
|
34
|
+
const mcpReturn = this.transformer.toMcpReturn(saveResponse.data, order);
|
|
35
|
+
return this.success({ return: mcpReturn });
|
|
36
|
+
}
|
|
37
|
+
const mcpReturn = this.transformer.toMcpReturn(created, order);
|
|
38
|
+
return this.success({ return: mcpReturn });
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return this.failure(`Return creation failed: ${getErrorMessage(error)}`, error);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async getReturns(input) {
|
|
45
|
+
try {
|
|
46
|
+
if (input.orderIds && input.orderIds.length > 1) {
|
|
47
|
+
const allReturns = [];
|
|
48
|
+
for (const orderId of input.orderIds) {
|
|
49
|
+
const perOrderInput = { ...input, orderIds: [orderId] };
|
|
50
|
+
const searchCriteria = mapReturnFiltersToSearchCriteria(perOrderInput);
|
|
51
|
+
const response = await this.client.post('/api/return/search', searchCriteria);
|
|
52
|
+
if (response.success && response.data?.results) {
|
|
53
|
+
allReturns.push(...response.data.results);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return this.transformAndReturn(allReturns, input);
|
|
57
|
+
}
|
|
58
|
+
const searchCriteria = mapReturnFiltersToSearchCriteria(input);
|
|
59
|
+
const response = await this.client.post('/api/return/search', searchCriteria);
|
|
60
|
+
if (!response.success) {
|
|
61
|
+
return this.failure('Failed to fetch returns', response.error ?? response);
|
|
62
|
+
}
|
|
63
|
+
const vcReturns = response.data?.results ?? [];
|
|
64
|
+
return this.transformAndReturn(vcReturns, input);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return this.failure(`Return lookup failed: ${getErrorMessage(error)}`, error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async transformAndReturn(vcReturns, input) {
|
|
71
|
+
let filtered = this.applyPostFilters(vcReturns, input);
|
|
72
|
+
const pageSize = input.pageSize ?? 20;
|
|
73
|
+
const skip = input.skip ?? 0;
|
|
74
|
+
filtered = filtered.slice(skip, skip + pageSize);
|
|
75
|
+
const orderIds = new Set();
|
|
76
|
+
for (const vcReturn of filtered) {
|
|
77
|
+
if (vcReturn.orderId) {
|
|
78
|
+
orderIds.add(vcReturn.orderId);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const orderMap = new Map();
|
|
82
|
+
for (const orderId of orderIds) {
|
|
83
|
+
const order = await this.fetchOrder(orderId);
|
|
84
|
+
if (order) {
|
|
85
|
+
orderMap.set(orderId, order);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const returns = this.transformer.toMcpReturns(filtered, orderMap);
|
|
89
|
+
return this.success({ returns });
|
|
90
|
+
}
|
|
91
|
+
applyPostFilters(vcReturns, input) {
|
|
92
|
+
let results = vcReturns;
|
|
93
|
+
if (input.statuses?.length) {
|
|
94
|
+
const statusSet = new Set(input.statuses.map((s) => s.toLowerCase()));
|
|
95
|
+
results = results.filter((r) => {
|
|
96
|
+
const normalized = (r.status ?? '').toLowerCase();
|
|
97
|
+
return statusSet.has(normalized);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (input.outcomes?.length) {
|
|
101
|
+
const outcomeSet = new Set(input.outcomes.map((o) => o.toLowerCase()));
|
|
102
|
+
results = results.filter((r) => {
|
|
103
|
+
const normalized = (r.resolution ?? '').toLowerCase();
|
|
104
|
+
return outcomeSet.has(normalized);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
if (input.returnNumbers?.length) {
|
|
108
|
+
const numberSet = new Set(input.returnNumbers);
|
|
109
|
+
results = results.filter((r) => r.number && numberSet.has(r.number));
|
|
110
|
+
}
|
|
111
|
+
if (input.createdAtMin) {
|
|
112
|
+
const min = new Date(input.createdAtMin).getTime();
|
|
113
|
+
results = results.filter((r) => r.createdDate && new Date(r.createdDate).getTime() >= min);
|
|
114
|
+
}
|
|
115
|
+
if (input.createdAtMax) {
|
|
116
|
+
const max = new Date(input.createdAtMax).getTime();
|
|
117
|
+
results = results.filter((r) => r.createdDate && new Date(r.createdDate).getTime() <= max);
|
|
118
|
+
}
|
|
119
|
+
if (input.updatedAtMin) {
|
|
120
|
+
const min = new Date(input.updatedAtMin).getTime();
|
|
121
|
+
results = results.filter((r) => r.modifiedDate && new Date(r.modifiedDate).getTime() >= min);
|
|
122
|
+
}
|
|
123
|
+
if (input.updatedAtMax) {
|
|
124
|
+
const max = new Date(input.updatedAtMax).getTime();
|
|
125
|
+
results = results.filter((r) => r.modifiedDate && new Date(r.modifiedDate).getTime() <= max);
|
|
126
|
+
}
|
|
127
|
+
return results;
|
|
128
|
+
}
|
|
129
|
+
async fetchOrder(orderId) {
|
|
130
|
+
try {
|
|
131
|
+
const response = await this.client.get(`/api/order/customerOrders/${orderId}`);
|
|
132
|
+
return response.success && response.data ? response.data : null;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async fetchReturnById(returnId) {
|
|
139
|
+
try {
|
|
140
|
+
const response = await this.client.get(`/api/return/${returnId}`);
|
|
141
|
+
return response.success && response.data ? response.data : null;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=return.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"return.service.js","sourceRoot":"","sources":["../../src/services/return.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Address, CustomerAddress } from '@virtocommerce/cof-mcp';
|
|
2
|
+
import type { YourFulfillmentAddress } from '../types.js';
|
|
3
|
+
import type { Address as VirtoAddress } from '../models/index.js';
|
|
4
|
+
import { BaseTransformer } from './base.js';
|
|
5
|
+
export declare class AddressTransformer extends BaseTransformer {
|
|
6
|
+
toFulfillmentAddress(address?: Address): YourFulfillmentAddress | undefined;
|
|
7
|
+
toVirtoAddress(address: Address, addressType?: 'Billing' | 'Shipping'): VirtoAddress;
|
|
8
|
+
toMcpAddress(address?: VirtoAddress): Address | undefined;
|
|
9
|
+
toCustomerAddresses(addresses?: VirtoAddress[]): CustomerAddress[] | undefined;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=address.transformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.transformer.d.ts","sourceRoot":"","sources":["../../src/transformers/address.transformer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,qBAAa,kBAAmB,SAAQ,eAAe;IAIrD,oBAAoB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,sBAAsB,GAAG,SAAS;IAsB3E,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY;IAqBpF,YAAY,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,GAAG,SAAS;IAyBzD,mBAAmB,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,GAAG,eAAe,EAAE,GAAG,SAAS;CAoB/E"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { BaseTransformer } from './base.js';
|
|
2
|
+
export class AddressTransformer extends BaseTransformer {
|
|
3
|
+
toFulfillmentAddress(address) {
|
|
4
|
+
if (!address) {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
return {
|
|
8
|
+
street1: address.address1 ?? '',
|
|
9
|
+
street2: address.address2,
|
|
10
|
+
city: address.city ?? '',
|
|
11
|
+
state: address.stateOrProvince ?? '',
|
|
12
|
+
postal_code: address.zipCodeOrPostalCode ?? '',
|
|
13
|
+
country: address.country ?? '',
|
|
14
|
+
phone: address.phone,
|
|
15
|
+
email: address.email,
|
|
16
|
+
name: this.composeName(address.firstName, address.lastName),
|
|
17
|
+
company: address.company,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
toVirtoAddress(address, addressType) {
|
|
21
|
+
return {
|
|
22
|
+
addressType: addressType,
|
|
23
|
+
firstName: address.firstName,
|
|
24
|
+
lastName: address.lastName,
|
|
25
|
+
name: this.composeName(address.firstName, address.lastName),
|
|
26
|
+
organization: address.company,
|
|
27
|
+
line1: address.address1,
|
|
28
|
+
line2: address.address2,
|
|
29
|
+
city: address.city,
|
|
30
|
+
regionName: address.stateOrProvince,
|
|
31
|
+
postalCode: address.zipCodeOrPostalCode,
|
|
32
|
+
countryName: address.country,
|
|
33
|
+
phone: address.phone,
|
|
34
|
+
email: address.email,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
toMcpAddress(address) {
|
|
38
|
+
if (!address) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
const { firstName, lastName } = this.splitName(address.name);
|
|
42
|
+
return {
|
|
43
|
+
address1: address.line1 ?? '',
|
|
44
|
+
address2: address.line2 ?? '',
|
|
45
|
+
city: address.city ?? '',
|
|
46
|
+
country: address.countryName ?? '',
|
|
47
|
+
email: address.email,
|
|
48
|
+
firstName,
|
|
49
|
+
lastName,
|
|
50
|
+
phone: address.phone,
|
|
51
|
+
stateOrProvince: address.regionName ?? '',
|
|
52
|
+
zipCodeOrPostalCode: address.postalCode ?? address.zip ?? '',
|
|
53
|
+
company: address.organization,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
toCustomerAddresses(addresses) {
|
|
57
|
+
if (!addresses?.length) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const mapped = addresses
|
|
61
|
+
.map((addr) => {
|
|
62
|
+
const address = this.toMcpAddress(addr);
|
|
63
|
+
if (!address) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
name: addr.name ?? this.composeName(address.firstName, address.lastName),
|
|
68
|
+
address,
|
|
69
|
+
};
|
|
70
|
+
})
|
|
71
|
+
.filter(Boolean);
|
|
72
|
+
return mapped.length ? mapped : undefined;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=address.transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.transformer.js","sourceRoot":"","sources":["../../src/transformers/address.transformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare abstract class BaseTransformer {
|
|
2
|
+
protected tenantId: string;
|
|
3
|
+
constructor(tenantId?: string);
|
|
4
|
+
setTenantId(tenantId: string): void;
|
|
5
|
+
protected now(): string;
|
|
6
|
+
protected ensureArray<T>(data: T | T[] | undefined | null): T[];
|
|
7
|
+
protected valueOrUndefined<T>(value: T | null | undefined): T | undefined;
|
|
8
|
+
protected composeName(firstName?: string | null, lastName?: string | null): string | undefined;
|
|
9
|
+
protected splitName(name?: string | null): {
|
|
10
|
+
firstName?: string;
|
|
11
|
+
lastName?: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/transformers/base.ts"],"names":[],"mappings":"AAIA,8BAAsB,eAAe;IACnC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEf,QAAQ,GAAE,MAA4B;IAIlD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAInC,SAAS,CAAC,GAAG,IAAI,MAAM;IAIvB,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,CAAC,EAAE;IAO/D,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS;IAIzE,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS;IAQ9F,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;CAmBrF"}
|