UNPKG

sap-b1-mcp-server

Version:

SAP Business One Service Layer MCP Server

1,146 lines 47.3 kB
import { z } from 'zod'; // Schema for business partner operations const getBusinessPartnersSchema = z.object({ filter: z.string().optional().describe('OData $filter expression (e.g., "CardType eq \'cCustomer\'" or "contains(CardName,\'Microsoft\')")'), select: z.string().optional().describe('OData $select expression to specify fields (e.g., "CardCode,CardName,CardType")'), orderby: z.string().optional().describe('OData $orderby expression (e.g., "CardName asc" or "CreationDate desc")'), top: z.number().optional().describe('Maximum number of records to return'), skip: z.number().optional().describe('Number of records to skip for pagination'), cardType: z.enum(['cCustomer', 'cSupplier', 'cLid']).optional().describe('Filter by business partner type') }); const createBusinessPartnerSchema = z.object({ CardName: z.string().describe('Business partner name (required)'), CardType: z.enum(['cCustomer', 'cSupplier', 'cLid']).describe('Business partner type'), GroupCode: z.number().optional().describe('Business partner group code'), Address: z.string().optional().describe('Primary address'), ZipCode: z.string().optional().describe('ZIP code'), MailAddress: z.string().optional().describe('Mailing address'), MailZipCode: z.string().optional().describe('Mailing ZIP code'), Phone1: z.string().optional().describe('Primary phone number'), Phone2: z.string().optional().describe('Secondary phone number'), Fax: z.string().optional().describe('Fax number'), ContactPerson: z.string().optional().describe('Contact person name'), Notes: z.string().optional().describe('Notes'), EmailAddress: z.string().email().optional().describe('Email address'), Website: z.string().url().optional().describe('Website URL'), Currency: z.string().optional().describe('Default currency code'), Valid: z.enum(['tYES', 'tNO']).optional().describe('Whether the business partner is valid'), Frozen: z.enum(['tYES', 'tNO']).optional().describe('Whether the business partner is frozen') }); const updateBusinessPartnerSchema = z.object({ CardCode: z.string().describe('Business partner code to update'), updates: z.object({ CardName: z.string().optional(), GroupCode: z.number().optional(), Address: z.string().optional(), ZipCode: z.string().optional(), MailAddress: z.string().optional(), MailZipCode: z.string().optional(), Phone1: z.string().optional(), Phone2: z.string().optional(), Fax: z.string().optional(), ContactPerson: z.string().optional(), Notes: z.string().optional(), EmailAddress: z.string().email().optional(), Website: z.string().url().optional(), Currency: z.string().optional(), Valid: z.enum(['tYES', 'tNO']).optional(), Frozen: z.enum(['tYES', 'tNO']).optional() }).describe('Fields to update') }); // Schema for item operations const getItemsSchema = z.object({ filter: z.string().optional().describe('OData $filter expression (e.g., "ItemType eq \'it_Item\'" or "contains(ItemName,\'Laptop\')")'), select: z.string().optional().describe('OData $select expression to specify fields (e.g., "ItemCode,ItemName,QuantityOnStock")'), orderby: z.string().optional().describe('OData $orderby expression (e.g., "ItemName asc" or "QuantityOnStock desc")'), top: z.number().optional().describe('Maximum number of records to return'), skip: z.number().optional().describe('Number of records to skip for pagination') }); const createItemSchema = z.object({ ItemName: z.string().describe('Item name (required)'), ForeignName: z.string().optional().describe('Foreign language name'), ItemsGroupCode: z.number().optional().describe('Item group code'), BarCode: z.string().optional().describe('Barcode'), VatLiable: z.enum(['tYES', 'tNO']).optional().describe('VAT liable'), PurchaseItem: z.enum(['tYES', 'tNO']).optional().describe('Can be purchased'), SalesItem: z.enum(['tYES', 'tNO']).optional().describe('Can be sold'), InventoryItem: z.enum(['tYES', 'tNO']).optional().describe('Inventory item'), IncomeAccount: z.string().optional().describe('Income account code'), ExemptIncomeAccount: z.string().optional().describe('Exempt income account code'), ExpanseAccount: z.string().optional().describe('Expense account code'), Mainsupplier: z.string().optional().describe('Main supplier code'), SupplierCatalogNo: z.string().optional().describe('Supplier catalog number'), DesiredInventory: z.number().optional().describe('Desired inventory level'), MinInventory: z.number().optional().describe('Minimum inventory level'), CommissionPercent: z.number().optional().describe('Commission percentage'), Valid: z.enum(['tYES', 'tNO']).optional().describe('Whether the item is valid'), Frozen: z.enum(['tYES', 'tNO']).optional().describe('Whether the item is frozen') }); // Schema for single business partner getter const getBusinessPartnerSchema = z.object({ cardCode: z.string().describe('Business partner code (CardCode)'), select: z.string().optional().describe('OData $select expression to specify fields (e.g., "CardCode,CardName,CardType")'), expand: z.string().optional().describe('OData $expand expression to include related data') }); // Schema for single item getter const getItemSchema = z.object({ itemCode: z.string().describe('Item code (ItemCode)'), select: z.string().optional().describe('OData $select expression to specify fields (e.g., "ItemCode,ItemName,QuantityOnStock")'), expand: z.string().optional().describe('OData $expand expression to include related data') }); // Schema for item groups (product categories) const getItemGroupsSchema = z.object({ filter: z.string().optional().describe('OData $filter expression (e.g., "contains(GroupName,\'Hardware\')")'), select: z.string().optional().describe('OData $select expression to specify fields (e.g., "Number,GroupName")'), orderby: z.string().optional().describe('OData $orderby expression (e.g., "GroupName asc")'), top: z.number().optional().describe('Maximum number of records to return'), skip: z.number().optional().describe('Number of records to skip for pagination') }); // Schema for warehouse operations const getWarehousesSchema = z.object({ filter: z.string().optional().describe('OData $filter expression (e.g., "Inactive eq \'tNO\'" or "contains(WarehouseName,\'Main\')")'), select: z.string().optional().describe('OData $select expression to specify fields (e.g., "WarehouseCode,WarehouseName,Inactive")'), orderby: z.string().optional().describe('OData $orderby expression (e.g., "WarehouseName asc" or "WarehouseCode desc")'), top: z.number().optional().describe('Maximum number of records to return'), skip: z.number().optional().describe('Number of records to skip for pagination') }); const getWarehouseSchema = z.object({ warehouseCode: z.string().describe('Warehouse code (required)'), select: z.string().optional().describe('OData $select expression to specify fields'), expand: z.string().optional().describe('OData $expand expression to include related data') }); // Schema for price list operations const getPriceListsSchema = z.object({ filter: z.string().optional().describe('OData $filter expression (e.g., "Active eq \'tYES\'" or "contains(PriceListName,\'Standard\')")'), select: z.string().optional().describe('OData $select expression to specify fields (e.g., "PriceListNo,PriceListName,Active")'), orderby: z.string().optional().describe('OData $orderby expression (e.g., "PriceListName asc" or "PriceListNo desc")'), top: z.number().optional().describe('Maximum number of records to return'), skip: z.number().optional().describe('Number of records to skip for pagination') }); const getPriceListSchema = z.object({ priceListNo: z.number().describe('Price list number (required)'), select: z.string().optional().describe('OData $select expression to specify fields'), expand: z.string().optional().describe('OData $expand expression to include related data') }); // Schema for item stock operations const getItemStockSchema = z.object({ itemCode: z.string().describe('Item code (required)'), warehouseCode: z.string().describe('Warehouse code (required)'), select: z.string().optional().describe('OData $select expression to specify fields (e.g., "InStock,Available,Committed")') }); const getItemStockAllSchema = z.object({ itemCode: z.string().describe('Item code (required)'), filter: z.string().optional().describe('OData $filter expression to filter warehouses'), select: z.string().optional().describe('OData $select expression to specify fields'), orderby: z.string().optional().describe('OData $orderby expression (e.g., "WarehouseCode asc")'), top: z.number().optional().describe('Maximum number of records to return'), skip: z.number().optional().describe('Number of records to skip for pagination') }); // Schema for item price operations const getItemPriceSchema = z.object({ itemCode: z.string().describe('Item code (required)'), priceListId: z.number().describe('Price list ID (required)'), select: z.string().optional().describe('OData $select expression to specify fields (e.g., "Price,Currency,Factor")') }); const getItemPricesAllSchema = z.object({ itemCode: z.string().describe('Item code (required)'), filter: z.string().optional().describe('OData $filter expression to filter price lists'), select: z.string().optional().describe('OData $select expression to specify fields'), orderby: z.string().optional().describe('OData $orderby expression (e.g., "PriceList asc")'), top: z.number().optional().describe('Maximum number of records to return'), skip: z.number().optional().describe('Number of records to skip for pagination') }); export const masterDataTools = [ { name: 'sap_get_business_partners', description: 'Retrieve business partners (customers/vendors) from SAP Business One with optional filtering, selection, and pagination. Server limit: 20 records maximum per request. Use skip/top for pagination.', inputSchema: { type: 'object', properties: { filter: { type: 'string', description: 'OData $filter expression (e.g., "CardType eq \'cCustomer\'" or "contains(CardName,\'Microsoft\')")' }, select: { type: 'string', description: 'OData $select expression to specify fields (e.g., "CardCode,CardName,CardType")' }, orderby: { type: 'string', description: 'OData $orderby expression (e.g., "CardName asc" or "CreationDate desc")' }, top: { type: 'number', description: 'Maximum number of records to return (server limit: 20, use 20 for best performance)' }, skip: { type: 'number', description: 'Number of records to skip for pagination (0-based, e.g., skip=20 for page 2, skip=40 for page 3)' }, cardType: { type: 'string', enum: ['cCustomer', 'cSupplier', 'cLid'], description: 'Filter by business partner type' } }, additionalProperties: false } }, { name: 'sap_get_business_partner', description: 'Retrieve a single business partner (customer/vendor) by CardCode from SAP Business One.', inputSchema: { type: 'object', properties: { cardCode: { type: 'string', description: 'Business partner code (CardCode)' }, select: { type: 'string', description: 'OData $select expression to specify fields (e.g., "CardCode,CardName,CardType")' }, expand: { type: 'string', description: 'OData $expand expression to include related data' } }, required: ['cardCode'], additionalProperties: false } }, { name: 'sap_create_business_partner', description: 'Create a new business partner (customer/vendor) in SAP Business One.', inputSchema: { type: 'object', properties: { CardName: { type: 'string', description: 'Business partner name (required)' }, CardType: { type: 'string', enum: ['cCustomer', 'cSupplier', 'cLid'], description: 'Business partner type' }, GroupCode: { type: 'number', description: 'Business partner group code' }, Address: { type: 'string', description: 'Primary address' }, ZipCode: { type: 'string', description: 'ZIP code' }, MailAddress: { type: 'string', description: 'Mailing address' }, MailZipCode: { type: 'string', description: 'Mailing ZIP code' }, Phone1: { type: 'string', description: 'Primary phone number' }, Phone2: { type: 'string', description: 'Secondary phone number' }, Fax: { type: 'string', description: 'Fax number' }, ContactPerson: { type: 'string', description: 'Contact person name' }, Notes: { type: 'string', description: 'Notes' }, EmailAddress: { type: 'string', description: 'Email address' }, Website: { type: 'string', description: 'Website URL' }, Currency: { type: 'string', description: 'Default currency code' }, Valid: { type: 'string', enum: ['tYES', 'tNO'], description: 'Whether the business partner is valid' }, Frozen: { type: 'string', enum: ['tYES', 'tNO'], description: 'Whether the business partner is frozen' } }, required: ['CardName', 'CardType'], additionalProperties: false } }, { name: 'sap_update_business_partner', description: 'Update an existing business partner in SAP Business One.', inputSchema: { type: 'object', properties: { CardCode: { type: 'string', description: 'Business partner code to update' }, updates: { type: 'object', properties: { CardName: { type: 'string' }, GroupCode: { type: 'number' }, Address: { type: 'string' }, ZipCode: { type: 'string' }, MailAddress: { type: 'string' }, MailZipCode: { type: 'string' }, Phone1: { type: 'string' }, Phone2: { type: 'string' }, Fax: { type: 'string' }, ContactPerson: { type: 'string' }, Notes: { type: 'string' }, EmailAddress: { type: 'string' }, Website: { type: 'string' }, Currency: { type: 'string' }, Valid: { type: 'string', enum: ['tYES', 'tNO'] }, Frozen: { type: 'string', enum: ['tYES', 'tNO'] } }, description: 'Fields to update' } }, required: ['CardCode', 'updates'], additionalProperties: false } }, { name: 'sap_get_items', description: 'Retrieve items from SAP Business One with optional filtering, selection, and pagination. Server limit: 20 records maximum per request. Use skip/top for pagination.', inputSchema: { type: 'object', properties: { filter: { type: 'string', description: 'OData $filter expression (e.g., "ItemType eq \'it_Item\'" or "contains(ItemName,\'Laptop\')")' }, select: { type: 'string', description: 'OData $select expression to specify fields (e.g., "ItemCode,ItemName,QuantityOnStock")' }, orderby: { type: 'string', description: 'OData $orderby expression (e.g., "ItemName asc" or "QuantityOnStock desc")' }, top: { type: 'number', description: 'Maximum number of records to return (server limit: 20, use 20 for best performance)' }, skip: { type: 'number', description: 'Number of records to skip for pagination (0-based, e.g., skip=20 for page 2, skip=40 for page 3)' } }, additionalProperties: false } }, { name: 'sap_get_item', description: 'Retrieve a single item by ItemCode from SAP Business One.', inputSchema: { type: 'object', properties: { itemCode: { type: 'string', description: 'Item code (ItemCode)' }, select: { type: 'string', description: 'OData $select expression to specify fields (e.g., "ItemCode,ItemName,QuantityOnStock")' }, expand: { type: 'string', description: 'OData $expand expression to include related data' } }, required: ['itemCode'], additionalProperties: false } }, { name: 'sap_get_product_categories', description: 'Retrieve product categories (SAP Item Groups) with optional filtering, selection, and pagination. Server limit: 20 records maximum per request. Use skip/top for pagination.', inputSchema: { type: 'object', properties: { filter: { type: 'string', description: 'OData $filter expression (e.g., "contains(GroupName,\'Hardware\')")' }, select: { type: 'string', description: 'OData $select expression to specify fields (e.g., "Number,GroupName")' }, orderby: { type: 'string', description: 'OData $orderby expression (e.g., "GroupName asc")' }, top: { type: 'number', description: 'Maximum number of records to return (server limit: 20, use 20 for best performance)' }, skip: { type: 'number', description: 'Number of records to skip for pagination (0-based, e.g., skip=20 for page 2, skip=40 for page 3)' } }, additionalProperties: false } }, { name: 'sap_create_item', description: 'Create a new item in SAP Business One.', inputSchema: { type: 'object', properties: { ItemName: { type: 'string', description: 'Item name (required)' }, ForeignName: { type: 'string', description: 'Foreign language name' }, ItemsGroupCode: { type: 'number', description: 'Item group code' }, BarCode: { type: 'string', description: 'Barcode' }, VatLiable: { type: 'string', enum: ['tYES', 'tNO'], description: 'VAT liable' }, PurchaseItem: { type: 'string', enum: ['tYES', 'tNO'], description: 'Can be purchased' }, SalesItem: { type: 'string', enum: ['tYES', 'tNO'], description: 'Can be sold' }, InventoryItem: { type: 'string', enum: ['tYES', 'tNO'], description: 'Inventory item' }, IncomeAccount: { type: 'string', description: 'Income account code' }, ExemptIncomeAccount: { type: 'string', description: 'Exempt income account code' }, ExpanseAccount: { type: 'string', description: 'Expense account code' }, Mainsupplier: { type: 'string', description: 'Main supplier code' }, SupplierCatalogNo: { type: 'string', description: 'Supplier catalog number' }, DesiredInventory: { type: 'number', description: 'Desired inventory level' }, MinInventory: { type: 'number', description: 'Minimum inventory level' }, CommissionPercent: { type: 'number', description: 'Commission percentage' }, Valid: { type: 'string', enum: ['tYES', 'tNO'], description: 'Whether the item is valid' }, Frozen: { type: 'string', enum: ['tYES', 'tNO'], description: 'Whether the item is frozen' } }, required: ['ItemName'], additionalProperties: false } }, { name: 'sap_get_warehouses', description: 'Retrieve warehouses from SAP Business One with optional filtering, selection, and pagination. Supports OData query options for efficient data retrieval.', inputSchema: { type: 'object', properties: { filter: { type: 'string', description: 'OData $filter expression (e.g., "Inactive eq \'tNO\'" or "contains(WarehouseName,\'Main\')")' }, select: { type: 'string', description: 'OData $select expression to specify fields (e.g., "WarehouseCode,WarehouseName,Inactive")' }, orderby: { type: 'string', description: 'OData $orderby expression (e.g., "WarehouseName asc" or "WarehouseCode desc")' }, top: { type: 'number', description: 'Maximum number of records to return' }, skip: { type: 'number', description: 'Number of records to skip for pagination' } }, additionalProperties: false } }, { name: 'sap_get_warehouse', description: 'Retrieve a single warehouse by warehouse code from SAP Business One with optional field selection.', inputSchema: { type: 'object', properties: { warehouseCode: { type: 'string', description: 'Warehouse code (required)' }, select: { type: 'string', description: 'OData $select expression to specify fields' }, expand: { type: 'string', description: 'OData $expand expression to include related data' } }, required: ['warehouseCode'], additionalProperties: false } }, { name: 'sap_get_pricelists', description: 'Retrieve price lists from SAP Business One with optional filtering, selection, and pagination. Supports OData query options for efficient data retrieval.', inputSchema: { type: 'object', properties: { filter: { type: 'string', description: 'OData $filter expression (e.g., "Active eq \'tYES\'" or "contains(PriceListName,\'Standard\')")' }, select: { type: 'string', description: 'OData $select expression to specify fields (e.g., "PriceListNo,PriceListName,Active")' }, orderby: { type: 'string', description: 'OData $orderby expression (e.g., "PriceListName asc" or "PriceListNo desc")' }, top: { type: 'number', description: 'Maximum number of records to return' }, skip: { type: 'number', description: 'Number of records to skip for pagination' } }, additionalProperties: false } }, { name: 'sap_get_pricelist', description: 'Retrieve a single price list by price list number from SAP Business One with optional field selection.', inputSchema: { type: 'object', properties: { priceListNo: { type: 'number', description: 'Price list number (required)' }, select: { type: 'string', description: 'OData $select expression to specify fields' }, expand: { type: 'string', description: 'OData $expand expression to include related data' } }, required: ['priceListNo'], additionalProperties: false } }, { name: 'sap_get_item_stock', description: 'Get stock levels for a specific item in a specific warehouse from SAP Business One.', inputSchema: { type: 'object', properties: { itemCode: { type: 'string', description: 'Item code (required)' }, warehouseCode: { type: 'string', description: 'Warehouse code (required)' }, select: { type: 'string', description: 'OData $select expression to specify fields (e.g., "InStock,Available,Committed")' } }, required: ['itemCode', 'warehouseCode'], additionalProperties: false } }, { name: 'sap_get_item_stock_all', description: 'Get stock levels for a specific item across all warehouses from SAP Business One with optional filtering and pagination.', inputSchema: { type: 'object', properties: { itemCode: { type: 'string', description: 'Item code (required)' }, filter: { type: 'string', description: 'OData $filter expression to filter warehouses' }, select: { type: 'string', description: 'OData $select expression to specify fields' }, orderby: { type: 'string', description: 'OData $orderby expression (e.g., "WarehouseCode asc")' }, top: { type: 'number', description: 'Maximum number of records to return' }, skip: { type: 'number', description: 'Number of records to skip for pagination' } }, required: ['itemCode'], additionalProperties: false } }, { name: 'sap_get_item_price', description: 'Get price for a specific item in a specific price list from SAP Business One.', inputSchema: { type: 'object', properties: { itemCode: { type: 'string', description: 'Item code (required)' }, priceListId: { type: 'number', description: 'Price list ID (required)' }, select: { type: 'string', description: 'OData $select expression to specify fields (e.g., "Price,Currency,Factor")' } }, required: ['itemCode', 'priceListId'], additionalProperties: false } }, { name: 'sap_get_item_prices_all', description: 'Get prices for a specific item across all price lists from SAP Business One with optional filtering and pagination.', inputSchema: { type: 'object', properties: { itemCode: { type: 'string', description: 'Item code (required)' }, filter: { type: 'string', description: 'OData $filter expression to filter price lists' }, select: { type: 'string', description: 'OData $select expression to specify fields' }, orderby: { type: 'string', description: 'OData $orderby expression (e.g., "PriceList asc")' }, top: { type: 'number', description: 'Maximum number of records to return' }, skip: { type: 'number', description: 'Number of records to skip for pagination' } }, required: ['itemCode'], additionalProperties: false } } ]; export class MasterDataToolHandler { sapClient; constructor(sapClient) { this.sapClient = sapClient; } async handleGetBusinessPartners(args) { try { const params = getBusinessPartnersSchema.parse(args); // Build query parameters const queryParams = {}; if (params.filter) queryParams.$filter = params.filter; if (params.select) queryParams.$select = params.select; if (params.orderby) queryParams.$orderby = params.orderby; if (params.top) queryParams.$top = params.top; if (params.skip) queryParams.$skip = params.skip; // Add card type filter if specified if (params.cardType) { const typeFilter = `CardType eq '${params.cardType}'`; queryParams.$filter = queryParams.$filter ? `(${queryParams.$filter}) and ${typeFilter}` : typeFilter; } const businessPartners = await this.sapClient.getBusinessPartners(queryParams); return { success: true, count: businessPartners.length, data: businessPartners }; } catch (error) { return { success: false, error: error.message || 'Failed to retrieve business partners', details: 'Check your filter syntax and ensure the session is valid' }; } } async handleGetBusinessPartner(args) { try { const params = getBusinessPartnerSchema.parse(args); // Build query parameters const queryParams = {}; if (params.select) queryParams.$select = params.select; if (params.expand) queryParams.$expand = params.expand; const businessPartner = await this.sapClient.getBusinessPartner(params.cardCode, queryParams); return { success: true, data: businessPartner }; } catch (error) { return { success: false, error: error.message || 'Failed to retrieve business partner', details: 'Check the CardCode and ensure the session is valid' }; } } async handleCreateBusinessPartner(args) { try { const businessPartner = createBusinessPartnerSchema.parse(args); const result = await this.sapClient.createBusinessPartner(businessPartner); return { success: true, message: 'Business partner created successfully', data: { CardCode: result.CardCode, CardName: result.CardName, CardType: result.CardType } }; } catch (error) { return { success: false, error: error.message || 'Failed to create business partner', details: 'Check required fields and ensure the session is valid' }; } } async handleUpdateBusinessPartner(args) { try { const { CardCode, updates } = updateBusinessPartnerSchema.parse(args); await this.sapClient.updateBusinessPartner(CardCode, updates); return { success: true, message: `Business partner ${CardCode} updated successfully` }; } catch (error) { return { success: false, error: error.message || 'Failed to update business partner', details: 'Check the CardCode exists and field values are valid' }; } } async handleGetItems(args) { try { const params = getItemsSchema.parse(args); // Build query parameters const queryParams = {}; if (params.filter) queryParams.$filter = params.filter; if (params.select) queryParams.$select = params.select; if (params.orderby) queryParams.$orderby = params.orderby; if (params.top) queryParams.$top = params.top; if (params.skip) queryParams.$skip = params.skip; const items = await this.sapClient.getItems(queryParams); return { success: true, count: items.length, data: items }; } catch (error) { return { success: false, error: error.message || 'Failed to retrieve items', details: 'Check your filter syntax and ensure the session is valid' }; } } async handleGetItem(args) { try { const params = getItemSchema.parse(args); // Build query parameters const queryParams = {}; if (params.select) queryParams.$select = params.select; if (params.expand) queryParams.$expand = params.expand; const item = await this.sapClient.getItem(params.itemCode, queryParams); return { success: true, data: item }; } catch (error) { return { success: false, error: error.message || 'Failed to retrieve item', details: 'Check the ItemCode and ensure the session is valid' }; } } async handleGetItemGroups(args) { try { const params = getItemGroupsSchema.parse(args); // Build query parameters const queryParams = {}; if (params.filter) queryParams.$filter = params.filter; if (params.select) queryParams.$select = params.select; if (params.orderby) queryParams.$orderby = params.orderby; if (params.top) queryParams.$top = params.top; if (params.skip) queryParams.$skip = params.skip; const groups = await this.sapClient.getItemGroups(queryParams); return { success: true, count: groups.length, data: groups }; } catch (error) { return { success: false, error: error.message || 'Failed to retrieve product categories', details: 'Check your filter syntax and ensure the session is valid' }; } } async handleCreateItem(args) { try { const item = createItemSchema.parse(args); const result = await this.sapClient.createItem(item); return { success: true, message: 'Item created successfully', data: { ItemCode: result.ItemCode, ItemName: result.ItemName, SalesItem: result.SalesItem, PurchaseItem: result.PurchaseItem, InventoryItem: result.InventoryItem } }; } catch (error) { return { success: false, error: error.message || 'Failed to create item', details: 'Check required fields and ensure the session is valid' }; } } async handleGetWarehouses(args) { try { const params = getWarehousesSchema.parse(args); // Build query parameters const queryParams = {}; if (params.filter) queryParams.$filter = params.filter; if (params.select) queryParams.$select = params.select; if (params.orderby) queryParams.$orderby = params.orderby; if (params.top) queryParams.$top = params.top; if (params.skip) queryParams.$skip = params.skip; const warehouses = await this.sapClient.getWarehouses(queryParams); return { success: true, count: warehouses.length, data: warehouses }; } catch (error) { return { success: false, error: error.message || 'Failed to retrieve warehouses', details: 'Check your filter syntax and ensure the session is valid' }; } } async handleGetWarehouse(args) { try { const params = getWarehouseSchema.parse(args); // Build query parameters const queryParams = {}; if (params.select) queryParams.$select = params.select; if (params.expand) queryParams.$expand = params.expand; const warehouse = await this.sapClient.getWarehouse(params.warehouseCode, queryParams); return { success: true, data: warehouse }; } catch (error) { return { success: false, error: error.message || 'Failed to retrieve warehouse', details: 'Check the WarehouseCode and ensure the session is valid' }; } } async handleGetPriceLists(args) { try { const params = getPriceListsSchema.parse(args); // Build query parameters const queryParams = {}; if (params.filter) queryParams.$filter = params.filter; if (params.select) queryParams.$select = params.select; if (params.orderby) queryParams.$orderby = params.orderby; if (params.top) queryParams.$top = params.top; if (params.skip) queryParams.$skip = params.skip; const priceLists = await this.sapClient.getPriceLists(queryParams); return { success: true, count: priceLists.length, data: priceLists }; } catch (error) { return { success: false, error: error.message || 'Failed to retrieve price lists', details: 'Check your filter syntax and ensure the session is valid' }; } } async handleGetPriceList(args) { try { const params = getPriceListSchema.parse(args); // Build query parameters const queryParams = {}; if (params.select) queryParams.$select = params.select; if (params.expand) queryParams.$expand = params.expand; const priceList = await this.sapClient.getPriceList(params.priceListNo, queryParams); return { success: true, data: priceList }; } catch (error) { return { success: false, error: error.message || 'Failed to retrieve price list', details: 'Check the PriceListNo and ensure the session is valid' }; } } async handleGetItemStock(args) { try { const params = getItemStockSchema.parse(args); // Build query parameters const queryParams = {}; if (params.select) queryParams.$select = params.select; const stockInfo = await this.sapClient.getItemStock(params.itemCode, params.warehouseCode, queryParams); return { success: true, data: stockInfo }; } catch (error) { return { success: false, error: error.message || 'Failed to retrieve item stock information', details: 'Check the ItemCode and WarehouseCode and ensure the session is valid' }; } } async handleGetItemStockAll(args) { try { const params = getItemStockAllSchema.parse(args); // Build query parameters const queryParams = {}; if (params.filter) queryParams.$filter = params.filter; if (params.select) queryParams.$select = params.select; if (params.orderby) queryParams.$orderby = params.orderby; if (params.top) queryParams.$top = params.top; if (params.skip) queryParams.$skip = params.skip; const stockInfo = await this.sapClient.getItemStockAll(params.itemCode, queryParams); return { success: true, count: stockInfo.length, data: stockInfo }; } catch (error) { return { success: false, error: error.message || 'Failed to retrieve item stock information', details: 'Check the ItemCode and ensure the session is valid' }; } } async handleGetItemPrice(args) { try { const params = getItemPriceSchema.parse(args); // Build query parameters const queryParams = {}; if (params.select) queryParams.$select = params.select; const priceInfo = await this.sapClient.getItemPrice(params.itemCode, params.priceListId, queryParams); return { success: true, data: priceInfo }; } catch (error) { return { success: false, error: error.message || 'Failed to retrieve item price information', details: 'Check the ItemCode and PriceListId and ensure the session is valid' }; } } async handleGetItemPricesAll(args) { try { const params = getItemPricesAllSchema.parse(args); // Build query parameters const queryParams = {}; if (params.filter) queryParams.$filter = params.filter; if (params.select) queryParams.$select = params.select; if (params.orderby) queryParams.$orderby = params.orderby; if (params.top) queryParams.$top = params.top; if (params.skip) queryParams.$skip = params.skip; const priceInfo = await this.sapClient.getItemPricesAll(params.itemCode, queryParams); return { success: true, count: priceInfo.length, data: priceInfo }; } catch (error) { return { success: false, error: error.message || 'Failed to retrieve item price information', details: 'Check the ItemCode and ensure the session is valid' }; } } } //# sourceMappingURL=master-data.js.map