bc-code-intelligence-mcp 1.1.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 +107 -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 +441 -0
- package/dist/cli/bc-code-intel-cli.js.map +1 -0
- package/dist/config/config-loader.d.ts +21 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +402 -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 +604 -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 +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +673 -0
- package/dist/index.js.map +1 -0
- package/dist/layers/base-layer.d.ts +83 -0
- package/dist/layers/base-layer.d.ts.map +1 -0
- package/dist/layers/base-layer.js +166 -0
- package/dist/layers/base-layer.js.map +1 -0
- package/dist/layers/embedded-layer.d.ts +53 -0
- package/dist/layers/embedded-layer.d.ts.map +1 -0
- package/dist/layers/embedded-layer.js +238 -0
- package/dist/layers/embedded-layer.js.map +1 -0
- package/dist/layers/git-layer.d.ts +54 -0
- package/dist/layers/git-layer.d.ts.map +1 -0
- package/dist/layers/git-layer.js +369 -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 +129 -0
- package/dist/layers/layer-service.d.ts.map +1 -0
- package/dist/layers/layer-service.js +570 -0
- package/dist/layers/layer-service.js.map +1 -0
- package/dist/layers/project-layer.d.ts +50 -0
- package/dist/layers/project-layer.d.ts.map +1 -0
- package/dist/layers/project-layer.js +256 -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 +355 -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 +811 -0
- package/dist/services/code-analysis-service.js.map +1 -0
- package/dist/services/knowledge-service.d.ts +91 -0
- package/dist/services/knowledge-service.d.ts.map +1 -0
- package/dist/services/knowledge-service.js +370 -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 +408 -0
- package/dist/services/methodology-service.js.map +1 -0
- package/dist/services/workflow-service.d.ts +132 -0
- package/dist/services/workflow-service.d.ts.map +1 -0
- package/dist/services/workflow-service.js +277 -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 +51 -0
- package/dist/streamlined-handlers.d.ts.map +1 -0
- package/dist/streamlined-handlers.js +287 -0
- package/dist/streamlined-handlers.js.map +1 -0
- package/dist/streamlined-tools.d.ts +316 -0
- package/dist/streamlined-tools.d.ts.map +1 -0
- package/dist/streamlined-tools.js +189 -0
- package/dist/streamlined-tools.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/types/bc-knowledge.d.ts +294 -0
- package/dist/types/bc-knowledge.d.ts.map +1 -0
- package/dist/types/bc-knowledge.js +44 -0
- package/dist/types/bc-knowledge.js.map +1 -0
- package/dist/types/config-types.d.ts +180 -0
- package/dist/types/config-types.d.ts.map +1 -0
- package/dist/types/config-types.js +104 -0
- package/dist/types/config-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 +171 -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/persona-types.d.ts +77 -0
- package/dist/types/persona-types.d.ts.map +1 -0
- package/dist/types/persona-types.js +341 -0
- package/dist/types/persona-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 +69 -0
- package/embedded-knowledge/CONTRIBUTING.md +58 -0
- package/embedded-knowledge/LICENSE +21 -0
- package/embedded-knowledge/README.md +15 -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/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/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/subscriber-codeunit-size-optimization.md +66 -0
- package/embedded-knowledge/domains/alex-architect/systemid-integration.md +115 -0
- package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +295 -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/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/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/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/testfield-error-handling.md +80 -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/quinn-tester/fielderror-validation-patterns.md +119 -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/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/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/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/package.json +74 -0
|
@@ -0,0 +1,758 @@
|
|
|
1
|
+
# No Series Validation Patterns - AL Code Examples
|
|
2
|
+
|
|
3
|
+
This sample demonstrates implementing comprehensive validation patterns for number sequence integrity in Business Central.
|
|
4
|
+
|
|
5
|
+
## Basic Validation Framework
|
|
6
|
+
|
|
7
|
+
```al
|
|
8
|
+
// Core validation interface for no series
|
|
9
|
+
interface INoSeriesValidator
|
|
10
|
+
{
|
|
11
|
+
procedure ValidateFormat(SeriesCode: Code[20]; NumberValue: Code[20]): Boolean;
|
|
12
|
+
procedure ValidateSequence(SeriesCode: Code[20]): Boolean;
|
|
13
|
+
procedure ValidateIntegrity(SeriesCode: Code[20]): Boolean;
|
|
14
|
+
procedure GetValidationErrors(): List of [Text];
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Comprehensive No Series Validator
|
|
19
|
+
|
|
20
|
+
```al
|
|
21
|
+
// Main validation implementation
|
|
22
|
+
codeunit 50900 "No Series Validator" implements INoSeriesValidator
|
|
23
|
+
{
|
|
24
|
+
var
|
|
25
|
+
ValidationErrors: List of [Text];
|
|
26
|
+
ValidationWarnings: List of [Text];
|
|
27
|
+
|
|
28
|
+
procedure ValidateFormat(SeriesCode: Code[20]; NumberValue: Code[20]): Boolean
|
|
29
|
+
var
|
|
30
|
+
NoSeriesLine: Record "No. Series Line";
|
|
31
|
+
FormatValid: Boolean;
|
|
32
|
+
begin
|
|
33
|
+
Clear(ValidationErrors);
|
|
34
|
+
FormatValid := true;
|
|
35
|
+
|
|
36
|
+
if not FindNoSeriesLine(SeriesCode, NoSeriesLine) then begin
|
|
37
|
+
AddValidationError(StrSubstNo('No. Series line not found for series %1', SeriesCode));
|
|
38
|
+
exit(false);
|
|
39
|
+
end;
|
|
40
|
+
|
|
41
|
+
// Validate number format
|
|
42
|
+
if not ValidateNumberFormat(NumberValue, NoSeriesLine) then
|
|
43
|
+
FormatValid := false;
|
|
44
|
+
|
|
45
|
+
// Validate number range
|
|
46
|
+
if not ValidateNumberRange(NumberValue, NoSeriesLine) then
|
|
47
|
+
FormatValid := false;
|
|
48
|
+
|
|
49
|
+
// Validate increment pattern
|
|
50
|
+
if not ValidateIncrementPattern(NumberValue, NoSeriesLine) then
|
|
51
|
+
FormatValid := false;
|
|
52
|
+
|
|
53
|
+
exit(FormatValid);
|
|
54
|
+
end;
|
|
55
|
+
|
|
56
|
+
procedure ValidateSequence(SeriesCode: Code[20]): Boolean
|
|
57
|
+
var
|
|
58
|
+
NoSeriesLine: Record "No. Series Line";
|
|
59
|
+
NoSeriesLog: Record "No. Series Log";
|
|
60
|
+
SequenceValid: Boolean;
|
|
61
|
+
GapCount: Integer;
|
|
62
|
+
DuplicateCount: Integer;
|
|
63
|
+
begin
|
|
64
|
+
Clear(ValidationErrors);
|
|
65
|
+
Clear(ValidationWarnings);
|
|
66
|
+
SequenceValid := true;
|
|
67
|
+
|
|
68
|
+
if not FindNoSeriesLine(SeriesCode, NoSeriesLine) then begin
|
|
69
|
+
AddValidationError(StrSubstNo('No. Series line not found for series %1', SeriesCode));
|
|
70
|
+
exit(false);
|
|
71
|
+
end;
|
|
72
|
+
|
|
73
|
+
// Check for gaps in sequence
|
|
74
|
+
GapCount := CheckForGaps(SeriesCode, NoSeriesLine);
|
|
75
|
+
if GapCount > 0 then begin
|
|
76
|
+
AddValidationWarning(StrSubstNo('%1 gaps found in sequence %2', GapCount, SeriesCode));
|
|
77
|
+
end;
|
|
78
|
+
|
|
79
|
+
// Check for duplicates
|
|
80
|
+
DuplicateCount := CheckForDuplicates(SeriesCode);
|
|
81
|
+
if DuplicateCount > 0 then begin
|
|
82
|
+
AddValidationError(StrSubstNo('%1 duplicate numbers found in sequence %2', DuplicateCount, SeriesCode));
|
|
83
|
+
SequenceValid := false;
|
|
84
|
+
end;
|
|
85
|
+
|
|
86
|
+
// Validate last used number
|
|
87
|
+
if not ValidateLastUsedNumber(NoSeriesLine) then
|
|
88
|
+
SequenceValid := false;
|
|
89
|
+
|
|
90
|
+
// Check sequence boundaries
|
|
91
|
+
if not ValidateSequenceBoundaries(NoSeriesLine) then
|
|
92
|
+
SequenceValid := false;
|
|
93
|
+
|
|
94
|
+
exit(SequenceValid);
|
|
95
|
+
end;
|
|
96
|
+
|
|
97
|
+
procedure ValidateIntegrity(SeriesCode: Code[20]): Boolean
|
|
98
|
+
var
|
|
99
|
+
IntegrityValid: Boolean;
|
|
100
|
+
begin
|
|
101
|
+
Clear(ValidationErrors);
|
|
102
|
+
IntegrityValid := true;
|
|
103
|
+
|
|
104
|
+
// Validate cross-table references
|
|
105
|
+
if not ValidateCrossTableReferences(SeriesCode) then
|
|
106
|
+
IntegrityValid := false;
|
|
107
|
+
|
|
108
|
+
// Validate concurrency conflicts
|
|
109
|
+
if not ValidateConcurrencyIntegrity(SeriesCode) then
|
|
110
|
+
IntegrityValid := false;
|
|
111
|
+
|
|
112
|
+
// Validate business rule compliance
|
|
113
|
+
if not ValidateBusinessRules(SeriesCode) then
|
|
114
|
+
IntegrityValid := false;
|
|
115
|
+
|
|
116
|
+
// Validate system consistency
|
|
117
|
+
if not ValidateSystemConsistency(SeriesCode) then
|
|
118
|
+
IntegrityValid := false;
|
|
119
|
+
|
|
120
|
+
exit(IntegrityValid);
|
|
121
|
+
end;
|
|
122
|
+
|
|
123
|
+
procedure GetValidationErrors(): List of [Text]
|
|
124
|
+
begin
|
|
125
|
+
exit(ValidationErrors);
|
|
126
|
+
end;
|
|
127
|
+
|
|
128
|
+
procedure GetValidationWarnings(): List of [Text]
|
|
129
|
+
begin
|
|
130
|
+
exit(ValidationWarnings);
|
|
131
|
+
end;
|
|
132
|
+
|
|
133
|
+
local procedure FindNoSeriesLine(SeriesCode: Code[20]; var NoSeriesLine: Record "No. Series Line"): Boolean
|
|
134
|
+
begin
|
|
135
|
+
NoSeriesLine.SetRange("Series Code", SeriesCode);
|
|
136
|
+
NoSeriesLine.SetFilter("Starting Date", '<=%1', Today);
|
|
137
|
+
NoSeriesLine.SetFilter("Ending Date", '%1|>=%2', 0D, Today);
|
|
138
|
+
|
|
139
|
+
exit(NoSeriesLine.FindLast());
|
|
140
|
+
end;
|
|
141
|
+
|
|
142
|
+
local procedure ValidateNumberFormat(NumberValue: Code[20]; NoSeriesLine: Record "No. Series Line"): Boolean
|
|
143
|
+
var
|
|
144
|
+
ExpectedFormat: Text;
|
|
145
|
+
ActualFormat: Text;
|
|
146
|
+
FormatValid: Boolean;
|
|
147
|
+
begin
|
|
148
|
+
FormatValid := true;
|
|
149
|
+
|
|
150
|
+
// Validate length
|
|
151
|
+
if StrLen(NumberValue) > 20 then begin
|
|
152
|
+
AddValidationError(StrSubstNo('Number %1 exceeds maximum length of 20 characters', NumberValue));
|
|
153
|
+
FormatValid := false;
|
|
154
|
+
end;
|
|
155
|
+
|
|
156
|
+
// Validate prefix consistency
|
|
157
|
+
if not ValidatePrefix(NumberValue, NoSeriesLine) then
|
|
158
|
+
FormatValid := false;
|
|
159
|
+
|
|
160
|
+
// Validate suffix consistency
|
|
161
|
+
if not ValidateSuffix(NumberValue, NoSeriesLine) then
|
|
162
|
+
FormatValid := false;
|
|
163
|
+
|
|
164
|
+
// Validate numeric portion
|
|
165
|
+
if not ValidateNumericPortion(NumberValue, NoSeriesLine) then
|
|
166
|
+
FormatValid := false;
|
|
167
|
+
|
|
168
|
+
exit(FormatValid);
|
|
169
|
+
end;
|
|
170
|
+
|
|
171
|
+
local procedure ValidateNumberRange(NumberValue: Code[20]; NoSeriesLine: Record "No. Series Line"): Boolean
|
|
172
|
+
var
|
|
173
|
+
RangeValid: Boolean;
|
|
174
|
+
begin
|
|
175
|
+
RangeValid := true;
|
|
176
|
+
|
|
177
|
+
// Check if number is within starting range
|
|
178
|
+
if (NoSeriesLine."Starting No." <> '') and (NumberValue < NoSeriesLine."Starting No.") then begin
|
|
179
|
+
AddValidationError(StrSubstNo('Number %1 is below starting number %2', NumberValue, NoSeriesLine."Starting No."));
|
|
180
|
+
RangeValid := false;
|
|
181
|
+
end;
|
|
182
|
+
|
|
183
|
+
// Check if number is within ending range
|
|
184
|
+
if (NoSeriesLine."Ending No." <> '') and (NumberValue > NoSeriesLine."Ending No.") then begin
|
|
185
|
+
AddValidationError(StrSubstNo('Number %1 exceeds ending number %2', NumberValue, NoSeriesLine."Ending No."));
|
|
186
|
+
RangeValid := false;
|
|
187
|
+
end;
|
|
188
|
+
|
|
189
|
+
exit(RangeValid);
|
|
190
|
+
end;
|
|
191
|
+
|
|
192
|
+
local procedure ValidateIncrementPattern(NumberValue: Code[20]; NoSeriesLine: Record "No. Series Line"): Boolean
|
|
193
|
+
var
|
|
194
|
+
ExpectedIncrement: Integer;
|
|
195
|
+
ActualIncrement: Integer;
|
|
196
|
+
LastUsedNumber: Code[20];
|
|
197
|
+
begin
|
|
198
|
+
if NoSeriesLine."Last No. Used" = '' then
|
|
199
|
+
exit(true); // First number, no increment to validate
|
|
200
|
+
|
|
201
|
+
LastUsedNumber := NoSeriesLine."Last No. Used";
|
|
202
|
+
ExpectedIncrement := NoSeriesLine."Increment-by No.";
|
|
203
|
+
|
|
204
|
+
ActualIncrement := CalculateIncrement(LastUsedNumber, NumberValue);
|
|
205
|
+
|
|
206
|
+
if ActualIncrement <> ExpectedIncrement then begin
|
|
207
|
+
AddValidationError(StrSubstNo('Number %1 does not follow expected increment pattern. Expected: %2, Actual: %3',
|
|
208
|
+
NumberValue, ExpectedIncrement, ActualIncrement));
|
|
209
|
+
exit(false);
|
|
210
|
+
end;
|
|
211
|
+
|
|
212
|
+
exit(true);
|
|
213
|
+
end;
|
|
214
|
+
|
|
215
|
+
local procedure CheckForGaps(SeriesCode: Code[20]; NoSeriesLine: Record "No. Series Line"): Integer
|
|
216
|
+
var
|
|
217
|
+
NoSeriesLog: Record "No. Series Log";
|
|
218
|
+
ExpectedNumber: Code[20];
|
|
219
|
+
CurrentNumber: Code[20];
|
|
220
|
+
GapCount: Integer;
|
|
221
|
+
PreviousNumber: Code[20];
|
|
222
|
+
begin
|
|
223
|
+
GapCount := 0;
|
|
224
|
+
PreviousNumber := NoSeriesLine."Starting No.";
|
|
225
|
+
|
|
226
|
+
NoSeriesLog.SetRange("Series Code", SeriesCode);
|
|
227
|
+
NoSeriesLog.SetCurrentKey("Generation Date", "Generation Time");
|
|
228
|
+
|
|
229
|
+
if NoSeriesLog.FindSet() then
|
|
230
|
+
repeat
|
|
231
|
+
CurrentNumber := NoSeriesLog."Generated No.";
|
|
232
|
+
ExpectedNumber := IncrementNumber(PreviousNumber, NoSeriesLine."Increment-by No.");
|
|
233
|
+
|
|
234
|
+
if CurrentNumber <> ExpectedNumber then begin
|
|
235
|
+
// Gap detected
|
|
236
|
+
GapCount += 1;
|
|
237
|
+
LogGap(SeriesCode, ExpectedNumber, CurrentNumber);
|
|
238
|
+
end;
|
|
239
|
+
|
|
240
|
+
PreviousNumber := CurrentNumber;
|
|
241
|
+
until NoSeriesLog.Next() = 0;
|
|
242
|
+
|
|
243
|
+
exit(GapCount);
|
|
244
|
+
end;
|
|
245
|
+
|
|
246
|
+
local procedure CheckForDuplicates(SeriesCode: Code[20]): Integer
|
|
247
|
+
var
|
|
248
|
+
NoSeriesLog: Record "No. Series Log";
|
|
249
|
+
TempNoSeriesLog: Record "No. Series Log" temporary;
|
|
250
|
+
DuplicateCount: Integer;
|
|
251
|
+
begin
|
|
252
|
+
DuplicateCount := 0;
|
|
253
|
+
|
|
254
|
+
NoSeriesLog.SetRange("Series Code", SeriesCode);
|
|
255
|
+
|
|
256
|
+
if NoSeriesLog.FindSet() then
|
|
257
|
+
repeat
|
|
258
|
+
TempNoSeriesLog.SetRange("Generated No.", NoSeriesLog."Generated No.");
|
|
259
|
+
if TempNoSeriesLog.FindFirst() then begin
|
|
260
|
+
// Duplicate found
|
|
261
|
+
DuplicateCount += 1;
|
|
262
|
+
LogDuplicate(SeriesCode, NoSeriesLog."Generated No.", NoSeriesLog."Generation Date", TempNoSeriesLog."Generation Date");
|
|
263
|
+
end else begin
|
|
264
|
+
TempNoSeriesLog.TransferFields(NoSeriesLog);
|
|
265
|
+
TempNoSeriesLog.Insert();
|
|
266
|
+
end;
|
|
267
|
+
until NoSeriesLog.Next() = 0;
|
|
268
|
+
|
|
269
|
+
exit(DuplicateCount);
|
|
270
|
+
end;
|
|
271
|
+
|
|
272
|
+
local procedure ValidateLastUsedNumber(NoSeriesLine: Record "No. Series Line"): Boolean
|
|
273
|
+
var
|
|
274
|
+
NoSeriesLog: Record "No. Series Log";
|
|
275
|
+
LastLoggedNumber: Code[20];
|
|
276
|
+
begin
|
|
277
|
+
if NoSeriesLine."Last No. Used" = '' then
|
|
278
|
+
exit(true);
|
|
279
|
+
|
|
280
|
+
// Find the most recent logged number
|
|
281
|
+
NoSeriesLog.SetRange("Series Code", NoSeriesLine."Series Code");
|
|
282
|
+
if NoSeriesLog.FindLast() then begin
|
|
283
|
+
LastLoggedNumber := NoSeriesLog."Generated No.";
|
|
284
|
+
|
|
285
|
+
if LastLoggedNumber <> NoSeriesLine."Last No. Used" then begin
|
|
286
|
+
AddValidationError(StrSubstNo('Last used number mismatch. Series Line: %1, Log: %2',
|
|
287
|
+
NoSeriesLine."Last No. Used", LastLoggedNumber));
|
|
288
|
+
exit(false);
|
|
289
|
+
end;
|
|
290
|
+
end;
|
|
291
|
+
|
|
292
|
+
exit(true);
|
|
293
|
+
end;
|
|
294
|
+
|
|
295
|
+
local procedure ValidateSequenceBoundaries(NoSeriesLine: Record "No. Series Line"): Boolean
|
|
296
|
+
var
|
|
297
|
+
BoundariesValid: Boolean;
|
|
298
|
+
begin
|
|
299
|
+
BoundariesValid := true;
|
|
300
|
+
|
|
301
|
+
// Validate that starting number is less than ending number
|
|
302
|
+
if (NoSeriesLine."Starting No." <> '') and (NoSeriesLine."Ending No." <> '') then begin
|
|
303
|
+
if NoSeriesLine."Starting No." >= NoSeriesLine."Ending No." then begin
|
|
304
|
+
AddValidationError(StrSubstNo('Starting number %1 must be less than ending number %2',
|
|
305
|
+
NoSeriesLine."Starting No.", NoSeriesLine."Ending No."));
|
|
306
|
+
BoundariesValid := false;
|
|
307
|
+
end;
|
|
308
|
+
end;
|
|
309
|
+
|
|
310
|
+
// Validate that last used number is within boundaries
|
|
311
|
+
if NoSeriesLine."Last No. Used" <> '' then begin
|
|
312
|
+
if (NoSeriesLine."Starting No." <> '') and (NoSeriesLine."Last No. Used" < NoSeriesLine."Starting No.") then begin
|
|
313
|
+
AddValidationError(StrSubstNo('Last used number %1 is below starting number %2',
|
|
314
|
+
NoSeriesLine."Last No. Used", NoSeriesLine."Starting No."));
|
|
315
|
+
BoundariesValid := false;
|
|
316
|
+
end;
|
|
317
|
+
|
|
318
|
+
if (NoSeriesLine."Ending No." <> '') and (NoSeriesLine."Last No. Used" > NoSeriesLine."Ending No.") then begin
|
|
319
|
+
AddValidationError(StrSubstNo('Last used number %1 exceeds ending number %2',
|
|
320
|
+
NoSeriesLine."Last No. Used", NoSeriesLine."Ending No."));
|
|
321
|
+
BoundariesValid := false;
|
|
322
|
+
end;
|
|
323
|
+
end;
|
|
324
|
+
|
|
325
|
+
exit(BoundariesValid);
|
|
326
|
+
end;
|
|
327
|
+
|
|
328
|
+
local procedure ValidateCrossTableReferences(SeriesCode: Code[20]): Boolean
|
|
329
|
+
var
|
|
330
|
+
SalesHeader: Record "Sales Header";
|
|
331
|
+
PurchaseHeader: Record "Purchase Header";
|
|
332
|
+
ItemLedgerEntry: Record "Item Ledger Entry";
|
|
333
|
+
ReferenceValid: Boolean;
|
|
334
|
+
OrphanCount: Integer;
|
|
335
|
+
begin
|
|
336
|
+
ReferenceValid := true;
|
|
337
|
+
|
|
338
|
+
// Check for orphaned numbers in sales documents
|
|
339
|
+
OrphanCount := CheckOrphanedReferences(SeriesCode, Database::"Sales Header");
|
|
340
|
+
if OrphanCount > 0 then begin
|
|
341
|
+
AddValidationWarning(StrSubstNo('%1 orphaned references found in Sales Headers for series %2', OrphanCount, SeriesCode));
|
|
342
|
+
end;
|
|
343
|
+
|
|
344
|
+
// Check for orphaned numbers in purchase documents
|
|
345
|
+
OrphanCount := CheckOrphanedReferences(SeriesCode, Database::"Purchase Header");
|
|
346
|
+
if OrphanCount > 0 then begin
|
|
347
|
+
AddValidationWarning(StrSubstNo('%1 orphaned references found in Purchase Headers for series %2', OrphanCount, SeriesCode));
|
|
348
|
+
end;
|
|
349
|
+
|
|
350
|
+
exit(ReferenceValid);
|
|
351
|
+
end;
|
|
352
|
+
|
|
353
|
+
local procedure ValidateConcurrencyIntegrity(SeriesCode: Code[20]): Boolean
|
|
354
|
+
var
|
|
355
|
+
NoSeriesLock: Record "No. Series Lock";
|
|
356
|
+
ConcurrencyValid: Boolean;
|
|
357
|
+
begin
|
|
358
|
+
ConcurrencyValid := true;
|
|
359
|
+
|
|
360
|
+
// Check for stale locks
|
|
361
|
+
NoSeriesLock.SetRange("Series Code", SeriesCode);
|
|
362
|
+
NoSeriesLock.SetFilter("Lock Time", '<%1', CurrentDateTime - 300000); // 5 minutes old
|
|
363
|
+
|
|
364
|
+
if not NoSeriesLock.IsEmpty then begin
|
|
365
|
+
AddValidationWarning(StrSubstNo('Stale locks found for series %1', SeriesCode));
|
|
366
|
+
// Clean up stale locks
|
|
367
|
+
NoSeriesLock.DeleteAll(true);
|
|
368
|
+
end;
|
|
369
|
+
|
|
370
|
+
exit(ConcurrencyValid);
|
|
371
|
+
end;
|
|
372
|
+
|
|
373
|
+
local procedure ValidateBusinessRules(SeriesCode: Code[20]): Boolean
|
|
374
|
+
var
|
|
375
|
+
NoSeries: Record "No. Series";
|
|
376
|
+
BusinessRulesValid: Boolean;
|
|
377
|
+
begin
|
|
378
|
+
BusinessRulesValid := true;
|
|
379
|
+
|
|
380
|
+
if not NoSeries.Get(SeriesCode) then begin
|
|
381
|
+
AddValidationError(StrSubstNo('No. Series %1 not found', SeriesCode));
|
|
382
|
+
exit(false);
|
|
383
|
+
end;
|
|
384
|
+
|
|
385
|
+
// Validate business rule: Manual vs. Automatic
|
|
386
|
+
if NoSeries."Manual Nos." and NoSeries."Default Nos." then begin
|
|
387
|
+
AddValidationError(StrSubstNo('Series %1 cannot have both Manual and Default numbering enabled', SeriesCode));
|
|
388
|
+
BusinessRulesValid := false;
|
|
389
|
+
end;
|
|
390
|
+
|
|
391
|
+
// Validate date-based rules
|
|
392
|
+
if not ValidateDateBasedRules(SeriesCode) then
|
|
393
|
+
BusinessRulesValid := false;
|
|
394
|
+
|
|
395
|
+
exit(BusinessRulesValid);
|
|
396
|
+
end;
|
|
397
|
+
|
|
398
|
+
local procedure ValidateSystemConsistency(SeriesCode: Code[20]): Boolean
|
|
399
|
+
var
|
|
400
|
+
NoSeriesLine: Record "No. Series Line";
|
|
401
|
+
ConsistencyValid: Boolean;
|
|
402
|
+
OverlapCount: Integer;
|
|
403
|
+
begin
|
|
404
|
+
ConsistencyValid := true;
|
|
405
|
+
|
|
406
|
+
// Check for overlapping date ranges
|
|
407
|
+
OverlapCount := CheckDateRangeOverlaps(SeriesCode);
|
|
408
|
+
if OverlapCount > 0 then begin
|
|
409
|
+
AddValidationError(StrSubstNo('%1 overlapping date ranges found for series %2', OverlapCount, SeriesCode));
|
|
410
|
+
ConsistencyValid := false;
|
|
411
|
+
end;
|
|
412
|
+
|
|
413
|
+
// Check for missing date ranges
|
|
414
|
+
if not ValidateDateRangeContinuity(SeriesCode) then
|
|
415
|
+
ConsistencyValid := false;
|
|
416
|
+
|
|
417
|
+
exit(ConsistencyValid);
|
|
418
|
+
end;
|
|
419
|
+
|
|
420
|
+
// Helper procedures...
|
|
421
|
+
local procedure ValidatePrefix(NumberValue: Code[20]; NoSeriesLine: Record "No. Series Line"): Boolean
|
|
422
|
+
begin
|
|
423
|
+
// Implement prefix validation logic
|
|
424
|
+
exit(true);
|
|
425
|
+
end;
|
|
426
|
+
|
|
427
|
+
local procedure ValidateSuffix(NumberValue: Code[20]; NoSeriesLine: Record "No. Series Line"): Boolean
|
|
428
|
+
begin
|
|
429
|
+
// Implement suffix validation logic
|
|
430
|
+
exit(true);
|
|
431
|
+
end;
|
|
432
|
+
|
|
433
|
+
local procedure ValidateNumericPortion(NumberValue: Code[20]; NoSeriesLine: Record "No. Series Line"): Boolean
|
|
434
|
+
begin
|
|
435
|
+
// Implement numeric portion validation logic
|
|
436
|
+
exit(true);
|
|
437
|
+
end;
|
|
438
|
+
|
|
439
|
+
local procedure CalculateIncrement(FromNumber: Code[20]; ToNumber: Code[20]): Integer
|
|
440
|
+
begin
|
|
441
|
+
// Implement increment calculation logic
|
|
442
|
+
exit(1);
|
|
443
|
+
end;
|
|
444
|
+
|
|
445
|
+
local procedure IncrementNumber(Number: Code[20]; IncrementBy: Integer): Code[20]
|
|
446
|
+
begin
|
|
447
|
+
// Implement number increment logic
|
|
448
|
+
exit(Number);
|
|
449
|
+
end;
|
|
450
|
+
|
|
451
|
+
local procedure CheckOrphanedReferences(SeriesCode: Code[20]; TableNo: Integer): Integer
|
|
452
|
+
begin
|
|
453
|
+
// Implement orphaned reference checking
|
|
454
|
+
exit(0);
|
|
455
|
+
end;
|
|
456
|
+
|
|
457
|
+
local procedure CheckDateRangeOverlaps(SeriesCode: Code[20]): Integer
|
|
458
|
+
begin
|
|
459
|
+
// Implement date range overlap checking
|
|
460
|
+
exit(0);
|
|
461
|
+
end;
|
|
462
|
+
|
|
463
|
+
local procedure ValidateDateRangeContinuity(SeriesCode: Code[20]): Boolean
|
|
464
|
+
begin
|
|
465
|
+
// Implement date range continuity validation
|
|
466
|
+
exit(true);
|
|
467
|
+
end;
|
|
468
|
+
|
|
469
|
+
local procedure ValidateDateBasedRules(SeriesCode: Code[20]): Boolean
|
|
470
|
+
begin
|
|
471
|
+
// Implement date-based business rule validation
|
|
472
|
+
exit(true);
|
|
473
|
+
end;
|
|
474
|
+
|
|
475
|
+
local procedure AddValidationError(ErrorText: Text)
|
|
476
|
+
begin
|
|
477
|
+
ValidationErrors.Add(ErrorText);
|
|
478
|
+
end;
|
|
479
|
+
|
|
480
|
+
local procedure AddValidationWarning(WarningText: Text)
|
|
481
|
+
begin
|
|
482
|
+
ValidationWarnings.Add(WarningText);
|
|
483
|
+
end;
|
|
484
|
+
|
|
485
|
+
local procedure LogGap(SeriesCode: Code[20]; ExpectedNumber: Code[20]; ActualNumber: Code[20])
|
|
486
|
+
begin
|
|
487
|
+
// Log gap detection for analysis
|
|
488
|
+
end;
|
|
489
|
+
|
|
490
|
+
local procedure LogDuplicate(SeriesCode: Code[20]; DuplicateNumber: Code[20]; Date1: Date; Date2: Date)
|
|
491
|
+
begin
|
|
492
|
+
// Log duplicate detection for analysis
|
|
493
|
+
end;
|
|
494
|
+
}
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
## Real-Time Validation Integration
|
|
498
|
+
|
|
499
|
+
```al
|
|
500
|
+
// Real-time validation during number generation
|
|
501
|
+
codeunit 50901 "Real-Time No Series Validator"
|
|
502
|
+
{
|
|
503
|
+
var
|
|
504
|
+
Validator: Codeunit "No Series Validator";
|
|
505
|
+
|
|
506
|
+
[EventSubscriber(ObjectType::Codeunit, Codeunit::"No. Series Management", 'OnBeforeGetNextNo', '', false, false)]
|
|
507
|
+
local procedure OnBeforeGetNextNo(NoSeriesCode: Code[20]; SeriesDate: Date; var NoSeriesLine: Record "No. Series Line")
|
|
508
|
+
begin
|
|
509
|
+
ValidateBeforeGeneration(NoSeriesCode, NoSeriesLine);
|
|
510
|
+
end;
|
|
511
|
+
|
|
512
|
+
[EventSubscriber(ObjectType::Codeunit, Codeunit::"No. Series Management", 'OnAfterGetNextNo', '', false, false)]
|
|
513
|
+
local procedure OnAfterGetNextNo(NoSeriesCode: Code[20]; SeriesDate: Date; var NoSeriesLine: Record "No. Series Line"; var NextNo: Code[20])
|
|
514
|
+
begin
|
|
515
|
+
ValidateAfterGeneration(NoSeriesCode, NextNo, NoSeriesLine);
|
|
516
|
+
end;
|
|
517
|
+
|
|
518
|
+
local procedure ValidateBeforeGeneration(NoSeriesCode: Code[20]; NoSeriesLine: Record "No. Series Line")
|
|
519
|
+
var
|
|
520
|
+
ValidationErrors: List of [Text];
|
|
521
|
+
ErrorText: Text;
|
|
522
|
+
begin
|
|
523
|
+
if not Validator.ValidateSequence(NoSeriesCode) then begin
|
|
524
|
+
ValidationErrors := Validator.GetValidationErrors();
|
|
525
|
+
foreach ErrorText in ValidationErrors do
|
|
526
|
+
Error('No. Series validation failed: %1', ErrorText);
|
|
527
|
+
end;
|
|
528
|
+
end;
|
|
529
|
+
|
|
530
|
+
local procedure ValidateAfterGeneration(NoSeriesCode: Code[20]; NextNo: Code[20]; NoSeriesLine: Record "No. Series Line")
|
|
531
|
+
var
|
|
532
|
+
ValidationErrors: List of [Text];
|
|
533
|
+
ErrorText: Text;
|
|
534
|
+
begin
|
|
535
|
+
if not Validator.ValidateFormat(NoSeriesCode, NextNo) then begin
|
|
536
|
+
ValidationErrors := Validator.GetValidationErrors();
|
|
537
|
+
foreach ErrorText in ValidationErrors do
|
|
538
|
+
Error('Generated number validation failed: %1', ErrorText);
|
|
539
|
+
end;
|
|
540
|
+
|
|
541
|
+
// Log successful generation
|
|
542
|
+
LogNumberGeneration(NoSeriesCode, NextNo);
|
|
543
|
+
end;
|
|
544
|
+
|
|
545
|
+
local procedure LogNumberGeneration(NoSeriesCode: Code[20]; GeneratedNo: Code[20])
|
|
546
|
+
var
|
|
547
|
+
NoSeriesLog: Record "No. Series Log";
|
|
548
|
+
begin
|
|
549
|
+
NoSeriesLog.Init();
|
|
550
|
+
NoSeriesLog."Entry No." := GetNextLogEntryNo();
|
|
551
|
+
NoSeriesLog."Series Code" := NoSeriesCode;
|
|
552
|
+
NoSeriesLog."Generated No." := GeneratedNo;
|
|
553
|
+
NoSeriesLog."Generation Date" := Today;
|
|
554
|
+
NoSeriesLog."Generation Time" := Time;
|
|
555
|
+
NoSeriesLog."User ID" := UserId;
|
|
556
|
+
NoSeriesLog.Insert(true);
|
|
557
|
+
end;
|
|
558
|
+
|
|
559
|
+
local procedure GetNextLogEntryNo(): Integer
|
|
560
|
+
var
|
|
561
|
+
NoSeriesLog: Record "No. Series Log";
|
|
562
|
+
begin
|
|
563
|
+
if NoSeriesLog.FindLast() then
|
|
564
|
+
exit(NoSeriesLog."Entry No." + 1)
|
|
565
|
+
else
|
|
566
|
+
exit(1);
|
|
567
|
+
end;
|
|
568
|
+
}
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
## Batch Validation Tool
|
|
572
|
+
|
|
573
|
+
```al
|
|
574
|
+
// Comprehensive batch validation for all series
|
|
575
|
+
codeunit 50902 "Batch No Series Validation"
|
|
576
|
+
{
|
|
577
|
+
var
|
|
578
|
+
Validator: Codeunit "No Series Validator";
|
|
579
|
+
|
|
580
|
+
procedure ValidateAllSeries(): Dictionary of [Code[20], List of [Text]]
|
|
581
|
+
var
|
|
582
|
+
NoSeries: Record "No. Series";
|
|
583
|
+
ValidationResults: Dictionary of [Code[20], List of [Text]];
|
|
584
|
+
SeriesErrors: List of [Text];
|
|
585
|
+
begin
|
|
586
|
+
if NoSeries.FindSet() then
|
|
587
|
+
repeat
|
|
588
|
+
Clear(SeriesErrors);
|
|
589
|
+
|
|
590
|
+
// Run comprehensive validation
|
|
591
|
+
if not Validator.ValidateSequence(NoSeries.Code) then
|
|
592
|
+
AddErrors(SeriesErrors, Validator.GetValidationErrors());
|
|
593
|
+
|
|
594
|
+
if not Validator.ValidateIntegrity(NoSeries.Code) then
|
|
595
|
+
AddErrors(SeriesErrors, Validator.GetValidationErrors());
|
|
596
|
+
|
|
597
|
+
ValidationResults.Set(NoSeries.Code, SeriesErrors);
|
|
598
|
+
|
|
599
|
+
until NoSeries.Next() = 0;
|
|
600
|
+
|
|
601
|
+
exit(ValidationResults);
|
|
602
|
+
end;
|
|
603
|
+
|
|
604
|
+
procedure GenerateValidationReport(): Text
|
|
605
|
+
var
|
|
606
|
+
ValidationResults: Dictionary of [Code[20], List of [Text]];
|
|
607
|
+
ReportText: Text;
|
|
608
|
+
SeriesCode: Code[20];
|
|
609
|
+
SeriesErrors: List of [Text];
|
|
610
|
+
ErrorText: Text;
|
|
611
|
+
TotalSeries: Integer;
|
|
612
|
+
SeriesWithErrors: Integer;
|
|
613
|
+
begin
|
|
614
|
+
ValidationResults := ValidateAllSeries();
|
|
615
|
+
TotalSeries := ValidationResults.Count;
|
|
616
|
+
|
|
617
|
+
ReportText := StrSubstNo('No. Series Validation Report - %1\n', CurrentDateTime);
|
|
618
|
+
ReportText += StrSubstNo('Total Series Validated: %1\n\n', TotalSeries);
|
|
619
|
+
|
|
620
|
+
foreach SeriesCode in ValidationResults.Keys do begin
|
|
621
|
+
ValidationResults.Get(SeriesCode, SeriesErrors);
|
|
622
|
+
|
|
623
|
+
if SeriesErrors.Count > 0 then begin
|
|
624
|
+
SeriesWithErrors += 1;
|
|
625
|
+
ReportText += StrSubstNo('Series: %1 (%2 errors)\n', SeriesCode, SeriesErrors.Count);
|
|
626
|
+
|
|
627
|
+
foreach ErrorText in SeriesErrors do
|
|
628
|
+
ReportText += StrSubstNo(' - %1\n', ErrorText);
|
|
629
|
+
|
|
630
|
+
ReportText += '\n';
|
|
631
|
+
end;
|
|
632
|
+
end;
|
|
633
|
+
|
|
634
|
+
ReportText += StrSubstNo('Summary: %1 of %2 series have validation errors.\n', SeriesWithErrors, TotalSeries);
|
|
635
|
+
|
|
636
|
+
exit(ReportText);
|
|
637
|
+
end;
|
|
638
|
+
|
|
639
|
+
procedure FixCommonIssues(): Integer
|
|
640
|
+
var
|
|
641
|
+
ValidationResults: Dictionary of [Code[20], List of [Text]];
|
|
642
|
+
SeriesCode: Code[20];
|
|
643
|
+
SeriesErrors: List of [Text];
|
|
644
|
+
FixedCount: Integer;
|
|
645
|
+
begin
|
|
646
|
+
ValidationResults := ValidateAllSeries();
|
|
647
|
+
|
|
648
|
+
foreach SeriesCode in ValidationResults.Keys do begin
|
|
649
|
+
ValidationResults.Get(SeriesCode, SeriesErrors);
|
|
650
|
+
|
|
651
|
+
if SeriesErrors.Count > 0 then begin
|
|
652
|
+
if FixSeriesIssues(SeriesCode, SeriesErrors) then
|
|
653
|
+
FixedCount += 1;
|
|
654
|
+
end;
|
|
655
|
+
end;
|
|
656
|
+
|
|
657
|
+
exit(FixedCount);
|
|
658
|
+
end;
|
|
659
|
+
|
|
660
|
+
local procedure FixSeriesIssues(SeriesCode: Code[20]; Errors: List of [Text]): Boolean
|
|
661
|
+
var
|
|
662
|
+
ErrorText: Text;
|
|
663
|
+
FixedAny: Boolean;
|
|
664
|
+
begin
|
|
665
|
+
FixedAny := false;
|
|
666
|
+
|
|
667
|
+
foreach ErrorText in Errors do begin
|
|
668
|
+
case true of
|
|
669
|
+
StrPos(ErrorText, 'Stale locks') > 0:
|
|
670
|
+
begin
|
|
671
|
+
CleanupStaleLocks(SeriesCode);
|
|
672
|
+
FixedAny := true;
|
|
673
|
+
end;
|
|
674
|
+
StrPos(ErrorText, 'orphaned references') > 0:
|
|
675
|
+
begin
|
|
676
|
+
CleanupOrphanedReferences(SeriesCode);
|
|
677
|
+
FixedAny := true;
|
|
678
|
+
end;
|
|
679
|
+
end;
|
|
680
|
+
end;
|
|
681
|
+
|
|
682
|
+
exit(FixedAny);
|
|
683
|
+
end;
|
|
684
|
+
|
|
685
|
+
local procedure AddErrors(var TargetList: List of [Text]; SourceList: List of [Text])
|
|
686
|
+
var
|
|
687
|
+
ErrorText: Text;
|
|
688
|
+
begin
|
|
689
|
+
foreach ErrorText in SourceList do
|
|
690
|
+
TargetList.Add(ErrorText);
|
|
691
|
+
end;
|
|
692
|
+
|
|
693
|
+
local procedure CleanupStaleLocks(SeriesCode: Code[20])
|
|
694
|
+
var
|
|
695
|
+
NoSeriesLock: Record "No. Series Lock";
|
|
696
|
+
begin
|
|
697
|
+
NoSeriesLock.SetRange("Series Code", SeriesCode);
|
|
698
|
+
NoSeriesLock.SetFilter("Lock Time", '<%1', CurrentDateTime - 300000);
|
|
699
|
+
NoSeriesLock.DeleteAll(true);
|
|
700
|
+
end;
|
|
701
|
+
|
|
702
|
+
local procedure CleanupOrphanedReferences(SeriesCode: Code[20])
|
|
703
|
+
begin
|
|
704
|
+
// Implement orphaned reference cleanup
|
|
705
|
+
end;
|
|
706
|
+
}
|
|
707
|
+
```
|
|
708
|
+
|
|
709
|
+
## Usage Example
|
|
710
|
+
|
|
711
|
+
```al
|
|
712
|
+
// Example of using validation patterns
|
|
713
|
+
codeunit 50903 "Validation Usage Example"
|
|
714
|
+
{
|
|
715
|
+
procedure DemonstrateValidation()
|
|
716
|
+
var
|
|
717
|
+
Validator: Codeunit "No Series Validator";
|
|
718
|
+
BatchValidator: Codeunit "Batch No Series Validation";
|
|
719
|
+
ValidationReport: Text;
|
|
720
|
+
SeriesCode: Code[20];
|
|
721
|
+
TestNumber: Code[20];
|
|
722
|
+
ValidationErrors: List of [Text];
|
|
723
|
+
ErrorText: Text;
|
|
724
|
+
FixedCount: Integer;
|
|
725
|
+
begin
|
|
726
|
+
SeriesCode := 'SALES-ORDER';
|
|
727
|
+
TestNumber := 'SO-2024-001';
|
|
728
|
+
|
|
729
|
+
// Validate specific number format
|
|
730
|
+
if Validator.ValidateFormat(SeriesCode, TestNumber) then
|
|
731
|
+
Message('Number format validation passed')
|
|
732
|
+
else begin
|
|
733
|
+
ValidationErrors := Validator.GetValidationErrors();
|
|
734
|
+
foreach ErrorText in ValidationErrors do
|
|
735
|
+
Message('Format error: %1', ErrorText);
|
|
736
|
+
end;
|
|
737
|
+
|
|
738
|
+
// Validate sequence integrity
|
|
739
|
+
if Validator.ValidateSequence(SeriesCode) then
|
|
740
|
+
Message('Sequence validation passed')
|
|
741
|
+
else begin
|
|
742
|
+
ValidationErrors := Validator.GetValidationErrors();
|
|
743
|
+
foreach ErrorText in ValidationErrors do
|
|
744
|
+
Message('Sequence error: %1', ErrorText);
|
|
745
|
+
end;
|
|
746
|
+
|
|
747
|
+
// Run batch validation
|
|
748
|
+
ValidationReport := BatchValidator.GenerateValidationReport();
|
|
749
|
+
Message('Validation Report:\n%1', ValidationReport);
|
|
750
|
+
|
|
751
|
+
// Fix common issues
|
|
752
|
+
FixedCount := BatchValidator.FixCommonIssues();
|
|
753
|
+
Message('Fixed %1 series issues automatically', FixedCount);
|
|
754
|
+
end;
|
|
755
|
+
}
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
This comprehensive validation implementation provides robust number sequence integrity checking with real-time validation, batch processing capabilities, and automatic issue remediation for Business Central number series management.
|