@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,716 @@
|
|
|
1
|
+
# API Page Validation Rule Execution - AL Code Sample
|
|
2
|
+
|
|
3
|
+
## Basic Validation Rule Implementation
|
|
4
|
+
|
|
5
|
+
```al
|
|
6
|
+
page 50500 "Validated Customer API"
|
|
7
|
+
{
|
|
8
|
+
PageType = API;
|
|
9
|
+
APIPublisher = 'contoso';
|
|
10
|
+
APIGroup = 'customers';
|
|
11
|
+
APIVersion = 'v1.0';
|
|
12
|
+
EntityName = 'customer';
|
|
13
|
+
EntitySetName = 'customers';
|
|
14
|
+
SourceTable = Customer;
|
|
15
|
+
DelayedInsert = true;
|
|
16
|
+
ODataKeyFields = SystemId;
|
|
17
|
+
|
|
18
|
+
layout
|
|
19
|
+
{
|
|
20
|
+
area(Content)
|
|
21
|
+
{
|
|
22
|
+
repeater(GroupName)
|
|
23
|
+
{
|
|
24
|
+
field(id; Rec.SystemId)
|
|
25
|
+
{
|
|
26
|
+
Caption = 'Id';
|
|
27
|
+
Editable = false;
|
|
28
|
+
}
|
|
29
|
+
field(number; Rec."No.")
|
|
30
|
+
{
|
|
31
|
+
Caption = 'Number';
|
|
32
|
+
// Field validation automatically triggered by BC
|
|
33
|
+
}
|
|
34
|
+
field(displayName; Rec.Name)
|
|
35
|
+
{
|
|
36
|
+
Caption = 'Display Name';
|
|
37
|
+
// Required field validation
|
|
38
|
+
}
|
|
39
|
+
field(email; Rec."E-Mail")
|
|
40
|
+
{
|
|
41
|
+
Caption = 'Email';
|
|
42
|
+
// Email format validation through table field definition
|
|
43
|
+
}
|
|
44
|
+
field(creditLimit; Rec."Credit Limit (LCY)")
|
|
45
|
+
{
|
|
46
|
+
Caption = 'Credit Limit';
|
|
47
|
+
// Numeric validation and business rules
|
|
48
|
+
}
|
|
49
|
+
field(customerPostingGroup; Rec."Customer Posting Group")
|
|
50
|
+
{
|
|
51
|
+
Caption = 'Customer Posting Group';
|
|
52
|
+
// TableRelation validation
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Business validation rules executed during API operations
|
|
59
|
+
trigger OnInsertRecord(BelowxRec: Boolean): Boolean
|
|
60
|
+
var
|
|
61
|
+
CustomerValidation: Codeunit "Customer Validation Rules";
|
|
62
|
+
begin
|
|
63
|
+
// Execute comprehensive business validation
|
|
64
|
+
if not CustomerValidation.ValidateNewCustomer(Rec) then
|
|
65
|
+
exit(false);
|
|
66
|
+
|
|
67
|
+
// Additional API-specific validations
|
|
68
|
+
ValidateAPISpecificRules();
|
|
69
|
+
|
|
70
|
+
exit(true);
|
|
71
|
+
end;
|
|
72
|
+
|
|
73
|
+
trigger OnModifyRecord(): Boolean
|
|
74
|
+
var
|
|
75
|
+
CustomerValidation: Codeunit "Customer Validation Rules";
|
|
76
|
+
begin
|
|
77
|
+
// Execute modification validation rules
|
|
78
|
+
if not CustomerValidation.ValidateCustomerModification(Rec, xRec) then
|
|
79
|
+
exit(false);
|
|
80
|
+
|
|
81
|
+
ValidateAPISpecificRules();
|
|
82
|
+
|
|
83
|
+
exit(true);
|
|
84
|
+
end;
|
|
85
|
+
|
|
86
|
+
trigger OnDeleteRecord(): Boolean
|
|
87
|
+
var
|
|
88
|
+
CustomerValidation: Codeunit "Customer Validation Rules";
|
|
89
|
+
begin
|
|
90
|
+
// Validate deletion is allowed
|
|
91
|
+
if not CustomerValidation.ValidateCustomerDeletion(Rec) then
|
|
92
|
+
exit(false);
|
|
93
|
+
|
|
94
|
+
exit(true);
|
|
95
|
+
end;
|
|
96
|
+
|
|
97
|
+
local procedure ValidateAPISpecificRules()
|
|
98
|
+
begin
|
|
99
|
+
// API-specific validation rules
|
|
100
|
+
if Rec.Name = '' then
|
|
101
|
+
Error('Display name is required for API operations');
|
|
102
|
+
|
|
103
|
+
if Rec."E-Mail" <> '' then
|
|
104
|
+
if not IsValidEmail(Rec."E-Mail") then
|
|
105
|
+
Error('Invalid email format: %1', Rec."E-Mail");
|
|
106
|
+
|
|
107
|
+
// Credit limit validation
|
|
108
|
+
if Rec."Credit Limit (LCY)" < 0 then
|
|
109
|
+
Error('Credit limit cannot be negative');
|
|
110
|
+
end;
|
|
111
|
+
|
|
112
|
+
local procedure IsValidEmail(Email: Text): Boolean
|
|
113
|
+
var
|
|
114
|
+
EmailPattern: Text;
|
|
115
|
+
begin
|
|
116
|
+
EmailPattern := '*@*.*';
|
|
117
|
+
exit(Email.Contains('@') and (StrLen(Email) > 5));
|
|
118
|
+
end;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Comprehensive validation rules codeunit
|
|
122
|
+
codeunit 50500 "Customer Validation Rules"
|
|
123
|
+
{
|
|
124
|
+
// Validate new customer creation
|
|
125
|
+
procedure ValidateNewCustomer(var Customer: Record Customer): Boolean
|
|
126
|
+
begin
|
|
127
|
+
// Required field validations
|
|
128
|
+
if not ValidateRequiredFields(Customer) then
|
|
129
|
+
exit(false);
|
|
130
|
+
|
|
131
|
+
// Business rule validations
|
|
132
|
+
if not ValidateBusinessRules(Customer) then
|
|
133
|
+
exit(false);
|
|
134
|
+
|
|
135
|
+
// Data integrity validations
|
|
136
|
+
if not ValidateDataIntegrity(Customer) then
|
|
137
|
+
exit(false);
|
|
138
|
+
|
|
139
|
+
exit(true);
|
|
140
|
+
end;
|
|
141
|
+
|
|
142
|
+
// Validate customer modifications
|
|
143
|
+
procedure ValidateCustomerModification(var Customer: Record Customer; OldCustomer: Record Customer): Boolean
|
|
144
|
+
begin
|
|
145
|
+
// Check if critical fields are being modified
|
|
146
|
+
if Customer."No." <> OldCustomer."No." then
|
|
147
|
+
Error('Customer number cannot be modified');
|
|
148
|
+
|
|
149
|
+
// Validate changes don't violate business rules
|
|
150
|
+
if Customer."Customer Posting Group" <> OldCustomer."Customer Posting Group" then
|
|
151
|
+
if not ValidatePostingGroupChange(Customer, OldCustomer) then
|
|
152
|
+
exit(false);
|
|
153
|
+
|
|
154
|
+
// Validate credit limit changes
|
|
155
|
+
if Customer."Credit Limit (LCY)" <> OldCustomer."Credit Limit (LCY)" then
|
|
156
|
+
if not ValidateCreditLimitChange(Customer, OldCustomer) then
|
|
157
|
+
exit(false);
|
|
158
|
+
|
|
159
|
+
exit(ValidateNewCustomer(Customer));
|
|
160
|
+
end;
|
|
161
|
+
|
|
162
|
+
// Validate customer deletion
|
|
163
|
+
procedure ValidateCustomerDeletion(var Customer: Record Customer): Boolean
|
|
164
|
+
var
|
|
165
|
+
SalesLine: Record "Sales Line";
|
|
166
|
+
CustLedgerEntry: Record "Cust. Ledger Entry";
|
|
167
|
+
begin
|
|
168
|
+
// Check for existing transactions
|
|
169
|
+
CustLedgerEntry.SetRange("Customer No.", Customer."No.");
|
|
170
|
+
if not CustLedgerEntry.IsEmpty() then
|
|
171
|
+
Error('Cannot delete customer %1. Customer has ledger entries.', Customer."No.");
|
|
172
|
+
|
|
173
|
+
// Check for open sales documents
|
|
174
|
+
SalesLine.SetRange("Sell-to Customer No.", Customer."No.");
|
|
175
|
+
if not SalesLine.IsEmpty() then
|
|
176
|
+
Error('Cannot delete customer %1. Customer has open sales documents.', Customer."No.");
|
|
177
|
+
|
|
178
|
+
exit(true);
|
|
179
|
+
end;
|
|
180
|
+
|
|
181
|
+
local procedure ValidateRequiredFields(var Customer: Record Customer): Boolean
|
|
182
|
+
begin
|
|
183
|
+
if Customer."No." = '' then
|
|
184
|
+
Error('Customer number is required');
|
|
185
|
+
|
|
186
|
+
if Customer.Name = '' then
|
|
187
|
+
Error('Customer name is required');
|
|
188
|
+
|
|
189
|
+
if Customer."Customer Posting Group" = '' then
|
|
190
|
+
Error('Customer posting group is required');
|
|
191
|
+
|
|
192
|
+
exit(true);
|
|
193
|
+
end;
|
|
194
|
+
|
|
195
|
+
local procedure ValidateBusinessRules(var Customer: Record Customer): Boolean
|
|
196
|
+
var
|
|
197
|
+
CustomerPostingGroup: Record "Customer Posting Group";
|
|
198
|
+
PaymentTerms: Record "Payment Terms";
|
|
199
|
+
begin
|
|
200
|
+
// Validate posting group exists
|
|
201
|
+
if not CustomerPostingGroup.Get(Customer."Customer Posting Group") then
|
|
202
|
+
Error('Customer posting group %1 does not exist', Customer."Customer Posting Group");
|
|
203
|
+
|
|
204
|
+
// Validate payment terms if specified
|
|
205
|
+
if Customer."Payment Terms Code" <> '' then
|
|
206
|
+
if not PaymentTerms.Get(Customer."Payment Terms Code") then
|
|
207
|
+
Error('Payment terms %1 do not exist', Customer."Payment Terms Code");
|
|
208
|
+
|
|
209
|
+
// Validate credit limit is reasonable
|
|
210
|
+
if Customer."Credit Limit (LCY)" > 1000000 then
|
|
211
|
+
Error('Credit limit exceeds maximum allowed amount of 1,000,000');
|
|
212
|
+
|
|
213
|
+
exit(true);
|
|
214
|
+
end;
|
|
215
|
+
|
|
216
|
+
local procedure ValidateDataIntegrity(var Customer: Record Customer): Boolean
|
|
217
|
+
var
|
|
218
|
+
ExistingCustomer: Record Customer;
|
|
219
|
+
begin
|
|
220
|
+
// Check for duplicate customer numbers
|
|
221
|
+
ExistingCustomer.SetRange("No.", Customer."No.");
|
|
222
|
+
ExistingCustomer.SetFilter(SystemId, '<>%1', Customer.SystemId);
|
|
223
|
+
if not ExistingCustomer.IsEmpty() then
|
|
224
|
+
Error('Customer number %1 already exists', Customer."No.");
|
|
225
|
+
|
|
226
|
+
// Validate email uniqueness if configured
|
|
227
|
+
if Customer."E-Mail" <> '' then
|
|
228
|
+
if not ValidateEmailUniqueness(Customer) then
|
|
229
|
+
exit(false);
|
|
230
|
+
|
|
231
|
+
exit(true);
|
|
232
|
+
end;
|
|
233
|
+
|
|
234
|
+
local procedure ValidatePostingGroupChange(var Customer: Record Customer; OldCustomer: Record Customer): Boolean
|
|
235
|
+
var
|
|
236
|
+
CustLedgerEntry: Record "Cust. Ledger Entry";
|
|
237
|
+
begin
|
|
238
|
+
// Prevent posting group change if customer has open entries
|
|
239
|
+
CustLedgerEntry.SetRange("Customer No.", Customer."No.");
|
|
240
|
+
CustLedgerEntry.SetRange(Open, true);
|
|
241
|
+
if not CustLedgerEntry.IsEmpty() then
|
|
242
|
+
Error('Cannot change posting group for customer %1. Customer has open ledger entries.', Customer."No.");
|
|
243
|
+
|
|
244
|
+
exit(true);
|
|
245
|
+
end;
|
|
246
|
+
|
|
247
|
+
local procedure ValidateCreditLimitChange(var Customer: Record Customer; OldCustomer: Record Customer): Boolean
|
|
248
|
+
var
|
|
249
|
+
SalesHeader: Record "Sales Header";
|
|
250
|
+
OutstandingAmount: Decimal;
|
|
251
|
+
begin
|
|
252
|
+
// If credit limit is being reduced, check outstanding orders
|
|
253
|
+
if Customer."Credit Limit (LCY)" < OldCustomer."Credit Limit (LCY)" then begin
|
|
254
|
+
SalesHeader.SetRange("Sell-to Customer No.", Customer."No.");
|
|
255
|
+
SalesHeader.SetRange("Document Type", SalesHeader."Document Type"::Order);
|
|
256
|
+
if SalesHeader.FindSet() then
|
|
257
|
+
repeat
|
|
258
|
+
SalesHeader.CalcFields("Amount Including VAT");
|
|
259
|
+
OutstandingAmount += SalesHeader."Amount Including VAT";
|
|
260
|
+
until SalesHeader.Next() = 0;
|
|
261
|
+
|
|
262
|
+
if OutstandingAmount > Customer."Credit Limit (LCY)" then
|
|
263
|
+
Error('Cannot reduce credit limit below outstanding order amount of %1', OutstandingAmount);
|
|
264
|
+
end;
|
|
265
|
+
|
|
266
|
+
exit(true);
|
|
267
|
+
end;
|
|
268
|
+
|
|
269
|
+
local procedure ValidateEmailUniqueness(var Customer: Record Customer): Boolean
|
|
270
|
+
var
|
|
271
|
+
ExistingCustomer: Record Customer;
|
|
272
|
+
begin
|
|
273
|
+
ExistingCustomer.SetRange("E-Mail", Customer."E-Mail");
|
|
274
|
+
ExistingCustomer.SetFilter(SystemId, '<>%1', Customer.SystemId);
|
|
275
|
+
if not ExistingCustomer.IsEmpty() then
|
|
276
|
+
Error('Email address %1 is already assigned to another customer', Customer."E-Mail");
|
|
277
|
+
|
|
278
|
+
exit(true);
|
|
279
|
+
end;
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Advanced Field-Level Validation
|
|
284
|
+
|
|
285
|
+
```al
|
|
286
|
+
page 50501 "Item Advanced Validation API"
|
|
287
|
+
{
|
|
288
|
+
PageType = API;
|
|
289
|
+
APIPublisher = 'contoso';
|
|
290
|
+
APIGroup = 'inventory';
|
|
291
|
+
APIVersion = 'v1.0';
|
|
292
|
+
EntityName = 'item';
|
|
293
|
+
EntitySetName = 'items';
|
|
294
|
+
SourceTable = Item;
|
|
295
|
+
DelayedInsert = true;
|
|
296
|
+
ODataKeyFields = SystemId;
|
|
297
|
+
|
|
298
|
+
layout
|
|
299
|
+
{
|
|
300
|
+
area(Content)
|
|
301
|
+
{
|
|
302
|
+
repeater(GroupName)
|
|
303
|
+
{
|
|
304
|
+
field(id; Rec.SystemId)
|
|
305
|
+
{
|
|
306
|
+
Caption = 'Id';
|
|
307
|
+
Editable = false;
|
|
308
|
+
}
|
|
309
|
+
field(number; Rec."No.")
|
|
310
|
+
{
|
|
311
|
+
Caption = 'Number';
|
|
312
|
+
|
|
313
|
+
trigger OnValidate()
|
|
314
|
+
begin
|
|
315
|
+
ValidateItemNumber();
|
|
316
|
+
end;
|
|
317
|
+
}
|
|
318
|
+
field(description; Rec.Description)
|
|
319
|
+
{
|
|
320
|
+
Caption = 'Description';
|
|
321
|
+
|
|
322
|
+
trigger OnValidate()
|
|
323
|
+
begin
|
|
324
|
+
ValidateDescription();
|
|
325
|
+
end;
|
|
326
|
+
}
|
|
327
|
+
field(unitPrice; Rec."Unit Price")
|
|
328
|
+
{
|
|
329
|
+
Caption = 'Unit Price';
|
|
330
|
+
|
|
331
|
+
trigger OnValidate()
|
|
332
|
+
begin
|
|
333
|
+
ValidateUnitPrice();
|
|
334
|
+
end;
|
|
335
|
+
}
|
|
336
|
+
field(unitCost; Rec."Unit Cost")
|
|
337
|
+
{
|
|
338
|
+
Caption = 'Unit Cost';
|
|
339
|
+
|
|
340
|
+
trigger OnValidate()
|
|
341
|
+
begin
|
|
342
|
+
ValidateUnitCost();
|
|
343
|
+
end;
|
|
344
|
+
}
|
|
345
|
+
field(inventoryPostingGroup; Rec."Inventory Posting Group")
|
|
346
|
+
{
|
|
347
|
+
Caption = 'Inventory Posting Group';
|
|
348
|
+
|
|
349
|
+
trigger OnValidate()
|
|
350
|
+
begin
|
|
351
|
+
ValidateInventoryPostingGroup();
|
|
352
|
+
end;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
local procedure ValidateItemNumber()
|
|
359
|
+
var
|
|
360
|
+
ItemNumberPattern: Text;
|
|
361
|
+
NoSeriesManagement: Codeunit NoSeriesManagement;
|
|
362
|
+
begin
|
|
363
|
+
if Rec."No." = '' then
|
|
364
|
+
Error('Item number cannot be empty');
|
|
365
|
+
|
|
366
|
+
// Validate item number format
|
|
367
|
+
ItemNumberPattern := GetItemNumberPattern();
|
|
368
|
+
if ItemNumberPattern <> '' then
|
|
369
|
+
if not MatchesPattern(Rec."No.", ItemNumberPattern) then
|
|
370
|
+
Error('Item number %1 does not match required pattern %2', Rec."No.", ItemNumberPattern);
|
|
371
|
+
|
|
372
|
+
// Check for duplicate item numbers
|
|
373
|
+
if ItemNumberExists(Rec."No.", Rec.SystemId) then
|
|
374
|
+
Error('Item number %1 already exists', Rec."No.");
|
|
375
|
+
end;
|
|
376
|
+
|
|
377
|
+
local procedure ValidateDescription()
|
|
378
|
+
begin
|
|
379
|
+
if Rec.Description = '' then
|
|
380
|
+
Error('Item description is required');
|
|
381
|
+
|
|
382
|
+
if StrLen(Rec.Description) < 3 then
|
|
383
|
+
Error('Item description must be at least 3 characters long');
|
|
384
|
+
|
|
385
|
+
// Check for prohibited words
|
|
386
|
+
if ContainsProhibitedWords(Rec.Description) then
|
|
387
|
+
Error('Item description contains prohibited content');
|
|
388
|
+
end;
|
|
389
|
+
|
|
390
|
+
local procedure ValidateUnitPrice()
|
|
391
|
+
begin
|
|
392
|
+
if Rec."Unit Price" < 0 then
|
|
393
|
+
Error('Unit price cannot be negative');
|
|
394
|
+
|
|
395
|
+
// Validate against unit cost for margin checking
|
|
396
|
+
if (Rec."Unit Cost" > 0) and (Rec."Unit Price" < Rec."Unit Cost") then
|
|
397
|
+
if not Confirm('Unit price is below unit cost. Continue?') then
|
|
398
|
+
Error('Unit price validation failed');
|
|
399
|
+
|
|
400
|
+
// Check for unrealistic pricing
|
|
401
|
+
if Rec."Unit Price" > 1000000 then
|
|
402
|
+
Error('Unit price exceeds maximum allowed amount');
|
|
403
|
+
end;
|
|
404
|
+
|
|
405
|
+
local procedure ValidateUnitCost()
|
|
406
|
+
begin
|
|
407
|
+
if Rec."Unit Cost" < 0 then
|
|
408
|
+
Error('Unit cost cannot be negative');
|
|
409
|
+
|
|
410
|
+
// Validate cost against existing inventory value
|
|
411
|
+
ValidateCostAgainstInventory();
|
|
412
|
+
end;
|
|
413
|
+
|
|
414
|
+
local procedure ValidateInventoryPostingGroup()
|
|
415
|
+
var
|
|
416
|
+
InventoryPostingGroup: Record "Inventory Posting Group";
|
|
417
|
+
begin
|
|
418
|
+
if Rec."Inventory Posting Group" = '' then
|
|
419
|
+
Error('Inventory posting group is required');
|
|
420
|
+
|
|
421
|
+
if not InventoryPostingGroup.Get(Rec."Inventory Posting Group") then
|
|
422
|
+
Error('Inventory posting group %1 does not exist', Rec."Inventory Posting Group");
|
|
423
|
+
end;
|
|
424
|
+
|
|
425
|
+
local procedure GetItemNumberPattern(): Text
|
|
426
|
+
var
|
|
427
|
+
InventorySetup: Record "Inventory Setup";
|
|
428
|
+
begin
|
|
429
|
+
if InventorySetup.Get() then
|
|
430
|
+
exit(InventorySetup."Item Nos."); // Use number series as pattern
|
|
431
|
+
exit('');
|
|
432
|
+
end;
|
|
433
|
+
|
|
434
|
+
local procedure MatchesPattern(Value: Text; Pattern: Text): Boolean
|
|
435
|
+
var
|
|
436
|
+
NoSeriesLine: Record "No. Series Line";
|
|
437
|
+
begin
|
|
438
|
+
// Simplified pattern matching for demo
|
|
439
|
+
// In real implementation, use proper number series validation
|
|
440
|
+
exit(StrLen(Value) >= 4);
|
|
441
|
+
end;
|
|
442
|
+
|
|
443
|
+
local procedure ItemNumberExists(ItemNo: Code[20]; ExcludeSystemId: Guid): Boolean
|
|
444
|
+
var
|
|
445
|
+
Item: Record Item;
|
|
446
|
+
begin
|
|
447
|
+
Item.SetRange("No.", ItemNo);
|
|
448
|
+
Item.SetFilter(SystemId, '<>%1', ExcludeSystemId);
|
|
449
|
+
exit(not Item.IsEmpty());
|
|
450
|
+
end;
|
|
451
|
+
|
|
452
|
+
local procedure ContainsProhibitedWords(Description: Text): Boolean
|
|
453
|
+
var
|
|
454
|
+
ProhibitedWords: List of [Text];
|
|
455
|
+
Word: Text;
|
|
456
|
+
begin
|
|
457
|
+
// Define prohibited words for item descriptions
|
|
458
|
+
ProhibitedWords.Add('TEMP');
|
|
459
|
+
ProhibitedWords.Add('TEST');
|
|
460
|
+
ProhibitedWords.Add('DELETE');
|
|
461
|
+
|
|
462
|
+
foreach Word in ProhibitedWords do
|
|
463
|
+
if Description.ToUpper().Contains(Word) then
|
|
464
|
+
exit(true);
|
|
465
|
+
|
|
466
|
+
exit(false);
|
|
467
|
+
end;
|
|
468
|
+
|
|
469
|
+
local procedure ValidateCostAgainstInventory()
|
|
470
|
+
var
|
|
471
|
+
ItemLedgerEntry: Record "Item Ledger Entry";
|
|
472
|
+
AverageCost: Decimal;
|
|
473
|
+
Variance: Decimal;
|
|
474
|
+
begin
|
|
475
|
+
// Calculate current average cost
|
|
476
|
+
ItemLedgerEntry.SetRange("Item No.", Rec."No.");
|
|
477
|
+
ItemLedgerEntry.CalcSums(Quantity, "Cost Amount (Actual)");
|
|
478
|
+
|
|
479
|
+
if ItemLedgerEntry.Quantity <> 0 then begin
|
|
480
|
+
AverageCost := ItemLedgerEntry."Cost Amount (Actual)" / ItemLedgerEntry.Quantity;
|
|
481
|
+
Variance := Abs(Rec."Unit Cost" - AverageCost) / AverageCost * 100;
|
|
482
|
+
|
|
483
|
+
// Warn if cost variance exceeds threshold
|
|
484
|
+
if Variance > 25 then // 25% variance threshold
|
|
485
|
+
if not Confirm('Unit cost varies %1% from average inventory cost. Continue?', false, Round(Variance, 1)) then
|
|
486
|
+
Error('Cost validation failed');
|
|
487
|
+
end;
|
|
488
|
+
end;
|
|
489
|
+
}
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
## Cross-Field and Business Logic Validation
|
|
493
|
+
|
|
494
|
+
```al
|
|
495
|
+
// Complex validation codeunit for sales orders
|
|
496
|
+
codeunit 50501 "Sales Order Validation API"
|
|
497
|
+
{
|
|
498
|
+
// Comprehensive sales order validation
|
|
499
|
+
procedure ValidateSalesOrder(var SalesHeader: Record "Sales Header"): Boolean
|
|
500
|
+
begin
|
|
501
|
+
// Execute all validation rules in sequence
|
|
502
|
+
if not ValidateOrderHeader(SalesHeader) then
|
|
503
|
+
exit(false);
|
|
504
|
+
|
|
505
|
+
if not ValidateCustomerRelationship(SalesHeader) then
|
|
506
|
+
exit(false);
|
|
507
|
+
|
|
508
|
+
if not ValidateOrderTotals(SalesHeader) then
|
|
509
|
+
exit(false);
|
|
510
|
+
|
|
511
|
+
if not ValidateInventoryAvailability(SalesHeader) then
|
|
512
|
+
exit(false);
|
|
513
|
+
|
|
514
|
+
exit(true);
|
|
515
|
+
end;
|
|
516
|
+
|
|
517
|
+
local procedure ValidateOrderHeader(var SalesHeader: Record "Sales Header"): Boolean
|
|
518
|
+
begin
|
|
519
|
+
// Date validations
|
|
520
|
+
if SalesHeader."Order Date" = 0D then
|
|
521
|
+
Error('Order date is required');
|
|
522
|
+
|
|
523
|
+
if SalesHeader."Order Date" < WorkDate() - 30 then
|
|
524
|
+
Error('Order date cannot be more than 30 days in the past');
|
|
525
|
+
|
|
526
|
+
if SalesHeader."Requested Delivery Date" < SalesHeader."Order Date" then
|
|
527
|
+
Error('Requested delivery date cannot be before order date');
|
|
528
|
+
|
|
529
|
+
// Document status validation
|
|
530
|
+
if SalesHeader."Document Type" <> SalesHeader."Document Type"::Order then
|
|
531
|
+
Error('Only sales orders can be processed through this API');
|
|
532
|
+
|
|
533
|
+
exit(true);
|
|
534
|
+
end;
|
|
535
|
+
|
|
536
|
+
local procedure ValidateCustomerRelationship(var SalesHeader: Record "Sales Header"): Boolean
|
|
537
|
+
var
|
|
538
|
+
Customer: Record Customer;
|
|
539
|
+
CustLedgerEntry: Record "Cust. Ledger Entry";
|
|
540
|
+
OutstandingAmount: Decimal;
|
|
541
|
+
begin
|
|
542
|
+
// Validate customer exists and is active
|
|
543
|
+
if not Customer.Get(SalesHeader."Sell-to Customer No.") then
|
|
544
|
+
Error('Customer %1 does not exist', SalesHeader."Sell-to Customer No.");
|
|
545
|
+
|
|
546
|
+
if Customer.Blocked <> Customer.Blocked::" " then
|
|
547
|
+
Error('Customer %1 is blocked for %2', Customer."No.", Customer.Blocked);
|
|
548
|
+
|
|
549
|
+
// Check credit limit
|
|
550
|
+
if Customer."Credit Limit (LCY)" > 0 then begin
|
|
551
|
+
CustLedgerEntry.SetRange("Customer No.", Customer."No.");
|
|
552
|
+
CustLedgerEntry.SetRange(Open, true);
|
|
553
|
+
CustLedgerEntry.CalcSums("Remaining Amt. (LCY)");
|
|
554
|
+
OutstandingAmount := CustLedgerEntry."Remaining Amt. (LCY)";
|
|
555
|
+
|
|
556
|
+
SalesHeader.CalcFields("Amount Including VAT");
|
|
557
|
+
if (OutstandingAmount + SalesHeader."Amount Including VAT") > Customer."Credit Limit (LCY)" then
|
|
558
|
+
Error('Order would exceed customer credit limit. Outstanding: %1, Order: %2, Limit: %3',
|
|
559
|
+
OutstandingAmount, SalesHeader."Amount Including VAT", Customer."Credit Limit (LCY)");
|
|
560
|
+
end;
|
|
561
|
+
|
|
562
|
+
exit(true);
|
|
563
|
+
end;
|
|
564
|
+
|
|
565
|
+
local procedure ValidateOrderTotals(var SalesHeader: Record "Sales Header"): Boolean
|
|
566
|
+
var
|
|
567
|
+
SalesLine: Record "Sales Line";
|
|
568
|
+
TotalAmount: Decimal;
|
|
569
|
+
LineCount: Integer;
|
|
570
|
+
begin
|
|
571
|
+
// Validate order has lines
|
|
572
|
+
SalesLine.SetRange("Document Type", SalesHeader."Document Type");
|
|
573
|
+
SalesLine.SetRange("Document No.", SalesHeader."No.");
|
|
574
|
+
LineCount := SalesLine.Count();
|
|
575
|
+
|
|
576
|
+
if LineCount = 0 then
|
|
577
|
+
Error('Sales order must have at least one line');
|
|
578
|
+
|
|
579
|
+
if LineCount > 100 then
|
|
580
|
+
Error('Sales order cannot have more than 100 lines');
|
|
581
|
+
|
|
582
|
+
// Validate minimum order amount
|
|
583
|
+
SalesHeader.CalcFields("Amount Including VAT");
|
|
584
|
+
if SalesHeader."Amount Including VAT" < 10 then
|
|
585
|
+
Error('Minimum order amount is 10.00');
|
|
586
|
+
|
|
587
|
+
exit(true);
|
|
588
|
+
end;
|
|
589
|
+
|
|
590
|
+
local procedure ValidateInventoryAvailability(var SalesHeader: Record "Sales Header"): Boolean
|
|
591
|
+
var
|
|
592
|
+
SalesLine: Record "Sales Line";
|
|
593
|
+
Item: Record Item;
|
|
594
|
+
AvailableInventory: Decimal;
|
|
595
|
+
begin
|
|
596
|
+
SalesLine.SetRange("Document Type", SalesHeader."Document Type");
|
|
597
|
+
SalesLine.SetRange("Document No.", SalesHeader."No.");
|
|
598
|
+
SalesLine.SetRange(Type, SalesLine.Type::Item);
|
|
599
|
+
|
|
600
|
+
if SalesLine.FindSet() then
|
|
601
|
+
repeat
|
|
602
|
+
if Item.Get(SalesLine."No.") then begin
|
|
603
|
+
Item.CalcFields(Inventory, "Qty. on Sales Order");
|
|
604
|
+
AvailableInventory := Item.Inventory - Item."Qty. on Sales Order";
|
|
605
|
+
|
|
606
|
+
if SalesLine.Quantity > AvailableInventory then
|
|
607
|
+
Error('Insufficient inventory for item %1. Requested: %2, Available: %3',
|
|
608
|
+
Item."No.", SalesLine.Quantity, AvailableInventory);
|
|
609
|
+
end;
|
|
610
|
+
until SalesLine.Next() = 0;
|
|
611
|
+
|
|
612
|
+
exit(true);
|
|
613
|
+
end;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// API page with comprehensive validation
|
|
617
|
+
page 50502 "Sales Order Validation API"
|
|
618
|
+
{
|
|
619
|
+
PageType = API;
|
|
620
|
+
APIPublisher = 'contoso';
|
|
621
|
+
APIGroup = 'sales';
|
|
622
|
+
APIVersion = 'v1.0';
|
|
623
|
+
EntityName = 'salesOrder';
|
|
624
|
+
EntitySetName = 'salesOrders';
|
|
625
|
+
SourceTable = "Sales Header";
|
|
626
|
+
DelayedInsert = true;
|
|
627
|
+
ODataKeyFields = SystemId;
|
|
628
|
+
SourceTableView = WHERE("Document Type" = CONST(Order));
|
|
629
|
+
|
|
630
|
+
layout
|
|
631
|
+
{
|
|
632
|
+
area(Content)
|
|
633
|
+
{
|
|
634
|
+
repeater(GroupName)
|
|
635
|
+
{
|
|
636
|
+
field(id; Rec.SystemId)
|
|
637
|
+
{
|
|
638
|
+
Caption = 'Id';
|
|
639
|
+
Editable = false;
|
|
640
|
+
}
|
|
641
|
+
field(number; Rec."No.")
|
|
642
|
+
{
|
|
643
|
+
Caption = 'Number';
|
|
644
|
+
}
|
|
645
|
+
field(customerNumber; Rec."Sell-to Customer No.")
|
|
646
|
+
{
|
|
647
|
+
Caption = 'Customer Number';
|
|
648
|
+
}
|
|
649
|
+
field(orderDate; Rec."Order Date")
|
|
650
|
+
{
|
|
651
|
+
Caption = 'Order Date';
|
|
652
|
+
}
|
|
653
|
+
field(requestedDeliveryDate; Rec."Requested Delivery Date")
|
|
654
|
+
{
|
|
655
|
+
Caption = 'Requested Delivery Date';
|
|
656
|
+
}
|
|
657
|
+
field(totalAmount; TotalAmount)
|
|
658
|
+
{
|
|
659
|
+
Caption = 'Total Amount';
|
|
660
|
+
Editable = false;
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
var
|
|
667
|
+
TotalAmount: Decimal;
|
|
668
|
+
SalesOrderValidation: Codeunit "Sales Order Validation API";
|
|
669
|
+
|
|
670
|
+
trigger OnAfterGetRecord()
|
|
671
|
+
begin
|
|
672
|
+
Rec.CalcFields("Amount Including VAT");
|
|
673
|
+
TotalAmount := Rec."Amount Including VAT";
|
|
674
|
+
end;
|
|
675
|
+
|
|
676
|
+
trigger OnInsertRecord(BelowxRec: Boolean): Boolean
|
|
677
|
+
begin
|
|
678
|
+
// Execute comprehensive validation before insert
|
|
679
|
+
exit(SalesOrderValidation.ValidateSalesOrder(Rec));
|
|
680
|
+
end;
|
|
681
|
+
|
|
682
|
+
trigger OnModifyRecord(): Boolean
|
|
683
|
+
begin
|
|
684
|
+
// Execute validation before modification
|
|
685
|
+
exit(SalesOrderValidation.ValidateSalesOrder(Rec));
|
|
686
|
+
end;
|
|
687
|
+
}
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
## Implementation Notes
|
|
691
|
+
|
|
692
|
+
**Validation Rule Execution Best Practices:**
|
|
693
|
+
|
|
694
|
+
1. **Validation Strategy:**
|
|
695
|
+
- Implement field-level validation for immediate feedback
|
|
696
|
+
- Use record-level validation for business logic enforcement
|
|
697
|
+
- Combine BC standard validation with custom business rules
|
|
698
|
+
- Provide clear, actionable error messages
|
|
699
|
+
|
|
700
|
+
2. **Performance Optimization:**
|
|
701
|
+
- Execute lightweight validations first (required fields, formats)
|
|
702
|
+
- Defer expensive validations (database lookups) until necessary
|
|
703
|
+
- Cache validation results when possible
|
|
704
|
+
- Use filtered queries to minimize database access
|
|
705
|
+
|
|
706
|
+
3. **Error Handling:**
|
|
707
|
+
- Return specific error messages indicating the validation failure
|
|
708
|
+
- Include relevant data in error messages for troubleshooting
|
|
709
|
+
- Use consistent error message formats across API endpoints
|
|
710
|
+
- Log validation failures for monitoring and improvement
|
|
711
|
+
|
|
712
|
+
4. **Business Rule Integration:**
|
|
713
|
+
- Leverage existing BC table validation where possible
|
|
714
|
+
- Implement custom validation for API-specific requirements
|
|
715
|
+
- Ensure validation rules align with UI behavior
|
|
716
|
+
- Document validation rules for API consumers
|