From 0c5203af169b79970a68fc9ee1d07f4bfd0d0c4a Mon Sep 17 00:00:00 2001 From: Onat Buyukakkus <55088871+onbuyuka@users.noreply.github.com> Date: Thu, 4 Dec 2025 11:36:38 +0100 Subject: [PATCH 1/2] MCP query APIs --- .../App/src/APIFinCustLedgEntry.Query.al | 1 + .../App/src/APIFinDtldCustLedgEntry.Query.al | 1 + .../App/src/APIFinDtldVendLedgEntry.Query.al | 1 + .../App/src/APIFinVendLedgEntry.Query.al | 1 + .../App/src/APIFinanceGLBudgetEntry.Query.al | 1 + .../App/src/APIFinanceGLEntry.Query.al | 1 + .../App/Core/APIs/Dimensions.Query.al | 1 + .../APIs/DynamicDimensionsPBIAPI.Query.al | 1 + .../App/Core/APIs/ItemsPBIAPI.Query.al | 1 + .../APIs/PowerBIDimensionSetEntries.Query.al | 1 + .../App/Core/APIs/ResourcesPBIAPI.Query.al | 1 + .../Finance/APIs/AccountCategories.Query.al | 1 + .../APIs/CloseIncomeSourcePBIAPI.Query.al | 1 + .../APIs/CustomerLedgerEntries.Query.al | 1 + .../Finance/APIs/GLAccountCategories.Query.al | 1 + .../App/Finance/APIs/GLAccounts.Query.al | 1 + .../APIs/GLBudgetEntriesPBIAPI.Query.al | 1 + .../App/Finance/APIs/GLBudgets.Query.al | 1 + .../APIs/GLEntriesBalanceSheet.Query.al | 1 + .../APIs/GLIncomeStatementPBIAPI.Query.al | 1 + .../APIs/VendorLedgEntriesPBIAPI.Query.al | 1 + .../APIs/AssemblyHeadersOrder.Query.al | 1 + .../Inventory/APIs/AssemblyLinesItem.Query.al | 1 + .../App/Inventory/APIs/Bins.Query.al | 1 + .../APIs/ItemLedgerEntriesPBIAPI.Query.al | 1 + .../APIs/JobPlanningLinesItem.Query.al | 1 + .../APIs/PlanningComponents.Query.al | 1 + .../Inventory/APIs/ProdOrderCompInvt.Query.al | 1 + .../APIs/ProdOrderLinesInvt.Query.al | 1 + .../APIs/PurchaseLinesOutstanding.Query.al | 1 + .../Inventory/APIs/RequisitionLines.Query.al | 1 + .../APIs/SalesLinesOutstanding.Query.al | 1 + .../Inventory/APIs/ServiceLinesOrder.Query.al | 1 + .../App/Inventory/APIs/TransferLines.Query.al | 1 + .../Inventory/APIs/ValueEntriesItem.Query.al | 1 + .../APIs/WarehouseActivityLines.Query.al | 1 + .../Inventory/APIs/WarehouseEntries.Query.al | 1 + .../APIs/WhseJournalLinesFromBin.Query.al | 1 + .../APIs/WhseJournalLinesToBin.Query.al | 1 + .../App/Inventory/APIs/Zones.Query.al | 1 + .../APIs/CalendarEntries.Query.al | 1 + .../APIs/CapacityLedgerEntries.Query.al | 1 + .../APIs/InvAdjEntOrderPBIAPI.Query.al | 1 + .../APIs/ItemLedgerEntriesProd.Query.al | 1 + .../APIs/MachineCenters.Query.al | 1 + .../APIs/ManufValueEntriesPBIAPI.Query.al | 1 + .../APIs/ManufacturingSetupPBIAPI.Query.al | 1 + .../APIs/ProdOrderCapacityNeeds.Query.al | 1 + .../APIs/ProdOrderCompManuf.Query.al | 1 + .../APIs/ProdOrderLinesManuf.Query.al | 1 + .../APIs/ProdOrderRoutingLines.Query.al | 1 + .../APIs/ProdOrdersPBIAPI.Query.al | 1 + .../APIs/RoutingLinksPBIAPI.Query.al | 1 + .../APIs/RoutingsPBIAPI.Query.al | 1 + .../APIs/WorkCenterGroupsPBIAPI.Query.al | 1 + .../Manufacturing/APIs/WorkCenters.Query.al | 1 + .../APIs/JobLedgerEntriesPBIAPI.Query.al | 1 + .../Projects/APIs/JobPlanningLines.Query.al | 1 + .../App/Projects/APIs/JobTasks.Query.al | 1 + .../App/Projects/APIs/Jobs.Query.al | 1 + .../APIs/PurchLinesJobOutstanding.Query.al | 1 + .../APIs/PurchLinesJobReceived.Query.al | 1 + .../APIs/ItemBudgetEntriesPurch.Query.al | 1 + .../APIs/PurchLinesItemOutstd.Query.al | 1 + .../APIs/PurchLinesItemReceived.Query.al | 1 + .../APIs/PurchValueEntriesPBIAPI.Query.al | 1 + .../APIs/PurchaseCreditLines.Query.al | 1 + .../APIs/PurchaseInvoiceLines.Query.al | 1 + .../APIs/PurchaseLinesPBIAPI.Query.al | 1 + .../APIs/ItemBudgetEntriesSales.Query.al | 1 + .../App/Sales/APIs/ItemBudgetNames.Query.al | 1 + .../APIs/OpportunityEntriesPBIAPI.Query.al | 1 + .../App/Sales/APIs/OpportunityPBIAPI.Query.al | 1 + .../APIs/SalesCrProjectLedgerEntry.Query.al | 1 + .../APIs/SalesCreditLinesPBIAPI.Query.al | 1 + .../APIs/SalesInvProjectLedgerEntry.Query.al | 1 + .../APIs/SalesInvoiceLinesPBIAPI.Query.al | 1 + .../APIs/SalesLineItemOutstanding.Query.al | 1 + .../Sales/APIs/SalesLineItemShipped.Query.al | 1 + .../App/Sales/APIs/SalesLineV2PBIAPI.Query.al | 1 + .../APIs/SalesValueEntriesPBIAPI.Query.al | 1 + .../Finance/APIs/GLEntriesClosing.Query.al | 1 + .../APIs/GLEntriesIncomeStatement.Query.al | 1 + .../APIs/ValueEntriesPurch.Query.al | 1 + .../Sales/APIs/SalesLinePBIAPI.Query.al | 1 + .../Sales/APIs/ValueEntriesSales.Query.al | 1 + .../MCPConfigImplementation.Codeunit.al | 18 ++++++ .../Pages/MCPConfigToolList.Page.al | 3 +- .../Pages/MCPQueryConfigToolLookup.Page.al | 63 +++++++++++++++++++ 89 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 src/System Application/App/MCP/src/Configuration/Pages/MCPQueryConfigToolLookup.Page.al diff --git a/src/Apps/W1/APIReportsFinance/App/src/APIFinCustLedgEntry.Query.al b/src/Apps/W1/APIReportsFinance/App/src/APIFinCustLedgEntry.Query.al index 1ece7e5640..e7e545c050 100644 --- a/src/Apps/W1/APIReportsFinance/App/src/APIFinCustLedgEntry.Query.al +++ b/src/Apps/W1/APIReportsFinance/App/src/APIFinCustLedgEntry.Query.al @@ -5,6 +5,7 @@ using Microsoft.Sales.Receivables; query 30302 "API Fin - Cust Ledg Entry" { QueryType = API; + AboutText = 'Provides access to customer ledger entries including document types, amounts in local and foreign currencies, posting dates, and balancing account information. Enables external systems to retrieve receivables data for aging analysis, payment tracking, and customer account reconciliation.'; EntityCaption = 'Customer Ledger Entry'; EntityName = 'customerLedgerEntry'; EntitySetName = 'customerLedgerEntries'; diff --git a/src/Apps/W1/APIReportsFinance/App/src/APIFinDtldCustLedgEntry.Query.al b/src/Apps/W1/APIReportsFinance/App/src/APIFinDtldCustLedgEntry.Query.al index c92e1da479..a6a346d96c 100644 --- a/src/Apps/W1/APIReportsFinance/App/src/APIFinDtldCustLedgEntry.Query.al +++ b/src/Apps/W1/APIReportsFinance/App/src/APIFinDtldCustLedgEntry.Query.al @@ -5,6 +5,7 @@ using Microsoft.Sales.Receivables; query 30301 "API Fin - Dtld Cust Ledg Entry" { QueryType = API; + AboutText = 'Provides access to detailed customer ledger entries including entry types, amounts, currency codes, and dimension information. Enables external systems to retrieve granular receivables transaction data for payment analysis, customer account reconciliation, and detailed accounts receivable reporting.'; EntityCaption = 'Detailed Customer Ledger Entry'; EntityName = 'detailedCustomerLedgerEntry'; EntitySetName = 'detailedCustomerLedgerEntries'; diff --git a/src/Apps/W1/APIReportsFinance/App/src/APIFinDtldVendLedgEntry.Query.al b/src/Apps/W1/APIReportsFinance/App/src/APIFinDtldVendLedgEntry.Query.al index 6b2f0d5e65..557bb54288 100644 --- a/src/Apps/W1/APIReportsFinance/App/src/APIFinDtldVendLedgEntry.Query.al +++ b/src/Apps/W1/APIReportsFinance/App/src/APIFinDtldVendLedgEntry.Query.al @@ -5,6 +5,7 @@ using Microsoft.Purchases.Payables; query 30304 "API Fin - Dtld Vend Ledg Entry" { QueryType = API; + AboutText = 'Provides access to detailed vendor ledger entries including entry types, amounts, currency codes, and dimension information. Enables external systems to retrieve granular payables transaction data for payment analysis, vendor account reconciliation, and detailed accounts payable reporting.'; EntityCaption = 'Detailed Vendor Ledger Entry'; EntityName = 'detailedVendorLedgerEntry'; EntitySetName = 'detailedVendorLedgerEntries'; diff --git a/src/Apps/W1/APIReportsFinance/App/src/APIFinVendLedgEntry.Query.al b/src/Apps/W1/APIReportsFinance/App/src/APIFinVendLedgEntry.Query.al index bd9357a0b1..dbc2d900c7 100644 --- a/src/Apps/W1/APIReportsFinance/App/src/APIFinVendLedgEntry.Query.al +++ b/src/Apps/W1/APIReportsFinance/App/src/APIFinVendLedgEntry.Query.al @@ -5,6 +5,7 @@ using Microsoft.Purchases.Payables; query 30303 "API Fin - Vend Ledg Entry" { QueryType = API; + AboutText = 'Provides access to vendor ledger entries including document types, amounts in local and foreign currencies, posting dates, and balancing account information. Enables external systems to retrieve payables data for aging analysis, payment tracking, and vendor account reconciliation.'; EntityCaption = 'Vendor Ledger Entry'; EntityName = 'vendorLedgerEntry'; EntitySetName = 'vendorLedgerEntries'; diff --git a/src/Apps/W1/APIReportsFinance/App/src/APIFinanceGLBudgetEntry.Query.al b/src/Apps/W1/APIReportsFinance/App/src/APIFinanceGLBudgetEntry.Query.al index d295911d27..26b780bfb2 100644 --- a/src/Apps/W1/APIReportsFinance/App/src/APIFinanceGLBudgetEntry.Query.al +++ b/src/Apps/W1/APIReportsFinance/App/src/APIFinanceGLBudgetEntry.Query.al @@ -5,6 +5,7 @@ using Microsoft.Finance.GeneralLedger.Budget; query 30305 "API Finance - GL Budget Entry" { QueryType = API; + AboutText = 'Provides access to general ledger budget entries including budget names, amounts, dates, account numbers, and dimension codes. Enables external reporting and analytics tools to retrieve budget data for variance analysis, financial planning, and budget-to-actual comparisons.'; EntityCaption = 'General Budget Entry'; EntityName = 'generalLedgerBudgetEntry'; EntitySetName = 'generalLedgerBudgetEntries'; diff --git a/src/Apps/W1/APIReportsFinance/App/src/APIFinanceGLEntry.Query.al b/src/Apps/W1/APIReportsFinance/App/src/APIFinanceGLEntry.Query.al index 3f80dfcca9..c2b6c29928 100644 --- a/src/Apps/W1/APIReportsFinance/App/src/APIFinanceGLEntry.Query.al +++ b/src/Apps/W1/APIReportsFinance/App/src/APIFinanceGLEntry.Query.al @@ -5,6 +5,7 @@ using Microsoft.Finance.GeneralLedger.Ledger; query 30300 "API Finance - GL Entry" { QueryType = API; + AboutText = 'Provides access to general ledger entries including posting dates, account numbers, amounts, dimensions, and source information. Enables external reporting tools and analytics platforms to retrieve transaction-level financial data for reconciliation, audit trails, and financial statement preparation.'; EntityCaption = 'General Ledger Entry'; EntityName = 'generalLedgerEntry'; EntitySetName = 'generalLedgerEntries'; diff --git a/src/Apps/W1/PowerBIReports/App/Core/APIs/Dimensions.Query.al b/src/Apps/W1/PowerBIReports/App/Core/APIs/Dimensions.Query.al index 8ce3c099d9..6ffba9313e 100644 --- a/src/Apps/W1/PowerBIReports/App/Core/APIs/Dimensions.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Core/APIs/Dimensions.Query.al @@ -12,6 +12,7 @@ query 36952 Dimensions Access = Internal; Caption = 'Power BI Dimensions'; QueryType = API; + AboutText = 'Provides access to the eight global and shortcut dimension configurations from General Ledger Setup, including codes, names, and captions. Enables Power BI reports to retrieve dimension metadata for building dynamic dimension hierarchies and labeling in analytical reports.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Core/APIs/DynamicDimensionsPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Core/APIs/DynamicDimensionsPBIAPI.Query.al index 0be820fd2c..831355e6da 100644 --- a/src/Apps/W1/PowerBIReports/App/Core/APIs/DynamicDimensionsPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Core/APIs/DynamicDimensionsPBIAPI.Query.al @@ -9,6 +9,7 @@ using Microsoft.Finance.Dimension; query 37016 "Dynamic Dimensions - PBI API" { QueryType = API; + AboutText = 'Provides access to dimension set entries with dynamically resolved dimension codes, values, and names. Enables Power BI reports to retrieve flexible dimensional structures for custom analytics, supporting organizations with varying dimension configurations beyond the standard eight shortcut dimensions.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Core/APIs/ItemsPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Core/APIs/ItemsPBIAPI.Query.al index ecbb9d4f66..1a9541d7ae 100644 --- a/src/Apps/W1/PowerBIReports/App/Core/APIs/ItemsPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Core/APIs/ItemsPBIAPI.Query.al @@ -14,6 +14,7 @@ query 36953 "Items - PBI API" Access = Internal; Caption = 'Power BI Items'; QueryType = API; + AboutText = 'Provides access to item master data including descriptions, unit costs, posting groups, production BOMs, routings, and rolled-up cost components. Enables Power BI reports to analyze product catalogs, manufacturing costs, and inventory valuations for comprehensive item-based analytics and reporting.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Core/APIs/PowerBIDimensionSetEntries.Query.al b/src/Apps/W1/PowerBIReports/App/Core/APIs/PowerBIDimensionSetEntries.Query.al index 367e7892f7..2917422190 100644 --- a/src/Apps/W1/PowerBIReports/App/Core/APIs/PowerBIDimensionSetEntries.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Core/APIs/PowerBIDimensionSetEntries.Query.al @@ -9,6 +9,7 @@ query 36950 "PowerBI Dimension Set Entries" Access = Internal; Caption = 'Power BI Dimension Set Entries'; QueryType = API; + AboutText = 'Provides access to flattened dimension set entries with up to eight dimension value codes and names per set. Enables Power BI reports to efficiently join dimensional data with transactional records for multi-dimensional analysis, cost allocation reporting, and segment-based financial analytics.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Core/APIs/ResourcesPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Core/APIs/ResourcesPBIAPI.Query.al index 691b3df27c..a7a6e55546 100644 --- a/src/Apps/W1/PowerBIReports/App/Core/APIs/ResourcesPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Core/APIs/ResourcesPBIAPI.Query.al @@ -11,6 +11,7 @@ query 37070 "Resources - PBI API" Access = Internal; Caption = 'Power BI Resources'; QueryType = API; + AboutText = 'Provides access to resource master data including names, base units of measure, unit costs, and unit prices. Enables Power BI reports to analyze resource utilization, capacity planning, and project cost structures for service and project management analytics.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Finance/APIs/AccountCategories.Query.al b/src/Apps/W1/PowerBIReports/App/Finance/APIs/AccountCategories.Query.al index 5dbb46e3cb..ee2f517959 100644 --- a/src/Apps/W1/PowerBIReports/App/Finance/APIs/AccountCategories.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Finance/APIs/AccountCategories.Query.al @@ -8,6 +8,7 @@ query 36954 "Account Categories" { Access = Internal; QueryType = API; + AboutText = 'Provides access to account category mappings linking category types to G/L account category entry numbers. Enables Power BI reports to classify accounts by category type and build hierarchical financial report structures for standardized financial statement presentation.'; Caption = 'Power BI Account Categories'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Finance/APIs/CloseIncomeSourcePBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Finance/APIs/CloseIncomeSourcePBIAPI.Query.al index 167d799632..7883854f45 100644 --- a/src/Apps/W1/PowerBIReports/App/Finance/APIs/CloseIncomeSourcePBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Finance/APIs/CloseIncomeSourcePBIAPI.Query.al @@ -8,6 +8,7 @@ query 37013 "Close Income Source - PBI API" { Caption = 'Power BI Close Income Statement Source Code'; QueryType = API; + AboutText = 'Provides access to source codes used for closing income statement entries. Enables Power BI reports to identify and filter year-end closing transactions, ensuring accurate income statement reporting by excluding or separately analyzing fiscal year close entries.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Finance/APIs/CustomerLedgerEntries.Query.al b/src/Apps/W1/PowerBIReports/App/Finance/APIs/CustomerLedgerEntries.Query.al index 5fd17af80b..c3b8d6bc41 100644 --- a/src/Apps/W1/PowerBIReports/App/Finance/APIs/CustomerLedgerEntries.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Finance/APIs/CustomerLedgerEntries.Query.al @@ -11,6 +11,7 @@ query 36957 "Customer Ledger Entries" { Access = Internal; QueryType = API; + AboutText = 'Provides access to customer ledger entries with detailed entry information including due dates, amounts, payment terms, and application data. Enables Power BI reports to analyze accounts receivable aging, customer payment performance, and cash flow forecasting for receivables management dashboards.'; Caption = 'Power BI Customer Ledger Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLAccountCategories.Query.al b/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLAccountCategories.Query.al index 5ab2f5d49a..458b0a0fef 100644 --- a/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLAccountCategories.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLAccountCategories.Query.al @@ -10,6 +10,7 @@ query 36958 "G/L Account Categories" { Access = Internal; QueryType = API; + AboutText = 'Provides access to general ledger account category hierarchies including entry numbers, parent relationships, descriptions, and income/balance classifications. Enables Power BI reports to build financial statement structures, categorize accounts, and create hierarchical financial reports with proper subtotals and groupings.'; Caption = 'Power BI G/L Account Categories'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLAccounts.Query.al b/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLAccounts.Query.al index 4fa93889b0..17d8c1fbbb 100644 --- a/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLAccounts.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLAccounts.Query.al @@ -10,6 +10,7 @@ query 36959 "G/L Accounts" { Access = Internal; QueryType = API; + AboutText = 'Provides access to general ledger account master data including account numbers, names, types, income/balance classification, and hierarchy structure. Enables Power BI reports to build chart of accounts hierarchies, categorize financial data, and structure balance sheet and income statement reports.'; Caption = 'Power BI G/L Accounts'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLBudgetEntriesPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLBudgetEntriesPBIAPI.Query.al index 66d436a8da..579d80a228 100644 --- a/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLBudgetEntriesPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLBudgetEntriesPBIAPI.Query.al @@ -10,6 +10,7 @@ query 36960 "G/L Budget Entries - PBI API" { Access = Internal; QueryType = API; + AboutText = 'Provides access to general ledger budget entries including budget names, account numbers, dates, amounts, and dimension set IDs. Enables Power BI reports to analyze budgeted amounts, perform variance analysis against actuals, and create budget vs. actual financial dashboards.'; Caption = 'Power BI G/L Budget Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLBudgets.Query.al b/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLBudgets.Query.al index d7f8fdeb69..9b03032317 100644 --- a/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLBudgets.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLBudgets.Query.al @@ -10,6 +10,7 @@ query 36961 "G/L Budgets" { Access = Internal; QueryType = API; + AboutText = 'Provides access to general ledger budget names and descriptions. Enables Power BI reports to retrieve available budgets for filtering and selection in budget analysis, multi-budget comparisons, and financial planning dashboards.'; Caption = 'Power BI G/L Budgets'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLEntriesBalanceSheet.Query.al b/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLEntriesBalanceSheet.Query.al index a8f3f827e0..2b3e0ee655 100644 --- a/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLEntriesBalanceSheet.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLEntriesBalanceSheet.Query.al @@ -11,6 +11,7 @@ query 36955 "G\L Entries - Balance Sheet" { Access = Internal; QueryType = API; + AboutText = 'Provides access to general ledger entries for balance sheet accounts including assets, liabilities, and equity. Enables Power BI reports to analyze financial position, track account balances over time, and build balance sheet reports with dimensional breakdowns and source tracing.'; Caption = 'Power BI Balance Sheet G/L Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLIncomeStatementPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLIncomeStatementPBIAPI.Query.al index 5826e385c4..f7731ba716 100644 --- a/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLIncomeStatementPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Finance/APIs/GLIncomeStatementPBIAPI.Query.al @@ -11,6 +11,7 @@ query 37014 "G/L Income Statement - PBI API" { Access = Internal; QueryType = API; + AboutText = 'Provides access to general ledger entries for income statement accounts including revenues and expenses. Enables Power BI reports to analyze profitability, track revenue and cost trends over time, and build income statement reports with dimensional breakdowns for management reporting.'; Caption = 'Power BI G/L Entries Income Statement'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Finance/APIs/VendorLedgEntriesPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Finance/APIs/VendorLedgEntriesPBIAPI.Query.al index 079ffdc5ba..d88681f1b6 100644 --- a/src/Apps/W1/PowerBIReports/App/Finance/APIs/VendorLedgEntriesPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Finance/APIs/VendorLedgEntriesPBIAPI.Query.al @@ -11,6 +11,7 @@ query 36963 "Vendor Ledg. Entries - PBI API" { Access = Internal; QueryType = API; + AboutText = 'Provides access to vendor ledger entries with detailed entry information including due dates, amounts, payment terms, and application data. Enables Power BI reports to analyze accounts payable aging, vendor payment performance, and cash flow forecasting for payables management dashboards.'; Caption = 'Power BI Vendor Ledger Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/AssemblyHeadersOrder.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/AssemblyHeadersOrder.Query.al index 932f99e52c..e66487be46 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/AssemblyHeadersOrder.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/AssemblyHeadersOrder.Query.al @@ -11,6 +11,7 @@ query 36964 "Assembly Headers - Order" Access = Internal; Caption = 'Power BI Assembly Headers'; QueryType = API; + AboutText = 'Provides access to assembly order header data including item numbers, quantities, remaining quantities, due dates, and status. Enables Power BI reports to track assembly order progress, analyze assembly-to-order demand, and monitor production scheduling for inventory planning.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/AssemblyLinesItem.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/AssemblyLinesItem.Query.al index f333d3110a..4244168016 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/AssemblyLinesItem.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/AssemblyLinesItem.Query.al @@ -11,6 +11,7 @@ query 36965 "Assembly Lines - Item" Access = Internal; Caption = 'Power BI Assembly Lines'; QueryType = API; + AboutText = 'Provides access to assembly order line data for item components including item numbers, remaining quantities, due dates, and locations. Enables Power BI reports to analyze component requirements, track assembly material consumption, and forecast component demand for inventory planning.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/Bins.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/Bins.Query.al index 327e4df5da..634ac27d6c 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/Bins.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/Bins.Query.al @@ -11,6 +11,7 @@ query 36966 Bins Access = Internal; Caption = 'Power BI Bins'; QueryType = API; + AboutText = 'Provides access to warehouse bin master data including codes, descriptions, locations, bin types, and zone assignments. Enables Power BI reports to analyze warehouse storage structure, bin utilization, and location layouts for warehouse management analytics.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ItemLedgerEntriesPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ItemLedgerEntriesPBIAPI.Query.al index 0fac3675b0..cd12e94783 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ItemLedgerEntriesPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ItemLedgerEntriesPBIAPI.Query.al @@ -11,6 +11,7 @@ query 36968 "Item Ledger Entries - PBI API" Access = Internal; Caption = 'Power BI Item Ledger Entries'; QueryType = API; + AboutText = 'Provides access to item ledger entries including entry types, quantities, costs, locations, serial and lot numbers, and posting dates. Enables Power BI reports to analyze inventory movements, track stock levels, and perform inventory valuation and turnover analysis.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/JobPlanningLinesItem.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/JobPlanningLinesItem.Query.al index ce6d7d80ed..4e4e1a5a4b 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/JobPlanningLinesItem.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/JobPlanningLinesItem.Query.al @@ -11,6 +11,7 @@ query 36969 "Job Planning Lines - Item" Access = Internal; Caption = 'Power BI Project Planning Lines'; QueryType = API; + AboutText = 'Provides access to project planning lines for items with order status, including remaining quantities, planning dates, and locations. Enables Power BI reports to analyze project material requirements and forecast inventory demand from project activities.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/PlanningComponents.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/PlanningComponents.Query.al index 7ceab9847e..af588db8e3 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/PlanningComponents.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/PlanningComponents.Query.al @@ -11,6 +11,7 @@ query 36970 "Planning Components" Access = Internal; Caption = 'Power BI Planning Component Lines'; QueryType = API; + AboutText = 'Provides access to planning component data including item numbers, expected quantities, due dates, and locations. Enables Power BI reports to analyze material planning requirements and forecast component demand from planning worksheets.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ProdOrderCompInvt.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ProdOrderCompInvt.Query.al index 4f6d78259f..df15909b4b 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ProdOrderCompInvt.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ProdOrderCompInvt.Query.al @@ -14,6 +14,7 @@ query 36971 "Prod. Order Comp. - Invt." Access = Internal; Caption = 'Power BI Qty. on Component Lines'; QueryType = API; + AboutText = 'Provides access to production order component data including item numbers, remaining quantities, due dates, and locations for planned to released orders. Enables Power BI reports to analyze production material requirements and component consumption for inventory availability planning.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ProdOrderLinesInvt.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ProdOrderLinesInvt.Query.al index b2cc5c4349..9547d69e7f 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ProdOrderLinesInvt.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ProdOrderLinesInvt.Query.al @@ -14,6 +14,7 @@ query 36972 "Prod. Order Lines - Invt." Access = Internal; Caption = 'Power BI Qty. on Production Orders'; QueryType = API; + AboutText = 'Provides access to production order line data including item numbers, remaining quantities, due dates, and starting dates for planned to released orders. Enables Power BI reports to analyze production output schedules and forecast inventory receipts from manufacturing.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/PurchaseLinesOutstanding.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/PurchaseLinesOutstanding.Query.al index 6d3f5c0f34..30ed63c762 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/PurchaseLinesOutstanding.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/PurchaseLinesOutstanding.Query.al @@ -11,6 +11,7 @@ query 36973 "Purchase Lines - Outstanding" Access = Internal; Caption = 'Power BI Purchase Lines'; QueryType = API; + AboutText = 'Provides access to outstanding purchase order and return order lines for items including quantities, expected receipt dates, and vendors. Enables Power BI reports to analyze pending purchase receipts and forecast inventory replenishment from purchase orders.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/RequisitionLines.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/RequisitionLines.Query.al index c169a69484..5a1178bcc3 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/RequisitionLines.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/RequisitionLines.Query.al @@ -11,6 +11,7 @@ query 36974 "Requisition Lines" Access = Internal; Caption = 'Power BI Requisition Lines'; QueryType = API; + AboutText = 'Provides access to requisition worksheet lines including item numbers, replenishment systems, quantities, and planning dates. Enables Power BI reports to analyze planned supply from requisition worksheets and forecast inventory replenishment from planning activities.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/SalesLinesOutstanding.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/SalesLinesOutstanding.Query.al index 20f632aad4..7f38a2992f 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/SalesLinesOutstanding.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/SalesLinesOutstanding.Query.al @@ -11,6 +11,7 @@ query 36975 "Sales Lines - Outstanding" Access = Internal; Caption = 'Power BI Sales Lines'; QueryType = API; + AboutText = 'Provides access to outstanding sales order and return order lines for items including quantities, shipment dates, and customers. Enables Power BI reports to analyze pending sales demand and forecast inventory requirements for sales fulfillment.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ServiceLinesOrder.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ServiceLinesOrder.Query.al index f8842a34bf..fab07a39cb 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ServiceLinesOrder.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ServiceLinesOrder.Query.al @@ -11,6 +11,7 @@ query 36976 "Service Lines - Order" Access = Internal; Caption = 'Power BI Qty. on Service Lines'; QueryType = API; + AboutText = 'Provides access to service order lines for items including outstanding quantities, needed-by dates, and locations. Enables Power BI reports to analyze service demand and forecast inventory requirements for service order fulfillment.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/TransferLines.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/TransferLines.Query.al index ca12225ec5..cccb226019 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/TransferLines.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/TransferLines.Query.al @@ -11,6 +11,7 @@ query 36977 "Transfer Lines" Access = Internal; Caption = 'Power BI Qty. on Transfer Lines'; QueryType = API; + AboutText = 'Provides access to transfer order line data including in-transit quantities, outstanding quantities, shipment and receipt dates, and location codes. Enables Power BI reports to track inventory in transit and analyze inter-location stock movements for logistics planning.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ValueEntriesItem.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ValueEntriesItem.Query.al index 1d6166c4fb..acf1f75582 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ValueEntriesItem.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/ValueEntriesItem.Query.al @@ -11,6 +11,7 @@ query 36967 "Value Entries - Item" Access = Internal; Caption = 'Power BI Inventory Value'; QueryType = API; + AboutText = 'Provides access to item value entries including actual and expected costs, cost posted to G/L, valuation dates, and entry types. Enables Power BI reports to analyze inventory valuation, cost of goods sold, and inventory value reconciliation with the general ledger.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WarehouseActivityLines.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WarehouseActivityLines.Query.al index 37b1b52bd4..ba2d60218e 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WarehouseActivityLines.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WarehouseActivityLines.Query.al @@ -11,6 +11,7 @@ query 36978 "Warehouse Activity Lines" Access = Internal; Caption = 'Power BI Warehouse Activity Lines'; QueryType = API; + AboutText = 'Provides access to warehouse activity lines for take and place actions including quantities, bins, items, and tracking information. Enables Power BI reports to analyze warehouse pick and put-away activities, workload distribution, and operational efficiency metrics.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WarehouseEntries.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WarehouseEntries.Query.al index a341ff4683..f686668a7d 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WarehouseEntries.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WarehouseEntries.Query.al @@ -11,6 +11,7 @@ query 36979 "Warehouse Entries" Access = Internal; Caption = 'Power BI Warehouse Entries'; QueryType = API; + AboutText = 'Provides access to warehouse entry data including item quantities by bin, zone, location, and lot/serial numbers. Enables Power BI reports to analyze bin-level inventory, warehouse stock distribution, and detailed storage location utilization.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WhseJournalLinesFromBin.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WhseJournalLinesFromBin.Query.al index 0714a01993..f76182f204 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WhseJournalLinesFromBin.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WhseJournalLinesFromBin.Query.al @@ -11,6 +11,7 @@ query 36980 "Whse. Journal Lines - From Bin" Access = Internal; Caption = 'Power BI From Bin Warehouse Journal Lines'; QueryType = API; + AboutText = 'Provides access to warehouse journal lines with source bin information including item quantities, bin codes, zones, and tracking numbers. Enables Power BI reports to analyze pending warehouse movements from source bins for warehouse planning and reconciliation.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WhseJournalLinesToBin.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WhseJournalLinesToBin.Query.al index b327c85d07..0e316649df 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WhseJournalLinesToBin.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/WhseJournalLinesToBin.Query.al @@ -11,6 +11,7 @@ query 36981 "Whse. Journal Lines - To Bin" Access = Internal; Caption = 'Power BI To Bin Warehouse Journal Lines'; QueryType = API; + AboutText = 'Provides access to warehouse journal lines with destination bin information including item quantities, bin codes, zones, and tracking numbers. Enables Power BI reports to analyze pending warehouse movements to destination bins for warehouse planning and reconciliation.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/Zones.Query.al b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/Zones.Query.al index ce4daf1a36..f704118791 100644 --- a/src/Apps/W1/PowerBIReports/App/Inventory/APIs/Zones.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Inventory/APIs/Zones.Query.al @@ -11,6 +11,7 @@ query 36982 Zones Access = Internal; Caption = 'Power BI Zones'; QueryType = API; + AboutText = 'Provides access to warehouse zone master data including codes, descriptions, locations, and bin type codes. Enables Power BI reports to analyze warehouse zone layouts, storage area classifications, and zone-based inventory distribution for warehouse management analytics.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/CalendarEntries.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/CalendarEntries.Query.al index 504b568dc1..a8da143a9c 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/CalendarEntries.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/CalendarEntries.Query.al @@ -14,6 +14,7 @@ query 36983 "Calendar Entries" Access = Internal; Caption = 'Power BI Calendar Entries'; QueryType = API; + AboutText = 'Provides access to shop calendar entries including capacity types, effective and total capacity, work center groups, and work shifts by date. Enables Power BI reports to analyze available production capacity, capacity utilization, and scheduling constraints for manufacturing planning.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/CapacityLedgerEntries.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/CapacityLedgerEntries.Query.al index b394cfeb81..0258e86a10 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/CapacityLedgerEntries.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/CapacityLedgerEntries.Query.al @@ -14,6 +14,7 @@ query 36984 "Capacity Ledger Entries" Access = Internal; Caption = 'Power BI Capacity Ledger Entries'; QueryType = API; + AboutText = 'Provides access to capacity ledger entries including setup time, run time, stop time, output quantities, scrap, and costs. Enables Power BI reports to analyze production efficiency, labor and machine utilization, and manufacturing cost variances.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/InvAdjEntOrderPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/InvAdjEntOrderPBIAPI.Query.al index 9759937044..4f02a66e5e 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/InvAdjEntOrderPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/InvAdjEntOrderPBIAPI.Query.al @@ -14,6 +14,7 @@ query 37020 "Inv. Adj. Ent Order - PBI API" Access = Internal; Caption = 'Power BI Inventory Adjustment Entry Order'; QueryType = API; + AboutText = 'Provides access to inventory adjustment entries for production orders including single-level cost breakdowns for materials, capacity, subcontracting, and overhead. Enables Power BI reports to analyze production order costing, cost component analysis, and manufacturing variance reporting.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ItemLedgerEntriesProd.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ItemLedgerEntriesProd.Query.al index ff6b79ff89..4f542b7539 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ItemLedgerEntriesProd.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ItemLedgerEntriesProd.Query.al @@ -15,6 +15,7 @@ query 36986 "Item Ledger Entries - Prod." Access = Internal; Caption = 'Power BI Prod. Item Ledger Entries'; QueryType = API; + AboutText = 'Provides access to item ledger entries for production orders including consumption and output entries, quantities, costs, and locations. Enables Power BI reports to analyze production material consumption, output tracking, and manufacturing inventory movements.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/MachineCenters.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/MachineCenters.Query.al index b23a89a9de..62a5b33aef 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/MachineCenters.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/MachineCenters.Query.al @@ -14,6 +14,7 @@ query 36985 "Machine Centers" Access = Internal; Caption = 'Power BI Machine Centers'; QueryType = API; + AboutText = 'Provides access to machine center master data including numbers, names, and associated work center assignments. Enables Power BI reports to analyze machine utilization, build capacity hierarchies, and track production resources for manufacturing capacity planning.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ManufValueEntriesPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ManufValueEntriesPBIAPI.Query.al index 517fe60fbd..af5adebeee 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ManufValueEntriesPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ManufValueEntriesPBIAPI.Query.al @@ -14,6 +14,7 @@ query 37011 "Manuf. Value Entries - PBI API" Access = Internal; Caption = 'Power BI Manufacturing Value Entries'; QueryType = API; + AboutText = 'Provides access to value entries for production orders including actual and expected costs, cost posted to G/L, and cost components by type. Enables Power BI reports to analyze production costs, WIP valuation, and manufacturing cost variances at the transaction level.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ManufacturingSetupPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ManufacturingSetupPBIAPI.Query.al index 879eaf6f4d..d0258d071c 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ManufacturingSetupPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ManufacturingSetupPBIAPI.Query.al @@ -14,6 +14,7 @@ query 37007 "Manufacturing Setup - PBI API" Access = Internal; Caption = 'Power BI Manufacturing Setup'; QueryType = API; + AboutText = 'Provides access to manufacturing setup configuration including capacity unit of measure settings. Enables Power BI reports to retrieve capacity display preferences for consistent unit formatting in manufacturing analytics and capacity reports.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderCapacityNeeds.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderCapacityNeeds.Query.al index bc4f55f6af..ec22fb4cd3 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderCapacityNeeds.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderCapacityNeeds.Query.al @@ -14,6 +14,7 @@ query 36987 "Prod. Order Capacity Needs" Access = Internal; Caption = 'Power BI Production Order Capacity Need'; QueryType = API; + AboutText = 'Provides access to production order capacity requirements including allocated and needed time by work center, operation, and date. Enables Power BI reports to analyze capacity load, identify bottlenecks, and support production scheduling optimization.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderCompManuf.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderCompManuf.Query.al index b547e32d94..33138e7ae0 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderCompManuf.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderCompManuf.Query.al @@ -15,6 +15,7 @@ query 36988 "Prod. Order Comp. - Manuf." Access = Internal; Caption = 'Power BI Production Order Components'; QueryType = API; + AboutText = 'Provides access to production order component data including expected and remaining quantities, costs, routing links, and due dates. Enables Power BI reports to analyze material requirements, component availability, and flushing method effectiveness for production planning.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderLinesManuf.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderLinesManuf.Query.al index ffc4088253..f123d822f1 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderLinesManuf.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderLinesManuf.Query.al @@ -15,6 +15,7 @@ query 36989 "Prod. Order Lines - Manuf." Access = Internal; Caption = 'Power BI Production Order Lines'; QueryType = API; + AboutText = 'Provides access to production order line data including quantities, finished quantities, due dates, routings, and cost parameters. Enables Power BI reports to analyze production order progress, output tracking, and manufacturing performance metrics.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderRoutingLines.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderRoutingLines.Query.al index 4084b349d6..59ef6d4b93 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderRoutingLines.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrderRoutingLines.Query.al @@ -15,6 +15,7 @@ query 36990 "Prod. Order Routing Lines" Access = Internal; Caption = 'Power BI Production Order Routing Lines'; QueryType = API; + AboutText = 'Provides access to production order routing line data including capacity needs, operation costs, setup/run/wait/move times, and scheduling dates. Enables Power BI reports to analyze routing efficiency, operation costs, and production scheduling performance.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrdersPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrdersPBIAPI.Query.al index b478e2d0de..2547aa5877 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrdersPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/ProdOrdersPBIAPI.Query.al @@ -14,6 +14,7 @@ query 37008 "Prod. Orders - PBI API" Access = Internal; Caption = 'Power BI Production Orders'; QueryType = API; + AboutText = 'Provides access to production order header data including status, source information, routing numbers, quantities, and scheduling dates. Enables Power BI reports to analyze production order status, track order lifecycle, and monitor manufacturing workload by status category.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/RoutingLinksPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/RoutingLinksPBIAPI.Query.al index 380b70ac8a..5877e44825 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/RoutingLinksPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/RoutingLinksPBIAPI.Query.al @@ -14,6 +14,7 @@ query 37009 "Routing Links - PBI API" Access = Internal; Caption = 'Power BI Routing Links'; QueryType = API; + AboutText = 'Provides access to routing link master data including codes and descriptions. Routing links connect production BOM components to specific routing operations. Enables Power BI reports to analyze component-to-operation relationships and flushing sequences.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/RoutingsPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/RoutingsPBIAPI.Query.al index 81c08a8e6e..9ae949c200 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/RoutingsPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/RoutingsPBIAPI.Query.al @@ -14,6 +14,7 @@ query 37010 "Routings - PBI API" Access = Internal; Caption = 'Power BI Routings'; QueryType = API; + AboutText = 'Provides access to routing header master data including routing type, status, and description. Enables Power BI reports to list manufacturing routings and filter production data by routing characteristics.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/WorkCenterGroupsPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/WorkCenterGroupsPBIAPI.Query.al index c2bfa38d9b..07ec49ec64 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/WorkCenterGroupsPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/WorkCenterGroupsPBIAPI.Query.al @@ -14,6 +14,7 @@ query 37012 "Work Center Groups - PBI API" Access = Internal; Caption = 'Power BI Work Center Groups'; QueryType = API; + AboutText = 'Provides access to work center group master data including codes and names. Work center groups organize work centers for aggregate capacity planning and reporting. Enables Power BI reports to analyze capacity utilization at the group level.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/WorkCenters.Query.al b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/WorkCenters.Query.al index 82f2e40d63..ed0b45dbe2 100644 --- a/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/WorkCenters.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Manufacturing/APIs/WorkCenters.Query.al @@ -14,6 +14,7 @@ query 36991 "Work Centers" Access = Internal; Caption = 'Power BI Work Centers'; QueryType = API; + AboutText = 'Provides access to work center master data including work center group assignments, subcontractor relationships, and unit of measure configurations. Enables Power BI reports to analyze capacity by work center and support work center hierarchical reporting.'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; ApiVersion = 'v0.5', 'v1.0'; diff --git a/src/Apps/W1/PowerBIReports/App/Projects/APIs/JobLedgerEntriesPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Projects/APIs/JobLedgerEntriesPBIAPI.Query.al index 06d423f834..dd4935755b 100644 --- a/src/Apps/W1/PowerBIReports/App/Projects/APIs/JobLedgerEntriesPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Projects/APIs/JobLedgerEntriesPBIAPI.Query.al @@ -10,6 +10,7 @@ query 36992 "Job Ledger Entries - PBI API" { Access = Internal; QueryType = API; + AboutText = 'Provides access to project ledger entries including posted costs, prices, quantities, entry types, and dimension data. Enables Power BI reports to analyze project profitability, cost tracking, and actual vs. budget performance at the transaction level.'; Caption = 'Power BI Project Ledger Entry'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Projects/APIs/JobPlanningLines.Query.al b/src/Apps/W1/PowerBIReports/App/Projects/APIs/JobPlanningLines.Query.al index 6b03348f65..137fbd1573 100644 --- a/src/Apps/W1/PowerBIReports/App/Projects/APIs/JobPlanningLines.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Projects/APIs/JobPlanningLines.Query.al @@ -10,6 +10,7 @@ query 36993 "Job Planning Lines" { Access = Internal; QueryType = API; + AboutText = 'Provides access to project planning line data including planned quantities, costs, prices, line types, and planning dates. Enables Power BI reports to analyze project budgets, resource planning, and schedule forecasts by task and line type.'; Caption = 'Power BI Project Planning Line'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Projects/APIs/JobTasks.Query.al b/src/Apps/W1/PowerBIReports/App/Projects/APIs/JobTasks.Query.al index 8680c20703..8787535f34 100644 --- a/src/Apps/W1/PowerBIReports/App/Projects/APIs/JobTasks.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Projects/APIs/JobTasks.Query.al @@ -10,6 +10,7 @@ query 36994 "Job Tasks" { Access = Internal; QueryType = API; + AboutText = 'Provides access to project task data including task hierarchy, task types, totaling definitions, and scheduled dates. Enables Power BI reports to analyze project work breakdown structures and support task-level reporting and filtering.'; Caption = 'Power BI Project Tasks'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Projects/APIs/Jobs.Query.al b/src/Apps/W1/PowerBIReports/App/Projects/APIs/Jobs.Query.al index 129e7417b1..4f5923ab07 100644 --- a/src/Apps/W1/PowerBIReports/App/Projects/APIs/Jobs.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Projects/APIs/Jobs.Query.al @@ -10,6 +10,7 @@ query 36995 Jobs { Access = Internal; QueryType = API; + AboutText = 'Provides access to project header master data including status, dates, customer billing information, project manager, and completion status. Enables Power BI reports to list and filter projects by various attributes and analyze project lifecycle metrics.'; Caption = 'Power BI Project'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Projects/APIs/PurchLinesJobOutstanding.Query.al b/src/Apps/W1/PowerBIReports/App/Projects/APIs/PurchLinesJobOutstanding.Query.al index 0b86311508..9d1c72a8ae 100644 --- a/src/Apps/W1/PowerBIReports/App/Projects/APIs/PurchLinesJobOutstanding.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Projects/APIs/PurchLinesJobOutstanding.Query.al @@ -10,6 +10,7 @@ query 36996 "Purch. Lines - Job Outstanding" { Access = Internal; QueryType = API; + AboutText = 'Provides access to outstanding purchase order lines linked to projects including quantities not yet received and outstanding amounts. Enables Power BI reports to analyze committed project costs and track purchase order delivery expectations.'; Caption = 'Power BI Outstanding PO Line'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Projects/APIs/PurchLinesJobReceived.Query.al b/src/Apps/W1/PowerBIReports/App/Projects/APIs/PurchLinesJobReceived.Query.al index 52a295838b..fc91991421 100644 --- a/src/Apps/W1/PowerBIReports/App/Projects/APIs/PurchLinesJobReceived.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Projects/APIs/PurchLinesJobReceived.Query.al @@ -10,6 +10,7 @@ query 36997 "Purch. Lines - Job Received" { Access = Internal; QueryType = API; + AboutText = 'Provides access to purchase order lines linked to projects that have been received but not yet invoiced. Enables Power BI reports to analyze project accruals, pending invoices, and goods-received-not-invoiced values by project and task.'; Caption = 'Power BI Received Not Invoiced PO Line'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/ItemBudgetEntriesPurch.Query.al b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/ItemBudgetEntriesPurch.Query.al index 7dee27b1ae..0c44364189 100644 --- a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/ItemBudgetEntriesPurch.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/ItemBudgetEntriesPurch.Query.al @@ -10,6 +10,7 @@ query 36999 "Item Budget Entries - Purch." { Access = Internal; QueryType = API; + AboutText = 'Provides access to purchase item budget entries including budgeted quantities, costs, and dimension data. Enables Power BI reports to analyze planned purchasing volumes and costs for budget vs. actual comparisons and procurement planning.'; Caption = 'Power BI Purch. Item Budget Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchLinesItemOutstd.Query.al b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchLinesItemOutstd.Query.al index fa969b8a79..9871594a6d 100644 --- a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchLinesItemOutstd.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchLinesItemOutstd.Query.al @@ -10,6 +10,7 @@ query 36998 "Purch. Lines - Item Outstd." { Access = Internal; QueryType = API; + AboutText = 'Provides access to outstanding purchase order lines for items including quantities not yet received and outstanding amounts. Enables Power BI reports to analyze purchase order backlog, expected inventory receipts, and vendor delivery performance.'; Caption = 'Power BI Outstanding PO'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchLinesItemReceived.Query.al b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchLinesItemReceived.Query.al index 30c56f999a..bc75ed41e1 100644 --- a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchLinesItemReceived.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchLinesItemReceived.Query.al @@ -10,6 +10,7 @@ query 37001 "Purch. Lines - Item Received" { Access = Internal; QueryType = API; + AboutText = 'Provides access to purchase order lines for items received but not yet invoiced including quantities and amounts pending invoicing. Enables Power BI reports to analyze goods-received-not-invoiced accruals and pending vendor invoices.'; Caption = 'Power BI Received Not Invd. PO'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchValueEntriesPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchValueEntriesPBIAPI.Query.al index 2e58dfad2f..dcbf3f19e0 100644 --- a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchValueEntriesPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchValueEntriesPBIAPI.Query.al @@ -10,6 +10,7 @@ query 37023 "Purch. Value Entries - PBI API" { Access = Internal; QueryType = API; + AboutText = 'Provides access to purchase value entries including cost amounts, invoiced quantities, return reasons, and linked item ledger entries. Enables Power BI reports to analyze purchase cost components, adjustments, and discount amounts at the transaction level.'; Caption = 'Power BI Purchase Value Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchaseCreditLines.Query.al b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchaseCreditLines.Query.al index 5e121b98b4..a0becfa1cf 100644 --- a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchaseCreditLines.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchaseCreditLines.Query.al @@ -10,6 +10,7 @@ query 37108 "Purchase Credit Lines" { Access = Internal; QueryType = API; + AboutText = 'Provides access to posted purchase credit memo lines for G/L account and resource types including amounts, quantities, return reasons, and dimension data. Enables Power BI reports to analyze purchase returns, adjustments, and credit memo trends.'; Caption = 'Power BI Purchase Credit Memo Lines'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchaseInvoiceLines.Query.al b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchaseInvoiceLines.Query.al index 0eccb3bc9b..cc313dfc7e 100644 --- a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchaseInvoiceLines.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchaseInvoiceLines.Query.al @@ -10,6 +10,7 @@ query 37107 "Purchase Invoice Lines" { Access = Internal; QueryType = API; + AboutText = 'Provides access to posted purchase invoice lines for G/L account and resource types including amounts, quantities, unit costs, and dimension data. Enables Power BI reports to analyze purchasing spend by G/L account and resource.'; Caption = 'Power BI Purchase Invoice Lines'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchaseLinesPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchaseLinesPBIAPI.Query.al index d64b95410b..dba09b1c3c 100644 --- a/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchaseLinesPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Purchasing/APIs/PurchaseLinesPBIAPI.Query.al @@ -10,6 +10,7 @@ query 37073 "Purchase Lines - PBI API" { Access = Internal; QueryType = API; + AboutText = 'Provides access to open purchase document lines with header data including quantities, amounts, receipt dates, prepayments, and received-not-invoiced values. Enables Power BI reports to analyze purchasing pipeline, vendor commitments, and document status.'; Caption = 'Power BI Purchase Lines'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Sales/APIs/ItemBudgetEntriesSales.Query.al b/src/Apps/W1/PowerBIReports/App/Sales/APIs/ItemBudgetEntriesSales.Query.al index a1c9848941..c3917c5eb1 100644 --- a/src/Apps/W1/PowerBIReports/App/Sales/APIs/ItemBudgetEntriesSales.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Sales/APIs/ItemBudgetEntriesSales.Query.al @@ -10,6 +10,7 @@ query 37004 "Item Budget Entries - Sales" { Access = Internal; QueryType = API; + AboutText = 'Provides access to sales item budget entries including budgeted quantities, sales amounts, and dimension data. Enables Power BI reports to analyze sales forecasts, budget vs. actual comparisons, and sales planning by item, location, and customer.'; Caption = 'Power BI Sales Item Budget Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Sales/APIs/ItemBudgetNames.Query.al b/src/Apps/W1/PowerBIReports/App/Sales/APIs/ItemBudgetNames.Query.al index c389969369..6bc9584b7f 100644 --- a/src/Apps/W1/PowerBIReports/App/Sales/APIs/ItemBudgetNames.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Sales/APIs/ItemBudgetNames.Query.al @@ -10,6 +10,7 @@ query 37002 "Item Budget Names" { Access = Internal; QueryType = API; + AboutText = 'Provides access to item budget names and descriptions for sales and purchase analysis areas. Enables Power BI reports to list available budgets and filter budget entries by budget name.'; Caption = 'Power BI Item Budgets'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Sales/APIs/OpportunityEntriesPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Sales/APIs/OpportunityEntriesPBIAPI.Query.al index e40e8a54ea..ee1dd5d4b4 100644 --- a/src/Apps/W1/PowerBIReports/App/Sales/APIs/OpportunityEntriesPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Sales/APIs/OpportunityEntriesPBIAPI.Query.al @@ -10,6 +10,7 @@ query 37018 "Opportunity Entries - PBI API" { Access = Internal; QueryType = API; + AboutText = 'Provides access to CRM opportunity entries including sales cycle stages, estimated values, probabilities, and completion metrics. Enables Power BI reports to analyze sales pipeline progression, conversion rates, and opportunity history over time.'; Caption = 'Power BI Opportunity Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Sales/APIs/OpportunityPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Sales/APIs/OpportunityPBIAPI.Query.al index 05debbf8e9..73086fd690 100644 --- a/src/Apps/W1/PowerBIReports/App/Sales/APIs/OpportunityPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Sales/APIs/OpportunityPBIAPI.Query.al @@ -10,6 +10,7 @@ query 37017 "Opportunity - PBI API" { Access = Internal; QueryType = API; + AboutText = 'Provides access to CRM opportunity master data including status, sales cycle, priority, campaign, and linked sales documents. Enables Power BI reports to analyze opportunity inventory, conversion success, and campaign effectiveness.'; Caption = 'Power BI Opportunity'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesCrProjectLedgerEntry.Query.al b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesCrProjectLedgerEntry.Query.al index e8d551f64b..6f50b8c48a 100644 --- a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesCrProjectLedgerEntry.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesCrProjectLedgerEntry.Query.al @@ -11,6 +11,7 @@ query 37071 "Sales Cr Project Ledger Entry" { Access = Internal; QueryType = API; + AboutText = 'Provides access to project ledger entries linked to sales credit memos including item sales returns with prices, costs, and dimension data. Enables Power BI reports to analyze project-related sales returns and credit adjustments.'; Caption = 'Power BI Sales Cr. Project Ledger Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesCreditLinesPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesCreditLinesPBIAPI.Query.al index 299d932524..0e7871e9d6 100644 --- a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesCreditLinesPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesCreditLinesPBIAPI.Query.al @@ -10,6 +10,7 @@ query 37109 "Sales Credit Lines - PBI API" { Access = Internal; QueryType = API; + AboutText = 'Provides access to posted sales credit memo lines for G/L account and resource types including amounts, quantities, return reasons, and dimension data. Enables Power BI reports to analyze sales returns, adjustments, and credit memo trends by customer and salesperson.'; Caption = 'Power BI Sales Credit Lines'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesInvProjectLedgerEntry.Query.al b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesInvProjectLedgerEntry.Query.al index 1d63b79ecb..efc449e3b8 100644 --- a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesInvProjectLedgerEntry.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesInvProjectLedgerEntry.Query.al @@ -11,6 +11,7 @@ query 37110 "Sales Inv Project Ledger Entry" { Access = Internal; QueryType = API; + AboutText = 'Provides access to project ledger entries linked to sales invoices including item sales with prices, costs, and dimension data. Enables Power BI reports to analyze project-related sales revenue and profitability by customer and salesperson.'; Caption = 'Power BI Sales Inv. Project Ledger Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesInvoiceLinesPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesInvoiceLinesPBIAPI.Query.al index 4500cd2c14..bca865d7ee 100644 --- a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesInvoiceLinesPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesInvoiceLinesPBIAPI.Query.al @@ -10,6 +10,7 @@ query 37074 "Sales Invoice Lines - PBI API" { Access = Internal; QueryType = API; + AboutText = 'Provides access to posted sales invoice lines for G/L account and resource types including amounts, quantities, unit costs, and dimension data. Enables Power BI reports to analyze non-item sales revenue by account and resource category.'; Caption = 'Power BI Sales Invoice Lines'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesLineItemOutstanding.Query.al b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesLineItemOutstanding.Query.al index aeae249e74..25315d25cc 100644 --- a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesLineItemOutstanding.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesLineItemOutstanding.Query.al @@ -10,6 +10,7 @@ query 37003 "Sales Line - Item Outstanding" { Access = Internal; QueryType = API; + AboutText = 'Provides access to outstanding sales order lines for items including quantities not yet shipped and outstanding amounts. Enables Power BI reports to analyze sales order backlog, pending shipments, and customer demand fulfillment.'; Caption = 'Power BI Outstanding SO'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesLineItemShipped.Query.al b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesLineItemShipped.Query.al index 17c84d09ff..b4c3312c0e 100644 --- a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesLineItemShipped.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesLineItemShipped.Query.al @@ -10,6 +10,7 @@ query 37006 "Sales Line - Item Shipped" { Access = Internal; QueryType = API; + AboutText = 'Provides access to sales order lines for items shipped but not yet invoiced including quantities and amounts pending invoicing. Enables Power BI reports to analyze shipped-not-invoiced accruals and revenue recognition timing.'; Caption = 'Power BI Shipped Not Invd. SO'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesLineV2PBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesLineV2PBIAPI.Query.al index 17c9751187..79f1597a6d 100644 --- a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesLineV2PBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesLineV2PBIAPI.Query.al @@ -10,6 +10,7 @@ query 37024 "Sales Line V2 - PBI API" { Access = Internal; QueryType = API; + AboutText = 'Provides access to open sales document lines with header data including quantities, amounts, delivery dates, shipping status, and return information. Enables Power BI reports to analyze sales pipeline, delivery performance, and document status across quotes, orders, and returns.'; Caption = 'Power BI Sales Lines'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesValueEntriesPBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesValueEntriesPBIAPI.Query.al index 7007dc22b5..649caeb976 100644 --- a/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesValueEntriesPBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/Sales/APIs/SalesValueEntriesPBIAPI.Query.al @@ -10,6 +10,7 @@ query 37025 "Sales Value Entries - PBI API" { Access = Internal; QueryType = API; + AboutText = 'Provides access to sales value entries including actual sales amounts, cost amounts, invoiced quantities, and linked item ledger entries. Enables Power BI reports to analyze sales profitability, cost components, and margin analysis at the transaction level.'; Caption = 'Power BI Sales Value Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/_Obsolete/Finance/APIs/GLEntriesClosing.Query.al b/src/Apps/W1/PowerBIReports/App/_Obsolete/Finance/APIs/GLEntriesClosing.Query.al index f7abf71c8a..166b73c1a9 100644 --- a/src/Apps/W1/PowerBIReports/App/_Obsolete/Finance/APIs/GLEntriesClosing.Query.al +++ b/src/Apps/W1/PowerBIReports/App/_Obsolete/Finance/APIs/GLEntriesClosing.Query.al @@ -12,6 +12,7 @@ query 36956 "G/L Entries - Closing" { Access = Internal; QueryType = API; + AboutText = 'Provides access to closing G/L entries with income or balance sheet classification. This API has been replaced by G/L Entries Balance Sheet and Income Statement queries.'; Caption = 'Power BI Closing G/L Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/_Obsolete/Finance/APIs/GLEntriesIncomeStatement.Query.al b/src/Apps/W1/PowerBIReports/App/_Obsolete/Finance/APIs/GLEntriesIncomeStatement.Query.al index 7a3c888cc8..8e85bec30d 100644 --- a/src/Apps/W1/PowerBIReports/App/_Obsolete/Finance/APIs/GLEntriesIncomeStatement.Query.al +++ b/src/Apps/W1/PowerBIReports/App/_Obsolete/Finance/APIs/GLEntriesIncomeStatement.Query.al @@ -12,6 +12,7 @@ query 36962 "G/L Entries - Income Statement" { Access = Internal; QueryType = API; + AboutText = 'Provides access to G/L entries for income statement accounts including amounts, posting dates, and dimension data. This API has been replaced by the G/L Income Statement - PBI API query.'; Caption = 'Power BI Income Stmt. G/L Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/_Obsolete/Purchasing/APIs/ValueEntriesPurch.Query.al b/src/Apps/W1/PowerBIReports/App/_Obsolete/Purchasing/APIs/ValueEntriesPurch.Query.al index b0d535bc28..50c9fd2059 100644 --- a/src/Apps/W1/PowerBIReports/App/_Obsolete/Purchasing/APIs/ValueEntriesPurch.Query.al +++ b/src/Apps/W1/PowerBIReports/App/_Obsolete/Purchasing/APIs/ValueEntriesPurch.Query.al @@ -11,6 +11,7 @@ query 37000 "Value Entries - Purch." { Access = Internal; QueryType = API; + AboutText = 'Provides access to purchase value entries for item purchases including cost amounts, invoiced quantities, and dimension data. This API has been replaced by query 37023 Purch. Value Entries - PBI API.'; Caption = 'Power BI Purchase Value Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/_Obsolete/Sales/APIs/SalesLinePBIAPI.Query.al b/src/Apps/W1/PowerBIReports/App/_Obsolete/Sales/APIs/SalesLinePBIAPI.Query.al index 3d6336b817..d3a01230e1 100644 --- a/src/Apps/W1/PowerBIReports/App/_Obsolete/Sales/APIs/SalesLinePBIAPI.Query.al +++ b/src/Apps/W1/PowerBIReports/App/_Obsolete/Sales/APIs/SalesLinePBIAPI.Query.al @@ -11,6 +11,7 @@ query 37019 "Sales Line - PBI API" { Access = Internal; QueryType = API; + AboutText = 'Provides access to open sales document lines for items including quantities, amounts, and delivery dates. This API has been replaced by query 37024 Sales Line V2 - PBI API.'; Caption = 'Power BI Sales Lines'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/Apps/W1/PowerBIReports/App/_Obsolete/Sales/APIs/ValueEntriesSales.Query.al b/src/Apps/W1/PowerBIReports/App/_Obsolete/Sales/APIs/ValueEntriesSales.Query.al index 7bc8454a45..d38dd889cc 100644 --- a/src/Apps/W1/PowerBIReports/App/_Obsolete/Sales/APIs/ValueEntriesSales.Query.al +++ b/src/Apps/W1/PowerBIReports/App/_Obsolete/Sales/APIs/ValueEntriesSales.Query.al @@ -11,6 +11,7 @@ query 37005 "Value Entries - Sales" { Access = Internal; QueryType = API; + AboutText = 'Provides access to sales value entries including sales amounts, cost amounts, and invoiced quantities. This API has been replaced by query 37025 Sales Value Entries - PBI API.'; Caption = 'Power BI Sales Value Entries'; APIPublisher = 'microsoft'; APIGroup = 'analytics'; diff --git a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigImplementation.Codeunit.al b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigImplementation.Codeunit.al index 4a748d2855..8f20bfbdfa 100644 --- a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigImplementation.Codeunit.al +++ b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigImplementation.Codeunit.al @@ -359,6 +359,24 @@ codeunit 8351 "MCP Config Implementation" exit(true); end; + internal procedure LookupQueryTools(var QueryMetadata: Record "Query Metadata"): Boolean + var + MCPQueryConfigToolLookup: Page "MCP Query Config Tool Lookup"; + begin + QueryMetadata.SetFilter(EntityName, '<>%1', ''); + QueryMetadata.SetFilter("AL Namespace", '<>%1', 'Microsoft.API.V1'); + QueryMetadata.SetFilter(ID, '<>%1&<>%2', 5480, 5481); // Exclude beta customer and vendor queries from Base Application, as they are already part of API v2.0 + + // MCPQueryConfigToolLookup.LookupMode := true; + MCPQueryConfigToolLookup.SetTableView(QueryMetadata); + MCPQueryConfigToolLookup.Run(); + // if MCPQueryConfigToolLookup.RunModal() <> Action::LookupOK then + // exit(false); + + MCPQueryConfigToolLookup.SetSelectionFilter(QueryMetadata); + exit(true); + end; + internal procedure GetAPIPublishers(var MCPAPIPublisherGroup: Record "MCP API Publisher Group") var PageMetadata: Record "Page Metadata"; diff --git a/src/System Application/App/MCP/src/Configuration/Pages/MCPConfigToolList.Page.al b/src/System Application/App/MCP/src/Configuration/Pages/MCPConfigToolList.Page.al index d385bce2df..4cd1c35024 100644 --- a/src/System Application/App/MCP/src/Configuration/Pages/MCPConfigToolList.Page.al +++ b/src/System Application/App/MCP/src/Configuration/Pages/MCPConfigToolList.Page.al @@ -34,8 +34,9 @@ page 8352 "MCP Config Tool List" trigger OnLookup(var Text: Text): Boolean var PageMetadata: Record "Page Metadata"; + QueryMetadata: Record "Query Metadata"; begin - if not MCPConfigImplementation.LookupAPITools(PageMetadata) then + if not MCPConfigImplementation.LookupQueryTools(QueryMetadata) then exit; if not PageMetadata.FindSet() then diff --git a/src/System Application/App/MCP/src/Configuration/Pages/MCPQueryConfigToolLookup.Page.al b/src/System Application/App/MCP/src/Configuration/Pages/MCPQueryConfigToolLookup.Page.al new file mode 100644 index 0000000000..b84968bf14 --- /dev/null +++ b/src/System Application/App/MCP/src/Configuration/Pages/MCPQueryConfigToolLookup.Page.al @@ -0,0 +1,63 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.MCP; + +using System.Reflection; + +page 8357 "MCP Query Config Tool Lookup" +{ + PageType = List; + ApplicationArea = All; + SourceTable = "Query Metadata"; + Caption = 'MCP Query API Tools'; + Extensible = false; + Editable = false; + InsertAllowed = false; + ModifyAllowed = false; + DeleteAllowed = false; + InherentEntitlements = X; + InherentPermissions = X; + + layout + { + area(Content) + { + repeater(Control1) + { + field(ID; Rec.ID) + { + Caption = 'ID'; + ToolTip = 'Specifies the unique identifier for the query API page.'; + } + field(Name; Rec.Name) + { + Caption = 'Name'; + ToolTip = 'Specifies the name of the query API page.'; + } + field(EntityName; Rec.EntityName) + { + Caption = 'Entity Name'; + ToolTip = 'Specifies the entity name of the query API page.'; + } + field(APIPublisher; Rec.APIPublisher) + { + Caption = 'API Publisher'; + ToolTip = 'Specifies the API publisher of the query API page.'; + } + field(APIGroup; Rec.APIGroup) + { + Caption = 'API Group'; + ToolTip = 'Specifies the API group of the query API page.'; + } + field(APIVersion; Rec.APIVersion) + { + Caption = 'API Version'; + ToolTip = 'Specifies the API version of the query API page.'; + } + } + } + } +} \ No newline at end of file From 0e6df53be07841f43351170a06c586d1f1720f7c Mon Sep 17 00:00:00 2001 From: Onat Buyukakkus <55088871+onbuyuka@users.noreply.github.com> Date: Fri, 13 Feb 2026 17:52:21 +0100 Subject: [PATCH 2/2] Introduce query API tools --- .../Codeunits/MCPConfig.Codeunit.al | 36 ++- .../MCPConfigImplementation.Codeunit.al | 216 ++++++++++++++--- .../MCPConfigMissingObject.Codeunit.al | 7 +- .../MCPConfigMissingParent.Codeunit.al | 5 +- .../MCPConfigMissingReadTool.Codeunit.al | 1 + .../Codeunits/MCPUpgrade.Codeunit.al | 2 +- .../Pages/MCPConfigToolList.Page.al | 115 ++++++--- .../Pages/MCPQueryConfigToolLookup.Page.al | 14 +- .../Test Library/MCP/app.json | 2 +- .../MCP/src/MCPConfigTestLibrary.Codeunit.al | 13 +- .../MCP/src/MockAPIQuery.Query.al | 30 +++ .../Test/MCP/src/MCPConfigTest.Codeunit.al | 220 +++++++++++++++++- 12 files changed, 580 insertions(+), 81 deletions(-) create mode 100644 src/System Application/Test Library/MCP/src/MockAPIQuery.Query.al diff --git a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfig.Codeunit.al b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfig.Codeunit.al index d6ae1dc9eb..f7040a5393 100644 --- a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfig.Codeunit.al +++ b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfig.Codeunit.al @@ -126,7 +126,7 @@ codeunit 8350 "MCP Config" /// The SystemId (GUID) of the created tool. procedure CreateAPITool(ConfigId: Guid; APIPageId: Integer): Guid begin - exit(MCPConfigImplementation.CreateAPITool(ConfigId, APIPageId, true)); + exit(MCPConfigImplementation.CreateAPIPageTool(ConfigId, APIPageId, true)); end; /// @@ -138,19 +138,47 @@ codeunit 8350 "MCP Config" /// The SystemId (GUID) of the created tool. procedure CreateAPITool(ConfigId: Guid; APIPageId: Integer; ValidateAPIPublisher: Boolean): Guid begin - exit(MCPConfigImplementation.CreateAPITool(ConfigId, APIPageId, ValidateAPIPublisher)); + exit(MCPConfigImplementation.CreateAPIPageTool(ConfigId, APIPageId, ValidateAPIPublisher)); end; /// - /// Retrieves the SystemId (GUID) of a tool by its configuration ID and API page + /// Creates a new API tool for the specified configuration and query. + /// + /// The SystemId (GUID) of the configuration. + /// The ID of the query. + /// The SystemId (GUID) of the created tool. + procedure CreateQueryAPITool(ConfigId: Guid; QueryId: Integer): Guid + begin + exit(MCPConfigImplementation.CreateAPIQueryTool(ConfigId, QueryId)); + end; + + /// + /// Retrieves the SystemId (GUID) of a tool by its configuration ID, object ID and object type. + /// + /// The SystemId (GUID) of the configuration. + /// The ID of the API page or query. + /// The object type (Page or Query). + /// The SystemId (GUID) of the tool if found; otherwise, an empty GUID. + procedure GetAPIToolId(ConfigId: Guid; ObjectId: Integer; ObjectType: Option): Guid + begin + exit(MCPConfigImplementation.GetAPIToolId(ConfigId, ObjectId, ObjectType)); + end; + +#if not CLEAN28 + /// + /// Retrieves the SystemId (GUID) of a tool by its configuration ID and API page. /// /// The SystemId (GUID) of the configuration. /// The ID of the API page. /// The SystemId (GUID) of the tool if found; otherwise, an empty GUID. + [Obsolete('Use GetAPIToolId with ObjectType parameter instead.', '28.0')] procedure GetAPIToolId(ConfigId: Guid; APIPageId: Integer): Guid + var + MCPConfigurationTool: Record "MCP Configuration Tool"; begin - exit(MCPConfigImplementation.GetAPIToolId(ConfigId, APIPageId)); + exit(MCPConfigImplementation.GetAPIToolId(ConfigId, APIPageId, MCPConfigurationTool."Object Type"::Page)); end; +#endif /// /// Deletes the specified tool from the configuration. diff --git a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigImplementation.Codeunit.al b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigImplementation.Codeunit.al index c925c4cf4f..6f3e08a7dd 100644 --- a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigImplementation.Codeunit.al +++ b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigImplementation.Codeunit.al @@ -27,8 +27,10 @@ codeunit 8351 "MCP Config Implementation" CreateUpdateDeleteNotAllowedErr: Label 'Create, update and delete tools are not allowed for this MCP configuration.'; ToolsCannotBeAddedToDefaultConfigErr: Label 'Tools cannot be added to the default configuration.'; PageNotFoundErr: Label 'Page not found.'; + QueryNotFoundErr: Label 'Query not found.'; InvalidPageTypeErr: Label 'Only API pages are supported.'; - InvalidAPIVersionErr: Label 'Only API v2.0 pages are supported.'; + InvalidQueryTypeErr: Label 'Only API queries are supported.'; + InvalidAPIVersionErr: Label 'Only API v2.0 objects are supported.'; DefaultMCPConfigurationDescriptionLbl: Label 'Default MCP configuration'; DynamicToolModeRequiredErr: Label 'Dynamic tool mode needs to be enabled to discover read-only objects.'; VersionNotValidErr: Label 'The API version is not valid for the selected tool.'; @@ -115,6 +117,7 @@ codeunit 8351 "MCP Config Implementation" var MCPConfigurationTool: Record "MCP Configuration Tool"; begin + MCPConfigurationTool.SetRange("Object Type", MCPConfigurationTool."Object Type"::Page); MCPConfigurationTool.SetRange(ID, ConfigId); if MCPConfigurationTool.IsEmpty() then exit; @@ -349,7 +352,7 @@ codeunit 8351 "MCP Config Implementation" #endregion #region Tools - internal procedure CreateAPITool(ConfigId: Guid; APIPageId: Integer; ValidateAPIPublisher: Boolean): Guid + internal procedure CreateAPIPageTool(ConfigId: Guid; APIPageId: Integer; ValidateAPIPublisher: Boolean): Guid var MCPConfiguration: Record "MCP Configuration"; MCPConfigurationTool: Record "MCP Configuration Tool"; @@ -361,28 +364,51 @@ codeunit 8351 "MCP Config Implementation" if IsDefaultConfiguration(MCPConfiguration) then Error(ToolsCannotBeAddedToDefaultConfigErr); - PageMetadata := ValidateAPITool(APIPageId, ValidateAPIPublisher); + PageMetadata := ValidateAPIPageTool(APIPageId, ValidateAPIPublisher); MCPConfigurationTool.ID := ConfigId; MCPConfigurationTool."Object Type" := MCPConfigurationTool."Object Type"::Page; MCPConfigurationTool."Object ID" := APIPageId; MCPConfigurationTool."Allow Read" := true; - MCPConfigurationTool."API Version" := GetHighestAPIVersion(PageMetadata); + MCPConfigurationTool."API Version" := GetHighestAPIPageVersion(PageMetadata); MCPConfigurationTool.Insert(); exit(MCPConfigurationTool.SystemId); end; - internal procedure GetAPIToolId(ConfigId: Guid; APIPageId: Integer): Guid + internal procedure GetAPIToolId(ConfigId: Guid; ObjectId: Integer; ObjectType: Option): Guid var MCPConfigurationTool: Record "MCP Configuration Tool"; EmptyGuid: Guid; begin - if MCPConfigurationTool.Get(ConfigId, MCPConfigurationTool."Object Type"::Page, APIPageId) then + if MCPConfigurationTool.Get(ConfigId, ObjectType, ObjectId) then exit(MCPConfigurationTool.SystemId); exit(EmptyGuid); end; + internal procedure CreateAPIQueryTool(ConfigId: Guid; QueryAPIId: Integer): Guid + var + MCPConfiguration: Record "MCP Configuration"; + MCPConfigurationTool: Record "MCP Configuration Tool"; + QueryMetadata: Record "Query Metadata"; + begin + if not MCPConfiguration.GetBySystemId(ConfigId) then + exit; + + if IsDefaultConfiguration(MCPConfiguration) then + Error(ToolsCannotBeAddedToDefaultConfigErr); + + QueryMetadata := ValidateAPIQueryTool(QueryAPIId); + + MCPConfigurationTool.ID := ConfigId; + MCPConfigurationTool."Object Type" := MCPConfigurationTool."Object Type"::Query; + MCPConfigurationTool."Object ID" := QueryAPIId; + MCPConfigurationTool."Allow Read" := true; + MCPConfigurationTool."API Version" := GetHighestAPIQueryVersion(QueryMetadata); + MCPConfigurationTool.Insert(); + exit(MCPConfigurationTool.SystemId); + end; + internal procedure DeleteTool(ToolId: Guid) var MCPConfigurationTool: Record "MCP Configuration Tool"; @@ -411,6 +437,9 @@ codeunit 8351 "MCP Config Implementation" if not MCPConfigurationTool.GetBySystemId(ToolId) then exit; + if MCPConfigurationTool."Object Type" = MCPConfigurationTool."Object Type"::Query then + exit; // Create is not applicable for query tools + if Allow then CheckAllowCreateUpdateDeleteTools(MCPConfigurationTool.ID); @@ -425,6 +454,9 @@ codeunit 8351 "MCP Config Implementation" if not MCPConfigurationTool.GetBySystemId(ToolId) then exit; + if MCPConfigurationTool."Object Type" = MCPConfigurationTool."Object Type"::Query then + exit; // Modify is not applicable for query tools + if Allow then CheckAllowCreateUpdateDeleteTools(MCPConfigurationTool.ID); @@ -439,6 +471,9 @@ codeunit 8351 "MCP Config Implementation" if not MCPConfigurationTool.GetBySystemId(ToolId) then exit; + if MCPConfigurationTool."Object Type" = MCPConfigurationTool."Object Type"::Query then + exit; // Delete is not applicable for query tools + if Allow then CheckAllowCreateUpdateDeleteTools(MCPConfigurationTool.ID); @@ -453,6 +488,9 @@ codeunit 8351 "MCP Config Implementation" if not MCPConfigurationTool.GetBySystemId(ToolId) then exit; + if MCPConfigurationTool."Object Type" = MCPConfigurationTool."Object Type"::Query then + exit; // Bound actions is not applicable for query tools + if Allow then CheckAllowCreateUpdateDeleteTools(MCPConfigurationTool.ID); @@ -460,7 +498,7 @@ codeunit 8351 "MCP Config Implementation" MCPConfigurationTool.Modify(); end; - internal procedure LookupAPITools(var PageMetadata: Record "Page Metadata"): Boolean + internal procedure LookupAPIPageTools(var PageMetadata: Record "Page Metadata"): Boolean var MCPAPIConfigToolLookup: Page "MCP API Config Tool Lookup"; begin @@ -477,7 +515,7 @@ codeunit 8351 "MCP Config Implementation" exit(true); end; - internal procedure LookupQueryTools(var QueryMetadata: Record "Query Metadata"): Boolean + internal procedure LookupAPIQueryTools(var QueryMetadata: Record "Query Metadata"): Boolean var MCPQueryConfigToolLookup: Page "MCP Query Config Tool Lookup"; begin @@ -485,17 +523,22 @@ codeunit 8351 "MCP Config Implementation" QueryMetadata.SetFilter("AL Namespace", '<>%1', 'Microsoft.API.V1'); QueryMetadata.SetFilter(ID, '<>%1&<>%2', 5480, 5481); // Exclude beta customer and vendor queries from Base Application, as they are already part of API v2.0 - // MCPQueryConfigToolLookup.LookupMode := true; + MCPQueryConfigToolLookup.LookupMode := true; MCPQueryConfigToolLookup.SetTableView(QueryMetadata); - MCPQueryConfigToolLookup.Run(); - // if MCPQueryConfigToolLookup.RunModal() <> Action::LookupOK then - // exit(false); + if MCPQueryConfigToolLookup.RunModal() <> Action::LookupOK then + exit(false); MCPQueryConfigToolLookup.SetSelectionFilter(QueryMetadata); exit(true); end; internal procedure GetAPIPublishers(var MCPAPIPublisherGroup: Record "MCP API Publisher Group") + begin + GetAPIPagePublishers(MCPAPIPublisherGroup); + GetAPIQueryPublishers(MCPAPIPublisherGroup); + end; + + local procedure GetAPIPagePublishers(var MCPAPIPublisherGroup: Record "MCP API Publisher Group") var PageMetadata: Record "Page Metadata"; begin @@ -514,6 +557,25 @@ codeunit 8351 "MCP Config Implementation" until PageMetadata.Next() = 0; end; + local procedure GetAPIQueryPublishers(var MCPAPIPublisherGroup: Record "MCP API Publisher Group") + var + QueryMetadata: Record "Query Metadata"; + begin + QueryMetadata.SetLoadFields(EntityName, APIPublisher, APIGroup); + QueryMetadata.SetFilter(EntityName, '<>%1', ''); + QueryMetadata.SetFilter(APIPublisher, '<>%1&<>%2', '', 'microsoft'); + if not QueryMetadata.FindSet() then + exit; + + repeat + if MCPAPIPublisherGroup.Get(QueryMetadata.APIPublisher, QueryMetadata.APIGroup) then + continue; + MCPAPIPublisherGroup."API Publisher" := QueryMetadata.APIPublisher; + MCPAPIPublisherGroup."API Group" := QueryMetadata.APIGroup; + MCPAPIPublisherGroup.Insert(); + until QueryMetadata.Next() = 0; + end; + internal procedure LookupAPIPublisher(var MCPAPIPublisherGroup: Record "MCP API Publisher Group"; var APIPublisher: Text; var APIGroup: Text) begin if Page.RunModal(Page::"MCP API Publisher Lookup", MCPAPIPublisherGroup) = Action::LookupOK then begin @@ -532,7 +594,7 @@ codeunit 8351 "MCP Config Implementation" APIGroup := MCPAPIPublisherGroup."API Group"; end; - internal procedure ValidateAPITool(PageId: Integer; ValidateAPIPublisher: Boolean): Record "Page Metadata" + internal procedure ValidateAPIPageTool(PageId: Integer; ValidateAPIPublisher: Boolean): Record "Page Metadata" var PageMetadata: Record "Page Metadata"; begin @@ -554,9 +616,24 @@ codeunit 8351 "MCP Config Implementation" exit(PageMetadata); end; + internal procedure ValidateAPIQueryTool(QueryId: Integer): Record "Query Metadata" + var + QueryMetadata: Record "Query Metadata"; + begin + if not QueryMetadata.Get(QueryId) then + Error(QueryNotFoundErr); + + if QueryMetadata.EntityName = '' then + Error(InvalidQueryTypeErr); + + if QueryMetadata."AL Namespace" = 'Microsoft.API.V1' then + Error(InvalidAPIVersionErr); + + exit(QueryMetadata); + end; + internal procedure AddToolsByAPIGroup(ConfigId: Guid) var - PageMetadata: Record "Page Metadata"; MCPToolsByAPIGroup: Page "MCP Tools By API Group"; APIGroup: Text; APIPublisher: Text; @@ -574,6 +651,15 @@ codeunit 8351 "MCP Config Implementation" if APIPublisher = 'microsoft' then exit; + AddAPIPageTools(ConfigId, APIPublisher, APIGroup); + AddAPIQueryTools(ConfigId, APIPublisher, APIGroup); + end; + + local procedure AddAPIPageTools(ConfigId: Guid; APIPublisher: Text; APIGroup: Text) + var + PageMetadata: Record "Page Metadata"; + MCPConfigurationTool: Record "MCP Configuration Tool"; + begin PageMetadata.SetRange(PageType, PageMetadata.PageType::API); PageMetadata.SetFilter(APIPublisher, APIPublisher); PageMetadata.SetFilter(APIGroup, APIGroup); @@ -581,15 +667,34 @@ codeunit 8351 "MCP Config Implementation" exit; repeat - if CheckAPIToolExists(ConfigId, PageMetadata.ID) then + if CheckAPIToolExists(ConfigId, PageMetadata.ID, MCPConfigurationTool."Object Type"::Page) then continue; - CreateAPITool(ConfigId, PageMetadata.ID, false); + CreateAPIPageTool(ConfigId, PageMetadata.ID, false); until PageMetadata.Next() = 0; end; + local procedure AddAPIQueryTools(ConfigId: Guid; APIPublisher: Text; APIGroup: Text) + var + QueryMetadata: Record "Query Metadata"; + MCPConfigurationTool: Record "MCP Configuration Tool"; + begin + QueryMetadata.SetFilter(EntityName, '<>%1', ''); + QueryMetadata.SetFilter(APIPublisher, APIPublisher); + QueryMetadata.SetFilter(APIGroup, APIGroup); + if not QueryMetadata.FindSet() then + exit; + + repeat + if CheckAPIToolExists(ConfigId, QueryMetadata.ID, MCPConfigurationTool."Object Type"::Query) then + continue; + CreateAPIQueryTool(ConfigId, QueryMetadata.ID); + until QueryMetadata.Next() = 0; + end; + internal procedure AddStandardAPITools(ConfigId: Guid) var PageMetadata: Record "Page Metadata"; + MCPConfigurationTool: Record "MCP Configuration Tool"; begin PageMetadata.SetRange(PageType, PageMetadata.PageType::API); PageMetadata.SetFilter(APIPublisher, '=%1', ''); @@ -599,19 +704,19 @@ codeunit 8351 "MCP Config Implementation" exit; repeat - if CheckAPIToolExists(ConfigId, PageMetadata.ID) then + if CheckAPIToolExists(ConfigId, PageMetadata.ID, MCPConfigurationTool."Object Type"::Page) then continue; - CreateAPITool(ConfigId, PageMetadata.ID, false); + CreateAPIPageTool(ConfigId, PageMetadata.ID, false); until PageMetadata.Next() = 0; end; - internal procedure CheckAPIToolExists(ConfigId: Guid; PageId: Integer): Boolean + internal procedure CheckAPIToolExists(ConfigId: Guid; ObjectId: Integer; ObjectType: Option): Boolean var MCPConfigurationTool: Record "MCP Configuration Tool"; begin MCPConfigurationTool.SetRange(ID, ConfigId); - MCPConfigurationTool.SetRange("Object Type", MCPConfigurationTool."Object Type"::Page); - MCPConfigurationTool.SetRange("Object ID", PageId); + MCPConfigurationTool.SetRange("Object Type", ObjectType); + MCPConfigurationTool.SetRange("Object ID", ObjectId); exit(not MCPConfigurationTool.IsEmpty()); end; @@ -624,8 +729,12 @@ codeunit 8351 "MCP Config Implementation" if not MCPConfigurationTool.GetBySystemId(ToolId) then exit(''); - if MCPConfigurationTool."Object Type" = MCPConfigurationTool."Object Type"::Page then - ObjectType := ObjectType::Page; + case MCPConfigurationTool."Object Type" of + MCPConfigurationTool."Object Type"::Page: + ObjectType := ObjectType::Page; + MCPConfigurationTool."Object Type"::Query: + ObjectType := ObjectType::Query; + end; if AllObjWithCaption.Get(ObjectType, MCPConfigurationTool."Object ID") then exit(CopyStr(AllObjWithCaption."Object Name", 1, 100)); @@ -653,7 +762,7 @@ codeunit 8351 "MCP Config Implementation" MCPSystemTool.Insert(); end; - internal procedure ValidateAPIVersion(ObjectId: Integer; APIVersion: Text) + internal procedure ValidateAPIPageVersion(ObjectId: Integer; APIVersion: Text) var PageMetadata: Record "Page Metadata"; Versions: List of [Text]; @@ -666,7 +775,20 @@ codeunit 8351 "MCP Config Implementation" Error(VersionNotValidErr); end; - internal procedure LookupAPIVersions(PageId: Integer; var APIVersion: Text[30]) + internal procedure ValidateAPIQueryVersion(ObjectId: Integer; APIVersion: Text) + var + QueryMetadata: Record "Query Metadata"; + Versions: List of [Text]; + begin + if not QueryMetadata.Get(ObjectId) then + exit; + + Versions := QueryMetadata.APIVersion.Split(','); + if not Versions.Contains(APIVersion) then + Error(VersionNotValidErr); + end; + + internal procedure LookupAPIPageVersions(PageId: Integer; var APIVersion: Text[30]) var PageMetadata: Record "Page Metadata"; MCPAPIVersion: Record "MCP API Version"; @@ -686,9 +808,44 @@ codeunit 8351 "MCP Config Implementation" APIVersion := MCPAPIVersion."API Version"; end; - internal procedure GetHighestAPIVersion(PageMetadata: Record "Page Metadata"): Text[30] + internal procedure LookupAPIQueryVersions(QueryId: Integer; var APIVersion: Text[30]) var + QueryMetadata: Record "Query Metadata"; + MCPAPIVersion: Record "MCP API Version"; Versions: List of [Text]; + Version: Text[30]; + begin + if not QueryMetadata.Get(QueryId) then + exit; + + Versions := QueryMetadata.APIVersion.Split(','); + foreach Version in Versions do begin + MCPAPIVersion."API Version" := Version; + MCPAPIVersion.Insert(); + end; + + if Page.RunModal(Page::"MCP API Version Lookup", MCPAPIVersion) = Action::LookupOK then + APIVersion := MCPAPIVersion."API Version"; + end; + + internal procedure GetHighestAPIPageVersion(PageMetadata: Record "Page Metadata"): Text[30] + begin + if PageMetadata.APIVersion = '' then + exit(''); + + exit(GetHighestVersion(PageMetadata.APIVersion.Split(','))); + end; + + internal procedure GetHighestAPIQueryVersion(QueryMetadata: Record "Query Metadata"): Text[30] + begin + if QueryMetadata.APIVersion = '' then + exit(''); + + exit(GetHighestVersion(QueryMetadata.APIVersion.Split(','))); + end; + + local procedure GetHighestVersion(Versions: List of [Text]): Text[30] + var Version: Text; HighestVersion: Text; HighestMajor: Integer; @@ -696,11 +853,6 @@ codeunit 8351 "MCP Config Implementation" CurrentMajor: Integer; CurrentMinor: Integer; begin - if PageMetadata.APIVersion = '' then - exit(''); - - Versions := PageMetadata.APIVersion.Split(','); - if Versions.Count() = 1 then exit(CopyStr(Versions.Get(1), 1, 30)); @@ -1008,6 +1160,8 @@ codeunit 8351 "MCP Config Implementation" ObjectTypeText := ToolJson.GetText('objectType'); if ObjectTypeText = 'Page' then MCPConfigurationTool."Object Type" := MCPConfigurationTool."Object Type"::Page; + if ObjectTypeText = 'Query' then + MCPConfigurationTool."Object Type" := MCPConfigurationTool."Object Type"::Query; end; if ToolJson.Contains('objectId') then diff --git a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigMissingObject.Codeunit.al b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigMissingObject.Codeunit.al index a31c6acc3f..a1db529a94 100644 --- a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigMissingObject.Codeunit.al +++ b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigMissingObject.Codeunit.al @@ -25,7 +25,12 @@ codeunit 8353 "MCP Config Missing Object" implements "MCP Config Warning" MCPConfigurationTool.SetRange(ID, ConfigId); if MCPConfigurationTool.FindSet() then repeat - AllObj.SetRange("Object Type", AllObj."Object Type"::Page); + case MCPConfigurationTool."Object Type" of + MCPConfigurationTool."Object Type"::Page: + AllObj.SetRange("Object Type", AllObj."Object Type"::Page); + MCPConfigurationTool."Object Type"::Query: + AllObj.SetRange("Object Type", AllObj."Object Type"::Query); + end; AllObj.SetRange("Object ID", MCPConfigurationTool."Object ID"); if AllObj.IsEmpty() then begin MCPConfigWarning."Entry No." := EntryNo; diff --git a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigMissingParent.Codeunit.al b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigMissingParent.Codeunit.al index f85bd92244..3cdfc4c0c5 100644 --- a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigMissingParent.Codeunit.al +++ b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigMissingParent.Codeunit.al @@ -84,6 +84,7 @@ codeunit 8354 "MCP Config Missing Parent" implements "MCP Config Warning" procedure ApplyRecommendedAction(var MCPConfigWarning: Record "MCP Config Warning") var + MCPConfigurationTool: Record "MCP Configuration Tool"; MCPConfigImplementation: Codeunit "MCP Config Implementation"; PageIdList: List of [Text]; PageIdText: Text; @@ -96,8 +97,8 @@ codeunit 8354 "MCP Config Missing Parent" implements "MCP Config Warning" PageIdList := MCPConfigWarning."Additional Info".Split(','); foreach PageIdText in PageIdList do if Evaluate(PageId, PageIdText.Trim()) then - if not MCPConfigImplementation.CheckAPIToolExists(MCPConfigWarning."Config Id", PageId) then - MCPConfigImplementation.CreateAPITool(MCPConfigWarning."Config Id", PageId, false); + if not MCPConfigImplementation.CheckAPIToolExists(MCPConfigWarning."Config Id", PageId, MCPConfigurationTool."Object Type"::Page) then + MCPConfigImplementation.CreateAPIPageTool(MCPConfigWarning."Config Id", PageId, false); MCPConfigWarning.Delete(); end; diff --git a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigMissingReadTool.Codeunit.al b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigMissingReadTool.Codeunit.al index d3aa5961de..d096a755da 100644 --- a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigMissingReadTool.Codeunit.al +++ b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPConfigMissingReadTool.Codeunit.al @@ -19,6 +19,7 @@ codeunit 8355 "MCP Config Missing Read Tool" implements "MCP Config Warning" procedure CheckForWarnings(ConfigId: Guid; var MCPConfigWarning: Record "MCP Config Warning"; var EntryNo: Integer) begin MCPConfigurationTool.SetRange(ID, ConfigId); + MCPConfigurationTool.SetRange("Object Type", MCPConfigurationTool."Object Type"::Page); MCPConfigurationTool.SetRange("Allow Modify", true); MCPConfigurationTool.SetRange("Allow Read", false); if MCPConfigurationTool.FindSet() then diff --git a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPUpgrade.Codeunit.al b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPUpgrade.Codeunit.al index 262339d0b4..050f93bcf2 100644 --- a/src/System Application/App/MCP/src/Configuration/Codeunits/MCPUpgrade.Codeunit.al +++ b/src/System Application/App/MCP/src/Configuration/Codeunits/MCPUpgrade.Codeunit.al @@ -38,7 +38,7 @@ codeunit 8356 "MCP Upgrade" if PageMetadata.PageType <> PageMetadata.PageType::API then continue; - MCPConfigurationTool."API Version" := MCPConfigImplementation.GetHighestAPIVersion(PageMetadata); + MCPConfigurationTool."API Version" := MCPConfigImplementation.GetHighestAPIPageVersion(PageMetadata); MCPConfigurationTool.Modify(); until MCPConfigurationTool.Next() = 0; diff --git a/src/System Application/App/MCP/src/Configuration/Pages/MCPConfigToolList.Page.al b/src/System Application/App/MCP/src/Configuration/Pages/MCPConfigToolList.Page.al index 71793cc833..7d7e7c0b52 100644 --- a/src/System Application/App/MCP/src/Configuration/Pages/MCPConfigToolList.Page.al +++ b/src/System Application/App/MCP/src/Configuration/Pages/MCPConfigToolList.Page.al @@ -35,17 +35,37 @@ page 8352 "MCP Config Tool List" PageMetadata: Record "Page Metadata"; QueryMetadata: Record "Query Metadata"; begin - if not MCPConfigImplementation.LookupQueryTools(QueryMetadata) then - exit; + case Rec."Object Type" of + Rec."Object Type"::Page: + begin + if not MCPConfigImplementation.LookupAPIPageTools(PageMetadata) then + exit; - if not PageMetadata.FindSet() then - exit; + if not PageMetadata.FindSet() then + exit; + + repeat + if MCPConfigImplementation.CheckAPIToolExists(Rec.ID, PageMetadata.ID, Rec."Object Type") then + continue; + MCPConfig.CreateAPITool(Rec.ID, PageMetadata.ID); + until PageMetadata.Next() = 0; + end; + Rec."Object Type"::Query: + begin + if not MCPConfigImplementation.LookupAPIQueryTools(QueryMetadata) then + exit; + + if not QueryMetadata.FindSet() then + exit; + + repeat + if MCPConfigImplementation.CheckAPIToolExists(Rec.ID, QueryMetadata.ID, Rec."Object Type") then + continue; + MCPConfig.CreateQueryAPITool(Rec.ID, QueryMetadata.ID); + until QueryMetadata.Next() = 0; + end; + end; - repeat - if MCPConfigImplementation.CheckAPIToolExists(Rec.ID, PageMetadata.ID) then - continue; - MCPConfig.CreateAPITool(Rec.ID, PageMetadata.ID); - until PageMetadata.Next() = 0; if not IsNullGuid(Rec.SystemId) then Rec.Delete(); @@ -55,9 +75,20 @@ page 8352 "MCP Config Tool List" trigger OnValidate() var PageMetadata: Record "Page Metadata"; + QueryMetadata: Record "Query Metadata"; begin - PageMetadata := MCPConfigImplementation.ValidateAPITool(Rec."Object Id", true); - Rec."API Version" := MCPConfigImplementation.GetHighestAPIVersion(PageMetadata); + case Rec."Object Type" of + Rec."Object Type"::Page: + begin + PageMetadata := MCPConfigImplementation.ValidateAPIPageTool(Rec."Object Id", true); + Rec."API Version" := MCPConfigImplementation.GetHighestAPIPageVersion(PageMetadata); + end; + Rec."Object Type"::Query: + begin + QueryMetadata := MCPConfigImplementation.ValidateAPIQueryTool(Rec."Object Id"); + Rec."API Version" := MCPConfigImplementation.GetHighestAPIQueryVersion(QueryMetadata); + end; + end; SetPermissions(); end; } @@ -79,32 +110,42 @@ page 8352 "MCP Config Tool List" if Rec."Object ID" = 0 then exit; - MCPConfigImplementation.LookupAPIVersions(Rec."Object Id", APIVersion); + case Rec."Object Type" of + Rec."Object Type"::Page: + MCPConfigImplementation.LookupAPIPageVersions(Rec."Object Id", APIVersion); + Rec."Object Type"::Query: + MCPConfigImplementation.LookupAPIQueryVersions(Rec."Object Id", APIVersion); + end; if APIVersion <> '' then Rec."API Version" := APIVersion; end; trigger OnValidate() begin - MCPConfigImplementation.ValidateAPIVersion(Rec."Object Id", Rec."API Version"); + case Rec."Object Type" of + Rec."Object Type"::Page: + MCPConfigImplementation.ValidateAPIPageVersion(Rec."Object Id", Rec."API Version"); + Rec."Object Type"::Query: + MCPConfigImplementation.ValidateAPIQueryVersion(Rec."Object Id", Rec."API Version"); + end; end; } field("Allow Read"; Rec."Allow Read") { } field("Allow Create"; Rec."Allow Create") { - Editable = AllowCreateEditable and AllowCreateUpdateDeleteTools; + Editable = AllowCreateEditable and AllowCreateUpdateDeleteTools and (Rec."Object Type" = Rec."Object Type"::Page); } field("Allow Modify"; Rec."Allow Modify") { - Editable = AllowModifyEditable and AllowCreateUpdateDeleteTools; + Editable = AllowModifyEditable and AllowCreateUpdateDeleteTools and (Rec."Object Type" = Rec."Object Type"::Page); } field("Allow Delete"; Rec."Allow Delete") { - Editable = AllowDeleteEditable and AllowCreateUpdateDeleteTools; + Editable = AllowDeleteEditable and AllowCreateUpdateDeleteTools and (Rec."Object Type" = Rec."Object Type"::Page); } field("Allow Bound Actions"; Rec."Allow Bound Actions") { - Editable = AllowCreateUpdateDeleteTools; + Editable = AllowCreateUpdateDeleteTools and (Rec."Object Type" = Rec."Object Type"::Page); } } } @@ -124,19 +165,41 @@ page 8352 "MCP Config Tool List" trigger OnAction() var PageMetadata: Record "Page Metadata"; + QueryMetadata: Record "Query Metadata"; begin - if not MCPConfigImplementation.LookupAPITools(PageMetadata) then - exit; + case Rec."Object Type" of + Rec."Object Type"::Page: + begin + if not MCPConfigImplementation.LookupAPIPageTools(PageMetadata) then + exit; + + if not PageMetadata.FindSet() then + exit; - if not PageMetadata.FindSet() then - exit; + repeat + if MCPConfigImplementation.CheckAPIToolExists(Rec.ID, PageMetadata.ID, Rec."Object Type") then + continue; + MCPConfig.CreateAPITool(Rec.ID, PageMetadata.ID); + until PageMetadata.Next() = 0; + end; + Rec."Object Type"::Query: + begin + if not MCPConfigImplementation.LookupAPIQueryTools(QueryMetadata) then + exit; - repeat - if MCPConfigImplementation.CheckAPIToolExists(Rec.ID, PageMetadata.ID) then - continue; - MCPConfig.CreateAPITool(Rec.ID, PageMetadata.ID); - until PageMetadata.Next() = 0; + if not QueryMetadata.FindSet() then + exit; + + repeat + if MCPConfigImplementation.CheckAPIToolExists(Rec.ID, QueryMetadata.ID, Rec."Object Type") then + continue; + MCPConfig.CreateQueryAPITool(Rec.ID, QueryMetadata.ID); + until QueryMetadata.Next() = 0; + end; + end; + if not IsNullGuid(Rec.SystemId) then + Rec.Delete(); CurrPage.Update(); end; } diff --git a/src/System Application/App/MCP/src/Configuration/Pages/MCPQueryConfigToolLookup.Page.al b/src/System Application/App/MCP/src/Configuration/Pages/MCPQueryConfigToolLookup.Page.al index b84968bf14..de7c71e620 100644 --- a/src/System Application/App/MCP/src/Configuration/Pages/MCPQueryConfigToolLookup.Page.al +++ b/src/System Application/App/MCP/src/Configuration/Pages/MCPQueryConfigToolLookup.Page.al @@ -7,7 +7,7 @@ namespace System.MCP; using System.Reflection; -page 8357 "MCP Query Config Tool Lookup" +page 8367 "MCP Query Config Tool Lookup" { PageType = List; ApplicationArea = All; @@ -30,32 +30,32 @@ page 8357 "MCP Query Config Tool Lookup" field(ID; Rec.ID) { Caption = 'ID'; - ToolTip = 'Specifies the unique identifier for the query API page.'; + ToolTip = 'Specifies the unique identifier for the query API tool.'; } field(Name; Rec.Name) { Caption = 'Name'; - ToolTip = 'Specifies the name of the query API page.'; + ToolTip = 'Specifies the name of the query API tool.'; } field(EntityName; Rec.EntityName) { Caption = 'Entity Name'; - ToolTip = 'Specifies the entity name of the query API page.'; + ToolTip = 'Specifies the entity name of the query API tool.'; } field(APIPublisher; Rec.APIPublisher) { Caption = 'API Publisher'; - ToolTip = 'Specifies the API publisher of the query API page.'; + ToolTip = 'Specifies the API publisher of the query API tool.'; } field(APIGroup; Rec.APIGroup) { Caption = 'API Group'; - ToolTip = 'Specifies the API group of the query API page.'; + ToolTip = 'Specifies the API group of the query API tool.'; } field(APIVersion; Rec.APIVersion) { Caption = 'API Version'; - ToolTip = 'Specifies the API version of the query API page.'; + ToolTip = 'Specifies the API version of the query API tool.'; } } } diff --git a/src/System Application/Test Library/MCP/app.json b/src/System Application/Test Library/MCP/app.json index 4a1b7c55c0..75a52ae168 100644 --- a/src/System Application/Test Library/MCP/app.json +++ b/src/System Application/Test Library/MCP/app.json @@ -22,7 +22,7 @@ "idRanges": [ { "from": 130131, - "to": 130134 + "to": 130135 } ], "platform": "28.0.0.0", diff --git a/src/System Application/Test Library/MCP/src/MCPConfigTestLibrary.Codeunit.al b/src/System Application/Test Library/MCP/src/MCPConfigTestLibrary.Codeunit.al index 156696dbc4..81752ddb1f 100644 --- a/src/System Application/Test Library/MCP/src/MCPConfigTestLibrary.Codeunit.al +++ b/src/System Application/Test Library/MCP/src/MCPConfigTestLibrary.Codeunit.al @@ -13,9 +13,9 @@ codeunit 130131 "MCP Config Test Library" var MCPConfigImplementation: Codeunit "MCP Config Implementation"; - procedure LookupAPITools(var PageMetadata: Record "Page Metadata"): Boolean + procedure LookupAPIPageTools(var PageMetadata: Record "Page Metadata"): Boolean begin - exit(MCPConfigImplementation.LookupAPITools(PageMetadata)); + exit(MCPConfigImplementation.LookupAPIPageTools(PageMetadata)); end; procedure AddToolsByAPIGroup(ConfigId: Guid) @@ -28,6 +28,11 @@ codeunit 130131 "MCP Config Test Library" MCPConfigImplementation.AddStandardAPITools(ConfigId); end; + procedure LookupAPIQueryTools(var QueryMetadata: Record "Query Metadata"): Boolean + begin + exit(MCPConfigImplementation.LookupAPIQueryTools(QueryMetadata)); + end; + procedure LookupAPIPublisher(var APIPublisher: Text; var APIGroup: Text) var MCPAPIPublisherGroup: Record "MCP API Publisher Group"; @@ -44,8 +49,8 @@ codeunit 130131 "MCP Config Test Library" MCPConfigImplementation.LookupAPIGroup(MCPAPIPublisherGroup, APIPublisher, APIGroup); end; - procedure GetHighestAPIVersion(PageMetadata: Record "Page Metadata"): Text[30] + procedure GetHighestAPIPageVersion(PageMetadata: Record "Page Metadata"): Text[30] begin - exit(MCPConfigImplementation.GetHighestAPIVersion(PageMetadata)); + exit(MCPConfigImplementation.GetHighestAPIPageVersion(PageMetadata)); end; } \ No newline at end of file diff --git a/src/System Application/Test Library/MCP/src/MockAPIQuery.Query.al b/src/System Application/Test Library/MCP/src/MockAPIQuery.Query.al new file mode 100644 index 0000000000..140cfc54e4 --- /dev/null +++ b/src/System Application/Test Library/MCP/src/MockAPIQuery.Query.al @@ -0,0 +1,30 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.TestLibraries.MCP; + +query 130135 "Mock API Query" +{ + QueryType = API; + Caption = 'Mock API Query'; + APIPublisher = 'mock'; + APIGroup = 'mcp'; + APIVersion = 'v1.0'; + EntityName = 'mockQuery'; + EntitySetName = 'mockQueries'; + + elements + { + dataitem(MockAPI; "Mock API") + { + column(primaryKey; "Primary Key") + { + } + column(systemId; SystemId) + { + } + } + } +} diff --git a/src/System Application/Test/MCP/src/MCPConfigTest.Codeunit.al b/src/System Application/Test/MCP/src/MCPConfigTest.Codeunit.al index e75456b9ea..6263ab620b 100644 --- a/src/System Application/Test/MCP/src/MCPConfigTest.Codeunit.al +++ b/src/System Application/Test/MCP/src/MCPConfigTest.Codeunit.al @@ -22,6 +22,8 @@ codeunit 130130 "MCP Config Test" MCPConfig: Codeunit "MCP Config"; MCPConfigTestLibrary: Codeunit "MCP Config Test Library"; + #region Configurations + [Test] procedure TestCreateConfiguration() var @@ -207,6 +209,10 @@ codeunit 130130 "MCP Config Test" Assert.IsTrue(MCPConfigurationTool."Allow Create", 'Allow Create is not true'); end; + #endregion + + #region Tools + [Test] procedure TestCreateAPITool() var @@ -275,7 +281,7 @@ codeunit 130130 "MCP Config Test" PageMetadata.Get(Page::"Mock API"); // [WHEN] GetHighestAPIVersion is called - HighestVersion := MCPConfigTestLibrary.GetHighestAPIVersion(PageMetadata); + HighestVersion := MCPConfigTestLibrary.GetHighestAPIPageVersion(PageMetadata); // [THEN] The single version is returned Assert.AreEqual('v0.1', HighestVersion, 'Should return the single version'); @@ -291,7 +297,7 @@ codeunit 130130 "MCP Config Test" PageMetadata.Get(Page::"Mock API Multi Version"); // [WHEN] GetHighestAPIVersion is called - HighestVersion := MCPConfigTestLibrary.GetHighestAPIVersion(PageMetadata); + HighestVersion := MCPConfigTestLibrary.GetHighestAPIPageVersion(PageMetadata); // [THEN] The highest version is returned Assert.AreEqual('v2.0', HighestVersion, 'Should return v2.0 as highest version'); @@ -384,7 +390,7 @@ codeunit 130130 "MCP Config Test" [Test] [HandlerFunctions('LookupAPIToolsOKHandler')] - procedure TestLookupAPITools() + procedure TestLookupAPIPageTools() var PageMetadata: Record "Page Metadata"; Result: Boolean; @@ -392,7 +398,7 @@ codeunit 130130 "MCP Config Test" // [GIVEN] No preselected page // [WHEN] Lookup API tools is called and a page is selected - Result := MCPConfigTestLibrary.LookupAPITools(PageMetadata); + Result := MCPConfigTestLibrary.LookupAPIPageTools(PageMetadata); // [THEN] Correct page is selected Assert.IsTrue(Result, 'Result is not true'); @@ -400,6 +406,24 @@ codeunit 130130 "MCP Config Test" Assert.AreEqual(Page::"Mock API", PageMetadata.ID, 'PageId mismatch'); end; + [Test] + [HandlerFunctions('LookupAPIQueryToolsOKHandler')] + procedure TestLookupAPIQueryTools() + var + QueryMetadata: Record "Query Metadata"; + Result: Boolean; + begin + // [GIVEN] No preselected query + + // [WHEN] Lookup API query tools is called and a query is selected + Result := MCPConfigTestLibrary.LookupAPIQueryTools(QueryMetadata); + + // [THEN] Correct query is selected + Assert.IsTrue(Result, 'Result is not true'); + QueryMetadata.FindFirst(); + Assert.AreEqual(Query::"Mock API Query", QueryMetadata.ID, 'QueryId mismatch'); + end; + [Test] [HandlerFunctions('AddToolsByAPIGroupOKHandler')] procedure TestAddToolsByAPIGroup() @@ -629,6 +653,157 @@ codeunit 130130 "MCP Config Test" Assert.IsFalse(MCPConfigurationTool."Allow Bound Actions", 'Allow Bound Actions is not false'); end; + [Test] + procedure TestCreateQueryAPITool() + var + MCPConfigurationTool: Record "MCP Configuration Tool"; + ConfigId: Guid; + ToolId: Guid; + begin + // [GIVEN] Configuration is created + ConfigId := CreateMCPConfig(false, true, true, false); + + // [WHEN] Create query API tool is called + ToolId := MCPConfig.CreateQueryAPITool(ConfigId, Query::"Mock API Query"); + + // [THEN] Query API tool is created with correct defaults + MCPConfigurationTool.GetBySystemId(ToolId); + Assert.AreEqual(ConfigId, MCPConfigurationTool.ID, 'ConfigId mismatch'); + Assert.AreEqual(Query::"Mock API Query", MCPConfigurationTool."Object Id", 'QueryId mismatch'); + Assert.AreEqual(MCPConfigurationTool."Object Type"::Query, MCPConfigurationTool."Object Type", 'Object Type mismatch'); + Assert.IsTrue(MCPConfigurationTool."Allow Read", 'Allow Read should be true'); + Assert.IsFalse(MCPConfigurationTool."Allow Create", 'Allow Create should be false'); + Assert.IsFalse(MCPConfigurationTool."Allow Modify", 'Allow Modify should be false'); + Assert.IsFalse(MCPConfigurationTool."Allow Delete", 'Allow Delete should be false'); + Assert.IsFalse(MCPConfigurationTool."Allow Bound Actions", 'Allow Bound Actions should be false'); + Assert.AreEqual('v1.0', MCPConfigurationTool."API Version", 'API Version mismatch'); + end; + + [Test] + procedure TestCreateInvalidQueryAPITool() + var + ConfigId: Guid; + begin + // [GIVEN] Configuration is created + ConfigId := CreateMCPConfig(false, false, true, false); + + // [WHEN] Create query API tool is called with a non-existent query + asserterror MCPConfig.CreateQueryAPITool(ConfigId, -1); + + // [THEN] Error message is returned + Assert.ExpectedError('Query not found.'); + end; + + [Test] + procedure TestQueryToolDoesNotAllowCreate() + var + MCPConfigurationTool: Record "MCP Configuration Tool"; + ConfigId: Guid; + ToolId: Guid; + begin + // [GIVEN] Configuration and query tool is created + ConfigId := CreateMCPConfig(false, false, true, false); + ToolId := CreateMCPQueryConfigTool(ConfigId); + Commit(); + + // [WHEN] AllowCreate is called on a query tool + MCPConfig.AllowCreate(ToolId, true); + + // [THEN] Allow Create remains false (not applicable for query tools) + MCPConfigurationTool.GetBySystemId(ToolId); + Assert.IsFalse(MCPConfigurationTool."Allow Create", 'Allow Create should remain false for query tools'); + end; + + [Test] + procedure TestQueryToolDoesNotAllowModify() + var + MCPConfigurationTool: Record "MCP Configuration Tool"; + ConfigId: Guid; + ToolId: Guid; + begin + // [GIVEN] Configuration and query tool is created + ConfigId := CreateMCPConfig(false, false, true, false); + ToolId := CreateMCPQueryConfigTool(ConfigId); + Commit(); + + // [WHEN] AllowModify is called on a query tool + MCPConfig.AllowModify(ToolId, true); + + // [THEN] Allow Modify remains false (not applicable for query tools) + MCPConfigurationTool.GetBySystemId(ToolId); + Assert.IsFalse(MCPConfigurationTool."Allow Modify", 'Allow Modify should remain false for query tools'); + end; + + [Test] + procedure TestQueryToolDoesNotAllowDelete() + var + MCPConfigurationTool: Record "MCP Configuration Tool"; + ConfigId: Guid; + ToolId: Guid; + begin + // [GIVEN] Configuration and query tool is created + ConfigId := CreateMCPConfig(false, false, true, false); + ToolId := CreateMCPQueryConfigTool(ConfigId); + Commit(); + + // [WHEN] AllowDelete is called on a query tool + MCPConfig.AllowDelete(ToolId, true); + + // [THEN] Allow Delete remains false (not applicable for query tools) + MCPConfigurationTool.GetBySystemId(ToolId); + Assert.IsFalse(MCPConfigurationTool."Allow Delete", 'Allow Delete should remain false for query tools'); + end; + + [Test] + procedure TestQueryToolDoesNotAllowBoundActions() + var + MCPConfigurationTool: Record "MCP Configuration Tool"; + ConfigId: Guid; + ToolId: Guid; + begin + // [GIVEN] Configuration and query tool is created + ConfigId := CreateMCPConfig(false, false, true, false); + ToolId := CreateMCPQueryConfigTool(ConfigId); + Commit(); + + // [WHEN] AllowBoundActions is called on a query tool + MCPConfig.AllowBoundActions(ToolId, true); + + // [THEN] Allow Bound Actions remains false (not applicable for query tools) + MCPConfigurationTool.GetBySystemId(ToolId); + Assert.IsFalse(MCPConfigurationTool."Allow Bound Actions", 'Allow Bound Actions should remain false for query tools'); + end; + + [Test] + procedure TestFindMissingObjectWarningsForQueryTool() + var + MCPConfigurationTool: Record "MCP Configuration Tool"; + MCPConfigWarning: Record "MCP Config Warning"; + ConfigId: Guid; + ToolId: Guid; + begin + // [GIVEN] Configuration and query tool with non-existing object is created + ConfigId := CreateMCPConfig(false, false, true, false); + ToolId := CreateMCPQueryConfigTool(ConfigId); + MCPConfigurationTool.GetBySystemId(ToolId); + MCPConfigurationTool.Rename(MCPConfigurationTool.ID, MCPConfigurationTool."Object Type", -1); // non-existing object + Commit(); + + // [WHEN] Find warnings for configuration is called + MCPConfig.FindWarningsForConfiguration(ConfigId, MCPConfigWarning); + + // [THEN] Warning is created for the query tool with non-existing object +#pragma warning disable AA0210 + MCPConfigWarning.SetRange("Warning Type", MCPConfigWarning."Warning Type"::"Missing Object"); +#pragma warning restore AA0210 + MCPConfigWarning.SetRange("Tool Id", ToolId); + Assert.RecordCount(MCPConfigWarning, 1); + end; + + #endregion + + #region Warnings + [Test] procedure TestFindMissingObjectWarningsForConfiguration() var @@ -811,6 +986,10 @@ codeunit 130130 "MCP Config Test" Assert.RecordIsEmpty(MCPConfigWarning); end; + #endregion + + #region Export/Import + [Test] procedure TestExportConfiguration() var @@ -888,6 +1067,10 @@ codeunit 130130 "MCP Config Test" Assert.RecordCount(MCPConfigurationTool, 2); end; + #endregion + + #region Helpers + local procedure CreateMCPConfig(Active: Boolean; DynamicToolMode: Boolean; AllowCreateUpdateDeleteTools: Boolean; DiscoverReadOnlyObjects: Boolean): Guid var MCPConfiguration: Record "MCP Configuration"; @@ -918,6 +1101,26 @@ codeunit 130130 "MCP Config Test" exit(MCPConfigurationTool.SystemId); end; + local procedure CreateMCPQueryConfigTool(ConfigId: Guid): Guid + var + MCPConfigurationTool: Record "MCP Configuration Tool"; + begin + MCPConfigurationTool.ID := ConfigId; + MCPConfigurationTool."Object Id" := Any.IntegerInRange(1, 100); + MCPConfigurationTool."Object Type" := MCPConfigurationTool."Object Type"::Query; + MCPConfigurationTool."Allow Read" := true; + MCPConfigurationTool."Allow Create" := false; + MCPConfigurationTool."Allow Modify" := false; + MCPConfigurationTool."Allow Delete" := false; + MCPConfigurationTool."Allow Bound Actions" := false; + MCPConfigurationTool.Insert(); + exit(MCPConfigurationTool.SystemId); + end; + + #endregion + + #region Handlers + [ModalPageHandler] procedure LookupAPIToolsOKHandler(var MCPAPIConfigToolLookup: TestPage "MCP API Config Tool Lookup") begin @@ -925,6 +1128,13 @@ codeunit 130130 "MCP Config Test" MCPAPIConfigToolLookup.OK().Invoke(); end; + [ModalPageHandler] + procedure LookupAPIQueryToolsOKHandler(var MCPQueryConfigToolLookup: TestPage "MCP Query Config Tool Lookup") + begin + MCPQueryConfigToolLookup.GoToKey(Query::"Mock API Query"); + MCPQueryConfigToolLookup.OK().Invoke(); + end; + [ModalPageHandler] procedure LookupAPIPublisherOKHandler(var MCPAPIPublisherLookup: TestPage "MCP API Publisher Lookup") begin @@ -939,4 +1149,6 @@ codeunit 130130 "MCP Config Test" MCPToolsByAPIGroup.APIGroup.SetValue('mcp'); MCPToolsByAPIGroup.OK().Invoke(); end; + + #endregion } \ No newline at end of file