jobnimbus-mcp-client
Version:
JobNimbus MCP Client - Connect Claude Desktop to remote JobNimbus MCP server
62 lines • 2.73 kB
JavaScript
/**
* Optimize Material Orders Tool - Simplified Implementation
*/
import { BaseTool } from '../baseTool.js';
import { getBulkDiscount, roundToPackagingUnit } from '../../constants/packaging.constants.js';
export class OptimizeMaterialOrdersTool extends BaseTool {
get definition() {
return {
name: 'optimize_material_orders',
description: 'Optimize material orders with bulk discounts, packaging rules, and supplier recommendations',
inputSchema: {
type: 'object',
properties: {
materials: {
type: 'array',
description: 'Array of materials to optimize',
items: {
type: 'object',
properties: {
sku: { type: 'string' },
quantity: { type: 'number' },
unit_cost: { type: 'number' }
}
}
}
},
required: ['materials']
}
};
}
async execute(input) {
const optimized = input.materials.map((material) => {
const packaging = roundToPackagingUnit(material.quantity, material.sku);
const discount = getBulkDiscount('shingles', packaging.rounded_quantity);
const discounted_cost = material.unit_cost * (1 - discount.discount_percent / 100);
return {
original: material,
optimized: {
...material,
quantity: packaging.rounded_quantity,
unit_cost: discounted_cost,
total_cost: packaging.rounded_quantity * discounted_cost
},
discount_applied: discount,
savings: material.quantity * material.unit_cost - packaging.rounded_quantity * discounted_cost
};
});
const total_savings = optimized.reduce((sum, m) => sum + (m.savings || 0), 0);
return {
success: true,
optimized_materials: optimized,
totals: {
original_cost: input.materials.reduce((sum, m) => sum + m.quantity * m.unit_cost, 0),
optimized_cost: optimized.reduce((sum, m) => sum + m.optimized.total_cost, 0),
total_savings,
savings_percent: (total_savings / input.materials.reduce((sum, m) => sum + m.quantity * m.unit_cost, 0) * 100).toFixed(1)
}
};
}
}
export default () => new OptimizeMaterialOrdersTool();
//# sourceMappingURL=optimizeMaterialOrders.js.map