d365fo-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +205 -0
- package/dist/bridge/bridgeAdapter.d.ts +319 -0
- package/dist/bridge/bridgeAdapter.d.ts.map +1 -0
- package/dist/bridge/bridgeAdapter.js +2003 -0
- package/dist/bridge/bridgeAdapter.js.map +1 -0
- package/dist/bridge/bridgeClient.d.ts +255 -0
- package/dist/bridge/bridgeClient.d.ts.map +1 -0
- package/dist/bridge/bridgeClient.js +741 -0
- package/dist/bridge/bridgeClient.js.map +1 -0
- package/dist/bridge/bridgeTypes.d.ts +561 -0
- package/dist/bridge/bridgeTypes.d.ts.map +1 -0
- package/dist/bridge/bridgeTypes.js +6 -0
- package/dist/bridge/bridgeTypes.js.map +1 -0
- package/dist/bridge/debouncedRefresh.d.ts +16 -0
- package/dist/bridge/debouncedRefresh.d.ts.map +1 -0
- package/dist/bridge/debouncedRefresh.js +77 -0
- package/dist/bridge/debouncedRefresh.js.map +1 -0
- package/dist/bridge/index.d.ts +21 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +20 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/cli/commands/config.d.ts +8 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +77 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +177 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/indexCmd.d.ts +8 -0
- package/dist/cli/commands/indexCmd.d.ts.map +1 -0
- package/dist/cli/commands/indexCmd.js +78 -0
- package/dist/cli/commands/indexCmd.js.map +1 -0
- package/dist/cli/commands/instance.d.ts +4 -0
- package/dist/cli/commands/instance.d.ts.map +1 -0
- package/dist/cli/commands/instance.js +183 -0
- package/dist/cli/commands/instance.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +4 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +246 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/start.d.ts +2 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +49 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/update.d.ts +4 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +55 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/context.d.ts +26 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +38 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/envFile.d.ts +23 -0
- package/dist/cli/envFile.d.ts.map +1 -0
- package/dist/cli/envFile.js +79 -0
- package/dist/cli/envFile.js.map +1 -0
- package/dist/cli/exec.d.ts +13 -0
- package/dist/cli/exec.d.ts.map +1 -0
- package/dist/cli/exec.js +47 -0
- package/dist/cli/exec.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +122 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/instances.d.ts +19 -0
- package/dist/cli/instances.d.ts.map +1 -0
- package/dist/cli/instances.js +60 -0
- package/dist/cli/instances.js.map +1 -0
- package/dist/cli/mcpJson.d.ts +15 -0
- package/dist/cli/mcpJson.d.ts.map +1 -0
- package/dist/cli/mcpJson.js +44 -0
- package/dist/cli/mcpJson.js.map +1 -0
- package/dist/cli/settingsPrompt.d.ts +20 -0
- package/dist/cli/settingsPrompt.d.ts.map +1 -0
- package/dist/cli/settingsPrompt.js +150 -0
- package/dist/cli/settingsPrompt.js.map +1 -0
- package/dist/cli/settingsStore.d.ts +47 -0
- package/dist/cli/settingsStore.d.ts.map +1 -0
- package/dist/cli/settingsStore.js +144 -0
- package/dist/cli/settingsStore.js.map +1 -0
- package/dist/cli/target.d.ts +23 -0
- package/dist/cli/target.d.ts.map +1 -0
- package/dist/cli/target.js +62 -0
- package/dist/cli/target.js.map +1 -0
- package/dist/cli/ui.d.ts +26 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +48 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/cli/xppConfig.d.ts +35 -0
- package/dist/cli/xppConfig.d.ts.map +1 -0
- package/dist/cli/xppConfig.js +97 -0
- package/dist/cli/xppConfig.js.map +1 -0
- package/dist/config/configFile.d.ts +50 -0
- package/dist/config/configFile.d.ts.map +1 -0
- package/dist/config/configFile.js +152 -0
- package/dist/config/configFile.js.map +1 -0
- package/dist/config/settings.d.ts +58 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +641 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/database/download.d.ts +27 -0
- package/dist/database/download.d.ts.map +1 -0
- package/dist/database/download.js +241 -0
- package/dist/database/download.js.map +1 -0
- package/dist/eval/audit/knowledgeAudit.d.ts +66 -0
- package/dist/eval/audit/knowledgeAudit.d.ts.map +1 -0
- package/dist/eval/audit/knowledgeAudit.js +117 -0
- package/dist/eval/audit/knowledgeAudit.js.map +1 -0
- package/dist/eval/audit/knowledgeAuditCli.d.ts +17 -0
- package/dist/eval/audit/knowledgeAuditCli.d.ts.map +1 -0
- package/dist/eval/audit/knowledgeAuditCli.js +83 -0
- package/dist/eval/audit/knowledgeAuditCli.js.map +1 -0
- package/dist/eval/audit/knowledgeRefs.d.ts +37 -0
- package/dist/eval/audit/knowledgeRefs.d.ts.map +1 -0
- package/dist/eval/audit/knowledgeRefs.js +150 -0
- package/dist/eval/audit/knowledgeRefs.js.map +1 -0
- package/dist/eval/audit/symbolLookup.d.ts +23 -0
- package/dist/eval/audit/symbolLookup.d.ts.map +1 -0
- package/dist/eval/audit/symbolLookup.js +80 -0
- package/dist/eval/audit/symbolLookup.js.map +1 -0
- package/dist/eval/coverage/coverage.d.ts +65 -0
- package/dist/eval/coverage/coverage.d.ts.map +1 -0
- package/dist/eval/coverage/coverage.js +136 -0
- package/dist/eval/coverage/coverage.js.map +1 -0
- package/dist/eval/coverage/coverageCli.d.ts +13 -0
- package/dist/eval/coverage/coverageCli.d.ts.map +1 -0
- package/dist/eval/coverage/coverageCli.js +106 -0
- package/dist/eval/coverage/coverageCli.js.map +1 -0
- package/dist/eval/coverage/sources.d.ts +17 -0
- package/dist/eval/coverage/sources.d.ts.map +1 -0
- package/dist/eval/coverage/sources.js +40 -0
- package/dist/eval/coverage/sources.js.map +1 -0
- package/dist/eval/coverage/taxonomy.d.ts +59 -0
- package/dist/eval/coverage/taxonomy.d.ts.map +1 -0
- package/dist/eval/coverage/taxonomy.js +400 -0
- package/dist/eval/coverage/taxonomy.js.map +1 -0
- package/dist/eval/improver/caseMining.d.ts +55 -0
- package/dist/eval/improver/caseMining.d.ts.map +1 -0
- package/dist/eval/improver/caseMining.js +64 -0
- package/dist/eval/improver/caseMining.js.map +1 -0
- package/dist/eval/improver/caseMiningCli.d.ts +10 -0
- package/dist/eval/improver/caseMiningCli.d.ts.map +1 -0
- package/dist/eval/improver/caseMiningCli.js +50 -0
- package/dist/eval/improver/caseMiningCli.js.map +1 -0
- package/dist/eval/improver/cli.d.ts +11 -0
- package/dist/eval/improver/cli.d.ts.map +1 -0
- package/dist/eval/improver/cli.js +73 -0
- package/dist/eval/improver/cli.js.map +1 -0
- package/dist/eval/improver/cluster.d.ts +47 -0
- package/dist/eval/improver/cluster.d.ts.map +1 -0
- package/dist/eval/improver/cluster.js +0 -0
- package/dist/eval/improver/cluster.js.map +1 -0
- package/dist/eval/improver/corpusIO.d.ts +26 -0
- package/dist/eval/improver/corpusIO.d.ts.map +1 -0
- package/dist/eval/improver/corpusIO.js +50 -0
- package/dist/eval/improver/corpusIO.js.map +1 -0
- package/dist/eval/improver/fixBrief.d.ts +34 -0
- package/dist/eval/improver/fixBrief.d.ts.map +1 -0
- package/dist/eval/improver/fixBrief.js +69 -0
- package/dist/eval/improver/fixBrief.js.map +1 -0
- package/dist/eval/improver/fixBriefCli.d.ts +11 -0
- package/dist/eval/improver/fixBriefCli.d.ts.map +1 -0
- package/dist/eval/improver/fixBriefCli.js +46 -0
- package/dist/eval/improver/fixBriefCli.js.map +1 -0
- package/dist/eval/improver/flakeDetection.d.ts +50 -0
- package/dist/eval/improver/flakeDetection.d.ts.map +1 -0
- package/dist/eval/improver/flakeDetection.js +0 -0
- package/dist/eval/improver/flakeDetection.js.map +1 -0
- package/dist/eval/improver/flakeDetectionCli.d.ts +8 -0
- package/dist/eval/improver/flakeDetectionCli.d.ts.map +1 -0
- package/dist/eval/improver/flakeDetectionCli.js +27 -0
- package/dist/eval/improver/flakeDetectionCli.js.map +1 -0
- package/dist/eval/improver/heldout.d.ts +44 -0
- package/dist/eval/improver/heldout.d.ts.map +1 -0
- package/dist/eval/improver/heldout.js +52 -0
- package/dist/eval/improver/heldout.js.map +1 -0
- package/dist/eval/improver/knowledgeFeedback.d.ts +56 -0
- package/dist/eval/improver/knowledgeFeedback.d.ts.map +1 -0
- package/dist/eval/improver/knowledgeFeedback.js +88 -0
- package/dist/eval/improver/knowledgeFeedback.js.map +1 -0
- package/dist/eval/improver/knowledgeFeedbackCli.d.ts +8 -0
- package/dist/eval/improver/knowledgeFeedbackCli.d.ts.map +1 -0
- package/dist/eval/improver/knowledgeFeedbackCli.js +28 -0
- package/dist/eval/improver/knowledgeFeedbackCli.js.map +1 -0
- package/dist/eval/improver/report.d.ts +36 -0
- package/dist/eval/improver/report.d.ts.map +1 -0
- package/dist/eval/improver/report.js +61 -0
- package/dist/eval/improver/report.js.map +1 -0
- package/dist/eval/improver/reportCli.d.ts +7 -0
- package/dist/eval/improver/reportCli.d.ts.map +1 -0
- package/dist/eval/improver/reportCli.js +27 -0
- package/dist/eval/improver/reportCli.js.map +1 -0
- package/dist/eval/oracle/actualArtifactResolution.d.ts +49 -0
- package/dist/eval/oracle/actualArtifactResolution.d.ts.map +1 -0
- package/dist/eval/oracle/actualArtifactResolution.js +73 -0
- package/dist/eval/oracle/actualArtifactResolution.js.map +1 -0
- package/dist/eval/oracle/cli.d.ts +30 -0
- package/dist/eval/oracle/cli.d.ts.map +1 -0
- package/dist/eval/oracle/cli.js +179 -0
- package/dist/eval/oracle/cli.js.map +1 -0
- package/dist/eval/oracle/diff.d.ts +26 -0
- package/dist/eval/oracle/diff.d.ts.map +1 -0
- package/dist/eval/oracle/diff.js +51 -0
- package/dist/eval/oracle/diff.js.map +1 -0
- package/dist/eval/oracle/index.d.ts +81 -0
- package/dist/eval/oracle/index.d.ts.map +1 -0
- package/dist/eval/oracle/index.js +55 -0
- package/dist/eval/oracle/index.js.map +1 -0
- package/dist/eval/oracle/normalize.d.ts +85 -0
- package/dist/eval/oracle/normalize.d.ts.map +1 -0
- package/dist/eval/oracle/normalize.js +321 -0
- package/dist/eval/oracle/normalize.js.map +1 -0
- package/dist/eval/oracle/score.d.ts +26 -0
- package/dist/eval/oracle/score.d.ts.map +1 -0
- package/dist/eval/oracle/score.js +15 -0
- package/dist/eval/oracle/score.js.map +1 -0
- package/dist/eval/oracle/systest.d.ts +30 -0
- package/dist/eval/oracle/systest.d.ts.map +1 -0
- package/dist/eval/oracle/systest.js +98 -0
- package/dist/eval/oracle/systest.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +753 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.d.ts +10 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.js +38 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/fields.d.ts +21 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/fields.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/fields.js +168 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/fields.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/panels.d.ts +9 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/panels.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/panels.js +47 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/panels.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.d.ts +16 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.js +124 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.d.ts +12 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.js +36 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/common.d.ts +11 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/common.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/common.js +37 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/common.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.d.ts +8 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.js +86 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.d.ts +7 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.js +69 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/dialog.d.ts +14 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/dialog.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/dialog.js +187 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/dialog.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/factBox.d.ts +10 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/factBox.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/factBox.js +54 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/factBox.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/listPage.d.ts +7 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/listPage.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/listPage.js +33 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/listPage.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/lookup.d.ts +10 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/lookup.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/lookup.js +95 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/lookup.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.d.ts +16 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.js +158 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.d.ts +7 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.js +34 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.d.ts +9 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.js +99 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.d.ts +8 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.js +95 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/task.d.ts +9 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/task.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/task.js +42 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/task.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/wizard.d.ts +7 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/wizard.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/wizard.js +42 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/wizard.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/workspace.d.ts +17 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/workspace.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/workspace.js +157 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/workspace.js.map +1 -0
- package/dist/knowledge/formPatterns/crossCheck.d.ts +44 -0
- package/dist/knowledge/formPatterns/crossCheck.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/crossCheck.js +109 -0
- package/dist/knowledge/formPatterns/crossCheck.js.map +1 -0
- package/dist/knowledge/formPatterns/index.d.ts +30 -0
- package/dist/knowledge/formPatterns/index.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/index.js +158 -0
- package/dist/knowledge/formPatterns/index.js.map +1 -0
- package/dist/knowledge/formPatterns/methodStubs.d.ts +45 -0
- package/dist/knowledge/formPatterns/methodStubs.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/methodStubs.js +257 -0
- package/dist/knowledge/formPatterns/methodStubs.js.map +1 -0
- package/dist/knowledge/formPatterns/types.d.ts +115 -0
- package/dist/knowledge/formPatterns/types.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/types.js +44 -0
- package/dist/knowledge/formPatterns/types.js.map +1 -0
- package/dist/metadata/enhancedParser.d.ts +91 -0
- package/dist/metadata/enhancedParser.d.ts.map +1 -0
- package/dist/metadata/enhancedParser.js +379 -0
- package/dist/metadata/enhancedParser.js.map +1 -0
- package/dist/metadata/formPatternMiner.d.ts +78 -0
- package/dist/metadata/formPatternMiner.d.ts.map +1 -0
- package/dist/metadata/formPatternMiner.js +220 -0
- package/dist/metadata/formPatternMiner.js.map +1 -0
- package/dist/metadata/labelParser.d.ts +71 -0
- package/dist/metadata/labelParser.d.ts.map +1 -0
- package/dist/metadata/labelParser.js +258 -0
- package/dist/metadata/labelParser.js.map +1 -0
- package/dist/metadata/symbolCountsWorker.d.ts +16 -0
- package/dist/metadata/symbolCountsWorker.d.ts.map +1 -0
- package/dist/metadata/symbolCountsWorker.js +42 -0
- package/dist/metadata/symbolCountsWorker.js.map +1 -0
- package/dist/metadata/symbolIndex.d.ts +474 -0
- package/dist/metadata/symbolIndex.d.ts.map +1 -0
- package/dist/metadata/symbolIndex.js +3152 -0
- package/dist/metadata/symbolIndex.js.map +1 -0
- package/dist/metadata/types.d.ts +267 -0
- package/dist/metadata/types.d.ts.map +1 -0
- package/dist/metadata/types.js +5 -0
- package/dist/metadata/types.js.map +1 -0
- package/dist/metadata/xmlParser.d.ts +232 -0
- package/dist/metadata/xmlParser.d.ts.map +1 -0
- package/dist/metadata/xmlParser.js +1021 -0
- package/dist/metadata/xmlParser.js.map +1 -0
- package/dist/metadata/xppDeclaration.d.ts +116 -0
- package/dist/metadata/xppDeclaration.d.ts.map +1 -0
- package/dist/metadata/xppDeclaration.js +350 -0
- package/dist/metadata/xppDeclaration.js.map +1 -0
- package/dist/middleware/apiKeyAuth.d.ts +7 -0
- package/dist/middleware/apiKeyAuth.d.ts.map +1 -0
- package/dist/middleware/apiKeyAuth.js +70 -0
- package/dist/middleware/apiKeyAuth.js.map +1 -0
- package/dist/middleware/rateLimiter.d.ts +7 -0
- package/dist/middleware/rateLimiter.d.ts.map +1 -0
- package/dist/middleware/rateLimiter.js +78 -0
- package/dist/middleware/rateLimiter.js.map +1 -0
- package/dist/prompts/codeReview.d.ts +8 -0
- package/dist/prompts/codeReview.d.ts.map +1 -0
- package/dist/prompts/codeReview.js +619 -0
- package/dist/prompts/codeReview.js.map +1 -0
- package/dist/prompts/index.d.ts +6 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +6 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/systemInstructions.d.ts +33 -0
- package/dist/prompts/systemInstructions.d.ts.map +1 -0
- package/dist/prompts/systemInstructions.js +154 -0
- package/dist/prompts/systemInstructions.js.map +1 -0
- package/dist/resources/classResource.d.ts +17 -0
- package/dist/resources/classResource.d.ts.map +1 -0
- package/dist/resources/classResource.js +33 -0
- package/dist/resources/classResource.js.map +1 -0
- package/dist/resources/index.d.ts +20 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +154 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server/mcpServer.d.ts +11 -0
- package/dist/server/mcpServer.d.ts.map +1 -0
- package/dist/server/mcpServer.js +185 -0
- package/dist/server/mcpServer.js.map +1 -0
- package/dist/server/serverMode.d.ts +53 -0
- package/dist/server/serverMode.d.ts.map +1 -0
- package/dist/server/serverMode.js +72 -0
- package/dist/server/serverMode.js.map +1 -0
- package/dist/server/toolAnnotations.d.ts +28 -0
- package/dist/server/toolAnnotations.d.ts.map +1 -0
- package/dist/server/toolAnnotations.js +70 -0
- package/dist/server/toolAnnotations.js.map +1 -0
- package/dist/server/toolSchemas/analyzeCode.d.ts +71 -0
- package/dist/server/toolSchemas/analyzeCode.d.ts.map +1 -0
- package/dist/server/toolSchemas/analyzeCode.js +50 -0
- package/dist/server/toolSchemas/analyzeCode.js.map +1 -0
- package/dist/server/toolSchemas/batchGetInfo.d.ts +32 -0
- package/dist/server/toolSchemas/batchGetInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/batchGetInfo.js +35 -0
- package/dist/server/toolSchemas/batchGetInfo.js.map +1 -0
- package/dist/server/toolSchemas/buildD365foProject.d.ts +44 -0
- package/dist/server/toolSchemas/buildD365foProject.d.ts.map +1 -0
- package/dist/server/toolSchemas/buildD365foProject.js +47 -0
- package/dist/server/toolSchemas/buildD365foProject.js.map +1 -0
- package/dist/server/toolSchemas/d365foFile.d.ts +99 -0
- package/dist/server/toolSchemas/d365foFile.d.ts.map +1 -0
- package/dist/server/toolSchemas/d365foFile.js +163 -0
- package/dist/server/toolSchemas/d365foFile.js.map +1 -0
- package/dist/server/toolSchemas/extensionInfo.d.ts +65 -0
- package/dist/server/toolSchemas/extensionInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/extensionInfo.js +73 -0
- package/dist/server/toolSchemas/extensionInfo.js.map +1 -0
- package/dist/server/toolSchemas/findReferences.d.ts +35 -0
- package/dist/server/toolSchemas/findReferences.d.ts.map +1 -0
- package/dist/server/toolSchemas/findReferences.js +35 -0
- package/dist/server/toolSchemas/findReferences.js.map +1 -0
- package/dist/server/toolSchemas/generateObject.d.ts +246 -0
- package/dist/server/toolSchemas/generateObject.d.ts.map +1 -0
- package/dist/server/toolSchemas/generateObject.js +158 -0
- package/dist/server/toolSchemas/generateObject.js.map +1 -0
- package/dist/server/toolSchemas/getKnowledge.d.ts +39 -0
- package/dist/server/toolSchemas/getKnowledge.d.ts.map +1 -0
- package/dist/server/toolSchemas/getKnowledge.js +46 -0
- package/dist/server/toolSchemas/getKnowledge.js.map +1 -0
- package/dist/server/toolSchemas/getMethod.d.ts +30 -0
- package/dist/server/toolSchemas/getMethod.d.ts.map +1 -0
- package/dist/server/toolSchemas/getMethod.js +34 -0
- package/dist/server/toolSchemas/getMethod.js.map +1 -0
- package/dist/server/toolSchemas/getObjectInfo.d.ts +24 -0
- package/dist/server/toolSchemas/getObjectInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/getObjectInfo.js +30 -0
- package/dist/server/toolSchemas/getObjectInfo.js.map +1 -0
- package/dist/server/toolSchemas/getWorkspaceInfo.d.ts +29 -0
- package/dist/server/toolSchemas/getWorkspaceInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/getWorkspaceInfo.js +29 -0
- package/dist/server/toolSchemas/getWorkspaceInfo.js.map +1 -0
- package/dist/server/toolSchemas/index.d.ts +1142 -0
- package/dist/server/toolSchemas/index.d.ts.map +1 -0
- package/dist/server/toolSchemas/index.js +60 -0
- package/dist/server/toolSchemas/index.js.map +1 -0
- package/dist/server/toolSchemas/labels.d.ts +172 -0
- package/dist/server/toolSchemas/labels.d.ts.map +1 -0
- package/dist/server/toolSchemas/labels.js +159 -0
- package/dist/server/toolSchemas/labels.js.map +1 -0
- package/dist/server/toolSchemas/objectPatterns.d.ts +93 -0
- package/dist/server/toolSchemas/objectPatterns.d.ts.map +1 -0
- package/dist/server/toolSchemas/objectPatterns.js +104 -0
- package/dist/server/toolSchemas/objectPatterns.js.map +1 -0
- package/dist/server/toolSchemas/prepare.d.ts +49 -0
- package/dist/server/toolSchemas/prepare.d.ts.map +1 -0
- package/dist/server/toolSchemas/prepare.js +57 -0
- package/dist/server/toolSchemas/prepare.js.map +1 -0
- package/dist/server/toolSchemas/reviewWorkspaceChanges.d.ts +20 -0
- package/dist/server/toolSchemas/reviewWorkspaceChanges.d.ts.map +1 -0
- package/dist/server/toolSchemas/reviewWorkspaceChanges.js +19 -0
- package/dist/server/toolSchemas/reviewWorkspaceChanges.js.map +1 -0
- package/dist/server/toolSchemas/runBpCheck.d.ts +36 -0
- package/dist/server/toolSchemas/runBpCheck.d.ts.map +1 -0
- package/dist/server/toolSchemas/runBpCheck.js +21 -0
- package/dist/server/toolSchemas/runBpCheck.js.map +1 -0
- package/dist/server/toolSchemas/runSystestClass.d.ts +32 -0
- package/dist/server/toolSchemas/runSystestClass.d.ts.map +1 -0
- package/dist/server/toolSchemas/runSystestClass.js +20 -0
- package/dist/server/toolSchemas/runSystestClass.js.map +1 -0
- package/dist/server/toolSchemas/search.d.ts +109 -0
- package/dist/server/toolSchemas/search.d.ts.map +1 -0
- package/dist/server/toolSchemas/search.js +123 -0
- package/dist/server/toolSchemas/search.js.map +1 -0
- package/dist/server/toolSchemas/securityInfo.d.ts +45 -0
- package/dist/server/toolSchemas/securityInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/securityInfo.js +39 -0
- package/dist/server/toolSchemas/securityInfo.js.map +1 -0
- package/dist/server/toolSchemas/suggestEdt.d.ts +29 -0
- package/dist/server/toolSchemas/suggestEdt.d.ts.map +1 -0
- package/dist/server/toolSchemas/suggestEdt.js +29 -0
- package/dist/server/toolSchemas/suggestEdt.js.map +1 -0
- package/dist/server/toolSchemas/triggerDbSync.d.ts +47 -0
- package/dist/server/toolSchemas/triggerDbSync.d.ts.map +1 -0
- package/dist/server/toolSchemas/triggerDbSync.js +31 -0
- package/dist/server/toolSchemas/triggerDbSync.js.map +1 -0
- package/dist/server/toolSchemas/undoLastModification.d.ts +20 -0
- package/dist/server/toolSchemas/undoLastModification.d.ts.map +1 -0
- package/dist/server/toolSchemas/undoLastModification.js +17 -0
- package/dist/server/toolSchemas/undoLastModification.js.map +1 -0
- package/dist/server/toolSchemas/updateSymbolIndex.d.ts +19 -0
- package/dist/server/toolSchemas/updateSymbolIndex.d.ts.map +1 -0
- package/dist/server/toolSchemas/updateSymbolIndex.js +18 -0
- package/dist/server/toolSchemas/updateSymbolIndex.js.map +1 -0
- package/dist/server/toolSchemas/validateCode.d.ts +35 -0
- package/dist/server/toolSchemas/validateCode.d.ts.map +1 -0
- package/dist/server/toolSchemas/validateCode.js +38 -0
- package/dist/server/toolSchemas/validateCode.js.map +1 -0
- package/dist/server/toolSchemas/validateObjectNaming.d.ts +33 -0
- package/dist/server/toolSchemas/validateObjectNaming.d.ts.map +1 -0
- package/dist/server/toolSchemas/validateObjectNaming.js +32 -0
- package/dist/server/toolSchemas/validateObjectNaming.js.map +1 -0
- package/dist/server/toolSchemas/verifyD365foProject.d.ts +50 -0
- package/dist/server/toolSchemas/verifyD365foProject.d.ts.map +1 -0
- package/dist/server/toolSchemas/verifyD365foProject.js +46 -0
- package/dist/server/toolSchemas/verifyD365foProject.js.map +1 -0
- package/dist/server/transport.d.ts +30 -0
- package/dist/server/transport.d.ts.map +1 -0
- package/dist/server/transport.js +391 -0
- package/dist/server/transport.js.map +1 -0
- package/dist/tools/analyzeCode.d.ts +17 -0
- package/dist/tools/analyzeCode.d.ts.map +1 -0
- package/dist/tools/analyzeCode.js +63 -0
- package/dist/tools/analyzeCode.js.map +1 -0
- package/dist/tools/analyzeCompleteness.d.ts +20 -0
- package/dist/tools/analyzeCompleteness.d.ts.map +1 -0
- package/dist/tools/analyzeCompleteness.js +103 -0
- package/dist/tools/analyzeCompleteness.js.map +1 -0
- package/dist/tools/analyzeExtensionPoints.d.ts +21 -0
- package/dist/tools/analyzeExtensionPoints.d.ts.map +1 -0
- package/dist/tools/analyzeExtensionPoints.js +343 -0
- package/dist/tools/analyzeExtensionPoints.js.map +1 -0
- package/dist/tools/analyzePatterns.d.ts +20 -0
- package/dist/tools/analyzePatterns.d.ts.map +1 -0
- package/dist/tools/analyzePatterns.js +71 -0
- package/dist/tools/analyzePatterns.js.map +1 -0
- package/dist/tools/apiUsagePatterns.d.ts +20 -0
- package/dist/tools/apiUsagePatterns.d.ts.map +1 -0
- package/dist/tools/apiUsagePatterns.js +136 -0
- package/dist/tools/apiUsagePatterns.js.map +1 -0
- package/dist/tools/batchGetInfo.d.ts +50 -0
- package/dist/tools/batchGetInfo.d.ts.map +1 -0
- package/dist/tools/batchGetInfo.js +52 -0
- package/dist/tools/batchGetInfo.js.map +1 -0
- package/dist/tools/batchSearch.d.ts +64 -0
- package/dist/tools/batchSearch.d.ts.map +1 -0
- package/dist/tools/batchSearch.js +265 -0
- package/dist/tools/batchSearch.js.map +1 -0
- package/dist/tools/buildProject.d.ts +28 -0
- package/dist/tools/buildProject.d.ts.map +1 -0
- package/dist/tools/buildProject.js +929 -0
- package/dist/tools/buildProject.js.map +1 -0
- package/dist/tools/classInfo.d.ts +8 -0
- package/dist/tools/classInfo.d.ts.map +1 -0
- package/dist/tools/classInfo.js +235 -0
- package/dist/tools/classInfo.js.map +1 -0
- package/dist/tools/codeGen.d.ts +19 -0
- package/dist/tools/codeGen.d.ts.map +1 -0
- package/dist/tools/codeGen.js +1956 -0
- package/dist/tools/codeGen.js.map +1 -0
- package/dist/tools/completion.d.ts +8 -0
- package/dist/tools/completion.d.ts.map +1 -0
- package/dist/tools/completion.js +272 -0
- package/dist/tools/completion.js.map +1 -0
- package/dist/tools/configKeyInfo.d.ts +22 -0
- package/dist/tools/configKeyInfo.d.ts.map +1 -0
- package/dist/tools/configKeyInfo.js +74 -0
- package/dist/tools/configKeyInfo.js.map +1 -0
- package/dist/tools/createD365File.d.ts +479 -0
- package/dist/tools/createD365File.d.ts.map +1 -0
- package/dist/tools/createD365File.js +4185 -0
- package/dist/tools/createD365File.js.map +1 -0
- package/dist/tools/createLabel.d.ts +51 -0
- package/dist/tools/createLabel.d.ts.map +1 -0
- package/dist/tools/createLabel.js +761 -0
- package/dist/tools/createLabel.js.map +1 -0
- package/dist/tools/d365foErrorHelp.d.ts +29 -0
- package/dist/tools/d365foErrorHelp.d.ts.map +1 -0
- package/dist/tools/d365foErrorHelp.js +389 -0
- package/dist/tools/d365foErrorHelp.js.map +1 -0
- package/dist/tools/d365foFile.d.ts +20 -0
- package/dist/tools/d365foFile.d.ts.map +1 -0
- package/dist/tools/d365foFile.js +58 -0
- package/dist/tools/d365foFile.js.map +1 -0
- package/dist/tools/d365foFileOpSpecs.d.ts +41 -0
- package/dist/tools/d365foFileOpSpecs.d.ts.map +1 -0
- package/dist/tools/d365foFileOpSpecs.js +336 -0
- package/dist/tools/d365foFileOpSpecs.js.map +1 -0
- package/dist/tools/dataEntityInfo.d.ts +23 -0
- package/dist/tools/dataEntityInfo.d.ts.map +1 -0
- package/dist/tools/dataEntityInfo.js +45 -0
- package/dist/tools/dataEntityInfo.js.map +1 -0
- package/dist/tools/dataEntityXml.d.ts +31 -0
- package/dist/tools/dataEntityXml.d.ts.map +1 -0
- package/dist/tools/dataEntityXml.js +131 -0
- package/dist/tools/dataEntityXml.js.map +1 -0
- package/dist/tools/dbSync.d.ts +8 -0
- package/dist/tools/dbSync.d.ts.map +1 -0
- package/dist/tools/dbSync.js +285 -0
- package/dist/tools/dbSync.js.map +1 -0
- package/dist/tools/edtInfo.d.ts +23 -0
- package/dist/tools/edtInfo.d.ts.map +1 -0
- package/dist/tools/edtInfo.js +122 -0
- package/dist/tools/edtInfo.js.map +1 -0
- package/dist/tools/enumInfo.d.ts +17 -0
- package/dist/tools/enumInfo.d.ts.map +1 -0
- package/dist/tools/enumInfo.js +44 -0
- package/dist/tools/enumInfo.js.map +1 -0
- package/dist/tools/extensionInfo.d.ts +26 -0
- package/dist/tools/extensionInfo.d.ts.map +1 -0
- package/dist/tools/extensionInfo.js +73 -0
- package/dist/tools/extensionInfo.js.map +1 -0
- package/dist/tools/extensionSearch.d.ts +20 -0
- package/dist/tools/extensionSearch.d.ts.map +1 -0
- package/dist/tools/extensionSearch.js +72 -0
- package/dist/tools/extensionSearch.js.map +1 -0
- package/dist/tools/extensionStrategyAdvisor.d.ts +15 -0
- package/dist/tools/extensionStrategyAdvisor.d.ts.map +1 -0
- package/dist/tools/extensionStrategyAdvisor.js +519 -0
- package/dist/tools/extensionStrategyAdvisor.js.map +1 -0
- package/dist/tools/findCocExtensions.d.ts +20 -0
- package/dist/tools/findCocExtensions.d.ts.map +1 -0
- package/dist/tools/findCocExtensions.js +285 -0
- package/dist/tools/findCocExtensions.js.map +1 -0
- package/dist/tools/findEventHandlers.d.ts +21 -0
- package/dist/tools/findEventHandlers.d.ts.map +1 -0
- package/dist/tools/findEventHandlers.js +196 -0
- package/dist/tools/findEventHandlers.js.map +1 -0
- package/dist/tools/findReferences.d.ts +30 -0
- package/dist/tools/findReferences.d.ts.map +1 -0
- package/dist/tools/findReferences.js +551 -0
- package/dist/tools/findReferences.js.map +1 -0
- package/dist/tools/formInfo.d.ts +13 -0
- package/dist/tools/formInfo.d.ts.map +1 -0
- package/dist/tools/formInfo.js +407 -0
- package/dist/tools/formInfo.js.map +1 -0
- package/dist/tools/formPattern.d.ts +19 -0
- package/dist/tools/formPattern.d.ts.map +1 -0
- package/dist/tools/formPattern.js +52 -0
- package/dist/tools/formPattern.js.map +1 -0
- package/dist/tools/generateD365Xml.d.ts +12 -0
- package/dist/tools/generateD365Xml.d.ts.map +1 -0
- package/dist/tools/generateD365Xml.js +1454 -0
- package/dist/tools/generateD365Xml.js.map +1 -0
- package/dist/tools/generateFindMethods.d.ts +69 -0
- package/dist/tools/generateFindMethods.d.ts.map +1 -0
- package/dist/tools/generateFindMethods.js +207 -0
- package/dist/tools/generateFindMethods.js.map +1 -0
- package/dist/tools/generateMetadata.d.ts +37 -0
- package/dist/tools/generateMetadata.d.ts.map +1 -0
- package/dist/tools/generateMetadata.js +213 -0
- package/dist/tools/generateMetadata.js.map +1 -0
- package/dist/tools/generateObject.d.ts +34 -0
- package/dist/tools/generateObject.d.ts.map +1 -0
- package/dist/tools/generateObject.js +47 -0
- package/dist/tools/generateObject.js.map +1 -0
- package/dist/tools/generateRelationXpp.d.ts +45 -0
- package/dist/tools/generateRelationXpp.d.ts.map +1 -0
- package/dist/tools/generateRelationXpp.js +129 -0
- package/dist/tools/generateRelationXpp.js.map +1 -0
- package/dist/tools/generateSmart.d.ts +32 -0
- package/dist/tools/generateSmart.d.ts.map +1 -0
- package/dist/tools/generateSmart.js +52 -0
- package/dist/tools/generateSmart.js.map +1 -0
- package/dist/tools/generateSmartForm.d.ts +82 -0
- package/dist/tools/generateSmartForm.d.ts.map +1 -0
- package/dist/tools/generateSmartForm.js +996 -0
- package/dist/tools/generateSmartForm.js.map +1 -0
- package/dist/tools/generateSmartReport.d.ts +90 -0
- package/dist/tools/generateSmartReport.d.ts.map +1 -0
- package/dist/tools/generateSmartReport.js +1254 -0
- package/dist/tools/generateSmartReport.js.map +1 -0
- package/dist/tools/generateSmartTable.d.ts +138 -0
- package/dist/tools/generateSmartTable.d.ts.map +1 -0
- package/dist/tools/generateSmartTable.js +1305 -0
- package/dist/tools/generateSmartTable.js.map +1 -0
- package/dist/tools/generateTableFields.d.ts +48 -0
- package/dist/tools/generateTableFields.d.ts.map +1 -0
- package/dist/tools/generateTableFields.js +186 -0
- package/dist/tools/generateTableFields.js.map +1 -0
- package/dist/tools/generateTableRelation.d.ts +35 -0
- package/dist/tools/generateTableRelation.d.ts.map +1 -0
- package/dist/tools/generateTableRelation.js +161 -0
- package/dist/tools/generateTableRelation.js.map +1 -0
- package/dist/tools/getFormPatternSpec.d.ts +13 -0
- package/dist/tools/getFormPatternSpec.d.ts.map +1 -0
- package/dist/tools/getFormPatternSpec.js +290 -0
- package/dist/tools/getFormPatternSpec.js.map +1 -0
- package/dist/tools/getFormPatterns.d.ts +68 -0
- package/dist/tools/getFormPatterns.d.ts.map +1 -0
- package/dist/tools/getFormPatterns.js +471 -0
- package/dist/tools/getFormPatterns.js.map +1 -0
- package/dist/tools/getKnowledge.d.ts +27 -0
- package/dist/tools/getKnowledge.d.ts.map +1 -0
- package/dist/tools/getKnowledge.js +50 -0
- package/dist/tools/getKnowledge.js.map +1 -0
- package/dist/tools/getLabelInfo.d.ts +21 -0
- package/dist/tools/getLabelInfo.d.ts.map +1 -0
- package/dist/tools/getLabelInfo.js +138 -0
- package/dist/tools/getLabelInfo.js.map +1 -0
- package/dist/tools/getMethod.d.ts +19 -0
- package/dist/tools/getMethod.d.ts.map +1 -0
- package/dist/tools/getMethod.js +77 -0
- package/dist/tools/getMethod.js.map +1 -0
- package/dist/tools/getMethodSource.d.ts +17 -0
- package/dist/tools/getMethodSource.d.ts.map +1 -0
- package/dist/tools/getMethodSource.js +161 -0
- package/dist/tools/getMethodSource.js.map +1 -0
- package/dist/tools/getObjectInfo.d.ts +17 -0
- package/dist/tools/getObjectInfo.d.ts.map +1 -0
- package/dist/tools/getObjectInfo.js +88 -0
- package/dist/tools/getObjectInfo.js.map +1 -0
- package/dist/tools/getTablePatterns.d.ts +45 -0
- package/dist/tools/getTablePatterns.d.ts.map +1 -0
- package/dist/tools/getTablePatterns.js +235 -0
- package/dist/tools/getTablePatterns.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/labels.d.ts +25 -0
- package/dist/tools/labels.d.ts.map +1 -0
- package/dist/tools/labels.js +111 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/macroInfo.d.ts +23 -0
- package/dist/tools/macroInfo.d.ts.map +1 -0
- package/dist/tools/macroInfo.js +62 -0
- package/dist/tools/macroInfo.js.map +1 -0
- package/dist/tools/mapInfo.d.ts +21 -0
- package/dist/tools/mapInfo.d.ts.map +1 -0
- package/dist/tools/mapInfo.js +54 -0
- package/dist/tools/mapInfo.js.map +1 -0
- package/dist/tools/mapXml.d.ts +26 -0
- package/dist/tools/mapXml.d.ts.map +1 -0
- package/dist/tools/mapXml.js +88 -0
- package/dist/tools/mapXml.js.map +1 -0
- package/dist/tools/menuItemInfo.d.ts +20 -0
- package/dist/tools/menuItemInfo.d.ts.map +1 -0
- package/dist/tools/menuItemInfo.js +185 -0
- package/dist/tools/menuItemInfo.js.map +1 -0
- package/dist/tools/methodSignature.d.ts +33 -0
- package/dist/tools/methodSignature.d.ts.map +1 -0
- package/dist/tools/methodSignature.js +348 -0
- package/dist/tools/methodSignature.js.map +1 -0
- package/dist/tools/modifyD365File.d.ts +130 -0
- package/dist/tools/modifyD365File.d.ts.map +1 -0
- package/dist/tools/modifyD365File.js +2179 -0
- package/dist/tools/modifyD365File.js.map +1 -0
- package/dist/tools/objectInfoRegistry.d.ts +36 -0
- package/dist/tools/objectInfoRegistry.d.ts.map +1 -0
- package/dist/tools/objectInfoRegistry.js +98 -0
- package/dist/tools/objectInfoRegistry.js.map +1 -0
- package/dist/tools/objectPatterns.d.ts +16 -0
- package/dist/tools/objectPatterns.d.ts.map +1 -0
- package/dist/tools/objectPatterns.js +84 -0
- package/dist/tools/objectPatterns.js.map +1 -0
- package/dist/tools/prepare.d.ts +18 -0
- package/dist/tools/prepare.d.ts.map +1 -0
- package/dist/tools/prepare.js +47 -0
- package/dist/tools/prepare.js.map +1 -0
- package/dist/tools/prepareChange.d.ts +43 -0
- package/dist/tools/prepareChange.d.ts.map +1 -0
- package/dist/tools/prepareChange.js +327 -0
- package/dist/tools/prepareChange.js.map +1 -0
- package/dist/tools/prepareCreate.d.ts +45 -0
- package/dist/tools/prepareCreate.d.ts.map +1 -0
- package/dist/tools/prepareCreate.js +263 -0
- package/dist/tools/prepareCreate.js.map +1 -0
- package/dist/tools/queryInfo.d.ts +17 -0
- package/dist/tools/queryInfo.d.ts.map +1 -0
- package/dist/tools/queryInfo.js +46 -0
- package/dist/tools/queryInfo.js.map +1 -0
- package/dist/tools/queryViewXml.d.ts +36 -0
- package/dist/tools/queryViewXml.d.ts.map +1 -0
- package/dist/tools/queryViewXml.js +129 -0
- package/dist/tools/queryViewXml.js.map +1 -0
- package/dist/tools/renameLabel.d.ts +29 -0
- package/dist/tools/renameLabel.d.ts.map +1 -0
- package/dist/tools/renameLabel.js +377 -0
- package/dist/tools/renameLabel.js.map +1 -0
- package/dist/tools/repairFormControls.d.ts +21 -0
- package/dist/tools/repairFormControls.d.ts.map +1 -0
- package/dist/tools/repairFormControls.js +151 -0
- package/dist/tools/repairFormControls.js.map +1 -0
- package/dist/tools/reportInfo.d.ts +14 -0
- package/dist/tools/reportInfo.d.ts.map +1 -0
- package/dist/tools/reportInfo.js +302 -0
- package/dist/tools/reportInfo.js.map +1 -0
- package/dist/tools/resolveReferences.d.ts +89 -0
- package/dist/tools/resolveReferences.d.ts.map +1 -0
- package/dist/tools/resolveReferences.js +791 -0
- package/dist/tools/resolveReferences.js.map +1 -0
- package/dist/tools/reviewWorkspaceChanges.d.ts +14 -0
- package/dist/tools/reviewWorkspaceChanges.d.ts.map +1 -0
- package/dist/tools/reviewWorkspaceChanges.js +73 -0
- package/dist/tools/reviewWorkspaceChanges.js.map +1 -0
- package/dist/tools/runBpCheck.d.ts +14 -0
- package/dist/tools/runBpCheck.d.ts.map +1 -0
- package/dist/tools/runBpCheck.js +241 -0
- package/dist/tools/runBpCheck.js.map +1 -0
- package/dist/tools/search.d.ts +20 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +246 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/searchLabels.d.ts +26 -0
- package/dist/tools/searchLabels.d.ts.map +1 -0
- package/dist/tools/searchLabels.js +91 -0
- package/dist/tools/searchLabels.js.map +1 -0
- package/dist/tools/searchUnified.d.ts +28 -0
- package/dist/tools/searchUnified.d.ts.map +1 -0
- package/dist/tools/searchUnified.js +48 -0
- package/dist/tools/searchUnified.js.map +1 -0
- package/dist/tools/securityArtifactInfo.d.ts +14 -0
- package/dist/tools/securityArtifactInfo.d.ts.map +1 -0
- package/dist/tools/securityArtifactInfo.js +192 -0
- package/dist/tools/securityArtifactInfo.js.map +1 -0
- package/dist/tools/securityCoverageInfo.d.ts +21 -0
- package/dist/tools/securityCoverageInfo.d.ts.map +1 -0
- package/dist/tools/securityCoverageInfo.js +248 -0
- package/dist/tools/securityCoverageInfo.js.map +1 -0
- package/dist/tools/securityInfo.d.ts +22 -0
- package/dist/tools/securityInfo.d.ts.map +1 -0
- package/dist/tools/securityInfo.js +43 -0
- package/dist/tools/securityInfo.js.map +1 -0
- package/dist/tools/securityPolicyInfo.d.ts +22 -0
- package/dist/tools/securityPolicyInfo.d.ts.map +1 -0
- package/dist/tools/securityPolicyInfo.js +49 -0
- package/dist/tools/securityPolicyInfo.js.map +1 -0
- package/dist/tools/securityPrivilegeXml.d.ts +21 -0
- package/dist/tools/securityPrivilegeXml.d.ts.map +1 -0
- package/dist/tools/securityPrivilegeXml.js +61 -0
- package/dist/tools/securityPrivilegeXml.js.map +1 -0
- package/dist/tools/serviceInfo.d.ts +25 -0
- package/dist/tools/serviceInfo.d.ts.map +1 -0
- package/dist/tools/serviceInfo.js +93 -0
- package/dist/tools/serviceInfo.js.map +1 -0
- package/dist/tools/suggestEdt.d.ts +15 -0
- package/dist/tools/suggestEdt.d.ts.map +1 -0
- package/dist/tools/suggestEdt.js +348 -0
- package/dist/tools/suggestEdt.js.map +1 -0
- package/dist/tools/suggestImplementation.d.ts +20 -0
- package/dist/tools/suggestImplementation.d.ts.map +1 -0
- package/dist/tools/suggestImplementation.js +144 -0
- package/dist/tools/suggestImplementation.js.map +1 -0
- package/dist/tools/sysTestRunner.d.ts +14 -0
- package/dist/tools/sysTestRunner.d.ts.map +1 -0
- package/dist/tools/sysTestRunner.js +145 -0
- package/dist/tools/sysTestRunner.js.map +1 -0
- package/dist/tools/tableExtensionInfo.d.ts +91 -0
- package/dist/tools/tableExtensionInfo.d.ts.map +1 -0
- package/dist/tools/tableExtensionInfo.js +305 -0
- package/dist/tools/tableExtensionInfo.js.map +1 -0
- package/dist/tools/tableInfo.d.ts +23 -0
- package/dist/tools/tableInfo.d.ts.map +1 -0
- package/dist/tools/tableInfo.js +125 -0
- package/dist/tools/tableInfo.js.map +1 -0
- package/dist/tools/toolHandler.d.ts +4 -0
- package/dist/tools/toolHandler.d.ts.map +1 -0
- package/dist/tools/toolHandler.js +508 -0
- package/dist/tools/toolHandler.js.map +1 -0
- package/dist/tools/undoLastModification.d.ts +15 -0
- package/dist/tools/undoLastModification.d.ts.map +1 -0
- package/dist/tools/undoLastModification.js +147 -0
- package/dist/tools/undoLastModification.js.map +1 -0
- package/dist/tools/updateSymbolIndex.d.ts +15 -0
- package/dist/tools/updateSymbolIndex.d.ts.map +1 -0
- package/dist/tools/updateSymbolIndex.js +520 -0
- package/dist/tools/updateSymbolIndex.js.map +1 -0
- package/dist/tools/validateCode.d.ts +24 -0
- package/dist/tools/validateCode.d.ts.map +1 -0
- package/dist/tools/validateCode.js +201 -0
- package/dist/tools/validateCode.js.map +1 -0
- package/dist/tools/validateFormPattern.d.ts +51 -0
- package/dist/tools/validateFormPattern.d.ts.map +1 -0
- package/dist/tools/validateFormPattern.js +201 -0
- package/dist/tools/validateFormPattern.js.map +1 -0
- package/dist/tools/validateObjectNaming.d.ts +21 -0
- package/dist/tools/validateObjectNaming.d.ts.map +1 -0
- package/dist/tools/validateObjectNaming.js +319 -0
- package/dist/tools/validateObjectNaming.js.map +1 -0
- package/dist/tools/validateXpp.d.ts +79 -0
- package/dist/tools/validateXpp.d.ts.map +1 -0
- package/dist/tools/validateXpp.js +705 -0
- package/dist/tools/validateXpp.js.map +1 -0
- package/dist/tools/verifyD365Project.d.ts +21 -0
- package/dist/tools/verifyD365Project.d.ts.map +1 -0
- package/dist/tools/verifyD365Project.js +299 -0
- package/dist/tools/verifyD365Project.js.map +1 -0
- package/dist/tools/viewInfo.d.ts +17 -0
- package/dist/tools/viewInfo.d.ts.map +1 -0
- package/dist/tools/viewInfo.js +46 -0
- package/dist/tools/viewInfo.js.map +1 -0
- package/dist/tools/xppKnowledge.d.ts +45 -0
- package/dist/tools/xppKnowledge.d.ts.map +1 -0
- package/dist/tools/xppKnowledge.js +2815 -0
- package/dist/tools/xppKnowledge.js.map +1 -0
- package/dist/types/context.d.ts +56 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +5 -0
- package/dist/types/context.js.map +1 -0
- package/dist/utils/callDedup.d.ts +29 -0
- package/dist/utils/callDedup.d.ts.map +1 -0
- package/dist/utils/callDedup.js +87 -0
- package/dist/utils/callDedup.js.map +1 -0
- package/dist/utils/configManager.d.ts +307 -0
- package/dist/utils/configManager.d.ts.map +1 -0
- package/dist/utils/configManager.js +1169 -0
- package/dist/utils/configManager.js.map +1 -0
- package/dist/utils/d365XmlNormalizer.d.ts +9 -0
- package/dist/utils/d365XmlNormalizer.d.ts.map +1 -0
- package/dist/utils/d365XmlNormalizer.js +24 -0
- package/dist/utils/d365XmlNormalizer.js.map +1 -0
- package/dist/utils/edtExtensionValidator.d.ts +110 -0
- package/dist/utils/edtExtensionValidator.d.ts.map +1 -0
- package/dist/utils/edtExtensionValidator.js +367 -0
- package/dist/utils/edtExtensionValidator.js.map +1 -0
- package/dist/utils/eolUtils.d.ts +15 -0
- package/dist/utils/eolUtils.d.ts.map +1 -0
- package/dist/utils/eolUtils.js +21 -0
- package/dist/utils/eolUtils.js.map +1 -0
- package/dist/utils/extractManifest.d.ts +34 -0
- package/dist/utils/extractManifest.d.ts.map +1 -0
- package/dist/utils/extractManifest.js +43 -0
- package/dist/utils/extractManifest.js.map +1 -0
- package/dist/utils/fieldControlTypes.d.ts +44 -0
- package/dist/utils/fieldControlTypes.d.ts.map +1 -0
- package/dist/utils/fieldControlTypes.js +97 -0
- package/dist/utils/fieldControlTypes.js.map +1 -0
- package/dist/utils/formCloner.d.ts +77 -0
- package/dist/utils/formCloner.d.ts.map +1 -0
- package/dist/utils/formCloner.js +364 -0
- package/dist/utils/formCloner.js.map +1 -0
- package/dist/utils/formControlExpander.d.ts +68 -0
- package/dist/utils/formControlExpander.d.ts.map +1 -0
- package/dist/utils/formControlExpander.js +207 -0
- package/dist/utils/formControlExpander.js.map +1 -0
- package/dist/utils/formControlRepair.d.ts +81 -0
- package/dist/utils/formControlRepair.d.ts.map +1 -0
- package/dist/utils/formControlRepair.js +203 -0
- package/dist/utils/formControlRepair.js.map +1 -0
- package/dist/utils/formExtensionShapeValidator.d.ts +44 -0
- package/dist/utils/formExtensionShapeValidator.d.ts.map +1 -0
- package/dist/utils/formExtensionShapeValidator.js +99 -0
- package/dist/utils/formExtensionShapeValidator.js.map +1 -0
- package/dist/utils/formPatternTemplates.d.ts +77 -0
- package/dist/utils/formPatternTemplates.d.ts.map +1 -0
- package/dist/utils/formPatternTemplates.js +1917 -0
- package/dist/utils/formPatternTemplates.js.map +1 -0
- package/dist/utils/fsExtensionScanner.d.ts +76 -0
- package/dist/utils/fsExtensionScanner.d.ts.map +1 -0
- package/dist/utils/fsExtensionScanner.js +271 -0
- package/dist/utils/fsExtensionScanner.js.map +1 -0
- package/dist/utils/fuzzyMatching.d.ts +41 -0
- package/dist/utils/fuzzyMatching.d.ts.map +1 -0
- package/dist/utils/fuzzyMatching.js +186 -0
- package/dist/utils/fuzzyMatching.js.map +1 -0
- package/dist/utils/indexStaleness.d.ts +30 -0
- package/dist/utils/indexStaleness.d.ts.map +1 -0
- package/dist/utils/indexStaleness.js +104 -0
- package/dist/utils/indexStaleness.js.map +1 -0
- package/dist/utils/loadEnv.d.ts +32 -0
- package/dist/utils/loadEnv.d.ts.map +1 -0
- package/dist/utils/loadEnv.js +83 -0
- package/dist/utils/loadEnv.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +11 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/metadataResolver.d.ts +155 -0
- package/dist/utils/metadataResolver.d.ts.map +1 -0
- package/dist/utils/metadataResolver.js +277 -0
- package/dist/utils/metadataResolver.js.map +1 -0
- package/dist/utils/modelClassifier.d.ts +180 -0
- package/dist/utils/modelClassifier.d.ts.map +1 -0
- package/dist/utils/modelClassifier.js +373 -0
- package/dist/utils/modelClassifier.js.map +1 -0
- package/dist/utils/operationLocks.d.ts +26 -0
- package/dist/utils/operationLocks.d.ts.map +1 -0
- package/dist/utils/operationLocks.js +182 -0
- package/dist/utils/operationLocks.js.map +1 -0
- package/dist/utils/packageResolver.d.ts +52 -0
- package/dist/utils/packageResolver.d.ts.map +1 -0
- package/dist/utils/packageResolver.js +174 -0
- package/dist/utils/packageResolver.js.map +1 -0
- package/dist/utils/pathContainment.d.ts +60 -0
- package/dist/utils/pathContainment.d.ts.map +1 -0
- package/dist/utils/pathContainment.js +270 -0
- package/dist/utils/pathContainment.js.map +1 -0
- package/dist/utils/projectUtils.d.ts +14 -0
- package/dist/utils/projectUtils.d.ts.map +1 -0
- package/dist/utils/projectUtils.js +48 -0
- package/dist/utils/projectUtils.js.map +1 -0
- package/dist/utils/provenanceStore.d.ts +54 -0
- package/dist/utils/provenanceStore.d.ts.map +1 -0
- package/dist/utils/provenanceStore.js +203 -0
- package/dist/utils/provenanceStore.js.map +1 -0
- package/dist/utils/richContext.d.ts +45 -0
- package/dist/utils/richContext.d.ts.map +1 -0
- package/dist/utils/richContext.js +316 -0
- package/dist/utils/richContext.js.map +1 -0
- package/dist/utils/smartXmlBuilder.d.ts +187 -0
- package/dist/utils/smartXmlBuilder.d.ts.map +1 -0
- package/dist/utils/smartXmlBuilder.js +504 -0
- package/dist/utils/smartXmlBuilder.js.map +1 -0
- package/dist/utils/stdioSessionInfo.d.ts +53 -0
- package/dist/utils/stdioSessionInfo.d.ts.map +1 -0
- package/dist/utils/stdioSessionInfo.js +47 -0
- package/dist/utils/stdioSessionInfo.js.map +1 -0
- package/dist/utils/suggestionEngine.d.ts +20 -0
- package/dist/utils/suggestionEngine.d.ts.map +1 -0
- package/dist/utils/suggestionEngine.js +145 -0
- package/dist/utils/suggestionEngine.js.map +1 -0
- package/dist/utils/symbolLookup.d.ts +60 -0
- package/dist/utils/symbolLookup.d.ts.map +1 -0
- package/dist/utils/symbolLookup.js +0 -0
- package/dist/utils/symbolLookup.js.map +1 -0
- package/dist/utils/terminalUi.d.ts +85 -0
- package/dist/utils/terminalUi.d.ts.map +1 -0
- package/dist/utils/terminalUi.js +182 -0
- package/dist/utils/terminalUi.js.map +1 -0
- package/dist/utils/toolMetrics.d.ts +32 -0
- package/dist/utils/toolMetrics.d.ts.map +1 -0
- package/dist/utils/toolMetrics.js +89 -0
- package/dist/utils/toolMetrics.js.map +1 -0
- package/dist/utils/toolProgressMessage.d.ts +8 -0
- package/dist/utils/toolProgressMessage.d.ts.map +1 -0
- package/dist/utils/toolProgressMessage.js +182 -0
- package/dist/utils/toolProgressMessage.js.map +1 -0
- package/dist/utils/workspaceDetector.d.ts +51 -0
- package/dist/utils/workspaceDetector.d.ts.map +1 -0
- package/dist/utils/workspaceDetector.js +328 -0
- package/dist/utils/workspaceDetector.js.map +1 -0
- package/dist/utils/xppConfigProvider.d.ts +48 -0
- package/dist/utils/xppConfigProvider.d.ts.map +1 -0
- package/dist/utils/xppConfigProvider.js +121 -0
- package/dist/utils/xppConfigProvider.js.map +1 -0
- package/dist/utils/xppDocGen.d.ts +39 -0
- package/dist/utils/xppDocGen.d.ts.map +1 -0
- package/dist/utils/xppDocGen.js +518 -0
- package/dist/utils/xppDocGen.js.map +1 -0
- package/dist/utils/xppFormat.d.ts +21 -0
- package/dist/utils/xppFormat.d.ts.map +1 -0
- package/dist/utils/xppFormat.js +102 -0
- package/dist/utils/xppFormat.js.map +1 -0
- package/dist/utils/xppSelectLint.d.ts +18 -0
- package/dist/utils/xppSelectLint.d.ts.map +1 -0
- package/dist/utils/xppSelectLint.js +80 -0
- package/dist/utils/xppSelectLint.js.map +1 -0
- package/dist/validation/formPatternValidator.d.ts +53 -0
- package/dist/validation/formPatternValidator.d.ts.map +1 -0
- package/dist/validation/formPatternValidator.js +454 -0
- package/dist/validation/formPatternValidator.js.map +1 -0
- package/dist/workspace/contextRanker.d.ts +58 -0
- package/dist/workspace/contextRanker.d.ts.map +1 -0
- package/dist/workspace/contextRanker.js +216 -0
- package/dist/workspace/contextRanker.js.map +1 -0
- package/dist/workspace/contextSnapshot.d.ts +68 -0
- package/dist/workspace/contextSnapshot.d.ts.map +1 -0
- package/dist/workspace/contextSnapshot.js +193 -0
- package/dist/workspace/contextSnapshot.js.map +1 -0
- package/dist/workspace/hybridSearch.d.ts +39 -0
- package/dist/workspace/hybridSearch.d.ts.map +1 -0
- package/dist/workspace/hybridSearch.js +96 -0
- package/dist/workspace/hybridSearch.js.map +1 -0
- package/dist/workspace/workspaceScanner.d.ts +95 -0
- package/dist/workspace/workspaceScanner.d.ts.map +1 -0
- package/dist/workspace/workspaceScanner.js +247 -0
- package/dist/workspace/workspaceScanner.js.map +1 -0
- package/dist/workspace/workspaceUtils.d.ts +23 -0
- package/dist/workspace/workspaceUtils.d.ts.map +1 -0
- package/dist/workspace/workspaceUtils.js +77 -0
- package/dist/workspace/workspaceUtils.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,1254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate Smart Report Tool
|
|
3
|
+
* AI-driven SSRS report generation using indexed metadata patterns.
|
|
4
|
+
*
|
|
5
|
+
* Generates up to 7+ D365FO objects in a single call:
|
|
6
|
+
* 1. TmpTable(s) (AxTable, TableType=TempDB) — holds report rows; extras for additionalDatasets
|
|
7
|
+
* 2. Contract class (DataContractAttribute) — dialog parameters, optional validate()
|
|
8
|
+
* 3. DP class (SrsReportDataProviderBase/PreProcess) — fills TmpTable, query-based or manual
|
|
9
|
+
* 4. Controller class (SrsReportRunController/SrsPrintMgmtController) — optional
|
|
10
|
+
* 5. Output menu item (AxMenuItemOutput) — generated together with Controller
|
|
11
|
+
* 6. Report (AxReport + RDL) — multi-dataset, page header, optional GroupedWithTotals tablix
|
|
12
|
+
*
|
|
13
|
+
* Architecture follows generate_smart_table / generate_smart_form patterns:
|
|
14
|
+
* - Exported Tool definition + async handler
|
|
15
|
+
* - Symbol index queries for EDT resolution, copyFrom, patterns
|
|
16
|
+
* - Dual-path output: Azure/Linux returns XML/source text; Windows writes + adds to project
|
|
17
|
+
*
|
|
18
|
+
* References:
|
|
19
|
+
* - "Microsoft Dynamics AX 2012 Reporting Cookbook" (chapters 2–4)
|
|
20
|
+
* - D365FO SSRS best practices: Contract–DP–Controller trio
|
|
21
|
+
* - XmlTemplateGenerator.generateAxReportXml() for AxReport XML skeleton
|
|
22
|
+
*/
|
|
23
|
+
import { SmartXmlBuilder } from '../utils/smartXmlBuilder.js';
|
|
24
|
+
import { XmlTemplateGenerator } from './createD365File.js';
|
|
25
|
+
import { ProjectFileManager } from './createD365File.js';
|
|
26
|
+
import path from 'path';
|
|
27
|
+
import fs from 'fs';
|
|
28
|
+
import { getConfigManager } from '../utils/configManager.js';
|
|
29
|
+
import { resolveObjectPrefix, applyObjectPrefix, getObjectSuffix, applyObjectSuffix } from '../utils/modelClassifier.js';
|
|
30
|
+
import { extractModelFromProject, findProjectInSolution } from '../utils/projectUtils.js';
|
|
31
|
+
import { normalizeD365Xml } from '../utils/d365XmlNormalizer.js';
|
|
32
|
+
import { canonicalSymbolName, lookupSymbolNocase } from '../utils/symbolLookup.js';
|
|
33
|
+
export const generateSmartReportTool = {
|
|
34
|
+
name: 'generate_smart_report',
|
|
35
|
+
description: `🎨 AI-driven SSRS report generation — creates up to 7 D365FO objects in one call.
|
|
36
|
+
|
|
37
|
+
Generates:
|
|
38
|
+
1. TmpTable(s) (TempDB) — report data rows; extra tables for each additionalDatasets entry
|
|
39
|
+
2. Contract class — dialog parameters with optional auto-generated validate()
|
|
40
|
+
3. DP class (SrsReportDataProviderBase or PreProcess) — with query-based or manual processReport()
|
|
41
|
+
4. Controller class (SrsReportRunController or SrsPrintMgmtController) — optional
|
|
42
|
+
5. Output menu item (AxMenuItemOutput) — generated together with Controller
|
|
43
|
+
6. AxReport XML + RDL — multi-dataset, page header (company/title/date), optional GroupedWithTotals tablix
|
|
44
|
+
|
|
45
|
+
Strategies:
|
|
46
|
+
- fieldsHint: comma-separated field names → auto-suggest EDTs, build TmpTable + report fields
|
|
47
|
+
- fields: structured field specs with explicit EDTs and data types
|
|
48
|
+
- contractParams: dialog parameters → Contract class with parm methods + validate()
|
|
49
|
+
- copyFrom: copy field structure from existing report's TmpTable
|
|
50
|
+
- designStyle: "SimpleList" (default) or "GroupedWithTotals" (row group + SUM aggregates)
|
|
51
|
+
- aotQuery: query-based DP using this.parmQuery() instead of manual while-select
|
|
52
|
+
- callerTableName: pre-fill contract from args.record() in prePromptModifyContract()
|
|
53
|
+
- controllerType: "simple" (default) or "printMgmt" (SrsPrintMgmtController)
|
|
54
|
+
- preProcess: true → SrsReportDataProviderPreProcess with preProcess() stub
|
|
55
|
+
- additionalDatasets: extra TmpTables + DP getters for multi-dataset reports
|
|
56
|
+
|
|
57
|
+
Examples:
|
|
58
|
+
- generate_object(mode="scaffold", objectType="report", name="InventByZones", fieldsHint="ItemId, ItemName, Qty, Zone", caption="Inventory by Zones")
|
|
59
|
+
- generate_object(mode="scaffold", objectType="report", name="CustBalance", fieldsHint="CustAccount, Name, Balance", contractParams=[{name:"FromDate",type:"TransDate",mandatory:true},{name:"ToDate",type:"TransDate"}])
|
|
60
|
+
- generate_object(mode="scaffold", objectType="report", name="SalesReport", copyFrom="SalesInvoice", designStyle="GroupedWithTotals")
|
|
61
|
+
- generate_object(mode="scaffold", objectType="report", name="CustOpenItems", fieldsHint="CustAccount, Amount, DueDate", callerTableName="CustTable", aotQuery="CustOpenTrans")`,
|
|
62
|
+
inputSchema: {
|
|
63
|
+
type: 'object',
|
|
64
|
+
properties: {
|
|
65
|
+
name: {
|
|
66
|
+
type: 'string',
|
|
67
|
+
description: 'Base report name WITHOUT model prefix (e.g. "InventByZones"). Prefix is applied automatically from the model name.',
|
|
68
|
+
},
|
|
69
|
+
caption: {
|
|
70
|
+
type: 'string',
|
|
71
|
+
description: 'Human-readable caption/title for the report (e.g. "Inventory by Zones"). Used in RDL header and menu item.',
|
|
72
|
+
},
|
|
73
|
+
fieldsHint: {
|
|
74
|
+
type: 'string',
|
|
75
|
+
description: 'Comma-separated field names for the TmpTable (e.g. "ItemId, ItemName, Qty, Zone"). ' +
|
|
76
|
+
'EDTs are auto-suggested from names. Use this for quick generation. ' +
|
|
77
|
+
'For full control, use the `fields` array parameter instead.',
|
|
78
|
+
},
|
|
79
|
+
fields: {
|
|
80
|
+
type: 'array',
|
|
81
|
+
description: 'Structured field specs. Takes priority over fieldsHint.',
|
|
82
|
+
items: {
|
|
83
|
+
type: 'object',
|
|
84
|
+
properties: {
|
|
85
|
+
name: { type: 'string', description: 'Field name' },
|
|
86
|
+
edt: { type: 'string', description: 'EDT name (auto-suggested when omitted)' },
|
|
87
|
+
dataType: { type: 'string', description: '.NET data type for RDL (e.g. "System.String", "System.Double")' },
|
|
88
|
+
label: { type: 'string', description: 'Label ref for column caption' },
|
|
89
|
+
},
|
|
90
|
+
required: ['name'],
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
contractParams: {
|
|
94
|
+
type: 'array',
|
|
95
|
+
description: 'Dialog parameters for the Contract class.',
|
|
96
|
+
items: {
|
|
97
|
+
type: 'object',
|
|
98
|
+
properties: {
|
|
99
|
+
name: { type: 'string', description: 'Parameter name (becomes parm method)' },
|
|
100
|
+
type: { type: 'string', description: 'X++ type — EDT or primitive (e.g. "TransDate", "CustAccount")' },
|
|
101
|
+
label: { type: 'string', description: 'Dialog prompt label' },
|
|
102
|
+
mandatory: { type: 'boolean', description: 'Whether parameter is required' },
|
|
103
|
+
},
|
|
104
|
+
required: ['name'],
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
generateController: {
|
|
108
|
+
type: 'boolean',
|
|
109
|
+
description: 'Whether to generate a Controller class (default: true)',
|
|
110
|
+
},
|
|
111
|
+
designStyle: {
|
|
112
|
+
type: 'string',
|
|
113
|
+
description: 'RDL design pattern: "SimpleList" (default — flat detail tablix) or "GroupedWithTotals" (row group + sum aggregates)',
|
|
114
|
+
},
|
|
115
|
+
copyFrom: {
|
|
116
|
+
type: 'string',
|
|
117
|
+
description: 'Copy field structure from an existing report name (reads fields from its DP TmpTable)',
|
|
118
|
+
},
|
|
119
|
+
modelName: {
|
|
120
|
+
type: 'string',
|
|
121
|
+
description: 'Model name (auto-detected from projectPath)',
|
|
122
|
+
},
|
|
123
|
+
projectPath: {
|
|
124
|
+
type: 'string',
|
|
125
|
+
description: 'Path to .rnrproj file',
|
|
126
|
+
},
|
|
127
|
+
solutionPath: {
|
|
128
|
+
type: 'string',
|
|
129
|
+
description: 'Path to solution directory',
|
|
130
|
+
},
|
|
131
|
+
packagePath: {
|
|
132
|
+
type: 'string',
|
|
133
|
+
description: 'Base packages directory path',
|
|
134
|
+
},
|
|
135
|
+
aotQuery: {
|
|
136
|
+
type: 'string',
|
|
137
|
+
description: 'AOT query name. When provided, the DP uses a query-based processReport() with this.parmQuery() instead of a manual while-select placeholder.',
|
|
138
|
+
},
|
|
139
|
+
callerTableName: {
|
|
140
|
+
type: 'string',
|
|
141
|
+
description: 'Table name of the caller record (e.g. "CustTable"). Generates parmArgs() pre-fill in prePromptModifyContract() that reads args.record() and maps matching fields to contract params.',
|
|
142
|
+
},
|
|
143
|
+
preProcess: {
|
|
144
|
+
type: 'boolean',
|
|
145
|
+
description: 'When true, DP extends SrsReportDataProviderPreProcess instead of SrsReportDataProviderBase. Generates a preProcess() stub and removes [SRSReportParameterAttribute] (contract passed via Controller).',
|
|
146
|
+
},
|
|
147
|
+
controllerType: {
|
|
148
|
+
type: 'string',
|
|
149
|
+
description: '"simple" (default — SrsReportRunController) or "printMgmt" (SrsPrintMgmtController with parmPrintMgmtDocType). Only relevant when generateController=true.',
|
|
150
|
+
},
|
|
151
|
+
additionalDatasets: {
|
|
152
|
+
type: 'array',
|
|
153
|
+
description: 'Extra datasets. Each entry generates an additional TmpTable (TempDB) and a corresponding get<Table>() method in the DP.',
|
|
154
|
+
items: {
|
|
155
|
+
type: 'object',
|
|
156
|
+
properties: {
|
|
157
|
+
name: { type: 'string', description: 'Dataset name suffix (e.g. "Header" → MyReportHeaderTmp)' },
|
|
158
|
+
fieldsHint: { type: 'string', description: 'Comma-separated field names for this extra dataset' },
|
|
159
|
+
fields: {
|
|
160
|
+
type: 'array',
|
|
161
|
+
items: { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] },
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
required: ['name'],
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
required: ['name'],
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
export async function handleGenerateSmartReport(args, symbolIndex) {
|
|
172
|
+
const { name, caption, fieldsHint, fields: structuredFields, contractParams = [], generateController = true, designStyle = 'SimpleList', copyFrom, aotQuery, callerTableName, preProcess = false, controllerType = 'simple', additionalDatasets = [], modelName, projectPath, solutionPath, packagePath: argPackagePath, } = args;
|
|
173
|
+
const log = (msg) => console.error(`[generateSmartReport] ${msg}`);
|
|
174
|
+
log(`Generating report: ${name}, fields=${fieldsHint ?? '(structured)'}, copyFrom=${copyFrom ?? 'none'}, contractParams=${contractParams.length}`);
|
|
175
|
+
const configManager = getConfigManager();
|
|
176
|
+
await configManager.ensureLoaded();
|
|
177
|
+
const resolvedPackagePath = argPackagePath || configManager.getPackagePath();
|
|
178
|
+
if (!resolvedPackagePath && process.platform === 'win32') {
|
|
179
|
+
throw new Error('❌ Cannot determine PackagesLocalDirectory path.\n\n' +
|
|
180
|
+
'Neither C:\\AosService\\PackagesLocalDirectory nor K:\\AosService\\PackagesLocalDirectory were found.\n\n' +
|
|
181
|
+
'Add "packagePath" to your .mcp.json or pass packagePath to this tool call.');
|
|
182
|
+
}
|
|
183
|
+
const pkgPath = resolvedPackagePath || 'K:\\AosService\\PackagesLocalDirectory';
|
|
184
|
+
let resolvedProjectPath = projectPath;
|
|
185
|
+
let resolvedSolutionPath = solutionPath;
|
|
186
|
+
if (!resolvedProjectPath && !resolvedSolutionPath) {
|
|
187
|
+
resolvedProjectPath = (await configManager.getProjectPath()) || undefined;
|
|
188
|
+
resolvedSolutionPath = (await configManager.getSolutionPath()) || undefined;
|
|
189
|
+
}
|
|
190
|
+
let resolvedModel = modelName;
|
|
191
|
+
if (resolvedProjectPath) {
|
|
192
|
+
const extracted = extractModelFromProject(resolvedProjectPath);
|
|
193
|
+
if (extracted)
|
|
194
|
+
resolvedModel = extracted;
|
|
195
|
+
}
|
|
196
|
+
else if (resolvedSolutionPath) {
|
|
197
|
+
const proj = findProjectInSolution(resolvedSolutionPath);
|
|
198
|
+
if (proj) {
|
|
199
|
+
const extracted = extractModelFromProject(proj);
|
|
200
|
+
if (extracted)
|
|
201
|
+
resolvedModel = extracted;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const isNonWindows = process.platform !== 'win32';
|
|
205
|
+
if (!resolvedModel) {
|
|
206
|
+
const configModel = configManager.getModelName();
|
|
207
|
+
const autoModel = configModel ? null : (await configManager.getAutoDetectedModelName());
|
|
208
|
+
resolvedModel = configModel || autoModel || process.env.D365FO_MODEL_NAME || modelName || undefined;
|
|
209
|
+
if (!resolvedModel && !isNonWindows) {
|
|
210
|
+
throw new Error('Could not resolve model name. Provide modelName, projectPath, or solutionPath, ' +
|
|
211
|
+
'or configure projectPath/solutionPath in .mcp.json or set D365FO_MODEL_NAME env var.');
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
log(`Model: ${resolvedModel ?? '(none)'}`);
|
|
215
|
+
// Apply prefix
|
|
216
|
+
const objectPrefix = resolvedModel ? resolveObjectPrefix(resolvedModel) : '';
|
|
217
|
+
let finalName = objectPrefix ? applyObjectPrefix(name, objectPrefix) : name;
|
|
218
|
+
const objectSuffix = getObjectSuffix();
|
|
219
|
+
finalName = applyObjectSuffix(finalName, objectSuffix);
|
|
220
|
+
if (finalName !== name)
|
|
221
|
+
log(`Applied naming: ${name} → ${finalName}`);
|
|
222
|
+
// Derived object names
|
|
223
|
+
const tmpTableName = `${finalName}Tmp`;
|
|
224
|
+
const contractClassName = `${finalName}Contract`;
|
|
225
|
+
const dpClassName = `${finalName}DP`;
|
|
226
|
+
const controllerClassName = `${finalName}Controller`;
|
|
227
|
+
const reportCaption = caption || finalName;
|
|
228
|
+
// Only decorate a plain-text caption with the suffix; appending to a label
|
|
229
|
+
// reference (e.g. "@Module:LabelId") would create mixed content that xppbp
|
|
230
|
+
// flags as BPErrorLabelIsText.
|
|
231
|
+
const tmpTableLabel = (suffix) => reportCaption.startsWith('@') ? reportCaption : `${reportCaption}${suffix}`;
|
|
232
|
+
const rdb = symbolIndex.getReadDb();
|
|
233
|
+
let reportFields = [];
|
|
234
|
+
// Strategy 1: copyFrom — read fields from existing report's TmpTable
|
|
235
|
+
if (copyFrom) {
|
|
236
|
+
log(`Copying field structure from: ${copyFrom}`);
|
|
237
|
+
try {
|
|
238
|
+
const db = symbolIndex.getReadDb();
|
|
239
|
+
const dpSearch = db.prepare(`SELECT name FROM symbols WHERE type = 'class' AND name LIKE ? LIMIT 1`).get(`${copyFrom}%DP`);
|
|
240
|
+
let srcTmpTable;
|
|
241
|
+
if (dpSearch) {
|
|
242
|
+
const tmpSearch = db.prepare(`SELECT name FROM symbols WHERE type = 'table' AND name LIKE ? LIMIT 1`).get(`${copyFrom}%Tmp`);
|
|
243
|
+
srcTmpTable = tmpSearch?.name;
|
|
244
|
+
}
|
|
245
|
+
if (!srcTmpTable) {
|
|
246
|
+
// Fallback: direct naming convention <ReportName>Tmp. Case-insensitive —
|
|
247
|
+
// copyFrom is caller-supplied, so the derived name may not match the
|
|
248
|
+
// canonical casing (#686).
|
|
249
|
+
srcTmpTable = lookupSymbolNocase(db, `${copyFrom}Tmp`, ['table'])?.name;
|
|
250
|
+
}
|
|
251
|
+
if (srcTmpTable) {
|
|
252
|
+
const dbFields = db.prepare(`SELECT name, signature FROM symbols WHERE type = 'field' AND parent_name = ? ORDER BY name`).all(srcTmpTable);
|
|
253
|
+
reportFields = dbFields
|
|
254
|
+
.filter(f => !['RecId', 'RecVersion', 'DataAreaId', 'Partition', 'TableId'].includes(f.name))
|
|
255
|
+
.map(f => ({
|
|
256
|
+
name: f.name,
|
|
257
|
+
edt: f.signature || undefined,
|
|
258
|
+
dataType: resolveRdlDataType(f.signature, rdb),
|
|
259
|
+
}));
|
|
260
|
+
log(`Copied ${reportFields.length} fields from ${srcTmpTable}`);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
log(`⚠ Could not find TmpTable for "${copyFrom}" — falling back to fieldsHint`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
log(`⚠ copyFrom failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Strategy 2: structuredFields (explicit specs from the caller)
|
|
271
|
+
if (structuredFields && structuredFields.length > 0 && reportFields.length === 0) {
|
|
272
|
+
reportFields = structuredFields.map(f => ({
|
|
273
|
+
...f,
|
|
274
|
+
edt: f.edt || suggestEdtFromFieldName(f.name),
|
|
275
|
+
dataType: f.dataType || resolveRdlDataType(f.edt || suggestEdtFromFieldName(f.name), rdb),
|
|
276
|
+
}));
|
|
277
|
+
log(`Using ${reportFields.length} structured fields`);
|
|
278
|
+
}
|
|
279
|
+
// Strategy 3: fieldsHint — parse comma-separated names, suggest EDTs
|
|
280
|
+
if (fieldsHint && reportFields.length === 0) {
|
|
281
|
+
const hints = fieldsHint.split(',').map(s => s.trim()).filter(Boolean);
|
|
282
|
+
reportFields = hints.map(h => {
|
|
283
|
+
const edt = suggestEdtFromFieldName(h);
|
|
284
|
+
return {
|
|
285
|
+
name: h,
|
|
286
|
+
edt,
|
|
287
|
+
dataType: resolveRdlDataType(edt, rdb),
|
|
288
|
+
};
|
|
289
|
+
});
|
|
290
|
+
log(`Parsed ${reportFields.length} fields from fieldsHint`);
|
|
291
|
+
}
|
|
292
|
+
// Fallback: no fields at all
|
|
293
|
+
if (reportFields.length === 0) {
|
|
294
|
+
return {
|
|
295
|
+
content: [{
|
|
296
|
+
type: 'text',
|
|
297
|
+
text: [
|
|
298
|
+
`❌ **CANNOT GENERATE REPORT — no fields provided!**`,
|
|
299
|
+
``,
|
|
300
|
+
`Pass one of:`,
|
|
301
|
+
`- \`fieldsHint="ItemId, Name, Qty, Amount"\` — comma-separated field names`,
|
|
302
|
+
`- \`fields=[{name:"ItemId", edt:"ItemId"}, ...]\` — structured specs`,
|
|
303
|
+
`- \`copyFrom="ExistingReport"\` — copy from another report's TmpTable`,
|
|
304
|
+
``,
|
|
305
|
+
`⛔ No XML has been generated. Call \`generate_object(mode="scaffold", objectType="report")\` again with fields.`,
|
|
306
|
+
].join('\n'),
|
|
307
|
+
}],
|
|
308
|
+
isError: true,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
const resolvedExtraDatasets = additionalDatasets.map((ds) => {
|
|
312
|
+
const cap = ds.name.charAt(0).toUpperCase() + ds.name.slice(1);
|
|
313
|
+
const dsTmpName = `${finalName}${cap}Tmp`;
|
|
314
|
+
let dsFields = [];
|
|
315
|
+
if (ds.fields && ds.fields.length > 0) {
|
|
316
|
+
dsFields = ds.fields.map((f) => ({
|
|
317
|
+
...f,
|
|
318
|
+
edt: f.edt || suggestEdtFromFieldName(f.name),
|
|
319
|
+
dataType: f.dataType || resolveRdlDataType(f.edt || suggestEdtFromFieldName(f.name), rdb),
|
|
320
|
+
}));
|
|
321
|
+
}
|
|
322
|
+
else if (ds.fieldsHint) {
|
|
323
|
+
const hints = ds.fieldsHint.split(',').map((s) => s.trim()).filter(Boolean);
|
|
324
|
+
dsFields = hints.map((h) => {
|
|
325
|
+
const edt = suggestEdtFromFieldName(h);
|
|
326
|
+
return { name: h, edt, dataType: resolveRdlDataType(edt, rdb) };
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
return {
|
|
330
|
+
name: ds.name,
|
|
331
|
+
tmpTableName: dsTmpName,
|
|
332
|
+
fields: dsFields,
|
|
333
|
+
tableFields: dsFields.map((f) => ({
|
|
334
|
+
name: f.name,
|
|
335
|
+
edt: f.edt,
|
|
336
|
+
type: resolveFieldType(f.edt, rdb),
|
|
337
|
+
})),
|
|
338
|
+
};
|
|
339
|
+
});
|
|
340
|
+
const generatedObjects = [];
|
|
341
|
+
// 1. TmpTable (AxTable with TableType=TempDB)
|
|
342
|
+
const tableFields = reportFields.map(f => ({
|
|
343
|
+
name: f.name,
|
|
344
|
+
edt: f.edt,
|
|
345
|
+
type: resolveFieldType(f.edt, rdb),
|
|
346
|
+
}));
|
|
347
|
+
const builder = new SmartXmlBuilder(symbolIndex);
|
|
348
|
+
const tmpTableXml = builder.buildTableXml({
|
|
349
|
+
name: tmpTableName,
|
|
350
|
+
label: tmpTableLabel(' (temp)'),
|
|
351
|
+
tableGroup: 'Main',
|
|
352
|
+
tableType: 'TempDB',
|
|
353
|
+
fields: tableFields,
|
|
354
|
+
indexes: [builder.buildPrimaryKeyIndex(tmpTableName, [tableFields[0]?.name || 'RecId'])],
|
|
355
|
+
});
|
|
356
|
+
generatedObjects.push({
|
|
357
|
+
objectType: 'table',
|
|
358
|
+
objectName: tmpTableName,
|
|
359
|
+
aotFolder: 'AxTable',
|
|
360
|
+
content: tmpTableXml,
|
|
361
|
+
});
|
|
362
|
+
log(`Generated TmpTable: ${tmpTableName} (${tableFields.length} fields)`);
|
|
363
|
+
// Additional TmpTables for multi-dataset reports
|
|
364
|
+
for (const ds of resolvedExtraDatasets) {
|
|
365
|
+
if (ds.tableFields.length === 0) {
|
|
366
|
+
log(`⚠ Skipping extra dataset "${ds.name}" — no fields resolved`);
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
const dsTblXml = builder.buildTableXml({
|
|
370
|
+
name: ds.tmpTableName,
|
|
371
|
+
label: tmpTableLabel(` - ${ds.name} (temp)`),
|
|
372
|
+
tableGroup: 'Main',
|
|
373
|
+
tableType: 'TempDB',
|
|
374
|
+
fields: ds.tableFields,
|
|
375
|
+
indexes: [builder.buildPrimaryKeyIndex(ds.tmpTableName, [ds.tableFields[0]?.name || 'RecId'])],
|
|
376
|
+
});
|
|
377
|
+
generatedObjects.push({
|
|
378
|
+
objectType: 'table',
|
|
379
|
+
objectName: ds.tmpTableName,
|
|
380
|
+
aotFolder: 'AxTable',
|
|
381
|
+
content: dsTblXml,
|
|
382
|
+
});
|
|
383
|
+
log(`Generated extra TmpTable: ${ds.tmpTableName} (${ds.tableFields.length} fields)`);
|
|
384
|
+
}
|
|
385
|
+
// 2. Contract class
|
|
386
|
+
const contractParms = contractParams.map(p => ({
|
|
387
|
+
...p,
|
|
388
|
+
type: p.type || 'str',
|
|
389
|
+
}));
|
|
390
|
+
const contractMemberDecls = contractParms
|
|
391
|
+
.map(p => ` ${p.type} ${p.name};`)
|
|
392
|
+
.join('\n');
|
|
393
|
+
const contractParmMethods = contractParms.map(p => {
|
|
394
|
+
const methodName = `parm${p.name.charAt(0).toUpperCase()}${p.name.slice(1)}`;
|
|
395
|
+
const labelAttr = p.label ? `,\n SysOperationLabelAttribute('${p.label}')` : '';
|
|
396
|
+
// No SysOperationMandatoryAttribute — it doesn't exist in D365FO. Mandatory
|
|
397
|
+
// enforcement is done in validate() via checkFailed(), not a per-parameter attribute.
|
|
398
|
+
const defaultExpr = p.defaultValue ? p.defaultValue : p.name;
|
|
399
|
+
return [
|
|
400
|
+
` /// <summary>`,
|
|
401
|
+
` /// Gets or sets the ${p.name} parameter.`,
|
|
402
|
+
` /// </summary>`,
|
|
403
|
+
` /// <param name="_${p.name}">The ${p.name} value.</param>`,
|
|
404
|
+
` /// <returns>The current ${p.name} value.</returns>`,
|
|
405
|
+
` [DataMemberAttribute('${p.name}')${labelAttr}]`,
|
|
406
|
+
` public ${p.type} ${methodName}(${p.type} _${p.name} = ${defaultExpr})`,
|
|
407
|
+
` {`,
|
|
408
|
+
` ${p.name} = _${p.name};`,
|
|
409
|
+
` return ${p.name};`,
|
|
410
|
+
` }`,
|
|
411
|
+
].join('\n');
|
|
412
|
+
}).join('\n\n');
|
|
413
|
+
// Build validate() when there are mandatory params or a from/to date range
|
|
414
|
+
const mandatoryContractParams = contractParms.filter(p => p.mandatory);
|
|
415
|
+
const fromDateParam = contractParms.find(p => {
|
|
416
|
+
const n = p.name.toLowerCase();
|
|
417
|
+
return n === 'fromdate' || n === 'validfrom' || n === 'datefrom';
|
|
418
|
+
});
|
|
419
|
+
const toDateParam = contractParms.find(p => {
|
|
420
|
+
const n = p.name.toLowerCase();
|
|
421
|
+
return n === 'todate' || n === 'validto' || n === 'dateto';
|
|
422
|
+
});
|
|
423
|
+
const needsValidate = mandatoryContractParams.length > 0 || (fromDateParam && toDateParam);
|
|
424
|
+
const mandatoryChecks = mandatoryContractParams.map(p => [
|
|
425
|
+
` if (!${p.name})`,
|
|
426
|
+
` {`,
|
|
427
|
+
` ret = checkFailed(strFmt("@SYS53419", "${p.name}"));`,
|
|
428
|
+
` }`,
|
|
429
|
+
].join('\n')).join('\n');
|
|
430
|
+
const dateRangeCheck = (fromDateParam && toDateParam) ? [
|
|
431
|
+
` if (${fromDateParam.name} && ${toDateParam.name} && ${fromDateParam.name} > ${toDateParam.name})`,
|
|
432
|
+
` {`,
|
|
433
|
+
` ret = checkFailed(strFmt("@SYS300396", "${fromDateParam.name}"));`,
|
|
434
|
+
` }`,
|
|
435
|
+
].join('\n') : '';
|
|
436
|
+
const validateMethod = needsValidate ? [
|
|
437
|
+
` /// <summary>`,
|
|
438
|
+
` /// Validates the contract parameters before the report runs.`,
|
|
439
|
+
` /// </summary>`,
|
|
440
|
+
` /// <returns>true if all parameters are valid; otherwise false.</returns>`,
|
|
441
|
+
` public boolean validate()`,
|
|
442
|
+
` {`,
|
|
443
|
+
` boolean ret = true;`,
|
|
444
|
+
...(mandatoryChecks ? [mandatoryChecks] : []),
|
|
445
|
+
...(dateRangeCheck ? [dateRangeCheck] : []),
|
|
446
|
+
` return ret;`,
|
|
447
|
+
` }`,
|
|
448
|
+
].join('\n') : '';
|
|
449
|
+
const contractSourceCode = [
|
|
450
|
+
`/// <summary>`,
|
|
451
|
+
`/// Data contract for the ${reportCaption} report.`,
|
|
452
|
+
`/// Defines dialog parameters shown to the user before report execution.`,
|
|
453
|
+
`/// </summary>`,
|
|
454
|
+
`[DataContractAttribute]`,
|
|
455
|
+
`public class ${contractClassName}`,
|
|
456
|
+
`{`,
|
|
457
|
+
contractMemberDecls || ' // No dialog parameters',
|
|
458
|
+
`}`,
|
|
459
|
+
``,
|
|
460
|
+
...(contractParmMethods ? [contractParmMethods] : []),
|
|
461
|
+
...(validateMethod ? ['', validateMethod] : []),
|
|
462
|
+
].join('\n');
|
|
463
|
+
const contractXml = XmlTemplateGenerator.generateAxClassXml(contractClassName, contractSourceCode);
|
|
464
|
+
generatedObjects.push({
|
|
465
|
+
objectType: 'class',
|
|
466
|
+
objectName: contractClassName,
|
|
467
|
+
aotFolder: 'AxClass',
|
|
468
|
+
content: contractXml,
|
|
469
|
+
});
|
|
470
|
+
log(`Generated Contract: ${contractClassName} (${contractParms.length} params)`);
|
|
471
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
472
|
+
// 3. DP class (Data Provider)
|
|
473
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
474
|
+
const tmpTableVarName = tmpTableName.charAt(0).toLowerCase() + tmpTableName.slice(1);
|
|
475
|
+
const contractVarName = 'contract';
|
|
476
|
+
// Determine base class
|
|
477
|
+
const dpBaseClass = preProcess ? 'SrsReportDataProviderPreProcess' : 'SrsReportDataProviderBase';
|
|
478
|
+
// Class-level attributes
|
|
479
|
+
// PreProcess: no [SRSReportParameterAttribute] — contract is passed via Controller
|
|
480
|
+
// aotQuery: add [SRSReportQueryAttribute]
|
|
481
|
+
let dpAttrLines = [];
|
|
482
|
+
if (!preProcess)
|
|
483
|
+
dpAttrLines.push(` SRSReportParameterAttribute(classStr(${contractClassName}))`);
|
|
484
|
+
if (aotQuery)
|
|
485
|
+
dpAttrLines.push(` SRSReportQueryAttribute(queryStr(${aotQuery}))`);
|
|
486
|
+
const dpClassAttr = dpAttrLines.length > 0
|
|
487
|
+
? `[\n${dpAttrLines.join(',\n')}\n]`
|
|
488
|
+
: '';
|
|
489
|
+
// Contract parameter fetch (skip for PreProcess — contract accessed differently)
|
|
490
|
+
const contractFetchLines = (contractParms.length > 0 && !preProcess)
|
|
491
|
+
? [
|
|
492
|
+
` ${contractClassName} ${contractVarName} = this.parmDataContract() as ${contractClassName};`,
|
|
493
|
+
...contractParms.map(p => {
|
|
494
|
+
const methodName = `parm${p.name.charAt(0).toUpperCase()}${p.name.slice(1)}`;
|
|
495
|
+
return ` ${p.type} ${p.name} = ${contractVarName}.${methodName}();`;
|
|
496
|
+
}),
|
|
497
|
+
``,
|
|
498
|
+
]
|
|
499
|
+
: [` // No contract parameters`];
|
|
500
|
+
const contractFetch = contractFetchLines.join('\n');
|
|
501
|
+
// processReport body — query-based vs manual skeleton
|
|
502
|
+
// For aotQuery: try to resolve the first datasource table so we can generate
|
|
503
|
+
// tableNum()-based, type-safe code instead of the generic Common/getNo(1) fallback.
|
|
504
|
+
const querySourceTable = aotQuery
|
|
505
|
+
? resolveAotQueryFirstTable(aotQuery, rdb)
|
|
506
|
+
: undefined;
|
|
507
|
+
if (querySourceTable)
|
|
508
|
+
log(`Resolved aotQuery "${aotQuery}" first datasource: ${querySourceTable}`);
|
|
509
|
+
let processReportBody;
|
|
510
|
+
if (aotQuery) {
|
|
511
|
+
// tableNum() validates the table exists at X++ compile time — much safer than getNo(1)
|
|
512
|
+
const tableDecl = querySourceTable
|
|
513
|
+
? `${querySourceTable} sourceRecord = queryRun.get(tableNum(${querySourceTable}));`
|
|
514
|
+
: `Common sourceRecord = queryRun.getNo(1); // TODO: replace Common with the actual table type`;
|
|
515
|
+
const queryAssignments = reportFields.map(f => ` ${tmpTableVarName}.${f.name} = sourceRecord.${f.name}; // TODO: map from ${querySourceTable ?? 'query result'}`).join('\n');
|
|
516
|
+
processReportBody = [
|
|
517
|
+
contractFetch,
|
|
518
|
+
``,
|
|
519
|
+
` // Query-based data retrieval \u2014 driven by AOT query "${aotQuery}"`,
|
|
520
|
+
` QueryRun queryRun = new QueryRun(this.parmQuery());`,
|
|
521
|
+
` while (queryRun.next())`,
|
|
522
|
+
` {`,
|
|
523
|
+
` ${tableDecl}`,
|
|
524
|
+
` ${tmpTableVarName}.clear();`,
|
|
525
|
+
queryAssignments,
|
|
526
|
+
` ${tmpTableVarName}.insert();`,
|
|
527
|
+
` }`,
|
|
528
|
+
].join('\n');
|
|
529
|
+
}
|
|
530
|
+
else {
|
|
531
|
+
const fieldComments = reportFields.map(f => ` // ${tmpTableVarName}.${f.name} = ''; // TODO: populate from data source`).join('\n');
|
|
532
|
+
processReportBody = [
|
|
533
|
+
contractFetch,
|
|
534
|
+
``,
|
|
535
|
+
` // TODO: Replace with actual query / business logic`,
|
|
536
|
+
` // Example pattern:`,
|
|
537
|
+
` // while select sourceTable`,
|
|
538
|
+
` // where sourceTable.Field == paramValue`,
|
|
539
|
+
` // {`,
|
|
540
|
+
` // ${tmpTableVarName}.clear();`,
|
|
541
|
+
fieldComments,
|
|
542
|
+
` // ${tmpTableVarName}.insert();`,
|
|
543
|
+
` // }`,
|
|
544
|
+
].join('\n');
|
|
545
|
+
}
|
|
546
|
+
// preProcess() stub (Improvement 6)
|
|
547
|
+
const preProcessMethodLines = preProcess ? [
|
|
548
|
+
``,
|
|
549
|
+
` /// <summary>`,
|
|
550
|
+
` /// Called before the report dialog is shown. Use for heavy pre-processing.`,
|
|
551
|
+
` /// </summary>`,
|
|
552
|
+
` public void preProcess()`,
|
|
553
|
+
` {`,
|
|
554
|
+
` // TODO: Implement pre-processing logic (called BEFORE the report dialog).`,
|
|
555
|
+
` // Prepare data, validate prerequisites, or set session-scoped variables.`,
|
|
556
|
+
` }`,
|
|
557
|
+
] : [];
|
|
558
|
+
// Additional member variable declarations for extra datasets
|
|
559
|
+
const extraDpMembers = resolvedExtraDatasets
|
|
560
|
+
.map(ds => ` ${ds.tmpTableName} ${ds.tmpTableName.charAt(0).toLowerCase() + ds.tmpTableName.slice(1)};`)
|
|
561
|
+
.join('\n');
|
|
562
|
+
// Additional get<Table>() methods for extra datasets
|
|
563
|
+
const extraDpGetters = resolvedExtraDatasets.map(ds => {
|
|
564
|
+
const varN = ds.tmpTableName.charAt(0).toLowerCase() + ds.tmpTableName.slice(1);
|
|
565
|
+
return [
|
|
566
|
+
``,
|
|
567
|
+
` /// <summary>`,
|
|
568
|
+
` /// Returns the <c>${ds.tmpTableName}</c> buffer for the "${ds.name}" dataset.`,
|
|
569
|
+
` /// </summary>`,
|
|
570
|
+
` /// <returns>The <c>${ds.tmpTableName}</c> table buffer.</returns>`,
|
|
571
|
+
` [SRSReportDataSetAttribute(tableStr(${ds.tmpTableName}))]`,
|
|
572
|
+
` public ${ds.tmpTableName} get${ds.tmpTableName}()`,
|
|
573
|
+
` {`,
|
|
574
|
+
` select ${varN};`,
|
|
575
|
+
` return ${varN};`,
|
|
576
|
+
` }`,
|
|
577
|
+
].join('\n');
|
|
578
|
+
}).join('\n');
|
|
579
|
+
const dpSourceCode = [
|
|
580
|
+
`/// <summary>`,
|
|
581
|
+
`/// Data provider for the ${reportCaption} report.`,
|
|
582
|
+
`/// Extends <c>${dpBaseClass}</c> and populates the <c>${tmpTableName}</c> temporary table.`,
|
|
583
|
+
`/// </summary>`,
|
|
584
|
+
dpClassAttr,
|
|
585
|
+
`public class ${dpClassName} extends ${dpBaseClass}`,
|
|
586
|
+
`{`,
|
|
587
|
+
` ${tmpTableName} ${tmpTableVarName};`,
|
|
588
|
+
...(extraDpMembers ? [extraDpMembers] : []),
|
|
589
|
+
`}`,
|
|
590
|
+
``,
|
|
591
|
+
` /// <summary>`,
|
|
592
|
+
` /// Returns the temporary table buffer used by the report dataset.`,
|
|
593
|
+
` /// </summary>`,
|
|
594
|
+
` /// <returns>The <c>${tmpTableName}</c> table buffer.</returns>`,
|
|
595
|
+
` [SRSReportDataSetAttribute(tableStr(${tmpTableName}))]`,
|
|
596
|
+
` public ${tmpTableName} get${tmpTableName}()`,
|
|
597
|
+
` {`,
|
|
598
|
+
` select ${tmpTableVarName};`,
|
|
599
|
+
` return ${tmpTableVarName};`,
|
|
600
|
+
` }`,
|
|
601
|
+
...(extraDpGetters ? [extraDpGetters] : []),
|
|
602
|
+
...preProcessMethodLines,
|
|
603
|
+
``,
|
|
604
|
+
` /// <summary>`,
|
|
605
|
+
` /// Main data processing method. Populates the <c>${tmpTableName}</c> temporary table`,
|
|
606
|
+
` /// with report data based on the contract parameters.`,
|
|
607
|
+
` /// </summary>`,
|
|
608
|
+
` public void processReport()`,
|
|
609
|
+
` {`,
|
|
610
|
+
processReportBody,
|
|
611
|
+
` }`,
|
|
612
|
+
].join('\n');
|
|
613
|
+
const dpXml = XmlTemplateGenerator.generateAxClassXml(dpClassName, dpSourceCode);
|
|
614
|
+
generatedObjects.push({
|
|
615
|
+
objectType: 'class',
|
|
616
|
+
objectName: dpClassName,
|
|
617
|
+
aotFolder: 'AxClass',
|
|
618
|
+
content: dpXml,
|
|
619
|
+
});
|
|
620
|
+
log(`Generated DP: ${dpClassName}`);
|
|
621
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
622
|
+
// 4. Controller class (optional)
|
|
623
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
624
|
+
if (generateController) {
|
|
625
|
+
const isPrintMgmt = controllerType === 'printMgmt';
|
|
626
|
+
const ctrlBaseClass = isPrintMgmt ? 'SrsPrintMgmtController' : 'SrsReportRunController';
|
|
627
|
+
// Build main() — differs between simple and printMgmt
|
|
628
|
+
const mainMethod = isPrintMgmt ? [
|
|
629
|
+
` /// <summary>`,
|
|
630
|
+
` /// Entry point. Creates a print-management controller and starts the report.`,
|
|
631
|
+
` /// </summary>`,
|
|
632
|
+
` /// <param name="_args">The <c>Args</c> object from the menu item caller.</param>`,
|
|
633
|
+
` public static void main(Args _args)`,
|
|
634
|
+
` {`,
|
|
635
|
+
` ${controllerClassName} controller = new ${controllerClassName}();`,
|
|
636
|
+
` controller.parmArgs(_args);`,
|
|
637
|
+
` // TODO: Replace SalesOrderConfirmation with the correct PrintMgmtDocumentType`,
|
|
638
|
+
` controller.parmPrintMgmtDocType(PrintMgmtDocumentType::SalesOrderConfirmation);`,
|
|
639
|
+
` controller.parmReportName(ssrsReportStr(${finalName}, Report));`,
|
|
640
|
+
` controller.startOperation();`,
|
|
641
|
+
` }`,
|
|
642
|
+
].join('\n') : [
|
|
643
|
+
` /// <summary>`,
|
|
644
|
+
` /// Entry point for the report. Creates the controller and starts execution.`,
|
|
645
|
+
` /// </summary>`,
|
|
646
|
+
` /// <param name="_args">The <c>Args</c> object from the menu item caller.</param>`,
|
|
647
|
+
` public static void main(Args _args)`,
|
|
648
|
+
` {`,
|
|
649
|
+
` ${controllerClassName} controller = new ${controllerClassName}();`,
|
|
650
|
+
` controller.parmReportName(ssrsReportStr(${finalName}, Report));`,
|
|
651
|
+
` controller.parmArgs(_args);`,
|
|
652
|
+
` controller.startOperation();`,
|
|
653
|
+
` }`,
|
|
654
|
+
].join('\n');
|
|
655
|
+
// Build prePromptModifyContract() — with optional parmArgs() pre-fill (Improvement 2)
|
|
656
|
+
let prePromptBody;
|
|
657
|
+
if (callerTableName && contractParms.length > 0) {
|
|
658
|
+
// Try to match contract params to caller table fields by name heuristics
|
|
659
|
+
const callerVarName = callerTableName.charAt(0).toLowerCase() + callerTableName.slice(1);
|
|
660
|
+
const prefillLines = contractParms.flatMap(p => {
|
|
661
|
+
// Heuristic: param name matches a field pattern on the caller table
|
|
662
|
+
// e.g. CustAccount → callerRecord.AccountNum (common D365FO convention)
|
|
663
|
+
const fieldGuess = p.name.charAt(0).toUpperCase() + p.name.slice(1); // CustAccount → CustAccount
|
|
664
|
+
const methodName = `parm${p.name.charAt(0).toUpperCase()}${p.name.slice(1)}`;
|
|
665
|
+
return [
|
|
666
|
+
` if (${callerVarName}.${fieldGuess} != ${p.type === 'TransDate' ? 'dateNull()' : (p.type === 'str' || !p.type) ? '""' : '0'})`,
|
|
667
|
+
` ${contractVarName}.${methodName}(${callerVarName}.${fieldGuess});`,
|
|
668
|
+
];
|
|
669
|
+
});
|
|
670
|
+
prePromptBody = [
|
|
671
|
+
` ${contractClassName} ${contractVarName} = this.parmReportContract().parmRdpContract() as ${contractClassName};`,
|
|
672
|
+
` ${callerTableName} ${callerVarName} = this.parmArgs().record() as ${callerTableName};`,
|
|
673
|
+
` if (${callerVarName})`,
|
|
674
|
+
` {`,
|
|
675
|
+
...prefillLines.map(l => ` ${l}`),
|
|
676
|
+
` }`,
|
|
677
|
+
].join('\n');
|
|
678
|
+
}
|
|
679
|
+
else {
|
|
680
|
+
prePromptBody = [
|
|
681
|
+
` ${contractClassName} ${contractVarName} = this.parmReportContract().parmRdpContract() as ${contractClassName};`,
|
|
682
|
+
` // TODO: Set default parameter values here`,
|
|
683
|
+
` // Example: ${contractVarName}.parmFromDate(DateTimeUtil::getToday(DateTimeUtil::getUserPreferredTimeZone()));`,
|
|
684
|
+
].join('\n');
|
|
685
|
+
}
|
|
686
|
+
const prePromptMethod = [
|
|
687
|
+
` /// <summary>`,
|
|
688
|
+
` /// Modifies the contract before the dialog is shown to the user.`,
|
|
689
|
+
` /// Override to set default parameter values or pre-fill from the caller record.`,
|
|
690
|
+
` /// </summary>`,
|
|
691
|
+
` protected void prePromptModifyContract()`,
|
|
692
|
+
` {`,
|
|
693
|
+
prePromptBody,
|
|
694
|
+
` }`,
|
|
695
|
+
].join('\n');
|
|
696
|
+
const controllerSourceCode = [
|
|
697
|
+
`/// <summary>`,
|
|
698
|
+
`/// Controller for the ${reportCaption} report.`,
|
|
699
|
+
`/// Extends <c>${ctrlBaseClass}</c> to provide menu item integration`,
|
|
700
|
+
`/// and pre-prompt contract initialization.`,
|
|
701
|
+
`/// </summary>`,
|
|
702
|
+
`public class ${controllerClassName} extends ${ctrlBaseClass}`,
|
|
703
|
+
`{`,
|
|
704
|
+
`}`,
|
|
705
|
+
``,
|
|
706
|
+
mainMethod,
|
|
707
|
+
``,
|
|
708
|
+
prePromptMethod,
|
|
709
|
+
].join('\n');
|
|
710
|
+
const controllerXml = XmlTemplateGenerator.generateAxClassXml(controllerClassName, controllerSourceCode);
|
|
711
|
+
generatedObjects.push({
|
|
712
|
+
objectType: 'class',
|
|
713
|
+
objectName: controllerClassName,
|
|
714
|
+
aotFolder: 'AxClass',
|
|
715
|
+
content: controllerXml,
|
|
716
|
+
});
|
|
717
|
+
log(`Generated Controller: ${controllerClassName} (${controllerType}, callerTable=${callerTableName ?? 'none'})`);
|
|
718
|
+
// ── 5. Output menu item (AxMenuItemOutput) ─────────────────────────────
|
|
719
|
+
const menuItemXml = XmlTemplateGenerator.generateAxMenuItemXml('menu-item-output', finalName, {
|
|
720
|
+
targetObject: controllerClassName,
|
|
721
|
+
objectType: 'Class',
|
|
722
|
+
label: reportCaption,
|
|
723
|
+
});
|
|
724
|
+
generatedObjects.push({
|
|
725
|
+
objectType: 'menu-item-output',
|
|
726
|
+
objectName: finalName,
|
|
727
|
+
aotFolder: 'AxMenuItemOutput',
|
|
728
|
+
content: menuItemXml,
|
|
729
|
+
});
|
|
730
|
+
log(`Generated output menu item: ${finalName} → ${controllerClassName}`);
|
|
731
|
+
}
|
|
732
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
733
|
+
// 6. AxReport XML + RDL (multi-dataset, page header, optional grouped tablix)
|
|
734
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
735
|
+
const reportFieldDefs = reportFields.map(f => ({
|
|
736
|
+
name: f.name,
|
|
737
|
+
alias: `${tmpTableName}.1.${f.name}`,
|
|
738
|
+
dataType: f.dataType || 'System.String',
|
|
739
|
+
caption: f.label,
|
|
740
|
+
}));
|
|
741
|
+
const reportContractParams = contractParms.map(p => ({
|
|
742
|
+
name: p.name,
|
|
743
|
+
dataType: contractParamToRdlType(p.type || 'str'),
|
|
744
|
+
label: p.label,
|
|
745
|
+
}));
|
|
746
|
+
// Build report properties — multi-dataset when additionalDatasets present (Improvement 9)
|
|
747
|
+
const reportProps = {
|
|
748
|
+
designName: 'Report',
|
|
749
|
+
caption: reportCaption,
|
|
750
|
+
contractParams: reportContractParams,
|
|
751
|
+
};
|
|
752
|
+
if (resolvedExtraDatasets.length > 0) {
|
|
753
|
+
reportProps.datasets = [
|
|
754
|
+
{
|
|
755
|
+
name: tmpTableName,
|
|
756
|
+
dpClassName,
|
|
757
|
+
tmpTableName,
|
|
758
|
+
fields: reportFieldDefs,
|
|
759
|
+
contractParams: reportContractParams,
|
|
760
|
+
...(aotQuery ? { aotQuery } : {}),
|
|
761
|
+
},
|
|
762
|
+
...resolvedExtraDatasets.map(ds => ({
|
|
763
|
+
name: ds.tmpTableName,
|
|
764
|
+
dpClassName,
|
|
765
|
+
tmpTableName: ds.tmpTableName,
|
|
766
|
+
fields: ds.fields.map(f => ({
|
|
767
|
+
name: f.name,
|
|
768
|
+
alias: `${ds.tmpTableName}.1.${f.name}`,
|
|
769
|
+
dataType: f.dataType || 'System.String',
|
|
770
|
+
caption: f.label,
|
|
771
|
+
})),
|
|
772
|
+
})),
|
|
773
|
+
];
|
|
774
|
+
}
|
|
775
|
+
else {
|
|
776
|
+
reportProps.dpClassName = dpClassName;
|
|
777
|
+
reportProps.tmpTableName = tmpTableName;
|
|
778
|
+
reportProps.datasetName = tmpTableName;
|
|
779
|
+
reportProps.fields = reportFieldDefs;
|
|
780
|
+
if (aotQuery)
|
|
781
|
+
reportProps.aotQuery = aotQuery;
|
|
782
|
+
}
|
|
783
|
+
let reportXml = XmlTemplateGenerator.generateAxReportXml(finalName, reportProps);
|
|
784
|
+
// Improvement 7: inject RDL page header (always on — company name, title, execution time)
|
|
785
|
+
reportXml = injectRdlPageHeader(reportXml, reportCaption);
|
|
786
|
+
// Improvement 1: replace standard tablix with grouped design when requested
|
|
787
|
+
if (designStyle === 'GroupedWithTotals') {
|
|
788
|
+
reportXml = injectGroupedTablix(reportXml, reportFields, tmpTableName);
|
|
789
|
+
log(`Applied GroupedWithTotals RDL design`);
|
|
790
|
+
}
|
|
791
|
+
generatedObjects.push({
|
|
792
|
+
objectType: 'report',
|
|
793
|
+
objectName: finalName,
|
|
794
|
+
aotFolder: 'AxReport',
|
|
795
|
+
content: reportXml,
|
|
796
|
+
});
|
|
797
|
+
log(`Generated Report: ${finalName} (${reportFieldDefs.length} fields, ${reportContractParams.length} contract params, ${resolvedExtraDatasets.length} extra datasets)`);
|
|
798
|
+
// ── Output ─────────────────────────────────────────────────────────────────
|
|
799
|
+
const objectSummary = generatedObjects.map(o => ` - ${o.objectType}: **${o.objectName}**`).join('\n');
|
|
800
|
+
if (isNonWindows) {
|
|
801
|
+
// Azure/Linux: return all XML/source blocks as text
|
|
802
|
+
log(`Non-Windows — returning ${generatedObjects.length} object XMLs as text`);
|
|
803
|
+
const createCalls = generatedObjects.map(o => {
|
|
804
|
+
return [
|
|
805
|
+
`\`\`\``,
|
|
806
|
+
`d365fo_file(action="create", `,
|
|
807
|
+
` objectType="${o.objectType}",`,
|
|
808
|
+
` objectName="${o.objectName}",`,
|
|
809
|
+
` xmlContent="<XML block #${generatedObjects.indexOf(o) + 1} below>",`,
|
|
810
|
+
` addToProject=true`,
|
|
811
|
+
`)`,
|
|
812
|
+
`\`\`\``,
|
|
813
|
+
].join('\n');
|
|
814
|
+
}).join('\n');
|
|
815
|
+
const xmlBlocks = generatedObjects.map((o, i) => {
|
|
816
|
+
return [
|
|
817
|
+
`### ${i + 1}. ${o.objectType}: ${o.objectName}`,
|
|
818
|
+
`\`\`\`xml`,
|
|
819
|
+
o.content,
|
|
820
|
+
`\`\`\``,
|
|
821
|
+
].join('\n');
|
|
822
|
+
}).join('\n\n');
|
|
823
|
+
return {
|
|
824
|
+
content: [{
|
|
825
|
+
type: 'text',
|
|
826
|
+
text: [
|
|
827
|
+
`✅ SSRS Report generated: **${finalName}** (${generatedObjects.length} objects)`,
|
|
828
|
+
resolvedModel ? ` Model: ${resolvedModel}` : ` ℹ️ No model resolved — no prefix applied.`,
|
|
829
|
+
objectSummary,
|
|
830
|
+
``,
|
|
831
|
+
`ℹ️ MCP server is running on Azure/Linux — file writing is handled by the local Windows companion.`,
|
|
832
|
+
``,
|
|
833
|
+
`**✅ MANDATORY NEXT STEPS — call \`d365fo_file(action="create")\` for EACH object below, in this order:**`,
|
|
834
|
+
``,
|
|
835
|
+
createCalls,
|
|
836
|
+
``,
|
|
837
|
+
`⛔ NEVER use \`create_file\`, PowerShell scripts, or any built-in file tool.`,
|
|
838
|
+
`⛔ NEVER skip any of the ${generatedObjects.length} create calls — all objects are required for the report to build.`,
|
|
839
|
+
``,
|
|
840
|
+
`---`,
|
|
841
|
+
``,
|
|
842
|
+
xmlBlocks,
|
|
843
|
+
].join('\n'),
|
|
844
|
+
}],
|
|
845
|
+
};
|
|
846
|
+
}
|
|
847
|
+
// Windows: write all objects to disk
|
|
848
|
+
if (!resolvedModel) {
|
|
849
|
+
return {
|
|
850
|
+
content: [{
|
|
851
|
+
type: 'text',
|
|
852
|
+
text: `❌ Cannot write report files: model name could not be resolved.\n\n` +
|
|
853
|
+
`Add \`projectPath\` to .mcp.json so the tool can extract the model name from your .rnrproj.`,
|
|
854
|
+
}],
|
|
855
|
+
isError: true,
|
|
856
|
+
};
|
|
857
|
+
}
|
|
858
|
+
const effectiveProjectPath = resolvedProjectPath ||
|
|
859
|
+
(await configManager.getProjectPath()) ||
|
|
860
|
+
undefined;
|
|
861
|
+
const results = [];
|
|
862
|
+
for (const obj of generatedObjects) {
|
|
863
|
+
const targetPath = path.join(pkgPath, resolvedModel, resolvedModel, obj.aotFolder, `${obj.objectName}.xml`);
|
|
864
|
+
const normalizedPath = targetPath.replace(/\//g, '\\');
|
|
865
|
+
const dir = path.dirname(normalizedPath);
|
|
866
|
+
if (!fs.existsSync(dir)) {
|
|
867
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
868
|
+
}
|
|
869
|
+
// Guard: refuse to overwrite existing table files (would destroy existing methods, fields, etc.)
|
|
870
|
+
if (obj.objectType === 'table' && fs.existsSync(normalizedPath)) {
|
|
871
|
+
results.push(`⚠️ ${obj.objectType}: ${normalizedPath} — SKIPPED (file already exists, would destroy existing content). Use \`d365fo_file(action="modify")\` to modify existing tables.`);
|
|
872
|
+
log(`Skipped existing table: ${normalizedPath}`);
|
|
873
|
+
continue;
|
|
874
|
+
}
|
|
875
|
+
fs.writeFileSync(normalizedPath, normalizeD365Xml(obj.content), 'utf-8');
|
|
876
|
+
let projectMsg = '';
|
|
877
|
+
if (effectiveProjectPath) {
|
|
878
|
+
try {
|
|
879
|
+
const projectManager = new ProjectFileManager();
|
|
880
|
+
const wasAdded = await projectManager.addToProject(effectiveProjectPath, obj.objectType, obj.objectName, normalizedPath);
|
|
881
|
+
projectMsg = wasAdded ? ' ✅ added to project' : ' (already in project)';
|
|
882
|
+
}
|
|
883
|
+
catch (e) {
|
|
884
|
+
projectMsg = ` ⚠️ project add failed: ${e instanceof Error ? e.message : String(e)}`;
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
results.push(`📁 ${obj.objectType}: ${normalizedPath}${projectMsg}`);
|
|
888
|
+
log(`Created: ${normalizedPath}`);
|
|
889
|
+
}
|
|
890
|
+
return {
|
|
891
|
+
content: [{
|
|
892
|
+
type: 'text',
|
|
893
|
+
text: [
|
|
894
|
+
`✅ SSRS Report **${finalName}** created directly on Windows VM (${generatedObjects.length} objects):`,
|
|
895
|
+
``,
|
|
896
|
+
`📦 Model: ${resolvedModel}`,
|
|
897
|
+
results.join('\n'),
|
|
898
|
+
``,
|
|
899
|
+
`⛔ DO NOT call \`d365fo_file(action="create")\` — all files are already written to disk.`,
|
|
900
|
+
`⛔ DO NOT call \`generate\` again — task is COMPLETE.`,
|
|
901
|
+
``,
|
|
902
|
+
`Next steps:`,
|
|
903
|
+
`1. Open Visual Studio and reload the project (close/reopen solution)`,
|
|
904
|
+
`2. Open the AxReport in Report Designer and fine-tune the RDL design`,
|
|
905
|
+
`3. Build the project to compile all objects`,
|
|
906
|
+
`4. Deploy to the report server (right-click report → Deploy)`,
|
|
907
|
+
].join('\n'),
|
|
908
|
+
}],
|
|
909
|
+
};
|
|
910
|
+
}
|
|
911
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
912
|
+
// Helpers
|
|
913
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
914
|
+
// ── Improvement 7: RDL page header injection ──────────────────────────────────
|
|
915
|
+
/**
|
|
916
|
+
* Injects an RDL <PageHeader> with company name, report title, and execution time
|
|
917
|
+
* into every ReportSection inside the AxReport XML (CDATA-embedded RDL).
|
|
918
|
+
* The header is placed before the closing </ReportSection> tag.
|
|
919
|
+
*/
|
|
920
|
+
function injectRdlPageHeader(axReportXml, caption) {
|
|
921
|
+
const pageHeaderXml = [
|
|
922
|
+
` <PageHeader>`,
|
|
923
|
+
` <PrintOnFirstPage>true</PrintOnFirstPage>`,
|
|
924
|
+
` <PrintOnLastPage>true</PrintOnLastPage>`,
|
|
925
|
+
` <Height>0.5in</Height>`,
|
|
926
|
+
` <ReportItems>`,
|
|
927
|
+
` <Textbox Name="CompanyName">`,
|
|
928
|
+
` <CanGrow>true</CanGrow>`,
|
|
929
|
+
` <Value>=Parameters!AX_CompanyName.Value</Value>`,
|
|
930
|
+
` <Style><FontWeight>Bold</FontWeight><FontSize>10pt</FontSize></Style>`,
|
|
931
|
+
` <Top>0in</Top><Left>0in</Left><Width>4in</Width><Height>0.25in</Height>`,
|
|
932
|
+
` </Textbox>`,
|
|
933
|
+
` <Textbox Name="ReportTitle">`,
|
|
934
|
+
` <CanGrow>true</CanGrow>`,
|
|
935
|
+
` <Value>${caption.replace(/[<>&"]/g, c => c === '<' ? '<' : c === '>' ? '>' : c === '&' ? '&' : '"')}</Value>`,
|
|
936
|
+
` <Style><FontSize>9pt</FontSize></Style>`,
|
|
937
|
+
` <Top>0.25in</Top><Left>0in</Left><Width>4in</Width><Height>0.25in</Height>`,
|
|
938
|
+
` </Textbox>`,
|
|
939
|
+
` <Textbox Name="ExecutionTime">`,
|
|
940
|
+
` <CanGrow>true</CanGrow>`,
|
|
941
|
+
` <Value>=Globals!ExecutionTime</Value>`,
|
|
942
|
+
` <Style><TextAlign>Right</TextAlign><FontSize>8pt</FontSize></Style>`,
|
|
943
|
+
` <Top>0in</Top><Left>4in</Left><Width>3in</Width><Height>0.25in</Height>`,
|
|
944
|
+
` </Textbox>`,
|
|
945
|
+
` </ReportItems>`,
|
|
946
|
+
` </PageHeader>`,
|
|
947
|
+
].join('\n');
|
|
948
|
+
// Inject before <Body> (correct per RDL 2016 schema: PageHeader must precede Body)
|
|
949
|
+
return axReportXml.replace(/(<ReportSection>)(\n\s*)(<Body>)/g, `$1$2${pageHeaderXml}$2$3`);
|
|
950
|
+
}
|
|
951
|
+
// ── Improvement 1: GroupedWithTotals tablix injection ────────────────────────
|
|
952
|
+
/**
|
|
953
|
+
* Replaces the auto-generated flat detail tablix in the RDL with a grouped tablix.
|
|
954
|
+
* Groups on the first non-numeric field; adds SUM() subtotals for numeric fields,
|
|
955
|
+
* and a grand-total footer row at the bottom.
|
|
956
|
+
*/
|
|
957
|
+
function injectGroupedTablix(axReportXml, fields, datasetName) {
|
|
958
|
+
if (fields.length === 0)
|
|
959
|
+
return axReportXml;
|
|
960
|
+
// Classify fields
|
|
961
|
+
const numericTypes = new Set(['System.Double', 'System.Int32', 'System.Int64']);
|
|
962
|
+
const groupField = fields.find(f => !numericTypes.has(f.dataType ?? '')) ?? fields[0];
|
|
963
|
+
const numericFields = fields.filter(f => numericTypes.has(f.dataType ?? ''));
|
|
964
|
+
const n = fields.length;
|
|
965
|
+
const colW = +Math.min(1.5, 7 / n).toFixed(2);
|
|
966
|
+
const totalW = +(colW * n).toFixed(2);
|
|
967
|
+
const rowGrp = `Group_${groupField.name}`;
|
|
968
|
+
const detailGrp = `Details_${datasetName}`;
|
|
969
|
+
const cols = fields.map(() => ` <TablixColumn><Width>${colW}in</Width></TablixColumn>`).join('\n');
|
|
970
|
+
// Header row (bold grey)
|
|
971
|
+
const hCells = fields.map(f => [
|
|
972
|
+
` <TablixCell><CellContents>`,
|
|
973
|
+
` <Textbox Name="Hdr_${f.name}">`,
|
|
974
|
+
` <CanGrow>true</CanGrow><Value>${f.name}</Value>`,
|
|
975
|
+
` <Style><FontWeight>Bold</FontWeight><BackgroundColor>LightGrey</BackgroundColor>`,
|
|
976
|
+
` <Border><Style>Solid</Style></Border>`,
|
|
977
|
+
` <PaddingLeft>2pt</PaddingLeft><PaddingRight>2pt</PaddingRight>`,
|
|
978
|
+
` <PaddingTop>2pt</PaddingTop><PaddingBottom>2pt</PaddingBottom>`,
|
|
979
|
+
` </Style></Textbox>`,
|
|
980
|
+
` </CellContents></TablixCell>`,
|
|
981
|
+
].join('\n')).join('\n');
|
|
982
|
+
// Group header row (field value + subtotals for numerics, light blue)
|
|
983
|
+
const grpCells = fields.map(f => {
|
|
984
|
+
const isGrp = f.name === groupField.name;
|
|
985
|
+
const isNum = numericFields.some(nf => nf.name === f.name);
|
|
986
|
+
const val = isGrp ? `=Fields!${f.name}.Value` : isNum ? `=Sum(Fields!${f.name}.Value)` : ``;
|
|
987
|
+
return [
|
|
988
|
+
` <TablixCell><CellContents>`,
|
|
989
|
+
` <Textbox Name="Grp_${f.name}">`,
|
|
990
|
+
` <CanGrow>true</CanGrow><Value>${val}</Value>`,
|
|
991
|
+
` <Style><FontWeight>Bold</FontWeight><BackgroundColor>AliceBlue</BackgroundColor>`,
|
|
992
|
+
` <Border><Style>Solid</Style></Border>`,
|
|
993
|
+
` <PaddingLeft>2pt</PaddingLeft><PaddingRight>2pt</PaddingRight>`,
|
|
994
|
+
` <PaddingTop>2pt</PaddingTop><PaddingBottom>2pt</PaddingBottom>`,
|
|
995
|
+
` </Style></Textbox>`,
|
|
996
|
+
` </CellContents></TablixCell>`,
|
|
997
|
+
].join('\n');
|
|
998
|
+
}).join('\n');
|
|
999
|
+
// Detail row
|
|
1000
|
+
const dCells = fields.map(f => [
|
|
1001
|
+
` <TablixCell><CellContents>`,
|
|
1002
|
+
` <Textbox Name="Det_${f.name}">`,
|
|
1003
|
+
` <CanGrow>true</CanGrow><Value>=Fields!${f.name}.Value</Value>`,
|
|
1004
|
+
` <Style><Border><Style>Solid</Style></Border>`,
|
|
1005
|
+
` <PaddingLeft>2pt</PaddingLeft><PaddingRight>2pt</PaddingRight>`,
|
|
1006
|
+
` <PaddingTop>2pt</PaddingTop><PaddingBottom>2pt</PaddingBottom>`,
|
|
1007
|
+
` </Style></Textbox>`,
|
|
1008
|
+
` </CellContents></TablixCell>`,
|
|
1009
|
+
].join('\n')).join('\n');
|
|
1010
|
+
// Grand total footer row (yellow)
|
|
1011
|
+
const totCells = fields.map(f => {
|
|
1012
|
+
const isNum = numericFields.some(nf => nf.name === f.name);
|
|
1013
|
+
const val = isNum ? `=Sum(Fields!${f.name}.Value)` : (f.name === groupField.name ? `"Total"` : `""`);
|
|
1014
|
+
return [
|
|
1015
|
+
` <TablixCell><CellContents>`,
|
|
1016
|
+
` <Textbox Name="Tot_${f.name}">`,
|
|
1017
|
+
` <CanGrow>true</CanGrow><Value>${val}</Value>`,
|
|
1018
|
+
` <Style><FontWeight>Bold</FontWeight><BackgroundColor>LightYellow</BackgroundColor>`,
|
|
1019
|
+
` <Border><Style>Solid</Style></Border>`,
|
|
1020
|
+
` <PaddingLeft>2pt</PaddingLeft><PaddingRight>2pt</PaddingRight>`,
|
|
1021
|
+
` <PaddingTop>2pt</PaddingTop><PaddingBottom>2pt</PaddingBottom>`,
|
|
1022
|
+
` </Style></Textbox>`,
|
|
1023
|
+
` </CellContents></TablixCell>`,
|
|
1024
|
+
].join('\n');
|
|
1025
|
+
}).join('\n');
|
|
1026
|
+
const cMembers = fields.map(() => ` <TablixMember />`).join('\n');
|
|
1027
|
+
const groupedTablix = [
|
|
1028
|
+
` <Tablix Name="Tablix_${datasetName}">`,
|
|
1029
|
+
` <TablixBody>`,
|
|
1030
|
+
` <TablixColumns>`,
|
|
1031
|
+
cols,
|
|
1032
|
+
` </TablixColumns>`,
|
|
1033
|
+
` <TablixRows>`,
|
|
1034
|
+
` <TablixRow><Height>0.25in</Height><TablixCells>`,
|
|
1035
|
+
hCells,
|
|
1036
|
+
` </TablixCells></TablixRow>`,
|
|
1037
|
+
` <TablixRow><Height>0.25in</Height><TablixCells>`,
|
|
1038
|
+
grpCells,
|
|
1039
|
+
` </TablixCells></TablixRow>`,
|
|
1040
|
+
` <TablixRow><Height>0.25in</Height><TablixCells>`,
|
|
1041
|
+
dCells,
|
|
1042
|
+
` </TablixCells></TablixRow>`,
|
|
1043
|
+
` <TablixRow><Height>0.25in</Height><TablixCells>`,
|
|
1044
|
+
totCells,
|
|
1045
|
+
` </TablixCells></TablixRow>`,
|
|
1046
|
+
` </TablixRows>`,
|
|
1047
|
+
` </TablixBody>`,
|
|
1048
|
+
` <TablixColumnHierarchy><TablixMembers>`,
|
|
1049
|
+
cMembers,
|
|
1050
|
+
` </TablixMembers></TablixColumnHierarchy>`,
|
|
1051
|
+
` <TablixRowHierarchy><TablixMembers>`,
|
|
1052
|
+
` <TablixMember>`,
|
|
1053
|
+
` <KeepWithGroup>After</KeepWithGroup>`,
|
|
1054
|
+
` <RepeatOnNewPage>true</RepeatOnNewPage>`,
|
|
1055
|
+
` </TablixMember>`,
|
|
1056
|
+
` <TablixMember>`,
|
|
1057
|
+
` <Group Name="${rowGrp}">`,
|
|
1058
|
+
` <DataGroupName>${rowGrp}</DataGroupName>`,
|
|
1059
|
+
` <GroupExpressions>`,
|
|
1060
|
+
` <GroupExpression>=Fields!${groupField.name}.Value</GroupExpression>`,
|
|
1061
|
+
` </GroupExpressions>`,
|
|
1062
|
+
` </Group>`,
|
|
1063
|
+
` <TablixMembers>`,
|
|
1064
|
+
` <TablixMember><Group Name="${detailGrp}"><DataGroupName>${detailGrp}</DataGroupName></Group></TablixMember>`,
|
|
1065
|
+
` </TablixMembers>`,
|
|
1066
|
+
` </TablixMember>`,
|
|
1067
|
+
` <TablixMember>`,
|
|
1068
|
+
` <Group Name="Total_${datasetName}"><DataGroupName>Total_${datasetName}</DataGroupName></Group>`,
|
|
1069
|
+
` </TablixMember>`,
|
|
1070
|
+
` </TablixMembers></TablixRowHierarchy>`,
|
|
1071
|
+
` <DataSetName>${datasetName}</DataSetName>`,
|
|
1072
|
+
` <Top>0.5in</Top><Left>0.5in</Left>`,
|
|
1073
|
+
` <Height>1in</Height><Width>${totalW}in</Width>`,
|
|
1074
|
+
` <Style><Border><Style>Solid</Style></Border></Style>`,
|
|
1075
|
+
` </Tablix>`,
|
|
1076
|
+
].join('\n');
|
|
1077
|
+
// Replace the existing flat tablix for this dataset
|
|
1078
|
+
const tablixRe = new RegExp(` <Tablix Name="Tablix_${datasetName}">[\\s\\S]*? </Tablix>`, 'g');
|
|
1079
|
+
const replaced = axReportXml.replace(tablixRe, groupedTablix);
|
|
1080
|
+
// If nothing matched (e.g. no fields were generated), return unchanged
|
|
1081
|
+
return replaced;
|
|
1082
|
+
}
|
|
1083
|
+
/**
|
|
1084
|
+
* Suggest EDT based on field name heuristics (shared with generateSmartTable).
|
|
1085
|
+
*/
|
|
1086
|
+
function suggestEdtFromFieldName(fieldName) {
|
|
1087
|
+
const n = fieldName.toLowerCase();
|
|
1088
|
+
if (n === 'recid')
|
|
1089
|
+
return 'RecId';
|
|
1090
|
+
if (n === 'accountnum' || n === 'accountnumber')
|
|
1091
|
+
return 'CustAccount';
|
|
1092
|
+
if (n.includes('custaccount') || n.includes('customeraccount'))
|
|
1093
|
+
return 'CustAccount';
|
|
1094
|
+
if (n.includes('vendaccount') || (n.includes('vendor') && n.includes('account')))
|
|
1095
|
+
return 'VendAccount';
|
|
1096
|
+
if (n === 'name' || n === 'itemname')
|
|
1097
|
+
return 'Name';
|
|
1098
|
+
if (n.includes('name'))
|
|
1099
|
+
return 'Name';
|
|
1100
|
+
if (n === 'description' || n === 'desc')
|
|
1101
|
+
return 'Description';
|
|
1102
|
+
if (n.includes('description'))
|
|
1103
|
+
return 'Description';
|
|
1104
|
+
if (n.includes('amount') || n.includes('balance'))
|
|
1105
|
+
return 'AmountMST';
|
|
1106
|
+
if (n.includes('quantity') || n.includes('qty'))
|
|
1107
|
+
return 'Qty';
|
|
1108
|
+
if (n.includes('price'))
|
|
1109
|
+
return 'PriceUnit';
|
|
1110
|
+
if (n === 'fromdate' || n === 'validfrom')
|
|
1111
|
+
return 'TransDate';
|
|
1112
|
+
if (n === 'todate' || n === 'validto')
|
|
1113
|
+
return 'TransDate';
|
|
1114
|
+
if (n.includes('date'))
|
|
1115
|
+
return 'TransDate';
|
|
1116
|
+
if (n.includes('itemid') || n === 'item')
|
|
1117
|
+
return 'ItemId';
|
|
1118
|
+
if (n.includes('custgroup'))
|
|
1119
|
+
return 'CustGroupId';
|
|
1120
|
+
if (n.includes('cust'))
|
|
1121
|
+
return 'CustAccount';
|
|
1122
|
+
if (n.includes('vend'))
|
|
1123
|
+
return 'VendAccount';
|
|
1124
|
+
if (n.includes('percent') || n.includes('pct'))
|
|
1125
|
+
return 'Percent';
|
|
1126
|
+
if (n.includes('zone'))
|
|
1127
|
+
return 'WHSZoneId';
|
|
1128
|
+
if (n.includes('warehouse') || n === 'whs')
|
|
1129
|
+
return 'InventLocationId';
|
|
1130
|
+
return 'String255';
|
|
1131
|
+
}
|
|
1132
|
+
/**
|
|
1133
|
+
* Resolve .NET data type for RDL from an EDT name by checking edt_metadata.
|
|
1134
|
+
*/
|
|
1135
|
+
function resolveRdlDataType(edtName, db) {
|
|
1136
|
+
if (!edtName)
|
|
1137
|
+
return 'System.String';
|
|
1138
|
+
const baseType = resolveEdtBaseType(edtName, db);
|
|
1139
|
+
switch (baseType) {
|
|
1140
|
+
case 'Real': return 'System.Double';
|
|
1141
|
+
case 'Integer': return 'System.Int32';
|
|
1142
|
+
case 'Int64': return 'System.Int64';
|
|
1143
|
+
case 'Date': return 'System.DateTime';
|
|
1144
|
+
case 'UtcDateTime': return 'System.DateTime';
|
|
1145
|
+
case 'DateTime': return 'System.DateTime';
|
|
1146
|
+
case 'Guid':
|
|
1147
|
+
case 'GUID': return 'System.String';
|
|
1148
|
+
case 'Container': return 'System.Byte[]';
|
|
1149
|
+
case 'Enum': return 'System.Int32';
|
|
1150
|
+
default: return 'System.String';
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
/**
|
|
1154
|
+
* Walk EDT extends chain to find primitive base type (same as generateSmartTable).
|
|
1155
|
+
*/
|
|
1156
|
+
function resolveEdtBaseType(edtName, db, depth = 0) {
|
|
1157
|
+
const PRIMITIVES = new Set([
|
|
1158
|
+
'String', 'Integer', 'Int64', 'Real', 'Date', 'UtcDateTime', 'DateTime',
|
|
1159
|
+
'Enum', 'Container', 'Guid', 'GUID',
|
|
1160
|
+
]);
|
|
1161
|
+
if (depth > 8)
|
|
1162
|
+
return 'String';
|
|
1163
|
+
if (PRIMITIVES.has(edtName))
|
|
1164
|
+
return edtName;
|
|
1165
|
+
try {
|
|
1166
|
+
const row = db.prepare(`SELECT extends, enum_type FROM edt_metadata WHERE edt_name = ? LIMIT 1`).get(edtName);
|
|
1167
|
+
if (!row)
|
|
1168
|
+
return 'String';
|
|
1169
|
+
// Enum-based EDT: extends is null but enum_type is set (e.g. SalesStatus, PurchStatus)
|
|
1170
|
+
if (row.enum_type && !row.extends)
|
|
1171
|
+
return 'Enum';
|
|
1172
|
+
if (!row.extends)
|
|
1173
|
+
return 'String';
|
|
1174
|
+
if (PRIMITIVES.has(row.extends))
|
|
1175
|
+
return row.extends;
|
|
1176
|
+
return resolveEdtBaseType(row.extends, db, depth + 1);
|
|
1177
|
+
}
|
|
1178
|
+
catch {
|
|
1179
|
+
return 'String';
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
/**
|
|
1183
|
+
* Resolve AxTableField type from EDT (for SmartXmlBuilder).
|
|
1184
|
+
*/
|
|
1185
|
+
function resolveFieldType(edtName, db) {
|
|
1186
|
+
if (!edtName)
|
|
1187
|
+
return undefined;
|
|
1188
|
+
const base = resolveEdtBaseType(edtName, db);
|
|
1189
|
+
// SmartXmlBuilder uses these type strings to pick AxTableFieldXxx
|
|
1190
|
+
switch (base) {
|
|
1191
|
+
case 'Real': return 'Real';
|
|
1192
|
+
case 'Integer': return 'Integer';
|
|
1193
|
+
case 'Int64': return 'Int64';
|
|
1194
|
+
case 'Date': return 'Date';
|
|
1195
|
+
case 'UtcDateTime': return 'UtcDateTime';
|
|
1196
|
+
case 'DateTime': return 'UtcDateTime';
|
|
1197
|
+
case 'Enum': return 'Enum';
|
|
1198
|
+
case 'Container': return 'Container';
|
|
1199
|
+
case 'Guid':
|
|
1200
|
+
case 'GUID': return 'Guid';
|
|
1201
|
+
default: return undefined; // String is default
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
/**
|
|
1205
|
+
* Resolve the first datasource table name for an AOT query from the symbol index.
|
|
1206
|
+
* When found the caller can generate `tableNum(TableName)` — a compile-time-validated
|
|
1207
|
+
* table reference — instead of the generic `getNo(1)` / `Common` pattern.
|
|
1208
|
+
* Returns undefined when the query is not in the index (non-Windows, or unknown query).
|
|
1209
|
+
*/
|
|
1210
|
+
function resolveAotQueryFirstTable(requestedQueryName, db) {
|
|
1211
|
+
try {
|
|
1212
|
+
// Resolve the caller's casing to the canonical AOT name once (#686), so the
|
|
1213
|
+
// parent-scoped probe below stays BINARY and on-index.
|
|
1214
|
+
const queryName = canonicalSymbolName(db, requestedQueryName, ['query']) ?? requestedQueryName;
|
|
1215
|
+
// Strategy 1: explicit query_datasource symbols (parent_name = query name)
|
|
1216
|
+
const ds = db.prepare(`SELECT name FROM symbols
|
|
1217
|
+
WHERE type IN ('query_datasource','querydatasource','QueryDataSource')
|
|
1218
|
+
AND parent_name = ?
|
|
1219
|
+
ORDER BY rowid
|
|
1220
|
+
LIMIT 1`).get(queryName);
|
|
1221
|
+
if (ds?.name)
|
|
1222
|
+
return ds.name;
|
|
1223
|
+
// Strategy 2: query symbol's signature may contain comma-separated table names
|
|
1224
|
+
const q = db.prepare(`SELECT signature FROM symbols
|
|
1225
|
+
WHERE type IN ('query','Query')
|
|
1226
|
+
AND name = ?
|
|
1227
|
+
LIMIT 1`).get(queryName);
|
|
1228
|
+
if (q?.signature) {
|
|
1229
|
+
const first = q.signature.split(/[,;|]/)[0].trim();
|
|
1230
|
+
if (first)
|
|
1231
|
+
return first;
|
|
1232
|
+
}
|
|
1233
|
+
return undefined;
|
|
1234
|
+
}
|
|
1235
|
+
catch {
|
|
1236
|
+
return undefined;
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
/**
|
|
1240
|
+
* Map X++ contract param types to RDL .NET types.
|
|
1241
|
+
*/
|
|
1242
|
+
function contractParamToRdlType(xppType) {
|
|
1243
|
+
const t = xppType.toLowerCase();
|
|
1244
|
+
if (t === 'real' || t === 'amountmst' || t === 'qty' || t === 'percent')
|
|
1245
|
+
return 'System.Double';
|
|
1246
|
+
if (t === 'int' || t === 'integer')
|
|
1247
|
+
return 'System.Int32';
|
|
1248
|
+
if (t === 'int64' || t === 'recid' || t === 'refrecid')
|
|
1249
|
+
return 'System.Int64';
|
|
1250
|
+
if (t.includes('date'))
|
|
1251
|
+
return 'System.DateTime';
|
|
1252
|
+
return 'System.String';
|
|
1253
|
+
}
|
|
1254
|
+
//# sourceMappingURL=generateSmartReport.js.map
|