UNPKG

purchase-mcp-server

Version:

Purchase and budget management server handling requisitions, purchase orders, expenses, budgets, and vendor management with ERP access for data extraction

946 lines 70.5 kB
// private async getMonthlyOpexBudgetVariance(arguments_: ToolArguments): Promise<ToolResponse> { // const { imo, session_id = "testing" } = arguments_; // return fetchQADetailsAndCreateResponse( // imo, // 9, // "get_monthly_opex_budget_variance", // "monthly opex budget variance", // session_id // ); // } export {}; // private async getCurrentYearCommittedCost(arguments_: ToolArguments): Promise<ToolResponse> { // const { imo, session_id = "testing" } = arguments_; // return fetchQADetailsAndCreateResponse( // imo, // 12, // "get_current_year_commited_cost", // "current year committed cost", // session_id // ); // } // private async getBudgetStatusSummaryYtd(arguments_: ToolArguments): Promise<ToolResponse> { // const { imo, session_id = "testing" } = arguments_; // return fetchQADetailsAndCreateResponse( // imo, // 17, // "get_budget_status_summary_ytd", // "budget status summary ytd", // session_id // ); // } // private async getPurchaseOrdersWithForwarders(arguments_: ToolArguments): Promise<ToolResponse> { // const { imo, session_id = "testing" } = arguments_; // return fetchQADetailsAndCreateResponse( // imo, // 122, // "get_purchase_orders_with_forwarders", // "po with forwarders", // session_id // ); // } // private async getFleetPurchaseLogTable(arguments_: ToolArguments): Promise<ToolResponse> { // const { imo, session_id = "testing" } = arguments_; // return fetchQADetailsAndCreateResponse( // imo, // 257, // "get_fleet_purchase_log_table", // "fleet purchase log table", // session_id // ); // } // private async getFleetPurchaseActivities(arguments_: ToolArguments): Promise<ToolResponse> { // const { imo, session_id = "testing" } = arguments_; // return fetchQADetailsAndCreateResponse( // imo, // 121, // "get_fleet_purchase_activities", // "fleet purchase activities", // session_id // ); // } // private async getFleetBudgetOverviews(arguments_: ToolArguments): Promise<ToolResponse> { // const { imo, session_id = "testing" } = arguments_; // return fetchQADetailsAndCreateResponse( // imo, // 11, // "get_fleet_budget_overviews", // "fleet budget overviews", // session_id // ); // } // private async purchaseOrdersOpenMoreThan180Days(arguments_: ToolArguments): Promise<ToolResponse> { // const { imo, session_id = "testing" } = arguments_; // return fetchQADetailsAndCreateResponse( // imo, // 123, // "purchase_orders_open_more_than_180_days", // "purchase orders open more than 180 days", // session_id // ); // } // private async getVesselBudgetData(arguments_: ToolArguments): Promise<ToolResponse> { // try { // const { // imo, // category, // group, // period, // dateFrom, // dateTo, // per_page = 250, // session_id = "testing" // } = arguments_; // if (!imo) { // throw new Error("IMO number is required"); // } // // Build filter_by string // let filterBy = `imo:${imo}`; // if (category) { // filterBy += ` && category:${category}`; // } // if (group) { // filterBy += ` && group:${group}`; // } // if (period) { // filterBy += ` && period:${period}`; // } // if (dateFrom && dateTo) { // filterBy += ` && date:>=${parseInt(dateFrom)} && date:<=${parseInt(dateTo)}`; // } else if (dateFrom) { // filterBy += ` && date:>=${parseInt(dateFrom)}`; // } else if (dateTo) { // filterBy += ` && date:<=${parseInt(dateTo)}`; // } // filterBy = await updateTypesenseFilterWithCompanyImos(filterBy); // // Execute search // const searchParameters = { // q: "*", // filter_by: filterBy, // include_fields: "imo,vesselName,group,category,period,reportPeriod,date,budgetAmount,expenseAmount", // per_page // }; // const searchResult = await this.typesenseClient.collections('budget').documents().search(searchParameters); // if (!searchResult || !searchResult.hits || searchResult.hits.length === 0) { // return [{ // type: "text", // text: `No budget data found for vessel ${imo}.`, // title: "No Budget Data Found", // format: "json" // }]; // } // // Build title and link header // let title = `Vessel Budget Data for IMO ${imo}`; // let linkHeader = "vessel budget data"; // if (category) { // title += ` - Category: ${category}`; // linkHeader += ` for category ${category}`; // } // if (group) { // title += ` - Group: ${group}`; // linkHeader += ` for group ${group}`; // } // if (period) { // title += ` - Period: ${period}`; // linkHeader += ` for period ${period}`; // } // // Format results using the utility function // return await processTypesenseResults( // searchResult, // "get_vessel_budget_data", // title, // session_id, // linkHeader // ); // } catch (error: any) { // logger.error('Error retrieving vessel budget data:', error); // return [{ // type: "text", // text: `Error retrieving vessel budget data: ${error.message}`, // title: "Error", // format: "json" // }]; // } // } // private async universalPurchaseSearchHandler(arguments_: ToolArguments): Promise<ToolResponse> { // const collection = "purchase"; // const session_id = arguments_.session_id || "testing"; // const query_text = (arguments_.query || "").trim() || "*"; // const filters = arguments_.filters || {}; // const sort_by = arguments_.sort_by || "relevance"; // const sort_order = arguments_.sort_order || "desc"; // const max_results = arguments_.max_results || 10; // try { // // Compose filter_by string from filters // const filterParts: string[] = []; // if (filters) { // for (const [key, value] of Object.entries(filters)) { // if (value === null || value === undefined) { // continue; // } // if (key.endsWith("_range")) { // // Handle range filters - dates and amounts // const fieldBase = key.replace("_range", ""); // if (fieldBase.toLowerCase().includes("date")) { // // Handle date ranges // const startDate = (value as any).start_date; // const endDate = (value as any).end_date; // if (startDate) { // const startTimestamp = Math.floor(new Date(startDate).getTime() / 1000); // filterParts.push(`${fieldBase}:>=${startTimestamp}`); // } // if (endDate) { // const endTimestamp = Math.floor(new Date(endDate).getTime() / 1000); // filterParts.push(`${fieldBase}:<=${endTimestamp}`); // } // } else if (fieldBase.toLowerCase().includes("amount")) { // // Handle amount ranges // const minAmount = (value as any).min_amount; // const maxAmount = (value as any).max_amount; // if (minAmount !== undefined) { // filterParts.push(`${fieldBase}:>=${minAmount}`); // } // if (maxAmount !== undefined) { // filterParts.push(`${fieldBase}:<=${maxAmount}`); // } // } else { // throw new Error(`Unsupported range filter field: ${fieldBase}`); // } // } else if (typeof value === "boolean") { // filterParts.push(`${key}:${value.toString().toLowerCase()}`); // } else if (typeof value === "string") { // filterParts.push(`${key}:${JSON.stringify(value).replace(/^"|"$/g, "")}`); // } else { // filterParts.push(`${key}:${value}`); // } // } // } // let filterBy = filterParts.length > 0 ? filterParts.join(" && ") : undefined; // filterBy = await updateTypesenseFilterWithCompanyImos(filterBy || ""); // // Set up query fields based on schema // const queryBy = "purchaseRequisitionNumber, prDescription, purchaseRequisitionSummary, qtcNo, purchaseOrderNumber"; // const includeFields = "imo,vesselName,purchaseRequisitionDate,purchaseRequisitionDescription," + // "purchaseRequisitionStatus,purchaseOrderAmount,purchaseOrderIssuedDate," + // "vendorOrSupplierName,invoiceStatus,invoiceValue,orderReadinessDate," + // "purchaseRequisitionNumber,purchaseRequisitionLink,purchaseOrderNumber," + // "purchaseOrderLink,purchaseRequisitionType,scanID,scanIDLink," + // "purchaseOrderStatus,poCreatedBy,orderType,invoiceApproverName," + // "forwarderName,forwarderRemarks,warehouseLocation,cargoType,weight," + // "purchaseRequisitionSummary,orderPriority,accountCode"; // const excludeFields = "embedding,_id"; // const query: any = { // q: query_text, // query_by: queryBy, // include_fields: includeFields, // exclude_fields: excludeFields, // per_page: max_results // }; // if (filterBy) { // query.filter_by = filterBy; // } // if (sort_by !== "relevance") { // query.sort_by = `${sort_by}:${sort_order}`; // } // logger.debug(`[Typesense Query] ${JSON.stringify(query)}`); // const results = await this.typesenseClient.collections(collection).documents().search(query); // // Debug: Log the structure of the search results // logger.info(`universalPurchaseSearchHandler - Results structure: ${JSON.stringify(Object.keys(results))}`); // if (results.hits && results.hits.length > 0) { // const sampleHit = results.hits[0]; // logger.info(`universalPurchaseSearchHandler - Sample hit structure: ${JSON.stringify(Object.keys(sampleHit))}`); // } // if (!results || !results.hits || results.hits.length === 0) { // return [{ // type: "text", // text: `No purchase records found for query '${query_text}'.`, // title: "No Results Found", // format: "json" // }]; // } // // Format results using the utility function // const title = `Smart Purchase Search Results for '${query_text}'`; // const linkHeader = `Smart purchase search result for query: '${query_text}'`; // return await processTypesenseResults( // results, // "smart_purchase_table_search", // title, // session_id, // linkHeader // ); // } catch (error: any) { // logger.error('Error performing smart purchase table search:', error); // return [{ // type: "text", // text: `Error performing search: ${error.message}`, // title: "Error", // format: "json" // }]; // } // } // private async universalBudgetSearchHandler(arguments_: ToolArguments): Promise<ToolResponse> { // const collection = "budget"; // const session_id = arguments_.session_id || "testing"; // const query_text = (arguments_.query || "").trim() || "*"; // const filters = arguments_.filters || {}; // const sort_by = arguments_.sort_by || "relevance"; // const sort_order = arguments_.sort_order || "desc"; // const max_results = arguments_.max_results || 10; // try { // // Compose filter_by string from filters // const filterParts: string[] = []; // if (filters) { // for (const [key, value] of Object.entries(filters)) { // if (value === null || value === undefined) { // continue; // } // if (key.endsWith("_range")) { // // Handle range filters - dates and amounts // const fieldBase = key.replace("_range", ""); // if (fieldBase.toLowerCase().includes("date")) { // // Handle date ranges // const startDate = (value as any).start_date; // const endDate = (value as any).end_date; // if (startDate) { // const startTimestamp = Math.floor(new Date(startDate).getTime() / 1000); // filterParts.push(`${fieldBase}:>=${startTimestamp}`); // } // if (endDate) { // const endTimestamp = Math.floor(new Date(endDate).getTime() / 1000); // filterParts.push(`${fieldBase}:<=${endTimestamp}`); // } // } else if (fieldBase.toLowerCase().includes("amount")) { // // Handle amount ranges // const minAmount = (value as any).min_amount; // const maxAmount = (value as any).max_amount; // if (minAmount !== undefined) { // filterParts.push(`${fieldBase}:>=${minAmount}`); // } // if (maxAmount !== undefined) { // filterParts.push(`${fieldBase}:<=${maxAmount}`); // } // } else { // throw new Error(`Unsupported range filter field: ${fieldBase}`); // } // } else if (typeof value === "boolean") { // filterParts.push(`${key}:${value.toString().toLowerCase()}`); // } else if (typeof value === "string") { // filterParts.push(`${key}:${JSON.stringify(value).replace(/^"|"$/g, "")}`); // } else { // filterParts.push(`${key}:${value}`); // } // } // } // let filterBy = filterParts.length > 0 ? filterParts.join(" && ") : undefined; // filterBy = await updateTypesenseFilterWithCompanyImos(filterBy || ""); // // Set up query fields based on schema // const queryBy = "vesselName,category"; // const excludeFields = "embedding,_id,docId,fleetId,vesselId,fleetManagerId,technicalSuperintendentId"; // const query: any = { // q: query_text, // query_by: queryBy, // per_page: max_results, // exclude_fields: excludeFields // }; // if (filterBy) { // query.filter_by = filterBy; // } // if (sort_by !== "relevance") { // query.sort_by = `${sort_by}:${sort_order}`; // } // logger.debug(`[Typesense Query] ${JSON.stringify(query)}`); // const results = await this.typesenseClient.collections(collection).documents().search(query); // if (!results || !results.hits || results.hits.length === 0) { // return [{ // type: "text", // text: `No budget records found for query '${query_text}'.`, // title: "No Results Found", // format: "json" // }]; // } // // Format results using the utility function // const title = `Smart Budget Search Results for '${query_text}'`; // const linkHeader = `Smart budget search result for query: '${query_text}'`; // return await processTypesenseResults( // results, // "smart_budget_search", // title, // session_id, // linkHeader // ); // } catch (error: any) { // logger.error('Error performing smart budget search:', error); // return [{ // type: "text", // text: `Error performing search: ${error.message}`, // title: "Error", // format: "json" // }]; // } // } // private async universalExpenseSearchHandler(arguments_: ToolArguments): Promise<ToolResponse> { // const collection = "expense"; // const session_id = arguments_.session_id || "testing"; // const query_text = (arguments_.query || "").trim() || "*"; // const filters = arguments_.filters || {}; // const sort_by = arguments_.sort_by || "relevance"; // const sort_order = arguments_.sort_order || "desc"; // const max_results = arguments_.max_results || 10; // try { // // Check if vendor filter is provided // if (filters.vendor) { // try { // // Query to find the actual vendor name // const vendorQuery = { // q: filters.vendor, // query_by: "vendor", // per_page: 1, // sort_by: "_text_match:desc" // Sort by best text match // }; // logger.debug(`[Vendor Query] ${JSON.stringify(vendorQuery)}`); // const vendorResults = await this.typesenseClient.collections(collection).documents().search(vendorQuery); // if (vendorResults && vendorResults.hits && vendorResults.hits.length > 0) { // const document = vendorResults.hits[0].document as Record<string, any>; // const actualVendorName = document.vendor as string; // logger.info(`Found actual vendor name: ${actualVendorName} for query: ${filters.vendor}`); // // Replace the vendor filter with the actual vendor name // filters.vendor = actualVendorName; // } else { // logger.info(`No vendor found for query: ${filters.vendor}`); // // Return early with a message that no matching vendor was found // return [{ // type: "text", // text: `No matching vendor found for '${filters.vendor}'. Please try a different vendor name.`, // title: "No Vendor Found", // format: "json" // }]; // } // // Remove the original vendor filter // // delete filters.vendor; // } catch (error: any) { // logger.error('Error querying vendor:', error); // // Return early with an error message // return [{ // type: "text", // text: `Error searching for vendor '${filters.vendor}': ${error.message}`, // title: "Vendor Search Error", // format: "json" // }]; // } // } // // Compose filter_by string from filters // const filterParts: string[] = []; // if (filters) { // for (const [key, value] of Object.entries(filters)) { // if (value === null || value === undefined) { // continue; // } // if (key.endsWith("_range")) { // // Handle range filters - dates and amounts // const fieldBase = key.replace("_range", ""); // if (fieldBase.toLowerCase().includes("date")) { // // Handle date ranges // const startDate = (value as any).start_date; // const endDate = (value as any).end_date; // if (startDate) { // const startTimestamp = Math.floor(new Date(startDate).getTime() / 1000); // filterParts.push(`${fieldBase}:>=${startTimestamp}`); // } // if (endDate) { // const endTimestamp = Math.floor(new Date(endDate).getTime() / 1000); // filterParts.push(`${fieldBase}:<=${endTimestamp}`); // } // } else if (fieldBase.toLowerCase().includes("amount")) { // // Handle amount ranges // const minAmount = (value as any).min_amount; // const maxAmount = (value as any).max_amount; // if (minAmount !== undefined) { // filterParts.push(`${fieldBase}:>=${minAmount}`); // } // if (maxAmount !== undefined) { // filterParts.push(`${fieldBase}:<=${maxAmount}`); // } // } else { // throw new Error(`Unsupported range filter field: ${fieldBase}`); // } // } else if (typeof value === "boolean") { // filterParts.push(`${key}:${value.toString().toLowerCase()}`); // } else if (typeof value === "string") { // filterParts.push(`${key}:${JSON.stringify(value).replace(/^"|"$/g, "")}`); // } else { // filterParts.push(`${key}:${value}`); // } // } // } // let filterBy = filterParts.length > 0 ? filterParts.join(" && ") : undefined; // filterBy = await updateTypesenseFilterWithCompanyImos(filterBy || ""); // // Set up query fields based on schema // const queryBy = "vesselName,accountDescription"; // const excludeFields = "embedding,_id,docId,fleetId,vesselId,fleetManagerId,technicalSuperintendentId"; // const query: any = { // q: query_text, // query_by: queryBy, // exclude_fields: excludeFields, // per_page: max_results // }; // if (filterBy) { // query.filter_by = filterBy; // } // if (sort_by !== "relevance") { // query.sort_by = `${sort_by}:${sort_order}`; // } // logger.debug(`[Typesense Query] ${JSON.stringify(query)}`); // const results = await this.typesenseClient.collections(collection).documents().search(query); // if (!results || !results.hits || results.hits.length === 0) { // return [{ // type: "text", // text: `No expense records found for query '${query_text}'.`, // title: "No Results Found", // format: "json" // }]; // } // // Format results using the utility function // const title = `Smart Expense Search Results for '${query_text}'`; // const linkHeader = `Smart expense search result for query: '${query_text}'`; // return await processTypesenseResults( // results, // "smart_expense_search", // title, // session_id, // linkHeader // ); // } catch (error: any) { // logger.error('Error performing smart expense search:', error); // return [{ // type: "text", // text: `Error performing search: ${error.message}`, // title: "Error", // format: "json" // }]; // } // } // private async listRecentVesselPurchaseRequisitions(arguments_: ToolArguments): Promise<ToolResponse> { // const imo = arguments_.imo; // const lookbackHours = arguments_.lookbackHours; // const per_page = arguments_.per_page || 250; // const session_id = arguments_.session_id || "testing"; // if (!imo || !lookbackHours) { // throw new Error("IMO number and lookback hours are required"); // } // try { // const startUtc = new Date(Date.now() - lookbackHours * 60 * 60 * 1000); // const startTs = Math.floor(startUtc.getTime() / 1000); // const collection = "purchase"; // const query = { // q: "*", // wildcard token // query_by: "vesselName", // any indexed string // filter_by: `imo:${imo} && purchaseRequisitionDate:>=${startTs}`, // per_page, // sort_by: "purchaseRequisitionDate:desc" // }; // // Execute the search // const results = await this.typesenseClient.collections(collection).documents().search(query); // if (!results || !results.hits || results.hits.length === 0) { // return [{ // type: "text", // text: `No recent purchase requisitions found for vessel with IMO ${imo} in the last ${lookbackHours} hours.`, // title: "No Purchase Requisitions Found", // format: "json" // }]; // } // // Get vessel name from the first hit for the title // const vesselName = results.hits[0]?.document?.vesselName || `IMO ${imo}`; // // Format results using the utility function // const title = `Recent Purchase Requisitions for ${vesselName} (Last ${lookbackHours} Hours)`; // const linkHeader = `Recent purchase requisitions for vessel ${vesselName} (IMO: ${imo}) in the last ${lookbackHours} hours`; // return await processTypesenseResults( // results, // "list_recent_vessel_purchase_requisitions", // title, // session_id, // linkHeader // ); // } catch (error: any) { // logger.error(`Error retrieving purchase requisitions for ${imo} in the last ${lookbackHours} hours:`, error); // return [{ // type: "text", // text: `Error retrieving purchase requisitions: ${error.message}`, // title: "Error", // format: "json" // }]; // } // } // private async getPurchaseRequisitionDetails(arguments_: ToolArguments): Promise<ToolResponse> { // const purchaseRequisitionNumber = arguments_.purchaseRequisitionNumber; // const per_page = arguments_.per_page || 250; // const session_id = arguments_.session_id || "testing"; // if (!purchaseRequisitionNumber) { // throw new Error("Purchase requisition number is required"); // } // try { // const collection = "purchase"; // let filterBy = `purchaseRequisitionNumber:${purchaseRequisitionNumber}`; // filterBy = await updateTypesenseFilterWithCompanyImos(filterBy || ""); // const query = { // q: "*", // filter_by: filterBy, // per_page // }; // const results = await this.typesenseClient.collections(collection).documents().search(query); // if (!results || !results.hits || results.hits.length === 0) { // return [{ // type: "text", // text: `No purchase requisition found with number ${purchaseRequisitionNumber}`, // title: "Purchase Requisition Not Found", // format: "json" // }]; // } // // Format results using the utility function // const title = `Purchase Requisition Details for ${purchaseRequisitionNumber}`; // const linkHeader = "purchase requisition details"; // return await processTypesenseResults( // results, // "get_purchase_requisition_details", // title, // session_id, // linkHeader // ); // } catch (error: any) { // logger.error(`Error retrieving purchase requisition details for ${purchaseRequisitionNumber}:`, error); // return [{ // type: "text", // text: `Error retrieving purchase requisition details: ${error.message}`, // title: "Error", // format: "json" // }]; // } // } // private async getPurchaseOrderDetails(arguments_: ToolArguments): Promise<ToolResponse> { // const purchaseOrderNumber = arguments_.orderId; // const per_page = arguments_.per_page || 250; // const session_id = arguments_.session_id || "testing"; // if (!purchaseOrderNumber) { // throw new Error("Purchase order number is required"); // } // try { // const collection = "purchase"; // let filterBy = `purchaseOrderNumber:${purchaseOrderNumber}`; // filterBy = await updateTypesenseFilterWithCompanyImos(filterBy); // const query = { // q: "*", // filter_by: filterBy, // per_page // }; // const results = await this.typesenseClient.collections(collection).documents().search(query); // if (!results || !results.hits || results.hits.length === 0) { // return [{ // type: "text", // text: `No purchase order found with number ${purchaseOrderNumber}`, // title: "Purchase Order Not Found", // format: "json" // }]; // } // // Format results using the utility function // const title = `Purchase order details for ${purchaseOrderNumber}`; // const linkHeader = "purchase order details"; // return await processTypesenseResults( // results, // "get_purchase_order_details", // title, // session_id, // linkHeader // ); // } catch (error: any) { // logger.error(`Error retrieving purchase order details for ${purchaseOrderNumber}:`, error); // throw new Error(`Error retrieving purchase order details: ${error.message}`); // } // } // private async listRequisitionsByStatus(arguments_: ToolArguments): Promise<ToolResponse> { // const purchaseRequisitionStatus = arguments_.status; // const imo = arguments_.imo; // const per_page = arguments_.limit || 250; // const session_id = arguments_.session_id || "testing"; // if (!purchaseRequisitionStatus || !imo) { // throw new Error("Purchase requisition status and imo number are required"); // } // try { // const collection = "purchase"; // const query = { // q: "*", // filter_by: `purchaseRequisitionStatus:${purchaseRequisitionStatus} && imo:${imo}`, // per_page // }; // const results = await this.typesenseClient.collections(collection).documents().search(query); // if (!results || !results.hits || results.hits.length === 0) { // return [{ // type: "text", // text: `No purchase requisitions found with status ${purchaseRequisitionStatus} for vessel ${imo}`, // title: "No Purchase Requisitions Found", // format: "json" // }]; // } // // Format results using the utility function // const title = `Purchase requisitions for ${imo} with status ${purchaseRequisitionStatus}`; // const linkHeader = `Purchase requisitions with status '${purchaseRequisitionStatus}' for vessel (IMO: ${imo})`; // return await processTypesenseResults( // results, // "list_requisitions_by_status", // title, // session_id, // linkHeader // ); // } catch (error: any) { // logger.error(`Error retrieving purchase requisitions for ${imo} with status ${purchaseRequisitionStatus}:`, error); // throw new Error(`Error retrieving purchase requisitions: ${error.message}`); // } // } // private async listOverdueOpenRequisitions(arguments_: ToolArguments): Promise<ToolResponse> { // const imo = arguments_.imo; // const daysOverdue = arguments_.daysOverdue; // const stage = arguments_.stage; // const per_page = arguments_.per_page || 250; // const session_id = arguments_.sessionId || arguments_.session_id || "testing"; // if (!imo || !daysOverdue || !stage) { // throw new Error("IMO number, days overdue, and stage are required"); // } // try { // // Calculate cutoff date based on days overdue // const cutoffDate = new Date(Date.now() - parseInt(daysOverdue.toString()) * 24 * 60 * 60 * 1000); // const cutoffTs = Math.floor(cutoffDate.getTime() / 1000); // const collection = "purchase"; // // Include fields as specified in the base URL // const include_fields = "imo,vesselName,purchaseRequisitionDate,purchaseRequisitionDescription," + // "purchaseRequisitionStatus,purchaseOrderAmount,purchaseOrderIssuedDate," + // "vendorOrsupplierName,invoiceStatus,invoiceValue,orderReadinessDate," + // "purchaseRequisitionNumber,purchaseRequisitionLink,purchaseOrderNumber," + // "purchaseOrderLink,purchaseRequisitionType,scanID,scanIDLink," + // "purchaseOrderStatus,poCreatedBy,orderType,invoiceApproverName," + // "forwarderName,forwarderRemarks,warehouseLocation,cargoType,weight," + // "purchaseRequisitionSummary,orderPriority,accountCode"; // const query = { // q: "*", // wildcard token // query_by: "vesselName", // any indexed string // filter_by: `imo:${imo} && purchaseOrderStage:${stage} && purchaseRequisitionDate:<${cutoffTs}`, // per_page, // sort_by: "purchaseRequisitionDate:asc", // oldest first // include_fields // }; // // Execute the search // logger.info(`Searching for overdue requisitions with params: ${JSON.stringify(query)}`); // const results = await this.typesenseClient.collections(collection).documents().search(query); // if (!results || !results.hits || results.hits.length === 0) { // return [{ // type: "text", // text: `No overdue ${stage} requisitions found for vessel ${imo} older than ${daysOverdue} days.`, // title: "No Overdue Requisitions Found", // format: "json" // }]; // } // // Format results using the utility function // const title = `Overdue ${stage} requisitions for vessel ${imo} older than ${daysOverdue} days`; // const linkHeader = `Overdue ${stage} requisitions for vessel ${imo} older than ${daysOverdue} days`; // return await processTypesenseResults( // results, // "list_overdue_open_requisitions", // title, // session_id, // linkHeader // ); // } catch (error: any) { // logger.error(`Error retrieving overdue requisitions for ${imo} with stage ${stage}:`, error); // return [{ // type: "text", // text: `Error retrieving overdue requisitions: ${error.message}`, // title: "Error", // format: "json" // }]; // } // } // private async listPurchaseOrdersByStatus(arguments_: ToolArguments): Promise<ToolResponse> { // const imo = arguments_.imo; // const purchaseOrderStatus = arguments_.status; // const per_page = arguments_.limit || 250; // const session_id = arguments_.session_id || "testing"; // if (!imo || !purchaseOrderStatus) { // throw new Error("IMO number and purchase order status are required"); // } // try { // const collection = "purchase"; // // Include fields as specified in the base URL // const include_fields = "imo,vesselName,purchaseRequisitionDate,purchaseRequisitionDescription," + // "purchaseRequisitionStatus,purchaseOrderAmount,purchaseOrderIssuedDate," + // "vendorOrsupplierName,invoiceStatus,invoiceValue,orderReadinessDate," + // "purchaseRequisitionNumber,purchaseRequisitionLink,purchaseOrderNumber," + // "purchaseOrderLink,purchaseRequisitionType,scanID,scanIDLink," + // "purchaseOrderStatus,poCreatedBy,orderType,invoiceApproverName," + // "forwarderName,forwarderRemarks,warehouseLocation,cargoType,weight," + // "purchaseRequisitionSummary,orderPriority,accountCode"; // const query = { // q: "*", // wildcard token // query_by: "vesselName", // any indexed string // filter_by: `imo:${imo} && purchaseOrderStatus:${purchaseOrderStatus}`, // per_page, // sort_by: "purchaseOrderIssuedDate:desc", // newest first // include_fields // }; // // Execute the search // logger.info(`Searching for purchase orders with status ${purchaseOrderStatus} for vessel ${imo}`); // const results = await this.typesenseClient.collections(collection).documents().search(query); // if (!results || !results.hits || results.hits.length === 0) { // return [{ // type: "text", // text: `No purchase orders found with status ${purchaseOrderStatus} for vessel ${imo}`, // title: "No Purchase Orders Found", // format: "json" // }]; // } // // Format results using the utility function // const title = `Purchase orders with status '${purchaseOrderStatus}' for vessel ${imo}`; // const linkHeader = "purchase orders by status"; // return await processTypesenseResults( // results, // "list_purchase_orders_by_status", // title, // session_id, // linkHeader // ); // } catch (error: any) { // logger.error(`Error retrieving purchase orders with status ${purchaseOrderStatus} for vessel ${imo}:`, error); // return [{ // type: "text", // text: `Error retrieving purchase orders: ${error.message}`, // title: "Error", // format: "json" // }]; // } // } // private async listRequisitionsByTypeAndStage(arguments_: ToolArguments): Promise<ToolResponse> { // const imo = arguments_.imo; // const requisitionType = arguments_.type; // const orderStage = arguments_.stage; // const vesselName = arguments_.vesselName; // const per_page = arguments_.limit || 250; // const session_id = arguments_.session_id || "testing"; // if (!imo || !requisitionType || !orderStage) { // throw new Error("IMO number, purchase requisition type, and purchase order stage are required"); // } // try { // const collection = "purchase"; // // Include fields as specified in the base URL // const include_fields = "imo,vesselName,purchaseRequisitionDate,purchaseRequisitionDescription," + // "purchaseRequisitionStatus,purchaseOrderAmount,purchaseOrderIssuedDate," + // "vendorOrsupplierName,invoiceStatus,invoiceValue,orderReadinessDate," + // "purchaseRequisitionNumber,purchaseRequisitionLink,purchaseOrderNumber," + // "purchaseOrderLink,purchaseRequisitionType,scanID,scanIDLink," + // "purchaseOrderStatus,poCreatedBy,orderType,invoiceApproverName," + // "forwarderName,forwarderRemarks,warehouseLocation,cargoType,weight," + // "purchaseRequisitionSummary,orderPriority,accountCode"; // // Build filter_by based on required and optional parameters // let filterBy = `imo:${imo} && purchaseRequisitionType:${requisitionType} && purchaseOrderStage:${orderStage}`; // // Add vessel name filter if provided // if (vesselName) { // filterBy += ` && vesselName:${vesselName}`; // } // const query = { // q: "*", // wildcard token // query_by: "vesselName", // any indexed string // filter_by: filterBy, // per_page, // sort_by: "purchaseRequisitionDate:desc", // newest first as specified // include_fields // }; // // Execute the search // logger.info(`Searching for requisitions of type ${requisitionType} in stage ${orderStage} for vessel ${imo}`); // const results = await this.typesenseClient.collections(collection).documents().search(query); // if (!results || !results.hits || results.hits.length === 0) { // return [{ // type: "text", // text: `No ${requisitionType} requisitions found in ${orderStage} stage for vessel ${imo}`, // title: "No Requisitions Found", // format: "json" // }]; // } // // Create descriptive title // let title = `${requisitionType} requisitions in ${orderStage} stage for vessel ${imo}`; // if (vesselName) { // title += ` (${vesselName})`; // } // // Format results using the utility function // const linkHeader = "requisitions by type and stage"; // return await processTypesenseResults( // results, // "list_requisitions_by_type_and_stage", // title, // session_id, // linkHeader // ); // } catch (error: any) { // logger.error(`Error retrieving requisitions of type ${requisitionType} in stage ${orderStage} for vessel ${imo}:`, error); // return [{ // type: "text", // text: `Error retrieving requisitions: ${error.message}`, // title: "Error", // format: "json" // }]; // } // } // private async listRecentRequisitionsByOrderPriority(arguments_: ToolArguments): Promise<ToolResponse> { // const imo = arguments_.imo; // const daysAgo = arguments_.daysAgo; // const orderPriority = arguments_.priority; // This is optional // const per_page = arguments_.limit || 250; // const session_id = arguments_.session_id || "testing"; // if (!imo || daysAgo === undefined) { // throw new Error("IMO number and days ago are required"); // } // try { // // Calculate cutoff date based on days ago // const cutoffDate = new Date(Date.now() - parseInt(daysAgo.toString()) * 24 * 60 * 60 * 1000); // const cutoffTs = Math.floor(cutoffDate.getTime() / 1000); // const collection = "purchase"; // // Include fields as specified in the base URL // const include_fields = "imo,vesselName,purchaseRequisitionDate,purchaseRequisitionDescription," + // "purchaseRequisitionStatus,purchaseOrderAmount,purchaseOrderIssuedDate," + // "vendorOrsupplierName,invoiceStatus,invoiceValue,orderReadinessDate," + // "purchaseRequisitionNumber,purchaseRequisitionLink,purchaseOrderNumber," + // "purchaseOrderLink,purchaseRequisitionType,scanID,scanIDLink," + // "purchaseOrderStatus,poCreatedBy,orderType,invoiceApproverName," + // "forwarderName,forwarderRemarks,warehouseLocation,cargoType,weight," + // "purchaseRequisitionSummary,orderPriority,accountCode"; // // Build filter_by based on required and optional parameters // let filterBy = `imo:${imo} && purchaseRequisitionDate:>=${cutoffTs}`; // // Add order priority filter if provided // if (orderPriority) { // filterBy += ` && orderPriority:${orderPriority}`; // } // const query = { // q: "*", // wildcard token // query_by: "vesselName", // any indexed string // filter_by: filterBy, // per_page, // sort_by: "purchaseRequisitionDate:desc", // newest first // include_fields // }; // // Execute the search // logger.info(`Searching for recent requisitions with params: ${JSON.stringify(query)}`); // const results = await this.typesenseClient.collections(collection).documents().search(query); // if (!results || !results.hits || results.hits.length === 0) { // let message = `No recent requisitions found for vessel ${imo} in the last ${daysAgo} days`; // if (orderPriority) { // message = `No ${orderPriority} priority ${message}`; // } // return [{ // type: "text", // text: message, // title: "No Requisitions Found", // format: "json" // }]; // } // // Create descriptive title // let title = `Recent requisitions for vessel ${imo} in the last ${daysAgo} days`; // if (orderPriority) { // title = `${orderPriority} priority ${title}`; // } // // Format results using the utility function // const linkHeader = "recent requisitions by order priority"; // const artifactTitle = `Recent ${orderPriority || ""} requisitions for vessel ${imo} from the last ${daysAgo} days`; // ret