// @ts-check
/**
* Inventory-level operation handlers for Inflow Inventory MCP Server
* Handles stock adjustments and inventory management
*/
/** @typedef {import('../inflow-client').InflowClient} InflowClient */
export const inventoryHandlers = {
/**
* List stock adjustments
* @param {InflowClient} client
* @param {Object} args
* @param {string} [args.adjustmentNumber] - Filter by adjustment number
* @param {string} [args.include] - Related entities to include
* @param {number} [args.limit] - Max results (default: 50)
* @returns {Promise<Object>}
*/
async listStockAdjustments(client, args) {
const options = {
adjustmentNumber: args.adjustmentNumber,
include: args.include,
limit: args.limit || 50
};
return await client.listStockAdjustments(options);
},
/**
* Get a specific stock adjustment by ID
* @param {InflowClient} client
* @param {Object} args
* @param {string} args.stockAdjustmentId - The stock adjustment ID
* @param {string} [args.include] - Related entities to include
* @returns {Promise<Object>}
*/
async getStockAdjustment(client, args) {
if (!args.stockAdjustmentId) {
return {
success: false,
error: 'stockAdjustmentId is required'
};
}
return await client.getStockAdjustment(args.stockAdjustmentId, args.include);
},
/**
* Create a stock adjustment to modify inventory quantities
* @param {InflowClient} client
* @param {Object} args
* @param {string} args.stockAdjustmentId - UUID for the new adjustment (generate with crypto.randomUUID())
* @param {string} args.locationId - Location ID where adjustment occurs
* @param {Array<Object>} args.lines - Array of adjustment lines
* @param {string} args.lines[].productId - Product ID being adjusted
* @param {number} args.lines[].quantity - Quantity to adjust (can be negative)
* @param {string} [args.adjustmentReasonId] - Reason for adjustment
* @param {string} [args.notes] - Notes about the adjustment
* @param {string} [args.adjustmentDate] - Date of adjustment (ISO format)
* @returns {Promise<Object>}
*/
async createStockAdjustment(client, args) {
if (!args.stockAdjustmentId) {
return {
success: false,
error: 'stockAdjustmentId is required (generate a UUID)'
};
}
if (!args.locationId) {
return {
success: false,
error: 'locationId is required'
};
}
if (!args.lines || !Array.isArray(args.lines) || args.lines.length === 0) {
return {
success: false,
error: 'lines array is required with at least one adjustment line'
};
}
// Validate each line
for (let i = 0; i < args.lines.length; i++) {
const line = args.lines[i];
if (!line.productId) {
return {
success: false,
error: `Line ${i + 1}: productId is required`
};
}
if (line.quantity === undefined || line.quantity === null) {
return {
success: false,
error: `Line ${i + 1}: quantity is required`
};
}
}
const stockAdjustment = {
stockAdjustmentId: args.stockAdjustmentId,
locationId: args.locationId,
lines: args.lines,
adjustmentReasonId: args.adjustmentReasonId,
notes: args.notes,
adjustmentDate: args.adjustmentDate
};
return await client.upsertStockAdjustment(stockAdjustment);
}
};