@jwikman/bc-code-intelligence-mcp 1.5.7-dev.1
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 +165 -0
- package/dist/cache/cache-manager.d.ts +95 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +328 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/cli/bc-code-intel-cli.d.ts +9 -0
- package/dist/cli/bc-code-intel-cli.d.ts.map +1 -0
- package/dist/cli/bc-code-intel-cli.js +440 -0
- package/dist/cli/bc-code-intel-cli.js.map +1 -0
- package/dist/config/config-loader.d.ts +28 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +497 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-validator.d.ts +84 -0
- package/dist/config/config-validator.d.ts.map +1 -0
- package/dist/config/config-validator.js +608 -0
- package/dist/config/config-validator.js.map +1 -0
- package/dist/config/test-config-loader.d.ts +10 -0
- package/dist/config/test-config-loader.d.ts.map +1 -0
- package/dist/config/test-config-loader.js +135 -0
- package/dist/config/test-config-loader.js.map +1 -0
- package/dist/config/test-enhanced-layer-service.d.ts +7 -0
- package/dist/config/test-enhanced-layer-service.d.ts.map +1 -0
- package/dist/config/test-enhanced-layer-service.js +104 -0
- package/dist/config/test-enhanced-layer-service.js.map +1 -0
- package/dist/config/test-git-layer.d.ts +7 -0
- package/dist/config/test-git-layer.d.ts.map +1 -0
- package/dist/config/test-git-layer.js +68 -0
- package/dist/config/test-git-layer.js.map +1 -0
- package/dist/dev/hot-reload.d.ts +91 -0
- package/dist/dev/hot-reload.d.ts.map +1 -0
- package/dist/dev/hot-reload.js +358 -0
- package/dist/dev/hot-reload.js.map +1 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1211 -0
- package/dist/index.js.map +1 -0
- package/dist/layers/base-layer.d.ts +133 -0
- package/dist/layers/base-layer.d.ts.map +1 -0
- package/dist/layers/base-layer.js +290 -0
- package/dist/layers/base-layer.js.map +1 -0
- package/dist/layers/embedded-layer.d.ts +130 -0
- package/dist/layers/embedded-layer.d.ts.map +1 -0
- package/dist/layers/embedded-layer.js +612 -0
- package/dist/layers/embedded-layer.js.map +1 -0
- package/dist/layers/git-layer.d.ts +77 -0
- package/dist/layers/git-layer.d.ts.map +1 -0
- package/dist/layers/git-layer.js +529 -0
- package/dist/layers/git-layer.js.map +1 -0
- package/dist/layers/index.d.ts +12 -0
- package/dist/layers/index.d.ts.map +1 -0
- package/dist/layers/index.js +11 -0
- package/dist/layers/index.js.map +1 -0
- package/dist/layers/layer-service.d.ts +135 -0
- package/dist/layers/layer-service.d.ts.map +1 -0
- package/dist/layers/layer-service.js +586 -0
- package/dist/layers/layer-service.js.map +1 -0
- package/dist/layers/project-layer.d.ts +58 -0
- package/dist/layers/project-layer.d.ts.map +1 -0
- package/dist/layers/project-layer.js +286 -0
- package/dist/layers/project-layer.js.map +1 -0
- package/dist/monitoring/production-monitor.d.ts +148 -0
- package/dist/monitoring/production-monitor.d.ts.map +1 -0
- package/dist/monitoring/production-monitor.js +463 -0
- package/dist/monitoring/production-monitor.js.map +1 -0
- package/dist/performance/performance-monitor.d.ts +99 -0
- package/dist/performance/performance-monitor.d.ts.map +1 -0
- package/dist/performance/performance-monitor.js +253 -0
- package/dist/performance/performance-monitor.js.map +1 -0
- package/dist/sdk/bc-code-intel-client.d.ts +175 -0
- package/dist/sdk/bc-code-intel-client.d.ts.map +1 -0
- package/dist/sdk/bc-code-intel-client.js +380 -0
- package/dist/sdk/bc-code-intel-client.js.map +1 -0
- package/dist/search/intelligent-search.d.ts +97 -0
- package/dist/search/intelligent-search.d.ts.map +1 -0
- package/dist/search/intelligent-search.js +358 -0
- package/dist/search/intelligent-search.js.map +1 -0
- package/dist/security/access-control.d.ts +110 -0
- package/dist/security/access-control.d.ts.map +1 -0
- package/dist/security/access-control.js +353 -0
- package/dist/security/access-control.js.map +1 -0
- package/dist/services/code-analysis-service.d.ts +72 -0
- package/dist/services/code-analysis-service.d.ts.map +1 -0
- package/dist/services/code-analysis-service.js +818 -0
- package/dist/services/code-analysis-service.js.map +1 -0
- package/dist/services/enhanced-prompt-service.d.ts +56 -0
- package/dist/services/enhanced-prompt-service.d.ts.map +1 -0
- package/dist/services/enhanced-prompt-service.js +165 -0
- package/dist/services/enhanced-prompt-service.js.map +1 -0
- package/dist/services/knowledge-service.d.ts +90 -0
- package/dist/services/knowledge-service.d.ts.map +1 -0
- package/dist/services/knowledge-service.js +342 -0
- package/dist/services/knowledge-service.js.map +1 -0
- package/dist/services/methodology-service.d.ts +91 -0
- package/dist/services/methodology-service.d.ts.map +1 -0
- package/dist/services/methodology-service.js +423 -0
- package/dist/services/methodology-service.js.map +1 -0
- package/dist/services/multi-content-layer-service.d.ts +198 -0
- package/dist/services/multi-content-layer-service.d.ts.map +1 -0
- package/dist/services/multi-content-layer-service.js +991 -0
- package/dist/services/multi-content-layer-service.js.map +1 -0
- package/dist/services/roleplay-engine.d.ts +161 -0
- package/dist/services/roleplay-engine.d.ts.map +1 -0
- package/dist/services/roleplay-engine.js +994 -0
- package/dist/services/roleplay-engine.js.map +1 -0
- package/dist/services/session-storage/file-storage.d.ts +30 -0
- package/dist/services/session-storage/file-storage.d.ts.map +1 -0
- package/dist/services/session-storage/file-storage.js +229 -0
- package/dist/services/session-storage/file-storage.js.map +1 -0
- package/dist/services/session-storage/in-memory-storage.d.ts +31 -0
- package/dist/services/session-storage/in-memory-storage.d.ts.map +1 -0
- package/dist/services/session-storage/in-memory-storage.js +142 -0
- package/dist/services/session-storage/in-memory-storage.js.map +1 -0
- package/dist/services/specialist-discovery.d.ts +98 -0
- package/dist/services/specialist-discovery.d.ts.map +1 -0
- package/dist/services/specialist-discovery.js +387 -0
- package/dist/services/specialist-discovery.js.map +1 -0
- package/dist/services/specialist-loader.d.ts +101 -0
- package/dist/services/specialist-loader.d.ts.map +1 -0
- package/dist/services/specialist-loader.js +256 -0
- package/dist/services/specialist-loader.js.map +1 -0
- package/dist/services/specialist-session-manager.d.ts +76 -0
- package/dist/services/specialist-session-manager.d.ts.map +1 -0
- package/dist/services/specialist-session-manager.js +255 -0
- package/dist/services/specialist-session-manager.js.map +1 -0
- package/dist/services/workflow-service.d.ts +146 -0
- package/dist/services/workflow-service.d.ts.map +1 -0
- package/dist/services/workflow-service.js +409 -0
- package/dist/services/workflow-service.js.map +1 -0
- package/dist/setup/post-install.d.ts +12 -0
- package/dist/setup/post-install.d.ts.map +1 -0
- package/dist/setup/post-install.js +81 -0
- package/dist/setup/post-install.js.map +1 -0
- package/dist/streamlined-handlers.d.ts +94 -0
- package/dist/streamlined-handlers.d.ts.map +1 -0
- package/dist/streamlined-handlers.js +665 -0
- package/dist/streamlined-handlers.js.map +1 -0
- package/dist/test-enhanced-mcp-server.d.ts +7 -0
- package/dist/test-enhanced-mcp-server.d.ts.map +1 -0
- package/dist/test-enhanced-mcp-server.js +177 -0
- package/dist/test-enhanced-mcp-server.js.map +1 -0
- package/dist/tools/config-diagnostic-tools.d.ts +234 -0
- package/dist/tools/config-diagnostic-tools.d.ts.map +1 -0
- package/dist/tools/config-diagnostic-tools.js +887 -0
- package/dist/tools/config-diagnostic-tools.js.map +1 -0
- package/dist/tools/core-tools.d.ts +26 -0
- package/dist/tools/core-tools.d.ts.map +1 -0
- package/dist/tools/core-tools.js +241 -0
- package/dist/tools/core-tools.js.map +1 -0
- package/dist/tools/handoff-tools.d.ts +37 -0
- package/dist/tools/handoff-tools.d.ts.map +1 -0
- package/dist/tools/handoff-tools.js +265 -0
- package/dist/tools/handoff-tools.js.map +1 -0
- package/dist/tools/index.d.ts +61 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +75 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/onboarding-tools.d.ts +43 -0
- package/dist/tools/onboarding-tools.d.ts.map +1 -0
- package/dist/tools/onboarding-tools.js +353 -0
- package/dist/tools/onboarding-tools.js.map +1 -0
- package/dist/tools/specialist-discovery-tools.d.ts +27 -0
- package/dist/tools/specialist-discovery-tools.d.ts.map +1 -0
- package/dist/tools/specialist-discovery-tools.js +275 -0
- package/dist/tools/specialist-discovery-tools.js.map +1 -0
- package/dist/tools/specialist-tools.d.ts +43 -0
- package/dist/tools/specialist-tools.d.ts.map +1 -0
- package/dist/tools/specialist-tools.js +372 -0
- package/dist/tools/specialist-tools.js.map +1 -0
- package/dist/tools/workspace-tools.d.ts +96 -0
- package/dist/tools/workspace-tools.d.ts.map +1 -0
- package/dist/tools/workspace-tools.js +188 -0
- package/dist/tools/workspace-tools.js.map +1 -0
- package/dist/types/bc-knowledge.d.ts +303 -0
- package/dist/types/bc-knowledge.d.ts.map +1 -0
- package/dist/types/bc-knowledge.js +69 -0
- package/dist/types/bc-knowledge.js.map +1 -0
- package/dist/types/config-types.d.ts +186 -0
- package/dist/types/config-types.d.ts.map +1 -0
- package/dist/types/config-types.js +109 -0
- package/dist/types/config-types.js.map +1 -0
- package/dist/types/enhanced-layer-types.d.ts +193 -0
- package/dist/types/enhanced-layer-types.d.ts.map +1 -0
- package/dist/types/enhanced-layer-types.js +9 -0
- package/dist/types/enhanced-layer-types.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/layer-types.d.ts +173 -0
- package/dist/types/layer-types.d.ts.map +1 -0
- package/dist/types/layer-types.js +27 -0
- package/dist/types/layer-types.js.map +1 -0
- package/dist/types/roleplay-types.d.ts +156 -0
- package/dist/types/roleplay-types.d.ts.map +1 -0
- package/dist/types/roleplay-types.js +8 -0
- package/dist/types/roleplay-types.js.map +1 -0
- package/dist/types/session-types.d.ts +127 -0
- package/dist/types/session-types.d.ts.map +1 -0
- package/dist/types/session-types.js +8 -0
- package/dist/types/session-types.js.map +1 -0
- package/dist/utils/path-utils.d.ts +5 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +14 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/dist/workflows/domain-workflows.d.ts +8 -0
- package/dist/workflows/domain-workflows.d.ts.map +1 -0
- package/dist/workflows/domain-workflows.js +360 -0
- package/dist/workflows/domain-workflows.js.map +1 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +24 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +24 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +30 -0
- package/embedded-knowledge/AGENTS.md +178 -0
- package/embedded-knowledge/CONTRIBUTING.md +58 -0
- package/embedded-knowledge/LICENSE +21 -0
- package/embedded-knowledge/README.md +32 -0
- package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +90 -0
- package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +113 -0
- package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +101 -0
- package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +87 -0
- package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +155 -0
- package/embedded-knowledge/domains/alex-architect/delegating-to-github-copilot-agents.md +371 -0
- package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +138 -0
- package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +79 -0
- package/embedded-knowledge/domains/alex-architect/object-id-ninja-integration.md +281 -0
- package/embedded-knowledge/domains/alex-architect/recommend-object-id-ninja.md +248 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +280 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +200 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +565 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +665 -0
- package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +325 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +696 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +320 -0
- package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +102 -0
- package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +433 -0
- package/embedded-knowledge/domains/alex-architect/samples/testability-design-patterns.md +223 -0
- package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +66 -0
- package/embedded-knowledge/domains/alex-architect/systemid-integration.md +115 -0
- package/embedded-knowledge/domains/alex-architect/testability-design-patterns.md +77 -0
- package/embedded-knowledge/domains/casey-copilot/long-running-session-instructions.md +263 -0
- package/embedded-knowledge/domains/casey-copilot/samples/long-running-session-instructions.md +323 -0
- package/embedded-knowledge/domains/chris-config/configuration-file-discovery.md +846 -0
- package/embedded-knowledge/domains/chris-config/configuration-file-formats.md +595 -0
- package/embedded-knowledge/domains/chris-config/content-types-structure.md +421 -0
- package/embedded-knowledge/domains/chris-config/knowledge-content-creation.md +437 -0
- package/embedded-knowledge/domains/chris-config/layer-system-fundamentals.md +257 -0
- package/embedded-knowledge/domains/chris-config/multi-team-layer-configuration.md +302 -0
- package/embedded-knowledge/domains/chris-config/workspace-detection-solutions.md +336 -0
- package/embedded-knowledge/domains/dean-debug/bc-telemetry-buddy-integration.md +453 -0
- package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +360 -0
- package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +86 -0
- package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +96 -0
- package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +70 -0
- package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +84 -0
- package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +93 -0
- package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +73 -0
- package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +78 -0
- package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +79 -0
- package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +87 -0
- package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +209 -0
- package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +246 -0
- package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +107 -0
- package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +105 -0
- package/embedded-knowledge/domains/dean-debug/recommend-bc-telemetry-buddy.md +160 -0
- package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +186 -0
- package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +60 -0
- package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +139 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +190 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +516 -0
- package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +298 -0
- package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +324 -0
- package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +344 -0
- package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +137 -0
- package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +340 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +810 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +86 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +110 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +758 -0
- package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +665 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +316 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +223 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +149 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +412 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +211 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +155 -0
- package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +475 -0
- package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +238 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +97 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +666 -0
- package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +319 -0
- package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +236 -0
- package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +59 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +67 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +90 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +87 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +74 -0
- package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +81 -0
- package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +56 -0
- package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +66 -0
- package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +79 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +78 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +83 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +76 -0
- package/embedded-knowledge/domains/dean-debug/testfield-performance.md +104 -0
- package/embedded-knowledge/domains/eva-errors/codeunit-run-pattern.md +159 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +145 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +104 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +114 -0
- package/embedded-knowledge/domains/eva-errors/samples/codeunit-run-pattern.md +239 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +356 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +256 -0
- package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +108 -0
- package/embedded-knowledge/domains/eva-errors/samples/try-function-usage.md +195 -0
- package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +80 -0
- package/embedded-knowledge/domains/eva-errors/try-function-usage.md +129 -0
- package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +98 -0
- package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +123 -0
- package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +96 -0
- package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +114 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +395 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +479 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +548 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +287 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +434 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +508 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +615 -0
- package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +144 -0
- package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +124 -0
- package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +84 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +75 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +385 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +72 -0
- package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +48 -0
- package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +49 -0
- package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +67 -0
- package/embedded-knowledge/domains/morgan-market/partner-readiness-analysis.md +201 -0
- package/embedded-knowledge/domains/morgan-market/samples/partner-readiness-checklist.md +288 -0
- package/embedded-knowledge/domains/parker-pragmatic/README.md +39 -0
- package/embedded-knowledge/domains/parker-pragmatic/proposal-workflows/creating-effective-proposals.md +583 -0
- package/embedded-knowledge/domains/parker-pragmatic/trust-building/working-with-ai-skeptics.md +587 -0
- package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +119 -0
- package/embedded-knowledge/domains/quinn-tester/isolation-testing-patterns.md +82 -0
- package/embedded-knowledge/domains/quinn-tester/rule-execution.md +123 -0
- package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +60 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +83 -0
- package/embedded-knowledge/domains/quinn-tester/samples/isolation-testing-patterns.md +424 -0
- package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +716 -0
- package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +91 -0
- package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +79 -0
- package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +79 -0
- package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +89 -0
- package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +81 -0
- package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +75 -0
- package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +96 -0
- package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +86 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +90 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +82 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +100 -0
- package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +115 -0
- package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +124 -0
- package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +110 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +438 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +255 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +209 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +280 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +188 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +245 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +244 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +278 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +484 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +107 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +280 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/testability-code-smells.md +256 -0
- package/embedded-knowledge/domains/roger-reviewer/testability-code-smells.md +67 -0
- package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +67 -0
- package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +76 -0
- package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +98 -0
- package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +128 -0
- package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +95 -0
- package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +91 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +118 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +111 -0
- package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +113 -0
- package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +127 -0
- package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +66 -0
- package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +96 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +161 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +177 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +239 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +346 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +298 -0
- package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +677 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +117 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +75 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +169 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +399 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +356 -0
- package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +889 -0
- package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +84 -0
- package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +127 -0
- package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +89 -0
- package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +516 -0
- package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +61 -0
- package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +427 -0
- package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +122 -0
- package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +96 -0
- package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +101 -0
- package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +149 -0
- package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +107 -0
- package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +95 -0
- package/embedded-knowledge/domains/seth-security/api-permission-model.md +115 -0
- package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +78 -0
- package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +373 -0
- package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +308 -0
- package/embedded-knowledge/domains/shared/al-file-naming-conventions.md +146 -0
- package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +79 -0
- package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +78 -0
- package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +81 -0
- package/embedded-knowledge/indexes/bc-version-matrix.json +188 -0
- package/embedded-knowledge/indexes/domain-catalog.json +106 -0
- package/embedded-knowledge/indexes/tags/abbreviations.json +1 -0
- package/embedded-knowledge/indexes/tags/abstraction.json +1 -0
- package/embedded-knowledge/indexes/tags/access-control.json +1 -0
- package/embedded-knowledge/indexes/tags/accessibility.json +1 -0
- package/embedded-knowledge/indexes/tags/actions.json +1 -0
- package/embedded-knowledge/indexes/tags/advanced-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/advanced.json +1 -0
- package/embedded-knowledge/indexes/tags/al-extension.json +1 -0
- package/embedded-knowledge/indexes/tags/al-generics.json +1 -0
- package/embedded-knowledge/indexes/tags/al-objects.json +1 -0
- package/embedded-knowledge/indexes/tags/al-syntax.json +1 -0
- package/embedded-knowledge/indexes/tags/algorithm-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/alternatives.json +1 -0
- package/embedded-knowledge/indexes/tags/analytics.json +1 -0
- package/embedded-knowledge/indexes/tags/api-delegates.json +1 -0
- package/embedded-knowledge/indexes/tags/api-design.json +1 -0
- package/embedded-knowledge/indexes/tags/api-documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/api-endpoints.json +1 -0
- package/embedded-knowledge/indexes/tags/api-extensibility.json +1 -0
- package/embedded-knowledge/indexes/tags/api-fieldsets.json +1 -0
- package/embedded-knowledge/indexes/tags/api-integration.json +1 -0
- package/embedded-knowledge/indexes/tags/api-interfaces.json +1 -0
- package/embedded-knowledge/indexes/tags/api-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/api-pages.json +1 -0
- package/embedded-knowledge/indexes/tags/api-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/api-permissions.json +1 -0
- package/embedded-knowledge/indexes/tags/api-responses.json +1 -0
- package/embedded-knowledge/indexes/tags/api-simplification.json +1 -0
- package/embedded-knowledge/indexes/tags/api.json +1 -0
- package/embedded-knowledge/indexes/tags/architecture.json +1 -0
- package/embedded-knowledge/indexes/tags/async-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/async-processing.json +1 -0
- package/embedded-knowledge/indexes/tags/automatic-registration.json +1 -0
- package/embedded-knowledge/indexes/tags/batch-operations.json +1 -0
- package/embedded-knowledge/indexes/tags/bc24-migration.json +1 -0
- package/embedded-knowledge/indexes/tags/begin-blocks.json +1 -0
- package/embedded-knowledge/indexes/tags/begin-end.json +1 -0
- package/embedded-knowledge/indexes/tags/behavioral-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/best-practices.json +1 -0
- package/embedded-knowledge/indexes/tags/binding.json +1 -0
- package/embedded-knowledge/indexes/tags/block-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/blocks.json +1 -0
- package/embedded-knowledge/indexes/tags/boolean-expressions.json +1 -0
- package/embedded-knowledge/indexes/tags/branching.json +1 -0
- package/embedded-knowledge/indexes/tags/breaking-changes.json +1 -0
- package/embedded-knowledge/indexes/tags/breakpoints.json +1 -0
- package/embedded-knowledge/indexes/tags/business-foundation.json +1 -0
- package/embedded-knowledge/indexes/tags/business-infrastructure.json +1 -0
- package/embedded-knowledge/indexes/tags/business-process.json +1 -0
- package/embedded-knowledge/indexes/tags/business-rules.json +1 -0
- package/embedded-knowledge/indexes/tags/caching.json +1 -0
- package/embedded-knowledge/indexes/tags/case-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/case.json +1 -0
- package/embedded-knowledge/indexes/tags/code-analysis.json +1 -0
- package/embedded-knowledge/indexes/tags/code-clarity.json +1 -0
- package/embedded-knowledge/indexes/tags/code-comprehension.json +1 -0
- package/embedded-knowledge/indexes/tags/code-conversion.json +1 -0
- package/embedded-knowledge/indexes/tags/code-formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/code-organization.json +1 -0
- package/embedded-knowledge/indexes/tags/code-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/code-quality.json +1 -0
- package/embedded-knowledge/indexes/tags/code-reuse.json +1 -0
- package/embedded-knowledge/indexes/tags/code-simplification.json +1 -0
- package/embedded-knowledge/indexes/tags/code-standards.json +1 -0
- package/embedded-knowledge/indexes/tags/code-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/code-style.json +1 -0
- package/embedded-knowledge/indexes/tags/codeunit-design.json +1 -0
- package/embedded-knowledge/indexes/tags/command-queue.json +1 -0
- package/embedded-knowledge/indexes/tags/comments.json +1 -0
- package/embedded-knowledge/indexes/tags/compile-time-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/complex-facade.json +1 -0
- package/embedded-knowledge/indexes/tags/complexity-hiding.json +1 -0
- package/embedded-knowledge/indexes/tags/complexity-management.json +1 -0
- package/embedded-knowledge/indexes/tags/compound-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/concurrency.json +1 -0
- package/embedded-knowledge/indexes/tags/conditional-logic.json +1 -0
- package/embedded-knowledge/indexes/tags/conditional.json +1 -0
- package/embedded-knowledge/indexes/tags/conflict-resolution.json +1 -0
- package/embedded-knowledge/indexes/tags/consistency.json +1 -0
- package/embedded-knowledge/indexes/tags/contract-design.json +1 -0
- package/embedded-knowledge/indexes/tags/control-flow.json +1 -0
- package/embedded-knowledge/indexes/tags/conversion-guide.json +1 -0
- package/embedded-knowledge/indexes/tags/correlation.json +1 -0
- package/embedded-knowledge/indexes/tags/custom-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/data-access.json +1 -0
- package/embedded-knowledge/indexes/tags/data-exposure.json +1 -0
- package/embedded-knowledge/indexes/tags/data-integrity.json +1 -0
- package/embedded-knowledge/indexes/tags/data-loading.json +1 -0
- package/embedded-knowledge/indexes/tags/data-manipulation.json +1 -0
- package/embedded-knowledge/indexes/tags/data-modeling.json +1 -0
- package/embedded-knowledge/indexes/tags/data-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/data-protection.json +1 -0
- package/embedded-knowledge/indexes/tags/data-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/database.json +1 -0
- package/embedded-knowledge/indexes/tags/debugging.json +1 -0
- package/embedded-knowledge/indexes/tags/decision-making.json +1 -0
- package/embedded-knowledge/indexes/tags/declaration.json +1 -0
- package/embedded-knowledge/indexes/tags/default-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/defensive-programming.json +1 -0
- package/embedded-knowledge/indexes/tags/deleteall.json +1 -0
- package/embedded-knowledge/indexes/tags/dependencies.json +1 -0
- package/embedded-knowledge/indexes/tags/deployment.json +1 -0
- package/embedded-knowledge/indexes/tags/developer-productivity.json +1 -0
- package/embedded-knowledge/indexes/tags/development-workflow.json +1 -0
- package/embedded-knowledge/indexes/tags/diagnostics.json +1 -0
- package/embedded-knowledge/indexes/tags/dimensions.json +1 -0
- package/embedded-knowledge/indexes/tags/documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/early-exit.json +1 -0
- package/embedded-knowledge/indexes/tags/else-clauses.json +1 -0
- package/embedded-knowledge/indexes/tags/end-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/enterprise-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/entity-relationships.json +1 -0
- package/embedded-knowledge/indexes/tags/error-handling.json +1 -0
- package/embedded-knowledge/indexes/tags/error-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/error-prevention.json +1 -0
- package/embedded-knowledge/indexes/tags/error-text.json +1 -0
- package/embedded-knowledge/indexes/tags/etag.json +1 -0
- package/embedded-knowledge/indexes/tags/event-bridge.json +1 -0
- package/embedded-knowledge/indexes/tags/event-payload.json +1 -0
- package/embedded-knowledge/indexes/tags/event-routing.json +1 -0
- package/embedded-knowledge/indexes/tags/events.json +1 -0
- package/embedded-knowledge/indexes/tags/execution-flow.json +1 -0
- package/embedded-knowledge/indexes/tags/expressions.json +1 -0
- package/embedded-knowledge/indexes/tags/extensibility.json +1 -0
- package/embedded-knowledge/indexes/tags/extensions.json +1 -0
- package/embedded-knowledge/indexes/tags/facade-composition.json +1 -0
- package/embedded-knowledge/indexes/tags/facade-pattern.json +1 -0
- package/embedded-knowledge/indexes/tags/field-control.json +1 -0
- package/embedded-knowledge/indexes/tags/field-exclusion.json +1 -0
- package/embedded-knowledge/indexes/tags/field-registration.json +1 -0
- package/embedded-knowledge/indexes/tags/field-state.json +1 -0
- package/embedded-knowledge/indexes/tags/field-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/fielderror.json +1 -0
- package/embedded-knowledge/indexes/tags/fields.json +1 -0
- package/embedded-knowledge/indexes/tags/filtering.json +1 -0
- package/embedded-knowledge/indexes/tags/filters.json +1 -0
- package/embedded-knowledge/indexes/tags/formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/generic-methods.json +1 -0
- package/embedded-knowledge/indexes/tags/http-status.json +1 -0
- package/embedded-knowledge/indexes/tags/if-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/implementation.json +1 -0
- package/embedded-knowledge/indexes/tags/indentation.json +1 -0
- package/embedded-knowledge/indexes/tags/index-summary.json +277 -0
- package/embedded-knowledge/indexes/tags/indexing.json +1 -0
- package/embedded-knowledge/indexes/tags/inheritance.json +1 -0
- package/embedded-knowledge/indexes/tags/integration.json +1 -0
- package/embedded-knowledge/indexes/tags/integrity-checking.json +1 -0
- package/embedded-knowledge/indexes/tags/intellisense.json +1 -0
- package/embedded-knowledge/indexes/tags/interface-design.json +1 -0
- package/embedded-knowledge/indexes/tags/interface-segregation.json +1 -0
- package/embedded-knowledge/indexes/tags/isolation.json +1 -0
- package/embedded-knowledge/indexes/tags/job-processing.json +1 -0
- package/embedded-knowledge/indexes/tags/keyboard-navigation.json +1 -0
- package/embedded-knowledge/indexes/tags/keywords.json +1 -0
- package/embedded-knowledge/indexes/tags/legacy-modernization.json +1 -0
- package/embedded-knowledge/indexes/tags/line-breaks.json +1 -0
- package/embedded-knowledge/indexes/tags/line-organization.json +1 -0
- package/embedded-knowledge/indexes/tags/line-positioning.json +1 -0
- package/embedded-knowledge/indexes/tags/localization.json +1 -0
- package/embedded-knowledge/indexes/tags/logging.json +1 -0
- package/embedded-knowledge/indexes/tags/loose-coupling.json +1 -0
- package/embedded-knowledge/indexes/tags/maintainability.json +1 -0
- package/embedded-knowledge/indexes/tags/memory-management.json +1 -0
- package/embedded-knowledge/indexes/tags/memory-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/memory.json +1 -0
- package/embedded-knowledge/indexes/tags/message-design.json +1 -0
- package/embedded-knowledge/indexes/tags/message-formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/message-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/metadata-driven.json +1 -0
- package/embedded-knowledge/indexes/tags/method-comparison.json +1 -0
- package/embedded-knowledge/indexes/tags/module-architecture.json +1 -0
- package/embedded-knowledge/indexes/tags/module-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/monitoring.json +1 -0
- package/embedded-knowledge/indexes/tags/multi-layer-facade.json +1 -0
- package/embedded-knowledge/indexes/tags/multi-tenancy.json +1 -0
- package/embedded-knowledge/indexes/tags/multiple-values.json +1 -0
- package/embedded-knowledge/indexes/tags/naming-conventions.json +1 -0
- package/embedded-knowledge/indexes/tags/naming.json +1 -0
- package/embedded-knowledge/indexes/tags/navigation.json +1 -0
- package/embedded-knowledge/indexes/tags/nested-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series-conversion.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series.json +1 -0
- package/embedded-knowledge/indexes/tags/number-generation.json +1 -0
- package/embedded-knowledge/indexes/tags/object-documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/odata.json +1 -0
- package/embedded-knowledge/indexes/tags/ondelete.json +1 -0
- package/embedded-knowledge/indexes/tags/onvalidate.json +1 -0
- package/embedded-knowledge/indexes/tags/operation-delegation.json +1 -0
- package/embedded-knowledge/indexes/tags/operation-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/operators.json +1 -0
- package/embedded-knowledge/indexes/tags/optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/order.json +1 -0
- package/embedded-knowledge/indexes/tags/organization.json +1 -0
- package/embedded-knowledge/indexes/tags/pages.json +1 -0
- package/embedded-knowledge/indexes/tags/parameters.json +1 -0
- package/embedded-knowledge/indexes/tags/patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/performance-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/performance.json +1 -0
- package/embedded-knowledge/indexes/tags/placement.json +1 -0
- package/embedded-knowledge/indexes/tags/posting-codeunits.json +1 -0
- package/embedded-knowledge/indexes/tags/posting.json +1 -0
- package/embedded-knowledge/indexes/tags/preconditions.json +1 -0
- package/embedded-knowledge/indexes/tags/primary-key.json +1 -0
- package/embedded-knowledge/indexes/tags/privacy.json +1 -0
- package/embedded-knowledge/indexes/tags/process-automation.json +1 -0
- package/embedded-knowledge/indexes/tags/production.json +1 -0
- package/embedded-knowledge/indexes/tags/productivity.json +1 -0
- package/embedded-knowledge/indexes/tags/query-performance.json +1 -0
- package/embedded-knowledge/indexes/tags/queue-management.json +1 -0
- package/embedded-knowledge/indexes/tags/ranges.json +1 -0
- package/embedded-knowledge/indexes/tags/readability.json +1 -0
- package/embedded-knowledge/indexes/tags/record-access.json +1 -0
- package/embedded-knowledge/indexes/tags/record-methods.json +1 -0
- package/embedded-knowledge/indexes/tags/refactoring.json +1 -0
- package/embedded-knowledge/indexes/tags/reference.json +1 -0
- package/embedded-knowledge/indexes/tags/repeat-loops.json +1 -0
- package/embedded-knowledge/indexes/tags/repeat-statement.json +1 -0
- package/embedded-knowledge/indexes/tags/runtime-errors.json +1 -0
- package/embedded-knowledge/indexes/tags/runtime.json +1 -0
- package/embedded-knowledge/indexes/tags/safeguards.json +1 -0
- package/embedded-knowledge/indexes/tags/security.json +1 -0
- package/embedded-knowledge/indexes/tags/sequence-management.json +1 -0
- package/embedded-knowledge/indexes/tags/serialization.json +1 -0
- package/embedded-knowledge/indexes/tags/session-logmessage.json +1 -0
- package/embedded-knowledge/indexes/tags/session.json +1 -0
- package/embedded-knowledge/indexes/tags/setloadfields.json +1 -0
- package/embedded-knowledge/indexes/tags/shortcuts.json +1 -0
- package/embedded-knowledge/indexes/tags/sift.json +1 -0
- package/embedded-knowledge/indexes/tags/singleinstance.json +1 -0
- package/embedded-knowledge/indexes/tags/spacing.json +1 -0
- package/embedded-knowledge/indexes/tags/sql-translation.json +1 -0
- package/embedded-knowledge/indexes/tags/standards.json +1 -0
- package/embedded-knowledge/indexes/tags/statements.json +1 -0
- package/embedded-knowledge/indexes/tags/streaming.json +1 -0
- package/embedded-knowledge/indexes/tags/strong-typing.json +1 -0
- package/embedded-knowledge/indexes/tags/structural-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/structure.json +1 -0
- package/embedded-knowledge/indexes/tags/subscribers.json +1 -0
- package/embedded-knowledge/indexes/tags/switch.json +1 -0
- package/embedded-knowledge/indexes/tags/symbol-search.json +1 -0
- package/embedded-knowledge/indexes/tags/syntax.json +1 -0
- package/embedded-knowledge/indexes/tags/systemid.json +1 -0
- package/embedded-knowledge/indexes/tags/table-configuration.json +1 -0
- package/embedded-knowledge/indexes/tags/table-events.json +1 -0
- package/embedded-knowledge/indexes/tags/table-keys.json +1 -0
- package/embedded-knowledge/indexes/tags/table-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/task-scheduler.json +1 -0
- package/embedded-knowledge/indexes/tags/telemetry.json +1 -0
- package/embedded-knowledge/indexes/tags/template-method.json +1 -0
- package/embedded-knowledge/indexes/tags/temporary-tables.json +1 -0
- package/embedded-knowledge/indexes/tags/testfield.json +1 -0
- package/embedded-knowledge/indexes/tags/tradeoffs.json +1 -0
- package/embedded-knowledge/indexes/tags/triggers.json +1 -0
- package/embedded-knowledge/indexes/tags/troubleshooting.json +1 -0
- package/embedded-knowledge/indexes/tags/type-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/url-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/user-experience.json +1 -0
- package/embedded-knowledge/indexes/tags/user-feedback.json +1 -0
- package/embedded-knowledge/indexes/tags/user-interface.json +1 -0
- package/embedded-knowledge/indexes/tags/validation-feedback.json +1 -0
- package/embedded-knowledge/indexes/tags/validation.json +1 -0
- package/embedded-knowledge/indexes/tags/variables.json +1 -0
- package/embedded-knowledge/indexes/tags/verbosity.json +1 -0
- package/embedded-knowledge/indexes/tags/vs-code.json +1 -0
- package/embedded-knowledge/indexes/tags/web-services.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-management.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-templates.json +1 -0
- package/embedded-knowledge/indexes/tags/workspace.json +1 -0
- package/embedded-knowledge/indexes/tags/xml-documentation.json +1 -0
- package/embedded-knowledge/indexes/topic-relationships.json +128 -0
- package/embedded-knowledge/methodologies/index.json +81 -0
- package/embedded-knowledge/methodologies/phases/analysis-full.md +208 -0
- package/embedded-knowledge/methodologies/phases/analysis-quick.md +44 -0
- package/embedded-knowledge/methodologies/phases/analysis.md +182 -0
- package/embedded-knowledge/methodologies/phases/execution-validation-full.md +174 -0
- package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +31 -0
- package/embedded-knowledge/methodologies/phases/execution-validation.md +174 -0
- package/embedded-knowledge/methodologies/phases/performance-full.md +211 -0
- package/embedded-knowledge/methodologies/phases/performance-quick.md +32 -0
- package/embedded-knowledge/methodologies/phases/performance.md +211 -0
- package/embedded-knowledge/methodologies/phases/verification-full.md +162 -0
- package/embedded-knowledge/methodologies/phases/verification-quick.md +48 -0
- package/embedded-knowledge/methodologies/phases/verification.md +146 -0
- package/embedded-knowledge/methodologies/workflow-enforcement.md +142 -0
- package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +99 -0
- package/embedded-knowledge/methodologies/workflows/proposal-review-workflow.md +535 -0
- package/embedded-knowledge/specialists/alex-architect.md +305 -0
- package/embedded-knowledge/specialists/casey-copilot.md +314 -0
- package/embedded-knowledge/specialists/chris-config.md +226 -0
- package/embedded-knowledge/specialists/dean-debug.md +365 -0
- package/embedded-knowledge/specialists/eva-errors.md +291 -0
- package/embedded-knowledge/specialists/jordan-bridge.md +291 -0
- package/embedded-knowledge/specialists/logan-legacy.md +265 -0
- package/embedded-knowledge/specialists/maya-mentor.md +299 -0
- package/embedded-knowledge/specialists/morgan-market.md +281 -0
- package/embedded-knowledge/specialists/parker-pragmatic.md +564 -0
- package/embedded-knowledge/specialists/quinn-tester.md +323 -0
- package/embedded-knowledge/specialists/roger-reviewer.md +317 -0
- package/embedded-knowledge/specialists/sam-coder.md +342 -0
- package/embedded-knowledge/specialists/seth-security.md +290 -0
- package/embedded-knowledge/specialists/taylor-docs.md +312 -0
- package/embedded-knowledge/specialists/uma-ux.md +291 -0
- package/package.json +82 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
# Temporary Table Safety - AL Code Examples
|
|
2
|
+
|
|
3
|
+
## Good Examples
|
|
4
|
+
|
|
5
|
+
### Secure Temporary Table with Cleanup
|
|
6
|
+
```al
|
|
7
|
+
procedure ProcessSensitiveCustomerData(CustomerFilter: Text): Boolean
|
|
8
|
+
var
|
|
9
|
+
Customer: Record Customer;
|
|
10
|
+
TempCustomerBuffer: Record Customer temporary;
|
|
11
|
+
ProcessingResult: Boolean;
|
|
12
|
+
begin
|
|
13
|
+
// Validate user permissions before populating temporary table
|
|
14
|
+
if not UserPermissions.CanViewCustomerData() then
|
|
15
|
+
exit(false);
|
|
16
|
+
|
|
17
|
+
Customer.SetFilter("No.", CustomerFilter);
|
|
18
|
+
if not Customer.FindSet() then
|
|
19
|
+
exit(false);
|
|
20
|
+
|
|
21
|
+
try
|
|
22
|
+
// Populate temporary table with filtered data
|
|
23
|
+
repeat
|
|
24
|
+
// Only include data user has permission to see
|
|
25
|
+
if UserPermissions.CanViewCustomer(Customer."No.") then begin
|
|
26
|
+
TempCustomerBuffer := Customer;
|
|
27
|
+
TempCustomerBuffer.Insert();
|
|
28
|
+
end;
|
|
29
|
+
until Customer.Next() = 0;
|
|
30
|
+
|
|
31
|
+
// Process temporary data
|
|
32
|
+
ProcessingResult := ProcessCustomerBuffer(TempCustomerBuffer);
|
|
33
|
+
|
|
34
|
+
finally
|
|
35
|
+
// Always clear sensitive temporary data
|
|
36
|
+
TempCustomerBuffer.DeleteAll();
|
|
37
|
+
end;
|
|
38
|
+
|
|
39
|
+
exit(ProcessingResult);
|
|
40
|
+
end;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Permission-Aware Temporary Processing
|
|
44
|
+
```al
|
|
45
|
+
procedure GenerateCustomerReport(CustomerNo: Code[20]): Text
|
|
46
|
+
var
|
|
47
|
+
Customer: Record Customer;
|
|
48
|
+
CustLedgerEntry: Record "Cust. Ledger Entry";
|
|
49
|
+
TempReportBuffer: Record "Name/Value Buffer" temporary;
|
|
50
|
+
ReportText: Text;
|
|
51
|
+
begin
|
|
52
|
+
// Early permission validation
|
|
53
|
+
if not Customer.ReadPermission then
|
|
54
|
+
exit('Access Denied');
|
|
55
|
+
|
|
56
|
+
if not Customer.Get(CustomerNo) then
|
|
57
|
+
exit('Customer Not Found');
|
|
58
|
+
|
|
59
|
+
// Verify specific customer access
|
|
60
|
+
if not UserPermissions.CanViewCustomer(CustomerNo) then
|
|
61
|
+
exit('Access Denied');
|
|
62
|
+
|
|
63
|
+
try
|
|
64
|
+
// Build temporary report data with permission checks
|
|
65
|
+
TempReportBuffer.Init();
|
|
66
|
+
TempReportBuffer.Name := 'Customer Name';
|
|
67
|
+
TempReportBuffer.Value := Customer.Name;
|
|
68
|
+
TempReportBuffer.Insert();
|
|
69
|
+
|
|
70
|
+
// Only include financial data if user has permission
|
|
71
|
+
if CustLedgerEntry.ReadPermission and UserPermissions.CanViewFinancialData() then begin
|
|
72
|
+
CustLedgerEntry.SetRange("Customer No.", CustomerNo);
|
|
73
|
+
CustLedgerEntry.CalcSums("Remaining Amt. (LCY)");
|
|
74
|
+
|
|
75
|
+
TempReportBuffer.Init();
|
|
76
|
+
TempReportBuffer.Name := 'Outstanding Amount';
|
|
77
|
+
TempReportBuffer.Value := Format(CustLedgerEntry."Remaining Amt. (LCY)");
|
|
78
|
+
TempReportBuffer.Insert();
|
|
79
|
+
end;
|
|
80
|
+
|
|
81
|
+
// Generate report from temporary data
|
|
82
|
+
ReportText := BuildReportFromBuffer(TempReportBuffer);
|
|
83
|
+
|
|
84
|
+
finally
|
|
85
|
+
// Always clear temporary data containing sensitive information
|
|
86
|
+
TempReportBuffer.DeleteAll();
|
|
87
|
+
end;
|
|
88
|
+
|
|
89
|
+
exit(ReportText);
|
|
90
|
+
end;
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Scoped Temporary Table Processing
|
|
94
|
+
```al
|
|
95
|
+
procedure CalculateItemProfitability(ItemFilter: Text): Decimal
|
|
96
|
+
var
|
|
97
|
+
Item: Record Item;
|
|
98
|
+
ItemLedgerEntry: Record "Item Ledger Entry";
|
|
99
|
+
TempProfitBuffer: Record "Integer" temporary;
|
|
100
|
+
TotalProfit: Decimal;
|
|
101
|
+
LineNo: Integer;
|
|
102
|
+
begin
|
|
103
|
+
// Validate permissions for cost data access
|
|
104
|
+
if not UserPermissions.CanViewCostInformation() then
|
|
105
|
+
exit(0);
|
|
106
|
+
|
|
107
|
+
Item.SetFilter("No.", ItemFilter);
|
|
108
|
+
if not Item.FindSet() then
|
|
109
|
+
exit(0);
|
|
110
|
+
|
|
111
|
+
try
|
|
112
|
+
LineNo := 0;
|
|
113
|
+
repeat
|
|
114
|
+
// Only process items user can view
|
|
115
|
+
if UserPermissions.CanViewItem(Item."No.") then begin
|
|
116
|
+
LineNo += 10000;
|
|
117
|
+
|
|
118
|
+
// Calculate profit for this item
|
|
119
|
+
ItemLedgerEntry.SetRange("Item No.", Item."No.");
|
|
120
|
+
ItemLedgerEntry.CalcSums("Sales Amount (Actual)", "Cost Amount (Actual)");
|
|
121
|
+
|
|
122
|
+
// Store in temporary buffer with limited scope
|
|
123
|
+
TempProfitBuffer.Init();
|
|
124
|
+
TempProfitBuffer.Number := LineNo;
|
|
125
|
+
TempProfitBuffer.Insert();
|
|
126
|
+
|
|
127
|
+
TotalProfit += (ItemLedgerEntry."Sales Amount (Actual)" - ItemLedgerEntry."Cost Amount (Actual)");
|
|
128
|
+
end;
|
|
129
|
+
until Item.Next() = 0;
|
|
130
|
+
|
|
131
|
+
finally
|
|
132
|
+
// Cleanup temporary data
|
|
133
|
+
TempProfitBuffer.DeleteAll();
|
|
134
|
+
end;
|
|
135
|
+
|
|
136
|
+
exit(TotalProfit);
|
|
137
|
+
end;
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Bad Examples
|
|
141
|
+
|
|
142
|
+
### Temporary Table Without Permission Validation
|
|
143
|
+
```al
|
|
144
|
+
procedure ProcessAllCustomerData(): Boolean
|
|
145
|
+
var
|
|
146
|
+
Customer: Record Customer;
|
|
147
|
+
TempCustomerBuffer: Record Customer temporary;
|
|
148
|
+
begin
|
|
149
|
+
// BAD: No permission validation before accessing sensitive data
|
|
150
|
+
Customer.FindSet();
|
|
151
|
+
repeat
|
|
152
|
+
TempCustomerBuffer := Customer;
|
|
153
|
+
TempCustomerBuffer.Insert();
|
|
154
|
+
until Customer.Next() = 0;
|
|
155
|
+
|
|
156
|
+
// BAD: Processing all customer data regardless of user permissions
|
|
157
|
+
ProcessCustomerBuffer(TempCustomerBuffer);
|
|
158
|
+
|
|
159
|
+
// BAD: No cleanup of sensitive temporary data
|
|
160
|
+
exit(true);
|
|
161
|
+
end;
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### No Cleanup in Error Scenarios
|
|
165
|
+
```al
|
|
166
|
+
procedure RiskyTemporaryProcessing(CustomerNo: Code[20]): Boolean
|
|
167
|
+
var
|
|
168
|
+
Customer: Record Customer;
|
|
169
|
+
TempSensitiveData: Record Customer temporary;
|
|
170
|
+
begin
|
|
171
|
+
if Customer.Get(CustomerNo) then begin
|
|
172
|
+
TempSensitiveData := Customer;
|
|
173
|
+
TempSensitiveData.Insert();
|
|
174
|
+
|
|
175
|
+
// BAD: If this processing fails, temporary data is not cleaned up
|
|
176
|
+
if ProcessSensitiveData(TempSensitiveData) then begin
|
|
177
|
+
TempSensitiveData.DeleteAll();
|
|
178
|
+
exit(true);
|
|
179
|
+
end;
|
|
180
|
+
|
|
181
|
+
// BAD: Error path doesn't clean up temporary data
|
|
182
|
+
exit(false);
|
|
183
|
+
end;
|
|
184
|
+
end;
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Cross-Session Data Leakage Risk
|
|
188
|
+
```al
|
|
189
|
+
codeunit 50100 "Unsafe Temporary Processing"
|
|
190
|
+
{
|
|
191
|
+
// BAD: Global temporary table could leak data between sessions
|
|
192
|
+
var
|
|
193
|
+
GlobalTempBuffer: Record Customer temporary;
|
|
194
|
+
|
|
195
|
+
procedure ProcessCustomer(CustomerNo: Code[20]): Boolean
|
|
196
|
+
begin
|
|
197
|
+
// BAD: Global temporary data persists across procedure calls
|
|
198
|
+
GlobalTempBuffer."No." := CustomerNo;
|
|
199
|
+
GlobalTempBuffer.Insert();
|
|
200
|
+
|
|
201
|
+
// BAD: No session isolation or cleanup
|
|
202
|
+
exit(ProcessGlobalBuffer());
|
|
203
|
+
end;
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Best Practices
|
|
208
|
+
|
|
209
|
+
### Comprehensive Error Handling
|
|
210
|
+
```al
|
|
211
|
+
procedure SecureTemporaryProcessing(RecordID: RecordID): Boolean
|
|
212
|
+
var
|
|
213
|
+
RecordRef: RecordRef;
|
|
214
|
+
TempProcessingBuffer: Record "Integer" temporary;
|
|
215
|
+
ProcessingSuccess: Boolean;
|
|
216
|
+
ErrorOccurred: Boolean;
|
|
217
|
+
begin
|
|
218
|
+
// Early permission validation
|
|
219
|
+
if not UserPermissions.CanAccessRecord(RecordID) then
|
|
220
|
+
exit(false);
|
|
221
|
+
|
|
222
|
+
if not RecordRef.Get(RecordID) then
|
|
223
|
+
exit(false);
|
|
224
|
+
|
|
225
|
+
try
|
|
226
|
+
// Initialize temporary processing with minimal data
|
|
227
|
+
TempProcessingBuffer.Init();
|
|
228
|
+
TempProcessingBuffer.Number := RecordID.RecordId;
|
|
229
|
+
TempProcessingBuffer.Insert();
|
|
230
|
+
|
|
231
|
+
// Secure processing with error handling
|
|
232
|
+
ProcessingSuccess := ProcessRecordSecurely(RecordRef, TempProcessingBuffer);
|
|
233
|
+
|
|
234
|
+
except
|
|
235
|
+
ErrorOccurred := true;
|
|
236
|
+
end;
|
|
237
|
+
|
|
238
|
+
// Always cleanup, even in error scenarios
|
|
239
|
+
TempProcessingBuffer.DeleteAll();
|
|
240
|
+
|
|
241
|
+
if ErrorOccurred then
|
|
242
|
+
exit(false);
|
|
243
|
+
|
|
244
|
+
exit(ProcessingSuccess);
|
|
245
|
+
end;
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Session-Isolated Temporary Processing
|
|
249
|
+
```al
|
|
250
|
+
procedure SessionSafeProcessing(UserID: Code[50]): Boolean
|
|
251
|
+
var
|
|
252
|
+
TempUserBuffer: Record User temporary;
|
|
253
|
+
SessionGuid: Guid;
|
|
254
|
+
begin
|
|
255
|
+
// Create session-specific identifier
|
|
256
|
+
SessionGuid := CreateGuid();
|
|
257
|
+
|
|
258
|
+
// Validate current user permissions
|
|
259
|
+
if (UserID <> UserId) and (not UserPermissions.CanViewOtherUsers()) then
|
|
260
|
+
exit(false);
|
|
261
|
+
|
|
262
|
+
try
|
|
263
|
+
// Session-isolated temporary data
|
|
264
|
+
TempUserBuffer.Init();
|
|
265
|
+
TempUserBuffer."User Security ID" := SessionGuid;
|
|
266
|
+
TempUserBuffer."User Name" := UserID;
|
|
267
|
+
TempUserBuffer.Insert();
|
|
268
|
+
|
|
269
|
+
// Process with session context
|
|
270
|
+
exit(ProcessUserInSession(TempUserBuffer, SessionGuid));
|
|
271
|
+
|
|
272
|
+
finally
|
|
273
|
+
// Session cleanup
|
|
274
|
+
TempUserBuffer.DeleteAll();
|
|
275
|
+
end;
|
|
276
|
+
end;
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Audit-Compliant Temporary Processing
|
|
280
|
+
```al
|
|
281
|
+
procedure AuditSafeProcessing(DocumentNo: Code[20]): Boolean
|
|
282
|
+
var
|
|
283
|
+
SalesHeader: Record "Sales Header";
|
|
284
|
+
TempAuditBuffer: Record "Change Log Entry" temporary;
|
|
285
|
+
AuditEntryNo: Integer;
|
|
286
|
+
begin
|
|
287
|
+
// Permission and audit validation
|
|
288
|
+
if not UserPermissions.CanViewDocument(DocumentNo) then begin
|
|
289
|
+
LogSecurityEvent('Unauthorized access attempt', DocumentNo);
|
|
290
|
+
exit(false);
|
|
291
|
+
end;
|
|
292
|
+
|
|
293
|
+
if not SalesHeader.Get(SalesHeader."Document Type"::Order, DocumentNo) then
|
|
294
|
+
exit(false);
|
|
295
|
+
|
|
296
|
+
try
|
|
297
|
+
// Create audit trail for temporary data access
|
|
298
|
+
AuditEntryNo := CreateAuditEntry('Temporary Processing', DocumentNo);
|
|
299
|
+
|
|
300
|
+
// Limited temporary data with audit context
|
|
301
|
+
TempAuditBuffer.Init();
|
|
302
|
+
TempAuditBuffer."Entry No." := AuditEntryNo;
|
|
303
|
+
TempAuditBuffer."Table No." := Database::"Sales Header";
|
|
304
|
+
TempAuditBuffer."Primary Key Field 1 Value" := DocumentNo;
|
|
305
|
+
TempAuditBuffer.Insert();
|
|
306
|
+
|
|
307
|
+
// Audited processing
|
|
308
|
+
exit(ProcessWithAuditTrail(SalesHeader, TempAuditBuffer));
|
|
309
|
+
|
|
310
|
+
finally
|
|
311
|
+
// Cleanup with audit completion
|
|
312
|
+
TempAuditBuffer.DeleteAll();
|
|
313
|
+
CompleteAuditEntry(AuditEntryNo);
|
|
314
|
+
end;
|
|
315
|
+
end;
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### Memory-Efficient Cleanup
|
|
319
|
+
```al
|
|
320
|
+
procedure LargeDatasetProcessing(FilterText: Text): Boolean
|
|
321
|
+
var
|
|
322
|
+
SourceRecord: Record "Item Ledger Entry";
|
|
323
|
+
TempProcessingBuffer: Record "Item Ledger Entry" temporary;
|
|
324
|
+
BatchSize: Integer;
|
|
325
|
+
ProcessedCount: Integer;
|
|
326
|
+
begin
|
|
327
|
+
BatchSize := 1000; // Process in batches to manage memory
|
|
328
|
+
|
|
329
|
+
SourceRecord.SetFilter("Item No.", FilterText);
|
|
330
|
+
if not SourceRecord.FindSet() then
|
|
331
|
+
exit(false);
|
|
332
|
+
|
|
333
|
+
repeat
|
|
334
|
+
try
|
|
335
|
+
// Process in batches with cleanup
|
|
336
|
+
ProcessedCount := 0;
|
|
337
|
+
repeat
|
|
338
|
+
TempProcessingBuffer := SourceRecord;
|
|
339
|
+
TempProcessingBuffer.Insert();
|
|
340
|
+
ProcessedCount += 1;
|
|
341
|
+
|
|
342
|
+
// Batch boundary cleanup
|
|
343
|
+
if ProcessedCount >= BatchSize then begin
|
|
344
|
+
ProcessBatch(TempProcessingBuffer);
|
|
345
|
+
TempProcessingBuffer.DeleteAll();
|
|
346
|
+
ProcessedCount := 0;
|
|
347
|
+
end;
|
|
348
|
+
|
|
349
|
+
until (SourceRecord.Next() = 0) or (ProcessedCount >= BatchSize);
|
|
350
|
+
|
|
351
|
+
// Process remaining records
|
|
352
|
+
if ProcessedCount > 0 then
|
|
353
|
+
ProcessBatch(TempProcessingBuffer);
|
|
354
|
+
|
|
355
|
+
finally
|
|
356
|
+
// Always cleanup batch data
|
|
357
|
+
TempProcessingBuffer.DeleteAll();
|
|
358
|
+
end;
|
|
359
|
+
|
|
360
|
+
until SourceRecord.Next() = 0;
|
|
361
|
+
|
|
362
|
+
exit(true);
|
|
363
|
+
end;
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
## Security Guidelines
|
|
367
|
+
|
|
368
|
+
1. **Validate permissions before populating temporary tables with sensitive data**
|
|
369
|
+
2. **Use try-finally blocks to ensure cleanup even in error scenarios**
|
|
370
|
+
3. **Apply session isolation to prevent cross-user data leakage**
|
|
371
|
+
4. **Implement audit trails for temporary access to sensitive information**
|
|
372
|
+
5. **Process large datasets in batches with regular cleanup**
|
|
373
|
+
6. **Document temporary table security requirements and cleanup procedures**
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
# API Page Permission Model - AL Code Sample
|
|
2
|
+
|
|
3
|
+
## Basic Permission Set for API Access
|
|
4
|
+
|
|
5
|
+
```al
|
|
6
|
+
permissionset 50100 "Customer API Access"
|
|
7
|
+
{
|
|
8
|
+
Caption = 'Customer API Access';
|
|
9
|
+
Access = Public;
|
|
10
|
+
Assignable = true;
|
|
11
|
+
|
|
12
|
+
Permissions =
|
|
13
|
+
tabledata Customer = RI, // Read and Insert permissions
|
|
14
|
+
tabledata "Customer Bank Account" = R, // Read-only access to related data
|
|
15
|
+
page "Customer API" = X, // Execute permission for API page
|
|
16
|
+
codeunit "Customer Management" = X; // Execute related business logic
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Example API page with permission requirements
|
|
20
|
+
page 50100 "Customer API"
|
|
21
|
+
{
|
|
22
|
+
PageType = API;
|
|
23
|
+
APIPublisher = 'contoso';
|
|
24
|
+
APIGroup = 'customers';
|
|
25
|
+
APIVersion = 'v1.0';
|
|
26
|
+
EntityName = 'customer';
|
|
27
|
+
EntitySetName = 'customers';
|
|
28
|
+
SourceTable = Customer;
|
|
29
|
+
DelayedInsert = true;
|
|
30
|
+
ODataKeyFields = SystemId;
|
|
31
|
+
|
|
32
|
+
layout
|
|
33
|
+
{
|
|
34
|
+
area(Content)
|
|
35
|
+
{
|
|
36
|
+
repeater(GroupName)
|
|
37
|
+
{
|
|
38
|
+
field(id; Rec.SystemId)
|
|
39
|
+
{
|
|
40
|
+
Caption = 'Id';
|
|
41
|
+
Editable = false;
|
|
42
|
+
}
|
|
43
|
+
field(number; Rec."No.")
|
|
44
|
+
{
|
|
45
|
+
Caption = 'Number';
|
|
46
|
+
}
|
|
47
|
+
field(displayName; Rec.Name)
|
|
48
|
+
{
|
|
49
|
+
Caption = 'Display Name';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Advanced Permission Model with Role-Based Access
|
|
58
|
+
|
|
59
|
+
```al
|
|
60
|
+
// Base API permission set - minimal access
|
|
61
|
+
permissionset 50101 "Base API Reader"
|
|
62
|
+
{
|
|
63
|
+
Caption = 'Base API Reader';
|
|
64
|
+
Access = Public;
|
|
65
|
+
Assignable = false; // Only used as building block
|
|
66
|
+
|
|
67
|
+
Permissions =
|
|
68
|
+
tabledata Customer = R,
|
|
69
|
+
tabledata Item = R,
|
|
70
|
+
tabledata Vendor = R;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Extended permission set for API writers
|
|
74
|
+
permissionset 50102 "API Data Writer"
|
|
75
|
+
{
|
|
76
|
+
Caption = 'API Data Writer';
|
|
77
|
+
Access = Public;
|
|
78
|
+
Assignable = true;
|
|
79
|
+
|
|
80
|
+
IncludedPermissionSets = "Base API Reader"; // Inherit read permissions
|
|
81
|
+
|
|
82
|
+
Permissions =
|
|
83
|
+
tabledata Customer = RIM, // Read, Insert, Modify
|
|
84
|
+
tabledata Item = RIM,
|
|
85
|
+
tabledata Vendor = RIM,
|
|
86
|
+
tabledata "Gen. Journal Line" = RIMD, // Full access for transaction APIs
|
|
87
|
+
page "Customer API" = X,
|
|
88
|
+
page "Item API" = X,
|
|
89
|
+
page "Vendor API" = X,
|
|
90
|
+
codeunit "API Helper Functions" = X;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Administrative permission set with full API control
|
|
94
|
+
permissionset 50103 "API Administrator"
|
|
95
|
+
{
|
|
96
|
+
Caption = 'API Administrator';
|
|
97
|
+
Access = Public;
|
|
98
|
+
Assignable = true;
|
|
99
|
+
|
|
100
|
+
IncludedPermissionSets = "API Data Writer";
|
|
101
|
+
|
|
102
|
+
Permissions =
|
|
103
|
+
tabledata "Web Service" = RIMD, // Manage web service registrations
|
|
104
|
+
tabledata "OAuth 2.0 Setup" = RIMD, // Manage API authentication
|
|
105
|
+
tabledata "User Setup" = RM, // Modify user API permissions
|
|
106
|
+
page "Web Services" = X,
|
|
107
|
+
codeunit "Web Service Management" = X;
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Permission Validation in API Implementation
|
|
112
|
+
|
|
113
|
+
```al
|
|
114
|
+
codeunit 50100 "API Security Helper"
|
|
115
|
+
{
|
|
116
|
+
// Validate user has required permissions for API operation
|
|
117
|
+
procedure ValidateAPIPermissions(TableID: Integer; Operation: Text): Boolean
|
|
118
|
+
var
|
|
119
|
+
Permission: Record Permission;
|
|
120
|
+
UserPermissions: Record "Access Control";
|
|
121
|
+
begin
|
|
122
|
+
// Check if user has appropriate table permissions
|
|
123
|
+
case Operation of
|
|
124
|
+
'READ':
|
|
125
|
+
exit(HasTablePermission(TableID, 'R'));
|
|
126
|
+
'CREATE':
|
|
127
|
+
exit(HasTablePermission(TableID, 'I'));
|
|
128
|
+
'UPDATE':
|
|
129
|
+
exit(HasTablePermission(TableID, 'M'));
|
|
130
|
+
'DELETE':
|
|
131
|
+
exit(HasTablePermission(TableID, 'D'));
|
|
132
|
+
else
|
|
133
|
+
exit(false);
|
|
134
|
+
end;
|
|
135
|
+
end;
|
|
136
|
+
|
|
137
|
+
local procedure HasTablePermission(TableID: Integer; PermissionType: Text): Boolean
|
|
138
|
+
var
|
|
139
|
+
Permission: Record Permission;
|
|
140
|
+
AccessControl: Record "Access Control";
|
|
141
|
+
begin
|
|
142
|
+
AccessControl.SetRange("User Security ID", UserSecurityId());
|
|
143
|
+
if AccessControl.FindSet() then
|
|
144
|
+
repeat
|
|
145
|
+
Permission.SetRange("Role ID", AccessControl."Role ID");
|
|
146
|
+
Permission.SetRange("Object Type", Permission."Object Type"::"Table Data");
|
|
147
|
+
Permission.SetRange("Object ID", TableID);
|
|
148
|
+
if Permission.FindFirst() then
|
|
149
|
+
if StrPos(Permission."Read Permission", PermissionType) > 0 then
|
|
150
|
+
exit(true);
|
|
151
|
+
until AccessControl.Next() = 0;
|
|
152
|
+
exit(false);
|
|
153
|
+
end;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// API page with permission enforcement
|
|
157
|
+
page 50101 "Secure Customer API"
|
|
158
|
+
{
|
|
159
|
+
PageType = API;
|
|
160
|
+
APIPublisher = 'contoso';
|
|
161
|
+
APIGroup = 'customers';
|
|
162
|
+
APIVersion = 'v1.0';
|
|
163
|
+
EntityName = 'secureCustomer';
|
|
164
|
+
EntitySetName = 'secureCustomers';
|
|
165
|
+
SourceTable = Customer;
|
|
166
|
+
DelayedInsert = true;
|
|
167
|
+
ODataKeyFields = SystemId;
|
|
168
|
+
|
|
169
|
+
trigger OnOpenPage()
|
|
170
|
+
var
|
|
171
|
+
APISecurityHelper: Codeunit "API Security Helper";
|
|
172
|
+
begin
|
|
173
|
+
// Validate user has read permissions
|
|
174
|
+
if not APISecurityHelper.ValidateAPIPermissions(Database::Customer, 'READ') then
|
|
175
|
+
Error('Insufficient permissions to access Customer API');
|
|
176
|
+
end;
|
|
177
|
+
|
|
178
|
+
trigger OnInsertRecord(BelowxRec: Boolean): Boolean
|
|
179
|
+
var
|
|
180
|
+
APISecurityHelper: Codeunit "API Security Helper";
|
|
181
|
+
begin
|
|
182
|
+
// Validate user has insert permissions
|
|
183
|
+
if not APISecurityHelper.ValidateAPIPermissions(Database::Customer, 'CREATE') then
|
|
184
|
+
Error('Insufficient permissions to create customers via API');
|
|
185
|
+
exit(true);
|
|
186
|
+
end;
|
|
187
|
+
|
|
188
|
+
trigger OnModifyRecord(): Boolean
|
|
189
|
+
var
|
|
190
|
+
APISecurityHelper: Codeunit "API Security Helper";
|
|
191
|
+
begin
|
|
192
|
+
// Validate user has modify permissions
|
|
193
|
+
if not APISecurityHelper.ValidateAPIPermissions(Database::Customer, 'UPDATE') then
|
|
194
|
+
Error('Insufficient permissions to modify customers via API');
|
|
195
|
+
exit(true);
|
|
196
|
+
end;
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## OAuth 2.0 Integration with Permissions
|
|
201
|
+
|
|
202
|
+
```al
|
|
203
|
+
// OAuth setup with permission scope mapping
|
|
204
|
+
table 50100 "API OAuth Configuration"
|
|
205
|
+
{
|
|
206
|
+
Caption = 'API OAuth Configuration';
|
|
207
|
+
DataClassification = SystemMetadata;
|
|
208
|
+
|
|
209
|
+
fields
|
|
210
|
+
{
|
|
211
|
+
field(1; "Scope Name"; Text[100])
|
|
212
|
+
{
|
|
213
|
+
Caption = 'Scope Name';
|
|
214
|
+
}
|
|
215
|
+
field(2; "Permission Set Code"; Code[20])
|
|
216
|
+
{
|
|
217
|
+
Caption = 'Permission Set Code';
|
|
218
|
+
TableRelation = "Permission Set"."Role ID";
|
|
219
|
+
}
|
|
220
|
+
field(3; "Description"; Text[250])
|
|
221
|
+
{
|
|
222
|
+
Caption = 'Description';
|
|
223
|
+
}
|
|
224
|
+
field(4; "Active"; Boolean)
|
|
225
|
+
{
|
|
226
|
+
Caption = 'Active';
|
|
227
|
+
InitValue = true;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
keys
|
|
232
|
+
{
|
|
233
|
+
key(PK; "Scope Name")
|
|
234
|
+
{
|
|
235
|
+
Clustered = true;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Codeunit for OAuth scope to permission mapping
|
|
241
|
+
codeunit 50101 "OAuth Permission Manager"
|
|
242
|
+
{
|
|
243
|
+
// Map OAuth scopes to BC permission sets
|
|
244
|
+
procedure AssignPermissionsFromOAuthScope(UserID: Guid; OAuthScope: Text)
|
|
245
|
+
var
|
|
246
|
+
OAuthConfig: Record "API OAuth Configuration";
|
|
247
|
+
AccessControl: Record "Access Control";
|
|
248
|
+
Scopes: List of [Text];
|
|
249
|
+
Scope: Text;
|
|
250
|
+
begin
|
|
251
|
+
// Parse OAuth scopes (space-separated)
|
|
252
|
+
Scopes := OAuthScope.Split(' ');
|
|
253
|
+
|
|
254
|
+
foreach Scope in Scopes do begin
|
|
255
|
+
OAuthConfig.Reset();
|
|
256
|
+
OAuthConfig.SetRange("Scope Name", Scope);
|
|
257
|
+
OAuthConfig.SetRange(Active, true);
|
|
258
|
+
if OAuthConfig.FindSet() then
|
|
259
|
+
repeat
|
|
260
|
+
// Assign corresponding permission set
|
|
261
|
+
if not AccessControl.Get(UserID, OAuthConfig."Permission Set Code", '', '') then begin
|
|
262
|
+
AccessControl.Init();
|
|
263
|
+
AccessControl."User Security ID" := UserID;
|
|
264
|
+
AccessControl."Role ID" := OAuthConfig."Permission Set Code";
|
|
265
|
+
AccessControl.Insert();
|
|
266
|
+
end;
|
|
267
|
+
until OAuthConfig.Next() = 0;
|
|
268
|
+
end;
|
|
269
|
+
end;
|
|
270
|
+
|
|
271
|
+
// Validate OAuth token has required scope for operation
|
|
272
|
+
procedure ValidateOAuthScope(RequiredScope: Text; ProvidedScopes: Text): Boolean
|
|
273
|
+
var
|
|
274
|
+
Scopes: List of [Text];
|
|
275
|
+
Scope: Text;
|
|
276
|
+
begin
|
|
277
|
+
Scopes := ProvidedScopes.Split(' ');
|
|
278
|
+
foreach Scope in Scopes do
|
|
279
|
+
if Scope = RequiredScope then
|
|
280
|
+
exit(true);
|
|
281
|
+
exit(false);
|
|
282
|
+
end;
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Implementation Notes
|
|
287
|
+
|
|
288
|
+
**Permission Model Best Practices:**
|
|
289
|
+
|
|
290
|
+
1. **Principle of Least Privilege:**
|
|
291
|
+
- Grant minimum permissions required for API functionality
|
|
292
|
+
- Use specific table permissions rather than blanket access
|
|
293
|
+
- Separate read and write permissions into different sets
|
|
294
|
+
|
|
295
|
+
2. **Role-Based Access Control:**
|
|
296
|
+
- Create permission sets that align with business roles
|
|
297
|
+
- Use inheritance to build complex permission structures
|
|
298
|
+
- Implement permission validation at API endpoints
|
|
299
|
+
|
|
300
|
+
3. **OAuth Integration:**
|
|
301
|
+
- Map OAuth scopes to specific BC permission sets
|
|
302
|
+
- Validate scopes before processing API requests
|
|
303
|
+
- Implement dynamic permission assignment based on token scopes
|
|
304
|
+
|
|
305
|
+
4. **Security Monitoring:**
|
|
306
|
+
- Log permission failures for security auditing
|
|
307
|
+
- Monitor API access patterns for unusual behavior
|
|
308
|
+
- Implement rate limiting based on permission levels
|