medusa-plugin-veeqo 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/.medusa/server/medusa-config.js +29 -0
  2. package/.medusa/server/src/admin/index.js +686 -0
  3. package/.medusa/server/src/admin/index.mjs +685 -0
  4. package/.medusa/server/src/api/admin/veeqo/customers/[customerId]/sync/route.js +19 -0
  5. package/.medusa/server/src/api/admin/veeqo/customers/sync/route.js +16 -0
  6. package/.medusa/server/src/api/admin/veeqo/orders/[orderId]/sync/route.js +19 -0
  7. package/.medusa/server/src/api/admin/veeqo/orders/shipment-sync/route.js +30 -0
  8. package/.medusa/server/src/api/admin/veeqo/orders/sync/route.js +16 -0
  9. package/.medusa/server/src/api/admin/veeqo/products/[productId]/sync/route.js +19 -0
  10. package/.medusa/server/src/api/admin/veeqo/products/sync/route.js +14 -0
  11. package/.medusa/server/src/api/admin/veeqo/sales-channels/[salesChannelId]/sync/route.js +19 -0
  12. package/.medusa/server/src/api/admin/veeqo/sales-channels/sync/route.js +14 -0
  13. package/.medusa/server/src/api/admin/veeqo/shipments/[id]/tracking-events/route.js +20 -0
  14. package/.medusa/server/src/api/admin/veeqo/shipping-options/[shippingOptionId]/sync/route.js +19 -0
  15. package/.medusa/server/src/api/admin/veeqo/shipping-options/sync/route.js +14 -0
  16. package/.medusa/server/src/api/admin/veeqo/stock-locations/[stockLocationId]/sync/route.js +19 -0
  17. package/.medusa/server/src/api/admin/veeqo/stock-locations/sync/route.js +14 -0
  18. package/.medusa/server/src/api/middlewares.js +39 -0
  19. package/.medusa/server/src/api/validators.js +23 -0
  20. package/.medusa/server/src/jobs/veeqo-order-sync.js +34 -0
  21. package/.medusa/server/src/links/customer-veeqo-customer.js +18 -0
  22. package/.medusa/server/src/links/fulfillment-veeqo-shipment.js +18 -0
  23. package/.medusa/server/src/links/order-veeqo-order.js +18 -0
  24. package/.medusa/server/src/links/product-variant-veeqo-sellable.js +18 -0
  25. package/.medusa/server/src/links/product-veeqo-product.js +18 -0
  26. package/.medusa/server/src/links/sales-channel-veeqo-channel.js +18 -0
  27. package/.medusa/server/src/links/shipping-option-veeqo-delivery-method.js +18 -0
  28. package/.medusa/server/src/links/stock-location-veeqo-warehouse.js +18 -0
  29. package/.medusa/server/src/links/veeqo-channel-sales-channel.js +15 -0
  30. package/.medusa/server/src/links/veeqo-customer-customer.js +15 -0
  31. package/.medusa/server/src/links/veeqo-delivery-method.js +15 -0
  32. package/.medusa/server/src/links/veeqo-order-order.js +15 -0
  33. package/.medusa/server/src/links/veeqo-product-product.js +15 -0
  34. package/.medusa/server/src/links/veeqo-sellable-product-variant.js +15 -0
  35. package/.medusa/server/src/links/veeqo-shipment-fulfillment.js +15 -0
  36. package/.medusa/server/src/links/veeqo-warehouse-stock-location.js +15 -0
  37. package/.medusa/server/src/modules/veeqo/index.js +10 -0
  38. package/.medusa/server/src/modules/veeqo/migrations/Migration20260411222036.js +76 -0
  39. package/.medusa/server/src/modules/veeqo/models/veeqo-channel.js +10 -0
  40. package/.medusa/server/src/modules/veeqo/models/veeqo-customer.js +14 -0
  41. package/.medusa/server/src/modules/veeqo/models/veeqo-delivery-method.js +10 -0
  42. package/.medusa/server/src/modules/veeqo/models/veeqo-order.js +26 -0
  43. package/.medusa/server/src/modules/veeqo/models/veeqo-product.js +10 -0
  44. package/.medusa/server/src/modules/veeqo/models/veeqo-sellable.js +10 -0
  45. package/.medusa/server/src/modules/veeqo/models/veeqo-shipment.js +20 -0
  46. package/.medusa/server/src/modules/veeqo/models/veeqo-warehouse.js +10 -0
  47. package/.medusa/server/src/modules/veeqo/service.js +566 -0
  48. package/.medusa/server/src/modules/veeqo/types.js +3 -0
  49. package/.medusa/server/src/subscribers/veeqo-dispatcher.js +12 -0
  50. package/.medusa/server/src/workflows/channel.js +137 -0
  51. package/.medusa/server/src/workflows/customer.js +112 -0
  52. package/.medusa/server/src/workflows/delivery-method.js +116 -0
  53. package/.medusa/server/src/workflows/order.js +327 -0
  54. package/.medusa/server/src/workflows/product.js +163 -0
  55. package/.medusa/server/src/workflows/shipments.js +155 -0
  56. package/.medusa/server/src/workflows/warehouse.js +133 -0
  57. package/README.md +70 -0
  58. package/package.json +83 -0
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncVeeqoOrderShipmentsWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
7
+ const veeqo_order_1 = require("../modules/veeqo/models/veeqo-order");
8
+ // ─── Step 1: Fetch data ────────────────────────────────────────────────────────
9
+ const fetchVeeqoOrderDataStep = (0, workflows_sdk_1.createStep)('fetch-veeqo-order-data-step', async (input, { container }) => {
10
+ const veeqoService = container.resolve('veeqo');
11
+ const [dbOrder] = await veeqoService.listVeeqoOrders({ id: input.veeqoOrderDbId }, { relations: ['veeqo_shipments'] });
12
+ if (!dbOrder) {
13
+ throw new Error(`VeeqoOrder with id ${input.veeqoOrderDbId} not found`);
14
+ }
15
+ const liveOrder = await veeqoService.fetchOrder(dbOrder.veeqo_order_id);
16
+ return new workflows_sdk_1.StepResponse({ dbOrder, liveOrder });
17
+ });
18
+ // ─── Step 2: Process new shipments ────────────────────────────────────────────
19
+ const processNewShipmentsStep = (0, workflows_sdk_1.createStep)('process-new-veeqo-shipments-step', async (data, { container }) => {
20
+ const { dbOrder, liveOrder } = data;
21
+ const veeqoService = container.resolve('veeqo');
22
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
23
+ const existingAllocationIds = new Set((dbOrder.veeqo_shipments ?? []).map((s) => s.veeqo_allocation_id));
24
+ const newAllocations = (liveOrder.allocations ?? []).filter((alloc) => alloc.shipment != null && !existingAllocationIds.has(alloc.id));
25
+ if (!newAllocations.length) {
26
+ return new workflows_sdk_1.StepResponse(void 0);
27
+ }
28
+ // Fetch order items once for all new shipments
29
+ const { data: orders } = await query.graph({
30
+ entity: 'order',
31
+ fields: ['id', 'items.id', 'items.detail.quantity'],
32
+ filters: { id: dbOrder.order_id }
33
+ });
34
+ const order = orders[0] ?? {};
35
+ const items = (order.items ?? []).map((item) => ({
36
+ id: item.id,
37
+ quantity: item.detail?.quantity ?? item.quantity ?? 1
38
+ }));
39
+ for (const alloc of newAllocations) {
40
+ const shipment = alloc.shipment;
41
+ // Create fulfillment linked to the order
42
+ const { result: fulfillment } = await (0, core_flows_1.createOrderFulfillmentWorkflow)(container).run({
43
+ input: { order_id: dbOrder.order_id, items }
44
+ });
45
+ // Build labels from Veeqo tracking data when available
46
+ const trackingNumber = shipment.tracking_number;
47
+ const labels = trackingNumber?.tracking_number
48
+ ? [
49
+ {
50
+ tracking_number: trackingNumber.tracking_number,
51
+ tracking_url: trackingNumber.tracking_url ?? '',
52
+ label_url: ''
53
+ }
54
+ ]
55
+ : [];
56
+ // Mark as shipped — emits shipment.created
57
+ await (0, core_flows_1.createOrderShipmentWorkflow)(container).run({
58
+ input: {
59
+ order_id: dbOrder.order_id,
60
+ fulfillment_id: fulfillment.id,
61
+ items,
62
+ ...(labels.length ? { labels } : {})
63
+ }
64
+ });
65
+ // Persist VeeqoShipment record
66
+ await veeqoService.createVeeqoShipments({
67
+ veeqo_order_id: dbOrder.id,
68
+ fulfillment_id: fulfillment.id,
69
+ veeqo_allocation_id: alloc.id,
70
+ veeqo_shipment_id: shipment.id,
71
+ carrier: shipment.carrier ?? null,
72
+ tracking_number: shipment.tracking_number ?? null,
73
+ shipped_by: shipment.shipped_by ?? null,
74
+ shipped_at: shipment.created_at ? new Date(shipment.created_at) : null
75
+ });
76
+ }
77
+ return new workflows_sdk_1.StepResponse(void 0);
78
+ });
79
+ // ─── Step 2b: Complete order if shipped ──────────────────────────────────────
80
+ const completeOrderIfShippedStep = (0, workflows_sdk_1.createStep)('complete-order-if-shipped-step', async (data, { container }) => {
81
+ const { dbOrder } = data;
82
+ const veeqoService = container.resolve('veeqo');
83
+ const shipments = await veeqoService.listVeeqoShipments({
84
+ veeqo_order_id: dbOrder.id
85
+ });
86
+ if (shipments.length === 0) {
87
+ return new workflows_sdk_1.StepResponse(void 0);
88
+ }
89
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
90
+ const { data: [order] } = await query.graph({
91
+ entity: 'order',
92
+ fields: ['id', 'status'],
93
+ filters: { id: dbOrder.order_id }
94
+ });
95
+ if (order?.status === 'pending') {
96
+ await (0, core_flows_1.completeOrderWorkflow)(container).run({
97
+ input: { orderIds: [dbOrder.order_id] }
98
+ });
99
+ }
100
+ return new workflows_sdk_1.StepResponse(void 0);
101
+ });
102
+ // ─── Step 3: Process delivered shipments ──────────────────────────────────────
103
+ const processDeliveredShipmentsStep = (0, workflows_sdk_1.createStep)('process-delivered-veeqo-shipments-step', async (data, { container }) => {
104
+ const { dbOrder } = data;
105
+ const veeqoService = container.resolve('veeqo');
106
+ // Re-query to include any shipments added in the previous step
107
+ const currentShipments = (await veeqoService.listVeeqoShipments({
108
+ veeqo_order_id: dbOrder.id
109
+ }));
110
+ const undelivered = currentShipments.filter((s) => s.veeqo_tracking_events == null);
111
+ for (const dbShipment of undelivered) {
112
+ const liveShipment = await veeqoService.fetchShipment(dbShipment.veeqo_shipment_id);
113
+ if (!liveShipment.tracking_number?.delivered_at)
114
+ continue;
115
+ const events = await veeqoService.fetchTrackingEvents(dbShipment.veeqo_shipment_id);
116
+ await (0, core_flows_1.markFulfillmentAsDeliveredWorkflow)(container).run({
117
+ input: { id: dbShipment.fulfillment_id }
118
+ });
119
+ await veeqoService.updateVeeqoShipments({
120
+ id: dbShipment.id,
121
+ veeqo_tracking_events: events
122
+ });
123
+ }
124
+ return new workflows_sdk_1.StepResponse(void 0);
125
+ });
126
+ // ─── Step 4: Finalize ─────────────────────────────────────────────────────────
127
+ const finalizeVeeqoOrderSyncStep = (0, workflows_sdk_1.createStep)('finalize-veeqo-order-sync-step', async (data, { container }) => {
128
+ const { dbOrder } = data;
129
+ const veeqoService = container.resolve('veeqo');
130
+ const currentShipments = (await veeqoService.listVeeqoShipments({
131
+ veeqo_order_id: dbOrder.id
132
+ }));
133
+ const allDelivered = currentShipments.length > 0 &&
134
+ currentShipments.every((s) => s.veeqo_tracking_events != null);
135
+ await veeqoService.updateVeeqoOrders({
136
+ id: dbOrder.id,
137
+ last_synced_at: new Date(),
138
+ ...(allDelivered ? { status: veeqo_order_1.Status.CLOSED } : {})
139
+ });
140
+ return new workflows_sdk_1.StepResponse(void 0);
141
+ });
142
+ // ─── Workflow ─────────────────────────────────────────────────────────────────
143
+ exports.syncVeeqoOrderShipmentsWorkflow = (0, workflows_sdk_1.createWorkflow)('sync-veeqo-order-shipments-workflow', function (input) {
144
+ const data = fetchVeeqoOrderDataStep(input);
145
+ // Steps must run sequentially: chain via transform to enforce ordering.
146
+ const _step2 = processNewShipmentsStep(data);
147
+ const step2bInput = (0, workflows_sdk_1.transform)({ data, _step2 }, ({ data }) => data);
148
+ const _step2b = completeOrderIfShippedStep(step2bInput);
149
+ const step3Input = (0, workflows_sdk_1.transform)({ data, _step2b }, ({ data }) => data);
150
+ const _step3 = processDeliveredShipmentsStep(step3Input);
151
+ const step4Input = (0, workflows_sdk_1.transform)({ data, _step3 }, ({ data }) => data);
152
+ finalizeVeeqoOrderSyncStep(step4Input);
153
+ return new workflows_sdk_1.WorkflowResponse(void 0);
154
+ });
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpcG1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zaGlwbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBTTBDO0FBQzFDLHFEQUFxRTtBQUNyRSw0REFLb0M7QUFHcEMscUVBQTREO0FBVzVELGtGQUFrRjtBQUVsRixNQUFNLHVCQUF1QixHQUFHLElBQUEsMEJBQVUsRUFDekMsNkJBQTZCLEVBQzdCLEtBQUssRUFBRSxLQUFnQixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUN6QyxNQUFNLFlBQVksR0FBaUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM3RCxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxZQUFZLENBQUMsZUFBZSxDQUNuRCxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQzVCLEVBQUUsU0FBUyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUNsQyxDQUFBO0lBRUQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsS0FBSyxDQUFDLGNBQWMsWUFBWSxDQUFDLENBQUE7SUFDeEUsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLE1BQU0sWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUE7SUFDdkUsT0FBTyxJQUFJLDRCQUFZLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFjLENBQUMsQ0FBQTtBQUM1RCxDQUFDLENBQ0QsQ0FBQTtBQUVELGlGQUFpRjtBQUVqRixNQUFNLHVCQUF1QixHQUFHLElBQUEsMEJBQVUsRUFDekMsa0NBQWtDLEVBQ2xDLEtBQUssRUFBRSxJQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3ZDLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdB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
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteWarehouseFromVeeqoWorkflow = exports.findAndDeleteWarehouseFromVeeqoStep = exports.syncWarehouseToVeeqoWorkflow = exports.addOrUpdateWarehouseInVeeqoStep = exports.updateWarehouseInVeeqoWorkflow = exports.updateWarehouseInVeeqoStep = exports.addWarehouseToVeeqoWorkflow = exports.addWarehouseToVeeqoStep = exports.getVeeqoWarehouseWorkflow = exports.fetchWarehouseFromVeeqoStep = exports.getStockLocationDetailsStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const mapStockLocationToVeeqoWarehouseInput = (stock_location) => {
7
+ const requiredFields = {
8
+ name: stock_location.name,
9
+ address_line_1: stock_location.address?.address_1,
10
+ city: stock_location.address?.city,
11
+ state: stock_location.address?.province?.toUpperCase(),
12
+ country: stock_location.address?.country_code?.toUpperCase(),
13
+ post_code: stock_location.address?.postal_code?.toUpperCase()
14
+ };
15
+ const missingFields = Object.entries(requiredFields)
16
+ .filter(([, value]) => value === undefined || value === null)
17
+ .map(([field]) => field);
18
+ if (missingFields.length) {
19
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Stock location ${stock_location.id} is missing required fields for Veeqo warehouse input: ${missingFields.join(', ')}`);
20
+ }
21
+ return {
22
+ name: requiredFields.name,
23
+ address_line_1: requiredFields.address_line_1,
24
+ city: requiredFields.city,
25
+ region: requiredFields.state,
26
+ country: requiredFields.country,
27
+ post_code: requiredFields.post_code
28
+ };
29
+ };
30
+ exports.getStockLocationDetailsStep = (0, workflows_sdk_1.createStep)('get-stock-location-details-step', async (stock_location_id, { container }) => {
31
+ const query = container.resolve('query');
32
+ const { data: stock_locations } = await query.graph({
33
+ entity: 'stock_location',
34
+ fields: [
35
+ 'id',
36
+ 'name',
37
+ 'address.address_1',
38
+ 'address.city',
39
+ 'address.province',
40
+ 'address.country_code',
41
+ 'address.postal_code',
42
+ 'veeqo_warehouse.veeqo_warehouse_id'
43
+ ],
44
+ filters: { id: stock_location_id }
45
+ });
46
+ const stockLocation = stock_locations[0];
47
+ if (!stockLocation) {
48
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Stock location with id ${stock_location_id} not found`);
49
+ }
50
+ return new workflows_sdk_1.StepResponse(stockLocation);
51
+ });
52
+ // GET --------------------------------------------------------------
53
+ exports.fetchWarehouseFromVeeqoStep = (0, workflows_sdk_1.createStep)('fetch-warehouse-from-veeqo-step', async (stock_location_id, { container }) => {
54
+ const query = container.resolve('query');
55
+ const { data: [veeqo_warehouse] } = await query.graph({
56
+ entity: 'veeqo_warehouse',
57
+ fields: ['veeqo_warehouse_id'],
58
+ filters: { stock_location_id }
59
+ });
60
+ const veeqoWarehouseId = veeqo_warehouse?.veeqo_warehouse_id;
61
+ if (!veeqoWarehouseId) {
62
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `No linked Veeqo warehouse found for stock location ${stock_location_id}`);
63
+ }
64
+ const veeqoService = container.resolve('veeqo');
65
+ const veeqo = (await veeqoService.fetchWarehouse(veeqoWarehouseId));
66
+ return new workflows_sdk_1.StepResponse({ veeqo_warehouse: veeqo });
67
+ });
68
+ exports.getVeeqoWarehouseWorkflow = (0, workflows_sdk_1.createWorkflow)('get-veeqo-warehouse-workflow', (stock_location_id) => {
69
+ const result = (0, exports.fetchWarehouseFromVeeqoStep)(stock_location_id);
70
+ return new workflows_sdk_1.WorkflowResponse(result);
71
+ });
72
+ // ADD --------------------------------------------------------------
73
+ exports.addWarehouseToVeeqoStep = (0, workflows_sdk_1.createStep)('add-warehouse-to-veeqo-step', async (stock_location, { container }) => {
74
+ if (stock_location.veeqo_warehouse?.veeqo_warehouse_id) {
75
+ return new workflows_sdk_1.StepResponse(void 0);
76
+ }
77
+ const veeqoWarehouseInput = mapStockLocationToVeeqoWarehouseInput(stock_location);
78
+ const veeqoService = container.resolve('veeqo');
79
+ const veeqoWarehouse = await veeqoService.addWarehouse(stock_location.id, veeqoWarehouseInput);
80
+ return new workflows_sdk_1.StepResponse(veeqoWarehouse);
81
+ });
82
+ exports.addWarehouseToVeeqoWorkflow = (0, workflows_sdk_1.createWorkflow)('add-warehouse-to-veeqo-workflow', (stock_location_id) => {
83
+ const stockLocation = (0, exports.getStockLocationDetailsStep)(stock_location_id);
84
+ const veeqoWarehouse = (0, exports.addWarehouseToVeeqoStep)(stockLocation);
85
+ return new workflows_sdk_1.WorkflowResponse(veeqoWarehouse);
86
+ });
87
+ // UPDATE --------------------------------------------------------------
88
+ exports.updateWarehouseInVeeqoStep = (0, workflows_sdk_1.createStep)('update-warehouse-in-veeqo-step', async (stock_location, { container }) => {
89
+ const veeqoWarehouseId = stock_location.veeqo_warehouse?.veeqo_warehouse_id;
90
+ if (!veeqoWarehouseId) {
91
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `No linked Veeqo warehouse found for stock location ${stock_location.id}`);
92
+ }
93
+ const veeqoWarehouseInput = mapStockLocationToVeeqoWarehouseInput(stock_location);
94
+ const veeqoService = container.resolve('veeqo');
95
+ const veeqoWarehouse = await veeqoService.updateWarehouse(veeqoWarehouseId, veeqoWarehouseInput);
96
+ return new workflows_sdk_1.StepResponse(veeqoWarehouse);
97
+ });
98
+ exports.updateWarehouseInVeeqoWorkflow = (0, workflows_sdk_1.createWorkflow)('update-warehouse-in-veeqo-workflow', (stock_location_id) => {
99
+ const stockLocation = (0, exports.getStockLocationDetailsStep)(stock_location_id);
100
+ const veeqoWarehouse = (0, exports.updateWarehouseInVeeqoStep)(stockLocation);
101
+ return new workflows_sdk_1.WorkflowResponse(veeqoWarehouse);
102
+ });
103
+ // SYNC --------------------------------------------------------------
104
+ exports.addOrUpdateWarehouseInVeeqoStep = (0, workflows_sdk_1.createStep)('add-or-update-warehouse-in-veeqo-step', async (stock_location, { container }) => {
105
+ const veeqoService = container.resolve('veeqo');
106
+ const veeqoWarehouseId = stock_location.veeqo_warehouse?.veeqo_warehouse_id;
107
+ if (!veeqoWarehouseId) {
108
+ const veeqoWarehouseInput = mapStockLocationToVeeqoWarehouseInput(stock_location);
109
+ const veeqoWarehouse = await veeqoService.addWarehouse(stock_location.id, veeqoWarehouseInput);
110
+ return new workflows_sdk_1.StepResponse(veeqoWarehouse);
111
+ }
112
+ else {
113
+ const veeqoWarehouseInput = mapStockLocationToVeeqoWarehouseInput(stock_location);
114
+ const veeqoWarehouse = await veeqoService.updateWarehouse(veeqoWarehouseId, veeqoWarehouseInput);
115
+ return new workflows_sdk_1.StepResponse(veeqoWarehouse);
116
+ }
117
+ });
118
+ exports.syncWarehouseToVeeqoWorkflow = (0, workflows_sdk_1.createWorkflow)('sync-warehouse-to-veeqo-workflow', (stock_location_id) => {
119
+ const stockLocation = (0, exports.getStockLocationDetailsStep)(stock_location_id);
120
+ const veeqoWarehouse = (0, exports.addOrUpdateWarehouseInVeeqoStep)(stockLocation);
121
+ return new workflows_sdk_1.WorkflowResponse(veeqoWarehouse);
122
+ });
123
+ // DELETE --------------------------------------------------------------
124
+ exports.findAndDeleteWarehouseFromVeeqoStep = (0, workflows_sdk_1.createStep)('find-and-delete-warehouse-from-veeqo-step', async (stock_location_id, { container }) => {
125
+ const veeqoService = container.resolve('veeqo');
126
+ await veeqoService.deleteWarehouse(stock_location_id);
127
+ return new workflows_sdk_1.StepResponse(void 0);
128
+ });
129
+ exports.deleteWarehouseFromVeeqoWorkflow = (0, workflows_sdk_1.createWorkflow)('delete-warehouse-from-veeqo-workflow', (stock_location_id) => {
130
+ const result = (0, exports.findAndDeleteWarehouseFromVeeqoStep)(stock_location_id);
131
+ return new workflows_sdk_1.WorkflowResponse(result);
132
+ });
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FyZWhvdXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy93YXJlaG91c2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBSzBDO0FBQzFDLHFEQUF1RDtBQVF2RCxNQUFNLHFDQUFxQyxHQUFHLENBQzdDLGNBQW1ELEVBQzdCLEVBQUU7SUFDeEIsTUFBTSxjQUFjLEdBQUc7UUFDdEIsSUFBSSxFQUFFLGNBQWMsQ0FBQyxJQUFJO1FBQ3pCLGNBQWMsRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLFNBQVM7UUFDakQsSUFBSSxFQUFFLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSTtRQUNsQyxLQUFLLEVBQUUsY0FBYyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFO1FBQ3RELE9BQU8sRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUU7UUFDNUQsU0FBUyxFQUFFLGNBQWMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRTtLQUM3RCxDQUFBO0lBQ0QsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7U0FDbEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUM7U0FDNUQsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDekIsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLG1CQUFXLENBQ3BCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsa0JBQWtCLGNBQWMsQ0FBQyxFQUFFLDBEQUEwRCxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ3ZILENBQUE7SUFD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
package/README.md ADDED
@@ -0,0 +1,70 @@
1
+ # medusa-plugin-veeqo
2
+
3
+ Veeqo integration plugin for Medusa v2. Automatically send placed orders to Veeqo for shipping, ping Veeqo for updates on orders, and create Medusa fulfillments when items are shipped.
4
+
5
+ [Documentation](https://pevey.com/medusa-plugin-veeqo)
6
+
7
+ If you are not familiar with Medusa, you can learn more on [the project web site](https://www.medusajs.com/).
8
+
9
+ If you are not familiar with Veeqo, you can learn more on their [web site](https://www.veeqo.com/).
10
+
11
+ ## Features
12
+
13
+ - Syncs from Medusa to Veeqo all required entities to send orders to Veeqo via their API (sales channels, stock locations, shipping options, products, product variants, and customers)
14
+ - Automatically sends orders to Veeqo for fulfillment
15
+ - Pings Veeqo every 4 hours for updates via a scheduled Job
16
+ - Automatically creates a Medusa fulfillment when a Veeqo shipment is detected. Stores tracking and delivery information in Medusa.
17
+ - Triggers the 'shipment.created' and 'delivery.created' events for easy integration with your notifications flow.
18
+
19
+ ## Installation
20
+
21
+ Inside your medusa backend root folder:
22
+
23
+ ```bash
24
+ yarn add medusa-plugin-veeqo
25
+ ```
26
+
27
+ Replace "yarn add" with the correct command for your package manager if you are using (for example) npm, pnpm, or bun.
28
+
29
+ ## Configuration
30
+
31
+ Enable in your medusa-config.ts file. Example:
32
+
33
+ ```ts
34
+ module.exports = defineConfig({
35
+ //... other config
36
+ plugins: [
37
+ {
38
+ resolve: 'medusa-plugin-veeqo',
39
+ options: {
40
+ apiKey: process.env.VEEQO_API_KEY,
41
+ timeout: 5000,
42
+ retry: 3
43
+ }
44
+ }
45
+ // ... other plugins
46
+ ]
47
+ })
48
+ ```
49
+
50
+ ### Options
51
+
52
+ | Option | Type | Required | Default | Description |
53
+ | ---------- | -------- | -------- | ----------------------- | -------------------------------------------- |
54
+ | `apiKey` | `string` | Yes | | Your Veeqo API key |
55
+ | `timeout` | `number` | No | `5000` | Request timeout in milliseconds |
56
+ | `retry` | `number` | No | `3` | Number of retry attempts for failed requests |
57
+ | `veeqoUrl` | `string` | No | `https://api.veeqo.com` | Override Veeqo API URL if desired |
58
+
59
+ ## Admin UI
60
+
61
+ The plugin adds widgets to the following admin pages:
62
+
63
+ - **Products** - View and sync Veeqo product/sellable mappings
64
+ - **Orders** - View Veeqo order and shipment status
65
+ - **Customers** - View Veeqo customer mapping
66
+ - **Sales Channels** - View Veeqo channel mapping
67
+ - **Stock Locations** - View Veeqo warehouse mapping
68
+ - **Shipping Options** - View Veeqo delivery method mapping
69
+
70
+ A settings page at **Settings > Veeqo** provides a guided setup wizard for initial sync of all entity types. Revisit this wizard any time to check for items that may have been added since setup that need to be synced.
package/package.json ADDED
@@ -0,0 +1,83 @@
1
+ {
2
+ "name": "medusa-plugin-veeqo",
3
+ "version": "0.1.3",
4
+ "description": "Veeqo integration plugin for Medusa v2",
5
+ "author": "Lacey Pevey",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/pevey/medusa-plugins"
10
+ },
11
+ "homepage": "https://pevey.com/medusa-plugin-veeqo",
12
+ "files": [
13
+ ".medusa/server"
14
+ ],
15
+ "exports": {
16
+ "./package.json": "./package.json",
17
+ "./admin": {
18
+ "import": "./.medusa/server/src/admin/index.mjs",
19
+ "require": "./.medusa/server/src/admin/index.js",
20
+ "default": "./.medusa/server/src/admin/index.js"
21
+ },
22
+ "./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js",
23
+ "./modules/*": "./.medusa/server/src/modules/*/index.js",
24
+ "./providers/*": "./.medusa/server/src/providers/*/index.js",
25
+ "./*": "./.medusa/server/src/*.js",
26
+ ".": "./.medusa/server/src/modules/veeqo/index.js"
27
+ },
28
+ "keywords": [
29
+ "medusa-plugin-integration",
30
+ "medusa-v2",
31
+ "medusa",
32
+ "veeqo",
33
+ "fulfillment",
34
+ "inventory",
35
+ "order sync"
36
+ ],
37
+ "scripts": {
38
+ "build": "medusa plugin:build",
39
+ "dev": "medusa plugin:develop",
40
+ "prepublishOnly": "medusa plugin:build",
41
+ "test:unit": "TEST_TYPE=unit NODE_OPTIONS=--experimental-vm-modules jest --silent --runInBand --detectOpenHandles --forceExit --passWithNoTests",
42
+ "test:integration:http": "TEST_TYPE=integration:http NODE_OPTIONS=--experimental-vm-modules jest --silent=false --runInBand --detectOpenHandles --forceExit"
43
+ },
44
+ "dependencies": {
45
+ "async-sema": "^3.1.1"
46
+ },
47
+ "devDependencies": {
48
+ "@medusajs/admin-sdk": "2.13.6",
49
+ "@medusajs/cli": "2.13.6",
50
+ "@medusajs/framework": "2.13.6",
51
+ "@medusajs/icons": "2.13.6",
52
+ "@medusajs/js-sdk": "2.13.6",
53
+ "@medusajs/medusa": "2.13.6",
54
+ "@medusajs/test-utils": "2.13.6",
55
+ "@medusajs/ui": "4.0.25",
56
+ "@swc/core": "^1.7.28",
57
+ "@swc/jest": "^0.2.39",
58
+ "@types/jest": "^30.0.0",
59
+ "@types/node": "^20.0.0",
60
+ "@types/react": "^18.3.2",
61
+ "@types/react-dom": "^18.2.25",
62
+ "jest": "^29.7.0",
63
+ "prop-types": "^15.8.1",
64
+ "react": "^18.2.0",
65
+ "react-dom": "^18.2.0",
66
+ "ts-node": "^10.9.2",
67
+ "typescript": "^5.6.2",
68
+ "vite": "^5.2.11",
69
+ "yalc": "^1.0.0-pre.53"
70
+ },
71
+ "peerDependencies": {
72
+ "@medusajs/admin-sdk": "2.13.6",
73
+ "@medusajs/cli": "2.13.6",
74
+ "@medusajs/framework": "2.13.6",
75
+ "@medusajs/icons": "2.13.6",
76
+ "@medusajs/medusa": "2.13.6",
77
+ "@medusajs/test-utils": "2.13.6",
78
+ "@medusajs/ui": "4.0.25"
79
+ },
80
+ "engines": {
81
+ "node": ">=20"
82
+ }
83
+ }