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.
Files changed (638) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/dist/cache/cache-manager.d.ts +95 -0
  4. package/dist/cache/cache-manager.d.ts.map +1 -0
  5. package/dist/cache/cache-manager.js +328 -0
  6. package/dist/cache/cache-manager.js.map +1 -0
  7. package/dist/cli/bc-code-intel-cli.d.ts +9 -0
  8. package/dist/cli/bc-code-intel-cli.d.ts.map +1 -0
  9. package/dist/cli/bc-code-intel-cli.js +441 -0
  10. package/dist/cli/bc-code-intel-cli.js.map +1 -0
  11. package/dist/config/config-loader.d.ts +21 -0
  12. package/dist/config/config-loader.d.ts.map +1 -0
  13. package/dist/config/config-loader.js +402 -0
  14. package/dist/config/config-loader.js.map +1 -0
  15. package/dist/config/config-validator.d.ts +84 -0
  16. package/dist/config/config-validator.d.ts.map +1 -0
  17. package/dist/config/config-validator.js +604 -0
  18. package/dist/config/config-validator.js.map +1 -0
  19. package/dist/config/test-config-loader.d.ts +10 -0
  20. package/dist/config/test-config-loader.d.ts.map +1 -0
  21. package/dist/config/test-config-loader.js +135 -0
  22. package/dist/config/test-config-loader.js.map +1 -0
  23. package/dist/config/test-enhanced-layer-service.d.ts +7 -0
  24. package/dist/config/test-enhanced-layer-service.d.ts.map +1 -0
  25. package/dist/config/test-enhanced-layer-service.js +104 -0
  26. package/dist/config/test-enhanced-layer-service.js.map +1 -0
  27. package/dist/config/test-git-layer.d.ts +7 -0
  28. package/dist/config/test-git-layer.d.ts.map +1 -0
  29. package/dist/config/test-git-layer.js +68 -0
  30. package/dist/config/test-git-layer.js.map +1 -0
  31. package/dist/dev/hot-reload.d.ts +91 -0
  32. package/dist/dev/hot-reload.d.ts.map +1 -0
  33. package/dist/dev/hot-reload.js +358 -0
  34. package/dist/dev/hot-reload.js.map +1 -0
  35. package/dist/index.d.ts +57 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +673 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/layers/base-layer.d.ts +83 -0
  40. package/dist/layers/base-layer.d.ts.map +1 -0
  41. package/dist/layers/base-layer.js +166 -0
  42. package/dist/layers/base-layer.js.map +1 -0
  43. package/dist/layers/embedded-layer.d.ts +53 -0
  44. package/dist/layers/embedded-layer.d.ts.map +1 -0
  45. package/dist/layers/embedded-layer.js +238 -0
  46. package/dist/layers/embedded-layer.js.map +1 -0
  47. package/dist/layers/git-layer.d.ts +54 -0
  48. package/dist/layers/git-layer.d.ts.map +1 -0
  49. package/dist/layers/git-layer.js +369 -0
  50. package/dist/layers/git-layer.js.map +1 -0
  51. package/dist/layers/index.d.ts +12 -0
  52. package/dist/layers/index.d.ts.map +1 -0
  53. package/dist/layers/index.js +11 -0
  54. package/dist/layers/index.js.map +1 -0
  55. package/dist/layers/layer-service.d.ts +129 -0
  56. package/dist/layers/layer-service.d.ts.map +1 -0
  57. package/dist/layers/layer-service.js +570 -0
  58. package/dist/layers/layer-service.js.map +1 -0
  59. package/dist/layers/project-layer.d.ts +50 -0
  60. package/dist/layers/project-layer.d.ts.map +1 -0
  61. package/dist/layers/project-layer.js +256 -0
  62. package/dist/layers/project-layer.js.map +1 -0
  63. package/dist/monitoring/production-monitor.d.ts +148 -0
  64. package/dist/monitoring/production-monitor.d.ts.map +1 -0
  65. package/dist/monitoring/production-monitor.js +463 -0
  66. package/dist/monitoring/production-monitor.js.map +1 -0
  67. package/dist/performance/performance-monitor.d.ts +99 -0
  68. package/dist/performance/performance-monitor.d.ts.map +1 -0
  69. package/dist/performance/performance-monitor.js +253 -0
  70. package/dist/performance/performance-monitor.js.map +1 -0
  71. package/dist/sdk/bc-code-intel-client.d.ts +175 -0
  72. package/dist/sdk/bc-code-intel-client.d.ts.map +1 -0
  73. package/dist/sdk/bc-code-intel-client.js +380 -0
  74. package/dist/sdk/bc-code-intel-client.js.map +1 -0
  75. package/dist/search/intelligent-search.d.ts +97 -0
  76. package/dist/search/intelligent-search.d.ts.map +1 -0
  77. package/dist/search/intelligent-search.js +355 -0
  78. package/dist/search/intelligent-search.js.map +1 -0
  79. package/dist/security/access-control.d.ts +110 -0
  80. package/dist/security/access-control.d.ts.map +1 -0
  81. package/dist/security/access-control.js +353 -0
  82. package/dist/security/access-control.js.map +1 -0
  83. package/dist/services/code-analysis-service.d.ts +72 -0
  84. package/dist/services/code-analysis-service.d.ts.map +1 -0
  85. package/dist/services/code-analysis-service.js +811 -0
  86. package/dist/services/code-analysis-service.js.map +1 -0
  87. package/dist/services/knowledge-service.d.ts +91 -0
  88. package/dist/services/knowledge-service.d.ts.map +1 -0
  89. package/dist/services/knowledge-service.js +370 -0
  90. package/dist/services/knowledge-service.js.map +1 -0
  91. package/dist/services/methodology-service.d.ts +91 -0
  92. package/dist/services/methodology-service.d.ts.map +1 -0
  93. package/dist/services/methodology-service.js +408 -0
  94. package/dist/services/methodology-service.js.map +1 -0
  95. package/dist/services/workflow-service.d.ts +132 -0
  96. package/dist/services/workflow-service.d.ts.map +1 -0
  97. package/dist/services/workflow-service.js +277 -0
  98. package/dist/services/workflow-service.js.map +1 -0
  99. package/dist/setup/post-install.d.ts +12 -0
  100. package/dist/setup/post-install.d.ts.map +1 -0
  101. package/dist/setup/post-install.js +81 -0
  102. package/dist/setup/post-install.js.map +1 -0
  103. package/dist/streamlined-handlers.d.ts +51 -0
  104. package/dist/streamlined-handlers.d.ts.map +1 -0
  105. package/dist/streamlined-handlers.js +287 -0
  106. package/dist/streamlined-handlers.js.map +1 -0
  107. package/dist/streamlined-tools.d.ts +316 -0
  108. package/dist/streamlined-tools.d.ts.map +1 -0
  109. package/dist/streamlined-tools.js +189 -0
  110. package/dist/streamlined-tools.js.map +1 -0
  111. package/dist/test-enhanced-mcp-server.d.ts +7 -0
  112. package/dist/test-enhanced-mcp-server.d.ts.map +1 -0
  113. package/dist/test-enhanced-mcp-server.js +177 -0
  114. package/dist/test-enhanced-mcp-server.js.map +1 -0
  115. package/dist/types/bc-knowledge.d.ts +294 -0
  116. package/dist/types/bc-knowledge.d.ts.map +1 -0
  117. package/dist/types/bc-knowledge.js +44 -0
  118. package/dist/types/bc-knowledge.js.map +1 -0
  119. package/dist/types/config-types.d.ts +180 -0
  120. package/dist/types/config-types.d.ts.map +1 -0
  121. package/dist/types/config-types.js +104 -0
  122. package/dist/types/config-types.js.map +1 -0
  123. package/dist/types/index.d.ts +5 -0
  124. package/dist/types/index.d.ts.map +1 -0
  125. package/dist/types/index.js +7 -0
  126. package/dist/types/index.js.map +1 -0
  127. package/dist/types/layer-types.d.ts +171 -0
  128. package/dist/types/layer-types.d.ts.map +1 -0
  129. package/dist/types/layer-types.js +27 -0
  130. package/dist/types/layer-types.js.map +1 -0
  131. package/dist/types/persona-types.d.ts +77 -0
  132. package/dist/types/persona-types.d.ts.map +1 -0
  133. package/dist/types/persona-types.js +341 -0
  134. package/dist/types/persona-types.js.map +1 -0
  135. package/dist/utils/path-utils.d.ts +5 -0
  136. package/dist/utils/path-utils.d.ts.map +1 -0
  137. package/dist/utils/path-utils.js +14 -0
  138. package/dist/utils/path-utils.js.map +1 -0
  139. package/dist/workflows/domain-workflows.d.ts +8 -0
  140. package/dist/workflows/domain-workflows.d.ts.map +1 -0
  141. package/dist/workflows/domain-workflows.js +360 -0
  142. package/dist/workflows/domain-workflows.js.map +1 -0
  143. package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +24 -0
  144. package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +24 -0
  145. package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +30 -0
  146. package/embedded-knowledge/AGENTS.md +69 -0
  147. package/embedded-knowledge/CONTRIBUTING.md +58 -0
  148. package/embedded-knowledge/LICENSE +21 -0
  149. package/embedded-knowledge/README.md +15 -0
  150. package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +90 -0
  151. package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +113 -0
  152. package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +101 -0
  153. package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +87 -0
  154. package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +155 -0
  155. package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +138 -0
  156. package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +79 -0
  157. package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +280 -0
  158. package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +200 -0
  159. package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +565 -0
  160. package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +665 -0
  161. package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +325 -0
  162. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +696 -0
  163. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +320 -0
  164. package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +102 -0
  165. package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +433 -0
  166. package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +66 -0
  167. package/embedded-knowledge/domains/alex-architect/systemid-integration.md +115 -0
  168. package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +295 -0
  169. package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +86 -0
  170. package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +96 -0
  171. package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +70 -0
  172. package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +84 -0
  173. package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +93 -0
  174. package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +73 -0
  175. package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +78 -0
  176. package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +79 -0
  177. package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +87 -0
  178. package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +209 -0
  179. package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +246 -0
  180. package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +107 -0
  181. package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +105 -0
  182. package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +186 -0
  183. package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +60 -0
  184. package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +139 -0
  185. package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +190 -0
  186. package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +516 -0
  187. package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +298 -0
  188. package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +324 -0
  189. package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +344 -0
  190. package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +137 -0
  191. package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +340 -0
  192. package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +810 -0
  193. package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +86 -0
  194. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +110 -0
  195. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +758 -0
  196. package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +665 -0
  197. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +316 -0
  198. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +223 -0
  199. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +149 -0
  200. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +412 -0
  201. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +211 -0
  202. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +155 -0
  203. package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +475 -0
  204. package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +238 -0
  205. package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +97 -0
  206. package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +666 -0
  207. package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +319 -0
  208. package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +236 -0
  209. package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +59 -0
  210. package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +67 -0
  211. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +70 -0
  212. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +90 -0
  213. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +87 -0
  214. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +70 -0
  215. package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +74 -0
  216. package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +81 -0
  217. package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +56 -0
  218. package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +66 -0
  219. package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +79 -0
  220. package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +78 -0
  221. package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +83 -0
  222. package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +76 -0
  223. package/embedded-knowledge/domains/dean-debug/testfield-performance.md +104 -0
  224. package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +145 -0
  225. package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +104 -0
  226. package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +114 -0
  227. package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +356 -0
  228. package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +256 -0
  229. package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +101 -0
  230. package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +108 -0
  231. package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +80 -0
  232. package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +98 -0
  233. package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +123 -0
  234. package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +96 -0
  235. package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +115 -0
  236. package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +115 -0
  237. package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +114 -0
  238. package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +395 -0
  239. package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +479 -0
  240. package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +548 -0
  241. package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +287 -0
  242. package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +434 -0
  243. package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +508 -0
  244. package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +615 -0
  245. package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +144 -0
  246. package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +96 -0
  247. package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +124 -0
  248. package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +84 -0
  249. package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +75 -0
  250. package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +96 -0
  251. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +385 -0
  252. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +72 -0
  253. package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +48 -0
  254. package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +49 -0
  255. package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +67 -0
  256. package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +119 -0
  257. package/embedded-knowledge/domains/quinn-tester/rule-execution.md +123 -0
  258. package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +64 -0
  259. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +60 -0
  260. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +83 -0
  261. package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +716 -0
  262. package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +101 -0
  263. package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +91 -0
  264. package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +79 -0
  265. package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +79 -0
  266. package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +89 -0
  267. package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +76 -0
  268. package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +76 -0
  269. package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +76 -0
  270. package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +81 -0
  271. package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +76 -0
  272. package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +75 -0
  273. package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +76 -0
  274. package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +76 -0
  275. package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +76 -0
  276. package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +96 -0
  277. package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +76 -0
  278. package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +86 -0
  279. package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +90 -0
  280. package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +82 -0
  281. package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +78 -0
  282. package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +76 -0
  283. package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +78 -0
  284. package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +100 -0
  285. package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +115 -0
  286. package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +124 -0
  287. package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +110 -0
  288. package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +438 -0
  289. package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +255 -0
  290. package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +209 -0
  291. package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +218 -0
  292. package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +218 -0
  293. package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +280 -0
  294. package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +188 -0
  295. package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +245 -0
  296. package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +244 -0
  297. package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +278 -0
  298. package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +484 -0
  299. package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +64 -0
  300. package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +107 -0
  301. package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +280 -0
  302. package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +75 -0
  303. package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +67 -0
  304. package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +76 -0
  305. package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +98 -0
  306. package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +128 -0
  307. package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +75 -0
  308. package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +95 -0
  309. package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +141 -0
  310. package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +91 -0
  311. package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +118 -0
  312. package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +111 -0
  313. package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +113 -0
  314. package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +127 -0
  315. package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +141 -0
  316. package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +66 -0
  317. package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +96 -0
  318. package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +161 -0
  319. package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +177 -0
  320. package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +239 -0
  321. package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +346 -0
  322. package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +298 -0
  323. package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +677 -0
  324. package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +117 -0
  325. package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +75 -0
  326. package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +169 -0
  327. package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +399 -0
  328. package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +356 -0
  329. package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +889 -0
  330. package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +84 -0
  331. package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +127 -0
  332. package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +89 -0
  333. package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +516 -0
  334. package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +61 -0
  335. package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +427 -0
  336. package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +122 -0
  337. package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +96 -0
  338. package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +101 -0
  339. package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +149 -0
  340. package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +107 -0
  341. package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +95 -0
  342. package/embedded-knowledge/domains/seth-security/api-permission-model.md +115 -0
  343. package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +78 -0
  344. package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +373 -0
  345. package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +308 -0
  346. package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +79 -0
  347. package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +78 -0
  348. package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +81 -0
  349. package/embedded-knowledge/indexes/bc-version-matrix.json +188 -0
  350. package/embedded-knowledge/indexes/domain-catalog.json +106 -0
  351. package/embedded-knowledge/indexes/tags/abbreviations.json +1 -0
  352. package/embedded-knowledge/indexes/tags/abstraction.json +1 -0
  353. package/embedded-knowledge/indexes/tags/access-control.json +1 -0
  354. package/embedded-knowledge/indexes/tags/accessibility.json +1 -0
  355. package/embedded-knowledge/indexes/tags/actions.json +1 -0
  356. package/embedded-knowledge/indexes/tags/advanced-patterns.json +1 -0
  357. package/embedded-knowledge/indexes/tags/advanced.json +1 -0
  358. package/embedded-knowledge/indexes/tags/al-extension.json +1 -0
  359. package/embedded-knowledge/indexes/tags/al-generics.json +1 -0
  360. package/embedded-knowledge/indexes/tags/al-objects.json +1 -0
  361. package/embedded-knowledge/indexes/tags/al-syntax.json +1 -0
  362. package/embedded-knowledge/indexes/tags/algorithm-structure.json +1 -0
  363. package/embedded-knowledge/indexes/tags/alternatives.json +1 -0
  364. package/embedded-knowledge/indexes/tags/analytics.json +1 -0
  365. package/embedded-knowledge/indexes/tags/api-delegates.json +1 -0
  366. package/embedded-knowledge/indexes/tags/api-design.json +1 -0
  367. package/embedded-knowledge/indexes/tags/api-documentation.json +1 -0
  368. package/embedded-knowledge/indexes/tags/api-endpoints.json +1 -0
  369. package/embedded-knowledge/indexes/tags/api-extensibility.json +1 -0
  370. package/embedded-knowledge/indexes/tags/api-fieldsets.json +1 -0
  371. package/embedded-knowledge/indexes/tags/api-integration.json +1 -0
  372. package/embedded-knowledge/indexes/tags/api-interfaces.json +1 -0
  373. package/embedded-knowledge/indexes/tags/api-optimization.json +1 -0
  374. package/embedded-knowledge/indexes/tags/api-pages.json +1 -0
  375. package/embedded-knowledge/indexes/tags/api-patterns.json +1 -0
  376. package/embedded-knowledge/indexes/tags/api-permissions.json +1 -0
  377. package/embedded-knowledge/indexes/tags/api-responses.json +1 -0
  378. package/embedded-knowledge/indexes/tags/api-simplification.json +1 -0
  379. package/embedded-knowledge/indexes/tags/api.json +1 -0
  380. package/embedded-knowledge/indexes/tags/architecture.json +1 -0
  381. package/embedded-knowledge/indexes/tags/async-patterns.json +1 -0
  382. package/embedded-knowledge/indexes/tags/async-processing.json +1 -0
  383. package/embedded-knowledge/indexes/tags/automatic-registration.json +1 -0
  384. package/embedded-knowledge/indexes/tags/batch-operations.json +1 -0
  385. package/embedded-knowledge/indexes/tags/bc24-migration.json +1 -0
  386. package/embedded-knowledge/indexes/tags/begin-blocks.json +1 -0
  387. package/embedded-knowledge/indexes/tags/begin-end.json +1 -0
  388. package/embedded-knowledge/indexes/tags/behavioral-patterns.json +1 -0
  389. package/embedded-knowledge/indexes/tags/best-practices.json +1 -0
  390. package/embedded-knowledge/indexes/tags/binding.json +1 -0
  391. package/embedded-knowledge/indexes/tags/block-structure.json +1 -0
  392. package/embedded-knowledge/indexes/tags/blocks.json +1 -0
  393. package/embedded-knowledge/indexes/tags/boolean-expressions.json +1 -0
  394. package/embedded-knowledge/indexes/tags/branching.json +1 -0
  395. package/embedded-knowledge/indexes/tags/breaking-changes.json +1 -0
  396. package/embedded-knowledge/indexes/tags/breakpoints.json +1 -0
  397. package/embedded-knowledge/indexes/tags/business-foundation.json +1 -0
  398. package/embedded-knowledge/indexes/tags/business-infrastructure.json +1 -0
  399. package/embedded-knowledge/indexes/tags/business-process.json +1 -0
  400. package/embedded-knowledge/indexes/tags/business-rules.json +1 -0
  401. package/embedded-knowledge/indexes/tags/caching.json +1 -0
  402. package/embedded-knowledge/indexes/tags/case-statements.json +1 -0
  403. package/embedded-knowledge/indexes/tags/case.json +1 -0
  404. package/embedded-knowledge/indexes/tags/code-analysis.json +1 -0
  405. package/embedded-knowledge/indexes/tags/code-clarity.json +1 -0
  406. package/embedded-knowledge/indexes/tags/code-comprehension.json +1 -0
  407. package/embedded-knowledge/indexes/tags/code-conversion.json +1 -0
  408. package/embedded-knowledge/indexes/tags/code-formatting.json +1 -0
  409. package/embedded-knowledge/indexes/tags/code-organization.json +1 -0
  410. package/embedded-knowledge/indexes/tags/code-patterns.json +1 -0
  411. package/embedded-knowledge/indexes/tags/code-quality.json +1 -0
  412. package/embedded-knowledge/indexes/tags/code-reuse.json +1 -0
  413. package/embedded-knowledge/indexes/tags/code-simplification.json +1 -0
  414. package/embedded-knowledge/indexes/tags/code-standards.json +1 -0
  415. package/embedded-knowledge/indexes/tags/code-structure.json +1 -0
  416. package/embedded-knowledge/indexes/tags/code-style.json +1 -0
  417. package/embedded-knowledge/indexes/tags/codeunit-design.json +1 -0
  418. package/embedded-knowledge/indexes/tags/command-queue.json +1 -0
  419. package/embedded-knowledge/indexes/tags/comments.json +1 -0
  420. package/embedded-knowledge/indexes/tags/compile-time-validation.json +1 -0
  421. package/embedded-knowledge/indexes/tags/complex-facade.json +1 -0
  422. package/embedded-knowledge/indexes/tags/complexity-hiding.json +1 -0
  423. package/embedded-knowledge/indexes/tags/complexity-management.json +1 -0
  424. package/embedded-knowledge/indexes/tags/compound-statements.json +1 -0
  425. package/embedded-knowledge/indexes/tags/concurrency.json +1 -0
  426. package/embedded-knowledge/indexes/tags/conditional-logic.json +1 -0
  427. package/embedded-knowledge/indexes/tags/conditional.json +1 -0
  428. package/embedded-knowledge/indexes/tags/conflict-resolution.json +1 -0
  429. package/embedded-knowledge/indexes/tags/consistency.json +1 -0
  430. package/embedded-knowledge/indexes/tags/contract-design.json +1 -0
  431. package/embedded-knowledge/indexes/tags/control-flow.json +1 -0
  432. package/embedded-knowledge/indexes/tags/conversion-guide.json +1 -0
  433. package/embedded-knowledge/indexes/tags/correlation.json +1 -0
  434. package/embedded-knowledge/indexes/tags/custom-messages.json +1 -0
  435. package/embedded-knowledge/indexes/tags/data-access.json +1 -0
  436. package/embedded-knowledge/indexes/tags/data-exposure.json +1 -0
  437. package/embedded-knowledge/indexes/tags/data-integrity.json +1 -0
  438. package/embedded-knowledge/indexes/tags/data-loading.json +1 -0
  439. package/embedded-knowledge/indexes/tags/data-manipulation.json +1 -0
  440. package/embedded-knowledge/indexes/tags/data-modeling.json +1 -0
  441. package/embedded-knowledge/indexes/tags/data-patterns.json +1 -0
  442. package/embedded-knowledge/indexes/tags/data-protection.json +1 -0
  443. package/embedded-knowledge/indexes/tags/data-validation.json +1 -0
  444. package/embedded-knowledge/indexes/tags/database.json +1 -0
  445. package/embedded-knowledge/indexes/tags/debugging.json +1 -0
  446. package/embedded-knowledge/indexes/tags/decision-making.json +1 -0
  447. package/embedded-knowledge/indexes/tags/declaration.json +1 -0
  448. package/embedded-knowledge/indexes/tags/default-messages.json +1 -0
  449. package/embedded-knowledge/indexes/tags/defensive-programming.json +1 -0
  450. package/embedded-knowledge/indexes/tags/deleteall.json +1 -0
  451. package/embedded-knowledge/indexes/tags/dependencies.json +1 -0
  452. package/embedded-knowledge/indexes/tags/deployment.json +1 -0
  453. package/embedded-knowledge/indexes/tags/developer-productivity.json +1 -0
  454. package/embedded-knowledge/indexes/tags/development-workflow.json +1 -0
  455. package/embedded-knowledge/indexes/tags/diagnostics.json +1 -0
  456. package/embedded-knowledge/indexes/tags/dimensions.json +1 -0
  457. package/embedded-knowledge/indexes/tags/documentation.json +1 -0
  458. package/embedded-knowledge/indexes/tags/early-exit.json +1 -0
  459. package/embedded-knowledge/indexes/tags/else-clauses.json +1 -0
  460. package/embedded-knowledge/indexes/tags/end-statements.json +1 -0
  461. package/embedded-knowledge/indexes/tags/enterprise-patterns.json +1 -0
  462. package/embedded-knowledge/indexes/tags/entity-relationships.json +1 -0
  463. package/embedded-knowledge/indexes/tags/error-handling.json +1 -0
  464. package/embedded-knowledge/indexes/tags/error-messages.json +1 -0
  465. package/embedded-knowledge/indexes/tags/error-prevention.json +1 -0
  466. package/embedded-knowledge/indexes/tags/error-text.json +1 -0
  467. package/embedded-knowledge/indexes/tags/etag.json +1 -0
  468. package/embedded-knowledge/indexes/tags/event-bridge.json +1 -0
  469. package/embedded-knowledge/indexes/tags/event-payload.json +1 -0
  470. package/embedded-knowledge/indexes/tags/event-routing.json +1 -0
  471. package/embedded-knowledge/indexes/tags/events.json +1 -0
  472. package/embedded-knowledge/indexes/tags/execution-flow.json +1 -0
  473. package/embedded-knowledge/indexes/tags/expressions.json +1 -0
  474. package/embedded-knowledge/indexes/tags/extensibility.json +1 -0
  475. package/embedded-knowledge/indexes/tags/extensions.json +1 -0
  476. package/embedded-knowledge/indexes/tags/facade-composition.json +1 -0
  477. package/embedded-knowledge/indexes/tags/facade-pattern.json +1 -0
  478. package/embedded-knowledge/indexes/tags/field-control.json +1 -0
  479. package/embedded-knowledge/indexes/tags/field-exclusion.json +1 -0
  480. package/embedded-knowledge/indexes/tags/field-registration.json +1 -0
  481. package/embedded-knowledge/indexes/tags/field-state.json +1 -0
  482. package/embedded-knowledge/indexes/tags/field-validation.json +1 -0
  483. package/embedded-knowledge/indexes/tags/fielderror.json +1 -0
  484. package/embedded-knowledge/indexes/tags/fields.json +1 -0
  485. package/embedded-knowledge/indexes/tags/filtering.json +1 -0
  486. package/embedded-knowledge/indexes/tags/filters.json +1 -0
  487. package/embedded-knowledge/indexes/tags/formatting.json +1 -0
  488. package/embedded-knowledge/indexes/tags/generic-methods.json +1 -0
  489. package/embedded-knowledge/indexes/tags/http-status.json +1 -0
  490. package/embedded-knowledge/indexes/tags/if-statements.json +1 -0
  491. package/embedded-knowledge/indexes/tags/implementation.json +1 -0
  492. package/embedded-knowledge/indexes/tags/indentation.json +1 -0
  493. package/embedded-knowledge/indexes/tags/index-summary.json +277 -0
  494. package/embedded-knowledge/indexes/tags/indexing.json +1 -0
  495. package/embedded-knowledge/indexes/tags/inheritance.json +1 -0
  496. package/embedded-knowledge/indexes/tags/integration.json +1 -0
  497. package/embedded-knowledge/indexes/tags/integrity-checking.json +1 -0
  498. package/embedded-knowledge/indexes/tags/intellisense.json +1 -0
  499. package/embedded-knowledge/indexes/tags/interface-design.json +1 -0
  500. package/embedded-knowledge/indexes/tags/interface-segregation.json +1 -0
  501. package/embedded-knowledge/indexes/tags/isolation.json +1 -0
  502. package/embedded-knowledge/indexes/tags/job-processing.json +1 -0
  503. package/embedded-knowledge/indexes/tags/keyboard-navigation.json +1 -0
  504. package/embedded-knowledge/indexes/tags/keywords.json +1 -0
  505. package/embedded-knowledge/indexes/tags/legacy-modernization.json +1 -0
  506. package/embedded-knowledge/indexes/tags/line-breaks.json +1 -0
  507. package/embedded-knowledge/indexes/tags/line-organization.json +1 -0
  508. package/embedded-knowledge/indexes/tags/line-positioning.json +1 -0
  509. package/embedded-knowledge/indexes/tags/localization.json +1 -0
  510. package/embedded-knowledge/indexes/tags/logging.json +1 -0
  511. package/embedded-knowledge/indexes/tags/loose-coupling.json +1 -0
  512. package/embedded-knowledge/indexes/tags/maintainability.json +1 -0
  513. package/embedded-knowledge/indexes/tags/memory-management.json +1 -0
  514. package/embedded-knowledge/indexes/tags/memory-optimization.json +1 -0
  515. package/embedded-knowledge/indexes/tags/memory.json +1 -0
  516. package/embedded-knowledge/indexes/tags/message-design.json +1 -0
  517. package/embedded-knowledge/indexes/tags/message-formatting.json +1 -0
  518. package/embedded-knowledge/indexes/tags/message-patterns.json +1 -0
  519. package/embedded-knowledge/indexes/tags/metadata-driven.json +1 -0
  520. package/embedded-knowledge/indexes/tags/method-comparison.json +1 -0
  521. package/embedded-knowledge/indexes/tags/module-architecture.json +1 -0
  522. package/embedded-knowledge/indexes/tags/module-validation.json +1 -0
  523. package/embedded-knowledge/indexes/tags/monitoring.json +1 -0
  524. package/embedded-knowledge/indexes/tags/multi-layer-facade.json +1 -0
  525. package/embedded-knowledge/indexes/tags/multi-tenancy.json +1 -0
  526. package/embedded-knowledge/indexes/tags/multiple-values.json +1 -0
  527. package/embedded-knowledge/indexes/tags/naming-conventions.json +1 -0
  528. package/embedded-knowledge/indexes/tags/naming.json +1 -0
  529. package/embedded-knowledge/indexes/tags/navigation.json +1 -0
  530. package/embedded-knowledge/indexes/tags/nested-statements.json +1 -0
  531. package/embedded-knowledge/indexes/tags/no-series-conversion.json +1 -0
  532. package/embedded-knowledge/indexes/tags/no-series-validation.json +1 -0
  533. package/embedded-knowledge/indexes/tags/no-series.json +1 -0
  534. package/embedded-knowledge/indexes/tags/number-generation.json +1 -0
  535. package/embedded-knowledge/indexes/tags/object-documentation.json +1 -0
  536. package/embedded-knowledge/indexes/tags/odata.json +1 -0
  537. package/embedded-knowledge/indexes/tags/ondelete.json +1 -0
  538. package/embedded-knowledge/indexes/tags/onvalidate.json +1 -0
  539. package/embedded-knowledge/indexes/tags/operation-delegation.json +1 -0
  540. package/embedded-knowledge/indexes/tags/operation-safety.json +1 -0
  541. package/embedded-knowledge/indexes/tags/operators.json +1 -0
  542. package/embedded-knowledge/indexes/tags/optimization.json +1 -0
  543. package/embedded-knowledge/indexes/tags/order.json +1 -0
  544. package/embedded-knowledge/indexes/tags/organization.json +1 -0
  545. package/embedded-knowledge/indexes/tags/pages.json +1 -0
  546. package/embedded-knowledge/indexes/tags/parameters.json +1 -0
  547. package/embedded-knowledge/indexes/tags/patterns.json +1 -0
  548. package/embedded-knowledge/indexes/tags/performance-optimization.json +1 -0
  549. package/embedded-knowledge/indexes/tags/performance.json +1 -0
  550. package/embedded-knowledge/indexes/tags/placement.json +1 -0
  551. package/embedded-knowledge/indexes/tags/posting-codeunits.json +1 -0
  552. package/embedded-knowledge/indexes/tags/posting.json +1 -0
  553. package/embedded-knowledge/indexes/tags/preconditions.json +1 -0
  554. package/embedded-knowledge/indexes/tags/primary-key.json +1 -0
  555. package/embedded-knowledge/indexes/tags/privacy.json +1 -0
  556. package/embedded-knowledge/indexes/tags/process-automation.json +1 -0
  557. package/embedded-knowledge/indexes/tags/production.json +1 -0
  558. package/embedded-knowledge/indexes/tags/productivity.json +1 -0
  559. package/embedded-knowledge/indexes/tags/query-performance.json +1 -0
  560. package/embedded-knowledge/indexes/tags/queue-management.json +1 -0
  561. package/embedded-knowledge/indexes/tags/ranges.json +1 -0
  562. package/embedded-knowledge/indexes/tags/readability.json +1 -0
  563. package/embedded-knowledge/indexes/tags/record-access.json +1 -0
  564. package/embedded-knowledge/indexes/tags/record-methods.json +1 -0
  565. package/embedded-knowledge/indexes/tags/refactoring.json +1 -0
  566. package/embedded-knowledge/indexes/tags/reference.json +1 -0
  567. package/embedded-knowledge/indexes/tags/repeat-loops.json +1 -0
  568. package/embedded-knowledge/indexes/tags/repeat-statement.json +1 -0
  569. package/embedded-knowledge/indexes/tags/runtime-errors.json +1 -0
  570. package/embedded-knowledge/indexes/tags/runtime.json +1 -0
  571. package/embedded-knowledge/indexes/tags/safeguards.json +1 -0
  572. package/embedded-knowledge/indexes/tags/security.json +1 -0
  573. package/embedded-knowledge/indexes/tags/sequence-management.json +1 -0
  574. package/embedded-knowledge/indexes/tags/serialization.json +1 -0
  575. package/embedded-knowledge/indexes/tags/session-logmessage.json +1 -0
  576. package/embedded-knowledge/indexes/tags/session.json +1 -0
  577. package/embedded-knowledge/indexes/tags/setloadfields.json +1 -0
  578. package/embedded-knowledge/indexes/tags/shortcuts.json +1 -0
  579. package/embedded-knowledge/indexes/tags/sift.json +1 -0
  580. package/embedded-knowledge/indexes/tags/singleinstance.json +1 -0
  581. package/embedded-knowledge/indexes/tags/spacing.json +1 -0
  582. package/embedded-knowledge/indexes/tags/sql-translation.json +1 -0
  583. package/embedded-knowledge/indexes/tags/standards.json +1 -0
  584. package/embedded-knowledge/indexes/tags/statements.json +1 -0
  585. package/embedded-knowledge/indexes/tags/streaming.json +1 -0
  586. package/embedded-knowledge/indexes/tags/strong-typing.json +1 -0
  587. package/embedded-knowledge/indexes/tags/structural-patterns.json +1 -0
  588. package/embedded-knowledge/indexes/tags/structure.json +1 -0
  589. package/embedded-knowledge/indexes/tags/subscribers.json +1 -0
  590. package/embedded-knowledge/indexes/tags/switch.json +1 -0
  591. package/embedded-knowledge/indexes/tags/symbol-search.json +1 -0
  592. package/embedded-knowledge/indexes/tags/syntax.json +1 -0
  593. package/embedded-knowledge/indexes/tags/systemid.json +1 -0
  594. package/embedded-knowledge/indexes/tags/table-configuration.json +1 -0
  595. package/embedded-knowledge/indexes/tags/table-events.json +1 -0
  596. package/embedded-knowledge/indexes/tags/table-keys.json +1 -0
  597. package/embedded-knowledge/indexes/tags/table-safety.json +1 -0
  598. package/embedded-knowledge/indexes/tags/task-scheduler.json +1 -0
  599. package/embedded-knowledge/indexes/tags/telemetry.json +1 -0
  600. package/embedded-knowledge/indexes/tags/template-method.json +1 -0
  601. package/embedded-knowledge/indexes/tags/temporary-tables.json +1 -0
  602. package/embedded-knowledge/indexes/tags/testfield.json +1 -0
  603. package/embedded-knowledge/indexes/tags/tradeoffs.json +1 -0
  604. package/embedded-knowledge/indexes/tags/triggers.json +1 -0
  605. package/embedded-knowledge/indexes/tags/troubleshooting.json +1 -0
  606. package/embedded-knowledge/indexes/tags/type-safety.json +1 -0
  607. package/embedded-knowledge/indexes/tags/url-structure.json +1 -0
  608. package/embedded-knowledge/indexes/tags/user-experience.json +1 -0
  609. package/embedded-knowledge/indexes/tags/user-feedback.json +1 -0
  610. package/embedded-knowledge/indexes/tags/user-interface.json +1 -0
  611. package/embedded-knowledge/indexes/tags/validation-feedback.json +1 -0
  612. package/embedded-knowledge/indexes/tags/validation.json +1 -0
  613. package/embedded-knowledge/indexes/tags/variables.json +1 -0
  614. package/embedded-knowledge/indexes/tags/verbosity.json +1 -0
  615. package/embedded-knowledge/indexes/tags/vs-code.json +1 -0
  616. package/embedded-knowledge/indexes/tags/web-services.json +1 -0
  617. package/embedded-knowledge/indexes/tags/workflow-management.json +1 -0
  618. package/embedded-knowledge/indexes/tags/workflow-optimization.json +1 -0
  619. package/embedded-knowledge/indexes/tags/workflow-templates.json +1 -0
  620. package/embedded-knowledge/indexes/tags/workspace.json +1 -0
  621. package/embedded-knowledge/indexes/tags/xml-documentation.json +1 -0
  622. package/embedded-knowledge/indexes/topic-relationships.json +128 -0
  623. package/embedded-knowledge/methodologies/index.json +81 -0
  624. package/embedded-knowledge/methodologies/phases/analysis-full.md +208 -0
  625. package/embedded-knowledge/methodologies/phases/analysis-quick.md +44 -0
  626. package/embedded-knowledge/methodologies/phases/analysis.md +182 -0
  627. package/embedded-knowledge/methodologies/phases/execution-validation-full.md +174 -0
  628. package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +31 -0
  629. package/embedded-knowledge/methodologies/phases/execution-validation.md +174 -0
  630. package/embedded-knowledge/methodologies/phases/performance-full.md +211 -0
  631. package/embedded-knowledge/methodologies/phases/performance-quick.md +32 -0
  632. package/embedded-knowledge/methodologies/phases/performance.md +211 -0
  633. package/embedded-knowledge/methodologies/phases/verification-full.md +162 -0
  634. package/embedded-knowledge/methodologies/phases/verification-quick.md +48 -0
  635. package/embedded-knowledge/methodologies/phases/verification.md +146 -0
  636. package/embedded-knowledge/methodologies/workflow-enforcement.md +142 -0
  637. package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +99 -0
  638. package/package.json +74 -0
@@ -0,0 +1,256 @@
1
+ # FieldError Method Syntax - AL Code Sample
2
+
3
+ ## Basic FieldError Syntax
4
+
5
+ ```al
6
+ // Basic FieldError syntax with automatic message
7
+ table 50100 "Sales Document"
8
+ {
9
+ fields
10
+ {
11
+ field(1; "Document Type"; Enum "Sales Document Type") { }
12
+ field(2; "Document No."; Code[20]) { }
13
+ field(3; "Sell-to Customer No."; Code[20]) { }
14
+ field(10; "Currency Code"; Code[10]) { }
15
+ field(20; "Amount"; Decimal) { }
16
+ }
17
+
18
+ trigger OnInsert()
19
+ begin
20
+ // Validate required fields before insert
21
+ ValidateRequiredFields();
22
+ end;
23
+
24
+ local procedure ValidateRequiredFields()
25
+ begin
26
+ // FieldError assumes validation already failed - no testing performed
27
+ if "Sell-to Customer No." = '' then
28
+ FieldError("Sell-to Customer No."); // Generates: "Sell-to Customer No. must have a value in Sales Document Document Type='Order', Document No.='SO001'."
29
+
30
+ if Amount <= 0 then
31
+ FieldError(Amount); // Generates: "Amount must not be 0 in Sales Document..."
32
+ end;
33
+ }
34
+ ```
35
+
36
+ ## FieldError vs TestField Comparison
37
+
38
+ ```al
39
+ codeunit 50100 "Validation Examples"
40
+ {
41
+ procedure DemonstrateFieldErrorVsTestField()
42
+ var
43
+ SalesHeader: Record "Sales Header";
44
+ Customer: Record Customer;
45
+ begin
46
+ SalesHeader.Get(SalesHeader."Document Type"::Order, 'SO001');
47
+
48
+ // TestField approach - tests condition AND throws error if failed
49
+ SalesHeader.TestField("Sell-to Customer No."); // Tests if empty, then errors
50
+ SalesHeader.TestField(Amount); // Tests if zero, then errors
51
+
52
+ // FieldError approach - assumes you already validated the condition
53
+ if SalesHeader."Sell-to Customer No." = '' then
54
+ SalesHeader.FieldError("Sell-to Customer No."); // Only errors, no testing
55
+
56
+ if SalesHeader.Amount <= 0 then
57
+ SalesHeader.FieldError(Amount, 'must be positive'); // Custom message
58
+
59
+ // Practical usage: FieldError for complex validation logic
60
+ if not Customer.Get(SalesHeader."Sell-to Customer No.") then
61
+ SalesHeader.FieldError("Sell-to Customer No.", 'customer does not exist');
62
+
63
+ if Customer.Blocked <> Customer.Blocked::" " then
64
+ SalesHeader.FieldError("Sell-to Customer No.",
65
+ StrSubstNo('customer is blocked (%1)', Customer.Blocked));
66
+ end;
67
+ }
68
+ ```
69
+
70
+ ## Custom Message Examples
71
+
72
+ ```al
73
+ table 50101 "Purchase Document"
74
+ {
75
+ fields
76
+ {
77
+ field(1; "Document Type"; Enum "Purchase Document Type") { }
78
+ field(2; "Document No."; Code[20]) { }
79
+ field(3; "Buy-from Vendor No."; Code[20]) { }
80
+ field(10; "Expected Receipt Date"; Date) { }
81
+ field(20; "Amount Including VAT"; Decimal) { }
82
+ }
83
+
84
+ procedure ValidateBusinessRules()
85
+ var
86
+ Vendor: Record Vendor;
87
+ begin
88
+ // Custom message examples - note lowercase first word convention
89
+ if "Expected Receipt Date" < WorkDate() then
90
+ FieldError("Expected Receipt Date", 'cannot be in the past');
91
+
92
+ if "Amount Including VAT" > 10000 then
93
+ FieldError("Amount Including VAT", 'exceeds approval limit');
94
+
95
+ // Complex validation with detailed custom message
96
+ if Vendor.Get("Buy-from Vendor No.") then begin
97
+ if Vendor.Blocked <> Vendor.Blocked::" " then
98
+ FieldError("Buy-from Vendor No.",
99
+ StrSubstNo('vendor is blocked for %1', Vendor.Blocked));
100
+
101
+ if (Vendor."Payment Terms Code" = '') and ("Amount Including VAT" > 1000) then
102
+ FieldError("Buy-from Vendor No.",
103
+ 'requires payment terms for amounts over 1000');
104
+ end else
105
+ FieldError("Buy-from Vendor No.", 'vendor does not exist');
106
+ end;
107
+ }
108
+ ```
109
+
110
+ ## Real-World Posting Codeunit Pattern
111
+
112
+ ```al
113
+ codeunit 50102 "Sales Document Validation"
114
+ {
115
+ // Pattern used in standard BC posting codeunits (12, 80, 90)
116
+
117
+ procedure ValidateSalesDocument(var SalesHeader: Record "Sales Header")
118
+ begin
119
+ // Comprehensive validation before posting
120
+ with SalesHeader do begin
121
+ // Required field validation
122
+ if "Sell-to Customer No." = '' then
123
+ FieldError("Sell-to Customer No.");
124
+
125
+ if "Document Date" = 0D then
126
+ FieldError("Document Date");
127
+
128
+ // Business logic validation with custom messages
129
+ if "Posting Date" < "Document Date" then
130
+ FieldError("Posting Date", 'cannot be before document date');
131
+
132
+ if Status <> Status::Released then
133
+ FieldError(Status, 'must be Released before posting');
134
+
135
+ // Complex validation scenarios
136
+ ValidateCustomerCredit(SalesHeader);
137
+ ValidateDimensions(SalesHeader);
138
+ end;
139
+ end;
140
+
141
+ local procedure ValidateCustomerCredit(var SalesHeader: Record "Sales Header")
142
+ var
143
+ Customer: Record Customer;
144
+ CustLedgerEntry: Record "Cust. Ledger Entry";
145
+ RemainingAmount: Decimal;
146
+ begin
147
+ Customer.Get(SalesHeader."Sell-to Customer No.");
148
+
149
+ // Calculate customer's remaining credit
150
+ CustLedgerEntry.SetRange("Customer No.", Customer."No.");
151
+ CustLedgerEntry.SetRange(Open, true);
152
+ CustLedgerEntry.CalcSums("Remaining Amt. (LCY)");
153
+ RemainingAmount := CustLedgerEntry."Remaining Amt. (LCY)";
154
+
155
+ // Validate credit limit
156
+ if (Customer."Credit Limit (LCY)" > 0) and
157
+ (RemainingAmount + SalesHeader."Amount Including VAT" > Customer."Credit Limit (LCY)") then
158
+ SalesHeader.FieldError("Sell-to Customer No.",
159
+ StrSubstNo('credit limit exceeded. Available credit: %1',
160
+ Customer."Credit Limit (LCY)" - RemainingAmount));
161
+ end;
162
+
163
+ local procedure ValidateDimensions(var SalesHeader: Record "Sales Header")
164
+ var
165
+ DimMgt: Codeunit DimensionManagement;
166
+ DimSetID: Integer;
167
+ begin
168
+ DimSetID := SalesHeader."Dimension Set ID";
169
+
170
+ // Validate required dimensions
171
+ if not DimMgt.CheckDimIDComb(DimSetID) then
172
+ SalesHeader.FieldError("Dimension Set ID", 'invalid dimension combination');
173
+
174
+ // Validate dimension values against posting rules
175
+ if not DimMgt.CheckDimValuePosting(DimSetID, DATABASE::"Sales Header", SalesHeader."No.") then
176
+ SalesHeader.FieldError("Dimension Set ID", 'dimension values not allowed for posting');
177
+ end;
178
+ }
179
+ ```
180
+
181
+ ## Advanced FieldError Patterns
182
+
183
+ ```al
184
+ codeunit 50103 "Advanced Validation Patterns"
185
+ {
186
+ // Pattern: Conditional validation with detailed context
187
+ procedure ValidateItemAvailability(var SalesLine: Record "Sales Line")
188
+ var
189
+ Item: Record Item;
190
+ AvailableQty: Decimal;
191
+ begin
192
+ if SalesLine.Type <> SalesLine.Type::Item then
193
+ exit; // Only validate items
194
+
195
+ Item.Get(SalesLine."No.");
196
+ Item.CalcFields(Inventory, "Reserved Qty. on Inventory");
197
+ AvailableQty := Item.Inventory - Item."Reserved Qty. on Inventory";
198
+
199
+ if SalesLine.Quantity > AvailableQty then
200
+ SalesLine.FieldError(Quantity,
201
+ StrSubstNo('exceeds available inventory (%1 available)', AvailableQty));
202
+ end;
203
+
204
+ // Pattern: Multi-field validation with specific field error
205
+ procedure ValidatePriceAndDiscount(var SalesLine: Record "Sales Line")
206
+ begin
207
+ // Validate that discount doesn't exceed unit price
208
+ if (SalesLine."Unit Price" > 0) and
209
+ (SalesLine."Line Discount Amount" > SalesLine."Unit Price" * SalesLine.Quantity) then
210
+ SalesLine.FieldError("Line Discount Amount",
211
+ 'cannot exceed line amount');
212
+
213
+ // Validate price against minimum price rules
214
+ if SalesLine."Unit Price" < GetMinimumPrice(SalesLine) then
215
+ SalesLine.FieldError("Unit Price",
216
+ StrSubstNo('cannot be below minimum price (%1)', GetMinimumPrice(SalesLine)));
217
+ end;
218
+
219
+ local procedure GetMinimumPrice(SalesLine: Record "Sales Line"): Decimal
220
+ var
221
+ Item: Record Item;
222
+ begin
223
+ if Item.Get(SalesLine."No.") then
224
+ exit(Item."Unit Cost" * 1.1) // 10% markup minimum
225
+ else
226
+ exit(0);
227
+ end;
228
+ }
229
+ ```
230
+
231
+ ## Error Context and Message Output Examples
232
+
233
+ ```al
234
+ // When this validation fails:
235
+ procedure ExampleValidationScenarios()
236
+ var
237
+ SalesHeader: Record "Sales Header";
238
+ begin
239
+ SalesHeader."Document Type" := SalesHeader."Document Type"::Order;
240
+ SalesHeader."No." := 'SO001';
241
+ SalesHeader."Sell-to Customer No." := ''; // Empty value
242
+
243
+ // This will generate message:
244
+ // "Sell-to Customer No. must have a value in Sales Header Document Type='Order', No.='SO001'."
245
+ SalesHeader.FieldError("Sell-to Customer No.");
246
+
247
+ // With custom message:
248
+ // "Sell-to Customer No. is required for orders in Sales Header Document Type='Order', No.='SO001'."
249
+ SalesHeader.FieldError("Sell-to Customer No.", 'is required for orders');
250
+
251
+ // For non-empty field with custom message:
252
+ SalesHeader."Sell-to Customer No." := 'INVALID';
253
+ // "Sell-to Customer No. customer does not exist in Sales Header Document Type='Order', No.='SO001'."
254
+ SalesHeader.FieldError("Sell-to Customer No.", 'customer does not exist');
255
+ end;
256
+ ```
@@ -0,0 +1,101 @@
1
+ # Table Safety Validation Patterns
2
+
3
+ ## IsTemporary Safeguard Implementation
4
+ ```al
5
+ procedure ProcessBulkData(var DataBuffer: Record "Data Processing Buffer")
6
+ begin
7
+ // Always validate temporary status before bulk operations
8
+ if not DataBuffer.IsTemporary then
9
+ Error('This procedure requires a temporary table to prevent data corruption.');
10
+
11
+ DataBuffer.Reset();
12
+ if DataBuffer.FindSet() then
13
+ repeat
14
+ ProcessIndividualRecord(DataBuffer);
15
+ DataBuffer.Delete(); // Safe because table is confirmed temporary
16
+ until DataBuffer.Next() = 0;
17
+ end;
18
+ ```
19
+
20
+ ## Database Write Protection
21
+ ```al
22
+ procedure SafeDataManipulation(var TempCustomer: Record Customer temporary)
23
+ var
24
+ Customer: Record Customer;
25
+ begin
26
+ // Validate temporary status before any modifications
27
+ if not TempCustomer.IsTemporary then
28
+ Error('Database safety violation: Expected temporary table for data manipulation.');
29
+
30
+ // Safe to perform destructive operations
31
+ TempCustomer.Reset();
32
+ TempCustomer.DeleteAll();
33
+
34
+ // Load fresh data from permanent table
35
+ Customer.FindSet();
36
+ repeat
37
+ TempCustomer := Customer;
38
+ TempCustomer.Insert();
39
+ until Customer.Next() = 0;
40
+ end;
41
+ ```
42
+
43
+ ## Bulk Operation Validation
44
+ ```al
45
+ procedure ProcessLargeDataSet(var TempItem: Record Item temporary; ProcessingMode: Option Validate,Update,Delete)
46
+ begin
47
+ // Critical safety check for bulk operations
48
+ if not TempItem.IsTemporary then
49
+ Error('Bulk processing operations require temporary tables. This prevents accidental permanent data modification.');
50
+
51
+ case ProcessingMode of
52
+ ProcessingMode::Validate:
53
+ ValidateAllRecords(TempItem);
54
+ ProcessingMode::Update:
55
+ UpdateAllRecords(TempItem);
56
+ ProcessingMode::Delete:
57
+ TempItem.DeleteAll(); // Safe deletion
58
+ end;
59
+ end;
60
+
61
+ local procedure ValidateAllRecords(var TempItem: Record Item temporary)
62
+ begin
63
+ TempItem.Reset();
64
+ if TempItem.FindSet() then
65
+ repeat
66
+ ValidateItemData(TempItem);
67
+ until TempItem.Next() = 0;
68
+ end;
69
+ ```
70
+
71
+ ## Data Integrity Protection
72
+ ```al
73
+ procedure SecureDataProcessing(var WorkingTable: Record "Working Data Buffer")
74
+ var
75
+ OriginalFilters: Text;
76
+ begin
77
+ // Mandatory safety validation
78
+ if not WorkingTable.IsTemporary then
79
+ Error('Data integrity protection: This operation requires a temporary working table.');
80
+
81
+ OriginalFilters := WorkingTable.GetFilters();
82
+
83
+ try
84
+ WorkingTable.Reset();
85
+ ProcessAllRecords(WorkingTable);
86
+ finally
87
+ // Restore original state
88
+ WorkingTable.Reset();
89
+ WorkingTable.SetView(OriginalFilters);
90
+ end;
91
+ end;
92
+
93
+ local procedure ProcessAllRecords(var WorkingTable: Record "Working Data Buffer")
94
+ begin
95
+ if WorkingTable.FindSet(true) then
96
+ repeat
97
+ WorkingTable."Processing Status" := WorkingTable."Processing Status"::Completed;
98
+ WorkingTable.Modify();
99
+ until WorkingTable.Next() = 0;
100
+ end;
101
+ ```
@@ -0,0 +1,108 @@
1
+ # TestField Error Handling Patterns
2
+
3
+ ## Try-Catch with TestField
4
+ ```al
5
+ procedure ValidateDocumentSafely(var SalesHeader: Record "Sales Header"): Boolean
6
+ begin
7
+ if not TryValidateDocument(SalesHeader) then begin
8
+ LogValidationError(GetLastErrorText());
9
+ exit(false);
10
+ end;
11
+ exit(true);
12
+ end;
13
+
14
+ local procedure TryValidateDocument(var SalesHeader: Record "Sales Header")
15
+ begin
16
+ SalesHeader.TestField("Document Type");
17
+ SalesHeader.TestField("No.");
18
+ SalesHeader.TestField("Sell-to Customer No.");
19
+ end;
20
+ ```
21
+
22
+ ## Batch Validation with Error Collection
23
+ ```al
24
+ procedure ValidateCustomerBatch(var TempCustomer: Record Customer temporary): Text
25
+ var
26
+ ErrorMessages: Text;
27
+ Customer: Record Customer;
28
+ begin
29
+ TempCustomer.Reset();
30
+ if TempCustomer.FindSet() then
31
+ repeat
32
+ Customer := TempCustomer;
33
+ if not TryValidateCustomer(Customer) then
34
+ ErrorMessages += StrSubstNo('Customer %1: %2\', Customer."No.", GetLastErrorText());
35
+ until TempCustomer.Next() = 0;
36
+
37
+ exit(ErrorMessages);
38
+ end;
39
+
40
+ local procedure TryValidateCustomer(Customer: Record Customer): Boolean
41
+ begin
42
+ Customer.TestField(Name);
43
+ Customer.TestField("Customer Posting Group");
44
+ exit(true);
45
+ end;
46
+ ```
47
+
48
+ ## Conditional TestField with Fallback
49
+ ```al
50
+ procedure ValidateVendorWithDefaults(var Vendor: Record Vendor)
51
+ var
52
+ VendorPostingGroup: Record "Vendor Posting Group";
53
+ begin
54
+ if not TryTestVendorFields(Vendor) then begin
55
+ // Apply defaults and retry
56
+ if Vendor."Vendor Posting Group" = '' then begin
57
+ VendorPostingGroup.FindFirst();
58
+ Vendor."Vendor Posting Group" := VendorPostingGroup.Code;
59
+ end;
60
+
61
+ // Retry validation
62
+ Vendor.TestField("Vendor Posting Group");
63
+ end;
64
+ end;
65
+
66
+ local procedure TryTestVendorFields(Vendor: Record Vendor): Boolean
67
+ begin
68
+ Vendor.TestField("Vendor Posting Group");
69
+ exit(true);
70
+ end;
71
+ ```
72
+
73
+ ## Graceful Degradation Pattern
74
+ ```al
75
+ procedure ProcessOrderWithValidation(var SalesHeader: Record "Sales Header"): Boolean
76
+ var
77
+ ValidationLevel: Integer;
78
+ begin
79
+ // Try strict validation first
80
+ ValidationLevel := 1;
81
+ if TryValidateOrderStrict(SalesHeader) then
82
+ exit(true);
83
+
84
+ // Fall back to basic validation
85
+ ValidationLevel := 2;
86
+ if TryValidateOrderBasic(SalesHeader) then begin
87
+ LogWarning('Order %1 processed with basic validation only', SalesHeader."No.");
88
+ exit(true);
89
+ end;
90
+
91
+ exit(false);
92
+ end;
93
+
94
+ local procedure TryValidateOrderStrict(SalesHeader: Record "Sales Header"): Boolean
95
+ begin
96
+ SalesHeader.TestField("External Document No.");
97
+ SalesHeader.TestField("Requested Delivery Date");
98
+ SalesHeader.TestField("Shipment Method Code");
99
+ exit(true);
100
+ end;
101
+
102
+ local procedure TryValidateOrderBasic(SalesHeader: Record "Sales Header"): Boolean
103
+ begin
104
+ SalesHeader.TestField("Sell-to Customer No.");
105
+ SalesHeader.TestField("Order Date");
106
+ exit(true);
107
+ end;
108
+ ```
@@ -0,0 +1,80 @@
1
+ ---
2
+ title: "TestField Error Handling and Custom Messages"
3
+ domain: "eva-errors"
4
+ difficulty: "intermediate"
5
+ bc_versions: "14+"
6
+ tags: ["error-handling", "validation", "user-experience", "custom-messages"]
7
+ prerequisites: ["testfield-basic-syntax", "error-handling-fundamentals"]
8
+ samples: "samples/testfield-error-handling.md"
9
+ ---
10
+ # TestField Error Handling and Custom Messages
11
+
12
+ ## Overview
13
+
14
+ TestField generates automatic error messages, but business scenarios often require custom error handling and messaging. Understanding TestField error behavior enables better user experience and error management strategies.
15
+
16
+ **Key Principle**: TestField errors are runtime exceptions that halt procedure execution unless caught and handled.
17
+
18
+ ## Default Error Behavior
19
+
20
+ ### Standard Error Messages
21
+ TestField generates system messages like "You must specify Name in Customer" when validation fails. These messages include:
22
+ - Field caption from table definition
23
+ - Table name
24
+ - Current record context when available
25
+
26
+ ### Error Flow Impact
27
+ TestField errors immediately terminate current procedure execution. Control returns to calling code or user interface with error state.
28
+
29
+ ## Custom Error Handling Patterns
30
+
31
+ ### Try-Function Approach
32
+ Wrap TestField calls in TryFunction procedures to catch validation errors without terminating execution. Returns boolean success indicator for error-tolerant processing scenarios.
33
+
34
+ ### Custom Validation with Better Messages
35
+ Replace TestField with custom validation logic when business context requires specific error messages. Provides more meaningful feedback to users than system-generated messages.
36
+
37
+ ### Conditional TestField Usage
38
+ Apply TestField validation based on business rules or record state. Ensures appropriate validation intensity for different scenarios without over-validating.
39
+
40
+ ## Advanced Error Management
41
+
42
+ ### Error Context Enhancement
43
+ Capture TestField errors using TryFunction pattern and enhance with business context before re-throwing. Provides users with meaningful error information including document details.
44
+
45
+ ### Multiple Field Validation with Aggregated Errors
46
+ Collect multiple validation failures before reporting to users. Improves user experience by showing all validation issues at once rather than one-by-one error correction.
47
+
48
+ ## Integration with Business Logic
49
+
50
+ ### Workflow Integration
51
+ TestField works seamlessly with workflow validations. Use TestField for mandatory data checks within workflow step validations.
52
+
53
+ ### API Integration
54
+ For API endpoints, catch TestField errors and return structured error responses rather than allowing raw BC errors to propagate.
55
+
56
+ ### Batch Processing
57
+ In batch processing scenarios, use TryFunction pattern to continue processing other records when individual record validation fails.
58
+
59
+ ## User Experience Considerations
60
+
61
+ ### Progressive Validation
62
+ Validate fields in logical order so users get meaningful first-error feedback rather than random field validation failures.
63
+
64
+ ### Context-Aware Messages
65
+ Include business context in custom error messages to help users understand why specific fields are required.
66
+
67
+ ### Field Focus Integration
68
+ Custom validation procedures can integrate with page field focus to direct users to specific fields requiring attention.
69
+
70
+ ## Common Patterns
71
+
72
+ ### Validation Procedures
73
+ Create dedicated validation procedures that use TestField internally but provide business-context error messages.
74
+
75
+ ### Status-Based Validation
76
+ Use TestField with status checks to enforce business rules at specific workflow stages.
77
+
78
+ ### Cross-Table Validation
79
+ Combine TestField with related table lookups to validate complex business relationships.
80
+
@@ -0,0 +1,98 @@
1
+ ---
2
+ title: "AL Event Subscriber Architecture"
3
+ domain: "jordan-bridge"
4
+ difficulty: "advanced"
5
+ bc_versions: "14+"
6
+ tags: ["events", "subscribers", "integration", "extensibility"]
7
+ type: "improvement-pattern"
8
+ category: "architecture"
9
+ pattern_type: "good"
10
+ severity: "high"
11
+ impact_level: "high"
12
+ improvement_suggestion: "Design event subscriber architecture for maintainable, performant integration solutions"
13
+ implementation_steps: ["design-subscriber-structure", "implement-loose-coupling", "validate-performance"]
14
+ validation_criteria: ["maintained-loose-coupling", "acceptable-performance-impact"]
15
+ technical_areas: ["al-code", "integration"]
16
+ samples: "samples/al-event-subscriber-architecture.md"
17
+ ---
18
+
19
+ # AL Event Subscriber Architecture
20
+
21
+ ## Overview
22
+
23
+ Event subscriber architecture in AL enables loosely coupled integration patterns that extend base functionality without modifying existing code. Proper subscriber design ensures maintainable, performant, and scalable integration solutions.
24
+
25
+ **Key Principle**: Event subscribers should maintain loose coupling, minimize performance impact, and provide clear integration contracts.
26
+
27
+ ## Strategic Framework
28
+
29
+ ### Subscriber Design Patterns
30
+ **Single Responsibility**: Each subscriber handles one specific integration concern
31
+ **Loose Coupling**: Subscribers depend only on event contracts, not implementation details
32
+ **Error Isolation**: Subscriber failures don't impact publisher or other subscribers
33
+ **Performance Conscious**: Minimal processing overhead in subscriber implementations
34
+
35
+ ### Integration Architecture
36
+ Events enable clean separation between core business logic and integration concerns, supporting modular application design and third-party extensions.
37
+
38
+ ### Extensibility Framework
39
+ Subscribers provide extension points for customization without code modification, supporting ISV and customer enhancement scenarios.
40
+
41
+ ## Architecture Focus
42
+
43
+ ### Decoupling Benefits
44
+ **Module Independence**: Publishers and subscribers can evolve independently
45
+ **Extension Points**: Well-defined integration points for custom functionality
46
+ **Testing Isolation**: Subscribers can be tested independently of publishers
47
+ **Deployment Flexibility**: Subscribers can be deployed separately from base functionality
48
+
49
+ ### Performance Considerations
50
+ **Event Overhead**: Each subscriber adds processing overhead to publisher execution
51
+ **Synchronous Execution**: Subscribers execute synchronously unless using background sessions
52
+ **Error Propagation**: Subscriber errors can impact publisher performance and reliability
53
+ **Memory Impact**: Multiple subscribers increase memory usage during event processing
54
+
55
+ ### Integration Patterns
56
+ - **Data Transformation**: Transform data between systems during business processes
57
+ - **Audit Logging**: Capture business events for compliance and monitoring
58
+ - **External Integration**: Trigger external system calls based on BC events
59
+ - **Custom Validation**: Add business-specific validation to standard processes
60
+
61
+ ## Best Practices
62
+
63
+ ### Subscriber Implementation
64
+ - **Minimal Processing**: Keep subscriber logic lightweight and focused
65
+ - **Error Handling**: Implement robust error handling to prevent publisher disruption
66
+ - **Conditional Execution**: Use appropriate conditions to avoid unnecessary processing
67
+ - **Clear Contracts**: Design clear interfaces between publishers and subscribers
68
+
69
+ ### Performance Optimization
70
+ - **Efficient Filtering**: Apply early filtering to avoid unnecessary subscriber execution
71
+ - **Background Processing**: Use background sessions for time-intensive operations
72
+ - **Bulk Operations**: Design subscribers to handle bulk scenarios efficiently
73
+ - **Resource Management**: Monitor memory and database usage in subscribers
74
+
75
+ ### Architecture Design
76
+ - **Codeunit Organization**: Group related subscribers in dedicated codeunits by functional area
77
+ - **Event Contract Stability**: Design event parameters for long-term stability
78
+ - **Documentation**: Document event contracts and subscriber responsibilities clearly
79
+ - **Version Management**: Plan for event contract evolution without breaking subscribers
80
+
81
+ ### Error Handling Strategy
82
+ - **Graceful Degradation**: Handle subscriber failures without impacting core functionality
83
+ - **Logging and Monitoring**: Implement comprehensive logging for troubleshooting
84
+ - **Retry Mechanisms**: Design appropriate retry logic for transient failures
85
+ - **Circuit Breaker**: Implement circuit breaker patterns for failing external integrations
86
+
87
+ ## Anti-Patterns
88
+
89
+ ### Avoid These Approaches
90
+ - **Tight Coupling Issues**: Subscribers that depend on publisher implementation details
91
+ - **Direct Data Access**: Bypassing event parameters to access publisher data directly
92
+ - **Circular Dependencies**: Publishers depending on subscriber functionality
93
+ - **Version Coupling**: Subscribers tied to specific publisher versions
94
+
95
+ Poor subscriber design can compromise system reliability and create maintenance burdens that outweigh the benefits of event-driven architecture.
96
+
97
+ *Related patterns: al-event-publishers.md, al-integration-patterns.md*
98
+ *Implementation examples: see samples/al-event-subscriber-architecture.md*