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
JavaScript
// 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